Completed
Push — kraftbj-patch-1 ( 599bd6...9b0476 )
by
unknown
145:59 queued 137:31
created

Jetpack_VideoPress   A

Complexity

Total Complexity 42

Size/Duplication

Total Lines 332
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
dl 0
loc 332
rs 9.0399
c 0
b 0
f 0
wmc 42
lcom 1
cbo 6

16 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 9 2
A __construct() 0 5 1
A on_init() 0 19 2
A jetpack_module_deactivated() 0 3 1
B can() 0 25 8
A is_connection_owner() 0 9 5
A enqueue_admin_styles() 0 4 1
A enqueue_admin_scripts() 0 50 3
A update_attachment_url_for_videopress() 0 7 2
A videopress_pluploder_config() 0 13 2
A should_override_media_uploader() 0 24 3
A print_in_footer_open_media_add_new() 0 27 5
A add_video_upload_mimes() 0 13 2
A filter_video_mimes() 0 3 1
A wp_mime_type_icon() 0 14 3
A add_videopress_extenstion() 0 5 1

How to fix   Complexity   

Complex Class

Complex classes like Jetpack_VideoPress often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Jetpack_VideoPress, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/**
4
 * VideoPress in Jetpack
5
 */
6
class Jetpack_VideoPress {
7
	/** @var string */
8
	public $module = 'videopress';
9
10
	/** @var int */
11
	public $version = 5;
12
13
	/**
14
	 * Singleton
15
	 */
16
	public static function init() {
17
		static $instance = false;
18
19
		if ( ! $instance ) {
20
			$instance = new Jetpack_VideoPress();
21
		}
22
23
		return $instance;
24
	}
25
26
	/**
27
	 * Jetpack_VideoPress constructor.
28
	 *
29
	 * Sets up the initializer and makes sure that videopress activates and deactivates properly.
30
	 */
31
	private function __construct() {
32
		// $this->version = time(); // <s>ghost</s> cache busters!
33
		add_action( 'init', array( $this, 'on_init' ) );
34
		add_action( 'jetpack_deactivate_module_videopress', array( $this, 'jetpack_module_deactivated' ) );
35
	}
36
37
	/**
38
	 * Fires on init
39
	 */
40
	public function on_init() {
41
		add_action( 'wp_enqueue_media', array( $this, 'enqueue_admin_scripts' ) );
42
		add_filter( 'plupload_default_settings', array( $this, 'videopress_pluploder_config' ) );
43
		add_filter( 'wp_get_attachment_url', array( $this, 'update_attachment_url_for_videopress' ), 10, 2 );
44
45
		if ( Jetpack_Plan::supports( 'videopress' ) ) {
46
			add_filter( 'upload_mimes', array( $this, 'add_video_upload_mimes' ), 999 );
47
		}
48
49
		add_action( 'admin_print_footer_scripts', array( $this, 'print_in_footer_open_media_add_new' ) );
50
		add_action( 'admin_head', array( $this, 'enqueue_admin_styles' ) );
51
52
		add_filter( 'wp_mime_type_icon', array( $this, 'wp_mime_type_icon' ), 10, 3 );
53
54
		add_filter( 'wp_video_extensions', array( $this, 'add_videopress_extenstion' ) );
55
56
		VideoPress_Scheduler::init();
57
		VideoPress_XMLRPC::init();
58
	}
59
60
	/**
61
	 * Runs when the VideoPress module is deactivated.
62
	 */
63
	public function jetpack_module_deactivated() {
64
		VideoPress_Options::delete_options();
65
	}
66
67
	/**
68
	 * A can of coke
69
	 *
70
	 * Similar to current_user_can, but internal to VideoPress. Returns
71
	 * true if the given VideoPress capability is allowed by the given user.
72
	 */
73
	public function can( $cap, $user_id = false ) {
74
		if ( ! $user_id ) {
75
			$user_id = get_current_user_id();
76
		}
77
78
		// Connection owners are allowed to do all the things.
79
		if ( $this->is_connection_owner( $user_id ) ) {
80
			return true;
81
		}
82
83
		// Additional and internal caps checks
84
		if ( ! user_can( $user_id, 'upload_files' ) ) {
85
			return false;
86
		}
87
88
		if ( 'edit_videos' == $cap && ! user_can( $user_id, 'edit_others_posts' ) ) {
89
			return false;
90
		}
91
92
		if ( 'delete_videos' == $cap && ! user_can( $user_id, 'delete_others_posts' ) ) {
93
			return false;
94
		}
95
96
		return true;
97
	}
98
99
	/**
100
	 * Returns true if the provided user is the Jetpack connection owner.
101
	 */
102
	public function is_connection_owner( $user_id = false ) {
103
		if ( ! $user_id ) {
104
			$user_id = get_current_user_id();
105
		}
106
107
		$user_token = Jetpack_Data::get_access_token( JETPACK_MASTER_USER );
108
109
		return $user_token && is_object( $user_token ) && isset( $user_token->external_user_id ) && $user_id === $user_token->external_user_id;
110
	}
111
112
	/**
113
	 * Register and enqueue VideoPress admin styles.
114
	 */
115
	public function enqueue_admin_styles() {
116
		wp_register_style( 'videopress-admin', plugins_url( 'videopress-admin.css', __FILE__ ), array(), $this->version );
117
		wp_enqueue_style( 'videopress-admin' );
118
	}
119
120
	/**
121
	 * Register VideoPress admin scripts.
122
	 */
123
	public function enqueue_admin_scripts() {
124
		if ( did_action( 'videopress_enqueue_admin_scripts' ) ) {
125
			return;
126
		}
127
128
		if ( $this->should_override_media_uploader() ) {
129
			wp_enqueue_script(
130
				'videopress-plupload',
131
				Jetpack::get_file_url_for_environment(
132
					'_inc/build/videopress/js/videopress-plupload.min.js',
133
					'modules/videopress/js/videopress-plupload.js'
134
				),
135
				array(
136
					'jquery',
137
					'wp-plupload',
138
				),
139
				$this->version
140
			);
141
142
			wp_enqueue_script(
143
				'videopress-uploader',
144
				Jetpack::get_file_url_for_environment(
145
					'_inc/build/videopress/js/videopress-uploader.min.js',
146
					'modules/videopress/js/videopress-uploader.js'
147
				),
148
				array(
149
					'videopress-plupload',
150
				),
151
				$this->version
152
			);
153
154
			wp_enqueue_script(
155
				'media-video-widget-extensions',
156
				Jetpack::get_file_url_for_environment(
157
					'_inc/build/videopress/js/media-video-widget-extensions.min.js',
158
					'modules/videopress/js/media-video-widget-extensions.js'
159
				),
160
				array(),
161
				$this->version,
162
				true
163
			);
164
		}
165
166
		/**
167
		 * Fires after VideoPress scripts are enqueued in the dashboard.
168
		 *
169
		 * @since 2.5.0
170
		 */
171
		do_action( 'videopress_enqueue_admin_scripts' );
172
	}
173
174
	/**
175
	 * An override for the attachment url, which returns back the WPCOM VideoPress processed url.
176
	 *
177
	 * This is an action proxy to the videopress_get_attachment_url() utility function.
178
	 *
179
	 * @param string $url
180
	 * @param int    $post_id
181
	 *
182
	 * @return string
183
	 */
184
	public function update_attachment_url_for_videopress( $url, $post_id ) {
185
		if ( $videopress_url = videopress_get_attachment_url( $post_id ) ) {
186
			return $videopress_url;
187
		}
188
189
		return $url;
190
	}
191
192
	/**
193
	 * Modify the default plupload config to turn on videopress specific filters.
194
	 */
195
	public function videopress_pluploder_config( $config ) {
196
197
		if ( ! isset( $config['filters']['max_file_size'] ) ) {
198
			$config['filters']['max_file_size'] = wp_max_upload_size() . 'b';
199
		}
200
201
		$config['filters']['videopress_check_uploads'] = $config['filters']['max_file_size'];
202
203
		// We're doing our own check in the videopress_check_uploads filter.
204
		unset( $config['filters']['max_file_size'] );
205
206
		return $config;
207
	}
208
209
210
	/**
211
	 * Helper function to determine if the media uploader should be overridden.
212
	 *
213
	 * The rules are simple, only try to load the script when on the edit post or new post pages.
214
	 *
215
	 * @return bool
216
	 */
217
	protected function should_override_media_uploader() {
218
		global $pagenow;
219
220
		// Only load in the admin
221
		if ( ! is_admin() ) {
222
			return false;
223
		}
224
225
		$acceptable_pages = array(
226
			'post-new.php',
227
			'post.php',
228
			'upload.php',
229
			'customize.php',
230
		);
231
232
		// Only load on the post, new post, or upload pages.
233
		if ( ! in_array( $pagenow, $acceptable_pages ) ) {
234
			return false;
235
		}
236
237
		$options = VideoPress_Options::get_options();
238
239
		return $options['shadow_blog_id'] > 0;
240
	}
241
242
	/**
243
	 * A work-around / hack to make it possible to go to the media library with the add new box open.
244
	 *
245
	 * @return bool
246
	 */
247
	public function print_in_footer_open_media_add_new() {
248
		global $pagenow;
249
250
		// Only load in the admin
251
		if ( ! is_admin() ) {
252
			return false;
253
		}
254
255
		if ( $pagenow !== 'upload.php' ) {
256
			return false;
257
		}
258
259
		if ( ! isset( $_GET['action'] ) || $_GET['action'] !== 'add-new' ) {
260
			return false;
261
		}
262
263
		?>
264
			<script type="text/javascript">
265
				( function( $ ) {
266
					window.setTimeout( function() {
267
						$('#wp-media-grid .page-title-action').click();
268
					}, 500 );
269
270
				}( jQuery ) );
271
			</script>
272
		<?php
273
	}
274
275
	/**
276
	 * Makes sure that all video mimes are added in, as multi site installs can remove them.
277
	 *
278
	 * @param array $existing_mimes
279
	 * @return array
280
	 */
281
	public function add_video_upload_mimes( $existing_mimes = array() ) {
282
		$mime_types  = wp_get_mime_types();
283
		$video_types = array_filter( $mime_types, array( $this, 'filter_video_mimes' ) );
284
285
		foreach ( $video_types as $key => $value ) {
286
			$existing_mimes[ $key ] = $value;
287
		}
288
289
		// Make sure that videopress mimes are considered videos.
290
		$existing_mimes['videopress'] = 'video/videopress';
291
292
		return $existing_mimes;
293
	}
294
295
	/**
296
	 * Filter designed to get rid of non video mime types.
297
	 *
298
	 * @param string $value
299
	 * @return int
300
	 */
301
	public function filter_video_mimes( $value ) {
302
		return preg_match( '@^video/@', $value );
303
	}
304
305
	/**
306
	 * @param string $icon
307
	 * @param string $mime
308
	 * @param int    $post_id
309
	 *
310
	 * @return string
311
	 */
312
	public function wp_mime_type_icon( $icon, $mime, $post_id ) {
313
314
		if ( $mime !== 'video/videopress' ) {
315
			return $icon;
316
		}
317
318
		$status = get_post_meta( $post_id, 'videopress_status', true );
319
320
		if ( $status === 'complete' ) {
321
			return $icon;
322
		}
323
324
		return 'https://wordpress.com/wp-content/mu-plugins/videopress/images/media-video-processing-icon.png';
325
	}
326
327
	/**
328
	 * @param array $extensions
329
	 *
330
	 * @return array
331
	 */
332
	public function add_videopress_extenstion( $extensions ) {
333
		$extensions[] = 'videopress';
334
335
		return $extensions;
336
	}
337
}
338
339
// Initialize the module.
340
Jetpack_VideoPress::init();
341