Completed
Push — fusion-sync/danroundhill/r2061... ( 6c7cf7...0f1caf )
by Jeremy
213:37 queued 206:26
created

editor-media-view.php ➔ videopress_override_media_templates()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 47

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 47
rs 9.1563
c 0
b 0
f 0
1
<?php
2
3
use Automattic\Jetpack\Assets;
4
5
/**
6
 * WordPress Shortcode Editor View JS Code
7
 */
8
function videopress_handle_editor_view_js() {
9
	global $content_width;
10
	$current_screen = get_current_screen();
11
	if ( ! isset( $current_screen->id ) || $current_screen->base !== 'post' ) {
12
		return;
13
	}
14
15
	add_action( 'admin_print_footer_scripts', 'videopress_editor_view_js_templates' );
16
17
	wp_enqueue_style( 'videopress-editor-ui', plugins_url( 'css/editor.css', __FILE__ ) );
18
	wp_enqueue_script(
19
		'videopress-editor-view',
20
		Assets::get_file_url_for_environment(
21
			'_inc/build/videopress/js/editor-view.min.js',
22
			'modules/videopress/js/editor-view.js'
23
		),
24
		array( 'wp-util', 'jquery' ),
25
		false,
26
		true
27
	);
28
	wp_localize_script(
29
		'videopress-editor-view',
30
		'vpEditorView',
31
		array(
32
			'home_url_host'     => wp_parse_url( home_url(), PHP_URL_HOST ),
0 ignored issues
show
Unused Code introduced by
The call to wp_parse_url() has too many arguments starting with PHP_URL_HOST.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
33
			'min_content_width' => VIDEOPRESS_MIN_WIDTH,
34
			'content_width'     => $content_width,
35
			'modal_labels'      => array(
36
				'title'     => esc_html__( 'VideoPress Shortcode', 'jetpack' ),
37
				'guid'      => esc_html__( 'Video ID', 'jetpack' ),
38
				'w'         => esc_html__( 'Video Width', 'jetpack' ),
39
				'w_unit'    => esc_html__( 'pixels', 'jetpack' ),
40
				/* Translators: example of usage of this is "Start Video After 10 seconds" */
41
				'at'        => esc_html__( 'Start Video After', 'jetpack' ),
42
				'at_unit'   => esc_html__( 'seconds', 'jetpack' ),
43
				'hd'        => esc_html__( 'High definition on by default', 'jetpack' ),
44
				'permalink' => esc_html__( 'Link the video title to its URL on VideoPress.com', 'jetpack' ),
45
				'autoplay'  => esc_html__( 'Autoplay video on page load', 'jetpack' ),
46
				'loop'      => esc_html__( 'Loop video playback', 'jetpack' ),
47
				'freedom'   => esc_html__( 'Use only Open Source codecs (may degrade performance)', 'jetpack' ),
48
				'flashonly' => esc_html__( 'Use legacy Flash Player (not recommended)', 'jetpack' ),
49
			),
50
		)
51
	);
52
53
	add_editor_style( plugins_url( 'css/videopress-editor-style.css', __FILE__ ) );
54
}
55
add_action( 'admin_notices', 'videopress_handle_editor_view_js' );
56
57
/**
58
 * WordPress Editor Views
59
 */
60
function videopress_editor_view_js_templates() {
61
	/**
62
	 * This template uses the following parameters, and displays the video as an iframe:
63
	 *  - data.guid     // The guid of the video.
64
	 *  - data.width    // The width of the iframe.
65
	 *  - data.height   // The height of the iframe.
66
	 *  - data.urlargs  // Arguments serialized into a get string.
67
	 *
68
	 * In addition, the calling script will need to ensure that the following
69
	 * JS file is added to the header of the editor iframe:
70
	 *  - https://s0.wp.com/wp-content/plugins/video/assets/js/next/videopress-iframe.js
71
	 */
72
	?>
73
	<script type="text/html" id="tmpl-videopress_iframe_vnext">
74
		<div class="tmpl-videopress_iframe_next" style="max-height:{{ data.height }}px;">
75
			<div class="videopress-editor-wrapper" style="padding-top:{{ data.ratio }}%;">
76
				<iframe style="display: block;" width="{{ data.width }}" height="{{ data.height }}" src="https://videopress.com/embed/{{ data.guid }}?{{ data.urlargs }}" frameborder='0' allowfullscreen></iframe>
77
			</div>
78
		</div>
79
	</script>
80
	<?php
81
}
82
83
/*************************************************\
84
| This is the chunk that handles overriding core  |
85
| media stuff so VideoPress can display natively. |
86
\*/
87
88
/**
89
 * Media Grid:
90
 * Filter out any videopress video posters that we've downloaded,
91
 * so that they don't seem to display twice.
92
 */
93
add_filter( 'ajax_query_attachments_args', 'videopress_ajax_query_attachments_args' );
94
function videopress_ajax_query_attachments_args( $args ) {
95
	$meta_query = array(
96
		array(
97
			'key'     => 'videopress_poster_image',
98
			'compare' => 'NOT EXISTS',
99
		),
100
	);
101
102
	// If there was already a meta query, let's AND it via
103
	// nesting it with our new one. No need to specify the
104
	// relation, as it defaults to AND.
105
	if ( ! empty( $args['meta_query'] ) ) {
106
		$meta_query[] = $args['meta_query'];
107
	}
108
	$args['meta_query'] = $meta_query;
109
110
	return $args;
111
}
112
113
/**
114
 * Media List:
115
 * Do the same as ^^ but for the list view.
116
 */
117
add_action( 'pre_get_posts', 'videopress_media_list_table_query' );
118
function videopress_media_list_table_query( $query ) {
119
120
	if (
121
		! function_exists( 'get_current_screen' )
122
		|| is_null( get_current_screen() )
123
	) {
124
		return;
125
	}
126
127
	if ( is_admin() && $query->is_main_query() && ( 'upload' === get_current_screen()->id ) ) {
128
		$meta_query = array(
129
			array(
130
				'key'     => 'videopress_poster_image',
131
				'compare' => 'NOT EXISTS',
132
			),
133
		);
134
135
		if ( $old_meta_query = $query->get( 'meta_query' ) ) {
136
			$meta_query[] = $old_meta_query;
137
		}
138
139
		$query->set( 'meta_query', $meta_query );
140
	}
141
}
142
143
/**
144
 * Make sure that any Video that has a VideoPress GUID passes that data back.
145
 */
146
add_filter( 'wp_prepare_attachment_for_js', 'videopress_prepare_attachment_for_js' );
147
function videopress_prepare_attachment_for_js( $post ) {
148
	if ( 'video' === $post['type'] ) {
149
		$guid = get_post_meta( $post['id'], 'videopress_guid' );
150
		if ( $guid ) {
151
			$post['videopress_guid'] = $guid;
152
		}
153
	}
154
	return $post;
155
}
156
157
/**
158
 * Wherever the Media Modal is deployed, also deploy our overrides.
159
 */
160
add_action( 'wp_enqueue_media', 'add_videopress_media_overrides' );
161
function add_videopress_media_overrides() {
162
	add_action( 'admin_print_footer_scripts', 'videopress_override_media_templates', 11 );
163
}
164
165
/**
166
 * Our video overrides!
167
 *
168
 * We have a template for the iframe to get injected.
169
 */
170
function videopress_override_media_templates() {
171
	?>
172
	<script type="text/html" id="tmpl-videopress_iframe_vnext">
173
		<iframe style="display: block; max-width: 100%;" width="{{ data.width }}" height="{{ data.height }}" src="https://videopress.com/embed/{{ data.guid }}?{{ data.urlargs }}" frameborder='0' allowfullscreen></iframe>
174
	</script>
175
	<script>
176
		(function( media ){
177
			// This handles the media library modal attachment details display.
178
			if ( 'undefined' !== typeof media.view.Attachment.Details.TwoColumn ) {
179
				var TwoColumn   = media.view.Attachment.Details.TwoColumn,
180
					old_render  = TwoColumn.prototype.render,
181
					vp_template = wp.template('videopress_iframe_vnext');
182
183
				TwoColumn.prototype.render = function() {
184
					// Have the original renderer run first.
185
					old_render.apply( this, arguments );
186
187
					// Now our stuff!
188
					if ( 'video' === this.model.get('type') ) {
189
						if ( this.model.get('videopress_guid') ) {
190
							this.$('.attachment-media-view .thumbnail-video').html( vp_template( {
191
								guid   : this.model.get('videopress_guid'),
192
								width  : this.model.get('width'),
193
								height : this.model.get('height')
194
							}));
195
						}
196
					}
197
				};
198
			} else { /* console.log( 'media.view.Attachment.Details.TwoColumn undefined' ); */ }
199
200
			// This handles the recreating of the core video shortcode when editing the mce embed.
201
			if ( 'undefined' !== typeof media.video ) {
202
				media.video.defaults.videopress_guid = '';
203
204
				// For some reason, even though we're not currently changing anything, the following proxy
205
				// function is necessary to include the above default `videopress_guid` param. ¯\_(ツ)_/¯
206
				var old_video_shortcode = media.video.shortcode;
207
				media.video.shortcode = function( model ) {
208
					// model.videopress_guid = 'FOOBAR';
209
					return old_video_shortcode( model );
210
				};
211
			} else { /* console.log( 'media.video undefined' ); */ }
212
213
		})( wp.media );
214
	</script>
215
	<?php
216
}
217
218
/**
219
 * Properly inject VideoPress data into Core shortcodes, and
220
 * generate videopress shortcodes for purely remote videos.
221
 */
222
add_filter( 'media_send_to_editor', 'videopress_media_send_to_editor', 10, 3 );
223
function videopress_media_send_to_editor( $html, $id, $attachment ) {
224
	$videopress_guid = get_post_meta( $id, 'videopress_guid', true );
225
	if ( $videopress_guid && videopress_is_valid_guid( $videopress_guid ) ) {
226
		if ( '[video ' === substr( $html, 0, 7 ) ) {
227
			$html = sprintf( '[videopress %1$s]', esc_attr( $videopress_guid ) );
228
229
		} elseif ( '<a href=' === substr( $html, 0, 8 ) ) {
230
			// We got here because `wp_attachment_is()` returned false for
231
			// video, because there isn't a local copy of the file.
232
			$html = sprintf( '[videopress %1$s]', esc_attr( $videopress_guid ) );
233
		}
234
	} elseif ( videopress_is_attachment_without_guid( $id ) ) {
235
		$html = sprintf( '[videopress postid=%d]', $id );
236
	}
237
	return $html;
238
}
239