Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 4
100.00% covered (success)
100.00%
4 / 4
CRAP
n/a
0 / 0
jetpack_responsive_videos_init
n/a
0 / 0
n/a
0 / 0
3
jetpack_responsive_videos_embed_html
n/a
0 / 0
n/a
0 / 0
6
jetpack_responsive_videos_maybe_wrap_oembed
n/a
0 / 0
n/a
0 / 0
9
jetpack_responsive_videos_remove_wrap_oembed
n/a
0 / 0
n/a
0 / 0
4
1<?php
2/**
3 * Theme Tools: Responsive videos enhancements.
4 *
5 * @package automattic/jetpack
6 */
7
8use Automattic\Jetpack\Assets;
9
10if ( ! defined( 'ABSPATH' ) ) {
11    exit( 0 );
12}
13
14if ( ! class_exists( '\Automattic\Jetpack\Classic_Theme_Helper\Main' ) ) {
15        /**
16         * Load the Responsive videos plugin
17         *
18         * @deprecated 13.7 Moved to Classic Theme Helper package.
19         */
20    function jetpack_responsive_videos_init() {
21        _deprecated_function( __FUNCTION__, 'jetpack-13.7' );
22
23        /* If the doesn't theme support 'jetpack-responsive-videos', don't continue */
24        if ( ! current_theme_supports( 'jetpack-responsive-videos' ) ) {
25            return;
26        }
27
28        /* If the theme does support 'jetpack-responsive-videos', wrap the videos */
29        add_filter( 'wp_video_shortcode', 'jetpack_responsive_videos_embed_html' );
30        add_filter( 'video_embed_html', 'jetpack_responsive_videos_embed_html' );
31
32        /* Only wrap oEmbeds if video */
33        add_filter( 'embed_oembed_html', 'jetpack_responsive_videos_maybe_wrap_oembed', 10, 2 );
34        add_filter( 'embed_handler_html', 'jetpack_responsive_videos_maybe_wrap_oembed', 10, 2 );
35
36        /* Wrap videos in Buddypress */
37        add_filter( 'bp_embed_oembed_html', 'jetpack_responsive_videos_embed_html' );
38
39        /* Wrap Slideshare shortcodes */
40        add_filter( 'jetpack_slideshare_shortcode', 'jetpack_responsive_videos_embed_html' );
41
42        // Remove the Jetpack Responsive video wrapper in embed blocks on sites that support core Responsive embeds.
43        if ( current_theme_supports( 'responsive-embeds' ) ) {
44            add_filter( 'render_block', 'jetpack_responsive_videos_remove_wrap_oembed', 10, 2 );
45        }
46    }
47    add_action( 'after_setup_theme', 'jetpack_responsive_videos_init', 99 );
48
49    /**
50     * Adds a wrapper to videos and enqueue script
51     *
52     * @deprecated 13.7 Moved to Classic Theme Helper package.
53     *
54     * @param string $html The video embed HTML.
55     * @return string
56     */
57    function jetpack_responsive_videos_embed_html( $html ) {
58        _deprecated_function( __FUNCTION__, 'jetpack-13.7' );
59
60        if ( empty( $html ) || ! is_string( $html ) ) {
61            return $html;
62        }
63
64        // Short-circuit for AMP responses, since custom scripts are not allowed in AMP and videos are naturally responsive.
65        if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
66            return $html;
67        }
68
69        // The customizer video widget wraps videos with a class of wp-video
70        // mejs as of 4.9 apparently resizes videos too which causes issues
71        // skip the video if it is wrapped in wp-video.
72        $video_widget_wrapper = 'class="wp-video"';
73
74        $mejs_wrapped = strpos( $html, $video_widget_wrapper );
75
76        // If this is a video widget wrapped by mejs, return the html.
77        if ( false !== $mejs_wrapped ) {
78            return $html;
79        }
80
81        Assets::register_script(
82            'jetpack-responsive-videos',
83            '_inc/build/theme-tools/responsive-videos/responsive-videos.min.js',
84            JETPACK__PLUGIN_FILE,
85            array(
86                'in_footer'  => true,
87                'enqueue'    => true,
88                'textdomain' => 'jetpack',
89                'css_path'   => '_inc/build/theme-tools/responsive-videos/responsive-videos.css',
90            )
91        );
92
93        return '<div class="jetpack-video-wrapper">' . $html . '</div>';
94    }
95
96    /**
97     * Check if oEmbed is a `$video_patterns` provider video before wrapping.
98     *
99     * @deprecated 13.7 Moved to Classic Theme Helper package.
100     *
101     * @param mixed  $html The cached HTML result, stored in post meta.
102     * @param string $url  he attempted embed URL.
103     *
104     * @return string
105     */
106    function jetpack_responsive_videos_maybe_wrap_oembed( $html, $url = null ) {
107        _deprecated_function( __FUNCTION__, 'jetpack-13.7' );
108
109        if ( empty( $html ) || ! is_string( $html ) || ! $url ) {
110            return $html;
111        }
112
113        // Short-circuit for AMP responses, since custom scripts are not allowed in AMP and videos are naturally responsive.
114        if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
115            return $html;
116        }
117
118        $jetpack_video_wrapper = '<div class="jetpack-video-wrapper">';
119
120        $already_wrapped = strpos( $html, $jetpack_video_wrapper );
121
122        // If the oEmbed has already been wrapped, return the html.
123        if ( false !== $already_wrapped ) {
124            return $html;
125        }
126
127        /**
128         * The oEmbed video providers.
129         *
130         * An allowed list of oEmbed video provider Regex patterns to check against before wrapping the output.
131         *
132         * @module theme-tools
133         *
134         * @since 3.8.0
135         *
136         * @param array $video_patterns oEmbed video provider Regex patterns.
137         */
138        $video_patterns = apply_filters(
139            'jetpack_responsive_videos_oembed_videos',
140            array(
141                'https?://((m|www)\.)?youtube\.com/watch',
142                'https?://((m|www)\.)?youtube\.com/playlist',
143                'https?://youtu\.be/',
144                'https?://(.+\.)?vimeo\.com/',
145                'https?://(www\.)?dailymotion\.com/',
146                'https?://dai.ly/',
147                'https?://(www\.)?hulu\.com/watch/',
148                'https?://wordpress.tv/',
149                'https?://(www\.)?funnyordie\.com/videos/',
150                'https?://vine.co/v/',
151                'https?://(www\.)?collegehumor\.com/video/',
152                'https?://(www\.|embed\.)?ted\.com/talks/',
153            )
154        );
155
156        // Merge patterns to run in a single preg_match call.
157        $video_patterns = '(' . implode( '|', $video_patterns ) . ')';
158
159        $is_video = preg_match( $video_patterns, $url );
160
161        // If the oEmbed is a video, wrap it in the responsive wrapper.
162        if ( false === $already_wrapped && 1 === $is_video ) {
163            return jetpack_responsive_videos_embed_html( $html );
164        }
165
166        return $html;
167    }
168
169    /**
170     * Remove the Jetpack Responsive video wrapper in embed blocks.
171     *
172     * @since 7.0.0
173     *
174     * @deprecated 13.7 Moved to Classic Theme Helper package.
175     *
176     * @param string $block_content The block content about to be appended.
177     * @param array  $block         The full block, including name and attributes.
178     *
179     * @return string $block_content String of rendered HTML.
180     */
181    function jetpack_responsive_videos_remove_wrap_oembed( $block_content, $block ) {
182        _deprecated_function( __FUNCTION__, 'jetpack-13.7' );
183
184        if (
185            isset( $block['blockName'] )
186            && (
187                str_contains( $block['blockName'], 'core-embed' ) // pre-WP 5.6 embeds (multiple embed blocks starting with 'core-embed').
188                || 'core/embed' === $block['blockName'] // WP 5.6 embed block format (single embed block w/ block variations).
189            )
190        ) {
191            $block_content = preg_replace( '#<div class="jetpack-video-wrapper">(.*?)</div>#', '${1}', $block_content );
192        }
193
194        return $block_content;
195    }
196}