/var/www/html_us/wp-content/plugins/elementor/includes/embed.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
<?php
namespace Elementor;

if ( ! 
defined'ABSPATH' ) ) {
    exit; 
// Exit if accessed directly.
}

/**
 * Elementor embed.
 *
 * Elementor embed handler class is responsible for Elementor embed functionality.
 * The class holds the supported providers with their embed patters, and handles
 * their custom properties to create custom HTML with the embedded content.
 *
 * @since 1.5.0
 */
class Embed {

    
/**
     * Provider match masks.
     *
     * Holds a list of supported providers with their URL structure in a regex format.
     *
     * @since 1.5.0
     * @access private
     * @static
     *
     * @var array Provider URL structure regex.
     */
    
private static $provider_match_masks = [
        
'youtube' => '/^.*(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"\'>]+)/',
        
'vimeo' => '/^.*vimeo\.com\/(?:[a-z]*\/)*([‌​0-9]{6,11})[?]?.*/',
        
'dailymotion' => '/^.*dailymotion.com\/(?:video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/',
        
'videopress' => [
            
'/^(?:http(?:s)?:\/\/)?videos\.files\.wordpress\.com\/([a-zA-Z\d]{8,})\//i',
            
'/^(?:http(?:s)?:\/\/)?(?:www\.)?video(?:\.word)?press\.com\/(?:v|embed)\/([a-zA-Z\d]{8,})(.+)?/i',
        ],
    ];

    
/**
     * Embed patterns.
     *
     * Holds a list of supported providers with their embed patters.
     *
     * @since 1.5.0
     * @access private
     * @static
     *
     * @var array Embed patters.
     */
    
private static $embed_patterns = [
        
'youtube' => 'https://www.youtube{NO_COOKIE}.com/embed/{VIDEO_ID}?feature=oembed',
        
'vimeo' => 'https://player.vimeo.com/video/{VIDEO_ID}#t={TIME}',
        
'dailymotion' => 'https://dailymotion.com/embed/video/{VIDEO_ID}',
        
'videopress' => 'https://videopress.com/embed/{VIDEO_ID}',
    ];

    
/**
     * Get video properties.
     *
     * Retrieve the video properties for a given video URL.
     *
     * @since 1.5.0
     * @access public
     * @static
     *
     * @param string $video_url Video URL.
     *
     * @return null|array The video properties, or null.
     */
    
public static function get_video_properties$video_url ) {
        foreach ( 
self::$provider_match_masks as $provider => $match_mask ) {
            if ( ! 
is_array$match_mask ) ) {
                
$match_mask = [ $match_mask ];
            }

            foreach ( 
$match_mask as $mask ) {
                if ( 
preg_match$mask$video_url$matches ) ) {
                    return [
                        
'provider' => $provider,
                        
'video_id' => $matches[1],
                    ];
                }
            }
        }

        return 
null;
    }

    
/**
     * Get embed URL.
     *
     * Retrieve the embed URL for a given video.
     *
     * @since 1.5.0
     * @access public
     * @static
     *
     * @param string $video_url        Video URL.
     * @param array  $embed_url_params Optional. Embed parameters. Default is an
     *                                 empty array.
     * @param array  $options          Optional. Embed options. Default is an
     *                                 empty array.
     *
     * @return null|array The video properties, or null.
     */
    
public static function get_embed_url$video_url, array $embed_url_params = [], array $options = [] ) {
        
$video_properties self::get_video_properties$video_url );

        if ( ! 
$video_properties ) {
            return 
null;
        }

        
$embed_pattern self::$embed_patterns$video_properties['provider'] ];

        
$replacements = [
            
'{VIDEO_ID}' => $video_properties['video_id'],
        ];

        if ( 
'youtube' === $video_properties['provider'] ) {
            
$replacements['{NO_COOKIE}'] = ! empty( $options['privacy'] ) ? '-nocookie' '';
        } elseif ( 
'vimeo' === $video_properties['provider'] ) {
            
$time_text '';

            if ( ! empty( 
$options['start'] ) ) {
                
$time_text date'H\hi\ms\s'$options['start'] ); // PHPCS:Ignore WordPress.DateTime.RestrictedFunctions.date_date
            
}

            
$replacements['{TIME}'] = $time_text;

            
/**
             * Handle Vimeo private videos
             *
             * Vimeo requires an additional parameter when displaying private/unlisted videos. It has two ways of
             * passing that parameter:
             * * as an endpoint - vimeo.com/{video_id}/{privacy_token}
             * OR
             * * as a GET parameter named `h` - vimeo.com/{video_id}?h={privacy_token}
             *
             * The following regex match looks for either of these methods in the Vimeo URL, and if it finds a privacy
             * token, it adds it to the embed params array as the `h` parameter (which is how Vimeo can receive it when
             * using Oembed).
             */
            
$h_param = [];
            
preg_match'/(?|(?:[\?|\&]h={1})([\w]+)|\d\/([\w]+))/'$video_url$h_param );

            if ( ! empty( 
$h_param ) ) {
                
$embed_url_params['h'] = $h_param[1];
            }
        }

        
$embed_pattern str_replacearray_keys$replacements ), $replacements$embed_pattern );

        return 
add_query_arg$embed_url_params$embed_pattern );
    }

    
/**
     * Get embed HTML.
     *
     * Retrieve the final HTML of the embedded URL.
     *
     * @since 1.5.0
     * @access public
     * @static
     *
     * @param string $video_url        Video URL.
     * @param array  $embed_url_params Optional. Embed parameters. Default is an
     *                                 empty array.
     * @param array  $options          Optional. Embed options. Default is an
     *                                 empty array.
     * @param array  $frame_attributes Optional. IFrame attributes. Default is an
     *                                 empty array.
     *
     * @return string The embed HTML.
     */
    
public static function get_embed_html$video_url, array $embed_url_params = [], array $options = [], array $frame_attributes = [] ) {
        
$video_properties self::get_video_properties$video_url );

        
$default_frame_attributes = [
            
'class' => 'elementor-video-iframe',
            
'allowfullscreen',
            
'allow' => 'clipboard-write',
            
'title' => sprintf(
                
/* translators: %s: Video provider */
                
__'%s Video Player''elementor' ),
                
$video_properties['provider']
            ),
        ];

        
$video_embed_url self::get_embed_url$video_url$embed_url_params$options );
        if ( ! 
$video_embed_url ) {
            return 
null;
        }
        if ( ! isset( 
$options['lazy_load'] ) || ! $options['lazy_load'] ) {
            
$default_frame_attributes['src'] = $video_embed_url;
        } else {
            
$default_frame_attributes['data-lazy-load'] = $video_embed_url;
        }

        if ( isset( 
$embed_url_params['autoplay'] ) ) {
            
$default_frame_attributes['allow'] = 'autoplay';
        }

        
$frame_attributes array_merge$default_frame_attributes$frame_attributes );

        
$attributes_for_print = [];

        foreach ( 
$frame_attributes as $attribute_key => $attribute_value ) {
            
$attribute_value esc_attr$attribute_value );

            if ( 
is_numeric$attribute_key ) ) {
                
$attributes_for_print[] = $attribute_value;
            } else {
                
$attributes_for_print[] = sprintf'%1$s="%2$s"'$attribute_key$attribute_value );
            }
        }

        
$attributes_for_print implode' '$attributes_for_print );

        
$iframe_html "<iframe $attributes_for_print></iframe>";

        
/** This filter is documented in wp-includes/class-oembed.php */
        
return apply_filters'oembed_result'$iframe_html$video_url$frame_attributes );
    }

    
/**
     * Get oembed data from the cache.
     * if not exists in the cache it will fetch from provider and then save to the cache.
     *
     * @param $oembed_url
     * @param $cached_post_id
     *
     * @return array|null
     */
    
public static function get_oembed_data$oembed_url$cached_post_id ) {
        
$cached_oembed_data json_decodeget_post_meta$cached_post_id'_elementor_oembed_cache'true ), true );

        if ( isset( 
$cached_oembed_data$oembed_url ] ) ) {
            return 
$cached_oembed_data$oembed_url ];
        }

        
$normalize_oembed_data self::fetch_oembed_data$oembed_url );

        if ( ! 
$cached_oembed_data ) {
            
$cached_oembed_data = [];
        }

        
update_post_meta$cached_post_id'_elementor_oembed_cache'wp_json_encodearray_merge(
            
$cached_oembed_data,
            [
                
$oembed_url => $normalize_oembed_data,
            ]
        ) ) );

        return 
$normalize_oembed_data;
    }

    
/**
     * Fetch oembed data from oembed provider.
     *
     * @param $oembed_url
     *
     * @return array|null
     */
    
public static function fetch_oembed_data$oembed_url ) {
        
$oembed_data _wp_oembed_get_object()->get_data$oembed_url );

        if ( ! 
$oembed_data ) {
            return 
null;
        }

        return [
            
'thumbnail_url' => $oembed_data->thumbnail_url,
            
'title' => $oembed_data->title,
        ];
    }

    
/**
     * @param $oembed_url
     * @param null|string|int $cached_post_id
     *
     * @return string|null
     */
    
public static function get_embed_thumbnail_html$oembed_url$cached_post_id null ) {
        
$oembed_data self::get_oembed_data$oembed_url$cached_post_id );

        if ( ! 
$oembed_data ) {
            return 
null;
        }

        return 
'<div class="elementor-image">' sprintf'<img src="%1$s" alt="%2$s" title="%2$s" width="%3$s" loading="lazy" />'$oembed_data['thumbnail_url'], esc_attr$oembed_data['title'] ), '100%' ) . '</div>';
    }
}