css
8 years ago
js
6 years ago
class.jetpack-videopress.php
6 years ago
class.videopress-ajax.php
6 years ago
class.videopress-cli.php
7 years ago
class.videopress-edit-attachment.php
6 years ago
class.videopress-gutenberg.php
6 years ago
class.videopress-options.php
7 years ago
class.videopress-player.php
6 years ago
class.videopress-scheduler.php
7 years ago
class.videopress-video.php
6 years ago
class.videopress-xmlrpc.php
7 years ago
editor-media-view.php
6 years ago
shortcode.php
6 years ago
utility-functions.php
6 years ago
videopress-admin-rtl.css
7 years ago
videopress-admin-rtl.min.css
7 years ago
videopress-admin.css
9 years ago
videopress-admin.min.css
7 years ago
editor-media-view.php
239 lines
| 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 ), |
| 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 |