Completed
Push — master ( 5c4f65...e345d1 )
by Alex
09:11
created

Jetpack_VideoPress   B

Complexity

Total Complexity 42

Size/Duplication

Total Lines 333
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
wmc 42
lcom 1
cbo 5
dl 0
loc 333
rs 8.295
c 0
b 0
f 0

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
C can() 0 26 8
B is_connection_owner() 0 9 5
A enqueue_admin_styles() 0 4 1
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
A enqueue_admin_scripts() 0 50 3
A update_attachment_url_for_videopress() 0 7 2
A videopress_pluploder_config() 0 13 2
B should_override_media_uploader() 0 24 3
B print_in_footer_open_media_add_new() 0 27 5

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