PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 2.9.6
Jetpack – WP Security, Backup, Speed, & Growth v2.9.6
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / class.media-summary.php
jetpack Last commit date
3rd-party 10 years ago _inc 10 years ago languages 10 years ago modules 5 years ago views 10 years ago .svnignore 10 years ago class.jetpack-bbpress-json-api-compat.php 10 years ago class.jetpack-cli.php 10 years ago class.jetpack-client-server.php 10 years ago class.jetpack-client.php 10 years ago class.jetpack-data.php 10 years ago class.jetpack-debugger.php 10 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 10 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-network-sites-list-table.php 10 years ago class.jetpack-network.php 10 years ago class.jetpack-options.php 10 years ago class.jetpack-post-images.php 10 years ago class.jetpack-signature.php 10 years ago class.jetpack-sync.php 10 years ago class.jetpack-user-agent.php 10 years ago class.jetpack-xmlrpc-server.php 10 years ago class.jetpack.php 10 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 10 years ago class.media-extractor.php 10 years ago class.media-summary.php 10 years ago class.photon.php 10 years ago composer.json 10 years ago functions.compat.php 10 years ago functions.gallery.php 10 years ago functions.opengraph.php 10 years ago functions.photon.php 10 years ago functions.twitter-cards.php 10 years ago jetpack.php 3 years ago locales.php 10 years ago readme.txt 3 years ago require-lib.php 10 years ago uninstall.php 10 years ago
class.media-summary.php
263 lines
1 <?php
2 /**
3 * Class Jetpack_Media_Summary
4 *
5 * embed [video] > gallery > image > text
6 */
7 class Jetpack_Media_Summary {
8
9 static function get( $post_id, $blog_id = 0, $args = array() ) {
10 $defaults = array(
11 'trigger_mshot' => false
12 );
13 $args = wp_parse_args( $args, $defaults );
14
15 $switched = false;
16 if ( !empty( $blog_id ) && $blog_id != get_current_blog_id() && function_exists( 'switch_to_blog' ) ) {
17 switch_to_blog( $blog_id );
18 $switched = true;
19 } else {
20 $blog_id = get_current_blog_id();
21 }
22
23 $post = get_post( $post_id );
24 $permalink = get_permalink( $post_id );
25
26 $return = array(
27 'type' => 'standard',
28 'permalink' => $permalink,
29 'image' => '',
30 'excerpt' => '',
31 'word_count' => 0,
32 'secure' => array(
33 'image' => '',
34 ),
35 'count' => array(
36 'image' => 0,
37 'video' => 0,
38 'word' => 0,
39 'link' => 0,
40 ),
41 );
42
43 $extract = Jetpack_Media_Meta_Extractor::extract( $blog_id, $post_id, Jetpack_Media_Meta_Extractor::ALL );
44
45 if ( empty( $extract['has'] ) )
46 return $return;
47
48 // Prioritize [some] video embeds
49 if ( !empty( $extract['has']['shortcode'] ) ) {
50 foreach ( $extract['shortcode'] as $type => $data ) {
51 switch ( $type ) {
52 case 'wpvideo':
53 if ( 0 == $return['count']['video'] ) {
54 $return['type'] = 'video';
55 $return['video'] = esc_url_raw( 'http://s0.videopress.com/player.swf?guid=' . $extract['shortcode']['wpvideo']['id'][0] . '&isDynamicSeeking=true' );
56 $return['image'] = self::get_video_poster( 'videopress', $extract['shortcode']['wpvideo']['id'][0] );
57 $return['secure']['video'] = preg_replace( '@http://[^\.]+.videopress.com/@', 'https://v0.wordpress.com/', $return['video'] );
58 $return['secure']['image'] = str_replace( 'http://videos.videopress.com', 'https://videos.files.wordpress.com', $return['image'] );
59 }
60 $return['count']['video']++;
61 break;
62 case 'youtube':
63 if ( 0 == $return['count']['video'] ) {
64 $return['type'] = 'video';
65 $return['video'] = esc_url_raw( 'http://www.youtube.com/watch?feature=player_embedded&v=' . $extract['shortcode']['youtube']['id'][0] );
66 $return['image'] = self::get_video_poster( 'youtube', $extract['shortcode']['youtube']['id'][0] );
67 $return['secure']['video'] = self::https( $return['video'] );
68 $return['secure']['image'] = self::https( $return['image'] );
69 }
70 $return['count']['video']++;
71 break;
72 case 'vimeo':
73 if ( 0 == $return['count']['video'] ) {
74 $return['type'] = 'video';
75 $return['video'] = esc_url_raw( 'http://vimeo.com/' . $extract['shortcode']['vimeo']['id'][0] );
76 $return['secure']['video'] = self::https( $return['video'] );
77
78 $poster_image = get_post_meta( $post_id, 'vimeo_poster_image', true );
79 if ( !empty( $poster_image ) ) {
80 $return['image'] = $poster_image;
81 $poster_url_parts = parse_url( $poster_image );
82 $return['secure']['image'] = 'https://secure-a.vimeocdn.com' . $poster_url_parts['path'];
83 }
84 }
85 $return['count']['video']++;
86 break;
87 }
88 }
89
90 }
91
92 if ( !empty( $extract['has']['embed'] ) ) {
93 foreach( $extract['embed']['url'] as $embed ) {
94 if ( preg_match( '/((youtube|vimeo)\.com|youtu.be)/', $embed ) ) {
95 if ( 0 == $return['count']['video'] ) {
96 $return['type'] = 'video';
97 $return['video'] = 'http://' . $embed;
98 $return['secure']['video'] = self::https( $return['video'] );
99 if ( strstr( $embed, 'youtube' ) ) {
100 $return['image'] = self::get_video_poster( 'youtube', get_youtube_id( $return['video'] ) );
101 $return['secure']['image'] = self::https( $return['image'] );
102 } else if ( strstr( $embed, 'vimeo' ) ) {
103 $poster_image = get_post_meta( $post_id, 'vimeo_poster_image', true );
104 if ( !empty( $poster_image ) ) {
105 $return['image'] = $poster_image;
106 $poster_url_parts = parse_url( $poster_image );
107 $return['secure']['image'] = 'https://secure-a.vimeocdn.com' . $poster_url_parts['path'];
108 }
109 }
110
111 }
112 $return['count']['video']++;
113 }
114 }
115 }
116
117 // Do we really want to make the video the primary focus of the post?
118 if ( 'video' == $return['type'] ) {
119 $content = wpautop( strip_tags( $post->post_content ) );
120 $paragraphs = explode( '</p>', $content );
121 $number_of_paragraphs = 0;
122
123 foreach ( $paragraphs as $i => $paragraph ) {
124 // Don't include blank lines as a paragraph
125 if ( '' == trim( $paragraph ) ) {
126 unset( $paragraphs[$i] );
127 continue;
128 }
129 $number_of_paragraphs++;
130 }
131
132 $number_of_paragraphs = $number_of_paragraphs - $return['count']['video']; // subtract amount for videos..
133
134 // More than 2 paragraph? The video is not the primary focus so we can do some more analysis
135 if ( $number_of_paragraphs > 2 )
136 $return['type'] = 'standard';
137 }
138
139 // If we don't have any prioritized embed...
140 if ( 'standard' == $return['type'] ) {
141 if ( !empty( $extract['has']['gallery'] ) ) {
142 //... Then we prioritize galleries first (multiple images returned)
143 $return['type'] = 'gallery';
144 $return['images'] = $extract['image'];
145 foreach ( $return['images'] as $image ) {
146 $return['secure']['images'][] = array( 'url' => self::ssl_img( $image['url'] ) );
147 $return['count']['image']++;
148 }
149 } else if ( !empty( $extract['has']['image'] ) ) {
150 // ... Or we try and select a single image that would make sense
151 $content = wpautop( strip_tags( $post->post_content ) );
152 $paragraphs = explode( '</p>', $content );
153 $number_of_paragraphs = 0;
154
155 foreach ( $paragraphs as $i => $paragraph ) {
156 // Don't include 'actual' captions as a paragraph
157 if ( false !== strpos( $paragraph, '[caption' ) ) {
158 unset( $paragraphs[$i] );
159 continue;
160 }
161 // Don't include blank lines as a paragraph
162 if ( '' == trim( $paragraph ) ) {
163 unset( $paragraphs[$i] );
164 continue;
165 }
166 $number_of_paragraphs++;
167 }
168
169 $return['image'] = $extract['image'][0]['url'];
170 $return['secure']['image'] = self::ssl_img( $return['image'] );
171 $return['count']['image']++;
172
173 if ( $number_of_paragraphs <= 2 ) {
174 // If we have lots of text, let's not treat it as an image post, but return its first image
175 $return['type'] = 'image';
176 }
177 }
178 }
179
180 if ( empty( $post->post_password ) ) {
181 $return['excerpt'] = self::get_excerpt( $post->post_content, $post->post_excerpt );
182 $return['count']['word'] = self::get_word_count( $post->post_content );
183 $return['count']['word_remaining'] = self::get_word_remaining_count( $post->post_content, self::get_excerpt( $post->post_content, $post->post_excerpt ) );
184 $return['count']['link'] = self::get_link_count( $post->post_content );
185 }
186
187 if ( $switched ) {
188 restore_current_blog();
189 }
190
191 return $return;
192 }
193
194 static function https( $str ) {
195 return str_replace( 'http://', 'https://', $str );
196 }
197
198 static function ssl_img( $url ) {
199 if ( strstr( $url, 'files.wordpress.com' ) ) {
200 return self::https( $url );
201 } else {
202 return self::https( jetpack_photon_url( $url ) );
203 }
204 }
205
206 static function get_video_poster( $type, $id ) {
207 if ( 'videopress' == $type ) {
208 if ( function_exists( 'video_get_highest_resolution_image_url' ) ) {
209 return video_get_highest_resolution_image_url( $id );
210 } else if ( class_exists( 'VideoPress_Video' ) ) {
211 $video = new VideoPress_Video( $id );
212 return $video->poster_frame_uri;
213 }
214 } else if ( 'youtube' == $type ) {
215 return 'http://img.youtube.com/vi/'.$id.'/0.jpg';
216 }
217 }
218
219 static function clean_text( $text ) {
220 return trim(
221 preg_replace(
222 '/[\s]+/',
223 ' ',
224 preg_replace(
225 '@https?://[\S]+@',
226 '',
227 strip_shortcodes(
228 strip_tags(
229 $text
230 )
231 )
232 )
233 )
234 );
235 }
236
237 static function get_excerpt( $post_content, $post_excerpt ) {
238 if ( function_exists( 'wpcom_enhanced_excerpt_extract_excerpt' ) ) {
239 return self::clean_text( wpcom_enhanced_excerpt_extract_excerpt( array(
240 'text' => $post_content,
241 'excerpt_only' => true,
242 'show_read_more' => false,
243 'max_words' => 16,
244 'max_chars' => 100,
245 ) ) );
246 } else {
247 $post_excerpt = apply_filters( 'get_the_excerpt', $post_excerpt );
248 return self::clean_text( $post_excerpt );
249 }
250 }
251
252 static function get_word_count( $post_content ) {
253 return str_word_count( self::clean_text( $post_content ) );
254 }
255
256 static function get_word_remaining_count( $post_content, $excerpt_content ) {
257 return str_word_count( self::clean_text( $post_content ) ) - str_word_count( self::clean_text( $excerpt_content ) );
258 }
259
260 static function get_link_count( $post_content ) {
261 return substr_count( $post_content, '<a' );
262 }
263 }