/** * Creates a local media library item of a remote VideoPress video. * * @param $guid * @param int $parent_id * * @return int|object */ function create_local_media_library_for_videopress_guid($guid, $parent_id = 0) { $vp_data = videopress_get_video_details($guid); if (!$vp_data || is_wp_error($vp_data)) { return $vp_data; } $args = array('post_date' => $vp_data->upload_date, 'post_title' => wp_kses($vp_data->title, array()), 'post_content' => wp_kses($vp_data->description, array()), 'post_mime_type' => 'video/videopress', 'guid' => sprintf('https://videopress.com/v/%s', $guid)); $attachment_id = wp_insert_attachment($args, null, $parent_id); if (!is_wp_error($attachment_id)) { update_post_meta($attachment_id, 'videopress_guid', $guid); wp_update_attachment_metadata($attachment_id, array('width' => $vp_data->width, 'height' => $vp_data->height)); $thumbnail_id = videopress_download_poster_image($vp_data->poster, $attachment_id); update_post_meta($attachment_id, '_thumbnail_id', $thumbnail_id); } return $attachment_id; }
static function get($post_id, $blog_id = 0, $args = array()) { $defaults = array('max_words' => 16, 'max_chars' => 256); $args = wp_parse_args($args, $defaults); $switched = false; if (!empty($blog_id) && $blog_id != get_current_blog_id() && function_exists('switch_to_blog')) { switch_to_blog($blog_id); $switched = true; } else { $blog_id = get_current_blog_id(); } if (!class_exists('Jetpack_Media_Meta_Extractor')) { jetpack_require_lib('class.media-extractor'); } $post = get_post($post_id); $permalink = get_permalink($post_id); $return = array('type' => 'standard', 'permalink' => $permalink, 'image' => '', 'excerpt' => '', 'word_count' => 0, 'secure' => array('image' => ''), 'count' => array('image' => 0, 'video' => 0, 'word' => 0, 'link' => 0)); if (empty($post->post_password)) { $return['excerpt'] = self::get_excerpt($post->post_content, $post->post_excerpt, $args['max_words'], $args['max_chars']); $return['count']['word'] = self::get_word_count($post->post_content); $return['count']['word_remaining'] = self::get_word_remaining_count($post->post_content, $return['excerpt']); $return['count']['link'] = self::get_link_count($post->post_content); } $extract = Jetpack_Media_Meta_Extractor::extract($blog_id, $post_id, Jetpack_Media_Meta_Extractor::ALL); if (empty($extract['has'])) { return $return; } // Prioritize [some] video embeds if (!empty($extract['has']['shortcode'])) { foreach ($extract['shortcode'] as $type => $data) { switch ($type) { case 'videopress': case 'wpvideo': if (0 == $return['count']['video']) { // If there is no id on the video, then let's just skip this if (!isset($data['id'][0])) { continue; } $guid = $data['id'][0]; $video_info = videopress_get_video_details($guid); // Only add the video tags if the guid returns a valid videopress object. if ($video_info instanceof stdClass) { // Continue early if we can't find a Video slug. if (empty($video_info->files->std->mp4)) { continue; } $url = sprintf('https://videos.files.wordpress.com/%1$s/%2$s', $guid, $video_info->files->std->mp4); $thumbnail = $video_info->poster; if (!empty($thumbnail)) { $return['image'] = $thumbnail; $return['secure']['image'] = $thumbnail; } $return['type'] = 'video'; $return['video'] = esc_url_raw($url); $return['video_type'] = 'video/mp4'; $return['secure']['video'] = $return['video']; } } $return['count']['video']++; break; case 'youtube': if (0 == $return['count']['video']) { $return['type'] = 'video'; $return['video'] = esc_url_raw('http://www.youtube.com/watch?feature=player_embedded&v=' . $extract['shortcode']['youtube']['id'][0]); $return['image'] = self::get_video_poster('youtube', $extract['shortcode']['youtube']['id'][0]); $return['secure']['video'] = self::https($return['video']); $return['secure']['image'] = self::https($return['image']); } $return['count']['video']++; break; case 'vimeo': if (0 == $return['count']['video']) { $return['type'] = 'video'; $return['video'] = esc_url_raw('http://vimeo.com/' . $extract['shortcode']['vimeo']['id'][0]); $return['secure']['video'] = self::https($return['video']); $poster_image = get_post_meta($post_id, 'vimeo_poster_image', true); if (!empty($poster_image)) { $return['image'] = $poster_image; $poster_url_parts = parse_url($poster_image); $return['secure']['image'] = 'https://secure-a.vimeocdn.com' . $poster_url_parts['path']; } } $return['count']['video']++; break; } } } if (!empty($extract['has']['embed'])) { foreach ($extract['embed']['url'] as $embed) { if (preg_match('/((youtube|vimeo|dailymotion)\\.com|youtu.be)/', $embed)) { if (0 == $return['count']['video']) { $return['type'] = 'video'; $return['video'] = 'http://' . $embed; $return['secure']['video'] = self::https($return['video']); if (false !== strpos($embed, 'youtube')) { $return['image'] = self::get_video_poster('youtube', jetpack_get_youtube_id($return['video'])); $return['secure']['image'] = self::https($return['image']); } else { if (false !== strpos($embed, 'youtu.be')) { $youtube_id = jetpack_get_youtube_id($return['video']); $return['video'] = 'http://youtube.com/watch?v=' . $youtube_id . '&feature=youtu.be'; $return['secure']['video'] = self::https($return['video']); $return['image'] = self::get_video_poster('youtube', jetpack_get_youtube_id($return['video'])); $return['secure']['image'] = self::https($return['image']); } else { if (false !== strpos($embed, 'vimeo')) { $poster_image = get_post_meta($post_id, 'vimeo_poster_image', true); if (!empty($poster_image)) { $return['image'] = $poster_image; $poster_url_parts = parse_url($poster_image); $return['secure']['image'] = 'https://secure-a.vimeocdn.com' . $poster_url_parts['path']; } } else { if (false !== strpos($embed, 'dailymotion')) { $return['image'] = str_replace('dailymotion.com/video/', 'dailymotion.com/thumbnail/video/', $embed); $return['image'] = parse_url($return['image'], PHP_URL_SCHEME) === null ? 'http://' . $return['image'] : $return['image']; $return['secure']['image'] = self::https($return['image']); } } } } } $return['count']['video']++; } } } // Do we really want to make the video the primary focus of the post? if ('video' == $return['type']) { $content = wpautop(strip_tags($post->post_content)); $paragraphs = explode('</p>', $content); $number_of_paragraphs = 0; foreach ($paragraphs as $i => $paragraph) { // Don't include blank lines as a paragraph if ('' == trim($paragraph)) { unset($paragraphs[$i]); continue; } $number_of_paragraphs++; } $number_of_paragraphs = $number_of_paragraphs - $return['count']['video']; // subtract amount for videos.. // More than 2 paragraph? The video is not the primary focus so we can do some more analysis if ($number_of_paragraphs > 2) { $return['type'] = 'standard'; } } // If we don't have any prioritized embed... if ('standard' == $return['type']) { if ((!empty($extract['has']['gallery']) || !empty($extract['shortcode']['gallery']['count'])) && !empty($extract['image'])) { //... Then we prioritize galleries first (multiple images returned) $return['type'] = 'gallery'; $return['images'] = $extract['image']; foreach ($return['images'] as $image) { $return['secure']['images'][] = array('url' => self::ssl_img($image['url'])); $return['count']['image']++; } } else { if (!empty($extract['has']['image'])) { // ... Or we try and select a single image that would make sense $content = wpautop(strip_tags($post->post_content)); $paragraphs = explode('</p>', $content); $number_of_paragraphs = 0; foreach ($paragraphs as $i => $paragraph) { // Don't include 'actual' captions as a paragraph if (false !== strpos($paragraph, '[caption')) { unset($paragraphs[$i]); continue; } // Don't include blank lines as a paragraph if ('' == trim($paragraph)) { unset($paragraphs[$i]); continue; } $number_of_paragraphs++; } $return['image'] = $extract['image'][0]['url']; $return['secure']['image'] = self::ssl_img($return['image']); $return['count']['image']++; if ($number_of_paragraphs <= 2 && 1 == count($extract['image'])) { // If we have lots of text or images, let's not treat it as an image post, but return its first image $return['type'] = 'image'; } } } } if ($switched) { restore_current_blog(); } /** * Allow a theme or plugin to inspect and ultimately change the media summary. * * @since 4.4.0 * * @param array $data The calculated media summary data. * @param int $post_id The id of the post this data applies to. */ $return = apply_filters('jetpack_media_summary_output', $return, $post_id); return $return; }