Completed
Push — add/sync-rest-2 ( dcf3c8...9df295 )
by
unknown
10:28
created

Jetpack_VideoPress_Shortcode::shortcode_callback()   C

Complexity

Conditions 11
Paths 25

Size

Total Lines 71
Code Lines 47

Duplication

Lines 4
Ratio 5.63 %
Metric Value
dl 4
loc 71
rs 5.6828
cc 11
eloc 47
nc 25
nop 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * VideoPress Shortcode Handler
5
 *
6
 * This file may or may not be included from the Jetpack VideoPress module.
7
 */
8
9
/**
10
 * Translate a 'videopress' or 'wpvideo' shortcode and arguments into a video player display.
11
 *
12
 * Expected input formats:
13
 *
14
 * [videopress OcobLTqC]
15
 * [wpvideo OcobLTqC]
16
 *
17
 * @link http://codex.wordpress.org/Shortcode_API Shortcode API
18
 * @param array $attr shortcode attributes
19
 * @return string HTML markup or blank string on fail
20
 */
21
function videopress_shortcode_callback( $attr ) {
22
	global $content_width;
23
24
	/**
25
	 * We only accept GUIDs as a first unnamed argument.
26
	 */
27
	$guid = $attr[0];
28
29
	/**
30
	 * Make sure the GUID passed in matches how actual GUIDs are formatted.
31
	 */
32
	if ( ! videopress_is_valid_guid( $guid ) ) {
33
		return '';
34
	}
35
36
	/**
37
	 * Set the defaults
38
	 */
39
	$defaults = array(
40
		'w'               => 0,     // Width of the video player, in pixels
41
		'at'              => 0,     // How many seconds in to initially seek to
42
		'hd'              => false, // Whether to display a high definition version
43
		'loop'            => false, // Whether to loop the video repeatedly
44
		'freedom'         => false, // Whether to use only free/libre codecs
45
		'autoplay'        => false, // Whether to autoplay the video on load
46
		'permalink'       => true,  // Whether to display the permalink to the video
47
		'flashonly'       => false, // Whether to support the Flash player exclusively
48
		'defaultlangcode' => false, // Default language code
49
	);
50
51
	$attr = shortcode_atts( $defaults, $attr, 'videopress' );
52
53
	/**
54
	 * Cast the attributes, post-input.
55
	 */
56
	$attr['width']   = absint( $attr['w'] );
57
	$attr['hd']      = (bool) $attr['hd'];
58
	$attr['freedom'] = (bool) $attr['freedom'];
59
60
	/**
61
	 * If the provided width is less than the minimum allowed
62
	 * width, or greater than `$content_width` ignore.
63
	 */
64
	if ( $attr['width'] < VIDEOPRESS_MIN_WIDTH ) {
65
		$attr['width'] = 0;
66 View Code Duplication
	} elseif ( isset( $content_width ) && $content_width > VIDEOPRESS_MIN_WIDTH && $attr['width'] > $content_width ) {
67
		$attr['width'] = 0;
68
	}
69
70
	/**
71
	 * If there was an invalid or unspecified width, set the width equal to the theme's `$content_width`.
72
	 */
73 View Code Duplication
	if ( 0 === $attr['width'] && isset( $content_width ) && $content_width >= VIDEOPRESS_MIN_WIDTH ) {
74
		$attr['width'] = $content_width;
75
	}
76
77
	/**
78
	 * If the width isn't an even number, reduce it by one (making it even).
79
	 */
80
	if ( 1 === ( $attr['width'] % 2 ) ) {
81
		$attr['width'] --;
82
	}
83
84
	/**
85
	 * Filter the default VideoPress shortcode options.
86
	 *
87
	 * @module videopress
88
	 *
89
	 * @since 2.5.0
90
	 *
91
	 * @param array $args Array of VideoPress shortcode options.
92
	 */
93
	$options = apply_filters( 'videopress_shortcode_options', array(
94
		'at'              => (int) $attr['at'],
95
		'hd'              => $attr['hd'],
96
		'loop'            => $attr['autoplay'] || $attr['loop'],
97
		'freedom'         => $attr['freedom'],
98
		'autoplay'        => $attr['autoplay'],
99
		'permalink'       => $attr['permalink'],
100
		'force_flash'     => (bool) $attr['flashonly'],
101
		'defaultlangcode' => $attr['defaultlangcode'],
102
		'forcestatic'     => false, // This used to be a displayed option, but now is only
103
		// accessible via the `videopress_shortcode_options` filter.
104
	) );
105
106
	// Register VideoPress scripts
107
	wp_register_script( 'videopress', 'https://v0.wordpress.com/js/videopress.js', array( 'jquery', 'swfobject' ), '1.09' );
108
109
	require_once( dirname( __FILE__ ) . '/class.videopress-video.php' );
110
	require_once( dirname( __FILE__ ) . '/class.videopress-player.php' );
111
112
	$player = new VideoPress_Player( $guid, $attr['width'], $options );
113
114
	if ( is_feed() ) {
115
		return $player->asXML();
116
	} else {
117
		return $player->asHTML();
118
	}
119
}
120
add_shortcode( 'videopress', 'videopress_shortcode_callback' );
121
add_shortcode( 'wpvideo',    'videopress_shortcode_callback' );
122
123
/**
124
 * By explicitly declaring the provider here, we can speed things up by not relying on oEmbed discovery.
125
 */
126
wp_oembed_add_provider( '#^https?://videopress.com/v/.*#', 'http://public-api.wordpress.com/oembed/1.0/', true );
127
128
/**
129
 * Adds a `for` query parameter to the oembed provider request URL.
130
 * @param String $oembed_provider
131
 * @return String $ehnanced_oembed_provider
132
 */
133
function videopress_add_oembed_for_parameter( $oembed_provider ) {
134
	if ( false === stripos( $oembed_provider, 'videopress.com' ) ) {
135
		return $oembed_provider;
136
	}
137
	return add_query_arg( 'for', parse_url( home_url(), PHP_URL_HOST ), $oembed_provider );
138
}
139
add_filter( 'oembed_fetch_url', 'videopress_add_oembed_for_parameter' );
140
141
/**
142
 * WordPress Shortcode Editor View JS Code
143
 */
144
function videopress_handle_editor_view_js() {
145
	global $content_width;
146
	$current_screen = get_current_screen();
147
	if ( ! isset( $current_screen->id ) || $current_screen->base !== 'post' ) {
148
		return;
149
	}
150
151
	add_action( 'admin_print_footer_scripts', 'videopress_editor_view_js_templates' );
152
153
	wp_enqueue_script( 'videopress-editor-view', plugins_url( 'js/editor-view.js', __FILE__ ), array( 'wp-util', 'jquery' ), false, true );
154
	wp_localize_script( 'videopress-editor-view', 'vpEditorView', array(
155
		'home_url_host'     => parse_url( home_url(), PHP_URL_HOST ),
156
		'min_content_width' => VIDEOPRESS_MIN_WIDTH,
157
		'content_width'     => $content_width,
158
		'modal_labels'      => array(
159
			'title'     => __( 'VideoPress Shortcode', 'jetpack' ),
160
			'guid'      => __( 'Video ID', 'jetpack' ),
161
			'w'         => __( 'Video width (in pixels)', 'jetpack' ),
162
			'at'        => __( 'Start video after (in seconds)', 'jetpack' ),
163
			'hd'        => __( 'High definition on by default', 'jetpack' ),
164
			'permalink' => __( 'Link the video title to its URL on VideoPress.com', 'jetpack' ),
165
			'autoplay'  => __( 'Autoplay video on page load', 'jetpack' ),
166
			'loop'      => __( 'Loop video playback', 'jetpack' ),
167
			'freedom'   => __( 'Use only Open Source codecs (may degrade performance)', 'jetpack' ),
168
			'flashonly' => __( 'Use legacy Flash Player (not recommended)', 'jetpack' ),
169
		)
170
	) );
171
}
172
add_action( 'admin_notices', 'videopress_handle_editor_view_js' );
173
174
/**
175
 * WordPress Editor Views
176
 */
177
function videopress_editor_view_js_templates() {
178
	/**
179
	 * This template uses the following parameters, and displays the video as an iframe:
180
	 *  - data.guid     // The guid of the video.
181
	 *  - data.width    // The width of the iframe.
182
	 *  - data.height   // The height of the iframe.
183
	 *  - data.urlargs  // Arguments serialized into a get string.
184
	 *
185
	 * In addition, the calling script will need to ensure that the following
186
	 * JS file is added to the header of the editor iframe:
187
	 *  - https://s0.wp.com/wp-content/plugins/video/assets/js/next/videopress-iframe.js
188
	 */
189
	?>
190
	<script type="text/html" id="tmpl-videopress_iframe_vnext">
191
		<div class="tmpl-videopress_iframe_next">
192
			<iframe style="display: block;" width="{{ data.width }}" height="{{ data.height }}" src="https://videopress.com/embed/{{ data.guid }}?{{ data.urlargs }}" frameborder='0' allowfullscreen></iframe>
193
		</div>
194
	</script>
195
	<?php
196
}
197