PluginProbe
WpStream – Live Streaming, Video on Demand, Pay Per View / 4.12.3
WpStream – Live Streaming, Video on Demand, Pay Per View v4.12.3
4.14.1 4.14.0 4.13.2 4.13.1 4.13 4.12.5 4.12.4 4.12.3 4.12.2 4.12.1 4.12 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5 4.5.1 4.5.11 4.5.11.1 4.5.11.2 4.5.11.4 4.5.11.5 4.5.11.6 All 181 releases
wpstream / admin / class-wpstream-admin.php

class-wpstream-admin.php in WpStream – Live Streaming, Video on Demand, Pay Per View 4.12.3, at admin/class-wpstream-admin.php

4,488 lines 227.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The admin-specific functionality of the plugin.
5 *
6 * @link http://wpstream.net
7 * @since 3.0.1
8 *
9 * @package Wpstream
10 * @subpackage Wpstream/admin
11 */
12
13 /**
14 * The admin-specific functionality of the plugin.
15 *
16 * Defines the plugin name, version, and two examples hooks for how to
17 * enqueue the admin-specific stylesheet and JavaScript.
18 *
19 * @package Wpstream
20 * @subpackage Wpstream/admin
21 * @author wpstream <office@wpstream.net>
22 */
23 class Wpstream_Admin {
24
25
26 /**
27 * Store plugin main class to allow public access.
28 *
29 * @since 20180622
30 * @var object The main class.
31 */
32 public $main;
33
34
35 /**
36 * The ID of this plugin.
37 *
38 * @since 3.0.1
39 * @access private
40 * @var string $plugin_name The ID of this plugin.
41 */
42 private $plugin_name;
43
44 /**
45 * The version of this plugin.
46 *
47 * @since 3.0.1
48 * @access private
49 * @var string $version The current version of this plugin.
50 */
51 private $version;
52
53 /**
54 * Initialize the class and set its properties.
55 *
56 * @since 3.0.1
57 * @param string $plugin_name The name of this plugin.
58 * @param string $version The version of this plugin.
59 */
60
61 public $global_event_options ;
62
63
64
65
66
67 public function __construct( $plugin_name, $version,$plugin_main ) {
68
69 $this->plugin_name = $plugin_name;
70 $this->version = $version;
71 $this->main = $plugin_main;
72
73 add_action('init', array($this, 'load_global_event_options'));
74 }
75
76 public function load_global_event_options() {
77 $this->global_event_options = array(
78 'record' => array(
79 'name' => esc_html__('Record Live Stream','wpstream'),
80 'details' => esc_html__('If enabled, live streams will be recorded and saved to your library.','wpstream'),
81 'defaults' => 'no',
82 ),
83 'view_count' => array(
84 'name' => esc_html__('Display Viewer Count','wpstream'),
85 'details' => esc_html__('If enabled, the live viewer count will show up in the player.','wpstream'),
86 'defaults' => 'yes',
87 ),
88 'domain_lock' => array(
89 'name' => esc_html__('Lock To Website','wpstream'),
90 'details' => sprintf ( esc_html__('If enabled, live video will only display on %1$s, otherwise it can show up on any website.','wpstream'),get_bloginfo('wpurl') ),
91 'defaults' => 'no',
92 ),
93 'autoplay' => array(
94 'name' => esc_html__('Autoplay','wpstream'),
95 'details' => esc_html__('If enabled, live video will attempt to start playing automatically. This is only achievable in some browsers.','wpstream'),
96 'defaults' => 'yes',
97 ),
98 'mute' => array(
99 'name' => esc_html__('Start Muted','wpstream'),
100 'details' => esc_html__('If enabled, live video will start muted. This may increase the rate of autoplay in some browsers. ','wpstream'),
101 'defaults' => 'no',
102 ),
103 'low_latency' => array(
104 'name' => esc_html__('Low Latency (beta)','wpstream'),
105 'details' => esc_html__('Shortens the live delay between streamer and viewers. Useful for interactive applications like gaming, auctions, trading etc. Low latency may worsen the viewer experience on some devices.','wpstream'),
106 'defaults' => 'no',
107 ),
108 'adaptive_bitrate' => array(
109 'name' => esc_html__('Adaptive Bitrate (beta)','wpstream'),
110 'details' => esc_html__('Ensures a smooth and uninterrupted viewing experience by adjusting video quality for viewers with reduced network speed or device capabilities.','wpstream'),
111 'defaults' => 'no',
112 ),
113 'encrypt' =>array(
114 'name' => esc_html__('Encrypt Live Stream','wpstream'),
115 'details' => esc_html__('If enabled, video data will be encrypted. Enabling encryption may lead to reduced website performance under certain configurations. Encrypted video may not display in all browsers.','wpstream'),
116 'defaults' => 'no',
117 ),
118 'ses_encrypt'=>array(
119 'name' => esc_html__('Use Sessions with Encryption','wpstream'),
120 'details' => esc_html__('If enabled, encryption key distribution will be checked against valid user sessions. Setting may malfunction or lead to reduced website performance under certain configurations. ','wpstream'),
121 'defaults' => 'no',
122 ),
123 'autostart' =>array(
124 'name' => esc_html__('Auto TURN ON','wpstream'),
125 'details' => esc_html__('If enabled, channel will TURN ON automatically when broadcasting with an External Streaming App (RTMP Encoder/Broadcaster)','wpstream'),
126 'defaults' => 'no',
127 ),
128 );
129 }
130
131 /**
132 * Register the stylesheets for the admin area.
133 *
134 * @since 3.0.1
135 */
136 public function enqueue_styles() {
137
138 /**
139 * This function is provided for demonstration purposes only.
140 *
141 * An instance of this class should be passed to the run() function
142 * defined in Wpstream_Loader as all of the hooks are defined
143 * in that particular class.
144 *
145 * The Wpstream_Loader will then create the relationship
146 * between the defined hooks and the functions defined in this
147 * class.
148 */
149 wp_enqueue_style( 'wpstream-roboto', "https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700,900&display=swap&subset=latin-ext" );
150 wp_enqueue_style(
151 $this->plugin_name,
152 plugin_dir_url( __FILE__ ) . 'css/wpstream-admin.css',
153 array(),
154 filemtime(plugin_dir_path(__FILE__) . 'css/wpstream-admin.css' ),
155 'all'
156 );
157
158 wp_enqueue_style(
159 'wpstream-on-boarding-css',
160 plugin_dir_url( __FILE__ ) . 'css/wpstream-admin-onboarding.css',
161 array(),
162 filemtime(plugin_dir_path(__FILE__) . 'css/wpstream-admin-onboarding.css'),
163 );
164
165 if (!did_action('wp_enqueue_media')) {
166 wp_enqueue_media();
167 }
168 }
169
170 /**
171 * Register the JavaScript for the admin area.
172 *
173 * @since 3.0.1
174 */
175 public function enqueue_scripts() {
176
177 wp_enqueue_script("jquery-ui-slider");
178 wp_enqueue_script("jquery-ui-datepicker");
179 wp_enqueue_script('jquery.fileupload', plugin_dir_url( __FILE__ ) .'js/jquery.fileupload.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
180
181 wp_enqueue_script( 'wpstream-admin-utils', plugin_dir_url( __FILE__ ) .'js/utils/admin_utils.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
182 wp_enqueue_script('wpstream-admin-control', plugin_dir_url( __FILE__ ) .'js/admin_control.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
183 wp_localize_script('wpstream-admin-control', 'wpstream_admin_control_vars',
184 array(
185 'admin_url' => get_admin_url(),
186 'multipart_upload_nonce' => wp_create_nonce( 'wpstream_multipart_upload_nonce' ),
187 'loading_url' => WPSTREAM_PLUGIN_DIR_URL.'/img/loading.gif',
188 'download_mess' => esc_html__('Click to download!','wpstream'),
189 'uploading' => esc_html__('We are uploading your file. Do not close this window!','wpstream'),
190 'upload_complete2' => esc_html__('Upload Complete! You can upload another file!','wpstream'),
191 'not_accepted' => esc_html__('The file is not an accepted video format','wpstream'),
192 'upload_complete' => esc_html__('Upload Complete!','wpstream'),
193 'no_band' => esc_html__('Not enough streaming data.','wpsteam'),
194 'no_band_no_store' => esc_html__('Not enough streaming data or storage.','wpsteam'),
195 'exceeding_limit' => esc_html__('File size exceeds 5GB. Initiating multipart upload...','wpsteam'),
196 'upload_failed' => esc_html__('Upload Failed!','wpstream'),
197 'upload_failed2' => esc_html__('Upload Failed! Please Try again!','wpstream'),
198 'choose_a_file' => esc_html__('Choose a file&hellip;','wpstream'),
199 'preparing_multipart' => esc_html__('Preparing multipart upload...','wpstream'),
200 'uploading_part' => esc_html__('Uploading part {part} of {total}...','wpstream'),
201 'upload_failed_part' => esc_html__('Failed to upload part {part}. Please try again.','wpstream'),
202 'completing_upload' => esc_html__('Completing upload. Please wait...','wpstream'),
203 'upload_failed_part_retry' => esc_html__('Failed to upload part {part}. Retrying...','wpstream'),
204 'choose_recording' => esc_html__( 'Choose Recording', 'wpstream' ),
205 'select_recording' => esc_html__( 'Please select a recording from the list', 'wpstream' ),
206 'invalid_response' => esc_html__('Invalid response from server. Missing required upload data.', 'wpstream'),
207 'video_processing' => esc_html__( 'The video is still processing', 'wpstream' ),
208 'file_name_text' => esc_html__('File Name:','wpstream'),
209 'channel_create_error' => esc_html__('Something did not work. Please try again.', 'wpstream'),
210 'select_caption_file' => esc_html__('Select .vtt Captions File', 'wpstream'),
211 'select_button' => esc_html__('Select', 'wpstream'),
212 'remove_button' => esc_html__('Remove', 'wpstream'),
213 ));
214
215 wp_enqueue_script('wpstream-recordings-videos-list', plugin_dir_url( __FILE__ ) .'js/recordings_videos_list.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
216 wp_localize_script( 'wpstream-recordings-videos-list', 'wpstream_recordings_videos_list_vars',
217 array(
218 'delete_file' => esc_html__('Delete file', 'wpstream'),
219 'download' => esc_html__( 'Download', 'wpstream'),
220 'download_available' => esc_html__( 'Click to download! The url will work for the next 20 minutes!', 'wpstream'),
221 'add_free_video_url' => esc_url( admin_url( 'post-new.php?post_type=wpstream_product_vod') . '&new_video_name=' ),
222 'create_ftv_vod' => esc_html__( 'Create new Free-To-View VOD from this recording' , 'wpstream' ),
223 'woocommerce_exists' => class_exists( 'WooCommerce' ),
224 'add_paid_video_url' => esc_url( admin_url( 'post-new.php?post_type=product').'&new_video_name=' ),
225 'create_ptv_vod' => esc_html__( 'Create new Pay-Per-View VOD from this recording' , 'wpstream' ),
226 )
227 );
228
229 $modified_start_streaming_file_time = gmdate( 'YmdHi', filemtime( WPSTREAM_PLUGIN_PATH . 'public/js/start_streaming.js' ) );
230 wp_enqueue_script('wpstream-start-streaming_admin', plugin_dir_url( __DIR__ ) .'public/js/start_streaming.js', array(), $modified_start_streaming_file_time, true);
231 wp_localize_script('wpstream-start-streaming_admin', 'wpstream_start_streaming_vars',
232 array(
233 'admin_url' => get_admin_url(),
234 'loading_url' => WPSTREAM_PLUGIN_DIR_URL.'/img/loading.gif',
235 'download_mess' => esc_html__('Click to download!','wpstream'),
236 'uploading' => esc_html('We are uploading your file.Do not close this window!','wpstream'),
237 'upload_complete2' => esc_html('Upload Complete! You can upload another file!','wpstream'),
238 'not_accepted' => esc_html('The file is not an accepted video format','wpstream'),
239 'upload_complete' => esc_html('Upload Complete!','wpstream'),
240 'no_band' => esc_html('Not enough streaming data.','wpsteam'),
241 'no_band_no_store' => esc_html('Not enough streaming data or storage.','wpsteam'),
242
243 'start_streaming_action'=> esc_html__('TURNING ON','wpstream'),
244 'stop_streaming_action' => esc_html__('TURNING OFF','wpstream'),
245 'start_streaming' => esc_html__('TURN ON','wpstream'),
246 'stop_streaming' => esc_html__('TURN OFF','wpstream'),
247 'failed_fetching' => esc_html__('Failed to get channel info. Please try again.','wpstream'),
248 'turned_on_tooltip' => esc_html__('Channel is now OFF. Click to turn ON.','wpstream'),
249 'turned_off_tooltip' => esc_html__('Click to turn channel off. This will interrupt any ongoing broadcast.','wpstream'),
250 'turning_on_tooltip' => esc_html__('Turning a channel on may take 1-2 minutes or more. Please be patient.','wpstream'),
251 'turning_off_tooltip' => esc_html__('This may take a few minutes.','wpstream'),
252 'error1' => esc_html__('You don\'t have enough data to start a new event!','wpstream'),
253 'failed_event_creation' => esc_html__('Failed to start the channel. Please try again in a few minutes.','wpstream'),
254 'channel_turning_on' => esc_html__('Channel is turning on','wpstream'),
255 'channel_turning_off' => esc_html__('Channel is turning off','wpstream'),
256 'channel_on' => esc_html__('Channel is ON','wpstream'),
257 'channel_off' => esc_html__('Channel is OFF','wpstream'),
258 'turn_off_confirm' => esc_html__(
259 'ARE YOU SURE you\'d like to TURN OFF the channel now? ' . PHP_EOL . PHP_EOL .
260 '- Channels TURN OFF automatically after 1 hour of inactivity (no active broadcast).' . PHP_EOL .
261 '- Manual TURN OFF is only useful if you require to change the channel settings immediately.' . PHP_EOL .
262 '- If your channel is configured with Auto TURN ON, it will turn back on as soon as there is a broadcast.',
263 'wpstream'
264 ),
265 'basic_streaming_warning' => esc_html__(
266 'Your account is now in BASIC STREAMING mode.' . PHP_EOL . PHP_EOL .
267 'Instead of offloading to the WpStream Cloud, this mode relies on WordPress and hosting resources to process and deliver video. In some WP environments, streaming may be unreliable.' . PHP_EOL .
268 'Certain features, such as recording, viewer count, browser broadcasting, and content protection are unavailable.' . PHP_EOL . PHP_EOL .
269 '- To take advantage of all features, please choose Cancel and upgrade your plan.' . PHP_EOL .
270 '- Otherwise, choose OK to start your channel with these limitations.' . PHP_EOL . PHP_EOL .
271 'ARE YOU SURE you want to continue with Basic Streaming?',
272 'wpstream'
273 ),
274 'broadcaster_url' => esc_url( esc_url(home_url('/broadcaster-page/') ) ),
275 'is_onboarding' => isset($_GET['onboard']) && $_GET['onboard'] === 'yes' ? 'yes' : 'no',
276 ));
277
278 wp_enqueue_script('wpstream-settings', plugin_dir_url( __DIR__ ) .'/admin/js/wpstream_settings.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
279 wp_localize_script('wpstream-settings', 'wpstream_settings_vars', array(
280 'error_message' => esc_html__( 'Failed to save settings. Please try again.', 'wpstream'),
281 'choose_image_text' => esc_html__( 'Choose Logo Image', 'wpstream'),
282 'select_image_text' => esc_html__( 'Select Image', 'wpstream'),
283 'update_successful' => esc_html__( 'Update Successful.', 'wpstream'),
284 'update_failed' => esc_html__( 'Something went wrong. Try again.', 'wpstream'),
285 'broadcaster_url' => esc_url( esc_url(home_url('/broadcaster-page/') ) ),
286 ));
287
288
289 $branch = isset($_GET['branch']) ? sanitize_text_field( wp_unslash( $_GET['branch'] ) ) : '';
290 wp_enqueue_script('wpstream-on-boarding-js',plugin_dir_url( __DIR__ ) .'/admin/js/wpstream-onboarding2.js',array(), WPSTREAM_PLUGIN_VERSION, true);
291 wp_localize_script('wpstream-on-boarding-js', 'wpstreamonboarding_js_vars',
292 array(
293 'admin_url' => get_admin_url(),
294 'plugin_url' => get_dashboard_url().'/plugins.php',
295 'upload_url' => get_dashboard_url().'admin.php?page=wpstream_recordings',
296 'branch' => $branch
297 ));
298
299 $current_screen=get_current_screen();
300 // enqueue the file only on the on-boarding page and wpstream_product post type
301 $is_wpstream_onboarding_page = $current_screen->base ==='wpstream_page_wpstream_onboard';
302 $is_wpstream_onboarding_post_type_page = isset($_GET['onboard']) && $_GET['onboard'] === 'yes';
303 $onboarding_visible = $is_wpstream_onboarding_page || $is_wpstream_onboarding_post_type_page;
304 if( $onboarding_visible) {
305 wp_enqueue_script('wpstream-on-boarding-page-js', plugin_dir_url( __DIR__ ) .'admin/js/wpstream-onboarding-page.js',array(), WPSTREAM_PLUGIN_VERSION, true);
306 wp_localize_script( 'wpstream-on-boarding-page-js', 'wpstream_onboarding_page_vars',
307 array(
308 'admin_url' => get_admin_url(),
309 'request_url' => WPSTREAM_CLICK,
310 'wps_user' => get_option('wpstream_api_username_from_token'),
311 'current_page' => $is_wpstream_onboarding_post_type_page ? 'post_edit' : 'onboarding',
312 'plugin_version' => WPSTREAM_PLUGIN_VERSION,
313 'branch' => $branch,
314 )
315 );
316 }
317
318 if ( in_array( $current_screen->base, ['toplevel_page_wpstream_credentials', 'wpstream_page_wpstream_live_channels', 'wpstream_page_wpstream_recordings', 'wpstream_page_wpstream_onboard'] ) ) {
319 wp_enqueue_script( 'wpstream-user-quota-update', plugin_dir_url( __DIR__ ) . 'admin/js/wpstream-user-quota.js', array(), WPSTREAM_PLUGIN_VERSION, true );
320 wp_localize_script( 'wpstream-user-quota-update', 'wpstream_user_quota_vars', array(
321 'admin_url' => get_admin_url()
322 ));
323 }
324
325 // Add localized variables for broadcaster
326 wp_localize_script('wpstream-broadcaster', 'wpstream_broadcaster_vars', array(
327 'ajax_url' => admin_url('admin-ajax.php'),
328 'nonce' => wp_create_nonce('wpstream_broadcaster_nonce'),
329 'plugin_url' => plugin_dir_url(__FILE__),
330
331 ));
332
333 }
334
335
336 /**
337 * Add Plugin Administation menu
338 *
339 * @since 3.0.1
340 */
341
342 public function wpstream_manage_admin_menu() {
343
344 add_menu_page( __('WpStream','wpestream'), __('WpStream ','wpstream'), 'administrator', 'wpstream_credentials', array($this,'wpstream_set_wpstream_credentials'), WPSTREAM_PLUGIN_DIR_URL.'img/wpstream-icon-menu_2.png',20 );
345 add_submenu_page( 'wpstream_credentials', __('WpStream Credentials','wpestream'), __('Credentials','wpestream'), 'administrator', 'wpstream_credentials', array($this,'wpstream_set_wpstream_credentials') );
346 add_submenu_page( 'wpstream_credentials', __('WpStream Live Channels','wpestream'), __('All Channels','wpestream'), 'administrator', 'wpstream_live_channels', array( $this,'wpstream_new_general_set'));
347 add_submenu_page( 'wpstream_credentials', __('WpStream Recordings','wpestream'), __('Recordings','wpestream'), 'administrator', 'wpstream_recordings', array($this,'wpstream_media_management'));
348 add_submenu_page( 'wpstream_credentials', __('WpStream Settings','wpestream'), __('Settings','wpestream'), 'administrator', 'wpstream_settings', array($this,'wpstream_settings'));
349
350 add_submenu_page( 'wpstream_credentials', __('WpStream Quick Start','wpestream'), __('WpStream Quick Start','wpestream'), 'administrator', 'wpstream_onboard', array($this,'wpstream_pre_onboard_display'));
351
352
353
354
355 }
356
357
358
359
360 /**
361 * Shows events wpstream
362 *
363 * @since 3.0.1
364 */
365
366 public function wpstream_new_general_set() {
367
368 $no_channel=1;
369
370 if(class_exists ('WC_Subscription')){
371
372 }
373
374 //event_passed
375 $args = array(
376 'posts_per_page' => -1,
377 'post_type' => 'product',
378 'post_status' => 'publish',
379 'meta_query' => array(
380 array(
381 'key' => 'event_passed',
382 'value' => 1,
383 'compare' => '!=',
384 )
385 ),
386
387 'tax_query' => array(
388 'relation' => 'AND',
389 array(
390 'taxonomy' => 'product_type',
391 'field' => 'slug',
392 'terms' => array('live_stream','subscription')
393 )
394 ),
395 );
396
397
398
399 $event_list = new WP_Query($args);
400 global $live_event_for_user;
401 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
402 $pack_details = $this->main->quota_manager->get_live_quota_data( 'wpstream_new_general_set' );
403
404 $this->main->show_user_data($pack_details);
405 if( $event_list->have_posts()){
406
407
408 print '<div class="pack_details_wrapper_transparent">
409 <h3>'.__('Your Pay-Per-View Channel List','wpstream').'</h3>';
410
411
412 $link_new = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
413
414 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new Pay-Per-View channel.','wpstream').'</a>';
415 print '</div>';
416
417 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
418
419 while ($event_list->have_posts()): $event_list->the_post();
420
421 $the_id = get_the_ID();
422 $is_subscription_live_event = esc_html(get_post_meta($the_id,'_subscript_live_event',true));
423 $term_list = wp_get_post_terms($the_id, 'product_type');
424
425 if( $term_list[0]->name=='subscription' && $is_subscription_live_event=='no'){
426 continue;
427 }
428
429 $this->wpstream_live_stream_unit($the_id);
430
431 endwhile;
432
433 print'</div>';
434 $no_channel=1;
435 }else{
436 $no_channel=0;
437 }
438
439
440 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
441 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
442
443 $pack_details = $this->main->quota_manager->get_live_quota_data( 'wpstream_new_general_set' );
444 if( isset($pack_details['available_data_mb'])){
445 if ($pack_details['available_data_mb'] <= 0){
446 print '<input type="hidden" id="wpstream_basic_streaming" value="true">';
447 }
448 }
449 $current_user = wp_get_current_user();
450 $allowded_html = array();
451 $userID = $current_user->ID;
452 $user_live_streams = get_user_meta($userID,'live_shows');
453
454
455 wp_reset_postdata();
456
457
458
459
460 // free
461
462 $args_free = array(
463 'posts_per_page' => -1,
464 'post_type' => 'wpstream_product',
465 'post_status' => 'publish',
466
467
468 );
469 $event_list_free = new WP_Query($args_free);
470
471
472 if( $event_list_free->have_posts()){
473 print '<div class="pack_details_wrapper_transparent">
474 <h3>'.__('Free-To-View Channels','wpstream').'</h3>';
475
476 $link_new = admin_url('post-new.php?post_type=wpstream_product');
477 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new Free-To-View channel.','wpstream').'</a>';
478 print '</div>';
479 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
480
481 while ($event_list_free->have_posts()): $event_list_free->the_post();
482
483
484 $the_id = get_the_ID();
485
486 if( get_post_meta ($the_id,'event_passed',true)!=1){
487 $this->wpstream_live_stream_unit($the_id);
488 }
489
490 endwhile;
491
492 print'</div><div class="wpstream_modal_background"></div>';
493 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er2</div>
494 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
495 </div>';
496 $no_channel=1;
497 }else{
498 $no_channel=0;
499 }
500
501
502
503
504 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
505 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
506 print '<div class="no_events_warning"> ';
507 if($event_list->found_posts==0){
508 print '<div class="no_events_warning_mes">'.__('* You do not have any Pay-Per-View channels!','wpstream').'</div>';
509 }
510 if($event_list_free->found_posts==0){
511 print '<div class="no_events_warning_mes">'. __('* You do not have any free channels!','wpstream').'</div>';
512 }
513
514 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new Free-To-View channel ','wpstream').'</a>';
515 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new Pay-Per-View channel ','wpstream').'</a>';
516
517 print '</div>';
518
519
520
521
522 }
523 // end wpstream_new_general_set
524
525
526 /**
527 * Social share
528 *
529 * @since 3.0.1
530 */
531
532 public function wpstream_social_share($the_id){
533 $protocol = is_ssl() ? 'https' : 'http';
534 $pinterest = wp_get_attachment_image_src(get_post_thumbnail_id($the_id), 'full');
535 $link = esc_url ( get_permalink($the_id) );
536 $title = get_the_title($the_id);
537 $twiter_status = urlencode( $title.' '.$link);
538 $email_link = 'subject='.urlencode ( $title ) .'&body='. urlencode( esc_url($link));
539
540 $facebook_link = esc_html($protocol).'://www.facebook.com/sharer.php?u='. esc_url($link) .'&amp;t='. urlencode(get_the_title());
541
542 ?>
543 <div class="wpstream_social_share_wrapper">
544
545 <a href="<?php print esc_url( $facebook_link); ?>" target="_blank" class="social_facebook wpstream_sharing_social">
546 <span class="dashicons dashicons-facebook-alt"></span>
547 </a>
548
549 <a href="<?php print esc_html($protocol);?>://twitter.com/intent/tweet?text=<?php echo esc_html($twiter_status); ?>" class="social_tweet wpstream_sharing_social" target="_blank">
550 <span class="dashicons dashicons-twitter"></span>
551 </a>
552
553 <a href="<?php print esc_html($protocol);?>://pinterest.com/pin/create/button/?url=<?php echo esc_url($link); ?>&amp;media=<?php if (isset( $pinterest[0])){ echo esc_url($pinterest[0]); }?>&amp;description=<?php echo urlencode(get_the_title()); ?>" target="_blank" class="social_pinterest wpstream_sharing_social">
554 <span class="dashicons dashicons-pinterest"></span>
555 </a>
556
557 <a href="<?php print esc_html($protocol);?>://api.whatsapp.com/send?text=<?php echo urlencode( get_the_title().' '. esc_url( $link )); ?>" class="social_whatsup wpstream_sharing_social" target="_blank">
558 <span class="dashicons dashicons-whatsapp"></span>
559 </a>
560
561 <a href="<?php print esc_html($protocol);?>://www.linkedin.com/sharing/share-offsite/?url=<?php echo urlencode(esc_url($link)); ?>" class="social_linkedin wpstream_sharing_social" target="_blank">
562 <span class="dashicons dashicons-linkedin"></span>
563 </a>
564
565 <a href="<?php print esc_html($protocol);?>:///www.reddit.com/submit?url==<?php echo urlencode(esc_url($link)); ?>" class="social_linkedin wpstream_sharing_social" target="_blank">
566 <span class="dashicons dashicons-reddit"></span>
567 </a>
568
569 <a href="mailto:email@email.com?<?php echo trim(esc_html($email_link));?>" data-action="share email" class="social_email wpstream_sharing_social">
570 <span class="dashicons dashicons-email-alt"></span>
571 </a>
572
573 <div class="wpstream_modal_explanations"> <?php print esc_html__('Spread the word! To let people know about your channel, click on the corresponding icon and share on the social platforms of your choice. The more the merrier!','wpstream'); ?> </div>
574 <?php
575 print '</div>';
576 }
577
578
579
580
581 /**
582 * Shows event unit card in admin
583 *
584 * @since 3.0.1
585 */
586
587 public function wpstream_live_stream_unit($the_id,$is_front=''){
588 global $live_event_for_user;
589 global $wpstream_plugin;
590 $current_user = wp_get_current_user();
591
592 if( !current_user_can('administrator')){
593 if($is_front=='' ){
594 print '<div class="event_list_unit">';
595 esc_html_e('You are not allowed to broadcast.','wpstream');
596 print '</div>';
597 return;
598 }
599
600 }
601
602 if( !$this->main->wpstream_check_user_can_stream() ){
603 print '<div class="event_list_unit">';
604 esc_html_e('You are not allowed to broadcast','wpstream');
605 print '</div>';
606 return;
607 }
608
609
610 $live_class='';
611 if(isset($live_event_for_user[$the_id])) {
612 $live_class=" wpstream_show_started";
613 }
614
615
616 if(has_post_thumbnail($the_id)){
617 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
618 }else{
619 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/plugin-logo.png';
620 }
621
622 $pending_streaming_class = 'hide_stream_data';
623 $external_software_streaming_class = '';
624 $obs_uri = '';
625 $obs_stream = '';
626 $live_data_url = '';
627
628 if( $live_event_for_user=='' && $is_front=='front' ){
629 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
630 }
631 $channel_status = '<div class="spinner" style="visibility: visible"></div>';
632 $button_status = '<div class="spinner" style="visibility: visible"></div>';
633 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
634 $pending_streaming_class = 'pending_trigger';
635 $live_data_url = get_post_meta($the_id,'qos_url',true);
636 // $channel_status = esc_html__('Channel is on','wpstream');
637 } else {
638 $channel_status = esc_html__('Channel is OFF','wpstream');
639 $button_status = esc_html__('TURN ON','wpstream');
640 }
641
642 $server_id = get_post_meta($the_id,'server_id',true);
643 $obs_uri = get_post_meta($the_id,'obs_uri',true);
644 $obs_stream = get_post_meta($the_id,'obs_stream',true);
645 $webcaster_url = get_post_meta($the_id,'webcaster_url',true);
646 $rtmp_ip_uri = '';
647
648 $ajax_nonce = wp_create_nonce( 'wpstream_start_event_nonce' );
649 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
650 print '<div class="event_list_unit '.$live_class.' '.$pending_streaming_class.' event_unit_style_'.esc_attr($is_front).'" data-show-id="'.intval($the_id).'" data-server-id="'.$server_id.'" data-server-url="'.$rtmp_ip_uri.'"">';
651
652 print '<div class="wpstream_channel_status">'.$channel_status.'</div>';
653
654 print '<div class="server_notification"></div>';
655
656 print '<div class="event_thumb_wrapper" style="background-image:url('.$thumb.')"></div>';
657
658 print '<div class="event_title" data-prodid="'.$the_id.'">'.wp_trim_words(get_the_title($the_id),10);
659
660
661 /* print '***</br>'.get_post_meta($the_id,'obs_uri',true) .'***</br>'.
662 get_post_meta($the_id,'obs_stream',true).'***</br>'.
663 get_post_meta($the_id,'broadcast_url',true);
664 */
665 print '<div class="wpstream_channel_item_id">'.esc_html( '#ID' ).' '.$the_id.'</div>';
666 print '</div>';
667
668
669 print '<div class="start_event wpstream_button wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" data-nonce="' . esc_attr( $ajax_nonce ) . '" > ' . $button_status;
670 print '<div class="wpstream_tooltip">'.esc_html__('Channel is now OFF. Click to turn ON.','wpestream').'</div>';
671 print '</div>';
672
673 print '<div class="wpstream_options_col1 wpstream_stream_browser_wrapper">';
674
675 print '<div class="wpstream_inactive_icon start_webcaster wpstream_stream_browser wpstream-button-icon wpstream_tooltip_wrapper" data-webcaster-url="'.$webcaster_url.'" data-show-id="'.$the_id.'"">';
676
677 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
678 print '<div class="wpstream_tooltip">'.esc_html__('Go live with your webcam','wpestream').'</div>';
679
680 print '<svg width="41" height="51" viewBox="0 0 41 51" fill="none" xmlns="http://www.w3.org/2000/svg">
681 <path d="M40.7646 44.2989C39.8782 41.4216 38.3361 38.7814 36.181 36.4522C35.7274 35.9619 35.1629 35.3518 34.4858 34.8356C34.0448 34.4996 33.4262 34.5281 33.0182 34.9035C29.358 38.2714 25.2628 39.9088 20.4979 39.9088H20.4853C15.7103 39.9059 11.6117 38.264 7.95648 34.889C7.52404 34.4896 6.85874 34.484 6.41953 34.8764C3.30565 37.6569 1.20501 40.9206 0.175434 44.5778C-0.276291 46.1833 0.15652 47.8497 1.33328 49.0353C2.22709 49.9362 3.39869 50.4173 4.61958 50.4173C5.0357 50.4173 5.45813 50.3613 5.87645 50.247C10.147 49.081 14.0772 48.4108 17.8916 48.1983C21.1954 48.014 24.4465 48.1323 27.5541 48.5495C29.9559 48.8718 32.4237 49.3888 35.0996 50.1299C36.823 50.6076 38.459 50.1562 39.7059 48.86C40.9268 47.5901 41.2933 46.0132 40.7651 44.2994L40.7646 44.2989ZM38.0572 47.274C37.3825 47.9754 36.6367 48.1823 35.7092 47.9257C32.9321 47.1565 30.3638 46.6187 27.8578 46.2827C24.6079 45.8465 21.2117 45.723 17.7643 45.9151C13.7874 46.1365 9.70183 46.8319 5.27439 48.041C4.43435 48.2706 3.5673 48.0403 2.9568 47.425C2.35932 46.8227 2.14793 46.0108 2.37712 45.1975C3.21567 42.2171 4.7982 39.6162 7.2018 37.2734C11.0641 40.5378 15.5276 42.193 20.4845 42.196H20.4978C25.4557 42.196 29.9251 40.5386 33.7967 37.2667C34.024 37.4904 34.254 37.7359 34.5032 38.0059C36.4236 40.0816 37.7951 42.4256 38.5799 44.9728C38.8603 45.8811 38.6941 46.6125 38.0581 47.274L38.0572 47.274ZM20.4954 30.7538C13.8088 30.7523 8.54664 25.4128 8.54379 18.6256C8.5412 12.2624 13.9961 6.83353 20.3776 6.84872C27.1094 6.86467 32.4526 12.1652 32.4488 18.8231C32.4447 25.4243 27.1038 30.7547 20.4954 30.7538V30.7538ZM29.4401 18.8383C29.5559 13.9512 25.4358 9.8445 20.5347 9.83671C15.5301 9.82892 11.6488 13.9279 11.5328 18.5667C11.4086 23.5202 15.344 27.7103 20.3381 27.7926C25.5542 27.8783 29.554 23.5758 29.4401 18.8383V18.8383ZM20.4917 25.1342C17.2131 25.2436 14.1541 22.4349 14.1567 18.8924C14.1593 15.2627 16.9642 12.4191 20.5858 12.4662C24.0109 12.5111 26.8269 15.2466 26.8362 18.8471C26.8451 22.4293 23.782 25.2436 20.4917 25.1342V25.1342ZM18.5119 13.9982C17.3006 13.9908 15.6202 15.656 15.6295 16.8543C15.6328 17.3209 15.961 17.661 16.3983 17.6513C17.5973 17.6246 19.2281 16.0169 19.2696 14.8205C19.2881 14.2742 19.0371 14.0016 18.5119 13.9982L18.5119 13.9982ZM20.4964 0.568359C10.4428 0.568359 2.26333 8.74761 2.26333 18.8014C2.26333 28.8551 10.4426 37.0345 20.4964 37.0345C30.5502 37.0345 38.7295 28.8553 38.7295 18.8014C38.7291 8.7478 30.5502 0.568359 20.4964 0.568359V0.568359ZM20.4964 33.3886C12.4528 33.3886 5.90919 26.8449 5.90919 18.8014C5.90919 11.3105 11.585 5.12093 18.8624 4.30631C18.8561 4.36009 18.8528 4.41423 18.8528 4.46912C18.8468 5.37368 19.6112 6.16064 20.4927 6.15846C21.3636 6.15586 22.1283 5.39706 22.142 4.52143C22.1431 4.44874 22.1372 4.3768 22.1279 4.30596C29.4067 5.11929 35.0849 11.3092 35.0849 18.802C35.0842 26.8456 28.5404 33.3892 20.4968 33.3892L20.4964 33.3886Z" fill="black"/>
682 </svg>';
683 print '</div>';
684
685
686 print '<div class="wpstream_inactive_icon wpstream_stream_pro wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_broadcast_modal" data-show-id="'.$the_id.'"">';
687
688 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
689 print '<div class="wpstream_tooltip">'.esc_html__('Go Live with external streaming app','wpestream').'</div>';
690
691 print '<svg width="51" height="38" viewBox="0 0 51 38" fill="none" xmlns="http://www.w3.org/2000/svg">
692 <path d="M48.1266 13.9634L41.891 17.5343V13.6438C41.891 10.8723 39.6525 8.63384 36.8811 8.63384H33.1504L30.1124 3.62393C28.7268 1.3324 26.2751 0 23.6103 0H10.2863C8.84722 0 7.67471 1.17251 7.67471 2.6116C7.67471 4.05068 8.84722 5.22319 10.2863 5.22319H23.6103C24.4631 5.22319 25.2093 5.64961 25.6888 6.3957L27.0744 8.63413L5.00991 8.63376C2.23843 8.63376 0 10.8722 0 13.6437V32.9901C0 35.7616 2.23843 38 5.00991 38H36.9342C39.7057 38 41.9441 35.7616 41.9441 32.9901V29.0461L48.1797 32.6169C49.2991 33.2564 50.6846 32.4571 50.6846 31.1778L50.6842 15.4022C50.6311 14.123 49.2455 13.3237 48.1261 13.9632L48.1266 13.9634ZM38.1603 32.9368C38.1603 33.6297 37.574 34.1625 36.9345 34.1625L5.01029 34.1629C4.31733 34.1629 3.78458 33.5766 3.78458 32.9372V13.5907C3.78458 12.8978 4.37086 12.365 5.01029 12.365H36.9345C37.6275 12.365 38.1603 12.9513 38.1603 13.5907V32.9368Z" fill="black"/>
693 <path d="M22.4917 21.585H9.70066C8.84784 21.585 8.15527 22.2779 8.15527 23.1304V28.247C8.15527 29.0998 8.84823 29.7923 9.70066 29.7923H22.4917C23.3445 29.7923 24.0371 29.0994 24.0371 28.247V23.1304C24.0371 22.2775 23.3445 21.585 22.4917 21.585Z" fill="black"/>
694 </svg>';
695 print '</div>';
696
697
698
699
700 print '<a href="'.esc_url($live_data_url).'" target="_blank" class="wpstream_inactive_icon wpstream_live_data wpstream_statistics_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" >';
701
702 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to see live stats.','wpestream').'</div>';
703 print '<div class="wpstream_tooltip">'.esc_html__('Live Statistics','wpestream').'</div>';
704
705 print'<svg width="50" height="42" viewBox="0 0 50 42" fill="none" xmlns="http://www.w3.org/2000/svg">
706 <path fill-rule="evenodd" clip-rule="evenodd" d="M48.9001 9.02344H40.3342C39.7288 9.02344 39.2344 9.51791 39.2344 10.1233V40.4275C39.2344 41.033 39.7288 41.5274 40.3342 41.5274H48.9001C49.5055 41.5274 50 41.0329 50 40.4275V10.1233C50 9.51791 49.5055 9.02344 48.9001 9.02344V9.02344Z" fill="black"/>
707 <path fill-rule="evenodd" clip-rule="evenodd" d="M35.821 22.4067H27.2551C26.6497 22.4067 26.1553 22.9012 26.1553 23.5066V40.4277C26.1553 41.0332 26.6497 41.5276 27.2551 41.5276H35.821C36.4264 41.5276 36.9209 41.0332 36.9209 40.4277V23.5066C36.9209 22.9012 36.4264 22.4067 35.821 22.4067V22.4067Z" fill="black"/>
708 <path fill-rule="evenodd" clip-rule="evenodd" d="M22.7439 0H14.178C13.5726 0 13.0781 0.494478 13.0781 1.09989V40.4275C13.0781 41.0329 13.5726 41.5274 14.178 41.5274H22.7439C23.3493 41.5274 23.8438 41.0329 23.8438 40.4275V1.09989C23.8438 0.49447 23.3493 0 22.7439 0V0Z" fill="black"/>
709 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.66573 15.2559H1.09987C0.49445 15.2559 -2.24584e-05 15.7512 -2.24584e-05 16.3558V40.4285C-2.24584e-05 41.0331 0.495325 41.5284 1.09987 41.5284H9.66573C10.2703 41.5284 10.7656 41.034 10.7656 40.4285V16.3558C10.7656 15.7503 10.2711 15.2559 9.66573 15.2559V15.2559Z" fill="black"/>
710 </svg>';
711 print '</a>';
712 print '</div>';
713
714 print '<div class="wpstream_options_col2 wpstream_show_settings_wrapper">';
715 if($is_front==''){
716 print '<div class="wpstream_show_settings wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_settings_modal" data-show-id="'.$the_id.'" value="'.esc_html__('Settings','wpstream').'">';
717
718 print '<div class="wpstream_tooltip_disabled">'.esc_html__('
719 Turn OFF the channel to change its settings.','wpestream').'</div>';
720 print '<div class="wpstream_tooltip">'.esc_html__('Channel Settings','wpestream').'</div>';
721
722 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
723 <path d="M49.22 21.8648C48.82 21.6099 45.665 19.7247 44.415 19.15L42.8651 15.4C43.3251 14.1601 44.2099 10.6849 44.3652 10.0798H44.3649C44.4911 9.52035 44.3213 8.93514 43.9149 8.52987L41.47 6.09995C41.0658 5.69189 40.4795 5.52168 39.9201 5.65003C39.4601 5.75501 35.92 6.64994 34.5999 7.15012L30.8499 5.60021C30.3048 4.40012 28.4699 1.32529 28.1351 0.795199V0.79485C27.8337 0.301688 27.298 0.00069643 26.7201 0H23.2798C22.7057 0.000348769 22.1718 0.294715 21.8648 0.779859C21.6098 1.1799 19.7247 4.33487 19.15 5.58487L15.4 7.13478C14.1601 6.67476 10.6849 5.78996 10.0798 5.63469V5.63504C9.52035 5.50878 8.93513 5.67864 8.52987 6.08496L6.09995 8.52988C5.69189 8.9341 5.52168 9.52042 5.65003 10.0798C5.75501 10.5398 6.64994 14.0799 7.15012 15.4L5.60021 19.15C4.40012 19.6951 1.32529 21.53 0.795198 21.8648H0.79485C0.301688 22.1662 0.00069643 22.7019 0 23.2798V26.7149C0.000348751 27.2893 0.294715 27.8233 0.779858 28.1299C1.1799 28.3849 4.33486 30.27 5.58487 30.8448L7.13478 34.5948C6.67475 35.8347 5.78996 39.3099 5.63469 39.915H5.63504C5.50878 40.4747 5.67863 41.06 6.08496 41.4649L8.51487 43.8948V43.8951C8.9191 44.3032 9.50541 44.4731 10.0648 44.3451C10.5248 44.2401 14.0649 43.3451 15.385 42.845L19.135 44.3949C19.6801 45.595 21.515 48.6698 21.8498 49.1999C22.1525 49.6997 22.6956 50.0035 23.2798 50H26.7149C27.2893 49.9996 27.8233 49.7053 28.1299 49.2201C28.3849 48.8201 30.27 45.6651 30.8447 44.4151L34.5947 42.8652C35.8347 43.3252 39.3098 44.21 39.9149 44.3653V44.3649C40.4747 44.4912 41.0599 44.3213 41.4649 43.915L43.8948 41.4851H43.8951C44.3032 41.0809 44.473 40.4945 44.345 39.9352C44.2401 39.4751 43.3451 35.9351 42.8449 34.615L44.3949 30.865C45.5949 30.3198 48.6698 28.485 49.1999 28.1501C49.6997 27.8474 50.0034 27.3044 49.9999 26.7201V23.2799C50.0045 22.7047 49.7087 22.1683 49.2201 21.8649L49.22 21.8648ZM24.9995 35.8845C22.1099 35.882 19.3399 34.7314 17.2985 32.6866C15.2572 30.6414 14.1118 27.8694 14.1146 24.9798C14.1171 22.0903 15.2676 19.3199 17.3125 17.2785C19.3577 15.2372 22.1297 14.0921 25.0193 14.0946C27.9088 14.0974 30.6792 15.2477 32.7205 17.2928C34.7619 19.338 35.907 22.1101 35.9045 24.9996C35.8978 27.8879 34.7462 30.6557 32.7021 32.6964C30.6576 34.7367 27.8876 35.8834 24.9994 35.8845H24.9995Z" fill="black"/>
724 </svg>
725 </div>';
726
727
728 print '<a href="'.get_edit_post_link($the_id).'" class="wpstream_edit_channel wpstream-button-icon wpstream_tooltip_wrapper" target="_blank" data-show-id="'.$the_id.'"">';
729 print '<div class="wpstream_tooltip">'.esc_html__('Edit Channel','wpestream').'</div>';
730 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
731 <path d="M44.8203 1.79549C42.4263 -0.598498 38.5591 -0.598498 36.1651 1.79549L4.67494 33.2246C4.55203 33.3475 4.49079 33.4088 4.42954 33.5317C4.42954 33.5317 4.42954 33.5929 4.36829 33.5929C4.30705 33.7159 4.24539 33.7771 4.24539 33.9V33.9613L0.0711091 47.5886C-0.113044 48.264 0.0711092 48.9389 0.500659 49.4301C0.868966 49.7984 1.29852 49.9826 1.78973 49.9826C1.97388 49.9826 2.15804 49.9826 2.34219 49.9213L15.9085 45.747H15.9697C16.0926 45.6858 16.2151 45.6858 16.2768 45.6241C16.2768 45.6241 16.338 45.6241 16.338 45.5629C16.4609 45.5016 16.5834 45.44 16.6451 45.3175L48.0742 13.8884C50.4682 11.4944 50.4682 7.62715 48.0742 5.23316L44.8203 1.79549Z" fill="black"/>
732 </svg>';
733 print '</a>';
734 }
735
736 print '<a href="'.get_permalink($the_id).'" target="_blank" class="wpstream_view_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'"">';
737 print '<div class="wpstream_tooltip">'.esc_html__('View Channel','wpestream').'</div>';
738 print '<svg width="50" height="32" viewBox="0 0 50 32" fill="none" xmlns="http://www.w3.org/2000/svg">
739 <path d="M18.6201 15.2828H21.8752C21.8752 14.069 22.8681 13.0207 24.1373 13.0207V9.76562C21.1032 9.76562 18.6201 12.2487 18.6201 15.2828Z" fill="black"/>
740 <path d="M24.855 0C12.9378 0 3.28272 10.9792 0.579292 14.3447C-0.193097 15.2826 -0.193097 16.662 0.579292 17.6553C3.28282 21.0208 12.9378 32 24.855 32C36.7722 32 46.4273 21.0208 49.1307 17.6553C49.9031 16.7174 49.9031 15.338 49.1307 14.3447C46.4275 10.9792 36.7722 0 24.855 0V0ZM24.855 25.8205C19.4482 25.8205 15.0344 21.4067 15.0344 15.9999C15.0344 10.5931 19.4482 6.17927 24.855 6.17927C30.2618 6.17927 34.6756 10.5931 34.6756 15.9999C34.6756 21.4067 30.2618 25.8205 24.855 25.8205Z" fill="black"/>
741 </svg>';
742 print '</a>';
743
744
745 print '<div class="wpstream_share_channel wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_share_modal" data-show-id="'.$the_id.'"">';
746 print '<div class="wpstream_tooltip">'.esc_html__('Share Channel','wpestream').'</div>';
747 print '<svg width="44" height="50" viewBox="0 0 44 50" fill="none" xmlns="http://www.w3.org/2000/svg">
748 <path d="M20.0777 20.5087L24.3481 17.9427C26.6432 16.5645 29.4554 16.2443 31.96 17.198C33.443 17.7642 35.1166 17.9363 36.852 17.6105C40.3163 16.9521 43.1162 14.1831 43.8115 10.7248C45.0606 4.51597 39.7751 -0.910703 33.5907 0.12835C30.2924 0.682061 27.5604 3.16211 26.5942 6.36168C26.4405 6.86646 26.3418 7.35835 26.2804 7.84466C25.9482 10.5028 24.2498 12.8044 21.9547 14.1827L19.3458 15.7456C17.1061 17.0869 14.3986 17.1792 11.9494 16.2748C10.9956 15.9241 9.96159 15.7271 8.88507 15.7271C3.39004 15.7271 -0.960663 20.7607 0.184097 26.4527C0.879447 29.911 3.67936 32.68 7.14364 33.3384C8.87902 33.6706 10.5525 33.492 12.0356 32.9259C14.5402 31.9721 17.3461 32.2919 19.6475 33.6706L23.906 36.2241C25.346 37.0855 26.2195 38.6424 26.2195 40.3159V40.3403C26.2195 45.8229 31.2287 50.1611 36.9018 49.0472C40.3602 48.3703 43.1415 45.583 43.8244 42.1246C44.9383 36.451 40.6 31.4423 35.1175 31.4423C34.0406 31.4423 33.007 31.6394 32.0532 31.9901C29.604 32.8944 26.9029 32.8022 24.6627 31.4608L20.0721 28.7038C18.6445 27.8484 17.7706 26.304 17.7706 24.6364V24.5875C17.7642 22.9208 18.6441 21.37 20.0777 20.5085L20.0777 20.5087Z" fill="black"/>
749 </svg>';
750 print '</div>';
751 print '</div>';
752
753 $this->wpstream_display_modal_seetings($the_id);
754 $this->wpstream_display_modal_share($the_id);
755 $this->wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream);
756
757 print '</div>';
758
759 }
760
761
762
763
764 /**
765 * Shows event unit card in admin - theme version
766 *
767 * @since 3.0.1
768 */
769 public function wpstream_live_stream_unit_for_theme($the_id,$is_front=''){
770 global $live_event_for_user;
771 global $wpstream_plugin;
772 $current_user = wp_get_current_user();
773
774 if( !current_user_can('administrator')){
775 if($is_front=='' ){
776 print '<div class="event_list_unit">';
777 esc_html_e('You are not allowed to broadcast.','wpstream');
778 print '</div>';
779 return;
780 }
781
782 }
783
784 if( !$this->main->wpstream_check_user_can_stream() ){
785 print '<div class="event_list_unit">';
786 esc_html_e('You are not allowed to broadcast','wpstream');
787 print '</div>';
788 return;
789 }
790
791
792 $live_class='';
793 if(isset($live_event_for_user[$the_id])) {
794 $live_class=" wpstream_show_started";
795 }
796
797
798 if(has_post_thumbnail($the_id)){
799 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
800 }else{
801 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/plugin-logo.png';
802 }
803
804 $pending_streaming_class = 'hide_stream_data';
805 $external_software_streaming_class = '';
806 $obs_uri = '';
807 $obs_stream = '';
808 $live_data_url = '';
809
810 if( $live_event_for_user=='' && $is_front=='front' ){
811 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
812 }
813
814 $spinner_url = admin_url('images/spinner-2x.gif');
815 $button_status = '<div class="spinner" style="background-image: url(' . $spinner_url . ')"></div>';
816 $channel_status = '';
817 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
818 $pending_streaming_class = 'pending_trigger';
819 $live_data_url = get_post_meta($the_id,'qos_url',true);
820 // $channel_status = esc_html__('Channel is on','wpstream');
821 } else {
822 $channel_status = esc_html__('Channel is OFF','wpstream');
823 $button_status = esc_html__('TURN ON', 'wpstream');
824 }
825
826 $server_id = get_post_meta($the_id,'server_id',true);
827 $obs_uri = get_post_meta($the_id,'obs_uri',true);
828 $obs_stream = get_post_meta($the_id,'obs_stream',true);
829 $webcaster_url = get_post_meta($the_id,'webcaster_url',true);
830 $rtmp_ip_uri = '';
831
832 print '<div class="wpstream_theme_event_list_unit event_list_unit '.$live_class.' '.$pending_streaming_class.' event_unit_style_'.esc_attr($is_front).'" data-show-id="'.intval($the_id).'" data-server-id="'.$server_id.'" data-server-url="'.$rtmp_ip_uri.'"">';
833
834 print '<div class="wpstream_channel_status" style="' . ($channel_status ? '' : 'display: none') . '">'.$channel_status.'</div>';
835
836 print '<div class="server_notification"></div>';
837
838 print '<div class="wpstream_theme_event_thumb_wrapper">';
839 print '<div class="event_thumb_wrapper" style="background-image:url('.$thumb.')"></div>';
840 print '<div class="event_title" data-prodid="'.$the_id.'">'.wp_trim_words(get_the_title($the_id),10);
841 print '<div class="wpstream_channel_item_id">'.esc_html('#ID','wpstream').' '.$the_id.'</div>';
842 print '</div>';
843 print '</div>';
844
845 print '<div class="wpstream_theme_control_bar_wrapper">';
846
847
848 print '<div class="wpstream_options_col1 wpstream_stream_browser_wrapper">';
849
850 print '<div class="wpstream_inactive_icon start_webcaster wpstream_stream_browser wpstream-button-icon wpstream_tooltip_wrapper" data-webcaster-url="'.$webcaster_url.'" data-show-id="'.$the_id.'"">';
851
852 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
853 print '<div class="wpstream_tooltip">'.esc_html__('Go live with your webcam','wpestream').'</div>';
854
855 print '<svg width="41" height="51" viewBox="0 0 41 51" fill="none" xmlns="http://www.w3.org/2000/svg">
856 <path d="M40.7646 44.2989C39.8782 41.4216 38.3361 38.7814 36.181 36.4522C35.7274 35.9619 35.1629 35.3518 34.4858 34.8356C34.0448 34.4996 33.4262 34.5281 33.0182 34.9035C29.358 38.2714 25.2628 39.9088 20.4979 39.9088H20.4853C15.7103 39.9059 11.6117 38.264 7.95648 34.889C7.52404 34.4896 6.85874 34.484 6.41953 34.8764C3.30565 37.6569 1.20501 40.9206 0.175434 44.5778C-0.276291 46.1833 0.15652 47.8497 1.33328 49.0353C2.22709 49.9362 3.39869 50.4173 4.61958 50.4173C5.0357 50.4173 5.45813 50.3613 5.87645 50.247C10.147 49.081 14.0772 48.4108 17.8916 48.1983C21.1954 48.014 24.4465 48.1323 27.5541 48.5495C29.9559 48.8718 32.4237 49.3888 35.0996 50.1299C36.823 50.6076 38.459 50.1562 39.7059 48.86C40.9268 47.5901 41.2933 46.0132 40.7651 44.2994L40.7646 44.2989ZM38.0572 47.274C37.3825 47.9754 36.6367 48.1823 35.7092 47.9257C32.9321 47.1565 30.3638 46.6187 27.8578 46.2827C24.6079 45.8465 21.2117 45.723 17.7643 45.9151C13.7874 46.1365 9.70183 46.8319 5.27439 48.041C4.43435 48.2706 3.5673 48.0403 2.9568 47.425C2.35932 46.8227 2.14793 46.0108 2.37712 45.1975C3.21567 42.2171 4.7982 39.6162 7.2018 37.2734C11.0641 40.5378 15.5276 42.193 20.4845 42.196H20.4978C25.4557 42.196 29.9251 40.5386 33.7967 37.2667C34.024 37.4904 34.254 37.7359 34.5032 38.0059C36.4236 40.0816 37.7951 42.4256 38.5799 44.9728C38.8603 45.8811 38.6941 46.6125 38.0581 47.274L38.0572 47.274ZM20.4954 30.7538C13.8088 30.7523 8.54664 25.4128 8.54379 18.6256C8.5412 12.2624 13.9961 6.83353 20.3776 6.84872C27.1094 6.86467 32.4526 12.1652 32.4488 18.8231C32.4447 25.4243 27.1038 30.7547 20.4954 30.7538V30.7538ZM29.4401 18.8383C29.5559 13.9512 25.4358 9.8445 20.5347 9.83671C15.5301 9.82892 11.6488 13.9279 11.5328 18.5667C11.4086 23.5202 15.344 27.7103 20.3381 27.7926C25.5542 27.8783 29.554 23.5758 29.4401 18.8383V18.8383ZM20.4917 25.1342C17.2131 25.2436 14.1541 22.4349 14.1567 18.8924C14.1593 15.2627 16.9642 12.4191 20.5858 12.4662C24.0109 12.5111 26.8269 15.2466 26.8362 18.8471C26.8451 22.4293 23.782 25.2436 20.4917 25.1342V25.1342ZM18.5119 13.9982C17.3006 13.9908 15.6202 15.656 15.6295 16.8543C15.6328 17.3209 15.961 17.661 16.3983 17.6513C17.5973 17.6246 19.2281 16.0169 19.2696 14.8205C19.2881 14.2742 19.0371 14.0016 18.5119 13.9982L18.5119 13.9982ZM20.4964 0.568359C10.4428 0.568359 2.26333 8.74761 2.26333 18.8014C2.26333 28.8551 10.4426 37.0345 20.4964 37.0345C30.5502 37.0345 38.7295 28.8553 38.7295 18.8014C38.7291 8.7478 30.5502 0.568359 20.4964 0.568359V0.568359ZM20.4964 33.3886C12.4528 33.3886 5.90919 26.8449 5.90919 18.8014C5.90919 11.3105 11.585 5.12093 18.8624 4.30631C18.8561 4.36009 18.8528 4.41423 18.8528 4.46912C18.8468 5.37368 19.6112 6.16064 20.4927 6.15846C21.3636 6.15586 22.1283 5.39706 22.142 4.52143C22.1431 4.44874 22.1372 4.3768 22.1279 4.30596C29.4067 5.11929 35.0849 11.3092 35.0849 18.802C35.0842 26.8456 28.5404 33.3892 20.4968 33.3892L20.4964 33.3886Z" fill="black"/>
857 </svg>';
858 esc_html_e('Webcam','wpstream');
859 print '</div>';
860
861
862 print '<div class="wpstream_inactive_icon wpstream_stream_pro wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_broadcast_modal" data-show-id="'.$the_id.'"">';
863
864 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
865 print '<div class="wpstream_tooltip">'.esc_html__('Go Live with external streaming app','wpestream').'</div>';
866
867 print '<svg width="51" height="38" viewBox="0 0 51 38" fill="none" xmlns="http://www.w3.org/2000/svg">
868 <path d="M48.1266 13.9634L41.891 17.5343V13.6438C41.891 10.8723 39.6525 8.63384 36.8811 8.63384H33.1504L30.1124 3.62393C28.7268 1.3324 26.2751 0 23.6103 0H10.2863C8.84722 0 7.67471 1.17251 7.67471 2.6116C7.67471 4.05068 8.84722 5.22319 10.2863 5.22319H23.6103C24.4631 5.22319 25.2093 5.64961 25.6888 6.3957L27.0744 8.63413L5.00991 8.63376C2.23843 8.63376 0 10.8722 0 13.6437V32.9901C0 35.7616 2.23843 38 5.00991 38H36.9342C39.7057 38 41.9441 35.7616 41.9441 32.9901V29.0461L48.1797 32.6169C49.2991 33.2564 50.6846 32.4571 50.6846 31.1778L50.6842 15.4022C50.6311 14.123 49.2455 13.3237 48.1261 13.9632L48.1266 13.9634ZM38.1603 32.9368C38.1603 33.6297 37.574 34.1625 36.9345 34.1625L5.01029 34.1629C4.31733 34.1629 3.78458 33.5766 3.78458 32.9372V13.5907C3.78458 12.8978 4.37086 12.365 5.01029 12.365H36.9345C37.6275 12.365 38.1603 12.9513 38.1603 13.5907V32.9368Z" fill="black"/>
869 <path d="M22.4917 21.585H9.70066C8.84784 21.585 8.15527 22.2779 8.15527 23.1304V28.247C8.15527 29.0998 8.84823 29.7923 9.70066 29.7923H22.4917C23.3445 29.7923 24.0371 29.0994 24.0371 28.247V23.1304C24.0371 22.2775 23.3445 21.585 22.4917 21.585Z" fill="black"/>
870 </svg>';
871 esc_html_e('External App','wpstream');
872 print '</div>';
873
874
875
876
877 print '<a href="'.esc_url($live_data_url).'" target="_blank" class="wpstream_inactive_icon wpstream_live_data wpstream_statistics_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" >';
878
879 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to see live stats.','wpestream').'</div>';
880 print '<div class="wpstream_tooltip">'.esc_html__('Live Statistics','wpestream').'</div>';
881
882 print'<svg width="50" height="42" viewBox="0 0 50 42" fill="none" xmlns="http://www.w3.org/2000/svg">
883 <path fill-rule="evenodd" clip-rule="evenodd" d="M48.9001 9.02344H40.3342C39.7288 9.02344 39.2344 9.51791 39.2344 10.1233V40.4275C39.2344 41.033 39.7288 41.5274 40.3342 41.5274H48.9001C49.5055 41.5274 50 41.0329 50 40.4275V10.1233C50 9.51791 49.5055 9.02344 48.9001 9.02344V9.02344Z" fill="black"/>
884 <path fill-rule="evenodd" clip-rule="evenodd" d="M35.821 22.4067H27.2551C26.6497 22.4067 26.1553 22.9012 26.1553 23.5066V40.4277C26.1553 41.0332 26.6497 41.5276 27.2551 41.5276H35.821C36.4264 41.5276 36.9209 41.0332 36.9209 40.4277V23.5066C36.9209 22.9012 36.4264 22.4067 35.821 22.4067V22.4067Z" fill="black"/>
885 <path fill-rule="evenodd" clip-rule="evenodd" d="M22.7439 0H14.178C13.5726 0 13.0781 0.494478 13.0781 1.09989V40.4275C13.0781 41.0329 13.5726 41.5274 14.178 41.5274H22.7439C23.3493 41.5274 23.8438 41.0329 23.8438 40.4275V1.09989C23.8438 0.49447 23.3493 0 22.7439 0V0Z" fill="black"/>
886 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.66573 15.2559H1.09987C0.49445 15.2559 -2.24584e-05 15.7512 -2.24584e-05 16.3558V40.4285C-2.24584e-05 41.0331 0.495325 41.5284 1.09987 41.5284H9.66573C10.2703 41.5284 10.7656 41.034 10.7656 40.4285V16.3558C10.7656 15.7503 10.2711 15.2559 9.66573 15.2559V15.2559Z" fill="black"/>
887 </svg>';
888 esc_html_e('Statistics','wpstream');
889 print '</a>';
890 print '</div>';
891
892 print '<div class="wpstream_options_col2 wpstream_show_settings_wrapper">';
893 if($is_front==''){
894 print '<div class="wpstream_show_settings wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_settings_modal" data-show-id="'.$the_id.'" value="'.esc_html__('Settings','wpstream').'">';
895
896 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn OFF the channel to change its settings.','wpestream').'</div>';
897 print '<div class="wpstream_tooltip">'.esc_html__('Channel Settings','wpestream').'</div>';
898
899 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
900 <path d="M49.22 21.8648C48.82 21.6099 45.665 19.7247 44.415 19.15L42.8651 15.4C43.3251 14.1601 44.2099 10.6849 44.3652 10.0798H44.3649C44.4911 9.52035 44.3213 8.93514 43.9149 8.52987L41.47 6.09995C41.0658 5.69189 40.4795 5.52168 39.9201 5.65003C39.4601 5.75501 35.92 6.64994 34.5999 7.15012L30.8499 5.60021C30.3048 4.40012 28.4699 1.32529 28.1351 0.795199V0.79485C27.8337 0.301688 27.298 0.00069643 26.7201 0H23.2798C22.7057 0.000348769 22.1718 0.294715 21.8648 0.779859C21.6098 1.1799 19.7247 4.33487 19.15 5.58487L15.4 7.13478C14.1601 6.67476 10.6849 5.78996 10.0798 5.63469V5.63504C9.52035 5.50878 8.93513 5.67864 8.52987 6.08496L6.09995 8.52988C5.69189 8.9341 5.52168 9.52042 5.65003 10.0798C5.75501 10.5398 6.64994 14.0799 7.15012 15.4L5.60021 19.15C4.40012 19.6951 1.32529 21.53 0.795198 21.8648H0.79485C0.301688 22.1662 0.00069643 22.7019 0 23.2798V26.7149C0.000348751 27.2893 0.294715 27.8233 0.779858 28.1299C1.1799 28.3849 4.33486 30.27 5.58487 30.8448L7.13478 34.5948C6.67475 35.8347 5.78996 39.3099 5.63469 39.915H5.63504C5.50878 40.4747 5.67863 41.06 6.08496 41.4649L8.51487 43.8948V43.8951C8.9191 44.3032 9.50541 44.4731 10.0648 44.3451C10.5248 44.2401 14.0649 43.3451 15.385 42.845L19.135 44.3949C19.6801 45.595 21.515 48.6698 21.8498 49.1999C22.1525 49.6997 22.6956 50.0035 23.2798 50H26.7149C27.2893 49.9996 27.8233 49.7053 28.1299 49.2201C28.3849 48.8201 30.27 45.6651 30.8447 44.4151L34.5947 42.8652C35.8347 43.3252 39.3098 44.21 39.9149 44.3653V44.3649C40.4747 44.4912 41.0599 44.3213 41.4649 43.915L43.8948 41.4851H43.8951C44.3032 41.0809 44.473 40.4945 44.345 39.9352C44.2401 39.4751 43.3451 35.9351 42.8449 34.615L44.3949 30.865C45.5949 30.3198 48.6698 28.485 49.1999 28.1501C49.6997 27.8474 50.0034 27.3044 49.9999 26.7201V23.2799C50.0045 22.7047 49.7087 22.1683 49.2201 21.8649L49.22 21.8648ZM24.9995 35.8845C22.1099 35.882 19.3399 34.7314 17.2985 32.6866C15.2572 30.6414 14.1118 27.8694 14.1146 24.9798C14.1171 22.0903 15.2676 19.3199 17.3125 17.2785C19.3577 15.2372 22.1297 14.0921 25.0193 14.0946C27.9088 14.0974 30.6792 15.2477 32.7205 17.2928C34.7619 19.338 35.907 22.1101 35.9045 24.9996C35.8978 27.8879 34.7462 30.6557 32.7021 32.6964C30.6576 34.7367 27.8876 35.8834 24.9994 35.8845H24.9995Z" fill="black"/>
901 </svg>
902 </div>';
903
904
905 print '<a href="'.get_edit_post_link($the_id).'" class="wpstream_edit_channel wpstream-button-icon wpstream_tooltip_wrapper" target="_blank" data-show-id="'.$the_id.'"">';
906 print '<div class="wpstream_tooltip">'.esc_html__('Edit Channel','wpestream').'</div>';
907 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
908 <path d="M44.8203 1.79549C42.4263 -0.598498 38.5591 -0.598498 36.1651 1.79549L4.67494 33.2246C4.55203 33.3475 4.49079 33.4088 4.42954 33.5317C4.42954 33.5317 4.42954 33.5929 4.36829 33.5929C4.30705 33.7159 4.24539 33.7771 4.24539 33.9V33.9613L0.0711091 47.5886C-0.113044 48.264 0.0711092 48.9389 0.500659 49.4301C0.868966 49.7984 1.29852 49.9826 1.78973 49.9826C1.97388 49.9826 2.15804 49.9826 2.34219 49.9213L15.9085 45.747H15.9697C16.0926 45.6858 16.2151 45.6858 16.2768 45.6241C16.2768 45.6241 16.338 45.6241 16.338 45.5629C16.4609 45.5016 16.5834 45.44 16.6451 45.3175L48.0742 13.8884C50.4682 11.4944 50.4682 7.62715 48.0742 5.23316L44.8203 1.79549Z" fill="black"/>
909 </svg>';
910 print '</a>';
911 }
912
913 print '<a href="'.get_permalink($the_id).'" target="_blank" class="wpstream_view_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'"">';
914 print '<div class="wpstream_tooltip">'.esc_html__('View Channel','wpestream').'</div>';
915 print '<svg width="50" height="32" viewBox="0 0 50 32" fill="none" xmlns="http://www.w3.org/2000/svg">
916 <path d="M18.6201 15.2828H21.8752C21.8752 14.069 22.8681 13.0207 24.1373 13.0207V9.76562C21.1032 9.76562 18.6201 12.2487 18.6201 15.2828Z" fill="black"/>
917 <path d="M24.855 0C12.9378 0 3.28272 10.9792 0.579292 14.3447C-0.193097 15.2826 -0.193097 16.662 0.579292 17.6553C3.28282 21.0208 12.9378 32 24.855 32C36.7722 32 46.4273 21.0208 49.1307 17.6553C49.9031 16.7174 49.9031 15.338 49.1307 14.3447C46.4275 10.9792 36.7722 0 24.855 0V0ZM24.855 25.8205C19.4482 25.8205 15.0344 21.4067 15.0344 15.9999C15.0344 10.5931 19.4482 6.17927 24.855 6.17927C30.2618 6.17927 34.6756 10.5931 34.6756 15.9999C34.6756 21.4067 30.2618 25.8205 24.855 25.8205Z" fill="black"/>
918 </svg>';
919 esc_html_e('View','wpstream');
920 print '</a>';
921
922
923 print '<div class="wpstream_share_channel wpstream-button-icon wpstream-trigger-modal wpstream_tooltip_wrapper" data-modal="wpestate_share_modal" data-show-id="'.$the_id.'"">';
924 print '<div class="wpstream_tooltip">'.esc_html__('Share Channel','wpestream').'</div>';
925 print '<svg width="44" height="50" viewBox="0 0 44 50" fill="none" xmlns="http://www.w3.org/2000/svg">
926 <path d="M20.0777 20.5087L24.3481 17.9427C26.6432 16.5645 29.4554 16.2443 31.96 17.198C33.443 17.7642 35.1166 17.9363 36.852 17.6105C40.3163 16.9521 43.1162 14.1831 43.8115 10.7248C45.0606 4.51597 39.7751 -0.910703 33.5907 0.12835C30.2924 0.682061 27.5604 3.16211 26.5942 6.36168C26.4405 6.86646 26.3418 7.35835 26.2804 7.84466C25.9482 10.5028 24.2498 12.8044 21.9547 14.1827L19.3458 15.7456C17.1061 17.0869 14.3986 17.1792 11.9494 16.2748C10.9956 15.9241 9.96159 15.7271 8.88507 15.7271C3.39004 15.7271 -0.960663 20.7607 0.184097 26.4527C0.879447 29.911 3.67936 32.68 7.14364 33.3384C8.87902 33.6706 10.5525 33.492 12.0356 32.9259C14.5402 31.9721 17.3461 32.2919 19.6475 33.6706L23.906 36.2241C25.346 37.0855 26.2195 38.6424 26.2195 40.3159V40.3403C26.2195 45.8229 31.2287 50.1611 36.9018 49.0472C40.3602 48.3703 43.1415 45.583 43.8244 42.1246C44.9383 36.451 40.6 31.4423 35.1175 31.4423C34.0406 31.4423 33.007 31.6394 32.0532 31.9901C29.604 32.8944 26.9029 32.8022 24.6627 31.4608L20.0721 28.7038C18.6445 27.8484 17.7706 26.304 17.7706 24.6364V24.5875C17.7642 22.9208 18.6441 21.37 20.0777 20.5085L20.0777 20.5087Z" fill="black"/>
927 </svg>';
928 esc_html_e('Share','wpstream');
929 print '</div>';
930 print '</div>';
931
932
933 print '<div class="start_event wpstream_button wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" > '. $button_status;
934 print '<div class="wpstream_tooltip">'.esc_html__('Channel is now OFF. Click to turn ON.','wpestream').'</div>';
935 print '</div>';
936
937 print '</div>';
938
939
940
941
942 $this->wpstream_display_modal_seetings($the_id);
943 $this->wpstream_display_modal_share($the_id);
944 $this->wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream);
945
946 print '</div>';
947
948 }
949
950
951 /*
952 *
953 * Close modal button
954 *
955 */
956
957 public function wpstream_close_modal_button(){
958 print '<div class="wpstream_close_modal"></div>';
959 }
960
961 public function wpstream_local_event_options_toggle( $is_basic_stream_mode = false ) {
962 $use_global_event_options = get_post_meta(get_the_ID(), 'use_global_event_options', true );
963 $local_event_options = get_post_meta( get_the_ID(), 'local_event_options', true );
964 $use_local_event_options_enabled = ( is_array( $local_event_options ) && empty( $use_global_event_options ) ) ||
965 ( !empty($use_global_event_options) && intval( $use_global_event_options ) === 0 );
966
967 if ( $is_basic_stream_mode ) {
968 $this->wpstream_basic_stream_mode_message();
969 }
970
971 print '<div class="wpstream_local_event_options_toggle_wrapper">';
972 print '<div class="wpstream_local_event_options_toggle_info">';
973 print '<label for="local_event_options_enabled" class="wpstream_local_event_options_label">'.esc_html__('Edit settings for this channel','wpstream').'</label>';
974 print '<span>'.sprintf(esc_html__('When is OFF, the settings from %s will be applied','wpstream'), '<a href="' . admin_url('admin.php?page=wpstream_settings&tab=default_options') . '" target="_blank">'.esc_html__('Default Channel Settings','wpstream').'</a>').'</span>';
975 print '</div>';
976 print '<label class="wpstream_switch">';
977 print '<input id="local_event_options_enabled" type="checkbox" class="wpstream_local_event_options_toggle" ' . ($use_local_event_options_enabled === true ? 'checked' : '') . ' ' . ( $is_basic_stream_mode ? 'disabled' : '' ) . '>';
978 print '<span class="wpstream_slider round"></span>';
979 print '</label>';
980 print '</div>';
981 }
982
983 public function wpstream_basic_stream_mode_message() {
984 print '<div class="basic-mode-notice">';
985 print sprintf(
986 wp_kses(
987 __(
988 'You are currently in Basic Streaming Mode. The default channel settings will be used instead. Please <a href="%s" target="_blank">upgrade</a> your plan to edit the channel settings.',
989 'wpstream'
990 ),
991 array( 'a' => array( 'href' => array() ) )
992 ),
993 esc_url( 'https://wpstream.net/pricing/' )
994 );
995 print '</div>';
996 }
997
998 /*
999 *
1000 * Display modal settings
1001 *
1002 */
1003
1004 public function wpstream_display_modal_seetings($the_id){
1005 $is_basic_stream_mode = $this->wpstream_is_basic_streaming_mode();
1006
1007 print '<div class="wpstream_modal_form wpestate_settings_modal">';
1008 $this->wpstream_close_modal_button();
1009 print '<h3>';
1010 printf( esc_html__('Channel Settings (#ID %s)','wpstream'),$the_id);
1011 print '</h3>';
1012
1013 $this->wpstream_local_event_options_toggle( $is_basic_stream_mode );
1014
1015 $local_event_options = get_post_meta($the_id,'local_event_options',true);
1016 $use_global_event_options = get_post_meta($the_id, 'use_global_event_options',true);
1017 $is_local_event_options_enabled = ( is_array( $local_event_options ) && empty( $use_global_event_options ) ) ||
1018 ( !empty($use_global_event_options) && intval( $use_global_event_options ) === 0 );
1019
1020 $local_array_exclude=array('ses_encrypt','vod_domain_lock','vod_encrypt');
1021
1022 print '<div class="wpstream_event_streaming_local">';
1023 $this->user_streaming_global_channel_options(
1024 '',
1025 $local_event_options,
1026 $local_array_exclude,
1027 !$is_local_event_options_enabled,
1028 $is_basic_stream_mode
1029 );
1030 print '</div>';
1031 print '</div>';
1032 }
1033
1034
1035 /*
1036 *
1037 * Display share settings
1038 *
1039 */
1040 public function wpstream_display_modal_share($the_id){
1041 print '<div class="wpstream_modal_form wpestate_share_modal">';
1042 $this->wpstream_close_modal_button();
1043 print '<h3>'.esc_html__('Share your Channel','wpstream').'</h3>';
1044 $this->wpstream_social_share($the_id);
1045 print '</div>';
1046 }
1047
1048
1049 /*
1050 *
1051 * Display broadcast modal
1052 *
1053 */
1054
1055 public function wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream){
1056 print '<div class="wpstream_modal_form wpestate_broadcast_modal">';
1057 $this->wpstream_close_modal_button();
1058 print '<h3>'.esc_html__('Go Live with External Streaming App','wpstream').'</h3>';
1059
1060 print '<div class="wpstream_modal_explanations">'.esc_html__('Please choose your RTMP encoder/broadcaster','wpstream').'</div>';
1061
1062 print '<select class="wpstream_external_broadcast_options">';
1063 print '<option value="wpstream_obs_settings">'.esc_html('OBS','wpstream').'</option>';
1064 print '<option value="wpstream_streamyard_settings">'.esc_html('StreamYard','wpstream').'</option>';
1065 print '<option value="wpstream_restream_settings">'.esc_html('Restream','wpstream').'</option>';
1066 print '<option value="wpstream_wimx_settings">'.esc_html('vMix','wpstream').'</option>';
1067 print '<option value="wpstream_wirecast_settings">'.esc_html('Wirecast','wpstream').'</option>';
1068 print '<option value="wpstream_xplit_settings">'.esc_html('XSplit','wpstream').'</option>';
1069 print '<option value="wpstream_larix_settings">'.esc_html('Larix Broadcaster','wpstream').'</option>';
1070
1071 print '</select>';
1072
1073 $this->wpstream_obs_settings($obs_uri,$obs_stream);
1074 $this->wpstream_streamyard_settings($obs_uri,$obs_stream);
1075 $this->wpstream_restream_settings($obs_uri,$obs_stream);
1076 $this->wpstream_wmix_settings($obs_uri,$obs_stream);
1077 $this->wpstream_wirecast_settings($obs_uri,$obs_stream);
1078 $this->wpstream_xplit_settings($obs_uri,$obs_stream);
1079 $this->wpstream_larix_settings($obs_uri,$obs_stream);
1080
1081 print '</div>';
1082 }
1083
1084
1085
1086
1087 /*
1088 *
1089 * Display OBS settings
1090 *
1091 */
1092
1093 public function wpstream_obs_settings($obs_uri,$obs_stream){
1094
1095 print '<div class="external_software_streaming wpstream_obs_settings" style="display:block;">';
1096
1097 print '<div class="external_software_streaming_details">';
1098 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('Server:').' </strong>';
1099 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1100 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1101
1102 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1103 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1104 print '</div>';
1105
1106 print'</div>';
1107
1108 print ' <div class="wpstream_modal_explanations">';
1109 print '<ul>
1110 <li>1. Click Settings in the OBS Window and then Select Stream.</li>
1111 <li>2. Choose Custom Streaming Server in the Stream Type dropdown menu.</li>
1112 <li>3. In the URL box, type/paste your Server.</li>
1113 <li>4. In the Stream key, type/paste your Stream key.</li>
1114 <li>5. Save changes.Close the Settings window and click on the "Start Streaming" button in the main window of OBS.</li></ul>';
1115
1116 print '</div>';
1117
1118
1119 print'</div>';
1120 }
1121
1122 /*
1123 *
1124 * Display StreamYard settings
1125 *
1126 */
1127
1128 public function wpstream_streamyard_settings($obs_uri,$obs_stream){
1129
1130 print '<div class="external_software_streaming wpstream_streamyard_settings">';
1131
1132 print '<div class="external_software_streaming_details">';
1133 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP server URL:').' </strong>';
1134 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1135 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1136
1137 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong>
1138 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1139 print '</div>';
1140
1141 print'</div>';
1142
1143 print ' <div class="wpstream_modal_explanations">';
1144 print '<ul>
1145 <li>1. Set up your destination by going to your StreamYard account.</li>
1146 <li>2. Choose "Custom RTMP" and add the RTMP server URL and Stream key from WpStream.</li>
1147 <li>3. Go to "Broadcasts" then "create a broadcast".</li>
1148 <li>4. Enter Live Studio.</li>
1149 <li>5. Adjust all your preferred settings and Click on "Go Live".</li></ul>';
1150
1151 print '</div>';
1152
1153
1154 print'</div>';
1155 }
1156
1157
1158
1159 /*
1160 *
1161 * Display StreamYard settings
1162 *
1163 */
1164
1165 public function wpstream_restream_settings($obs_uri,$obs_stream){
1166
1167 print '<div class="external_software_streaming wpstream_restream_settings">';
1168
1169 print '<div class="external_software_streaming_details">';
1170 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP URL:').' </strong>';
1171 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1172 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1173
1174 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong>
1175 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1176 print '</div>';
1177
1178 print'</div>';
1179
1180 print ' <div class="wpstream_modal_explanations">';
1181 print '<ul>
1182 <li>1. Go to your Restream account and set up a destination or channel.</li>
1183 <li>2. Choose "Custom RTMP" and add the RTMP URL and Stream Key from WpStream.</li>
1184 <li>3. Click on "Add Channel".</li>
1185 <li>4. Enter Live Studio.</li>
1186 <li>5. Adjust your preferred settings and Go Live.</li></ul>';
1187
1188 print '</div>';
1189
1190
1191 print'</div>';
1192 }
1193
1194
1195
1196 /*
1197 *
1198 * Display Xplit settings
1199 *
1200 */
1201
1202
1203 public function wpstream_xplit_settings($obs_uri,$obs_stream){
1204 print '<div class="external_software_streaming wpstream_xplit_settings" style="display:none;">';
1205 print '<div class="external_software_streaming_details">';
1206 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP Url:').' </strong>';
1207 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1208 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1209
1210 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1211 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1212 print '</div>';
1213
1214 print'</div>';
1215
1216 print ' <div class="wpstream_modal_explanations">';
1217 print '<ul>
1218 <li>1. Click Broadcast in the XSplit Window and then click "Set up a new output".</li>
1219 <li>2. Choose Custom RTMP in the Set up a new output dropdown menu.</li>
1220 <li>3. In the URL box, type/paste your RTMP Url.</li>
1221 <li>4. In the Stream key, type/paste your Stream key.</li>
1222 <li>5. Save changes and click on the "Stream" button in the main window.</li></ul>';
1223 print '</div>';
1224
1225 print '</div>';
1226 }
1227
1228
1229
1230 /*
1231 *
1232 * Display WireCast settings
1233 *
1234 */
1235
1236
1237 public function wpstream_wirecast_settings($obs_uri,$obs_stream){
1238 print '<div class="external_software_streaming wpstream_wirecast_settings" style="display:none;">';
1239
1240 print '<div class="external_software_streaming_details">';
1241 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('Address:').' </strong>';
1242 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1243 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1244
1245 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream:').' </strong>
1246 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1247 print '</div>';
1248
1249 print'</div>';
1250
1251 print ' <div class="wpstream_modal_explanations">';
1252 print '<ul>
1253 <li>1. Click Output on the top of the screen and then Select Output Settings.</li>
1254 <li>2. In the destination, choose RTMP Server and click OK.</li>
1255 <li>3. In the Address box, type/paste your Address.</li>
1256 <li>4. In the Stream box, type/paste your Stream key.</li>
1257 <li>5. Click on OK to save changes just click the Output on the top of the screen and then Start/Stop Broadcasting.</li></ul>';
1258 print '</div>';
1259
1260 print '</div>';
1261 }
1262
1263
1264
1265 /*
1266 *
1267 * Display Larix settings
1268 *
1269 */
1270
1271
1272 public function wpstream_larix_settings($obs_uri,$obs_stream){
1273 print '<div class="external_software_streaming wpstream_larix_settings" style="display:none;">';
1274 $larix_rtmp=$obs_uri.$obs_stream;
1275 print '<div class="external_software_streaming_details">';
1276 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP:').'</strong>';
1277 print '<div class="wpstream_live_uri_text wpstream_larix_rtmp"></div>
1278 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1279
1280 print '</div>';
1281
1282 print'</div>';
1283
1284 print ' <div class="wpstream_modal_explanations">';
1285 print '<ul>
1286 <li>A. Scan the QR code.</li>
1287 <li>or</li>
1288 <li>B. Manually configure Larix with the above RTMP</li>';
1289 if(wp_is_mobile() ){
1290 print '
1291 <li>or</li>
1292 <li>C. Click on the button below </li></ul>';
1293 }
1294
1295
1296 print '</div>';
1297
1298
1299 print '<img class="print_qrcode" src="" />';
1300 if(wp_is_mobile() ){
1301 print '<a href="" class="wpstream_start_with_larix_mobile" >Start Streaming with Larix</a>';
1302 }
1303
1304
1305
1306 print '</div>';
1307 }
1308
1309
1310
1311
1312 /*
1313 *
1314 * Display Wmix settings
1315 *
1316 */
1317
1318
1319 public function wpstream_wmix_settings($obs_uri,$obs_stream){
1320 print '<div class="external_software_streaming wpstream_wimx_settings" style="display:none;">';
1321
1322 print '<div class="external_software_streaming_details">';
1323 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('URL:').' </strong>';
1324 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1325 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1326
1327 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1328 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1329 print '</div>';
1330
1331 print'</div>';
1332
1333 print ' <div class="wpstream_modal_explanations">';
1334 print '<ul>
1335 <li>1. Click on the gear icon near the stream button on the bottom.</li>
1336 <li>2. Choose a custom RTMP Server in destination.</li>
1337 <li>3. In the URL box, type/paste your URL.</li>
1338 <li>4. In the Stream key, type/paste your Stream key.</li>
1339 <li>5. Save changes. You can start streaming by clicking on the stream button at the bottom of the dashboard.</li></ul>';
1340 print '</div>';
1341
1342 print '</div>';
1343 }
1344
1345
1346
1347 /*
1348 * Set Settings
1349 *
1350 *
1351 */
1352
1353 public function wpstream_settings(){
1354
1355 if( !current_user_can('administrator') ){
1356 die('Only for administrators');
1357 }
1358
1359
1360 if($_SERVER['REQUEST_METHOD'] === 'POST'){
1361 if( !wp_verify_nonce($_POST['wpstream-settings-nonce'],'wpstream-settings-nonce') ){
1362 die('Security check');
1363 }
1364
1365 $allowed_html = array();
1366 $exclude_array = array();
1367 $allowed_html = array();
1368
1369
1370
1371 if( isset($_POST['user_streaming_channel_type_hidden']) && intval($_POST['user_streaming_channel_type_hidden'])==1 && !isset($_POST['stream_role']) ){
1372 update_option( sanitize_key('wpstream_stream_role'), '' );
1373 }
1374
1375 foreach($_POST as $variable=>$value){
1376 if ($variable!='submit'){
1377 if (!in_array($variable, $exclude_array) ){
1378 update_option( sanitize_key('wpstream_'.$variable), sanitize_text_field ($value) );
1379 }
1380
1381 if($variable=='stream_role'){
1382 update_option( sanitize_key('wpstream_stream_role'), $value );
1383 }
1384
1385 }
1386 }
1387
1388
1389 if( isset($_GET['tab']) && $_GET['tab']=='default_options' ){
1390 $event_settings=array();
1391 foreach($this->global_event_options as $key=>$option){
1392 $event_settings[$key]='';
1393 if(isset($_POST['wpstream_event_set_'.$key]) && $_POST['wpstream_event_set_'.$key]=='on'){
1394 $event_settings[$key]=1;
1395 }else{
1396 $event_settings[$key]=0;
1397 }
1398 }
1399 update_option('wpstream_user_streaming_global_channel_options',$event_settings);
1400 }
1401
1402
1403
1404
1405 // reset permalinkgs
1406 global $wp_rewrite;
1407
1408 update_option( "rewrite_rules", FALSE );
1409 $wp_rewrite->flush_rules( true );
1410
1411 }
1412
1413 $wpstream_settings_array =array(
1414 1 => array(
1415 'tab' => 'general_options',
1416 'label' => esc_html__('Slug for free video/channel pages ','wpstream'),
1417 'name' => 'free_media_slug',
1418 'type' => 'text',
1419 'details' => esc_html__('This will replace the default "wpstream" of all your free video/channel urls. Special characters like "&" are not permitted. To have your new slug show up you need to re-save the "Permalinks Settings" under Settings -> Permalinks, even if not making any changes.','wpstream'),
1420 ),
1421
1422 'free_vod_slug' => array(
1423 'tab' => 'general_options',
1424 'label' => esc_html__('Slug for free VOD pages ','wpstream'),
1425 'name' => 'free_media_slug_vod',
1426 'type' => 'text',
1427 'details' => esc_html__('This will replace the default "wpstream_vod" of all your free VOD urls. Special characters like "&" are not permitted. To have your new slug show up you need to re-save the "Permalinks Settings" under Settings -> Permalinks, even if not making any changes.','wpstream'),
1428 ),
1429
1430 2 => array(
1431 'tab' => 'general_options',
1432 'label' => esc_html__('Non-Admin User Roles Allowed to Broadcast','wpstream'),
1433 'name' => 'stream_role',
1434 'type' => 'user_roles',
1435 'details' => esc_html__('These types of users can stream via frontend shortcodes / blocks. Single individual channels are automaticlally created for streaming by non-admins.','wpstream'),
1436
1437 ),
1438 3 => array(
1439 'tab' => 'general_options',
1440 'label' => esc_html__('Non Admin Streamers Channel Type.','wpstream'),
1441 'name' => 'user_streaming_channel_type',
1442 'type' => 'select',
1443 'select_values'=>array(
1444 'free' => esc_html__('Free Live Channel','wpstream'),
1445 'paid' => esc_html__('Pay-Per-View','wpstream')
1446 ),
1447 'details' => esc_html__('Choose whether the channels assigned to non-admins are free-for-all or pay-per-view (WooCommerce product).','wpstream'),
1448 ),
1449
1450 4 => array(
1451 'tab' => 'general_options',
1452 'label' => esc_html__('Default Pay-Per-View Price','wpstream'),
1453 'name' => 'user_streaming_default_price',
1454 'type' => 'text',
1455 'details' => esc_html__('Default price of pay-per-view channels assigned to non-admins.','wpstream'),
1456 ),
1457
1458
1459
1460 6 => array(
1461 'tab' => 'subscription_options',
1462 'label' => esc_html__('Use Global Subscription Mode','wpstream'),
1463 'name' => 'global_sub',
1464 'type' => 'slidertoogle',
1465 'details' => esc_html__('If enabled, a client can access all the media products (live and VOD) by purchasing a single subscription. The "WooCommerce Subscriptions" plugin is required.','wpstream'),
1466 ),
1467
1468 7 => array(
1469 'tab' => 'subscription_options',
1470 'label' => esc_html__('Subscription ID for Global Subscription Mode','wpstream'),
1471 'name' => 'global_sub_id',
1472 'type' => 'text',
1473 'details' => esc_html__('ID of the subscription product to be purchased for global access to media. All non-subscription video products that are not already attached to a subscription will be accessible to users that have purchased it.','wpstream'),
1474 ),
1475 8 => array(
1476 'tab' => 'messages_options',
1477 'label' => esc_html__('PPV not logged in message','wpstream'),
1478 'name' => 'product_not_login',
1479 'type' => 'text',
1480 'details' => esc_html__('This message will be displayed on top of the media player for pay-per-view items when user is not logged in.','wpstream'),
1481 'default' => esc_html__('You must be logged in to watch this video.','wpstream'),
1482 ),
1483 9 => array(
1484 'tab' => 'messages_options',
1485 'label' => esc_html__('PPV not purchased message','wpstream'),
1486 'name' => 'product_not_bought',
1487 'type' => 'text',
1488 'details' => esc_html__('This message will be displayed on top of the media player for common pay-per-view items that have not been purchased.','wpstream'),
1489 'default' => esc_html__('You did not yet purchase this item.','wpstream'),
1490 ),
1491 10 => array(
1492 'tab' => 'messages_options',
1493 'label' => esc_html__('Subscription not purchased message','wpstream'),
1494 'name' => 'product_not_subscribe',
1495 'type' => 'text',
1496 'details' => esc_html__('This message will be displayed on top of the media player for subscription-type pay-per-view items that have not been purchased.','wpstream'),
1497 'default' => esc_html__(' You did not yet subscribe to this item.','wpstream'),
1498 ),
1499 11 => array(
1500 'tab' => 'messages_options',
1501 'label' => esc_html__('Thank you message','wpstream'),
1502 'name' => 'product_thankyou',
1503 'type' => 'text',
1504 'details' => esc_html__('This message will be displayed on the thank you page (after purchase) and the confirmation email.','wpstream'),
1505 'default' => esc_html__('Thanks for your purchase. You can access your item at any time by visiting the following page: {item_link}','wpstream'),
1506 ),
1507
1508 12 => array(
1509 'tab' => 'messages_options',
1510 'label' => esc_html__('Subscription Active message','wpstream'),
1511 'name' => 'subscription_active',
1512 'type' => 'text',
1513 'details' => esc_html__('This message will be displayed on subscription product page.','wpstream'),
1514 'default' => esc_html__('Your Subscription is Active','wpstream'),
1515 ),
1516 13 => array(
1517 'tab' => 'messages_options',
1518 'label' => esc_html__('You are not live message','wpstream'),
1519 'name' => 'you_are_not_live',
1520 'type' => 'text',
1521 'details' => esc_html__('This message will be displayed in player.','wpstream'),
1522 'default' => esc_html__('We are not live at this moment','wpstream'),
1523 ),
1524
1525 14 => array(
1526 'tab' => 'general_options',
1527 'label' => esc_html__('Video player theme','wpstream'),
1528 'name' => 'video_player_theme',
1529 'type' => 'select',
1530 'select_values'=>array(
1531 'default' => esc_html__('Default','wpstream'),
1532 'city' => esc_html__('City','wpstream'),
1533 'forest' => esc_html__('Forest','wpstream'),
1534 'fantasy' => esc_html__('Fantasy','wpstream'),
1535 'sea' => esc_html__('Sea','wpstream'),
1536 ),
1537 'details' => esc_html__('Choose the video player theme to have a different look for the player.','wpstream'),
1538 ),
1539 'wpstream_player_logo' => array(
1540 'tab' => 'general_options',
1541 'name' => 'player_logo',
1542 'label' => esc_html__('Logo for the video player','wpstream'),
1543 'type' => 'image',
1544 'details' => esc_html__('This logo will be displayed on the the video player.','wpstream'),
1545 'default' => '',
1546 'image_size' => 'thumbnail',
1547 ),
1548 // hide the video player logo opacity for now
1549 // 'wpstream_player_logo_opacity' => array(
1550 // 'tab' => 'general_options',
1551 // 'name' => 'player_logo_opacity',
1552 // 'label' => esc_html__('Opacity of the video player logo','wpstream'),
1553 // 'type' => 'range',
1554 // 'details' => esc_html__('Set the opacity of the logo','wpstream'),
1555 // 'default' => '',
1556 // 'image_size' => 'thumbnail',
1557 // ),
1558 'wpsteram_player_logo_position' => array(
1559 'tab' => 'general_options',
1560 'name' => 'player_logo_position',
1561 'label' => esc_html__('Position of the video player logo','wpstream'),
1562 'type' => 'select',
1563 'select_values'=>array(
1564 'top-left' => esc_html__('Top Left','wpstream'),
1565 'top-right' => esc_html__('Top Right','wpstream'),
1566 'bottom-left' => esc_html__('Bottom Left','wpstream'),
1567 'bottom-right' => esc_html__('Bottom Right','wpstream'),
1568 ),
1569 'details' => esc_html__('Choose the position of the logo on the video player.','wpstream'),
1570 'default' => '',
1571 ),
1572
1573
1574
1575 99 => array(
1576 'tab' => 'default_options',
1577 'label' => esc_html__('Events Options ','wpstream'),
1578 'name' => 'user_streaming_global_channel_options',
1579 'type' => 'user_streaming_global_channel_options',
1580 'details' => esc_html__('Global Options for live events.','wpstream'),
1581 ),
1582
1583 100 => array(
1584 'tab' => 'default_options_vod',
1585 'label' => esc_html__('Autoplay','wpstream'),
1586 'name' => 'vod_autoplay',
1587 'type' => 'slidertoogle',
1588 'details' => esc_html__('If enabled, video will attempt to start playing automatically. This is only achievable in some browsers.','wpstream'),
1589 ),
1590
1591
1592 101 => array(
1593 'tab' => 'default_options_vod',
1594 'label' => esc_html__('Start Muted','wpstream'),
1595 'name' => 'vod_start_muted',
1596 'type' => 'slidertoogle',
1597 'details' => esc_html__('If enabled, video will start muted. This may increase the rate of autoplay in some browsers.','wpstream'),
1598 ),
1599
1600 102 => array(
1601 'tab' => 'default_options_vod',
1602 'label' => esc_html__('Lock To Website','wpstream'),
1603 'name' => 'vod_domain_lock',
1604 'type' => 'slidertoogle',
1605 'details' =>sprintf ( esc_html__('If enabled, video will only display on %1$s, otherwise it can show up on any website.','wpstream'),get_bloginfo('wpurl') ),
1606 ),
1607
1608 103 => array(
1609 'tab' => 'default_options_vod',
1610 'label' => esc_html__('Encrypt Video','wpstream'),
1611 'name' => 'vod_encrypt',
1612 'type' => 'slidertoogle',
1613 'details' => esc_html__('If enabled, video data will be encrypted. Enabling encryption may lead to reduced website performance under certain configurations. Encrypted video may not display in all browsers.','wpstream'),
1614 ),
1615
1616 /* 'vod_domain_lock' =>array(
1617 'name' => esc_html__('Video On Demand - Lock To Website','wpstream'),
1618 'details' => sprintf ( esc_html__('If enabled, VODS will only display on %1$s, otherwise they can show up on any website.','wpstream'),get_bloginfo('wpurl') ),
1619 'defaults' => 'no',
1620 ),
1621 'vod_encrypt' =>array(
1622 'name' => esc_html__('Encrypt Video on Demand','wpstream'),
1623 'details' => esc_html__('If enabled, video data will be encrypted. Enabling encryption may lead to reduced website performance under certain configurations. Encrypted video may not display in all browsers.','wpstream'),
1624 'defaults' => 'no',
1625 ),*/
1626
1627 104 => array(
1628 'tab' => 'support_tab',
1629 'label' => esc_html__('Logs','wpstream'),
1630 'name' => 'logs',
1631 'type' => 'logs_table',
1632 'details' => esc_html__('This is the error log of the plugin.','wpstream'),
1633 )
1634
1635 );
1636
1637 $active_tab = 'general_options';
1638 if( isset( $_GET[ 'tab' ] ) ) {
1639 $active_tab = $_GET[ 'tab' ];
1640 }
1641
1642
1643 print '<div class="theme_options_tab_wpstream" style="display:block;" >
1644 <h1>'.__('WpStream Settings','wpstream').'</h1>
1645 <form method="post" action="" >';
1646
1647 print '<h2 class="nav-tab-wrapper">
1648 <a href="?page=wpstream_settings&tab=general_options" class="nav-tab '; echo $active_tab == 'general_options' ? 'nav-tab-active' : ''; echo '">'.esc_html__('General Options','wpstream').'</a>
1649 <a href="?page=wpstream_settings&tab=default_options" class="nav-tab '; echo $active_tab == 'default_options' ? 'nav-tab-active' : ''; echo '">'.esc_html__('Default Channel Settings','wpstream').'</a>
1650 <a href="?page=wpstream_settings&tab=default_options_vod" class="nav-tab '; echo $active_tab == 'default_options_vod' ? 'nav-tab-active' : ''; echo '">'.esc_html__('VOD Settings','wpstream').'</a>
1651 <a href="?page=wpstream_settings&tab=subscription_options" class="nav-tab '; echo $active_tab == 'subscription_options' ? 'nav-tab-active' : '';echo '">'.esc_html__('Subscription Options','wpstream').'</a>
1652 <a href="?page=wpstream_settings&tab=messages_options" class="nav-tab '; echo $active_tab == 'messages_options' ? 'nav-tab-active' : ''; echo '">'.esc_html__('Customize Messages','wpstream').'</a>
1653 <a href="?page=wpstream_settings&tab=support_tab" class="nav-tab '; echo $active_tab == 'support_tab' ? 'nav-tab-active' : ''; echo '">'.esc_html__('Support','wpstream').'</a>
1654 </h2>';
1655 $help_link='';
1656
1657 $is_basic_stream_mode = $this->wpstream_is_basic_streaming_mode();
1658 print '<div class="wpstream_option_wrapper">';
1659
1660 switch ($active_tab) {
1661 case 'general_options':
1662 $help_link='https://docs.wpstream.net/docs/general-settings/';
1663 break;
1664 case 'default_options':
1665 $help_link='https://docs.wpstream.net/docs/default-channel-settings/';
1666 break;
1667 case 'default_options_vod':
1668 $help_link='https://docs.wpstream.net/docs/vod-settings/';
1669 break;
1670 case 'subscription_options':
1671 $help_link='https://docs.wpstream.net/docs/subscription-options/';
1672 break;
1673 case 'messages_options':
1674 $help_link='https://docs.wpstream.net/docs/customize-messages/';
1675 break;
1676 }
1677
1678 print '<div class="options_wrapper">';
1679 foreach ($wpstream_settings_array as $key=>$option){
1680 if($option['tab']!=$active_tab){
1681 continue;
1682 }
1683
1684 if ( $option['type']=='user_streaming_global_channel_options' ) {
1685 print '<div class="default-channel-settings-info">';
1686 print esc_html__( 'These settings will apply to newly created channels; existing channels will not change settings if you change them here', 'wpstream');
1687 if ( $is_basic_stream_mode ) {
1688 $this->wpstream_basic_stream_mode_message();
1689 }
1690 print '</div>';
1691
1692 }
1693 print '<div class="wpstream_option">';
1694 $options_value = get_option('wpstream_'.$option['name']) ;
1695
1696
1697 switch( $option['type'] ) {
1698 case 'user_roles':
1699 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1700 print $this->wpstream_select_user_roles($option['name'],$options_value);
1701 print '<div class="settings_details">'.$option['details'].'</div>';
1702 break;
1703 case 'user_streaming_global_channel_options':
1704 $exclude_array=array();
1705 $this->user_streaming_global_channel_options(
1706 $option['name'],
1707 $options_value,
1708 $exclude_array,
1709 $is_basic_stream_mode
1710 );
1711 break;
1712 case 'text':
1713 if($options_value==''){
1714 $options_value='';
1715 if(isset($option['default'])){
1716 $options_value=$option['default'];
1717 }
1718 }
1719
1720 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1721 print '<input class="wpstream-text-input-setting" id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_attr($options_value).'" />';
1722 print '<div class="settings_details">'.$option['details'].'</div>';
1723 break;
1724 case 'select':
1725 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1726 print '<select id="'.$option['name'].'" name="'.$option['name'].'" >';
1727 foreach($option['select_values'] as $key=>$value){
1728 print '<option value="'.$key.'" ';
1729 if( $key == esc_html($options_value) ){
1730 print ' selected ';
1731 }
1732 print '>'.$value.'</option>';
1733 }
1734 print '</select>';
1735 print '<input type="hidden" name="'.$option['name'].'_hidden" value="1" >';
1736 print '<div class="settings_details">'.$option['details'].'</div>';
1737 break;
1738 case 'slidertoogle':
1739 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1740 print '<div style="display: flex; gap: 25px; justify-content: space-between;">';
1741 print '<div class="settings_details">'.$option['details'].'</div>';
1742 print '<label class="wpstream_switch">
1743 <input type="hidden" class="wpstream_event_option_itemc" value="0" name="'.$option['name'].'" >
1744 <input type="checkbox" class="wpstream_event_option_itemc" value="1" name="'.$option['name'].'" ';
1745 if( intval($options_value) !==0 ){
1746 print ' checked ';
1747 }
1748 print '> <span class="wpstream_slider round"></span>';
1749 print '</label>';
1750 print '</div>';
1751 break;
1752 case 'image':
1753 $image_url = $options_value ? esc_url($options_value) : '';
1754 $has_image = !empty($image_url);
1755
1756 print '<label for="' . $option['name'] . '">' . $option['label'] . '</label>';
1757 print '<div class="wpstream-image-upload-wrapper">';
1758 print '<input type="hidden" id="' . $option['name'] . '" name="' . $option['name'] . '" value="' . $image_url . '" />';
1759
1760 // Preview area
1761 print '<div class="wpstream-image-preview" style="' . (!$has_image ? 'display:none;' : '') . '">';
1762 print '<img src="' . $image_url . '" alt="Preview" />';
1763 print '</div>';
1764
1765 // Upload/remove buttons
1766 print '<div class="wpstream-image-upload-buttons">';
1767 print '<button type="button" class="wpstream-upload-image button">' . esc_html__('Upload Image', 'wpstream') . '</button>';
1768 print '<button type="button" class="wpstream-remove-image button" style="' . (!$has_image ? 'display:none;' : '') . '">' . esc_html__('Remove Image', 'wpstream') . '</button>';
1769 print '</div>';
1770
1771 print '</div>';
1772 print '<div class="settings_details">' . $option['details'] . '</div>';
1773 break;
1774 case 'range':
1775 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1776 print '<input class="wpstream-range-input" type="range" id="'.$option['name'].'" name="'.$option['name'].'" min="0" max="100" step="10" value="'.esc_attr($options_value).'" />';
1777 print '<div class="settings_details">'.$option['details'].'</div>';
1778 break;
1779 case 'logs_table':
1780 $this->wpstream_support_tab();
1781 break;
1782 }
1783 print '</div>';
1784 }
1785 print '</div>'; // options wrapper
1786 if($help_link!==''){
1787 print '<div class="wpstream_options_help"><a href="'.esc_url($help_link).'" target="_blank" >'.esc_html__('Video Help','wpstream').'</a></div>';
1788 }
1789 print '</div>';
1790
1791
1792 if ( $active_tab != 'support_tab') {
1793 print '<div class="wpstream-save-settings">';
1794 print '<input type="submit" name="submit" class="wpstream_button wpstream_button_action" value="'.__('Save Changes','wpstream').'" />';
1795 print '<div class="spinner"></div>';
1796 print '</div>';
1797 }
1798
1799 print '<input id="wpstream-settings-nonce" name="wpstream-settings-nonce" type="hidden" value="'.wp_create_nonce('wpstream-settings-nonce').'" /> ';
1800 print '</form>';
1801 print '</div>';
1802
1803 }
1804
1805 /**
1806 * Get system information for support tab
1807 *
1808 * @return array System information
1809 */
1810 private function get_system_info() {
1811 global $wp_version;
1812
1813 $php_version = phpversion();
1814 $wp_version_info = $wp_version;
1815 $site_debug_mode = (defined('WP_DEBUG') && WP_DEBUG);
1816 $wp_memory_limit = WP_MEMORY_LIMIT;
1817
1818 $wpstream_version = WPSTREAM_PLUGIN_VERSION;
1819 $wpstream_plugin_outdated = false;
1820
1821 // Check if plugin is outdated
1822 $update_plugins = get_site_transient('update_plugins');
1823 if (isset($update_plugins->response['plugin/wpstream.php'])) {
1824 $wpstream_plugin_outdated = true;
1825 }
1826
1827 // Check API status
1828 $api_status = false;
1829 if (method_exists($this->main->wpstream_live_connection, 'wpstream_get_token')) {
1830 $token = $this->main->wpstream_live_connection->wpstream_get_token();
1831 $api_status = !empty($token);
1832 }
1833
1834 return array(
1835 'php_version' => $php_version,
1836 'wp_version' => $wp_version_info,
1837 'site_debug_mode' => $site_debug_mode,
1838 'wp_memory_limit' => $wp_memory_limit,
1839 'wpstream_version' => $wpstream_version,
1840 'wpstream_plugin_outdated' => $wpstream_plugin_outdated,
1841 'api_status' => $api_status
1842 );
1843 }
1844
1845 /**
1846 * Render system information HTML
1847 */
1848 private function render_system_info() {
1849 $system_info = $this->get_system_info();
1850 ?>
1851
1852 <div class="wpstream-system-info">
1853 <h3><?php esc_html_e('System Information', 'wpstream'); ?></h3>
1854 <table class="widefat">
1855 <tbody>
1856 <tr>
1857 <td><strong><?php esc_html_e('PHP Version', 'wpstream'); ?></strong></td>
1858 <td><?php echo esc_html($system_info['php_version']); ?></td>
1859 <td>
1860 <?php if (version_compare($system_info['php_version'], '7.4', '<')): ?>
1861 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1862 <?php esc_html_e('We recommend PHP 7.4 or higher', 'wpstream'); ?>
1863 <?php else: ?>
1864 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1865 <?php endif; ?>
1866 </td>
1867 </tr>
1868 <tr>
1869 <td><strong><?php esc_html_e('WordPress Version', 'wpstream'); ?></strong></td>
1870 <td><?php echo esc_html($system_info['wp_version']); ?></td>
1871 <td>
1872 <?php if (version_compare($system_info['wp_version'], '5.6', '<')): ?>
1873 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1874 <?php esc_html_e('We recommend WordPress 5.6 or higher', 'wpstream'); ?>
1875 <?php else: ?>
1876 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1877 <?php endif; ?>
1878 </td>
1879 </tr>
1880 <tr>
1881 <td><strong><?php esc_html_e('WP Debug Mode', 'wpstream'); ?></strong></td>
1882 <td><?php echo $system_info['site_debug_mode'] ? esc_html__('Enabled', 'wpstream') : esc_html__('Disabled', 'wpstream'); ?></td>
1883 <td>
1884 <?php if ($system_info['site_debug_mode']): ?>
1885 <span class="dashicons dashicons-info" style="color: #00a0d2;"></span>
1886 <?php esc_html_e('Debug mode should be disabled on production sites', 'wpstream'); ?>
1887 <?php else: ?>
1888 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1889 <?php endif; ?>
1890 </td>
1891 </tr>
1892 <tr>
1893 <td><strong><?php esc_html_e('WP Memory Limit', 'wpstream'); ?></strong></td>
1894 <td><?php echo esc_html($system_info['wp_memory_limit']); ?></td>
1895 <td>
1896 <?php
1897 $memory_limit = wp_convert_hr_to_bytes($system_info['wp_memory_limit']);
1898 if ($memory_limit < 64 * 1024 * 1024): // 64MB
1899 ?>
1900 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1901 <?php esc_html_e('We recommend at least 64MB', 'wpstream'); ?>
1902 <?php else: ?>
1903 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1904 <?php endif; ?>
1905 </td>
1906 </tr>
1907 <tr>
1908 <td><strong><?php esc_html_e('WpStream Version', 'wpstream'); ?></strong></td>
1909 <td><?php echo esc_html($system_info['wpstream_version']); ?></td>
1910 <td style="display: flex; align-items: center; gap: 5px;">
1911 <?php if ($system_info['wpstream_plugin_outdated']): ?>
1912 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1913 <?php esc_html_e('Update available', 'wpstream'); ?>
1914 <div class="update-button-wrapper">
1915 <button class="wpstream-update-plugin-button button button-primary" data-plugin="wpstream/wpstream.php">
1916 <?php esc_html_e('Update Now', 'wpstream'); ?>
1917 </button>
1918 </div>
1919 <?php else: ?>
1920 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1921 <?php endif; ?>
1922 </td>
1923 </tr>
1924 <tr>
1925 <td><strong><?php esc_html_e('API Connection', 'wpstream'); ?></strong></td>
1926 <td><?php echo $system_info['api_status'] ? esc_html__('Connected', 'wpstream') : esc_html__('Disconnected', 'wpstream'); ?></td>
1927 <td>
1928 <?php if (!$system_info['api_status']): ?>
1929 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1930 <?php esc_html_e('API connection issue', 'wpstream'); ?>
1931 <?php else: ?>
1932 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1933 <?php endif; ?>
1934 </td>
1935 </tr>
1936 </tbody>
1937 </table>
1938 </div>
1939 <?php
1940 }
1941
1942 /**
1943 * Render support tab content
1944 */
1945 public function wpstream_support_tab() {
1946 ?>
1947 <div class="wrap">
1948 <div class="wpstream-support-tab-root">
1949 <?php $this->render_system_info(); ?>
1950
1951 <div class="wpstream-plugins-table-container">
1952 <h3><?php esc_html_e('Active Plugins', 'wpstream'); ?></h3>
1953 <table class="widefat wpstream-plugins-table">
1954 <thead>
1955 <tr>
1956 <th><?php esc_html_e('Plugin', 'wpstream'); ?></th>
1957 <th><?php esc_html_e('Version', 'wpstream'); ?></th>
1958 </tr>
1959 </thead>
1960 <tbody>
1961 <?php
1962 $plugins_data = $this->wpstream_get_plugins_data();
1963 if (empty($plugins_data)) {
1964 echo '<tr><td colspan="3">' . esc_html__('No WPStream plugins found.', 'wpstream') . '</td></tr>';
1965 } else {
1966 foreach ($plugins_data as $plugin) {
1967 echo '<tr>';
1968 echo '<td>' . esc_html($plugin['name']) . '</td>';
1969 echo '<td>';
1970 echo esc_html($plugin['version']);
1971 if ( isset($plugin['new_version']) ) {
1972 echo '<div class="wpstream-tooltip-container">';
1973 echo '<span class="dashicons dashicons-info wpstream-tooltip" title="' . esc_attr($plugin['new_version']) . '">';
1974 echo '</span>';
1975 echo '<div class="wpstream-custom-tooltip">' . sprintf(
1976 esc_html__('A new version is available: %s', 'wpstream'),
1977 esc_html($plugin['new_version'])
1978 ) . '</div>';
1979 echo '</div>';
1980 }
1981 echo '</td>';
1982 echo '</tr>';
1983 }
1984 }
1985 ?>
1986 </tbody>
1987 </table>
1988 </div>
1989
1990 <div class="wpstream-logs-table-container">
1991 <h3><?php esc_html_e('Recent Logs', 'wpstream'); ?></h3>
1992 <table class="widefat wpstream-logs-table">
1993 <thead>
1994 <tr>
1995 <th><?php esc_html_e('Time', 'wpstream'); ?></th>
1996 <th><?php esc_html_e('Type', 'wpstream'); ?></th>
1997 <th><?php esc_html_e('Description', 'wpstream'); ?></th>
1998 </tr>
1999 </thead>
2000 <tbody>
2001 <?php
2002 $logs = get_option('wpstream_logs');
2003 if ( !is_array($logs) || empty($logs) ) {
2004 echo '<tr><td colspan="3">' . esc_html__('No logs found.', 'wpstream') . '</td></tr>';
2005 } else {
2006 foreach ($logs as $log) {
2007 echo '<tr>';
2008 echo '<td>' . esc_html(date('Y-m-d H:i:s', $log['timestamp'] ) ) . '</td>';
2009 echo '<td>' . esc_html($log['type']) . '</td>';
2010 echo '<td>' . esc_html($log['description']) . '</td>';
2011 echo '</tr>';
2012 }
2013 }
2014 ?>
2015 </tbody>
2016 </table>
2017 </div>
2018 </div>
2019 </div>
2020 <?php
2021 }
2022
2023 /**
2024 * Get plugins data.
2025 *
2026 * @return array
2027 */
2028 public function wpstream_get_plugins_data() {
2029 if (!function_exists('get_plugins')) {
2030 require_once ABSPATH . 'wp-admin/includes/plugin.php';
2031 }
2032
2033 // Get all installed plugins
2034 $all_plugins = get_plugins();
2035 $update_data = get_site_transient('update_plugins');
2036 $all_plugins_info = [];
2037
2038 // We want to get data only for the WpStream plugins
2039 $wpstream_plugins = array(
2040 'WpStream' => array(
2041 'path' => 'wpstream/wpstream.php',
2042 ),
2043 'WooCommerce' => array(
2044 'path' => 'woocommerce/woocommerce.php',
2045 ),
2046 'Meta Box' => array(
2047 'path' => 'meta-box/meta-box.php',
2048 ),
2049 'One Click Demo Import' => array(
2050 'path' => 'one-click-demo-import/one-click-demo-import.php',
2051 ),
2052 'Better Messages' => array(
2053 'path' => 'bp-better-messages/bp-better-messages.php',
2054 ),
2055
2056 );
2057
2058 foreach ($all_plugins as $plugin_path => $plugin_data) {
2059 $is_active = is_plugin_active( $plugin_path );
2060 $has_update = isset( $update_data->response[$plugin_path] );
2061
2062 $plugin_info = [
2063 'name' => $plugin_data['Name'],
2064 'version' => $plugin_data['Version'],
2065 'path' => $plugin_path,
2066 'active' => $is_active ? 'Yes' : 'No',
2067 'needs_update' => $has_update ? 'Yes' : 'No'
2068 ];
2069
2070 if ($has_update) {
2071 $plugin_info['new_version'] = $update_data->response[$plugin_path]->new_version;
2072 }
2073
2074 $all_plugins_info[] = $plugin_info;
2075 }
2076
2077 // Filter out the elements from $all_plugins_info that are not in $wpstream_plugins
2078 foreach ( $all_plugins_info as $key => $plugin_info ) {
2079 // compare $plugin_info['path'] against the path property on each $wpstream_plugins element item
2080 // if the path is not in $wpstream_plugins, unset the element
2081 if ( !in_array( $plugin_info['path'], array_column( $wpstream_plugins, 'path' ) ) ) {
2082 unset( $all_plugins_info[$key] );
2083 }
2084 }
2085
2086 return $all_plugins_info;
2087 }
2088
2089 public function wpstream_render_outdated_plugin_notice() {
2090 $has_update = get_site_transient('update_plugins');
2091 if (isset($has_update->response['plugin/wpstream.php'])) {
2092 ?>
2093 <div class="notice notice-warning is-dismissible">
2094 <p>
2095 <?php
2096 printf(
2097 /* translators: 1: Link to update page */
2098 esc_html__('A new version of WpStream is available. Please update to the latest version for the best experience. Go to the %1$s to update now.', 'wpstream'),
2099 '<a href="' . esc_url(admin_url('update-core.php')) . '">' . esc_html__('updates page', 'wpstream') . '</a>'
2100 );
2101 ?>
2102 </p>
2103 </div>
2104 <?php
2105 }
2106 }
2107
2108
2109 /**
2110 * Set user roles
2111 *
2112 * @since 3.0.1
2113 */
2114
2115 public function user_streaming_global_channel_options(
2116 $name,
2117 $value,
2118 $local_array='',
2119 $disabled = false,
2120 $is_basic_stream_mode = false
2121 ) {
2122
2123 foreach($this->global_event_options as $key=>$option){
2124
2125 if( is_array($local_array) && !in_array($key,$local_array)){
2126 print '<div class="wpstream_setting_event_unit_wrapper wpstream-setting-'.esc_attr($key).' ">';
2127
2128 print '<label for="'.$option['name'].'">'.$option['name'].'</label>';
2129
2130 print '<div style="display: flex; gap: 25px; justify-content: space-between;">';
2131 print '<div class="settings_details">'.$option['details'].'</div>';
2132 print '
2133 <label class="wpstream_switch">
2134 <input type="checkbox" class="wpstream_event_option_item" data-attr-ajaxname="'.esc_attr($key).'" name="wpstream_event_set_'.esc_attr($key).'" ';
2135 if( isset($value[$key]) ){
2136 if( intval($value[$key]) !==0 ){
2137 print ' checked ';
2138 }
2139 }else{
2140 if($option['defaults']=='yes') {
2141 print ' checked ';
2142 }
2143 }
2144 if ( $disabled || $is_basic_stream_mode ) {
2145 print ' disabled ';
2146 }
2147
2148
2149 print '> <span class="wpstream_slider round"></span>';
2150 print '</label>';
2151 print '</div>';
2152
2153
2154 print '</div>';
2155 }
2156 }
2157
2158
2159 }
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169 /*
2170 * Set user roles
2171 *
2172 * @since 3.0.1
2173 */
2174
2175 public function wpstream_select_user_roles($name,$value){
2176 if($value==''){
2177 $value=array();
2178 }
2179
2180 $roles = get_editable_roles();
2181 $return = '<select id="wpstream_user_roles" name="'.esc_html($name).'[]" multiple>';
2182 unset( $roles['administrator'] );
2183
2184 foreach ($roles as $key=>$role){
2185 $return .= '<option value="'.$key.'" ';
2186 if( in_array($key, $value) ){
2187 $return .= ' selected ';
2188 }
2189 $return .= '>'.$role['name'].'</option>';
2190 }
2191 $return .= '</select>';
2192
2193
2194 return $return;
2195 }
2196
2197
2198 /*
2199 * Set credential admin function
2200 *
2201 * @since 3.0.1
2202 */
2203 public function wpstream_set_wpstream_credentials(){
2204
2205 if($_SERVER['REQUEST_METHOD'] === 'POST'){
2206 $allowed_html = array();
2207 $exclude_array = array();
2208 $allowed_html = array();
2209
2210 foreach($_POST as $variable=>$value){
2211 if ($variable!='submit'){
2212 if (!in_array($variable, $exclude_array) ){
2213 switch ( $variable ) {
2214 case 'api_username':
2215 update_option( sanitize_key('wpstream_api_username'), sanitize_text_field($value) );
2216 break;
2217 case 'api_password':
2218 update_option( sanitize_key('wpstream_api_password'), $value );
2219 break;
2220 }
2221 }
2222 }
2223 }
2224
2225
2226
2227
2228 update_option('wp_estate_token_expire',0);
2229 update_option('wp_estate_curent_token',' ');
2230 delete_transient( 'wpstream_token_api');
2231 delete_transient('wpstream_token_request_30');
2232 delete_transient('wpstream_request_pack_data_per_user_transient');
2233 }
2234
2235
2236 $allowed_html = array();
2237
2238
2239
2240 $wpstream_options_array =array(
2241 2 => array(
2242 'label' => 'WpStream.net Username or Email',
2243 'name' => 'api_username',
2244 'type' => 'text',
2245 ),
2246 3 => array(
2247 'label' => 'WpStream.net Password',
2248 'name' => 'api_password',
2249 'type' => 'password',
2250 ),
2251
2252 );
2253
2254
2255 $token = $this->main->wpstream_live_connection->wpstream_get_token();
2256 $pack_details = $this->main->quota_manager->get_live_quota_data( 'wpstream_set_wpstream_credentials' );
2257
2258 $this->main->show_user_data($pack_details);
2259
2260 print '<form method="post" action="" >';
2261 print '<div class="theme_options_tab_wpstream" style="display:block;" >
2262 <h1>'.__('WpStream Credentials','wpstream').'</h1>';
2263
2264
2265 if( get_option('wpstream_api_username')=='' || get_option('wpstream_api_password')== '' ){
2266 echo '<div class="api_not_conected wpstream_orange">';
2267 $admin_url_onboard=get_admin_url().'admin.php?page=wpstream_onboard';
2268 printf ( __('To connect your plugin, enter your WpStream credentials below or go <a href="%s" target="_blank">here</a> to create an account.','wpstream'),$admin_url_onboard);
2269 echo '</div>';
2270
2271 }else if($token==''){
2272 $text = get_option('wpstream_curl_failed') === "0" ?
2273 ' Incorrect username or password. Please check your credentials or go <a href="https://wpstream.net/my-account/edit-account/" target="_blank">here</a> to reset your password.' :
2274 'Not connected to WpStream. Please note the errors above and contact support.';
2275 echo '<div class="api_not_conected">'.__($text,'wpstream').'</div>';
2276 }else if( $this->main->wpstream_live_connection->wpstream_client_check_api_status() ){
2277 echo '<div class="api_conected">'.__('Connected to WpStream.net!','wpstream').'</div>';
2278 }else{
2279 echo '<div class="api_not_conected wpstream_brown">'.__('Failed to connect to WpStream.net. Please address CURL connectivity with your hosting provider.','wpstream').'</div>';
2280 }
2281 print '<div class="wpstream_option_wrapper">';
2282 foreach ($wpstream_options_array as $key=>$option){
2283 print '<div class="wpstream_option">';
2284
2285 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
2286 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
2287 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
2288
2289 print '</div>';
2290 }
2291 print '</div>';
2292
2293
2294 print '<input type="submit" name="submit" class="wpstream_button wpstream_button_action" value="'.__('Save Changes','wpstream').'" />';
2295
2296 print '<h3>Video Tutorials</h3>';
2297
2298 print '<a class="how_to_videos" target="_blank" href="https://youtu.be/9DQrxsKcpmQ">How to Live Stream to WordPress with OBS</a>';
2299 print '<a class="how_to_videos" target="_blank" href="https://youtu.be/qMSjJCskAfM">How to Live Stream to WordPress in less than 3 Minutes</a>';
2300 print '<a class="how_to_videos" target="_blank" href="https://youtu.be/h6myD_vhKcg">How to Live-Stream to WordPress using your iPhone</a>';
2301
2302 print '<a style="margin-top:10px;" href="https://www.youtube.com/channel/UCIjItiJc4Z7aJApj3W6ArJA" target="_blank" class="how_to_videos">More Tutorials On Our YouTube Channel</a>';
2303
2304
2305 print '</div>';
2306 print '</form>';
2307
2308 print '<div class="theme_options_tab_wpstream" style="display:block;" >';
2309 $link_new = admin_url('admin.php?page=wpstream_live_channels');
2310 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
2311 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
2312
2313
2314 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create new Free-To-View channel','wpstream').'</a>';
2315 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create Pay-Per-View channel','wpstream').'</a>';
2316 print '<a href="'.esc_url($link_new).'" class="wpstream_no_chanel_add_channel">'.esc_html('My Channels','wpstream').'</a>';
2317 print '</div>';
2318
2319
2320 }
2321
2322
2323
2324 /**
2325 * Media Management
2326 *
2327 * @since 3.0.1
2328 */
2329
2330 public function wpstream_media_management(){
2331 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_media_management');
2332
2333 $this->main->show_user_data($pack_details);
2334
2335
2336 print '<div id="wpstream_media_upload"><h3>'.__('Upload New Recording','wpstream').'</h3>'.$this->wpstream_present_media_upload().'</div>';
2337
2338 print '<div id="wpstream_file_management"><h3 id="video_management_title">'.__('Your Recordings','wpstream').'</h3>'.$this->wpstream_present_file_management().'</div>';
2339
2340
2341 }
2342
2343
2344
2345
2346 /**
2347 *
2348 *
2349 * WpStream Pagination
2350 *
2351 * @since 3.0.1
2352 *
2353 *
2354 */
2355
2356 public function wpstream_pagination($pages , $range = 2) {
2357 $return='';
2358 $showitems = ($range * 2) + 1;
2359 $paged = ( isset( $_GET['paged'] ) ) ? intval($_GET['paged']) : 1;
2360
2361
2362 if (1 != $pages && $pages != 0) {
2363 $return.= '<ul class="pagination wpstream_pagination">';
2364 $return.= "<li class=\"roundleft\"><a href='" . get_pagenum_link($paged - 1) . "'><</a></li>";
2365
2366 $last_page = get_pagenum_link($pages);
2367 for ($i = 1; $i <= $pages; $i++) {
2368 if (1 != $pages && (!($i >= $paged + $range + 1 || $i <= $paged - $range - 1) || $pages <= $showitems )) {
2369 if ($paged == $i) {
2370 $return.= '<li class="active"><a href="' . esc_url(get_pagenum_link($i)) . '" >' . $i . '</a><li>';
2371 } else {
2372 $return.= '<li><a href="' . esc_url(get_pagenum_link($i)) . '" >' . $i . '</a><li>';
2373 }
2374 }
2375 }
2376
2377 $prev_page = get_pagenum_link($paged + 1);
2378 if (($paged + 1) > $pages) {
2379 $prev_page = get_pagenum_link($paged);
2380 } else {
2381 $prev_page = get_pagenum_link($paged + 1);
2382 }
2383
2384
2385 $return.= "<li class=\"roundright\"><a href='" . $prev_page . "'>></a><li>";
2386 $return.= "<li class=\"roundright\"><a href='" . $last_page . "'>>><li>";
2387 $return.= "</ul>";
2388 }
2389 return $return;
2390 }
2391
2392
2393
2394
2395
2396
2397 /**
2398 * Media upload
2399 *
2400 * @since 3.0.1
2401 */
2402 public function wpstream_present_media_upload(){
2403 $to_return='';
2404 $formInputs=$this->main->wpstream_live_connection->wpstream_get_signed_form_upload_data();
2405
2406 if( !$formInputs['success'] ){
2407 if ($formInputs['error'] == 'not_connected'){
2408 $to_return.='<div class="wpstream_upload_container">'.esc_html__('Not connected. Please connect to WpStream to upload videos.','wpstream').'</div>';
2409 }
2410 else {
2411 $to_return.='<div class="wpstream_upload_alert">'.esc_html__('You don\'t have enough cloud storage and data to upload a new item. Please delete some videos or upgrade your plan.','wpstream').'</div>';
2412 }
2413 return $to_return;
2414 }
2415
2416 if($formInputs['success'] ===true){
2417
2418
2419
2420 $to_return.='<div class="wpstream_upload_container">';
2421 $to_return.='<div id="wpstream_uploaded_mes">'.esc_html__('Please select or drop a video file. Do not close this window during the upload!','wpstream').'</div>';
2422 $to_return.='<form action="https://wpstream-video.s3.amazonaws.com/"
2423 method="POST"
2424 enctype="multipart/form-data"
2425 data-singleFileUploads="true"
2426 data-limitMultiFileUploads="1"
2427 data-limitConcurrentUploads="1"
2428 class="direct-upload">';
2429
2430 $to_return.='<input id="wpstream_upload" type="file" class="inputfile inputfile-1" value="Pick a video file" name="file" multiple>';
2431 $to_return.='<label for="wpstream_upload"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" viewBox="0 0 20 17"><path d="M10 0l-5.2 4.9h3.3v5.1h3.8v-5.1h3.3l-5.2-4.9zm9.3 11.5l-3.2-2.1h-2l3.4 2.6h-3.5c-.1 0-.2.1-.2.1l-.8 2.3h-6l-.8-2.2c-.1-.1-.1-.2-.2-.2h-3.6l3.4-2.6h-2l-3.2 2.1c-.4.3-.7 1-.6 1.5l.6 3.1c.1.5.7.9 1.2.9h16.3c.6 0 1.1-.4 1.3-.9l.6-3.1c.1-.5-.2-1.2-.7-1.5z"/></svg> <span id="wpstream_label_action">' . esc_html__('Choose a file&hellip;','wpstream') . '</span></label>';
2432
2433
2434 $to_return.='<div class="wpstream_file_drop_color">';
2435 $to_return.='<div class="wpstream_form_ex">'.esc_html__('Drop a video file here!','wpstream').'</div>';
2436 $to_return.='<div class="wpstream_form_ex_details">'.__('The Video File must be encoded with the following settings:<br>
2437
2438 Container: <strong>MP4</strong>,<br>
2439 Video codec: <strong>H264</strong>,<br>
2440 Audio codec: <strong>AAC</strong>.<br>
2441 Media will fail to play if it does not follow the above settings.
2442 You may use a tool like MediaInfo to verify your file. Also you may convert it with specialized software like HandBrake.','wpstream').'<strong> '.esc_html__('Accepted file extensions: .mp4, .mov','wpstream').'</strong></div>';
2443 if(is_array($formInputs)){
2444 foreach ($formInputs['ref'] as $name => $value) {
2445 $to_return.='<input type="hidden" name="'. $name.'" value="'.$value.'">';
2446 }
2447 }
2448
2449 $to_return.='
2450 <div class="progress-bar-area"></div></div>
2451 </form>';
2452
2453 $to_return.='</div>';
2454 }
2455
2456 return $to_return;
2457
2458 }
2459
2460
2461
2462
2463
2464 /**
2465 * Display movie list
2466 *
2467 * @since 3.0.1
2468 */
2469 public function wpstream_present_file_management(){
2470 $video_list_raw = $this->main->wpstream_live_connection->wpstream_get_videos_from_api();
2471
2472 if ( $video_list_raw === false ) {
2473 return '<div class="wpstream_upload_container">'.esc_html__('Not connected. Please connect to WpStream to upload videos.','wpstream').'</div>';
2474 }
2475
2476 $video_list_raw_array = [];
2477 if( isset( $video_list_raw['items'] ) ){
2478 $video_list_raw_array = $video_list_raw['items'];
2479 }
2480
2481 $keys = array_column( $video_list_raw_array, 'time' );
2482 array_multisort($keys, SORT_DESC , $video_list_raw_array);
2483
2484 $to_return='';
2485
2486 // show pending items
2487 if ( key_exists( 'pending', $video_list_raw ) && is_array( $video_list_raw['pending'] ) ) {
2488 foreach ( $video_list_raw['pending'] as $key => $video ) {
2489 $video_size = intval($video['size']/1048576);
2490 $video_name = esc_html($video['name']);
2491 if($video_name!=''):
2492 $to_return.='<div class="wpstream_video_wrapper">';
2493 $to_return.='<div class="wpstream_video_title">';
2494 $to_return.='<div class="wpstream_video_notice"></div></div>';
2495 $to_return.='<div class="wpstream_video_title"><strong class="storage_file_name">'.esc_html__('File Name :','wpstream').'</strong>'.'<span class="storage_file_name_real">'.$video_name.'</span><span class="storage_file_size">'.$video_size.' MB </span></div>';
2496 $to_return.='<div class="wpstream_video_pending">' . esc_html__( 'The video is still processing', 'wpstream') . '</div>';
2497 $to_return.='</div>';
2498 endif;
2499
2500 }
2501 }
2502
2503 // show uploaded items
2504 if( is_array($video_list_raw['items'] ) ) {
2505 foreach ($video_list_raw_array as $key =>$video){
2506 $video_size = intval($video['size']/1048576);
2507 $video_name = esc_html($video['name']);
2508 if($video_name!=''):
2509 $to_return.='<div class="wpstream_video_wrapper">';
2510
2511 $to_return.='<div class="wpstream_video_title">';
2512 $to_return.='<div class="wpstream_video_notice"></div></div>';
2513 $to_return.='<div class="wpstream_video_title"><strong class="storage_file_name">'.esc_html__('File Name:','wpstream').'</strong>'.'<span class="storage_file_name_real">'.$video_name.'</span><span class="storage_file_size">'.$video_size.' MB </span></div>';
2514 $to_return.=' <div class="wpstream_delete_media" ';
2515 $to_return.=' onclick="return confirm(\' Are you sure you wish to delete '.$video_name.'?\')" data-filename="'.$video_name.'">'.esc_html__('delete file','wpstream').'</div>';
2516 $to_return.='<div class="wpstream_get_download_link" data-filename="'.$video_name.'">'.esc_html__('download','wpstream').'</div>';
2517 $to_return.='<a href="" class="wpstream_download_link">'.esc_html__('Click to download! The url will work for the next 20 minutes!','wpstream').'</a>';
2518
2519 $add_free_video_url=admin_url('post-new.php?post_type=wpstream_product_vod').'&new_video_name='. rawurlencode($video_name);
2520 $add_paid_video_url=admin_url('post-new.php?post_type=product').'&new_video_name='. rawurlencode($video_name);
2521
2522
2523
2524 $to_return .='<a class="create_new_free_video" href="'.esc_url($add_free_video_url).'">'.esc_html__('Create new Free-To-View VOD from this recording').'</a>';
2525 if (class_exists('WooCommerce')) {
2526 $to_return .='<a class="create_new_ppv_video" href="'.esc_url($add_paid_video_url).'">'.esc_html__('Create new Pay-Per-View VOD from this recording').'</a>';
2527 }
2528
2529 $to_return.='</div>';
2530 endif;
2531
2532 }
2533 $current_page= get_current_screen();
2534 }
2535
2536 // no items to show
2537 if ( !is_array( $video_list_raw['items'] ) || ( key_exists( 'pending', $video_list_raw ) && !is_array( $video_list_raw['pending'] ) ) ) {
2538 $to_return.= '<div class="wpstream_video_wrapper">'.esc_html__('You don\'t have any videos.','wpstream').'</div>';
2539 }
2540 return $to_return;
2541 }
2542
2543
2544 /**
2545 * Set defualt channels values
2546 *
2547 * @since 3.0.1
2548 */
2549
2550
2551
2552
2553 public function wpstream_publish_wpstream_product($post_id,$post){
2554 if( $post->post_type == 'wpstream_product' ){
2555 update_post_meta ($post_id,'local_event_options_test','working_on_'.$post_id);
2556 update_post_meta ($post_id, 'use_global_event_options', true);
2557 $to_save_option=array();
2558
2559 $global_options= get_option('wpstream_user_streaming_global_channel_options');
2560
2561 $local_events = get_post_meta ($post_id ,'local_event_options',true) ;
2562
2563 if( $local_events =='' ){
2564 if( is_array($global_options) ){
2565 foreach($global_options as $key=>$value){
2566 $to_save_option[sanitize_key($key)]=sanitize_text_field($value);
2567 }
2568
2569 update_post_meta ($post_id,'local_event_options',$to_save_option);
2570
2571 }
2572 }
2573
2574
2575 }
2576 }
2577
2578 /**
2579 * save meta options
2580 *
2581 * @since 3.0.1
2582 */
2583 public function wpstream_free_product_update_post($post_id,$post){
2584
2585 if(!is_object($post) || !isset($post->post_type)) {
2586 return;
2587 }
2588
2589
2590
2591
2592
2593
2594
2595 if( $post->post_type == 'wpstream_product' ||
2596 $post->post_type == 'wpstream_product_vod' ):
2597
2598 $allowed_keys=array(
2599 'wpstream_product_type',
2600 'wpstream_free_video',
2601 'wpstream_free_video_external',
2602 'wpstream_closed_captions_file'
2603 );
2604
2605
2606 foreach ($_POST as $key => $value) {
2607 if( !is_array ($value) ){
2608 if (in_array ($key, $allowed_keys)) {
2609 $postmeta = sanitize_text_field ( $value );
2610 update_post_meta($post_id, sanitize_key($key), $postmeta );
2611 }
2612 }
2613 }
2614
2615 endif;
2616
2617 }
2618
2619
2620 /**
2621 * save meta options
2622 *
2623 * @since 3.0.1
2624 */
2625 public function add_wpstream_product_metaboxes() {
2626 global $post;
2627 $post_id = $post->ID;
2628
2629
2630
2631
2632 add_meta_box( 'add_wpstream_product_metaboxes-sectionid', esc_html__( 'Video On Demand Settings', 'wpstream' ),array($this,'display_meta_options'),'wpstream_product_vod' ,'normal','default');
2633 add_meta_box( 'custom_metabox_video_collection', esc_html__( 'Video Collection', 'wpstream' ), 'wpstream_bundle_custom_metabox_callback', 'wpstream_bundles', 'normal', 'high' );
2634 add_meta_box( 'woocommerce-product-data', esc_html__( 'Product Data', 'wpstream' ), 'woocommerce_product_data_box', 'product', 'normal', 'default' );
2635
2636 if(function_exists('wc_get_product')):
2637 $product = wc_get_product( $post_id );
2638 if ( $product ) {
2639
2640 if ( $product->get_type() === 'wpstream_bundle' ) {
2641 add_meta_box(
2642 'wpstream_woo_custom_metabox',
2643 esc_html__( 'Video Collection Options', 'wpstream' ),
2644 'wpstream_bundle_custom_metabox_callback',
2645 'product',
2646 'normal',
2647 'default'
2648 );
2649 }
2650 }
2651 endif;
2652
2653 }
2654
2655
2656 /**
2657 * make woocomerce virtual products
2658 *
2659 * @since 3.0.1
2660 */
2661
2662
2663 public function wpstream_make_product_virtual($post_id,$post){
2664 global $post;
2665 if(isset($post->ID)){
2666 if ( $post->post_type !== 'product' ) return;
2667 $term_list = wp_get_post_terms($post->ID, 'product_type');
2668 if( !empty($term_list) &&
2669 isset($term_list[0]->name) &&
2670 in_array($term_list[0]->name, ['live_stream', 'video_on_demand', 'wpstream_bundle'])
2671 ){
2672 update_post_meta( $post->ID, '_virtual', 'yes' );
2673 }
2674 }
2675 }
2676
2677
2678
2679 /**
2680 * render meta options
2681 *
2682 * @since 3.0.1
2683 */
2684 public function display_meta_options( $post ) {
2685 wp_nonce_field( plugin_basename( __FILE__ ), 'estate_agent_noncename' );
2686 global $post;
2687
2688 $is_live = '';
2689 $is_video = '';
2690 $is_video_external = '';
2691 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
2692 $is_video = ' selected ';
2693 $wpstream_free_video = esc_html( $_GET['new_video_name']);
2694 }else{
2695 $wpstream_product_type = esc_html(get_post_meta($post->ID, 'wpstream_product_type', true));
2696 $wpstream_free_video = esc_html(get_post_meta($post->ID, 'wpstream_free_video', true));
2697
2698 if($wpstream_product_type==1){
2699 $is_live = ' selected ';
2700 }
2701
2702 if($wpstream_product_type==2){
2703 $is_video = ' selected ';
2704 }
2705
2706 if($wpstream_product_type==3){
2707 $is_video_external = ' selected ';
2708 }
2709 }
2710
2711 print'
2712 <p class="meta-options">
2713 <label for="wpstream_product_type">'.__('Media Type:','wpstream').' </label><br />
2714 <select id="wpstream_product_type" name="wpstream_product_type">
2715 <option value="2" '.$is_video.'>'.__('Recording','wpstream').'</option>
2716 <option value="3" '.$is_video_external.'>'.__('Self Hosted or External Video','wpstream').'</option>
2717 </select>
2718 </p>
2719 ';
2720
2721
2722 $video_list = $this->main->wpstream_live_connection->wpstream_get_videos();
2723
2724
2725 print '<div class="meta-options video_free">';
2726 print '<p class="meta-option wpstream_free_video">';
2727 print '<label for="wpstream_free_video">'.__('Choose video:','wpstream').' </label><br />
2728 <select id="wpstream_free_video" name="wpstream_free_video">';
2729
2730 if( is_array( $video_list ) ) {
2731 foreach ($video_list as $key=>$value){
2732 print '<option value="'.$key.'"';
2733 if($wpstream_free_video === $key){
2734 print ' selected ';
2735 }
2736 print '>'.$value.'</option>';
2737 }
2738 }
2739 print'</select>';
2740 print '</p> ';
2741
2742 $wpstream_closed_captions_file = get_post_meta($post->ID, 'wpstream_closed_captions_file', true);
2743
2744 $button_style = $wpstream_closed_captions_file ? 'style="display:none;"' : '';
2745
2746 print '<p class="meta-option wpstream_vod_captions_url">';
2747 print '<label for="wpstream_vod_captions_url_button">'.__('Captions file (optional):','wpstream').' </label><br />
2748 <input type="hidden" id="wpstream_closed_captions_file" name="wpstream_closed_captions_file" value="'.esc_attr($wpstream_closed_captions_file).'" />
2749 <input id="wpstream_vod_captions_url_button" type="button" class="upload_button button" value="'.esc_html__('Select .vtt Captions File','wpstream').'" '.$button_style.' />
2750 <span class="wpstream_caption_file_display">'.( $wpstream_closed_captions_file ? esc_html( basename( $wpstream_closed_captions_file ) ) : '' ).'</span>';
2751 if ( $wpstream_closed_captions_file ) {
2752 print '<input type="button" class="button wpstream_remove_caption" value="'.esc_html__('Remove','wpstream').'" style="margin-left: 5px;" />';
2753 }
2754 print '</p> ';
2755 print '</div>';
2756
2757 $wpstream_free_video_external= esc_html(get_post_meta($post->ID, 'wpstream_free_video_external', true));
2758 print '<div class="meta-options1 video_free_external">
2759 <label for="wpstream_free_video_external">'.__('Video:','wpstream').' </label><br />
2760
2761 <input id="wpstream_free_video_external" type="text" size="36" name="wpstream_free_video_external" value="'.$wpstream_free_video_external.'" />
2762 <input id="wpstream_free_video_external_button" type="button" size="40" class="upload_button button" value="'.esc_html__('Select Video','wpstream').'" />';
2763 if($wpstream_product_type==2){
2764 $show_recording='';
2765 $show_external='style="display:none"';
2766 }else{
2767 $show_recording='style="display:none"';
2768 $show_external='';
2769 }
2770 print '<p '.$show_recording.' class="wpstream_option_vod_source wpstream_show_recording">'.esc_html__('Choose one of your existing recordings.','wpstream').'</p>';
2771 print '<p '. $show_external.' class="wpstream_option_vod_source wpstream_show_external">'.esc_html__('Upload a video from your computer or paste the URL of a YouTube/external video.','wpstream').'</p>';
2772
2773 print '</div> ';
2774 }
2775
2776
2777
2778
2779
2780
2781
2782 /**
2783 * Add new product types to Woocommerce select product type
2784 *
2785 * @since 3.0.1
2786 */
2787 public function wpstream_add_products( $types ){
2788 $types[ 'live_stream' ] = __( 'Live Channel','wpestream' );
2789 $types[ 'video_on_demand' ] = __( 'Video On Demand','wpestream' );
2790
2791 return $types;
2792 }
2793
2794 public function wpstream_add_products_class( $classname, $product_type ) {
2795 if ( 'live_stream' === $product_type ) {
2796 $classname = 'WC_Product_Live_Stream';
2797 }
2798 if ( 'video_on_demand' === $product_type ) {
2799 $classname = 'WC_Product_Video_On_Demand';
2800 }
2801 return $classname;
2802 }
2803
2804 public function wpstream_add_custom_wc_products() {
2805 if( class_exists( 'WooCommerce' ) ){
2806 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_live_stream.php';
2807 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_video_on_demand.php';
2808 }
2809 }
2810
2811 /**
2812 * Js action to do when user pick live stream or video on demand
2813 *
2814 * @since 3.0.1
2815 */
2816
2817 public function wpstream_products_custom_js() {
2818 if ( 'product' != get_post_type() ) :
2819 return;
2820 endif;
2821
2822 ?>
2823 <script type='text/javascript'>
2824 jQuery( document ).ready( function() {
2825 jQuery('.options_group.pricing' ).addClass ( 'show_if_live_stream' ).show();
2826 jQuery('.options_group.pricing' ).addClass ( 'show_if_video_on_demand' ).show();
2827 jQuery('.options_group.pricing' ).addClass ( 'show_if_wpstream_bundle' ).show();
2828
2829 jQuery('._sold_individually_field').parent().addClass('show_if_live_stream').show();
2830 jQuery('._sold_individually_field').parent().addClass('show_if_video_on_demand').show();
2831 jQuery('._sold_individually_field').parent().addClass('show_if_wpstream_bundle').show();
2832
2833 jQuery('._sold_individually_field').show();
2834
2835 var selected = jQuery('#product-type').val();
2836 });
2837 </script>
2838 <?php
2839
2840 }
2841
2842
2843 /**
2844 * Add custom classes to the product types
2845 *
2846 * @since 3.0.1
2847 */
2848
2849 public function wpstream_hide_attributes_data_panel( $tabs) {
2850
2851 $tabs['shipping']['class'][] = 'hide_if_live_stream hide_if_video_on_demand hide_if_wpstream_bundle';
2852 $tabs['inventory']['class'][] = 'show_if_live_stream show_if_video_on_demand show_if_wpstream_bundle';
2853
2854 return $tabs;
2855 }
2856
2857
2858
2859 /**
2860 * Hide buy now on products if Netflix mode
2861 *
2862 * @since 3.12
2863 */
2864
2865
2866 public function wpstream_hide_buy_now_subscription_mode( $purchaseable_product_wpblog,$product){
2867 $product_id=$product->get_id();
2868
2869 $term_list = wp_get_post_terms($product_id, 'product_type');
2870
2871 $subscription_model = intval( get_option('wpstream_global_sub','')) ;
2872
2873 if($subscription_model==1){ // if we have Neflix mode
2874 if( $term_list[0]->name=='live_stream' || $term_list[0]->name=='video_on_demand' || $term_list[0]->name=='wpstream_bundle' ){
2875 return false;
2876 }
2877 }
2878
2879 return $purchaseable_product_wpblog;
2880 }
2881
2882
2883
2884
2885
2886
2887 /**
2888 * Add custom fields to custom product types
2889 *
2890 * @since 3.0.1
2891 */
2892
2893 public function wpstream_add_custom_general_fields() {
2894
2895
2896 global $woocommerce, $post;
2897 if(function_exists('wcs_user_has_subscription')){
2898 echo '<div class="options_group show_if_subscription">';
2899 woocommerce_wp_select(
2900 array(
2901 'id' => '_subscript_live_event',
2902 'label' => __( 'Is a subscription based live channel ?', 'woocommerce' ),
2903 'options' => array("yes"=>"yes","no"=>"no")
2904 )
2905 );
2906 echo '</div>';
2907 }
2908
2909 echo '<div class="options_group show_if_live_stream" style="border:none;"></div>';
2910 echo '<div class="options_group show_if_video_on_demand">';
2911
2912
2913 $selected='';
2914 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
2915 $selected=esc_html($_GET['new_video_name']);
2916 }
2917 if($selected==''){
2918 $selected= get_post_meta($post->ID,'_movie_url',true);
2919 }
2920 if( !current_user_can('administrator') ){
2921 print '<div style="margin:10px;">'.esc_html('You need to be an administrator in order to assign videos','wpstream').'</div>';
2922 }else{
2923 woocommerce_wp_select(
2924 array(
2925 'id' => '_movie_url',
2926 'label' => __( 'Choose video', 'woocommerce' ),
2927 'options' => $this->main->wpstream_live_connection->wpstream_get_videos(),
2928 'selected'=> true,
2929 'value' => $selected
2930 )
2931 );
2932 }
2933
2934
2935
2936 echo '</div>';
2937
2938 if(function_exists('wcs_user_has_subscription')){
2939 $selected_sub='';
2940 echo '<div class="options_group show_if_video_on_demand show_if_live_stream">';
2941 if( isset( $_GET['wpstream_parent_sub']) && $_GET['wpstream_parent_sub']!='' ){
2942 $selected_sub=esc_html($_GET['wpstream_parent_sub']);
2943 }
2944 if($selected_sub==''){
2945 $selected_sub= get_post_meta($post->ID,'_wpstream_parent_sub',true);
2946 }
2947 woocommerce_wp_select(
2948 array(
2949 'id' => '_wpstream_parent_sub',
2950 'name' => '_wpstream_parent_sub[]',
2951 'label' => __( 'Attach to subscription', 'woocommerce' ),
2952 'options' => $this->wpstream_return_subscriptions_created(),
2953 'selected'=> true,
2954 'value' => $selected_sub,
2955 'custom_attributes' => array('multiple' => 'multiple')
2956 )
2957 );
2958
2959 echo '</div>';
2960
2961 }
2962 }
2963
2964
2965 public function wpstream_return_subscriptions_created(){
2966 $return=array('0'=>'none');
2967
2968 $args = array(
2969 'post_type' => 'product',
2970 'posts_per_page' => -1,
2971 'orderby' => 'title',
2972 'order' => 'ASC',
2973 'tax_query' => array(
2974 'relation' => 'AND',
2975 array(
2976 'taxonomy' => 'product_type',
2977 'field' => 'slug',
2978 'terms' => array( 'subscription'),
2979 )
2980 )
2981 );
2982
2983 $subscriptions = new WP_Query($args);
2984 if($subscriptions->have_posts()):
2985 while ($subscriptions->have_posts()): $subscriptions->the_post();
2986 $return[ get_the_ID() ] = get_the_title();
2987 endwhile;
2988 endif;
2989
2990 wp_reset_postdata();
2991 return $return;
2992
2993 }
2994
2995
2996
2997
2998
2999
3000 /**
3001 * Save custom fields
3002 *
3003 * @since 3.0.1
3004 */
3005
3006 public function wpstream_add_custom_general_fields_save( $post_id ){
3007
3008 $permited_values = array(
3009 '_movie_url',
3010 '_subscript_live_event',
3011 '_wpstream_parent_sub',
3012
3013 );
3014
3015
3016
3017 foreach($_POST as $key=>$value){
3018 update_post_meta( $post_id, 'event_passed', 0 );
3019 if( in_array($key, $permited_values) ){
3020 if( !empty( $_POST[$key] ) ){
3021 $key = sanitize_key($key);
3022 $value = sanitize_text_field($_POST[$key]);
3023
3024 if($key=='_wpstream_parent_sub'){
3025 $value= $_POST[$key];
3026 $value = array_map("sanitize_text_field", $value);
3027
3028 }
3029 update_post_meta( $post_id, $key, $value );
3030 }
3031 }
3032 }
3033 //die();
3034
3035 }
3036
3037 /**
3038 * Add to cart redirect
3039 *
3040 * @since 3.0.1
3041 */
3042
3043 public function wpstream_add_to_cart() {
3044 wc_get_template( 'single-product/add-to-cart/simple.php' );
3045 }
3046
3047
3048 /**
3049 * Replace add to cart button
3050 *
3051 * @since 3.0.1
3052 */
3053 public function replacing_add_to_cart_button( $button, $product ) {
3054 global $product;
3055 $product_type = $product->get_type();
3056
3057 if($product_type==='live_stream' || $product_type=='video_on_demand'){
3058 return $button = '<a class="button" href="'.get_site_url().'/shop/?add-to-cart=' .$product->get_id(). '&quantity=1">' . __( 'Add to Cart', 'woocommerce' ) . '</a>';
3059 }else{
3060 return $button;
3061 }
3062 }
3063
3064
3065 /**
3066 * Admin notices
3067 *
3068 * @since 3.0.1
3069 */
3070 public function wpstream_admin_notice() {
3071 global $pagenow;
3072 global $typenow;
3073
3074 $wpstream_notices = get_option('wpstream_notices');
3075
3076 /*
3077 if ( !in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
3078 if( !is_array($wpstream_notices) ||
3079 !isset($wpstream_notices['wpstream_woo_notice']) ||
3080 ( isset($wpestate_notices['wpstream_woo_notice']) && $wpestate_notices['wpstream_woo_notice']!='yes') ){
3081
3082
3083 print '<div class="notice wpstream_notices notice-error is-dismissible" data-notice-type="wpstream_woo_notice" >
3084 <p>'.__( 'WpStream Pay-Per-View Live Streaming and VOD only works with WooCommerce - Please enable and activate the WooCommerce plugin if you want to monetize your Live Events or Recorded Videos', 'wpstream' ).'</p>
3085 </div>';
3086 }
3087 }
3088 */
3089
3090 if( !in_array ('curl', get_loaded_extensions())) {
3091 print '<div class="notice notice-error is-dismissible">
3092 <p>'.__( 'The php CURL library is not enabled on your server. WpStream plugin needs this library in order to work. Please address this issue with your hosting provider.', 'wpstream' ).'</p>
3093 </div>';
3094 }
3095
3096
3097 $ajax_nonce = wp_create_nonce( "wpstream_notice_nonce" );
3098 print '<input type="hidden" id="wpstream_notice_nonce" value="'.esc_html($ajax_nonce).'"/>';
3099
3100 }
3101
3102 /**
3103 * Get plugin latest update release date from WordPress.org
3104 * @param $plugin_slug
3105 * @param $version
3106 *
3107 * @return bool
3108 */
3109 public function get_plugin_release_date( $plugin_slug, $version = null ) {
3110 $api_url = 'https://api.wordpress.org/plugins/info/1.0/' . $plugin_slug . '.json';
3111 $response = wp_remote_get( $api_url );
3112
3113 if ( is_wp_error( $response ) ) {
3114 return false;
3115 }
3116
3117 $body = wp_remote_retrieve_body( $response );
3118 $data = json_decode( $body, true );
3119
3120 if ( !$data || !isset( $data['versions'] ) ) {
3121 return false;
3122 }
3123
3124 // no version provided, get the latest version
3125 if ( !$version ) {
3126 $version = $data['version'];
3127 }
3128
3129 // check if the version exists in the versions array
3130 if ( !isset( $data['versions'][ $version ] ) ) {
3131 return false;
3132 }
3133
3134 if ( isset( $data['last_updated'] ) ) {
3135 return date('Y-m-d', strtotime( $data['last_updated'] ) );
3136 }
3137
3138 return false;
3139 }
3140
3141 /**
3142 * Adds notice for the WpStream update availability
3143 * when the update is not older than 30 days
3144 */
3145 public function wpstream_plugin_update_available_notice() {
3146 if (!current_user_can('update_plugins')) {
3147 return;
3148 }
3149
3150 $plugin_slug = 'wpstream/wpstream.php';
3151 $update_data = get_site_transient('update_plugins');
3152
3153 if ( is_object( $update_data ) &&
3154 property_exists( $update_data, 'response' ) &&
3155 is_array($update_data->response) &&
3156 key_exists($plugin_slug, $update_data->response)
3157 ) {
3158 $new_version = $update_data->response[$plugin_slug]->new_version;
3159
3160 $release_date = $this->get_plugin_release_date( 'wpstream', $new_version );
3161
3162 if ( $release_date ) {
3163 $days_since_release = ( time() - strtotime( $release_date ) ) / DAY_IN_SECONDS;
3164
3165 // if there's an update newer than 7 days, do not show the notice
3166 if ( $days_since_release < 7 ) {
3167 return;
3168 }
3169 }
3170 $update_url = wp_nonce_url(
3171 self_admin_url('update.php?action=upgrade-plugin&plugin=' . urlencode($plugin_slug)),
3172 'upgrade-plugin_' . $plugin_slug
3173 );
3174
3175 echo '<div class="notice notice-warning is-dismissible">';
3176 echo '<p><strong>' . __('WpStream Plugin Update Available', 'wpstream') . '</strong></p>';
3177 echo '<p>' . sprintf(
3178 __('Version %s is available. Please update to the latest version for new features and security improvements.', 'wpstream'),
3179 '<strong>' . esc_html($new_version) . '</strong>'
3180 ) . '</p>';
3181 echo '<p><a href="' . esc_url($update_url) . '" class="button button-primary">' .
3182 __('Update Now', 'wpstream') . '</a></p>';
3183 echo '</div>';
3184 }
3185 }
3186
3187 /**
3188 * Admin notices
3189 *
3190 * @since 3.0.1
3191 */
3192 public function wpstream_update_cache_notice(){
3193
3194 //check_ajax_referer( 'wpstream_notice_nonce', 'security' );
3195
3196 $notice_type = esc_html($_POST['notice_type']);
3197 $notices = get_option('wp_stream_notices');
3198
3199 if(! is_array($notices) ){
3200 $notices=array();
3201 }
3202
3203 $notices[$notice_type]='yes';
3204
3205 update_option('wpstream_notices',$notices);
3206 die();
3207 }
3208
3209
3210
3211
3212 /**
3213 * Activate metaboxes for Streaming controls on sidebar
3214 *
3215 * @since 3.0.1
3216 */
3217 public function wpstream_startstreaming_sidebar_meta() {
3218 global $post;
3219 $term_list = wp_get_post_terms($post->ID, 'product_type');
3220
3221 add_meta_box(
3222 'wpstream-sidebar-meta',
3223 esc_html__('Live Streaming', 'wpstream'),
3224 array($this,'wpstream_start_stream_meta'),
3225 'wpstream_product',
3226 'side',
3227 'high'
3228 );
3229
3230 $is_subscription_live_event = esc_html(get_post_meta($post->ID,'_subscript_live_event',true));
3231 if(!is_wp_error( $term_list )){
3232 if( isset($term_list[0]->name) ){
3233 if( $term_list[0]->name=='live_stream' || ($term_list[0]->name=='subscription' && $is_subscription_live_event=='yes' ) ){
3234 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'product', 'side', 'high');
3235 }
3236 }
3237 }
3238
3239 }
3240
3241 /**
3242 * edited 4.0
3243 *
3244 * Show Streaming controls on sidebar
3245 *
3246 * @since 3.0.1
3247 */
3248 public function wpstream_start_stream_meta(){
3249 global $live_event_for_user;
3250 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
3251
3252 global $post;
3253 $local_event_options = get_post_meta ($post->ID,'local_event_options','');
3254
3255
3256
3257 if( get_post_status( $post->ID ) === 'publish' ) {
3258 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
3259 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
3260 $pack_details = $this->main->quota_manager->get_live_quota_data('wpstream_start_stream_meta');
3261 if( isset($pack_details['available_data_mb'])){
3262 if ($pack_details['available_data_mb'] <= 0){
3263 print '<input type="hidden" id="wpstream_basic_streaming" value="true">';
3264 }
3265 }
3266
3267 $this->wpstream_live_stream_unit($post->ID);
3268 print '<div class="wpstream_modal_background"></div>';
3269 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er1</div>
3270 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
3271 </div>';
3272 } else {
3273 esc_html_e('To Go Live, please publish your channel first !','wpstream');
3274 }
3275 }
3276
3277
3278 public function wpstream_is_basic_streaming_mode(){
3279 $pack_details = $this->main->quota_manager->get_live_quota_data('wpstream_is_basic_streaming_mode');
3280 if( isset($pack_details['available_data_mb'] ) ) {
3281 if ( $pack_details['available_data_mb'] <= 0 ){
3282 return true;
3283 }
3284 }
3285 return false;
3286 }
3287
3288
3289
3290 /**
3291 *
3292 *
3293 *
3294 */
3295 public function add_dashboard_page() {
3296 add_dashboard_page( '', '', 'administrator', 'wpstream-onboarding', '' );
3297 }
3298
3299
3300
3301
3302
3303 public function wpstream_load_onboarding_wizard() {
3304
3305 // Check for wizard-specific parameter
3306 // Allow plugins to disable the onboarding wizard
3307 // Check if current user is allowed to save settings.
3308
3309
3310 // Don't load the interface if doing an ajax call.
3311 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
3312 return;
3313 }
3314
3315 set_current_screen();
3316
3317 // Remove an action in the Gutenberg plugin ( not core Gutenberg ) which throws an error.
3318 remove_action( 'admin_print_styles', 'gutenberg_block_editor_admin_print_styles' );
3319
3320 $this->actual_load_onboarding_wizard();
3321
3322 }
3323
3324
3325 /*
3326 * Add on boarding to footer
3327 */
3328
3329
3330
3331 public function wpstream_admin_footer_onboarding(){
3332 if( isset($_GET['page']) && $_GET['page']==='wpstream_onboard') {
3333 $this->wpstream_onboard_display();
3334 }
3335 }
3336
3337
3338 /*
3339 * On Board Display
3340 *
3341 */
3342
3343 public function wpstream_pre_onboard_display(){
3344 $pack_details = $this->main->quota_manager->get_live_quota_data( 'wpstream_pre_onboard_display' );
3345 $this->main->show_user_data($pack_details);
3346
3347 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/logo_onboarding.svg';
3348 ?>
3349 <div id="wpstream-onboarding-root"></div>
3350 <div class="wpstream_quick_start_wrapper">
3351 <img class="wpstream_onboarding_logo" src="<?php echo esc_url($thumb); ?>" />
3352
3353 <h1><?php print esc_html__('WpStream','wpstream').' <span class="header_special">'.esc_html__('Quick Start','wpstream').'</span>';?></h1>
3354
3355
3356 <p>
3357 <?php esc_html_e('The quick start guide will help you set up Live Streaming, Video On Demand, and Monetization in a fun and interactive way. Give it a shot! ','wpstream');?>
3358 </p>
3359
3360 <div id="wpstream_trigger_quick_start" class="wpstream_button wpstream_button_action"><?php esc_html_e('Start the Guide','wpstream');?></div>
3361
3362
3363
3364 </div>
3365
3366
3367
3368 <script type="text/javascript">
3369 //<![CDATA[
3370 jQuery(document).ready(function(){
3371 jQuery(".wpstream_on_boarding_wrapper").show();
3372 jQuery(".wpstream_modal_background_onboard").show();
3373 });
3374
3375 //]]>
3376 </script>
3377
3378 <?php
3379
3380 }
3381
3382
3383
3384
3385
3386
3387
3388
3389 /*
3390 *
3391 * On Boarding Content
3392 *
3393 */
3394
3395
3396 public function wpstream_onboard_display() {
3397 $this->onboarding_wizard_header();
3398 $this->wpstream_onboarding_step1();
3399 $this->wpstream_onboarding_step2();
3400 $this->wpstream_onboarding_step3_live_streaming();
3401 $this->wpstream_onboarding_step_3_A_live_streaming_free_view();
3402 $this->wpstream_onboarding_step_3_B_live_streaming_pay_per_view();
3403 $this->wpstream_onboarding_step4_vod();
3404 $this->wpstream_onboarding_step_4_free_vod();
3405 $this->wpstream_onboarding_step_4_ppv_vod();
3406 $this->onboarding_wizard_footer();
3407 }
3408
3409
3410 /*
3411 *
3412 * On Boarding Step 1 - the login/register
3413 *
3414 */
3415
3416
3417 public function wpstream_onboarding_step1(){
3418
3419 $wpstream_options_array =array(
3420 2 => array(
3421 'label' => 'WpStream.net Username or Email',
3422 'name' => 'api_username',
3423 'type' => 'text',
3424 ),
3425 3 => array(
3426 'label' => 'WpStream.net Password',
3427 'name' => 'api_password',
3428 'type' => 'password',
3429 ),
3430
3431 );
3432 $token = $this->main->wpstream_live_connection->wpstream_get_token();
3433
3434 ?>
3435 <div class="wpstream_step_wrapper wpstream_step_1" id="wpstream_step_1">
3436 <div class="wpstream_has_credential">
3437 <h1><?php esc_html_e('WpStream Account','wpstream');?></h1>
3438
3439 <div class="wpstream_on_board_login_wrapper_explanations">
3440 <?php esc_html_e('A WpStream account is required to make use of the plugin.','wpstream');?>
3441 </div>
3442
3443
3444 <div class="wpstream_check_account_status">
3445 <?php esc_html_e( 'Checking if you are already logged.....', 'wpstream' ); ?>
3446 </div>
3447
3448 <div class="wpstream_onboarding_notification"></div>
3449
3450 <div class="wpstream_option_wrapper wpstream_on_board_login_wrapper">
3451 <h2><?php esc_html_e('Login with your WpStream Account','wpstream');?></h2>
3452 <?php
3453
3454 foreach ($wpstream_options_array as $key=>$option){
3455 print '<div class="wpstream_option">';
3456
3457 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
3458 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
3459 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
3460
3461 print '</div>';
3462 }
3463 ?>
3464 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_login" value="<?php esc_html_e('Login','wpstream');?>" />
3465 </div>
3466
3467
3468
3469
3470 <div class="wpstream_on_board_register_wrapper">
3471 <h2><?php esc_html_e('Register for a WpStream Account','wpstream');?></h2>
3472 <div class="wpstream_option">
3473 <label for="wpstream_register_email"><?php esc_html_e('Your Email','wpstream');?></label>
3474 <input id="wpstream_register_email" type="text" size="36" name="wpstream_register_email" value="<?php echo get_option('admin_email'); ?>" />
3475
3476 </div>
3477
3478 <div class="wpstream_option">
3479 <!-- <label for="wpstream_register_password">--><?php //esc_html_e('Your Password','wpstream');?><!--</label>-->
3480 <input id="wpstream_register_password" hidden type="text" size="36" name="wpstream_register_password" value="<?php echo $this->randomPassword();?>" />
3481 <span class="" ><?php esc_html_e('We\'ll send the password to the email you attached. ', 'wpstream') ?></span>
3482 </div>
3483
3484
3485 <!-- Altcha Widget (requires HTTPS/secure context) -->
3486 <?php if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ) : ?>
3487 <script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>
3488 <div class="wpstream_option" style="display:none;">
3489 <altcha-widget
3490 challengeurl="<?php echo esc_url( WPSTREAM_API . '/v2/user/getcaptcha' ); ?>"
3491 name="altcha"
3492 auto="onload"
3493 hidefooter
3494 hidelogo
3495 strings='{"label": "<?php esc_html_e('I am not a robot', 'wpstream'); ?>", "error": "<?php esc_html_e('Verification failed', 'wpstream'); ?>", "wait": "<?php esc_html_e('Verifying...', 'wpstream'); ?>"}'
3496 ></altcha-widget>
3497 </div>
3498 <?php endif; ?>
3499
3500 <div class="wpstream_option wpstream_terms_agreement">
3501 <!-- Add "by registering you agree to the privacy terms" checkbox-->
3502 <input id="wpstream_register_privacy" type="checkbox" name="wpstream_register_privacy" />
3503 <label for="wpstream_register_privacy">
3504 <?php printf(
3505 esc_html__('By registering you agree to the %sPrivacy Policy%s','wpstream'),
3506 '<a href="https://wpstream.net/privacy-policy/" target="_blank">',
3507 '</a>'
3508 );?>
3509 </label>
3510 </div>
3511 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_register" value="<?php esc_html_e('register','wpstream');?>" />
3512 </div>
3513
3514
3515 <div id="wpstream_onboarding_action_login"><?php esc_html_e('I already have a WpStream Account','wpstream');?></div>
3516
3517 <div id="wpstream_onboarding_action_register"><?php esc_html_e('Back to Registration','wpstream');?></div>
3518
3519 </div>
3520
3521
3522 <?php
3523 $ajax_nonce = wp_create_nonce( "wpstream_onboarding_nonce");
3524 print'<input type="hidden" id="wpstream_onboarding_nonce" value="'.esc_html($ajax_nonce).'" /> ';
3525
3526 ?>
3527
3528
3529 <div id="wpstream_on_board" class="wpstream_action_next_step" data-nextthing="wpstream_step_2" style="display:none;" >Move to step 2</div>
3530 </div>
3531 <?php
3532
3533 if( !is_null( $token ) && trim( $token ) !== '' ) {
3534 print '<div id="wpstream_have_token"></div>';
3535 }
3536 }
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547 /*
3548 *
3549 * Generate random pass
3550 *
3551 */
3552
3553 public function randomPassword() {
3554 $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
3555 $pass = array(); //remember to declare $pass as an array
3556 $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
3557 for ($i = 0; $i < 16; $i++) {
3558 $n = random_int(0, $alphaLength);
3559 $pass[] = $alphabet[$n];
3560 }
3561 return implode($pass); //turn the array into a string
3562 }
3563
3564
3565 /*
3566 *
3567 *
3568 *
3569 */
3570
3571 public function wpstream_onboarding_step2(){
3572 ?>
3573
3574 <div class="wpstream_step_wrapper wpstream_step_2" id="wpstream_step_2">
3575 <h1>Welcome to <span class="header_special">WpStream</span>! How would you like to start?</h1>
3576
3577 <div class="wpstream_accordion_header wpstream_action_next_step" data-nextthing="wpstream_step_3a" ><?php esc_html_e('Go LIVE!','wpstream');?></div>
3578 <div class="wpstram_or">or</div>
3579 <div class="wpstream_accordion_header wpstream_action_next_step wpstream_step_2_create_vod" data-nextthing="wpstream_step_4a" ><?php esc_html_e('Create a Video-On-Demand (VOD)','wpstream');?></div>
3580
3581 </div>
3582
3583
3584 <?php
3585 }
3586
3587 /*
3588 *
3589 *
3590 *
3591 */
3592
3593 public function wpstream_onboarding_step3_live_streaming(){
3594 ?>
3595
3596 <div class="wpstream_step_wrapper wpstream_step_3 wpstream_onboarding_live" id="wpstream_step_3">
3597 <h1><?php esc_html_e('Do you want to charge a fee for watching?','wpstream'); ?></h1>
3598
3599 <div class="wpstream_accordion_header wpstream_action_next_step wpstream_step_3a" data-nextthing="wpstream_step_3a"><?php esc_html_e('No - Free-To-View (FTV)','wpstream');?></div>
3600 <div class="wpstram_or">or</div>
3601 <div class="wpstream_accordion_header wpstream_action_next_step" data-nextthing="wpstream_step_3b" ><?php esc_html_e('Yes - Pay-Per-View (PPV)','wpstream');?></div>
3602
3603 <div class="wpstream_initial_onboarding_controls_wrapper">
3604 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3605 </div>
3606
3607 </div>
3608
3609
3610 <?php
3611 }
3612
3613
3614 /*
3615 *
3616 *
3617 *
3618 */
3619 public function wpstream_onboarding_step_3_A_live_streaming_free_view(){
3620 ?>
3621
3622 <div class="wpstream_step_wrapper wpstream_step_3a wpstream_onboarding_live" id="wpstream_step_3a">
3623 <h1><?php esc_html_e('Let’s create your first FTV live channel','wpstream');?></h1>
3624
3625 <div id="wpstream_onboard_live_notice" class="wpstream_onboarding_notification"></div>
3626 <div id="wpstream_onboard_live" class="wpstream_accordion_container">
3627 <label>Name your first Free-To-View channel</label>
3628 <input type="text" name="channel_name" id="wpstream_onboarding_channel_name" class="wpstream_onboarding_channel_name" value="<?php esc_html_e('My first FTV channel','wpstream');?>" >
3629 <input type="submit" name="submit" id="wpstream_on_board_create_channel" class="wpstream_button wpstream_button_action wpstream_onboard_live_action" value="<?php esc_html_e('Create Channel','wpstream');?>" />
3630
3631 </div>
3632
3633 <div class="wpstream_initial_onboarding_controls_wrapper">
3634 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3635 </div>
3636
3637 </div>
3638
3639
3640 <?php
3641 }
3642
3643
3644 /*
3645 *
3646 *
3647 *
3648 */
3649
3650 public function wpstream_onboarding_step_3_B_live_streaming_pay_per_view(){
3651 ?>
3652
3653 <div class="wpstream_step_wrapper wpstream_step_3b wpstream_onboarding_live" id="wpstream_step_3b">
3654 <h1><?php esc_html_e('Make your live stream Pay Per View','wpstream');?></h1>
3655 <?php
3656 if ( class_exists( 'WooCommerce' ) ) {
3657 ?>
3658 <div id="wpstream_onboard_live_ppv_notice" class="wpstream_onboarding_notification"></div>
3659 <div id="wpstream_onboard_live_ppv" class="wpstream_accordion_container">
3660 <label><?php esc_html_e('Choose a name for your channel','wpstream');?></label>
3661 <input type="text" name="channel_name" id="wpstream_onboarding_channel_name_ppv" class="wpstream_onboarding_channel_name" value="<?php esc_html_e('My First PPV Channel','wpstream');?>">
3662 <label><?php esc_html_e('Pay-Per-View Price ($)','wpstream');?></label>
3663 <input type="text" name="channel_name" id="wpstream_onboarding_event_price_ppv" class="wpstream_onboarding_event_price" value="10">
3664 <input type="submit" name="submit" id="wpstream_onboard_live_ppv_action" class="wpstream_button wpstream_button_action wpstream_onboard_live_ppv_action" value="<?php esc_html_e('Create Channel','wpstream');?>" />
3665
3666 </div>
3667 <?php
3668 } else {
3669 $this->wpstream_onboarding_woo_warning();
3670 } ?>
3671
3672
3673 <div class="wpstream_initial_onboarding_controls_wrapper">
3674 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3675 </div>
3676 </div>
3677 <?php
3678 }
3679
3680
3681
3682
3683
3684
3685 /*
3686 * WooCommerce not installed Warning
3687 *
3688 *
3689 */
3690
3691 public function wpstream_onboarding_woo_warning(){
3692 print'<div class="wpstream_warning_onboarding">
3693 '.esc_html__('Pay-Per-View streaming requires WooCommerce. Please install the WooCommerce plugin and try again.','wpstream').'
3694 </br>
3695 <div class="wpstream_install_plugin">'. esc_html__('Install WooCommerce','wpstream').'</div>
3696
3697 <div class="wpstream_onboarding_tryagain">'.esc_html__('Try Again','wpstream').'</div>
3698 </div>';
3699 }
3700
3701
3702 /*
3703 *
3704 *
3705 *
3706 */
3707
3708 public function wpstream_onboarding_step4_vod(){
3709 ?>
3710 <div class="wpstream_step_wrapper wpstream_step_4 wpstream_onboarding_vod" id="wpstream_step_4">
3711 <h1><?php esc_html_e('Do you want to charge a fee for watching?','wpstream');?></h1>
3712
3713 <div class="wpstream_accordion_header wpstream_action_next_step wpstream_step_4a" data-control="wpstream_onboard_vod_free" data-nextthing="wpstream_step_4a" ><?php esc_html_e('No - Free-To-View (FTV)','wpstream'); ?></div>
3714 <div class="wpstram_or">or</div>
3715 <input type="hidden" id="wpstream_onboarding_video_list_nonce" value="<?php echo wp_create_nonce( "wpstream_onboarding_video_list_nonce" ); ?>">
3716 <div class="wpstream_accordion_header wpstream_action_next_step wpstream_step_4b" data-control="wpstream_onboard_vod_ppv" data-nextthing="wpstream_step_4b" ><?php esc_html_e('Yes - Pay-Per-View (PPV)','wpstream'); ?></div>
3717 <div class="wpstream_initial_onboarding_controls_wrapper">
3718 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3719 </div>
3720
3721 </div>
3722 <?php
3723 }
3724
3725
3726 /*
3727 *
3728 *
3729 *
3730 */
3731 public function wpstream_onboarding_step_4_free_vod(){
3732
3733 $current_screen=get_current_screen();
3734 if($current_screen->base !=='wpstream_page_wpstream_onboard'){
3735 return;
3736 }
3737 ?>
3738
3739 <div class="wpstream_step_wrapper wpstream_step_4a wpstream_onboarding_live" id="wpstream_step_4a">
3740 <h1><?php esc_html_e('Let’s create your first Free-To-View VOD','wpstream');?></h1>
3741 <div id="wpstream_onboard_vod_free_notice" class="wpstream_onboarding_notification"></div>
3742 <div id="wpstream_onboard_vod_free" class="wpstream_accordion_container">
3743 <div class="spinner"></div>
3744 <div class="wpstream-step-container" style="display: none">
3745 <label><?php esc_html_e('Name your FTV Video-On-Demand','wpstream')?></label>
3746 <input type="text" name="channel_name" class="wpstream_onboarding_vod_name" id="wpstream_onboarding_vod_name" value="<?php esc_html_e('My First FTV VOD','wpstream');?>" >
3747 <div id="wpstream_free_vod_dropdown_videos_list"></div>
3748 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_vod_free_action" id="wpstream_onboard_vod_free_action" value="Create FTV VOD">
3749 </div>
3750 </div>
3751 <?php $this->wpstream_obboarding_file_warning(); ?>
3752
3753 <div class="wpstream_initial_onboarding_controls_wrapper">
3754 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_4"><?php esc_html_e('Prev','wpstream');?></span>
3755 </div>
3756
3757 </div>
3758
3759
3760 <?php
3761 }
3762
3763 /*
3764 *
3765 *
3766 *
3767 */
3768 public function wpstream_obboarding_file_warning(){
3769 print '<div class="wpstream_warning_onboarding" style="display: none">
3770 '.esc_html__('A recording is needed to create a VOD from. There are no recordings under your account. You can create new recordings by recording a live channel or uploading video files directly.','wpstream').'
3771 </br>
3772 <div class="wpstream_upload_video">'.esc_html__('Upload Video','wpstream').'</div>
3773
3774 <div class="wpstream_onboarding_tryagain">'.esc_html__('Try Again','wpstream').'</div>
3775 </div>';
3776 }
3777
3778 /*
3779 *
3780 *
3781 *
3782 */
3783 public function wpstream_onboarding_step_4_ppv_vod(){
3784 $current_screen=get_current_screen();
3785
3786 if($current_screen->base !=='wpstream_page_wpstream_onboard'){
3787 return;
3788 }
3789 ?>
3790
3791 <div class="wpstream_step_wrapper wpstream_step_4b wpstream_onboarding_live" id="wpstream_step_4b">
3792 <h1><?php esc_html_e('Let\'s create your first Pay-Per-View VOD','wpstream');?></h1>
3793
3794 <div id="wpstream_onboard_vod_ppv_notice" class="wpstream_onboarding_notification"></div>
3795 <?php
3796 if ( class_exists( 'WooCommerce' ) ) { ?>
3797 <div id="wpstream_onboard_vod_ppv" class="wpstream_accordion_container">
3798 <div class="spinner"></div>
3799 <div class="wpstream-step-container" style="display: none">
3800 <label><?php esc_html_e('Name your PPV Video-On-Demand','wpstream'); ?></label>
3801 <input type="text" name="channel_name" class="wpstream_onboarding_ppv_vod_name" id="wpstream_onboarding_ppv_vod_name" value="<?php esc_html_e('My First PPV VOD','wpstream');?>">
3802 <div id="wpstream_ppv_vod_dropdown_videos_list"></div>
3803 <label><?php esc_html_e('Pay-Per-View Price','wpstream');?></label>
3804 <input type="text" name="channel_name" class="wpstream_onboarding_vod_price" id="wpstream_onboarding_vod_price" value="10">
3805 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_vod_ppv_action" id="wpstream_onboard_vod_ppv_action" value="<?php esc_html_e('Create PPV VOD','wpstream');?>" />
3806 </div>
3807 </div>
3808 <?php $this->wpstream_obboarding_file_warning(); ?>
3809 <?php } else {
3810 $this->wpstream_onboarding_woo_warning();
3811 } ?>
3812 <div class="wpstream_initial_onboarding_controls_wrapper">
3813 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_4"><?php esc_html_e('Prev','wpstream');?></span>
3814 </div>
3815 </div>
3816 <?php
3817 }
3818
3819
3820
3821
3822 /*
3823 *
3824 * On boarding Header
3825 *
3826 */
3827 public function onboarding_wizard_header() {
3828 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/logo_onboarding.svg';
3829 ?>
3830
3831 <div class="wpstream_on_boarding_wrapper">
3832 <div class="wpstream_close_onboarding wpstream_close_initial_onboarding"></div>
3833 <img class="wpstream_onboarding_logo" src="<?php echo esc_url($thumb); ?>" />
3834 <div class="wpstream_close_onboarding_warning"></div>
3835
3836 <?php
3837 }
3838
3839
3840
3841
3842
3843 /*
3844 *
3845 * On Boarding Footer
3846 *
3847 */
3848 public function onboarding_wizard_footer() {
3849 ?>
3850 </div>
3851 <div class="wpstream_modal_background_onboard"></div>
3852 <?php
3853 }
3854
3855
3856
3857 /*
3858 *
3859 * On Boarding create PPV channel
3860 *
3861 */
3862
3863
3864 public function wpstream_on_board_create_channel_ppv(){
3865 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3866 $current_user = wp_get_current_user();
3867
3868 if(current_user_can('administrator')){
3869 $channel_name = sanitize_text_field($_POST['channel_name']);
3870 $channel_price = floatval($_POST['channel_price']);
3871 $my_post = array(
3872 'post_title' => $channel_name,
3873 'post_content' => '',
3874 'post_status' => 'publish',
3875 'post_type' => 'product',
3876 'post_author' => $current_user->ID
3877 );
3878
3879 // Insert the post into the database
3880 $post_id = wp_insert_post( $my_post );
3881
3882 if(is_wp_error($post_id)){
3883 $logger = new WPStream_Logger();
3884 $log_entry = new WpStream_Log_Entry([
3885 'type' => 'error',
3886 'description' => 'Couldn\'t create channel during onboarding because of error: ' . $post_id->get_error_message(),
3887 ]);
3888 $logger->add( $log_entry );
3889 echo json_encode( array('succes'=>false) );
3890 }else{
3891
3892 $product = wc_get_product($post_id);
3893 $price = wc_format_decimal($channel_price);
3894
3895 $product = wc_get_product( $post_id );
3896 $product->set_price( $price );
3897 $product->set_regular_price( $price ); // To be sure
3898 $product->save();
3899 update_post_meta ($post_id,'event_passed',0);
3900 wp_set_object_terms( $post_id, 'live_stream', 'product_type' );
3901
3902
3903
3904
3905 $permalink = get_edit_post_link($post_id);
3906
3907 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3908 $permalink= add_query_arg( 'branch', '2', $permalink );
3909
3910
3911 echo json_encode( array(
3912 'success'=> true,
3913 'link' => ($permalink)
3914 ));
3915 }
3916
3917 }
3918 die();
3919 }
3920
3921 /*
3922 *
3923 * On Boarding create channel
3924 *
3925 */
3926
3927
3928 public function wpstream_on_board_create_channel(){
3929 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3930 $current_user = wp_get_current_user();
3931
3932 if(current_user_can('administrator')){
3933 $channel_name=sanitize_text_field($_POST['channel_name']);
3934 $my_post = array(
3935 'post_title' => $channel_name,
3936 'post_content' => '',
3937 'post_status' => 'publish',
3938 'post_type' => 'wpstream_product',
3939 'post_author' => $current_user->ID
3940 );
3941
3942 // Insert the post into the database
3943 $post_id = wp_insert_post( $my_post );
3944
3945 if( is_wp_error( $post_id ) ) {
3946 $logger = new WPStream_Logger();
3947 $log_entry = new WpStream_Log_Entry([
3948 'type' => 'error',
3949 'description' => 'Couldn\'t create channel during onboarding because of error: ' . $post_id->get_error_message(),
3950 ]);
3951 $logger->add( $log_entry );
3952 echo json_encode( array('succes'=>false) );
3953 } else {
3954 $permalink = get_edit_post_link($post_id);
3955
3956 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3957 $permalink= add_query_arg( 'branch', '1', $permalink );
3958
3959 echo json_encode( array(
3960 'success'=> true,
3961 'link' => ($permalink)
3962 ));
3963 }
3964 }
3965 die();
3966 }
3967
3968 /*
3969 *
3970 * On Boarding create free vod
3971 *
3972 */
3973 public function wpstream_on_board_create_free_vod(){
3974 $current_user = wp_get_current_user();
3975 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3976 if(current_user_can('administrator')){
3977 $channel_name =sanitize_text_field($_POST['channel_name']);
3978 $file_name =sanitize_text_field($_POST['file_name']);
3979 $my_post = array(
3980 'post_title' => $channel_name,
3981 'post_content' => '',
3982 'post_status' => 'publish',
3983 'post_type' => 'wpstream_product_vod',
3984 'post_author' => $current_user->ID
3985 );
3986
3987 // Insert the post into the database
3988 $post_id = wp_insert_post( $my_post );
3989
3990 if(is_wp_error($post_id)){
3991 $logger = new WPStream_Logger();
3992 $log_entry = new WpStream_Log_Entry([
3993 'type' => 'error',
3994 'description' => 'Couldn\'t create free VOD during onboarding because of error: ' . $post_id->get_error_message(),
3995 ]);
3996 $logger->add( $log_entry );
3997 echo json_encode( array('succes'=>false) );
3998 }else{
3999 update_post_meta($post_id, 'wpstream_product_type', 2);
4000 update_post_meta($post_id, 'wpstream_free_video', $file_name);
4001
4002
4003 $permalink = get_edit_post_link($post_id);
4004
4005 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
4006 $permalink= add_query_arg( 'branch', '3', $permalink );
4007
4008
4009 echo json_encode( array(
4010 'success'=> true,
4011 'link' => ($permalink)
4012 ));
4013 }
4014
4015 }
4016 die();
4017 }
4018
4019
4020 /*
4021 *
4022 * On Boarding create ppv vod
4023 *
4024 */
4025
4026
4027 public function wpstream_on_board_create_ppv_vod(){
4028 $current_user = wp_get_current_user();
4029 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
4030
4031 if(current_user_can('administrator')){
4032 $channel_name = sanitize_text_field($_POST['channel_name']);
4033 $vod_price = floatval($_POST['vod_price']);
4034 $file_name = sanitize_text_field($_POST['file_name']);
4035
4036 $my_post = array(
4037 'post_title' => $channel_name,
4038 'post_content' => '',
4039 'post_status' => 'publish',
4040 'post_type' => 'product',
4041 'post_author' => $current_user->ID
4042 );
4043
4044 // Insert the post into the database
4045 $post_id = wp_insert_post( $my_post );
4046
4047 if( is_wp_error( $post_id ) ) {
4048 $logger = new WPStream_Logger();
4049 $log_entry = new WpStream_Log_Entry([
4050 'type' => 'error',
4051 'description' => 'Couldn\'t create PPV VOD during onboarding because of error: ' . $post_id->get_error_message(),
4052 ]);
4053 $logger->add( $log_entry );
4054 echo json_encode( array('succes'=>false) );
4055 } else {
4056
4057 $product = wc_get_product($post_id);
4058 $price = wc_format_decimal($vod_price);
4059
4060 $product = wc_get_product( $post_id );
4061 $product->set_price( $price );
4062 $product->set_regular_price( $price ); // To be sure
4063 $product->save();
4064 update_post_meta ($post_id,'event_passed',0);
4065 update_post_meta ($post_id,'_movie_url', $file_name);
4066 wp_set_object_terms( $post_id, 'video_on_demand', 'product_type' );
4067
4068
4069
4070
4071 $permalink = get_edit_post_link($post_id);
4072
4073 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
4074 $permalink= add_query_arg( 'branch', '4', $permalink );
4075
4076
4077 echo json_encode( array(
4078 'success'=> true,
4079 'link' => ($permalink) ,
4080 ' $file_name'=> $file_name,
4081 ));
4082 }
4083
4084 }
4085 die();
4086 }
4087
4088
4089 /*
4090 *
4091 * On Boarding login
4092 *
4093 */
4094 public function wpstream_on_board_login(){
4095 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
4096
4097 if(current_user_can('administrator')){
4098 $username = sanitize_text_field($_POST['api_username']);
4099 $password = $_POST['api_password'];
4100 update_option('wpstream_api_username',$username);
4101 update_option('wpstream_api_password',$password);
4102
4103 delete_transient( 'wpstream_token_api' );
4104
4105 $token = $this->main->wpstream_live_connection->wpstream_get_token();
4106 $videos_list = $this->main->wpstream_live_connection->wpstream_get_videos();
4107 // cleanup any previous echo before sending json
4108 ob_end_clean();
4109 // !DO NOT SEND TOKEN TO THE CLIENT!
4110 if ($token){
4111 echo json_encode( array(
4112 'success'=> true
4113 ));
4114 }
4115 else {
4116 $text = get_option('wpstream_curl_failed') ?
4117 'Login failed with critical error: ' . get_option('wpstream_curl_failed') :
4118 'Wrong username or password!';
4119 echo json_encode( array(
4120 'success'=> false,
4121 'error' => $text,
4122 ));
4123 }
4124
4125 }else{
4126 echo json_encode( array(
4127 'success'=> false,
4128 'token' => esc_html('You are not an administrator','wpstream')
4129 ));
4130 }
4131 die();
4132 }
4133
4134
4135 public function wpstream_register_refresh_capthca(){
4136
4137 if(current_user_can('administrator')){
4138
4139 }
4140 }
4141
4142 /**
4143 * AJAX proxy: fetch a captcha challenge from the baker API and return it.
4144 * Used on HTTP sites where the Altcha widget cannot run (requires Web Crypto / HTTPS).
4145 * The JS side solves the PoW locally and sends back the full base64 Altcha payload.
4146 */
4147 public function wpstream_get_captcha_challenge() {
4148 $api_url = WPSTREAM_API . '/v2/user/getcaptcha';
4149 $response = wp_remote_get( $api_url, array( 'timeout' => 10 ) );
4150
4151 if ( is_wp_error( $response ) ) {
4152 echo json_encode( array( 'success' => false, 'error' => 'Could not reach captcha service.' ) );
4153 die();
4154 }
4155
4156 $body = wp_remote_retrieve_body( $response );
4157 // Forward the challenge JSON directly to the browser
4158 header( 'Content-Type: application/json' );
4159 echo $body;
4160 die();
4161 }
4162
4163 /**
4164 * @param $challenge
4165 * @param $difficulty
4166 *
4167 * @return int|null
4168 */
4169 private function solve_pow( $challenge, $difficulty ) {
4170 $nonce = 0;
4171 $target = str_repeat( "0", $difficulty );
4172
4173 while ( $nonce < 5000000 ) {
4174 $hash = hash( 'sha256', $challenge . $nonce );
4175 if ( strpos( $hash, $target ) === 0 ) {
4176 return $nonce;
4177 }
4178 $nonce++;
4179 }
4180 return null; // Return null if no solution is found within the max attempts
4181 }
4182
4183 /*
4184 *
4185 * On Boarding login
4186 *
4187 */
4188 public function wpstream_on_board_register(){
4189 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
4190 if(current_user_can('administrator')){
4191 $wpstream_register_email = sanitize_text_field($_POST['wpstream_register_email']);
4192 $wpstream_register_password = $_POST['wpstream_register_password'];
4193
4194 $validate = $this->wpstream_validate_onboard_register($wpstream_register_email,$wpstream_register_password);
4195 if(!$validate['success']){
4196 // cleanup any previous echo before sending json
4197 ob_end_clean();
4198 echo json_encode($validate);
4199 die();
4200 }
4201
4202 $wpstream_altcha = isset($_POST['wpstream_altcha']) ? trim( $_POST['wpstream_altcha'] ) : '';
4203 $is_https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off';
4204
4205 if ( empty($wpstream_altcha) ) {
4206 if ( $is_https ) {
4207 $message = esc_html__('Captcha verification failed. Please try again.', 'wpstream');
4208 } else {
4209 $message = esc_html__('Security check not ready yet. Please wait a moment and try again.', 'wpstream');
4210 }
4211 echo json_encode( array( 'success' => false, 'message' => $message ) );
4212 die();
4213 }
4214
4215 $url='v2/user/create';
4216 $curl_post_fields=array(
4217 'email' => $wpstream_register_email,
4218 'password' => $wpstream_register_password,
4219 'solution' => $wpstream_altcha,
4220 'captcha_id' => '',
4221 );
4222
4223 $curl_response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url,$curl_post_fields,true);
4224 $curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
4225
4226 if($curl_response_decoded['success']){
4227
4228 if($curl_response_decoded['request']['registred']){
4229 // we are registerd
4230
4231 update_option('wpstream_api_username',$wpstream_register_email);
4232 update_option('wpstream_api_password',$wpstream_register_password);
4233
4234 $token = $this->main->wpstream_live_connection->wpstream_get_token();
4235
4236 // cleanup any previous echo before sending json
4237 ob_end_clean();
4238 echo json_encode( array(
4239 'success' => true,
4240 'token' => $token ,
4241 'message' => esc_html__('Your Account was created. Please stand by...','wpstream'),
4242
4243 ));
4244 die();
4245 }else{
4246
4247 // cleanup any previous echo before sending json
4248 ob_end_clean();
4249 echo json_encode( array(
4250 'success'=> false,
4251 'message'=> $curl_response_decoded['request']['message'],
4252 'curl'=>$curl_response_decoded,
4253
4254 ));
4255 die();
4256 }
4257
4258
4259
4260
4261 }else{
4262 // cleanup any previous echo before sending json
4263 ob_end_clean();
4264 echo json_encode( array(
4265 'success'=> false,
4266 'message'=> esc_html__('Registration could not be completed. Please try again or register on wpstream.net','wpstream'),
4267
4268 ));
4269 die();
4270 }
4271
4272
4273
4274
4275
4276
4277
4278
4279 }else{
4280 // cleanup any previous echo before sending json
4281 ob_end_clean();
4282 echo json_encode( array(
4283 'success'=> false,
4284 'message' => esc_html('You are not an administrator','wpstream')
4285 ));
4286 die();
4287 }
4288
4289 die();
4290 }
4291
4292
4293 /*
4294 *
4295 * Validate for register
4296 *
4297 */
4298
4299
4300 public function wpstream_validate_onboard_register($wpstream_register_email,$wpstream_register_password){
4301
4302 $return= array(
4303 'success'=>true
4304 );
4305
4306 if ($wpstream_register_email=='' ){
4307 $return= array(
4308 'success'=> false,
4309 'message' => esc_html('The email Field is Empty','wpstream')
4310 );
4311 return $return;die();
4312 }
4313
4314 if(filter_var($wpstream_register_email,FILTER_VALIDATE_EMAIL) === false) {
4315 $return= array(
4316 'success'=> false,
4317 'message' => esc_html__('The email doesn\'t look right !','wpstream')
4318 );
4319 return $return;die();
4320 }
4321
4322
4323 $domain = mb_substr(strrchr($wpstream_register_email, "@"), 1);
4324 if( $domain!='' && !checkdnsrr ($domain) ){
4325 $return= array(
4326 'success'=> false,
4327 'message' => esc_html__('The email doesn\'t look right !','wpstream')
4328 );
4329 return $return;die();
4330 }
4331
4332
4333
4334 if(strlen($wpstream_register_password)<5){
4335 $return= array(
4336 'success'=> false,
4337 'message' => esc_html('The password is too short. Please use at least 5 characters.','wpstream')
4338 );
4339 return $return;die();
4340 }
4341
4342 return $return;die();
4343 }
4344
4345 /**
4346 * Handle the AJAX request to initiate a multipart upload
4347 *
4348 * @since 3.0.1
4349 */
4350 public function handle_initiate_multipart_upload() {
4351 check_ajax_referer( 'wpstream_multipart_upload_nonce', 'security' );
4352
4353 // Security check - only admins can do this
4354 if (!current_user_can('administrator')) {
4355 wp_send_json_error('Unauthorized access');
4356 return;
4357 }
4358
4359 // Get file details from request
4360 $file_name = sanitize_text_field($_POST['file_name']);
4361 $file_size = intval($_POST['file_size']);
4362 $content_type = sanitize_text_field($_POST['content_type']);
4363 $num_parts = intval($_POST['parts']);
4364
4365 if (empty($file_name) || $file_size <= 0 || $num_parts <= 0) {
4366 wp_send_json_error('Invalid file information');
4367 return;
4368 }
4369
4370 // Prepare a clean filename (similar to the standard upload process)
4371 $file_name_array = explode(".", $file_name);
4372 $file_extension = $file_name_array[count($file_name_array) - 1];
4373 $temp_file_name = $file_name_array[0];
4374 $temp_file_name = str_replace(' ', '_', $temp_file_name);
4375 $temp_file_name = preg_replace('/\W/', '', $temp_file_name);
4376 $clean_file_name = $temp_file_name . '.' . $file_extension;
4377
4378 // Make API call to initiate multipart upload
4379 $url = 'video/upload';
4380 $access_token = $this->main->wpstream_live_connection->wpstream_get_token();
4381
4382 if (!$access_token) {
4383 wp_send_json_error('Not connected to WPStream service');
4384 return;
4385 }
4386
4387 $api_params = array(
4388 'access_token' => $access_token,
4389 'size' => $file_size,
4390 'name' => $clean_file_name,
4391 'content_type' => $content_type,
4392 'parts' => $num_parts
4393 );
4394
4395 $response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url, $api_params, true);
4396 $response_data = json_decode($response, true);
4397
4398 if (!isset($response_data['success']) || $response_data['success'] !== true) {
4399 $error_message = isset($response_data['error']) ? $response_data['error'] : 'Failed to initiate multipart upload';
4400 wp_send_json_error($error_message);
4401 return;
4402 }
4403
4404 // Return the upload ID and pre-signed URLs for each part
4405 wp_send_json_success($response_data);
4406 }
4407
4408 /**
4409 * Handle the AJAX request to complete a multipart upload
4410 *
4411 * @since 3.0.1
4412 */
4413 public function handle_complete_multipart_upload() {
4414 check_ajax_referer( 'wpstream_multipart_upload_nonce', 'security' );
4415
4416 // Security check - only admins can do this
4417 if (!current_user_can('administrator')) {
4418 wp_send_json_error('Unauthorized access');
4419 return;
4420 }
4421
4422 // Get completion details
4423 $parts = json_decode(stripslashes($_POST['parts']), true);
4424 $file_name = sanitize_text_field($_POST['file_name']);
4425 $handle = sanitize_text_field($_POST['handle']);
4426
4427 if (empty($parts) || !is_numeric($parts) || empty($file_name)) {
4428 wp_send_json_error('Invalid completion information');
4429 return;
4430 }
4431
4432 // Make API call to complete the multipart upload
4433 $url = 'video/upload';
4434 $access_token = $this->main->wpstream_live_connection->wpstream_get_token();
4435
4436 if (!$access_token) {
4437 wp_send_json_error('Not connected to WPStream service');
4438 return;
4439 }
4440
4441 $api_params = array(
4442 'access_token' => $access_token,
4443 'parts' => $parts,
4444 'name' => $file_name,
4445 'handle' => $handle,
4446 'action' => 'complete'
4447 );
4448
4449 $response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url, $api_params, true);
4450 $response_data = json_decode($response, true);
4451
4452 if (!isset($response_data['success']) || $response_data['success'] !== true) {
4453 $error_message = isset($response_data['error']) ? $response_data['error'] : 'Failed to complete multipart upload';
4454 wp_send_json_error($error_message);
4455 return;
4456 }
4457
4458 // Return success
4459 wp_send_json_success();
4460 }
4461
4462 public function wpstream_settings_tab_update_plugin() {
4463 if ( !current_user_can( 'update_plugins' ) ) {
4464 wp_send_json_error( __( 'Not enough permissions to make this change', 'wpstream' ) );
4465 }
4466
4467 include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
4468 include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
4469 include_once ABSPATH . 'wp-admin/includes/file.php';
4470
4471 $credentials = request_filesystem_credentials('');
4472 if ( !WP_Filesystem( $credentials ) ) {
4473 wp_send_json_error( __( 'Failed to connect to the filesystem', 'wpstream' ) );
4474 }
4475
4476 $upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
4477 $plugin_path = plugin_basename( WPSTREAM_PLUGIN_PATH . 'wpstream.php' );
4478 $result = $upgrader->upgrade( $plugin_path );
4479 activate_plugin( $plugin_path );
4480
4481 if ( is_wp_error( $result ) ) {
4482 wp_send_json_error( __( 'Update failed due to', 'wpstream' ) . $result->get_error_message() );
4483 }
4484
4485 wp_send_json_success();
4486 }
4487 }
4488