Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
82.61% covered (warning)
82.61%
38 / 46
71.43% covered (warning)
71.43%
5 / 7
CRAP
n/a
0 / 0
jetpack_shortcode_get_youtube_id
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
jetpack_get_youtube_id
80.00% covered (warning)
80.00%
12 / 15
0.00% covered (danger)
0.00%
0 / 1
7.39
jetpack_youtube_sanitize_url
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
5
wp_startswith
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
5
wp_endswith
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
5
wp_in
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
5
jetpack_sha1_base64
n/a
0 / 0
n/a
0 / 0
1
1<?php // phpcs:ignore WordPress.Files.FileName.NotHyphenatedLowercase
2/**
3 * Compatibility functions for YouTube URLs and WP.com helper functions.
4 *
5 * @package automattic/jetpack
6 */
7
8use Automattic\Jetpack\Connection\Manager as Connection_Manager;
9
10/**
11 * Required for class.media-extractor.php to match expected function naming convention.
12 *
13 * @param string|array $url Can be just the $url or the whole $atts array.
14 * @return bool|mixed The Youtube video ID via jetpack_get_youtube_id
15 */
16function jetpack_shortcode_get_youtube_id( $url ) {
17    return jetpack_get_youtube_id( $url );
18}
19
20/**
21 * Extract video ID from a YouTube url.
22 *
23 * @param string|array $url YouTube URL.
24 * @return bool|mixed The Youtube video ID
25 */
26function jetpack_get_youtube_id( $url ) {
27    // Do we have an $atts array?  Get first att
28    if ( is_array( $url ) ) {
29        $url = reset( $url );
30    }
31
32    $url = jetpack_youtube_sanitize_url( $url );
33    $url = wp_parse_url( $url );
34    $id  = false;
35
36    if ( ! isset( $url['query'] ) ) {
37        return false;
38    }
39
40    parse_str( $url['query'], $qargs );
41
42    if ( ! isset( $qargs['v'] ) && ! isset( $qargs['list'] ) ) {
43        return false;
44    }
45
46    if ( isset( $qargs['list'] ) ) {
47        $id = preg_replace( '|[^_a-z0-9-]|i', '', $qargs['list'] );
48    }
49
50    if ( empty( $id ) ) {
51        $id = preg_replace( '|[^_a-z0-9-]|i', '', $qargs['v'] );
52    }
53
54    return $id;
55}
56
57if ( ! function_exists( 'jetpack_youtube_sanitize_url' ) ) :
58    /**
59     * Normalizes a YouTube URL to include a v= parameter and a query string free of encoded ampersands.
60     *
61     * @param string|array $url YouTube URL.
62     * @return string|false The normalized URL or false if input is invalid.
63     */
64    function jetpack_youtube_sanitize_url( $url ) {
65        if ( is_array( $url ) && isset( $url['url'] ) ) {
66            $url = $url['url'];
67        }
68        if ( ! is_string( $url ) ) {
69            return false;
70        }
71
72        $url = trim( $url, ' "' );
73        $url = trim( $url );
74        $url = str_replace( array( 'youtu.be/', '/v/', '#!v=', '&amp;', '&#038;', 'playlist' ), array( 'youtu.be/?v=', '/?v=', '?v=', '&', '&', 'videoseries' ), $url );
75
76        // Replace any extra question marks with ampersands - the result of a URL like "https://www.youtube.com/v/dQw4w9WgXcQ?fs=1&hl=en_US" being passed in.
77        $query_string_start = strpos( $url, '?' );
78
79        if ( false !== $query_string_start ) {
80            $url = substr( $url, 0, $query_string_start + 1 ) . str_replace( '?', '&', substr( $url, $query_string_start + 1 ) );
81        }
82
83        return $url;
84    }
85endif;
86
87/**
88 * Merge in three string helper functions from WPCOM to make working with strings easier.
89 *
90 * @see WPCOM/wp-content/mu-plugins/string-helpers.php
91 */
92if ( ! function_exists( 'wp_startswith' ) ) :
93    /**
94     * Check whether a string starts with a specific substring.
95     *
96     * @param string $haystack String we are filtering.
97     * @param string $needle The substring we are looking for.
98     * @return bool
99     */
100    function wp_startswith( $haystack, $needle ) {
101        if ( ! $haystack || ! $needle || ! is_scalar( $haystack ) || ! is_scalar( $needle ) ) {
102            return false;
103        }
104
105        $haystack = (string) $haystack;
106        $needle   = (string) $needle;
107
108        return str_starts_with( $haystack, $needle );
109    }
110endif;
111
112if ( ! function_exists( 'wp_endswith' ) ) :
113    /**
114     * Check whether a string ends with a specific substring.
115     *
116     * @param string $haystack String we are filtering.
117     * @param string $needle The substring we are looking for.
118     * @return bool
119     */
120    function wp_endswith( $haystack, $needle ) {
121        if ( ! $haystack || ! $needle || ! is_scalar( $haystack ) || ! is_scalar( $needle ) ) {
122            return false;
123        }
124
125        $haystack = (string) $haystack;
126        $needle   = (string) $needle;
127
128        return str_ends_with( $haystack, $needle );
129    }
130endif;
131
132if ( ! function_exists( 'wp_in' ) ) :
133    /**
134     * Checks whether a string contains a specific substring.
135     *
136     * @param string $needle The substring we are looking for.
137     * @param string $haystack String we are filtering.
138     * @return bool
139     */
140    function wp_in( $needle, $haystack ) {
141        if ( ! $haystack || ! $needle || ! is_scalar( $haystack ) || ! is_scalar( $needle ) ) {
142            return false;
143        }
144
145        $haystack = (string) $haystack;
146        $needle   = (string) $needle;
147
148        return str_contains( $haystack, $needle );
149    }
150endif;
151
152/**
153 * Deprecated connection function.
154 *
155 * @param string $text Deprecated.
156 * @deprecated 7.5 Use Connection_Manager instead.
157 */
158function jetpack_sha1_base64( $text ) {
159    $connection = new Connection_Manager();
160    return $connection->sha1_base64( $text );
161}