HEX
Server: Apache
System: Linux az1-ss100.a2hosting.com 4.18.0-553.16.1.lve.1.el8.x86_64 #1 SMP Mon Sep 23 20:16:18 UTC 2024 x86_64
User: crypto73 (2057)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/crypto73/www/wp-content/plugins/wpematico/app/campaign_fetch_functions.php
<?php

/**
 * WPeMatico plugin for WordPress
 * campaign_fetch_functions 
 * Contains all the auxiliary methods and filters used in the campaign fetch/run events
 * Called by campaign_fetch.php
 *  
 * @package   wpematico
 * @link      https://github.com/etruel/wpematico
 * @author    Esteban Truelsegaard <etruel@etruel.com>
 * @copyright 2006-2018 Esteban Truelsegaard
 * @license   GPL v2 or later
 */
// don't load directly
if (!defined('ABSPATH')) {
	header('Status: 403 Forbidden');
	header('HTTP/1.1 403 Forbidden');
	exit();
}

if (class_exists('wpematico_campaign_fetch_functions'))
	return;

class wpematico_campaign_fetch_functions {

	public static function WPeisDuplicatedMetaSource($dev, $campaign, $item) {
		global $wpdb;
		$dev				 = false;
		$permalink			 = self::getReadUrl($item->get_permalink(), $campaign);
		$check_sql			 = "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'wpe_sourcepermalink' AND meta_value = %s LIMIT 1";
		$permantlink_check	 = $wpdb->get_var($wpdb->prepare($check_sql, $permalink));
		if ($permantlink_check) {
			$dev = true;
		}
		return $dev;
	}

	/**
	 * Filters to skip item or not
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 *
	 * Return TRUE if skip the item 
	 */
	function exclude_filters(&$current_item, &$campaign, &$feed, &$item) {
		$categories	 = (isset($current_item['categories']) && !empty($current_item['categories']) ) ? $current_item['categories'] : '';
		$post_id	 = $this->campaign_id;
		$skip		 = false;

		$skip = apply_filters('wpematico_excludes', $skip, $current_item, $campaign, $item);
		return $skip;
	}

	// End exclude filters

	/**
	 * Parses an item content
	 *
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 */
	function Item_parsers(&$current_item, &$campaign, &$feed, &$item, $count, $feedurl) {
		global $cfg;
		$post_id		 = $this->campaign_id;
		$current_item	 = apply_filters('wpematico_item_parsers', $current_item, $campaign, $feed, $item);
		if (isset($current_item['SKIP']) && is_int($current_item['SKIP']))
			return $current_item;
			
		// strip all HTML tags before apply filter wpematico_after_item_parsers
		if ($campaign['campaign_striphtml']) {
			// translators: The title of the processed post.
			trigger_error(sprintf(__('Deleting html tags: %s', 'wpematico'), $item->get_title()), E_USER_NOTICE);
			
			$current_item['content'] = strip_tags($current_item['content'], apply_filters('wpematico_dont_strip_tags', '', $campaign));
		}

		if (!$cfg['disable_credits']) {
			$current_item['content'] .= '<p class="wpematico_credit"><small>Powered by <a href="http://www.wpematico.com" target="_blank">WPeMatico</a></small></p>';
		}

		$current_item = apply_filters('wpematico_after_item_parsers', $current_item, $campaign, $feed, $item);
		//if($current_item == -1 ) return -1; //Hack to allow skip the post in this instance

		return $current_item;
	}

	// End ParseItemContent


	public static function wpematico_strip_links($current_item, $campaign, $feed, $item) {
		// take out links before apply template (if don't strip before html tags)
		if ($campaign['campaign_strip_links'] && !$campaign['campaign_striphtml']) {
			trigger_error(__('Cleaning Links from content.', 'wpematico'), E_USER_NOTICE);
			$current_item['content'] = self::strip_links((string) $current_item['content'], $campaign);
		}

		return $current_item;
	}

	public static function wpematico_strip_links_a($current_item, $campaign, $feed, $item) {
		// take out links before apply template (if don't strip before html tags)
		if ($campaign['campaign_strip_links'] && !$campaign['campaign_striphtml']) {
			trigger_error(__('Cleaning Links from content.', 'wpematico'), E_USER_NOTICE);
			$current_item['content'] = self::strip_links_a((string) $current_item['content'], $campaign);
		}

		return $current_item;
	}

	public static function wpematico_template_parse($current_item, $campaign, $feed, $item) {
		// Template parse           
		if ($campaign['campaign_enable_template']) {
			trigger_error('<b>' . __('Parsing Post template.', 'wpematico') . '</b>', E_USER_NOTICE);
			if (!empty($current_item['images'][0])) {
				$img_str = "<img class=\"wpe_imgrss\" src=\"" . $current_item['images'][0] . "\">";  //Solo la imagen
			} else {
				if (!empty($current_item['featured_image'])) {
					$img_str = "<img class=\"wpe_imgrss\" src=\"" . $current_item['featured_image'] . "\">";  //Solo la imagen
				} else {
					trigger_error(__('Can\'t find the featured image to add to the content.', 'wpematico'), E_USER_WARNING);
					$img_str = '<!-- no image -->';
				}
			}
			/**
			 * Since 1.6.1
			 * New way to get the template vars. 
			 * See below the function default_template_vars with the filter to add new tags 
			 */
			$template_vars	 = self::default_template_vars(array(), $current_item, $campaign, $feed, $item, $img_str);
			$vars			 = array();
			$replace		 = array();
			foreach ($template_vars as $tvar => $tvalue) {
				$vars[]		 = $tvar;
				$replace[]	 = $tvalue;
			}
			/**
			 *  wpematico_post_template_tags, wpematico_post_template_replace filters
			 *  Are deprecated, will be removed on version 1.7
			 */
			$vars	 = apply_filters('wpematico_post_template_tags', $vars, $current_item, $campaign, $feed, $item);
			$replace = apply_filters('wpematico_post_template_replace', $replace, $current_item, $campaign, $feed, $item);

			$current_item['content'] = str_ireplace($vars, $replace, ( $campaign['campaign_template'] ) ? stripslashes($campaign['campaign_template']) : '{content}');
		}

		return $current_item;
	}

	public static function wpematico_campaign_rewrites($current_item, $campaign, $feed, $item) {
		// Rewrite
		//$rewrites = $campaign['campaign_rewrites'];
		if (isset($campaign['campaign_rewrites']['origin']) && !empty($campaign['campaign_rewrites']['origin']))
			for ($i = 0; $i < count($campaign['campaign_rewrites']['origin']); $i++) {
				$on_title	 = ($campaign['campaign_rewrites']['title'][$i]) ? true : false;
				$origin		 = stripslashes($campaign['campaign_rewrites']['origin'][$i]);
				if (isset($campaign['campaign_rewrites']['rewrite'][$i])) {
					$reword = !empty($campaign['campaign_rewrites']['relink'][$i]) ? '<a href="' . stripslashes($campaign['campaign_rewrites']['relink'][$i]) . '">' . stripslashes($campaign['campaign_rewrites']['rewrite'][$i]) . '</a>' : stripslashes($campaign['campaign_rewrites']['rewrite'][$i]);

					if ($campaign['campaign_rewrites']['regex'][$i]) {
						if ($on_title)
							$current_item['title']	 = preg_replace($origin, $reword, $current_item['title']);
						else
							$current_item['content'] = preg_replace($origin, $reword, $current_item['content']);
					} else
					if ($on_title)
						$current_item['title']	 = str_ireplace($origin, $reword, $current_item['title']);
					else
						$current_item['content'] = str_ireplace($origin, $reword, $current_item['content']);
				} else if (!empty($campaign['campaign_rewrites']['relink'][$i]))
					$current_item['content'] = str_ireplace($origin, '<a href="' . stripslashes($campaign['campaign_rewrites']['relink'][$i]) . '">' . $origin . '</a>', $current_item['content']);
			}
		// End rewrite

		return $current_item;
	}

	public static function default_template_vars($vars, $current_item, $campaign, $feed, $item, $img_str) {
		$autor		 = '';
		$autorlink	 = '';
		if ($author		 = $item->get_author()) {
			$autor		 = $author->get_name();
			$autorlink	 = $author->get_link();
		}

		$favicon = (method_exists($feed, "get_favicon")) ? $feed->get_favicon() : "";  // 2.6.20.2 xml or other custom feeds does not have icon or its method 

		/**
		 * wpematico_feed_get_favicon filter
		 * Allow change the default favicon or assign one 
		 * Parameter 1: image 
		 */
		$favicon = apply_filters('wpematico_feed_get_favicon', $favicon); // <== 2.6.14 New by https://wordpress.org/support/topic/fetching-favicons/#post-15280216 

		$vars = array(
			'{title}'			 => $current_item['title'],
			'{content}'			 => $current_item['content'],
			'{itemcontent}'		 => $item->get_description(),
			'{image}'			 => $img_str,
			'{author}'			 => $autor,
			'{permalink}'		 => $current_item['permalink'],
			'{feedurl}'			 => $feed->feed_url,
			'{feedtitle}'		 => $feed->get_title(),
			'{feeddescription}'	 => $feed->get_description(),
			'{feedlogo}'		 => $feed->get_image_url(),
			'{feedfavicon}'		 => $favicon,
			'{campaigntitle}'	 => get_the_title($campaign['ID']),
			'{campaignid}'		 => $campaign['ID'],
			'{item_date}'		 => (($current_item['date']) ? gmdate(get_option('date_format'), $current_item['date'] + (get_option('gmt_offset') * 3600)) : date_i18n(get_option('date_format'), current_time('timestamp'))),
			'{item_time}'		 => (($current_item['date']) ? gmdate(get_option('time_format'), $current_item['date'] + (get_option('gmt_offset') * 3600)) : date_i18n(get_option('time_format'), current_time('timestamp'))),
		);

		$template_vars = apply_filters('wpematico_add_template_vars', $vars, $current_item, $campaign, $feed, $item);

		return $template_vars;
	}

	/**
	 * Filters an item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 */
	function Item_filters(&$current_item, &$campaign, &$feed, &$item) {
		$categories				 = $current_item['categories'];
		$post_id				 = $this->campaign_id;
		$new_categories			 = array();
		$new_categories_words	 = array();

		$w2c_only_use_a_category	 = $campaign['campaign_w2c_only_use_a_category'];
		$w2c_the_category_most_used	 = $campaign['campaign_w2c_the_category_most_used'];
		//Proceso Words to Category y si hay las agrego al array
		if ($this->cfg['enableword2cats']) {
			if (isset($campaign['campaign_wrd2cat']['word']) && (!empty($campaign['campaign_wrd2cat']['word'][0]) ) && (!empty($campaign['campaign_wrd2cat']['w2ccateg'][0]) )
			) {
				// translators: The title of the processed post.
				trigger_error(sprintf(__('Processing Words to Category %s', 'wpematico'), $current_item['title']), E_USER_NOTICE);

				for ($i = 0; $i < count($campaign['campaign_wrd2cat']['word']); $i++) {
					$foundit = false;
					$word	 = stripslashes(htmlspecialchars_decode(@$campaign['campaign_wrd2cat']['word'][$i]));
					if (isset($campaign['campaign_wrd2cat']['w2ccateg'][$i])) {
						$tocat = $campaign['campaign_wrd2cat']['w2ccateg'][$i];
						if ($campaign['campaign_wrd2cat']['regex'][$i]) {
							if ($campaign['campaign_wrd2cat']['title'][$i]) {
								$foundit = (preg_match($word, $current_item['title'])) ? true : false;
							} else {
								$foundit = (preg_match($word, $current_item['content'])) ? true : false;
							}
						} else {
							if ($campaign['campaign_wrd2cat']['cases'][$i]) {
								if ($campaign['campaign_wrd2cat']['title'][$i]) {
									$foundit = strpos($current_item['title'], $word);
								} else {
									$foundit = strpos($current_item['content'], $word);
								}
							} else {
								if ($campaign['campaign_wrd2cat']['title'][$i]) {
									$foundit = stripos($current_item['title'], $word); //insensible a May/min
								} else {
									$foundit = stripos($current_item['content'], $word); //insensible a May/min
								}
							}
						}
						if ($foundit !== false) {
							// translators: %1$s Word found. %2$s Category ID 
							trigger_error(sprintf(__('Found!: word %1$s to Cat_id %2$s', 'wpematico'), $word, $tocat), E_USER_NOTICE);
							$new_categories[]		 = $tocat;
							$new_categories_words[]	 = strtolower($word);
						} else {
							// translators: The word not found
							trigger_error(sprintf(__('Not found word %s', 'wpematico'), $word), E_USER_NOTICE);
						}
					}
				}

				if ($w2c_only_use_a_category) {
					if ($w2c_the_category_most_used) {
						trigger_error(__('Searching the category with more words.', 'wpematico'), E_USER_NOTICE);
						$content_lower				 = strtolower($current_item['content']);
						$current_words_count		 = 0;
						$category_with_more_words	 = 0;
						foreach ($new_categories_words as $kw => $search_word) {
							$pieces_words	 = explode($search_word, $content_lower);
							$words_count	 = count($pieces_words);
							if ($words_count > $current_words_count) {
								$current_words_count = $words_count;
								if (!empty($new_categories[$kw])) {
									$category_with_more_words = $new_categories[$kw];
								}
							}
						}
						if (!empty($category_with_more_words)) {
							// translators: The Category 
							trigger_error(sprintf(__('The category with more words in content: %s', 'wpematico'), $category_with_more_words), E_USER_NOTICE);
							$new_categories = array($category_with_more_words);
						}
					} else {
						$new_categories = (isset($new_categories[0]) ? array($new_categories[0]) : array());
						if (isset($new_categories[0])) {
							// translators: Category ID 
							trigger_error(sprintf(__('Assign the first category: %s', 'wpematico'), $new_categories[0]), E_USER_NOTICE);
						}
					}
				}

				$current_item['categories'] = array_merge($current_item['categories'], $new_categories);
			}
		} // End Words to Category
		
		//Tags
		if (has_filter('wpematico_pretags'))
			$current_item['campaign_tags'] = apply_filters('wpematico_pretags', $current_item, $item, $this->cfg);

		$tags = explode(',', $campaign['campaign_tags']);
		
		$current_item['campaign_tags'] = apply_filters('wpematico_tags', $tags , $current_item, $item, $this->cfg, $campaign);

		if (has_filter('wpematico_postags')) { //empezar por aca
			/**
			 * Modify filter to use in the wpematico professional, we add the $campaign parameter to use it.
			 * @since 2.7.7
			 */
			$current_item['campaign_tags'] = apply_filters('wpematico_postags', $current_item, $item, $this->cfg, $campaign);
		}
		/**
		 * wpematico_categories_after_filters
		 * Filter the array of categories to be parsed before inserted into the database.
		 * @since 2.1.2
		 * @param string $autocats The array of categories names.
		 */
		$current_item['categories'] = apply_filters('wpematico_categories_after_filters', $current_item['categories'], $item, $this->cfg);

		return $current_item;
	}

// End item filters

	/**
	 * Get URL from relative path
	 * @param $baseUrl base url
	 * @param $relative relative url
	 * @return string absolute url version of relative url
	 */
	static function getRelativeUrl($baseUrl, $relative) {
		$schemes = array('http', 'https', 'ftp');
		foreach ($schemes as $scheme) {
			if (strpos($relative, "{$scheme}://") === 0) //if not relative
				return $relative;
		}

		$urlInfo = parse_url($baseUrl);

		$basepath			 = $urlInfo['path'];
		$basepathComponent	 = explode('/', $basepath);
		$resultPath			 = $basepathComponent;
		$relativeComponent	 = explode('/', $relative);
		$last				 = array_pop($relativeComponent);
		foreach ($relativeComponent as $com) {
			if ($com === '') {
				$resultPath = array('');
			} else if ($com == '.') {
				$cur = array_pop($resultPath);
				if ($cur === '') {
					array_push($resultPath, $cur);
				} else {
					array_push($resultPath, '');
				}
			} else if ($com == '..') {
				if (count($resultPath) > 1)
					array_pop($resultPath);
				array_pop($resultPath);
				array_push($resultPath, '');
			} else {
				if (count($resultPath) > 1)
					array_pop($resultPath);
				array_push($resultPath, $com);
				array_push($resultPath, '');
			}
		}
		array_pop($resultPath);
		array_push($resultPath, $last);
		$resultPathReal = implode('/', $resultPath);
		return $urlInfo['scheme'] . '://' . $urlInfo['host'] . $resultPathReal;
	}

	static function getReadUrl($url, $campaign) {
		$permalink	 = htmlspecialchars_decode($url);
		// Colons in URL path segments get encoded by SimplePie, yet some sites expect them unencoded
		$permalink	 = str_replace('%3A', ':', $permalink);
		$permalink	 = apply_filters('wpepro_full_permalink', $permalink);

		//if is this same host return 
		$urlInfo = parse_url($permalink);
		if (empty($urlInfo['host'])) {
			return $permalink;
		}
		if ($urlInfo['host'] == $_SERVER['SERVER_NAME']) {
			return $permalink;
		}

		//search for redirections
		if (!$campaign['avoid_search_redirection']) {

			if (version_compare(phpversion(), '5.3.0', '>=')) {
				stream_context_set_default(array(
					'ssl' => array(
						'verify_peer'		 => false,
						'verify_peer_name'	 => false,
					),
				));
			}

			$headers = get_headers($permalink);
			foreach ($headers as $header) {
				$parts = explode(':', $header, 2);
				if (strtolower($parts[0]) == 'location') {
					$location	 = trim($parts[1]);
					$url_parts	 = parse_url($location);
					if (!isset($url_parts['host']) && !isset($url_parts['scheme'])) {
						$permalink_parts = parse_url($permalink);
						if (isset($permalink_parts['host']) && isset($permalink_parts['scheme'])) {
							$location = $permalink_parts['scheme'] . '://' . $permalink_parts['host'] . $location;
						}
					}
					return $location;
				}
			}
		}
		return $permalink;
	}

	/**
	 * Filters images, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 */
	function Item_images(&$current_item, &$campaign, &$feed, &$item, $options_images) {
		if ($options_images['imgcache']) {
			$itemUrl = $this->current_item['permalink'];

			if (sizeof($current_item['images'])) { // If there is at least one image in the content
				trigger_error('<b>' . __('Looking for images in content.', 'wpematico') . '</b>', E_USER_NOTICE);
				//trigger_error(print_r($current_item['images'],true),E_USER_NOTICE);
				$featured	 = false;
				$img_new_url = array();
				foreach ($current_item['images'] as $imagen_src) {
					if ($options_images['featuredimg'] && $current_item['featured_image'] == $imagen_src) {
						$featured = true;
					}
					$imagen_src		 = apply_filters('wpematico_imagen_src', $imagen_src); // allow strip parts 
					trigger_error(__('Uploading media...', 'wpematico') . $imagen_src, E_USER_NOTICE);
					
					$imagen_src_real = $this->getRelativeUrl($itemUrl, $imagen_src);
					
					// Parse the original name on url to get the file correctly 
					$imagen_src_real = $this->parse_src_image($imagen_src_real);
					
					$allowed		 = (isset($this->cfg['images_allowed_ext']) && !empty($this->cfg['images_allowed_ext']) ) ? $this->cfg['images_allowed_ext'] : 'jpg,gif,png,tif,bmp,jpeg';
					$allowed		 = apply_filters('wpematico_allowext', $allowed);
					
					// Parse the destiny filename to store the file correctly on WP media or system directory
					$newimgname = $this->parse_dst_image($imagen_src_real, $current_item, $campaign, $item);
					
					// Proceed with the Fetch and Store the Image
					$upload_dir		 = wp_upload_dir();
					$imagen_dst		 = trailingslashit($upload_dir['path']) . $newimgname;
					$imagen_dst_url	 = trailingslashit($upload_dir['url']) . $newimgname;
					trigger_error('Filtering image extensions:' . $allowed, E_USER_NOTICE);
					
					// Check for allowed extensions
					if (in_array(str_replace('.', '', strrchr(strtolower($imagen_dst), '.')), explode(',', $allowed))) {
						trigger_error('Uploading media=' . $imagen_src . ' <b>to</b> image=' . $imagen_dst . '', E_USER_NOTICE);
						
						// First I try my fastest function
						$newfile = ($options_images['customupload']) ? WPeMatico::save_file_from_url($imagen_src_real, $imagen_dst) : false;
						if ($newfile) { // uploaded
							trigger_error('Uploaded media=' . $newfile, E_USER_NOTICE);
							$imagen_dst				 = $newfile;
							$imagen_dst_url			 = trailingslashit($upload_dir['url']) . basename($newfile);
							$current_item['content'] = str_replace($imagen_src, $imagen_dst_url, $current_item['content']);
							do_action('wpematico_new_image_url_uploaded', $imagen_dst_url, $imagen_src, $current_item, $campaign);
							$img_new_url[]			 = $imagen_dst_url;
							
						} else { // Upload fail 
							// try other methods
							$bits = WPeMatico::wpematico_get_contents($imagen_src_real); // Read the file
							
							if (!$bits) { //Reading errors
								// Actions if give nothing or getting errors 
								trigger_error(__('Failed to obtain file:', 'wpematico') . $imagen_src_real, E_USER_WARNING);
								// Remove the image from content if its upload fail and no link to source.
								if ($options_images['gralnolinkimg']) {
									//	trigger_error( __('Remove img tag from content.', 'wpematico' ),E_USER_NOTICE);
									$current_item['content'] = self::strip_Image_by_src($imagen_src, $current_item['content']);
								}
							} else {
								// Obtained -> Try to upload
								$mirror = wp_upload_bits($newimgname, NULL, $bits);								
								if (!$mirror['error']) { // Upload well 
									trigger_error($mirror['url'], E_USER_NOTICE);
									
									// Replace the image src from content if its upload well.
									$current_item['content'] = str_replace($imagen_src, $mirror['url'], $current_item['content']);
									do_action('wpematico_new_image_url_uploaded', $mirror['url'], $imagen_src, $current_item, $campaign);
									
									$img_new_url[] = $mirror['url'];
								} else { // Uploading errors
									//trigger_error('wp_upload_bits error:' . print_r($mirror, true) . '.', E_USER_WARNING);
									trigger_error(__('Save image file failed:', 'wpematico') . $imagen_dst, E_USER_WARNING);
									
									// Remove the image from content if its upload fail and no link to source.
									if ($options_images['gralnolinkimg']) {
										//	trigger_error( __('Remove img tag from content.', 'wpematico' ),E_USER_NOTICE);
										$current_item['content'] = self::strip_Image_by_src($imagen_src, $current_item['content']);
									}
								}
							}
						}
					} else {
						trigger_error(__('Extension not allowed: ', 'wpematico') . urldecode($imagen_dst_url), E_USER_WARNING);
						// Remove the image from content if it is not allowed and no link to source.
						if ($options_images['gralnolinkimg']) { 
							trigger_error(__('Stripped src.', 'wpematico'), E_USER_WARNING);
							$current_item['content'] = self::strip_Image_by_src($imagen_src, $current_item['content']);
						}
					}
				}
				$current_item['images']			 = (array) $img_new_url;
				if ($featured){
					if (isset($current_item['images'][0])) {
						$current_item['featured_image'] = $current_item['images'][0];
					} else {
						// Handle the case where there's no image
						// For example, you can assign a default image or leave it empty
						$current_item['featured_image'] = '';  // or some default value like 'default.jpg'
					}
				}
			}  // END If there is at least one image in the content
		} else {  // If no cache images (not upload to current WordPress
			if (isset($current_item['images']) && sizeof($current_item['images'])) {
				trigger_error('<b>' . __('Using remotely linked images in content. No changes.', 'wpematico') . '</b>', E_USER_NOTICE);
			}
			$current_item['images'] = array();
		}
		return $current_item;
	}

// item images

// Deprecated custom function in favor of WP native attachment_url_to_postid Apr 2, 2025
//	/**
//	 *  // retrieves the attachment ID from the file URL
//	 *  @return integer The attach ID of the image. If not exists return false.
//	 */
//	function get_attach_id_from_url($image_url) {
//		global $wpdb;
//		$attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url));
//		return ($attachment[0] > 0) ? $attachment[0] : FALSE;
//	}

	/**
	 *  attach a file or image to a post with its post_id  
	 *  @return integer The new attach ID of the WP media
	 */
	function insertfileasattach($filename, $postid) {
		$wp_filetype	 = wp_check_filetype(basename($filename), null);
		$wp_upload_dir	 = wp_upload_dir();
		$relfilename	 = $wp_upload_dir['path'] . '/' . basename($filename);
		$guid			 = $wp_upload_dir['url'] . '/' . basename($filename);
		$attachment		 = array(
			'guid'			 => $guid,
			'post_mime_type' => $wp_filetype['type'],
			'post_title'	 => preg_replace('/\.[^.]+$/', '', basename($filename)),
			'post_content'	 => '',
			'post_author'	 => get_post_field('post_author', $postid),
			'post_status'	 => 'inherit'
		);
		trigger_error(__('Attaching file:', 'wpematico') . $filename, E_USER_NOTICE);
		$attach_id		 = wp_insert_attachment($attachment, $relfilename, $postid);
		if (!$attach_id)
			trigger_error(__('Sorry, the attachment could not be inserted. An error has occurred.', 'wpematico') . print_r($filename, true), E_USER_WARNING);

		if (!function_exists('wp_read_video_metadata') || !function_exists('wp_read_audio_metadata')) {
			require_once(ABSPATH . 'wp-admin/includes/media.php');
		}
		// must include the image.php file for the function wp_generate_attachment_metadata() to work
		require_once(ABSPATH . 'wp-admin/includes/image.php');
		$attach_data = wp_generate_attachment_metadata($attach_id, $relfilename);
		// $attach_data = apply_filters('wpematico_modify_attachment_data', $attach_data, $relfilename,  $attach_id);
		wp_update_attachment_metadata($attach_id, $attach_data);

		return $attach_id;
	}
	
	/* 	static function Item_parseimg(&$current_item, &$campaign, &$feed, &$item) {
	  if ( stripos($current_item['content'], "[[[wpe1stimg]]]") !== FALSE ) {  // en el content
	  if (isset( $current_item['images'][0] )) {
	  $imgenc = $current_item['images'][0];
	  $imgstr = "<img class=\"wpe_imgrss\" src=\"" . $imgenc . "\">";  //Solo la imagen
	  }else{
	  trigger_error(__('Can\'t find the featured image to add to the content.'),E_USER_NOTICE);
	  $imgstr = '<!-- no image -->';
	  }
	  $current_item['content'] = str_ireplace("[[[wpe1stimg]]]",$imgstr, $current_item['content']);
	  }
	  return $current_item;
	  }
	 */

	/**
	 * @return array
	 * @since 1.7.2
	 */
	function featured_image_selector($current_item, $campaign, $feed, $item, $options_images) {
		if (isset($campaign['campaign_enable_featured_image_selector']) && $campaign['campaign_enable_featured_image_selector']) {
			trigger_error('<b>' . __('Executing featured image selector...', 'wpematico') . '</b>', E_USER_NOTICE);
			$index_selector = (int) $campaign['campaign_featured_selector_index'];
			if (isset($current_item['images'][$index_selector])) {
				// translators: %1$s image Index.  %2$s Image Url
				trigger_error('<b>' . sprintf(__('Featured image "%1$s": %2$s', 'wpematico'), $index_selector, $current_item['images'][$index_selector]) . '</b>', E_USER_NOTICE);
				$current_item['featured_image'] = $current_item['images'][$index_selector];
			} else {
				trigger_error('<b>' . __('No image was found according to the selected index.', 'wpematico') . '</b>', E_USER_NOTICE);
				$images_array = $current_item['images'];
				if (isset($campaign['campaign_featured_selector_ifno']) && $campaign['campaign_featured_selector_ifno'] == 'first') {
					$first_image = array_shift($images_array);
					if (empty($first_image)) {
						trigger_error('<b>' . __('The first image was not found in the content.', 'wpematico') . '</b>', E_USER_NOTICE);
					} else {
						trigger_error('<b>' . __('Using first image as the featured image.', 'wpematico') . '</b>', E_USER_NOTICE);
						$current_item['featured_image'] = $first_image;
					}
				} else {
					$last_image = array_pop($images_array);
					if (empty($last_image)) {
						trigger_error('<b>' . __('The last image was not found in the content.', 'wpematico') . '</b>', E_USER_NOTICE);
					} else {
						trigger_error('<b>' . __('Using last image as the featured image.', 'wpematico') . '</b>', E_USER_NOTICE);
						$current_item['featured_image'] = $last_image;
					}
				}
			}
		}
		return $current_item;
	}
	
	function set_image_attributes($current_item, $attach_id){
		$attributes = apply_filters('wpematico_set_image_attributes', $current_item['image_attributes'][0], $attach_id);
		$attachment_post = [];
		if ($attach_id) {
			// Update alt attribute
			if (isset($attributes['alt'])) {
				update_post_meta($attach_id, '_wp_attachment_image_alt', $attributes['alt']);
			}

			// Update title attribute
			if (isset($attributes['title'])) {
				// Update the post title (this is what will appear in the media library)
				$attachment_post = array(
					'ID' => $attach_id,
					'post_title' => $attributes['title'],
				);
			}

			if(isset($attributes['caption'])){
				$attachment_post = wp_parse_args(array(
					'ID' => $attach_id,
					'post_excerpt' => $attributes['caption'],
				), $attachment_post);
			}
			// You can add more attributes here if needed

			if(!empty($attachment_post))
				// Update the post in the database
				wp_update_post($attachment_post);
		}
	}

	public function parse_src_image($imagen_src_real) {
		// Decode URL encoding to properly handle spaces and special characters
		$imagen_src_real = rawurldecode($imagen_src_real);

		// Replace spaces with %20 to keep URLs valid
		$imagen_src_real = str_replace(' ', '%20', $imagen_src_real);

		// Apply WordPress sanitization
		return apply_filters('wpematico_img_src_url', esc_url_raw($imagen_src_real));
	}

	public function parse_dst_image($imagen_src_real, $current_item, $campaign, $item) {
		//Filter before parse (just to facebook)
		$imagen_src_real = apply_filters('wpematico_img_src_before_parse', $imagen_src_real, $current_item, $campaign, $item);
		// Decode URL to handle special characters correctly
		$basename = rawurldecode(basename($imagen_src_real));

		// Extract extension and filename
		$ext = pathinfo($basename, PATHINFO_EXTENSION);
		$filename = pathinfo($basename, PATHINFO_FILENAME);

		// Allow Chinese characters, letters, numbers, underscores, and dashes
		$filename = preg_replace('/[^\p{L}\p{N}_-]/u', '', $filename);

		// We need to trim the number of characters in the filename to avoid upload errors by OS limits, while ensuring UTF-8 encoding. 
		// Trim the filename to 200 (because windows?)
		$filename = mb_substr($filename, 0, apply_filters('wpematico_trim_img_name', 200), 'UTF-8');

		// Ensure the extension remains intact
		$newimgname = !empty($ext) ? "{$filename}.{$ext}" : $basename;

		// Apply WordPress sanitization and return the new filename
		return apply_filters('wpematico_newimgname', sanitize_file_name($newimgname), $current_item, $campaign, $item);
	}

	
	/**
	 * Filters images, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $item           object    SimplePie_Item object
	 */
	function Get_Item_images($current_item, $campaign, $feed, $item, $options_images) {
		
		if ($options_images['imgcache'] || $options_images['featuredimg']) {
			//$ItemImages = apply_filters('wpematico_item_images', 'CORE', $current_item, $campaign, $feed, $item, $options_images);
			$current_parser = apply_filters('wpematico_images_parser', 'default', $current_item, $campaign, $feed, $item, $options_images);
			if ($current_parser != 'default') {
				$images = apply_filters('wpematico_images_parser_' . $current_parser, array(), $current_item, $campaign, $feed, $item, $options_images);
			} else {
				$images = $this->parseImages($current_item['content'], $options_images);
			}

			$current_item['images']	 = $images[2];  //List of image URLs
			
			if(isset($images['image_attributes']))
				$current_item['image_attributes'] = $images['image_attributes'];

			$current_item['content'] = $images[3];  //Replaced src by srcset(If exist and with larger images) in images.

			$current_item = apply_filters('wpematico_find_img', $current_item, $campaign, $item);


			$current_item['images'] = array_values(array_unique($current_item['images']));

			/**
			 * WP Filter: wpematico_get_item_images runs after get all the images from the item content.
			 * $current_item['images']: Has all images urls 
			 */
			$current_item = apply_filters('wpematico_get_item_images', $current_item, $campaign, $item, $options_images);

			foreach ($current_item['images'] as $ki => $image) {
				$new_image_url = urldecode($current_item['images'][$ki]);

				if (strpos($image, '//') === 0) {
					$new_image_url = 'http:' . $new_image_url;
				}

				if ($new_image_url != $current_item['images'][$ki]) {
					$current_item['content'] = str_replace($current_item['images'][$ki], $new_image_url, $current_item['content']);
				}
				$current_item['images'][$ki] = $new_image_url;
			}
		}
		return $current_item;
	}

	/*	 * * Devuelve todas las imagenes del contenido	 */

	static function parseImages($text, $options_images = array()) {
		$new_content = $text;
		$out = array(); // This will store the extracted values to be returned
		
		
		// Get all <img> tags using a pattern that matches any <img> tag
		$pattern_img = apply_filters('wpematico_pattern_img', '/<img[^>]+>/i');
		preg_match_all($pattern_img, $text, $result);
		
		$imgstr = implode('', $result[0]);
		
		if ($options_images['save_attr_images']) {
			// Get all <figcaption> tags (captions) from the text
			preg_match_all('/<figure[^>]*>.*?<\/figure>/is', $text, $figure_matches);
			// Capture all attributes from <img> tag
			preg_match_all('/<\s*img\s+([^>]+)\s*\/?>/i', $imgstr, $matches);

			$images = $matches[1]; // Full attributes string inside the img tag

			$image_attributes_array = []; // To store image attributes
			
			$out[2] = array();

			// Loop through each <img> tag and extract its attributes
			foreach ($images as $index_img => $img_attributes) {
				$img_tag = $matches[0][$index_img];

				// Extract all attribute-value pairs (e.g., src="...", alt="...")
				preg_match_all('/(\w+)\s*=\s*["\']([^"\']+)["\']/', $img_attributes, $attrs);
				$attributes = [];
				foreach ($attrs[1] as $index => $attr_name) {
					$attributes[$attr_name] = $attrs[2][$index];
				}

				// Check if the image is within a <figure> tag and associate a caption
				$caption = '';
				// Check if the image has a valid src attribute
				if (isset($attributes['src'])) {
					foreach ($figure_matches[0] as $figure_tag) {
						// Extraer el <img> y <figcaption> de cada <figure>
						preg_match('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/', $figure_tag, $img_match);
						preg_match('/<figcaption[^>]*>(.*?)<\/figcaption>/is', $figure_tag, $caption_match);

						// Si encontramos la etiqueta <img> y el atributo 'src'
						if (isset($img_match[1])) {
							$image_src = $img_match[1];

							// Ahora comparamos el src de la imagen con el src que recibimos en $attributes['src']
							if (isset($attributes['src']) && $image_src === $attributes['src']) {
								$caption = !empty($caption_match) ? $caption_match[1] : ''; // Si existe un caption lo asignamos
							}
						}
					}

					// If a caption was found, associate it with the image
					if (!empty($caption)) {
						$attributes['caption'] = $caption; // Add caption to attributes
					}
				}
				
				$new_content = apply_filters('wpematico_filter_attr_images', $new_content, $attributes);
				
				// Merges the new 'src' attribute with existing $out[2] values, preserving previous entries.
				// wp_parse_args() instead of array_merge() as this did strange things.
				$out[2] = wp_parse_args(array($attributes['src']), $out[2]);
				
				// Store attributes in the image_attributes_array
				$image_attributes_array[] = $attributes; // Append the attributes array for this image tag
			}
			// Save the image attributes to $out
			$out['image_attributes'] = $image_attributes_array;
		} else {
			// Original src matching code for older logic (if required)
			preg_match_all('/<\s*img[^\>]*src\s*=\s*[\""\']?([^\""\'\s>]*)/', $imgstr, $out);
			$out[2] = $out[1];
		}
		// If 'image_srcset' is set in options_images, process the srcset attribute
		if (isset($options_images['image_srcset']) && $options_images['image_srcset']) {
			trigger_error(__("Getting srcset attribute...", 'wpematico'), E_USER_NOTICE);
			$images_array = (empty($result[0]) ? array() : $result[0]);
			
			foreach ($images_array as $img_tag) {
				$src_with_srcset = WPeMatico::get_attribute_value('src', $img_tag);
				if (in_array($src_with_srcset, $out[2])) {
					$srcset_string = WPeMatico::get_attribute_value('srcset', $img_tag);
					$pieces_srcset = explode(',', $srcset_string);
					$max_width = 0;
					$max_url = '';
					foreach ($pieces_srcset as $kps => $piece) {
						$piece = trim($piece);
						$pieces_url_srcset = explode(' ', $piece);
						$url_srcset = $pieces_url_srcset[0];
						$with = intval($pieces_url_srcset[1]);
						if ($with > $max_width) {
							$max_width = $with;
							$max_url = $url_srcset;
						}
					}
			
					if (($key_image = array_search($src_with_srcset, $out[2])) !== FALSE) {
						$new_image_tag = preg_replace('/\s*src\s*=\s*(["\']).*?\1/', 'src="' . $max_url . '"', $img_tag);
						$new_content = str_replace($img_tag, $new_image_tag, $new_content);
						$out[2][$key_image] = $max_url;
						trigger_error(sprintf(__("Overriding src attribute with value: %s from srcset.", 'wpematico'), $src_with_srcset), E_USER_NOTICE);
					}
				}
			}
			
			// Process <picture> and <source> elements for srcset values
			$array_pictures = WPeMatico::get_tags('picture', $new_content);
			foreach ($array_pictures as $picture_tag) {
				$array_sources = WPeMatico::get_tags('source', $picture_tag);
				foreach ($array_sources as $source_tag) {
					$srcset_string = WPeMatico::get_attribute_value('srcset', $source_tag);
					if (empty($srcset_string)) {
						continue;
					}
					$pieces_srcset = explode(',', $srcset_string);
					$max_width = 0;
					$max_url = '';
					foreach ($pieces_srcset as $kps => $piece) {
						$piece = trim($piece);
						$pieces_url_srcset = explode(' ', $piece);
						$url_srcset = $pieces_url_srcset[0];
						$with = intval($pieces_url_srcset[1]);
						if ($with > $max_width) {
							$max_width = $with;
							$max_url = $url_srcset;
						}
					}
			
					if (!empty($max_url)) {
						$out[2][] = $max_url;
					}
				}
			}
		}
		// Process <link> tags with rel="enclosure" (if needed)
		preg_match_all('/<link rel="(.+?)" type="image\/jpg" href="(.+?)"(.+?)\/>/', $text, $out2); 
		
		array_push($out, $out2);  // Add all items to the $out array
		$out[3] = $new_content;  // Store the updated content with modified image tags
		
		return $out;
	}

	/*	 * * Delete images for its src	 */

	static function strip_Image_by_src($src, $content, $withlink = true) {
		/* Translators: %s: URL of a image URL src value */
		trigger_error(sprintf(__("Removing: %s from content.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
		$img_src_real_scaped = addslashes($src);
		$img_src_real_scaped = addcslashes($img_src_real_scaped, "?.+*");

		if ($withlink) {
			$imgtag			 = '|<a(.+?)><img(.+?)src=["\']' . $img_src_real_scaped . '["\'](.*?)><\/a>|';
			$current_content = preg_replace($imgtag, '', $content);  //for tag img with a
			if (is_null($current_content)) {
				trigger_error(sprintf(__("Link with image URI not found in src.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
			} else {
				$content = $current_content;
				trigger_error(sprintf(__("Successfully removed with anchor link.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
			}
		}
		$imgtag			 = '|<img(.+?)src=["\']' . $img_src_real_scaped . '["\'](.*?)>|';
		$current_content = preg_replace($imgtag, '', $content);  //for tag img without a
		if (is_null($current_content)) {
			trigger_error(sprintf(__("Image URI not found in src.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
		} else {
			$content = $current_content;
			trigger_error(sprintf(__("Successfully removed.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
		}
		return $content;
	}

	/*	 * * Adds featured images from URLs instead of upload them *
	 * If fifu is not installed anyway save the meta fields
	 */

	static function url_meta_set_featured_image($featured_image, $current_item) {
		global $wpematico_fifu_meta;
		trigger_error(__('Setting up Featured Image From Url', 'wpematico'), E_USER_NOTICE);
		remove_action('save_post', 'fifu_save_properties');
		if (!empty($featured_image) && empty($wpematico_fifu_meta)) {
			trigger_error(__('Adding featured image post meta: ', 'wpematico') . $featured_image, E_USER_NOTICE);
			$featured_image = html_entity_decode(urldecode($featured_image), ENT_NOQUOTES, 'UTF-8');
			if (function_exists('fifu_is_on') && fifu_is_on('fifu_query_strings')) {
				$featured_image = preg_replace('/\?.*/', '', $featured_image);
			}
			$wpematico_fifu_meta					 = array();
			$wpematico_fifu_meta['fifu_image_url']	 = $featured_image;
			$wpematico_fifu_meta['fifu_image_alt']	 = $current_item['title'];
			$wpematico_fifu_meta					 = apply_filters('wpematico_fifu_meta', $wpematico_fifu_meta, $current_item);
			$featured_image							 = '';
		}
		return $featured_image;
	}

	static function url_meta_set_featured_image_setmeta($current_item, $campaign) {
		global $wpematico_fifu_meta;
		if (!empty($wpematico_fifu_meta)) {
			$current_item['meta'] = $wpematico_fifu_meta;
			add_filter('wpematico_featured_image_attach_id', function () {
				return 1; // avoid log message No Featured image
			}, 99, 0);
			add_action('wpematico_inserted_post', array(__CLASS__, 'set_attachment_from_url'), 10, 3);
		}
		return $current_item;
	}

	static function set_attachment_from_url($post_id, $campaign, $item) {
		global $wpematico_fifu_meta;
		if (!empty($wpematico_fifu_meta) && function_exists('fifu_dev_set_image')) {
			trigger_error(__('Fifu save set attachment from URL.', 'wpematico'), E_USER_NOTICE);
			fifu_dev_set_image($post_id, $wpematico_fifu_meta['fifu_image_url']);
		}
		$wpematico_fifu_meta = array();
	}

	/*	 * * END Adds featured images from URLs instead of upload them * */

	/**
	 * Strip anchors links and replace them with the anchor text
	 * @param string $text where search and replace
	 * @param array type $campaign 
	 * @return string $text with replaced links.
	 */
	public static function strip_links($text, $campaign = array()) {
		$tags = array();
		if (!empty($campaign['campaign_strip_links_options'])) {
			foreach ($campaign['campaign_strip_links_options'] as $k => $v) {
				if ($v) {
					if ($k != 'a' && $k != 'strip_domain') {
						$tags[] = $k;
					}
				}
			}
		}
		if (empty($tags) && !$campaign['campaign_strip_links_options']['a']) {
			$tags = array('iframe', 'script');
		}

		$index_script = array_search('script', $tags);
		if ($index_script !== FALSE) {
			$text = WPeMatico::strip_tags_content($text, '<script>', TRUE);
			unset($tags[$index_script]);
		}
		foreach ($tags as $tag) {
			while (preg_match('/<' . $tag . '(|\W[^>]*)>(.*)<\/' . $tag . '>/iusU', $text, $found)) {
				$text = str_replace($found[0], $found[2], $text);
			}
		}
		return preg_replace('/(<(' . join('|', $tags) . ')(|\W.*)\/>)/iusU', '', $text);
	}

	public static function strip_links_a($text, $campaign = array()) {
		$tags = array();
		if (!empty($campaign['campaign_strip_links_options'])) {
			foreach ($campaign['campaign_strip_links_options'] as $k => $v) {
				if ($v) {
					if ($k != 'script' && $k != 'iframe') {
						$tags[] = $k;
					}
				}
			}
		}

		if (empty($tags) && !$campaign['campaign_strip_links_options']['script'] && !$campaign['campaign_strip_links_options']['iframe']) {
			$tags = array('a');
		}

		foreach ($tags as $tag) {
			while (preg_match('/<' . $tag . '(|\W[^>]*)>(.*)<\/' . $tag . '>/iusU', $text, $found)) {
				$text = str_replace($found[0], $found[2], $text);
			}
		}
		return preg_replace('/(<(' . join('|', $tags) . ')(|\W.*)\/>)/iusU', '', $text);
	}

	static function wpematico_get_yt_rss_tags($content, $campaign, $feed, $item) {
		if (strpos($feed->feed_url, 'https://www.youtube.com/feeds/videos.xml') !== false) { 
			$ytvideoId = $item->get_item_tags('http://www.youtube.com/xml/schemas/2015', 'videoId');
			//iframe
			if (!$campaign['campaign_youtube_embed'] && !$campaign['campaign_youtube_sizes']) {
				$sizes = 'width="560" height="315"';
			}
			if (!$campaign['campaign_youtube_embed'] && $campaign['campaign_youtube_sizes']) {
				$sizes = ' width="' . $campaign['campaign_youtube_width'] . '" height="' . $campaign['campaign_youtube_height'] . '"';
			}
			//embed
			if ($campaign['campaign_youtube_embed'] && $campaign['campaign_youtube_sizes']) {
				$sizes = ' width="' . $campaign['campaign_youtube_width'] . '" height="' . $campaign['campaign_youtube_height'] . '"';
			}
			if ($campaign['campaign_youtube_embed'] && !$campaign['campaign_youtube_sizes']) {
				$sizes = "";
			}

			if ($campaign['campaign_youtube_embed']) {
				$video = "[embed$sizes]https://www.youtube.com/watch?v=" . $ytvideoId[0]['data'] . "[/embed]";
			} else {
				$video = '<iframe ' . $sizes . ' src="https://www.youtube.com/embed/' . $ytvideoId[0]['data'] . '" frameborder="0" allowfullscreen></iframe>';
			}
			trigger_error(__("Parsing Youtube video and feed item contents.", 'wpematico'), E_USER_NOTICE);
			$video		 = apply_filters('wpematico_yt_video', $video);
			$enclosures	 = $item->get_enclosures();
			$title		 = apply_filters('wpematico_yt_altimg', $enclosures[0]->title);
			$img		 = apply_filters('wpematico_yt_thumbnails', $enclosures[0]->thumbnails[0]);
			$description = apply_filters('wpematico_yt_description', $enclosures[0]->description);

			$image_html = "<img src=\"$img\" alt=\"$title\"><br>";
			if ($campaign['campaign_youtube_ign_image']) {
				$image_html = "";
			}

			$description_html = "<p>$description</p>";
			if ($campaign['campaign_youtube_ign_description']) {
				$description_html = "";
			}
			$content = "$image_html $video $description_html";
		}
		return $content;
	}

	public static function wpematico_get_yt_image($current_item, $campaign, $item, $options_images) {
		if ($campaign['campaign_youtube_ign_image']) {
			if ($campaign['campaign_youtube_image_only_featured']) {
				$enclosures = $item->get_enclosures();
				if (!empty($enclosures[0])) {
					if (!empty($enclosures[0]->thumbnails[0])) {
						$img = apply_filters('wpematico_yt_thumbnails', $enclosures[0]->thumbnails[0]);
						if (empty($current_item['images'])) {
							$current_item['images'][] = $img;
						}
					}
				}
			}
		}
		return $current_item;
	}

	/**
	 * Filters audios, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $item           object    SimplePie_Item object
	 * @param   $options_audios array    Current audio options.
	 * @since 1.7.0
	 */
	function Get_Item_Audios($current_item, $campaign, $feed, $item, $options_audios) {
		if ($options_audios['audio_cache']) {
			$current_item['audios'] = $this->parseAudios($current_item['content']);

			$current_item			 = apply_filters('wpematico_get_item_audios', $current_item, $campaign, $item, $options_audios);

			$current_item['audios']	 = array_values(array_unique($current_item['audios']));
			foreach ($current_item['audios'] as $ki => $image) {
				if (strpos($image, '//') === 0) {
					$current_item['audios'][$ki] = 'http:' . $current_item['audios'][$ki];
				}
			}
		}
		return $current_item;
	}

	/**
	 * Filters audios, upload and replace on text item content
	 * @param   $text   	string   text of content of current post.
	 * @return  $audios 	array 	 Array of current audios on post content.
	 * @since 1.7.0
	 */
	function parseAudios($text) {

		$audios	 = array();
		if(!empty($text)){
			$dom	 = new DOMDocument();
			@$dom->loadHTML($text);
			$xpath	 = new DomXPath($dom);
			$nodes	 = $xpath->query('//audio | //audio/source');
			foreach ($nodes as $node) {
				$audios[] = $node->getAttribute('src');
			}
		}
		
		return $audios;
	}

	/**
	 * @since 1.7.0
	 */
	function strip_Audio_by_src($src, $content) {
		/* Translators: %s: URL of the audio URL value */
		trigger_error(sprintf(__("Removing: %s from content.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
		$audio_src_real_scaped	 = addslashes($src);
		$audio_src_real_scaped	 = addcslashes($audio_src_real_scaped, "?.+*");
		$pattern				 = '|<audio(.+?)>(.*?)<source(.*?)src=["\']' . $audio_src_real_scaped . '["\'](.*?)>(.*?)<\/audio>|';
		$content_striped		 = preg_replace($pattern, '', $content);
		$content				 = ( is_null($content_striped) ) ? $content : $content_striped;
		return $content;
	}

	/**
	 * Filters audios, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 * @param   $options_audios array    Current audio options.
	 * @since 1.7.0
	 */
	function Item_Audios(&$current_item, &$campaign, &$feed, &$item, $options_audios) {
		if ($options_audios['audio_cache']) {
			$itemUrl = $this->current_item['permalink'];

			if (sizeof($current_item['audios'])) { // If exist audios on content.
				trigger_error('<b>' . __('Looking for audios in content.', 'wpematico') . '</b>', E_USER_NOTICE);
				$audio_new_url_array = array();
				foreach ($current_item['audios'] as $audio_src) {

					trigger_error(__('Uploading media...', 'wpematico') . $audio_src, E_USER_NOTICE);
					$audio_src_real	 = $this->getRelativeUrl($itemUrl, $audio_src);
					// Strip all white space on audios URLs.	
					$audio_src_real	 = str_replace(' ', '%20', $audio_src_real);
					$audio_src_real	 = apply_filters('wpematico_audio_src_url', $audio_src_real); // original source
					$allowed_audio	 = (isset($this->cfg['audio_allowed_ext']) && !empty($this->cfg['audio_allowed_ext']) ) ? $this->cfg['audio_allowed_ext'] : 'mp3';
					$allowed_audio	 = apply_filters('wpematico_allowext_audio', $allowed_audio);

					// Compability with WP, Strip Query added by WP ShortCode
					$audio_src_without_query = $audio_src_real;
					if (substr($audio_src_without_query, -4) == '?_=1') {
						$audio_src_without_query = str_replace('?_=1', '', $audio_src_without_query);
					}
					// Store audio.	
					$new_audio_name	 = apply_filters('wpematico_new_audio_name', sanitize_file_name(urlencode(basename($audio_src_without_query))), $current_item, $options_audios, $item);  // new name here
					// Primero intento con mi funcion mas rapida
					$upload_dir		 = wp_upload_dir();
					$audio_dst		 = trailingslashit($upload_dir['path']) . $new_audio_name;
					$audio_dst_url	 = trailingslashit($upload_dir['url']) . $new_audio_name;
					trigger_error('Filtering audio extensions:' . $allowed_audio, E_USER_NOTICE);
					if (in_array(str_replace('.', '', strrchr(strtolower($audio_dst), '.')), explode(',', $allowed_audio))) {   // -------- Controlo extensiones permitidas
						trigger_error('Uploading media=' . $audio_src . ' <b>to</b> audio_dst=' . $audio_dst . '', E_USER_NOTICE);
						$newfile = false;
						if ($options_audios['upload_ranges']) {
							$newfile = apply_filters('wpematico_partial_upload_file', $audio_dst, $audio_src_real, $options_audios);
						}

						if ($options_audios['customupload_audios'] && !$newfile) {
							$newfile = WPeMatico::save_file_from_url($audio_src_real, $audio_dst);
						}

						if ($newfile) { //subió
							trigger_error('Uploaded media=' . $newfile, E_USER_NOTICE);
							$audio_dst				 = $newfile;
							$audio_dst_url			 = trailingslashit($upload_dir['url']) . basename($newfile);
							$current_item['content'] = str_replace($audio_src, $audio_dst_url, $current_item['content']);
							$audio_new_url_array[]	 = $audio_dst_url;
						} else { // falló -> intento con otros
							$bits	 = WPeMatico::wpematico_get_contents($audio_src_real);
							$mirror	 = wp_upload_bits($new_audio_name, NULL, $bits);
							if (!$mirror['error']) {
								trigger_error($mirror['url'], E_USER_NOTICE);
								$current_item['content'] = str_replace($audio_src, $mirror['url'], $current_item['content']);
								$audio_new_url_array[]	 = $mirror['url'];
							} else {
								trigger_error('wp_upload_bits error:' . print_r($mirror, true) . '.', E_USER_WARNING);
								// Si no quiere linkar los audios al server borro el link de la audio
								trigger_error(__('Upload file failed:', 'wpematico') . $audio_dst, E_USER_WARNING);
								if ($options_audios['gralnolink_audio']) {
									$current_item['content'] = $this->strip_Audio_by_src($audio_src, $current_item['content']);
								}
							}
						}
					} else {
						trigger_error(__('Extension not allowed: ', 'wpematico') . urldecode($audio_dst_url), E_USER_WARNING);
						if ($options_audios['gralnolink_audio']) { // Si no quiere linkar las img al server borro el link de la imagen
							trigger_error(__('Stripped src.', 'wpematico'), E_USER_WARNING);
							$current_item['content'] = $this->strip_Audio_by_src($audio_src, $current_item['content']);
						}
					}
				}
				$current_item['audios'] = (array) $audio_new_url_array;
			}  // // Si hay alguna imagen en el contenido
		} else {
			if (isset($current_item['audios']) && sizeof($current_item['audios'])) {
				trigger_error('<b>' . __('Using remotely linked audios in content. No changes.', 'wpematico') . '</b>', E_USER_NOTICE);
			}
			$current_item['audios'] = array();
		}
		return $current_item;
	}

// item audios

	/**
	 * Filters videos, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $item           object    SimplePie_Item object
	 * @param   $options_videos array    Current video options.
	 * @since 1.7.0
	 */
	function Get_Item_Videos($current_item, $campaign, $feed, $item, $options_videos) {
		if ($options_videos['video_cache']) {
			$current_item['videos'] = $this->parseVideos($current_item['content']);
			
			$current_item = apply_filters('wpematico_get_item_videos', $current_item, $campaign, $item, $options_videos);

			$current_item['videos'] = array_values(array_unique($current_item['videos']));
			foreach ($current_item['videos'] as $ki => $image) {
				if (strpos($image, '//') === 0) {
					$current_item['videos'][$ki] = 'http:' . $current_item['videos'][$ki];
				}
			}
		}
		return $current_item;
	}

	/**
	 * Filters videos, upload and replace on text item content
	 * @param   $text   	string   text of content of current post.
	 * @return  $videos 	array 	 Array of current videos on post content.
	 * @since 1.7.0
	 */
	function parseVideos($text, $wiframes = false) {
		
		$videos	 = array();
		if(!empty($text)){
			$dom	 = new DOMDocument();
			@$dom->loadHTML($text);
			$xpath	 = new DomXPath($dom);
			if(!$wiframes){
				$nodes	 = $xpath->query('//video | //video/source');
			}else{
				$nodes	 = $xpath->query('//video | //video/source | //iframe');
			}
			foreach ($nodes as $node) {
				$videos[] = $node->getAttribute('src');
			}
		}
		return $videos;
	}

	/**
	 * @since 1.7.0
	 */
	function strip_Video_by_src($src, $content) {
		/* Translators: %s: URL of the video URL value */
		trigger_error(sprintf(__("Removing: %s from content.", 'wpematico'), '"' . $src . '"'), E_USER_NOTICE);
		$video_src_real_scaped	 = addslashes($src);
		$video_src_real_scaped	 = addcslashes($video_src_real_scaped, "?.+*");
		$pattern				 = '|<video(.+?)>(.*?)<source(.*?)src=["\']' . $video_src_real_scaped . '["\'](.*?)>(.*?)<\/video>|';
		$content_striped		 = preg_replace($pattern, '', $content);
		$content				 = ( is_null($content_striped) ) ? $content : $content_striped;
		return $content;
	}

	/**
	 * Filters videos, upload and replace on text item content
	 * @param   $current_item   array    Current post data to be saved
	 * @param   $campaign       array    Current campaign data
	 * @param   $feed           object    Feed database object
	 * @param   $item           object    SimplePie_Item object
	 * @param   $options_videos array    Current video options.
	 * @since 1.7.0
	 */
	function Item_Videos(&$current_item, &$campaign, &$feed, &$item, $options_videos) {
		if ($options_videos['video_cache']) {
			$itemUrl = $this->current_item['permalink'];

			if (sizeof($current_item['videos'])) { // If exist videos on content.
				trigger_error('<b>' . __('Looking for videos in content.', 'wpematico') . '</b>', E_USER_NOTICE);
				$video_new_url_array = array();
				foreach ($current_item['videos'] as $video_src) {

					trigger_error(__('Uploading media...', 'wpematico') . $video_src, E_USER_NOTICE);
					$video_src_real	 = $this->getRelativeUrl($itemUrl, $video_src);
					// Strip all white space on videos URLs.	
					$video_src_real	 = str_replace(' ', '%20', $video_src_real);
					$video_src_real	 = apply_filters('wpematico_video_src_url', $video_src_real); // original source
					$allowed_video	 = (isset($this->cfg['video_allowed_ext']) && !empty($this->cfg['video_allowed_ext']) ) ? $this->cfg['video_allowed_ext'] : 'mp4';
					$allowed_video	 = apply_filters('wpematico_allowext_video', $allowed_video);

					// Compability with WP, Strip Query added by WP ShortCode
					$video_src_without_query = $video_src_real;
					if (substr($video_src_without_query, -4) == '?_=1') {
						$video_src_without_query = str_replace('?_=1', '', $video_src_without_query);
					}
					// Store video.	
					$new_video_name	 = apply_filters('wpematico_new_video_name', sanitize_file_name(urlencode(basename($video_src_without_query))), $current_item, $campaign, $item);  // new name here
					// Primero intento con mi funcion mas rapida
					$upload_dir		 = wp_upload_dir();
					$video_dst		 = trailingslashit($upload_dir['path']) . $new_video_name;
					$video_dst_url	 = trailingslashit($upload_dir['url']) . $new_video_name;
					trigger_error('Filtering video extensions:' . $allowed_video, E_USER_NOTICE);
					if (in_array(str_replace('.', '', strrchr(strtolower($video_dst), '.')), explode(',', $allowed_video))) {   // -------- Controlo extensiones permitidas
						trigger_error('Uploading media=' . $video_src . ' <b>to</b> video_dst=' . $video_dst . '', E_USER_NOTICE);
						$newfile = false;

						if ($options_videos['upload_ranges']) {
							$newfile = apply_filters('wpematico_partial_upload_file', $video_dst, $video_src_real, $options_videos);
						}

						if ($options_videos['customupload_videos'] && !$newfile) {
							$newfile = WPeMatico::save_file_from_url($video_src_real, $video_dst);
						}

						if ($newfile) { //subió
							trigger_error('Uploaded media=' . $newfile, E_USER_NOTICE);
							$video_dst				 = $newfile;
							$video_dst_url			 = trailingslashit($upload_dir['url']) . basename($newfile);
							$current_item['content'] = str_replace($video_src, $video_dst_url, $current_item['content']);
							$video_new_url_array[]	 = $video_dst_url;
						} else { // falló -> intento con otros
							$bits	 = WPeMatico::wpematico_get_contents($video_src_real);
							$mirror	 = wp_upload_bits($new_video_name, NULL, $bits);
							if (!$mirror['error']) {
								trigger_error($mirror['url'], E_USER_NOTICE);
								$current_item['content'] = str_replace($video_src, $mirror['url'], $current_item['content']);
								$video_new_url_array[]	 = $mirror['url'];
							} else {
								trigger_error('wp_upload_bits error:' . print_r($mirror, true) . '.', E_USER_WARNING);
								// Si no quiere linkar los videos al server borro el link de la video
								trigger_error(__('Upload file failed:', 'wpematico') . $video_dst, E_USER_WARNING);
								if ($options_videos['gralnolink_video']) {
									$current_item['content'] = $this->strip_Video_by_src($video_src, $current_item['content']);
								}
							}
						}
					} else {
						trigger_error(__('Extension not allowed: ', 'wpematico') . urldecode($video_dst_url), E_USER_WARNING);
						if ($options_videos['gralnolink_video']) { // Si no quiere linkar las img al server borro el link de la imagen
							trigger_error(__('Stripped src.', 'wpematico'), E_USER_WARNING);
							$current_item['content'] = $this->strip_Video_by_src($video_src, $current_item['content']);
						}
					}
				}
				$current_item['videos'] = (array) $video_new_url_array;
			}  // // Si hay alguna imagen en el contenido
		} else {
			if (isset($current_item['videos']) && sizeof($current_item['videos'])) {
				trigger_error('<b>' . __('Using remotely linked videos in content. No changes.', 'wpematico') . '</b>', E_USER_NOTICE);
			}
			$current_item['videos'] = array();
		}
		return $current_item;
	}

	// item videos

	public static function wpematico_exclude_shorts($skip, $current_item, $campaign, $item){
		// Extract YouTube video ID
		$ytvideoId = $item->get_item_tags('http://www.youtube.com/xml/schemas/2015', 'videoId');
	
		if (!empty($ytvideoId)) {
			$ytvideoId = $ytvideoId[0]['data'];
			$url = "https://www.youtube.com/shorts/$ytvideoId";
	
			// Check if the campaign setting for only shorts is enabled
			$only_shorts_enabled = !empty($campaign['campaign_youtube_only_shorts']);
	
			// Check if the campaign setting for ignoring shorts is enabled
			$ignore_shorts_enabled = !empty($campaign['campaign_youtube_ign_shorts']);
	
			// Fetch headers
			$headers = get_headers($url, 1);
	
			// Check if the URL exists (returns true)
			$url_exists = strpos($headers[0], '200') !== false;
			
			// Determine whether to skip the item
			if ($only_shorts_enabled) {
				// No skip if the URL exists (shorts video)
				if(!$url_exists)
					trigger_error(__('Skipping standard videos...', 'wpematico'), E_USER_NOTICE);

				$skip = !$url_exists;
			} elseif ($ignore_shorts_enabled) {
				// Skip if the URL exists and ignoring shorts
				if($url_exists)
					trigger_error(__('Skipping Youtube Short...', 'wpematico'), E_USER_NOTICE);
				$skip = $url_exists;
			}
		}
		// Default behavior: do not skip
		return $skip;
	}
}

// class