PluginProbe
WpStream – Live Streaming, Video on Demand, Pay Per View / 4.8.2
WpStream – Live Streaming, Video on Demand, Pay Per View v4.8.2
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.8.2, at admin/class-wpstream-admin.php

4,246 lines 215.8 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 'loading_url' => WPSTREAM_PLUGIN_DIR_URL.'/img/loading.gif',
187 'download_mess' => esc_html__('Click to download!','wpstream'),
188 'uploading' => esc_html__('We are uploading your file. Do not close this window!','wpstream'),
189 'upload_complete2' => esc_html__('Upload Complete! You can upload another file!','wpstream'),
190 'not_accepted' => esc_html__('The file is not an accepted video format','wpstream'),
191 'upload_complete' => esc_html__('Upload Complete!','wpstream'),
192 'no_band' => esc_html__('Not enough streaming data.','wpsteam'),
193 'no_band_no_store' => esc_html__('Not enough streaming data or storage.','wpsteam'),
194 'exceeding_limit' => esc_html__('File size exceeds 5GB. Initiating multipart upload...','wpsteam'),
195 'upload_failed' => esc_html__('Upload Failed!','wpstream'),
196 'upload_failed2' => esc_html__('Upload Failed! Please Try again!','wpstream'),
197 'choose_a_file' => esc_html__('Choose a file&hellip;','wpstream'),
198 'preparing_multipart' => esc_html__('Preparing multipart upload...','wpstream'),
199 'uploading_part' => esc_html__('Uploading part {part} of {total}...','wpstream'),
200 'upload_failed_part' => esc_html__('Failed to upload part {part}. Please try again.','wpstream'),
201 'completing_upload' => esc_html__('Completing upload. Please wait...','wpstream'),
202 'upload_failed_part_retry' => esc_html__('Failed to upload part {part}. Retrying...','wpstream'),
203 'choose_recording' => esc_html__( 'Choose Recording', 'wpstream' ),
204 'select_recording' => esc_html__( 'Please select a recording from the list', 'wpstream' ),
205 'invalid_response' => esc_html__('Invalid response from server. Missing required upload data.', 'wpstream'),
206 'video_processing' => esc_html__( 'The video is still processing', 'wpstream' ),
207 'file_name_text' => esc_html__('File Name:','wpstream'),
208 'channel_create_error' => esc_html__('Something did not work. Please try again.', 'wpstream'),
209 ));
210
211 wp_enqueue_script('wpstream-recordings-videos-list', plugin_dir_url( __FILE__ ) .'js/recordings_videos_list.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
212 wp_localize_script( 'wpstream-recordings-videos-list', 'wpstream_recordings_videos_list_vars',
213 array(
214 'delete_file' => esc_html__('Delete file', 'wpstream'),
215 'download' => esc_html__( 'Download', 'wpstream'),
216 'download_available' => esc_html__( 'Click to download! The url will work for the next 20 minutes!', 'wpstream'),
217 'add_free_video_url' => esc_url( admin_url( 'post-new.php?post_type=wpstream_product_vod') . '&new_video_name=' ),
218 'create_ftv_vod' => esc_html__( 'Create new Free-To-View VOD from this recording' , 'wpstream' ),
219 'woocommerce_exists' => class_exists( 'WooCommerce' ),
220 'add_paid_video_url' => esc_url( admin_url( 'post-new.php?post_type=product').'&new_video_name=' ),
221 'create_ptv_vod' => esc_html__( 'Create new Pay-Per-View VOD from this recording' , 'wpstream' ),
222 )
223 );
224
225 $modified_start_streaming_file_time = gmdate( 'YmdHi', filemtime( WPSTREAM_PLUGIN_PATH . 'public/js/start_streaming.js' ) );
226 wp_enqueue_script('wpstream-start-streaming_admin', plugin_dir_url( __DIR__ ) .'public/js/start_streaming.js', array(), $modified_start_streaming_file_time, true);
227 wp_localize_script('wpstream-start-streaming_admin', 'wpstream_start_streaming_vars',
228 array(
229 'admin_url' => get_admin_url(),
230 'loading_url' => WPSTREAM_PLUGIN_DIR_URL.'/img/loading.gif',
231 'download_mess' => esc_html__('Click to download!','wpstream'),
232 'uploading' => esc_html('We are uploading your file.Do not close this window!','wpstream'),
233 'upload_complete2' => esc_html('Upload Complete! You can upload another file!','wpstream'),
234 'not_accepted' => esc_html('The file is not an accepted video format','wpstream'),
235 'upload_complete' => esc_html('Upload Complete!','wpstream'),
236 'no_band' => esc_html('Not enough streaming data.','wpsteam'),
237 'no_band_no_store' => esc_html('Not enough streaming data or storage.','wpsteam'),
238
239 'start_streaming_action'=> esc_html__('TURNING ON','wpstream'),
240 'stop_streaming_action' => esc_html__('TURNING OFF','wpstream'),
241 'start_streaming' => esc_html__('TURN ON','wpstream'),
242 'stop_streaming' => esc_html__('TURN OFF','wpstream'),
243 'failed_fetching' => esc_html__('Failed to get channel info. Please try again.','wpstream'),
244 'turned_on_tooltip' => esc_html__('Channel is now OFF. Click to turn ON.','wpstream'),
245 'turned_off_tooltip' => esc_html__('Click to turn channel off. This will interrupt any ongoing broadcast.','wpstream'),
246 'turning_on_tooltip' => esc_html__('Turning a channel on may take 1-2 minutes or more. Please be patient.','wpstream'),
247 'turning_off_tooltip' => esc_html__('This may take a few minutes.','wpstream'),
248 'error1' => esc_html__('You don\'t have enough data to start a new event!','wpstream'),
249 'failed_event_creation' => esc_html__('Failed to start the channel. Please try again in a few minutes.','wpstream'),
250 'channel_turning_on' => esc_html__('Channel is turning on','wpstream'),
251 'channel_turning_off' => esc_html__('Channel is turning off','wpstream'),
252 'channel_on' => esc_html__('Channel is ON','wpstream'),
253 'channel_off' => esc_html__('Channel is OFF','wpstream'),
254 'turn_off_confirm' => esc_html__(
255 'ARE YOU SURE you\'d like to TURN OFF the channel now? ' . PHP_EOL . PHP_EOL .
256 '- Channels TURN OFF automatically after 1 hour of inactivity (no active broadcast).' . PHP_EOL .
257 '- Manual TURN OFF is only useful if you require to change the channel settings immediately.' . PHP_EOL .
258 '- If your channel is configured with Auto TURN ON, it will turn back on as soon as there is a broadcast.',
259 'wpstream'
260 ),
261 'basic_streaming_warning' => esc_html__(
262 'Your account is now in BASIC STREAMING mode.' . PHP_EOL . PHP_EOL .
263 '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 .
264 'Certain features, such as recording, viewer count, browser broadcasting, and content protection are unavailable.' . PHP_EOL . PHP_EOL .
265 '- To take advantage of all features, please choose Cancel and upgrade your plan.' . PHP_EOL .
266 '- Otherwise, choose OK to start your channel with these limitations.' . PHP_EOL . PHP_EOL .
267 'ARE YOU SURE you want to continue with Basic Streaming?',
268 'wpstream'
269 ),
270 'broadcaster_url' => esc_url( esc_url(home_url('/broadcaster-page/') ) ),
271 ));
272
273 wp_enqueue_script('wpstream-settings', plugin_dir_url( __DIR__ ) .'/admin/js/wpstream_settings.js?v='.time(),array(), WPSTREAM_PLUGIN_VERSION, true);
274 wp_localize_script('wpstream-settings', 'wpstream_settings_vars', array(
275 'error_message' => esc_html__( 'Failed to save settings. Please try again.', 'wpstream'),
276 'choose_image_text' => esc_html__( 'Choose Logo Image', 'wpstream'),
277 'select_image_text' => esc_html__( 'Select Image', 'wpstream'),
278 'update_successful' => esc_html__( 'Update Successful.', 'wpstream'),
279 'update_failed' => esc_html__( 'Something went wrong. Try again.', 'wpstream'),
280 'broadcaster_url' => esc_url( esc_url(home_url('/broadcaster-page/') ) ),
281 ));
282
283
284 wp_enqueue_script('wpstream-on-boarding-js',plugin_dir_url( __DIR__ ) .'/admin/js/wpstream-onboarding2.js',array(), WPSTREAM_PLUGIN_VERSION, true);
285 wp_localize_script('wpstream-on-boarding-js', 'wpstreamonboarding_js_vars',
286 array(
287 'admin_url' => get_admin_url(),
288 'plugin_url' => get_dashboard_url().'/plugins.php',
289 'upload_url' => get_dashboard_url().'admin.php?page=wpstream_recordings'
290
291 ));
292
293 // wp_enqueue_style(
294 // 'wpstream-broadcaster-css',
295 // plugin_dir_url(__FILE__) . 'public/css/broadcaster.css',
296 // array(),
297 // filemtime(plugin_dir_path(__FILE__) . 'public/css/broadcaster.css' ),
298 // );
299 //
300 // wp_enqueue_script(
301 // 'wpstream-broadcaster',
302 // plugin_dir_url(__FILE__) . 'public/js/broadcaster.js',
303 // array('jquery'),
304 // WPSTREAM_PLUGIN_VERSION,
305 // true
306 // );
307
308 // Add localized variables for broadcaster
309 wp_localize_script('wpstream-broadcaster', 'wpstream_broadcaster_vars', array(
310 'ajax_url' => admin_url('admin-ajax.php'),
311 'nonce' => wp_create_nonce('wpstream_broadcaster_nonce'),
312 'plugin_url' => plugin_dir_url(__FILE__),
313
314 ));
315
316 }
317
318
319 /**
320 * Add Plugin Administation menu
321 *
322 * @since 3.0.1
323 */
324
325 public function wpstream_manage_admin_menu() {
326
327 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 );
328 add_submenu_page( 'wpstream_credentials', __('WpStream Credentials','wpestream'), __('Credentials','wpestream'), 'administrator', 'wpstream_credentials', array($this,'wpstream_set_wpstream_credentials') );
329 add_submenu_page( 'wpstream_credentials', __('WpStream Live Channels','wpestream'), __('All Channels','wpestream'), 'administrator', 'wpstream_live_channels', array( $this,'wpstream_new_general_set'));
330 add_submenu_page( 'wpstream_credentials', __('WpStream Recordings','wpestream'), __('Recordings','wpestream'), 'administrator', 'wpstream_recordings', array($this,'wpstream_media_management'));
331 add_submenu_page( 'wpstream_credentials', __('WpStream Settings','wpestream'), __('Settings','wpestream'), 'administrator', 'wpstream_settings', array($this,'wpstream_settings'));
332
333 add_submenu_page( 'wpstream_credentials', __('WpStream Quick Start','wpestream'), __('WpStream Quick Start','wpestream'), 'administrator', 'wpstream_onboard', array($this,'wpstream_pre_onboard_display'));
334
335
336
337
338 }
339
340
341
342
343 /**
344 * Shows events wpstream
345 *
346 * @since 3.0.1
347 */
348
349 public function wpstream_new_general_set() {
350
351 $no_channel=1;
352
353 if(class_exists ('WC_Subscription')){
354
355 }
356
357 //event_passed
358 $args = array(
359 'posts_per_page' => -1,
360 'post_type' => 'product',
361 'post_status' => 'publish',
362 'meta_query' => array(
363 array(
364 'key' => 'event_passed',
365 'value' => 1,
366 'compare' => '!=',
367 )
368 ),
369
370 'tax_query' => array(
371 'relation' => 'AND',
372 array(
373 'taxonomy' => 'product_type',
374 'field' => 'slug',
375 'terms' => array('live_stream','subscription')
376 )
377 ),
378 );
379
380
381
382 $event_list = new WP_Query($args);
383 global $live_event_for_user;
384 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
385 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_new_general_set');
386
387 $this->main->show_user_data($pack_details);
388 if( $event_list->have_posts()){
389
390
391 print '<div class="pack_details_wrapper_transparent">
392 <h3>'.__('Your Pay-Per-View Channel List','wpstream').'</h3>';
393
394
395 $link_new = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
396
397 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new Pay-Per-View channel.','wpstream').'</a>';
398 print '</div>';
399
400 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
401
402 while ($event_list->have_posts()): $event_list->the_post();
403
404 $the_id = get_the_ID();
405 $is_subscription_live_event = esc_html(get_post_meta($the_id,'_subscript_live_event',true));
406 $term_list = wp_get_post_terms($the_id, 'product_type');
407
408 if( $term_list[0]->name=='subscription' && $is_subscription_live_event=='no'){
409 continue;
410 }
411
412 $this->wpstream_live_stream_unit($the_id);
413
414 endwhile;
415
416 print'</div>';
417 $no_channel=1;
418 }else{
419 $no_channel=0;
420 }
421
422
423 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
424 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
425 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_new_general_set');
426 if( isset($pack_details['available_data_mb'])){
427 if ($pack_details['available_data_mb'] <= 0){
428 print '<input type="hidden" id="wpstream_basic_streaming" value="true">';
429 }
430 }
431 $current_user = wp_get_current_user();
432 $allowded_html = array();
433 $userID = $current_user->ID;
434 $user_live_streams = get_user_meta($userID,'live_shows');
435
436
437 wp_reset_postdata();
438
439
440
441
442 // free
443
444 $args_free = array(
445 'posts_per_page' => -1,
446 'post_type' => 'wpstream_product',
447 'post_status' => 'publish',
448
449
450 );
451 $event_list_free = new WP_Query($args_free);
452
453
454 if( $event_list_free->have_posts()){
455 print '<div class="pack_details_wrapper_transparent">
456 <h3>'.__('Free-To-View Channels','wpstream').'</h3>';
457
458 $link_new = admin_url('post-new.php?post_type=wpstream_product');
459 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new Free-To-View channel.','wpstream').'</a>';
460 print '</div>';
461 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
462
463 while ($event_list_free->have_posts()): $event_list_free->the_post();
464
465
466 $the_id = get_the_ID();
467
468 if( get_post_meta ($the_id,'event_passed',true)!=1){
469 $this->wpstream_live_stream_unit($the_id);
470 }
471
472 endwhile;
473
474 print'</div><div class="wpstream_modal_background"></div>';
475 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er2</div>
476 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
477 </div>';
478 $no_channel=1;
479 }else{
480 $no_channel=0;
481 }
482
483
484
485
486 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
487 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
488 print '<div class="no_events_warning"> ';
489 if($event_list->found_posts==0){
490 print '<div class="no_events_warning_mes">'.__('* You do not have any Pay-Per-View channels!','wpstream').'</div>';
491 }
492 if($event_list_free->found_posts==0){
493 print '<div class="no_events_warning_mes">'. __('* You do not have any free channels!','wpstream').'</div>';
494 }
495
496 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new Free-To-View channel ','wpstream').'</a>';
497 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new Pay-Per-View channel ','wpstream').'</a>';
498
499 print '</div>';
500
501
502
503
504 }
505 // end wpstream_new_general_set
506
507
508 /**
509 * Social share
510 *
511 * @since 3.0.1
512 */
513
514 public function wpstream_social_share($the_id){
515 $protocol = is_ssl() ? 'https' : 'http';
516 $pinterest = wp_get_attachment_image_src(get_post_thumbnail_id($the_id), 'full');
517 $link = esc_url ( get_permalink($the_id) );
518 $title = get_the_title($the_id);
519 $twiter_status = urlencode( $title.' '.$link);
520 $email_link = 'subject='.urlencode ( $title ) .'&body='. urlencode( esc_url($link));
521
522 $facebook_link = esc_html($protocol).'://www.facebook.com/sharer.php?u='. esc_url($link) .'&amp;t='. urlencode(get_the_title());
523
524 ?>
525 <div class="wpstream_social_share_wrapper">
526
527 <a href="<?php print esc_url( $facebook_link); ?>" target="_blank" class="social_facebook wpstream_sharing_social">
528 <span class="dashicons dashicons-facebook-alt"></span>
529 </a>
530
531 <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">
532 <span class="dashicons dashicons-twitter"></span>
533 </a>
534
535 <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">
536 <span class="dashicons dashicons-pinterest"></span>
537 </a>
538
539 <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">
540 <span class="dashicons dashicons-whatsapp"></span>
541 </a>
542
543 <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">
544 <span class="dashicons dashicons-linkedin"></span>
545 </a>
546
547 <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">
548 <span class="dashicons dashicons-reddit"></span>
549 </a>
550
551 <a href="mailto:email@email.com?<?php echo trim(esc_html($email_link));?>" data-action="share email" class="social_email wpstream_sharing_social">
552 <span class="dashicons dashicons-email-alt"></span>
553 </a>
554
555 <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>
556 <?php
557 print '</div>';
558 }
559
560
561
562
563 /**
564 * Shows event unit card in admin
565 *
566 * @since 3.0.1
567 */
568
569 public function wpstream_live_stream_unit($the_id,$is_front=''){
570 global $live_event_for_user;
571 global $wpstream_plugin;
572 $current_user = wp_get_current_user();
573
574 if( !current_user_can('administrator')){
575 if($is_front=='' ){
576 print '<div class="event_list_unit">';
577 esc_html_e('You are not allowed to broadcast.','wpstream');
578 print '</div>';
579 return;
580 }
581
582 }
583
584 if( !$this->main->wpstream_check_user_can_stream() ){
585 print '<div class="event_list_unit">';
586 esc_html_e('You are not allowed to broadcast','wpstream');
587 print '</div>';
588 return;
589 }
590
591
592 $live_class='';
593 if(isset($live_event_for_user[$the_id])) {
594 $live_class=" wpstream_show_started";
595 }
596
597
598 if(has_post_thumbnail($the_id)){
599 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
600 }else{
601 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/plugin-logo.png';
602 }
603
604 $pending_streaming_class = 'hide_stream_data';
605 $external_software_streaming_class = '';
606 $obs_uri = '';
607 $obs_stream = '';
608 $live_data_url = '';
609
610 if( $live_event_for_user=='' && $is_front=='front' ){
611 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
612 }
613 $channel_status = '<div class="spinner" style="visibility: visible"></div>';
614 $button_status = '<div class="spinner" style="visibility: visible"></div>';
615 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
616 $pending_streaming_class = 'pending_trigger';
617 $live_data_url = get_post_meta($the_id,'qos_url',true);
618 // $channel_status = esc_html__('Channel is on','wpstream');
619 } else {
620 $channel_status = esc_html__('Channel is OFF','wpstream');
621 $button_status = esc_html__('TURN ON','wpstream');
622 }
623
624 $server_id = get_post_meta($the_id,'server_id',true);
625 $obs_uri = get_post_meta($the_id,'obs_uri',true);
626 $obs_stream = get_post_meta($the_id,'obs_stream',true);
627 $webcaster_url = get_post_meta($the_id,'webcaster_url',true);
628 $rtmp_ip_uri = '';
629
630 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.'"">';
631
632 print '<div class="wpstream_channel_status">'.$channel_status.'</div>';
633
634 print '<div class="server_notification"></div>';
635
636 print '<div class="event_thumb_wrapper" style="background-image:url('.$thumb.')"></div>';
637
638 print '<div class="event_title" data-prodid="'.$the_id.'">'.wp_trim_words(get_the_title($the_id),10);
639
640
641 /* print '***</br>'.get_post_meta($the_id,'obs_uri',true) .'***</br>'.
642 get_post_meta($the_id,'obs_stream',true).'***</br>'.
643 get_post_meta($the_id,'broadcast_url',true);
644 */
645 print '<div class="wpstream_channel_item_id">'.esc_html( '#ID' ).' '.$the_id.'</div>';
646 print '</div>';
647
648
649 print '<div class="start_event wpstream_button wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" > ' . $button_status;
650 print '<div class="wpstream_tooltip">'.esc_html__('Channel is now OFF. Click to turn ON.','wpestream').'</div>';
651 print '</div>';
652
653 print '<div class="wpstream_options_col1 wpstream_stream_browser_wrapper">';
654
655 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.'"">';
656
657 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
658 print '<div class="wpstream_tooltip">'.esc_html__('Go live with your webcam','wpestream').'</div>';
659
660 print '<svg width="41" height="51" viewBox="0 0 41 51" fill="none" xmlns="http://www.w3.org/2000/svg">
661 <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"/>
662 </svg>';
663 print '</div>';
664
665
666 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.'"">';
667
668 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
669 print '<div class="wpstream_tooltip">'.esc_html__('Go Live with external streaming app','wpestream').'</div>';
670
671 print '<svg width="51" height="38" viewBox="0 0 51 38" fill="none" xmlns="http://www.w3.org/2000/svg">
672 <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"/>
673 <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"/>
674 </svg>';
675 print '</div>';
676
677
678
679
680 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.'" >';
681
682 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to see live stats.','wpestream').'</div>';
683 print '<div class="wpstream_tooltip">'.esc_html__('Live Statistics','wpestream').'</div>';
684
685 print'<svg width="50" height="42" viewBox="0 0 50 42" fill="none" xmlns="http://www.w3.org/2000/svg">
686 <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"/>
687 <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"/>
688 <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"/>
689 <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"/>
690 </svg>';
691 print '</a>';
692 print '</div>';
693
694 print '<div class="wpstream_options_col2 wpstream_show_settings_wrapper">';
695 if($is_front==''){
696 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').'">';
697
698 print '<div class="wpstream_tooltip_disabled">'.esc_html__('
699 Turn OFF the channel to change its settings.','wpestream').'</div>';
700 print '<div class="wpstream_tooltip">'.esc_html__('Channel Settings','wpestream').'</div>';
701
702 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
703 <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"/>
704 </svg>
705 </div>';
706
707
708 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.'"">';
709 print '<div class="wpstream_tooltip">'.esc_html__('Edit Channel','wpestream').'</div>';
710 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
711 <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"/>
712 </svg>';
713 print '</a>';
714 }
715
716 print '<a href="'.get_permalink($the_id).'" target="_blank" class="wpstream_view_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'"">';
717 print '<div class="wpstream_tooltip">'.esc_html__('View Channel','wpestream').'</div>';
718 print '<svg width="50" height="32" viewBox="0 0 50 32" fill="none" xmlns="http://www.w3.org/2000/svg">
719 <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"/>
720 <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"/>
721 </svg>';
722 print '</a>';
723
724
725 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.'"">';
726 print '<div class="wpstream_tooltip">'.esc_html__('Share Channel','wpestream').'</div>';
727 print '<svg width="44" height="50" viewBox="0 0 44 50" fill="none" xmlns="http://www.w3.org/2000/svg">
728 <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"/>
729 </svg>';
730 print '</div>';
731 print '</div>';
732
733 $this->wpstream_display_modal_seetings($the_id);
734 $this->wpstream_display_modal_share($the_id);
735 $this->wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream);
736
737 print '</div>';
738
739 }
740
741
742
743
744 /**
745 * Shows event unit card in admin - theme version
746 *
747 * @since 3.0.1
748 */
749 public function wpstream_live_stream_unit_for_theme($the_id,$is_front=''){
750 global $live_event_for_user;
751 global $wpstream_plugin;
752 $current_user = wp_get_current_user();
753
754 if( !current_user_can('administrator')){
755 if($is_front=='' ){
756 print '<div class="event_list_unit">';
757 esc_html_e('You are not allowed to broadcast.','wpstream');
758 print '</div>';
759 return;
760 }
761
762 }
763
764 if( !$this->main->wpstream_check_user_can_stream() ){
765 print '<div class="event_list_unit">';
766 esc_html_e('You are not allowed to broadcast','wpstream');
767 print '</div>';
768 return;
769 }
770
771
772 $live_class='';
773 if(isset($live_event_for_user[$the_id])) {
774 $live_class=" wpstream_show_started";
775 }
776
777
778 if(has_post_thumbnail($the_id)){
779 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
780 }else{
781 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/plugin-logo.png';
782 }
783
784 $pending_streaming_class = 'hide_stream_data';
785 $external_software_streaming_class = '';
786 $obs_uri = '';
787 $obs_stream = '';
788 $live_data_url = '';
789
790 if( $live_event_for_user=='' && $is_front=='front' ){
791 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
792 }
793
794 $spinner_url = admin_url('images/spinner-2x.gif');
795 $button_status = '<div class="spinner" style="background-image: url(' . $spinner_url . ')"></div>';
796 $channel_status = '';
797 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
798 $pending_streaming_class = 'pending_trigger';
799 $live_data_url = get_post_meta($the_id,'qos_url',true);
800 // $channel_status = esc_html__('Channel is on','wpstream');
801 } else {
802 $channel_status = esc_html__('Channel is OFF','wpstream');
803 $button_status = esc_html__('TURN ON', 'wpstream');
804 }
805
806 $server_id = get_post_meta($the_id,'server_id',true);
807 $obs_uri = get_post_meta($the_id,'obs_uri',true);
808 $obs_stream = get_post_meta($the_id,'obs_stream',true);
809 $webcaster_url = get_post_meta($the_id,'webcaster_url',true);
810 $rtmp_ip_uri = '';
811
812 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.'"">';
813
814 print '<div class="wpstream_channel_status" style="' . ($channel_status ? '' : 'display: none') . '">'.$channel_status.'</div>';
815
816 print '<div class="server_notification"></div>';
817
818 print '<div class="wpstream_theme_event_thumb_wrapper">';
819 print '<div class="event_thumb_wrapper" style="background-image:url('.$thumb.')"></div>';
820 print '<div class="event_title" data-prodid="'.$the_id.'">'.wp_trim_words(get_the_title($the_id),10);
821 print '<div class="wpstream_channel_item_id">'.esc_html('#ID','wpstream').' '.$the_id.'</div>';
822 print '</div>';
823 print '</div>';
824
825 print '<div class="wpstream_theme_control_bar_wrapper">';
826
827
828 print '<div class="wpstream_options_col1 wpstream_stream_browser_wrapper">';
829
830 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.'"">';
831
832 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
833 print '<div class="wpstream_tooltip">'.esc_html__('Go live with your webcam','wpestream').'</div>';
834
835 print '<svg width="41" height="51" viewBox="0 0 41 51" fill="none" xmlns="http://www.w3.org/2000/svg">
836 <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"/>
837 </svg>';
838 esc_html_e('Webcam','wpstream');
839 print '</div>';
840
841
842 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.'"">';
843
844 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to go live.','wpestream').'</div>';
845 print '<div class="wpstream_tooltip">'.esc_html__('Go Live with external streaming app','wpestream').'</div>';
846
847 print '<svg width="51" height="38" viewBox="0 0 51 38" fill="none" xmlns="http://www.w3.org/2000/svg">
848 <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"/>
849 <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"/>
850 </svg>';
851 esc_html_e('External App','wpstream');
852 print '</div>';
853
854
855
856
857 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.'" >';
858
859 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn ON the channel to see live stats.','wpestream').'</div>';
860 print '<div class="wpstream_tooltip">'.esc_html__('Live Statistics','wpestream').'</div>';
861
862 print'<svg width="50" height="42" viewBox="0 0 50 42" fill="none" xmlns="http://www.w3.org/2000/svg">
863 <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"/>
864 <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"/>
865 <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"/>
866 <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"/>
867 </svg>';
868 esc_html_e('Statistics','wpstream');
869 print '</a>';
870 print '</div>';
871
872 print '<div class="wpstream_options_col2 wpstream_show_settings_wrapper">';
873 if($is_front==''){
874 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').'">';
875
876 print '<div class="wpstream_tooltip_disabled">'.esc_html__('Turn OFF the channel to change its settings.','wpestream').'</div>';
877 print '<div class="wpstream_tooltip">'.esc_html__('Channel Settings','wpestream').'</div>';
878
879 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
880 <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"/>
881 </svg>
882 </div>';
883
884
885 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.'"">';
886 print '<div class="wpstream_tooltip">'.esc_html__('Edit Channel','wpestream').'</div>';
887 print '<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
888 <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"/>
889 </svg>';
890 print '</a>';
891 }
892
893 print '<a href="'.get_permalink($the_id).'" target="_blank" class="wpstream_view_channel wpstream-button-icon wpstream_tooltip_wrapper" data-show-id="'.$the_id.'"">';
894 print '<div class="wpstream_tooltip">'.esc_html__('View Channel','wpestream').'</div>';
895 print '<svg width="50" height="32" viewBox="0 0 50 32" fill="none" xmlns="http://www.w3.org/2000/svg">
896 <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"/>
897 <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"/>
898 </svg>';
899 esc_html_e('View','wpstream');
900 print '</a>';
901
902
903 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.'"">';
904 print '<div class="wpstream_tooltip">'.esc_html__('Share Channel','wpestream').'</div>';
905 print '<svg width="44" height="50" viewBox="0 0 44 50" fill="none" xmlns="http://www.w3.org/2000/svg">
906 <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"/>
907 </svg>';
908 esc_html_e('Share','wpstream');
909 print '</div>';
910 print '</div>';
911
912
913 print '<div class="start_event wpstream_button wpstream_tooltip_wrapper" data-show-id="'.$the_id.'" > '. $button_status;
914 print '<div class="wpstream_tooltip">'.esc_html__('Channel is now OFF. Click to turn ON.','wpestream').'</div>';
915 print '</div>';
916
917 print '</div>';
918
919
920
921
922 $this->wpstream_display_modal_seetings($the_id);
923 $this->wpstream_display_modal_share($the_id);
924 $this->wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream);
925
926 print '</div>';
927
928 }
929
930
931 /*
932 *
933 * Close modal button
934 *
935 */
936
937 public function wpstream_close_modal_button(){
938 print '<div class="wpstream_close_modal"></div>';
939 }
940
941 public function wpstream_local_event_options_toggle() {
942 $use_global_event_options = get_post_meta(get_the_ID(), 'use_global_event_options', true );
943 $local_event_options = get_post_meta( get_the_ID(), 'local_event_options', true );
944 $use_local_event_options_enabled = ( is_array( $local_event_options ) && empty( $use_global_event_options ) ) ||
945 ( !empty($use_global_event_options) && intval( $use_global_event_options ) === 0 );
946
947 print '<div class="wpstream_local_event_options_toggle_wrapper">';
948 print '<div class="wpstream_local_event_options_toggle_info">';
949 print '<label for="local_event_options_enabled" class="wpstream_local_event_options_label">'.esc_html__('Edit settings for this channel','wpstream').'</label>';
950 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>';
951 print '</div>';
952 print '<label class="wpstream_switch">';
953 print '<input id="local_event_options_enabled" type="checkbox" class="wpstream_local_event_options_toggle" ' . ($use_local_event_options_enabled === true ? 'checked' : '') . '>';
954 print '<span class="wpstream_slider round"></span>';
955 print '</label>';
956 print '</div>';
957 }
958
959 /*
960 *
961 * Display modal settings
962 *
963 */
964
965 public function wpstream_display_modal_seetings($the_id){
966 print '<div class="wpstream_modal_form wpestate_settings_modal">';
967 $this->wpstream_close_modal_button();
968 print '<h3>';
969 printf( esc_html__('Channel Settings (#ID %s)','wpstream'),$the_id);
970 print '</h3>';
971
972 $this->wpstream_local_event_options_toggle();
973
974 $local_event_options = get_post_meta($the_id,'local_event_options',true);
975 $use_global_event_options = get_post_meta($the_id, 'use_global_event_options',true);
976 $is_local_event_options_enabled = ( is_array( $local_event_options ) && empty( $use_global_event_options ) ) ||
977 ( !empty($use_global_event_options) && intval( $use_global_event_options ) === 0 );
978
979 if( !$is_local_event_options_enabled ) {
980 $local_event_options = get_option('wpstream_user_streaming_global_channel_options') ;
981 }
982
983 $local_array_exclude=array('ses_encrypt','vod_domain_lock','vod_encrypt');
984
985 print '<div class="wpstream_event_streaming_local">';
986 $this->user_streaming_global_channel_options(
987 '',
988 $local_event_options,
989 $local_array_exclude,
990 !$is_local_event_options_enabled,
991 );
992 print '</div>';
993 print '</div>';
994 }
995
996
997 /*
998 *
999 * Display share settings
1000 *
1001 */
1002 public function wpstream_display_modal_share($the_id){
1003 print '<div class="wpstream_modal_form wpestate_share_modal">';
1004 $this->wpstream_close_modal_button();
1005 print '<h3>'.esc_html__('Share your Channel','wpstream').'</h3>';
1006 $this->wpstream_social_share($the_id);
1007 print '</div>';
1008 }
1009
1010
1011 /*
1012 *
1013 * Display broadcast modal
1014 *
1015 */
1016
1017 public function wpstream_display_modal_broadcast($the_id,$external_software_streaming_class,$obs_uri,$obs_stream){
1018 print '<div class="wpstream_modal_form wpestate_broadcast_modal">';
1019 $this->wpstream_close_modal_button();
1020 print '<h3>'.esc_html__('Go Live with External Streaming App','wpstream').'</h3>';
1021
1022 print '<div class="wpstream_modal_explanations">'.esc_html__('Please choose your RTMP encoder/broadcaster','wpstream').'</div>';
1023
1024 print '<select class="wpstream_external_broadcast_options">';
1025 print '<option value="wpstream_obs_settings">'.esc_html('OBS','wpstream').'</option>';
1026 print '<option value="wpstream_streamyard_settings">'.esc_html('StreamYard','wpstream').'</option>';
1027 print '<option value="wpstream_restream_settings">'.esc_html('Restream','wpstream').'</option>';
1028 print '<option value="wpstream_wimx_settings">'.esc_html('vMix','wpstream').'</option>';
1029 print '<option value="wpstream_wirecast_settings">'.esc_html('Wirecast','wpstream').'</option>';
1030 print '<option value="wpstream_xplit_settings">'.esc_html('XSplit','wpstream').'</option>';
1031 print '<option value="wpstream_larix_settings">'.esc_html('Larix Broadcaster','wpstream').'</option>';
1032
1033 print '</select>';
1034
1035 $this->wpstream_obs_settings($obs_uri,$obs_stream);
1036 $this->wpstream_streamyard_settings($obs_uri,$obs_stream);
1037 $this->wpstream_restream_settings($obs_uri,$obs_stream);
1038 $this->wpstream_wmix_settings($obs_uri,$obs_stream);
1039 $this->wpstream_wirecast_settings($obs_uri,$obs_stream);
1040 $this->wpstream_xplit_settings($obs_uri,$obs_stream);
1041 $this->wpstream_larix_settings($obs_uri,$obs_stream);
1042
1043 print '</div>';
1044 }
1045
1046
1047
1048
1049 /*
1050 *
1051 * Display OBS settings
1052 *
1053 */
1054
1055 public function wpstream_obs_settings($obs_uri,$obs_stream){
1056
1057 print '<div class="external_software_streaming wpstream_obs_settings" style="display:block;">';
1058
1059 print '<div class="external_software_streaming_details">';
1060 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('Server:').' </strong>';
1061 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1062 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1063
1064 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1065 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1066 print '</div>';
1067
1068 print'</div>';
1069
1070 print ' <div class="wpstream_modal_explanations">';
1071 print '<ul>
1072 <li>1. Click Settings in the OBS Window and then Select Stream.</li>
1073 <li>2. Choose Custom Streaming Server in the Stream Type dropdown menu.</li>
1074 <li>3. In the URL box, type/paste your Server.</li>
1075 <li>4. In the Stream key, type/paste your Stream key.</li>
1076 <li>5. Save changes.Close the Settings window and click on the "Start Streaming" button in the main window of OBS.</li></ul>';
1077
1078 print '</div>';
1079
1080
1081 print'</div>';
1082 }
1083
1084 /*
1085 *
1086 * Display StreamYard settings
1087 *
1088 */
1089
1090 public function wpstream_streamyard_settings($obs_uri,$obs_stream){
1091
1092 print '<div class="external_software_streaming wpstream_streamyard_settings">';
1093
1094 print '<div class="external_software_streaming_details">';
1095 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP server URL:').' </strong>';
1096 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1097 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1098
1099 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong>
1100 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1101 print '</div>';
1102
1103 print'</div>';
1104
1105 print ' <div class="wpstream_modal_explanations">';
1106 print '<ul>
1107 <li>1. Set up your destination by going to your StreamYard account.</li>
1108 <li>2. Choose "Custom RTMP" and add the RTMP server URL and Stream key from WpStream.</li>
1109 <li>3. Go to "Broadcasts" then "create a broadcast".</li>
1110 <li>4. Enter Live Studio.</li>
1111 <li>5. Adjust all your preferred settings and Click on "Go Live".</li></ul>';
1112
1113 print '</div>';
1114
1115
1116 print'</div>';
1117 }
1118
1119
1120
1121 /*
1122 *
1123 * Display StreamYard settings
1124 *
1125 */
1126
1127 public function wpstream_restream_settings($obs_uri,$obs_stream){
1128
1129 print '<div class="external_software_streaming wpstream_restream_settings">';
1130
1131 print '<div class="external_software_streaming_details">';
1132 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP URL:').' </strong>';
1133 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1134 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1135
1136 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong>
1137 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1138 print '</div>';
1139
1140 print'</div>';
1141
1142 print ' <div class="wpstream_modal_explanations">';
1143 print '<ul>
1144 <li>1. Go to your Restream account and set up a destination or channel.</li>
1145 <li>2. Choose "Custom RTMP" and add the RTMP URL and Stream Key from WpStream.</li>
1146 <li>3. Click on "Add Channel".</li>
1147 <li>4. Enter Live Studio.</li>
1148 <li>5. Adjust your preferred settings and Go Live.</li></ul>';
1149
1150 print '</div>';
1151
1152
1153 print'</div>';
1154 }
1155
1156
1157
1158 /*
1159 *
1160 * Display Xplit settings
1161 *
1162 */
1163
1164
1165 public function wpstream_xplit_settings($obs_uri,$obs_stream){
1166 print '<div class="external_software_streaming wpstream_xplit_settings" style="display:none;">';
1167 print '<div class="external_software_streaming_details">';
1168 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP Url:').' </strong>';
1169 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1170 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1171
1172 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1173 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1174 print '</div>';
1175
1176 print'</div>';
1177
1178 print ' <div class="wpstream_modal_explanations">';
1179 print '<ul>
1180 <li>1. Click Broadcast in the XSplit Window and then click "Set up a new output".</li>
1181 <li>2. Choose Custom RTMP in the Set up a new output dropdown menu.</li>
1182 <li>3. In the URL box, type/paste your RTMP Url.</li>
1183 <li>4. In the Stream key, type/paste your Stream key.</li>
1184 <li>5. Save changes and click on the "Stream" button in the main window.</li></ul>';
1185 print '</div>';
1186
1187 print '</div>';
1188 }
1189
1190
1191
1192 /*
1193 *
1194 * Display WireCast settings
1195 *
1196 */
1197
1198
1199 public function wpstream_wirecast_settings($obs_uri,$obs_stream){
1200 print '<div class="external_software_streaming wpstream_wirecast_settings" style="display:none;">';
1201
1202 print '<div class="external_software_streaming_details">';
1203 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('Address:').' </strong>';
1204 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1205 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1206
1207 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream:').' </strong>
1208 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1209 print '</div>';
1210
1211 print'</div>';
1212
1213 print ' <div class="wpstream_modal_explanations">';
1214 print '<ul>
1215 <li>1. Click Output on the top of the screen and then Select Output Settings.</li>
1216 <li>2. In the destination, choose RTMP Server and click OK.</li>
1217 <li>3. In the Address box, type/paste your Address.</li>
1218 <li>4. In the Stream box, type/paste your Stream key.</li>
1219 <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>';
1220 print '</div>';
1221
1222 print '</div>';
1223 }
1224
1225
1226
1227 /*
1228 *
1229 * Display Larix settings
1230 *
1231 */
1232
1233
1234 public function wpstream_larix_settings($obs_uri,$obs_stream){
1235 print '<div class="external_software_streaming wpstream_larix_settings" style="display:none;">';
1236 $larix_rtmp=$obs_uri.$obs_stream;
1237 print '<div class="external_software_streaming_details">';
1238 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('RTMP:').'</strong>';
1239 print '<div class="wpstream_live_uri_text wpstream_larix_rtmp"></div>
1240 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1241
1242 print '</div>';
1243
1244 print'</div>';
1245
1246 print ' <div class="wpstream_modal_explanations">';
1247 print '<ul>
1248 <li>A. Scan the QR code.</li>
1249 <li>or</li>
1250 <li>B. Manually configure Larix with the above RTMP</li>';
1251 if(wp_is_mobile() ){
1252 print '
1253 <li>or</li>
1254 <li>C. Click on the button below </li></ul>';
1255 }
1256
1257
1258 print '</div>';
1259
1260
1261 print '<img class="print_qrcode" src="" />';
1262 if(wp_is_mobile() ){
1263 print '<a href="" class="wpstream_start_with_larix_mobile" >Start Streaming with Larix</a>';
1264 }
1265
1266
1267
1268 print '</div>';
1269 }
1270
1271
1272
1273
1274 /*
1275 *
1276 * Display Wmix settings
1277 *
1278 */
1279
1280
1281 public function wpstream_wmix_settings($obs_uri,$obs_stream){
1282 print '<div class="external_software_streaming wpstream_wimx_settings" style="display:none;">';
1283
1284 print '<div class="external_software_streaming_details">';
1285 print '<div class="event_list_unit_notificationx"><strong>'.esc_html__('URL:').' </strong>';
1286 print '<div class="wpstream_live_uri_text">' . $obs_uri.'</div>
1287 <div class="copy_live_uri">'.__('copy','wpstream').'</div>';
1288
1289 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream Key:').' </strong>
1290 <div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy','wpstream').'</div></div>';
1291 print '</div>';
1292
1293 print'</div>';
1294
1295 print ' <div class="wpstream_modal_explanations">';
1296 print '<ul>
1297 <li>1. Click on the gear icon near the stream button on the bottom.</li>
1298 <li>2. Choose a custom RTMP Server in destination.</li>
1299 <li>3. In the URL box, type/paste your URL.</li>
1300 <li>4. In the Stream key, type/paste your Stream key.</li>
1301 <li>5. Save changes. You can start streaming by clicking on the stream button at the bottom of the dashboard.</li></ul>';
1302 print '</div>';
1303
1304 print '</div>';
1305 }
1306
1307
1308
1309 /*
1310 * Set Settings
1311 *
1312 *
1313 */
1314
1315 public function wpstream_settings(){
1316
1317 if( !current_user_can('administrator') ){
1318 die('Only for administrators');
1319 }
1320
1321
1322 if($_SERVER['REQUEST_METHOD'] === 'POST'){
1323 if( !wp_verify_nonce($_POST['wpstream-settings-nonce'],'wpstream-settings-nonce') ){
1324 die('Security check');
1325 }
1326
1327 $allowed_html = array();
1328 $exclude_array = array();
1329 $allowed_html = array();
1330
1331
1332
1333 if( isset($_POST['user_streaming_channel_type_hidden']) && intval($_POST['user_streaming_channel_type_hidden'])==1 && !isset($_POST['stream_role']) ){
1334 update_option( sanitize_key('wpstream_stream_role'), '' );
1335 }
1336
1337 foreach($_POST as $variable=>$value){
1338 if ($variable!='submit'){
1339 if (!in_array($variable, $exclude_array) ){
1340 update_option( sanitize_key('wpstream_'.$variable), sanitize_text_field ($value) );
1341 }
1342
1343 if($variable=='stream_role'){
1344 update_option( sanitize_key('wpstream_stream_role'), $value );
1345 }
1346
1347 }
1348 }
1349
1350
1351 if( isset($_GET['tab']) && $_GET['tab']=='default_options' ){
1352 $event_settings=array();
1353 foreach($this->global_event_options as $key=>$option){
1354 $event_settings[$key]='';
1355 if(isset($_POST['wpstream_event_set_'.$key]) && $_POST['wpstream_event_set_'.$key]=='on'){
1356 $event_settings[$key]=1;
1357 }else{
1358 $event_settings[$key]=0;
1359 }
1360 }
1361 update_option('wpstream_user_streaming_global_channel_options',$event_settings);
1362 }
1363
1364
1365
1366
1367 // reset permalinkgs
1368 global $wp_rewrite;
1369
1370 update_option( "rewrite_rules", FALSE );
1371 $wp_rewrite->flush_rules( true );
1372
1373 }
1374
1375 $wpstream_settings_array =array(
1376 1 => array(
1377 'tab' => 'general_options',
1378 'label' => esc_html__('Slug for free video/channel pages ','wpstream'),
1379 'name' => 'free_media_slug',
1380 'type' => 'text',
1381 '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'),
1382 ),
1383
1384 2 => array(
1385 'tab' => 'general_options',
1386 'label' => esc_html__('Non-Admin User Roles Allowed to Broadcast','wpstream'),
1387 'name' => 'stream_role',
1388 'type' => 'user_roles',
1389 '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'),
1390
1391 ),
1392 3 => array(
1393 'tab' => 'general_options',
1394 'label' => esc_html__('Non Admin Streamers Channel Type.','wpstream'),
1395 'name' => 'user_streaming_channel_type',
1396 'type' => 'select',
1397 'select_values'=>array(
1398 'free' => esc_html__('Free Live Channel','wpstream'),
1399 'paid' => esc_html__('Pay-Per-View','wpstream')
1400 ),
1401 'details' => esc_html__('Choose whether the channels assigned to non-admins are free-for-all or pay-per-view (WooCommerce product).','wpstream'),
1402 ),
1403
1404 4 => array(
1405 'tab' => 'general_options',
1406 'label' => esc_html__('Default Pay-Per-View Price','wpstream'),
1407 'name' => 'user_streaming_default_price',
1408 'type' => 'text',
1409 'details' => esc_html__('Default price of pay-per-view channels assigned to non-admins.','wpstream'),
1410 ),
1411
1412
1413
1414 6 => array(
1415 'tab' => 'subscription_options',
1416 'label' => esc_html__('Use Global Subscription Mode','wpstream'),
1417 'name' => 'global_sub',
1418 'type' => 'slidertoogle',
1419 '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'),
1420 ),
1421
1422 7 => array(
1423 'tab' => 'subscription_options',
1424 'label' => esc_html__('Subscription ID for Global Subscription Mode','wpstream'),
1425 'name' => 'global_sub_id',
1426 'type' => 'text',
1427 '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'),
1428 ),
1429 8 => array(
1430 'tab' => 'messages_options',
1431 'label' => esc_html__('PPV not logged in message','wpstream'),
1432 'name' => 'product_not_login',
1433 'type' => 'text',
1434 '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'),
1435 'default' => esc_html__('You must be logged in to watch this video.','wpstream'),
1436 ),
1437 9 => array(
1438 'tab' => 'messages_options',
1439 'label' => esc_html__('PPV not purchased message','wpstream'),
1440 'name' => 'product_not_bought',
1441 'type' => 'text',
1442 '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'),
1443 'default' => esc_html__('You did not yet purchase this item.','wpstream'),
1444 ),
1445 10 => array(
1446 'tab' => 'messages_options',
1447 'label' => esc_html__('Subscription not purchased message','wpstream'),
1448 'name' => 'product_not_subscribe',
1449 'type' => 'text',
1450 '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'),
1451 'default' => esc_html__(' You did not yet subscribe to this item.','wpstream'),
1452 ),
1453 11 => array(
1454 'tab' => 'messages_options',
1455 'label' => esc_html__('Thank you message','wpstream'),
1456 'name' => 'product_thankyou',
1457 'type' => 'text',
1458 'details' => esc_html__('This message will be displayed on the thank you page (after purchase) and the confirmation email.','wpstream'),
1459 'default' => esc_html__('Thanks for your purchase. You can access your item at any time by visiting the following page: {item_link}','wpstream'),
1460 ),
1461
1462 12 => array(
1463 'tab' => 'messages_options',
1464 'label' => esc_html__('Subscription Active message','wpstream'),
1465 'name' => 'subscription_active',
1466 'type' => 'text',
1467 'details' => esc_html__('This message will be displayed on subscription product page.','wpstream'),
1468 'default' => esc_html__('Your Subscription is Active','wpstream'),
1469 ),
1470 13 => array(
1471 'tab' => 'messages_options',
1472 'label' => esc_html__('You are not live message','wpstream'),
1473 'name' => 'you_are_not_live',
1474 'type' => 'text',
1475 'details' => esc_html__('This message will be displayed in player.','wpstream'),
1476 'default' => esc_html__('We are not live at this moment','wpstream'),
1477 ),
1478
1479 14 => array(
1480 'tab' => 'general_options',
1481 'label' => esc_html__('Video player theme','wpstream'),
1482 'name' => 'video_player_theme',
1483 'type' => 'select',
1484 'select_values'=>array(
1485 'default' => esc_html__('Default','wpstream'),
1486 'city' => esc_html__('City','wpstream'),
1487 'forest' => esc_html__('Forest','wpstream'),
1488 'fantasy' => esc_html__('Fantasy','wpstream'),
1489 'sea' => esc_html__('Sea','wpstream'),
1490 ),
1491 'details' => esc_html__('Choose the video player theme to have a different look for the player.','wpstream'),
1492 ),
1493 'wpstream_player_logo' => array(
1494 'tab' => 'general_options',
1495 'name' => 'player_logo',
1496 'label' => esc_html__('Logo for the video player','wpstream'),
1497 'type' => 'image',
1498 'details' => esc_html__('This logo will be displayed on the the video player.','wpstream'),
1499 'default' => '',
1500 'image_size' => 'thumbnail',
1501 ),
1502 // hide the video player logo opacity for now
1503 // 'wpstream_player_logo_opacity' => array(
1504 // 'tab' => 'general_options',
1505 // 'name' => 'player_logo_opacity',
1506 // 'label' => esc_html__('Opacity of the video player logo','wpstream'),
1507 // 'type' => 'range',
1508 // 'details' => esc_html__('Set the opacity of the logo','wpstream'),
1509 // 'default' => '',
1510 // 'image_size' => 'thumbnail',
1511 // ),
1512 'wpsteram_player_logo_position' => array(
1513 'tab' => 'general_options',
1514 'name' => 'player_logo_position',
1515 'label' => esc_html__('Position of the video player logo','wpstream'),
1516 'type' => 'select',
1517 'select_values'=>array(
1518 'top-left' => esc_html__('Top Left','wpstream'),
1519 'top-right' => esc_html__('Top Right','wpstream'),
1520 'bottom-left' => esc_html__('Bottom Left','wpstream'),
1521 'bottom-right' => esc_html__('Bottom Right','wpstream'),
1522 ),
1523 'details' => esc_html__('Choose the position of the logo on the video player.','wpstream'),
1524 'default' => '',
1525 ),
1526
1527
1528
1529 99 => array(
1530 'tab' => 'default_options',
1531 'label' => esc_html__('Events Options ','wpstream'),
1532 'name' => 'user_streaming_global_channel_options',
1533 'type' => 'user_streaming_global_channel_options',
1534 'details' => esc_html__('Global Options for live events.','wpstream'),
1535 ),
1536
1537 100 => array(
1538 'tab' => 'default_options_vod',
1539 'label' => esc_html__('Autoplay','wpstream'),
1540 'name' => 'vod_autoplay',
1541 'type' => 'slidertoogle',
1542 'details' => esc_html__('If enabled, video will attempt to start playing automatically. This is only achievable in some browsers.','wpstream'),
1543 ),
1544
1545
1546 101 => array(
1547 'tab' => 'default_options_vod',
1548 'label' => esc_html__('Start Muted','wpstream'),
1549 'name' => 'vod_start_muted',
1550 'type' => 'slidertoogle',
1551 'details' => esc_html__('If enabled, video will start muted. This may increase the rate of autoplay in some browsers.','wpstream'),
1552 ),
1553
1554 102 => array(
1555 'tab' => 'default_options_vod',
1556 'label' => esc_html__('Lock To Website','wpstream'),
1557 'name' => 'vod_domain_lock',
1558 'type' => 'slidertoogle',
1559 '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') ),
1560 ),
1561
1562 103 => array(
1563 'tab' => 'default_options_vod',
1564 'label' => esc_html__('Encrypt Video','wpstream'),
1565 'name' => 'vod_encrypt',
1566 'type' => 'slidertoogle',
1567 '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'),
1568 ),
1569
1570 /* 'vod_domain_lock' =>array(
1571 'name' => esc_html__('Video On Demand - Lock To Website','wpstream'),
1572 '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') ),
1573 'defaults' => 'no',
1574 ),
1575 'vod_encrypt' =>array(
1576 'name' => esc_html__('Encrypt Video on Demand','wpstream'),
1577 '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'),
1578 'defaults' => 'no',
1579 ),*/
1580
1581 104 => array(
1582 'tab' => 'support_tab',
1583 'label' => esc_html__('Logs','wpstream'),
1584 'name' => 'logs',
1585 'type' => 'logs_table',
1586 'details' => esc_html__('This is the error log of the plugin.','wpstream'),
1587 )
1588
1589 );
1590
1591 $active_tab = 'general_options';
1592 if( isset( $_GET[ 'tab' ] ) ) {
1593 $active_tab = $_GET[ 'tab' ];
1594 }
1595
1596
1597 print '<div class="theme_options_tab_wpstream" style="display:block;" >
1598 <h1>'.__('WpStream Settings','wpstream').'</h1>
1599 <form method="post" action="" >';
1600
1601 print '<h2 class="nav-tab-wrapper">
1602 <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>
1603 <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>
1604 <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>
1605 <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>
1606 <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>
1607 <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>
1608 </h2>';
1609 $help_link='';
1610 print '<div class="wpstream_option_wrapper">';
1611
1612 switch ($active_tab) {
1613 case 'general_options':
1614 $help_link='https://docs.wpstream.net/docs/general-settings/';
1615 break;
1616 case 'default_options':
1617 $help_link='https://docs.wpstream.net/docs/default-channel-settings/';
1618 break;
1619 case 'default_options_vod':
1620 $help_link='https://docs.wpstream.net/docs/vod-settings/';
1621 break;
1622 case 'subscription_options':
1623 $help_link='https://docs.wpstream.net/docs/subscription-options/';
1624 break;
1625 case 'messages_options':
1626 $help_link='https://docs.wpstream.net/docs/customize-messages/';
1627 break;
1628 }
1629
1630 print '<div class="options_wrapper">';
1631 foreach ($wpstream_settings_array as $key=>$option){
1632 if($option['tab']!=$active_tab){
1633 continue;
1634 }
1635
1636 if ( $option['type']=='user_streaming_global_channel_options' ) {
1637 print '<div class="default-channel-settings-info">';
1638 print esc_html__( 'These settings will apply to newly created channels; existing channels will not change settings if you change them here', 'wpstream');
1639 print '</div>';
1640
1641 }
1642 print '<div class="wpstream_option">';
1643 $options_value = get_option('wpstream_'.$option['name']) ;
1644
1645
1646 switch( $option['type'] ) {
1647 case 'user_roles':
1648 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1649 print $this->wpstream_select_user_roles($option['name'],$options_value);
1650 print '<div class="settings_details">'.$option['details'].'</div>';
1651 break;
1652 case 'user_streaming_global_channel_options':
1653 $exclude_array=array();
1654 $this->user_streaming_global_channel_options($option['name'],$options_value,$exclude_array);
1655 break;
1656 case 'text':
1657 if($options_value==''){
1658 $options_value='';
1659 if(isset($option['default'])){
1660 $options_value=$option['default'];
1661 }
1662 }
1663
1664 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1665 print '<input class="wpstream-text-input-setting" id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_attr($options_value).'" />';
1666 print '<div class="settings_details">'.$option['details'].'</div>';
1667 break;
1668 case 'select':
1669 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1670 print '<select id="'.$option['name'].'" name="'.$option['name'].'" >';
1671 foreach($option['select_values'] as $key=>$value){
1672 print '<option value="'.$key.'" ';
1673 if( $key == esc_html($options_value) ){
1674 print ' selected ';
1675 }
1676 print '>'.$value.'</option>';
1677 }
1678 print '</select>';
1679 print '<input type="hidden" name="'.$option['name'].'_hidden" value="1" >';
1680 print '<div class="settings_details">'.$option['details'].'</div>';
1681 break;
1682 case 'slidertoogle':
1683 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1684 print '<div style="display: flex; gap: 25px; justify-content: space-between;">';
1685 print '<div class="settings_details">'.$option['details'].'</div>';
1686 print '<label class="wpstream_switch">
1687 <input type="hidden" class="wpstream_event_option_itemc" value="0" name="'.$option['name'].'" >
1688 <input type="checkbox" class="wpstream_event_option_itemc" value="1" name="'.$option['name'].'" ';
1689 if( intval($options_value) !==0 ){
1690 print ' checked ';
1691 }
1692 print '> <span class="wpstream_slider round"></span>';
1693 print '</label>';
1694 print '</div>';
1695 break;
1696 case 'image':
1697 $image_url = $options_value ? esc_url($options_value) : '';
1698 $has_image = !empty($image_url);
1699
1700 print '<label for="' . $option['name'] . '">' . $option['label'] . '</label>';
1701 print '<div class="wpstream-image-upload-wrapper">';
1702 print '<input type="hidden" id="' . $option['name'] . '" name="' . $option['name'] . '" value="' . $image_url . '" />';
1703
1704 // Preview area
1705 print '<div class="wpstream-image-preview" style="' . (!$has_image ? 'display:none;' : '') . '">';
1706 print '<img src="' . $image_url . '" alt="Preview" />';
1707 print '</div>';
1708
1709 // Upload/remove buttons
1710 print '<div class="wpstream-image-upload-buttons">';
1711 print '<button type="button" class="wpstream-upload-image button">' . esc_html__('Upload Image', 'wpstream') . '</button>';
1712 print '<button type="button" class="wpstream-remove-image button" style="' . (!$has_image ? 'display:none;' : '') . '">' . esc_html__('Remove Image', 'wpstream') . '</button>';
1713 print '</div>';
1714
1715 print '</div>';
1716 print '<div class="settings_details">' . $option['details'] . '</div>';
1717 break;
1718 case 'range':
1719 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
1720 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).'" />';
1721 print '<div class="settings_details">'.$option['details'].'</div>';
1722 break;
1723 case 'logs_table':
1724 $this->wpstream_support_tab();
1725 break;
1726 }
1727 print '</div>';
1728 }
1729 print '</div>'; // options wrapper
1730 if($help_link!==''){
1731 print '<div class="wpstream_options_help"><a href="'.esc_url($help_link).'" target="_blank" >'.esc_html__('Video Help','wpstream').'</a></div>';
1732 }
1733 print '</div>';
1734
1735
1736 if ( $active_tab != 'support_tab') {
1737 print '<div class="wpstream-save-settings">';
1738 print '<input type="submit" name="submit" class="wpstream_button wpstream_button_action" value="'.__('Save Changes','wpstream').'" />';
1739 print '<div class="spinner"></div>';
1740 print '</div>';
1741 }
1742
1743 print '<input id="wpstream-settings-nonce" name="wpstream-settings-nonce" type="hidden" value="'.wp_create_nonce('wpstream-settings-nonce').'" /> ';
1744 print '</form>';
1745 print '</div>';
1746
1747 }
1748
1749 /**
1750 * Get system information for support tab
1751 *
1752 * @return array System information
1753 */
1754 private function get_system_info() {
1755 global $wp_version;
1756
1757 $php_version = phpversion();
1758 $wp_version_info = $wp_version;
1759 $site_debug_mode = (defined('WP_DEBUG') && WP_DEBUG);
1760 $wp_memory_limit = WP_MEMORY_LIMIT;
1761
1762 $wpstream_version = WPSTREAM_PLUGIN_VERSION;
1763 $wpstream_plugin_outdated = false;
1764
1765 // Check if plugin is outdated
1766 $update_plugins = get_site_transient('update_plugins');
1767 if (isset($update_plugins->response['plugin/wpstream.php'])) {
1768 $wpstream_plugin_outdated = true;
1769 }
1770
1771 // Check API status
1772 $api_status = false;
1773 if (method_exists($this->main->wpstream_live_connection, 'wpstream_get_token')) {
1774 $token = $this->main->wpstream_live_connection->wpstream_get_token();
1775 $api_status = !empty($token);
1776 }
1777
1778 return array(
1779 'php_version' => $php_version,
1780 'wp_version' => $wp_version_info,
1781 'site_debug_mode' => $site_debug_mode,
1782 'wp_memory_limit' => $wp_memory_limit,
1783 'wpstream_version' => $wpstream_version,
1784 'wpstream_plugin_outdated' => $wpstream_plugin_outdated,
1785 'api_status' => $api_status
1786 );
1787 }
1788
1789 /**
1790 * Render system information HTML
1791 */
1792 private function render_system_info() {
1793 $system_info = $this->get_system_info();
1794 ?>
1795
1796 <div class="wpstream-system-info">
1797 <h3><?php esc_html_e('System Information', 'wpstream'); ?></h3>
1798 <table class="widefat">
1799 <tbody>
1800 <tr>
1801 <td><strong><?php esc_html_e('PHP Version', 'wpstream'); ?></strong></td>
1802 <td><?php echo esc_html($system_info['php_version']); ?></td>
1803 <td>
1804 <?php if (version_compare($system_info['php_version'], '7.4', '<')): ?>
1805 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1806 <?php esc_html_e('We recommend PHP 7.4 or higher', 'wpstream'); ?>
1807 <?php else: ?>
1808 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1809 <?php endif; ?>
1810 </td>
1811 </tr>
1812 <tr>
1813 <td><strong><?php esc_html_e('WordPress Version', 'wpstream'); ?></strong></td>
1814 <td><?php echo esc_html($system_info['wp_version']); ?></td>
1815 <td>
1816 <?php if (version_compare($system_info['wp_version'], '5.6', '<')): ?>
1817 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1818 <?php esc_html_e('We recommend WordPress 5.6 or higher', 'wpstream'); ?>
1819 <?php else: ?>
1820 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1821 <?php endif; ?>
1822 </td>
1823 </tr>
1824 <tr>
1825 <td><strong><?php esc_html_e('WP Debug Mode', 'wpstream'); ?></strong></td>
1826 <td><?php echo $system_info['site_debug_mode'] ? esc_html__('Enabled', 'wpstream') : esc_html__('Disabled', 'wpstream'); ?></td>
1827 <td>
1828 <?php if ($system_info['site_debug_mode']): ?>
1829 <span class="dashicons dashicons-info" style="color: #00a0d2;"></span>
1830 <?php esc_html_e('Debug mode should be disabled on production sites', 'wpstream'); ?>
1831 <?php else: ?>
1832 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1833 <?php endif; ?>
1834 </td>
1835 </tr>
1836 <tr>
1837 <td><strong><?php esc_html_e('WP Memory Limit', 'wpstream'); ?></strong></td>
1838 <td><?php echo esc_html($system_info['wp_memory_limit']); ?></td>
1839 <td>
1840 <?php
1841 $memory_limit = wp_convert_hr_to_bytes($system_info['wp_memory_limit']);
1842 if ($memory_limit < 64 * 1024 * 1024): // 64MB
1843 ?>
1844 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1845 <?php esc_html_e('We recommend at least 64MB', 'wpstream'); ?>
1846 <?php else: ?>
1847 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1848 <?php endif; ?>
1849 </td>
1850 </tr>
1851 <tr>
1852 <td><strong><?php esc_html_e('WpStream Version', 'wpstream'); ?></strong></td>
1853 <td><?php echo esc_html($system_info['wpstream_version']); ?></td>
1854 <td style="display: flex; align-items: center; gap: 5px;">
1855 <?php if ($system_info['wpstream_plugin_outdated']): ?>
1856 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1857 <?php esc_html_e('Update available', 'wpstream'); ?>
1858 <div class="update-button-wrapper">
1859 <button class="wpstream-update-plugin-button button button-primary" data-plugin="wpstream/wpstream.php">
1860 <?php esc_html_e('Update Now', 'wpstream'); ?>
1861 </button>
1862 </div>
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('API Connection', 'wpstream'); ?></strong></td>
1870 <td><?php echo $system_info['api_status'] ? esc_html__('Connected', 'wpstream') : esc_html__('Disconnected', 'wpstream'); ?></td>
1871 <td>
1872 <?php if (!$system_info['api_status']): ?>
1873 <span class="dashicons dashicons-warning" style="color: #ffb900;"></span>
1874 <?php esc_html_e('API connection issue', 'wpstream'); ?>
1875 <?php else: ?>
1876 <span class="dashicons dashicons-yes-alt" style="color: #46b450;"></span>
1877 <?php endif; ?>
1878 </td>
1879 </tr>
1880 </tbody>
1881 </table>
1882 </div>
1883 <?php
1884 }
1885
1886 /**
1887 * Render support tab content
1888 */
1889 public function wpstream_support_tab() {
1890 ?>
1891 <div class="wrap">
1892 <div class="wpstream-support-tab-root">
1893 <?php $this->render_system_info(); ?>
1894
1895 <div class="wpstream-plugins-table-container">
1896 <h3><?php esc_html_e('Active Plugins', 'wpstream'); ?></h3>
1897 <table class="widefat wpstream-plugins-table">
1898 <thead>
1899 <tr>
1900 <th><?php esc_html_e('Plugin', 'wpstream'); ?></th>
1901 <th><?php esc_html_e('Version', 'wpstream'); ?></th>
1902 </tr>
1903 </thead>
1904 <tbody>
1905 <?php
1906 $plugins_data = $this->wpstream_get_plugins_data();
1907 if (empty($plugins_data)) {
1908 echo '<tr><td colspan="3">' . esc_html__('No WPStream plugins found.', 'wpstream') . '</td></tr>';
1909 } else {
1910 foreach ($plugins_data as $plugin) {
1911 echo '<tr>';
1912 echo '<td>' . esc_html($plugin['name']) . '</td>';
1913 echo '<td>';
1914 echo esc_html($plugin['version']);
1915 if ( isset($plugin['new_version']) ) {
1916 echo '<div class="wpstream-tooltip-container">';
1917 echo '<span class="dashicons dashicons-info wpstream-tooltip" title="' . esc_attr($plugin['new_version']) . '">';
1918 echo '</span>';
1919 echo '<div class="wpstream-custom-tooltip">' . sprintf(
1920 esc_html__('A new version is available: %s', 'wpstream'),
1921 esc_html($plugin['new_version'])
1922 ) . '</div>';
1923 echo '</div>';
1924 }
1925 echo '</td>';
1926 echo '</tr>';
1927 }
1928 }
1929 ?>
1930 </tbody>
1931 </table>
1932 </div>
1933
1934 <div class="wpstream-logs-table-container">
1935 <h3><?php esc_html_e('Recent Logs', 'wpstream'); ?></h3>
1936 <table class="widefat wpstream-logs-table">
1937 <thead>
1938 <tr>
1939 <th><?php esc_html_e('Time', 'wpstream'); ?></th>
1940 <th><?php esc_html_e('Type', 'wpstream'); ?></th>
1941 <th><?php esc_html_e('Description', 'wpstream'); ?></th>
1942 </tr>
1943 </thead>
1944 <tbody>
1945 <?php
1946 $logs = get_option('wpstream_logs');
1947 if ( !is_array($logs) || empty($logs) ) {
1948 echo '<tr><td colspan="3">' . esc_html__('No logs found.', 'wpstream') . '</td></tr>';
1949 } else {
1950 foreach ($logs as $log) {
1951 echo '<tr>';
1952 echo '<td>' . esc_html(date('Y-m-d H:i:s', $log['timestamp'] ) ) . '</td>';
1953 echo '<td>' . esc_html($log['type']) . '</td>';
1954 echo '<td>' . esc_html($log['description']) . '</td>';
1955 echo '</tr>';
1956 }
1957 }
1958 ?>
1959 </tbody>
1960 </table>
1961 </div>
1962 </div>
1963 </div>
1964 <?php
1965 }
1966
1967 /**
1968 * Get plugins data.
1969 *
1970 * @return array
1971 */
1972 public function wpstream_get_plugins_data() {
1973 if (!function_exists('get_plugins')) {
1974 require_once ABSPATH . 'wp-admin/includes/plugin.php';
1975 }
1976
1977 // Get all installed plugins
1978 $all_plugins = get_plugins();
1979 $update_data = get_site_transient('update_plugins');
1980 $all_plugins_info = [];
1981
1982 // We want to get data only for the WpStream plugins
1983 $wpstream_plugins = array(
1984 'WpStream' => array(
1985 'path' => 'wpstream/wpstream.php',
1986 ),
1987 'WooCommerce' => array(
1988 'path' => 'woocommerce/woocommerce.php',
1989 ),
1990 'Meta Box' => array(
1991 'path' => 'meta-box/meta-box.php',
1992 ),
1993 'One Click Demo Import' => array(
1994 'path' => 'one-click-demo-import/one-click-demo-import.php',
1995 ),
1996 'Better Messages' => array(
1997 'path' => 'bp-better-messages/bp-better-messages.php',
1998 ),
1999
2000 );
2001
2002 foreach ($all_plugins as $plugin_path => $plugin_data) {
2003 $is_active = is_plugin_active( $plugin_path );
2004 $has_update = isset( $update_data->response[$plugin_path] );
2005
2006 $plugin_info = [
2007 'name' => $plugin_data['Name'],
2008 'version' => $plugin_data['Version'],
2009 'path' => $plugin_path,
2010 'active' => $is_active ? 'Yes' : 'No',
2011 'needs_update' => $has_update ? 'Yes' : 'No'
2012 ];
2013
2014 if ($has_update) {
2015 $plugin_info['new_version'] = $update_data->response[$plugin_path]->new_version;
2016 }
2017
2018 $all_plugins_info[] = $plugin_info;
2019 }
2020
2021 // Filter out the elements from $all_plugins_info that are not in $wpstream_plugins
2022 foreach ( $all_plugins_info as $key => $plugin_info ) {
2023 // compare $plugin_info['path'] against the path property on each $wpstream_plugins element item
2024 // if the path is not in $wpstream_plugins, unset the element
2025 if ( !in_array( $plugin_info['path'], array_column( $wpstream_plugins, 'path' ) ) ) {
2026 unset( $all_plugins_info[$key] );
2027 }
2028 }
2029
2030 return $all_plugins_info;
2031 }
2032
2033
2034 /**
2035 * Set user roles
2036 *
2037 * @since 3.0.1
2038 */
2039
2040 public function user_streaming_global_channel_options( $name, $value, $local_array='', $disabled = false ){
2041
2042 foreach($this->global_event_options as $key=>$option){
2043
2044 if( is_array($local_array) && !in_array($key,$local_array)){
2045 print '<div class="wpstream_setting_event_unit_wrapper wpstream-setting-'.esc_attr($key).' ">';
2046
2047 print '<label for="'.$option['name'].'">'.$option['name'].'</label>';
2048
2049 print '<div style="display: flex; gap: 25px; justify-content: space-between;">';
2050 print '<div class="settings_details">'.$option['details'].'</div>';
2051 print '
2052 <label class="wpstream_switch">
2053 <input type="checkbox" class="wpstream_event_option_item" data-attr-ajaxname="'.esc_attr($key).'" name="wpstream_event_set_'.esc_attr($key).'" ';
2054 if( isset($value[$key]) ){
2055 if( intval($value[$key]) !==0 ){
2056 print ' checked ';
2057 }
2058 }else{
2059 if($option['defaults']=='yes') {
2060 print ' checked ';
2061 }
2062 }
2063 if ($disabled) {
2064 print ' disabled ';
2065 }
2066
2067
2068 print '> <span class="wpstream_slider round"></span>';
2069 print '</label>';
2070 print '</div>';
2071
2072
2073 print '</div>';
2074 }
2075 }
2076
2077
2078 }
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088 /*
2089 * Set user roles
2090 *
2091 * @since 3.0.1
2092 */
2093
2094 public function wpstream_select_user_roles($name,$value){
2095 if($value==''){
2096 $value=array();
2097 }
2098
2099 $roles = get_editable_roles();
2100 $return = '<select id="wpstream_user_roles" name="'.esc_html($name).'[]" multiple>';
2101 unset( $roles['administrator'] );
2102
2103 foreach ($roles as $key=>$role){
2104 $return .= '<option value="'.$key.'" ';
2105 if( in_array($key, $value) ){
2106 $return .= ' selected ';
2107 }
2108 $return .= '>'.$role['name'].'</option>';
2109 }
2110 $return .= '</select>';
2111
2112
2113 return $return;
2114 }
2115
2116
2117 /*
2118 * Set credential admin function
2119 *
2120 * @since 3.0.1
2121 */
2122 public function wpstream_set_wpstream_credentials(){
2123
2124 if($_SERVER['REQUEST_METHOD'] === 'POST'){
2125 $allowed_html = array();
2126 $exclude_array = array();
2127 $allowed_html = array();
2128
2129 foreach($_POST as $variable=>$value){
2130 if ($variable!='submit'){
2131 if (!in_array($variable, $exclude_array) ){
2132 switch ( $variable ) {
2133 case 'api_username':
2134 update_option( sanitize_key('wpstream_api_username'), sanitize_text_field($value) );
2135 break;
2136 case 'api_password':
2137 update_option( sanitize_key('wpstream_api_password'), $value );
2138 break;
2139 }
2140 }
2141 }
2142 }
2143
2144
2145
2146
2147 update_option('wp_estate_token_expire',0);
2148 update_option('wp_estate_curent_token',' ');
2149 delete_transient( 'wpstream_token_api');
2150 delete_transient('wpstream_token_request_30');
2151 delete_transient('wpstream_request_pack_data_per_user_transient');
2152 }
2153
2154
2155 $allowed_html = array();
2156
2157
2158
2159 $wpstream_options_array =array(
2160 2 => array(
2161 'label' => 'WpStream.net Username or Email',
2162 'name' => 'api_username',
2163 'type' => 'text',
2164 ),
2165 3 => array(
2166 'label' => 'WpStream.net Password',
2167 'name' => 'api_password',
2168 'type' => 'password',
2169 ),
2170
2171 );
2172
2173
2174 $token = $this->main->wpstream_live_connection->wpstream_get_token();
2175 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_set_wpstream_credentials');
2176
2177 $this->main->show_user_data($pack_details);
2178
2179 print '<form method="post" action="" >';
2180 print '<div class="theme_options_tab_wpstream" style="display:block;" >
2181 <h1>'.__('WpStream Credentials','wpstream').'</h1>';
2182
2183
2184 if( get_option('wpstream_api_username')=='' || get_option('wpstream_api_password')== '' ){
2185 echo '<div class="api_not_conected wpstream_orange">';
2186 $admin_url_onboard=get_admin_url().'admin.php?page=wpstream_onboard';
2187 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);
2188 echo '</div>';
2189
2190 }else if($token==''){
2191 $text = get_option('wpstream_curl_failed') === "0" ?
2192 ' 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.' :
2193 'Not connected to WpStream. Please note the errors above and contact support.';
2194 echo '<div class="api_not_conected">'.__($text,'wpstream').'</div>';
2195 }else if( $this->main->wpstream_live_connection->wpstream_client_check_api_status() ){
2196 echo '<div class="api_conected">'.__('Connected to WpStream.net!','wpstream').'</div>';
2197 }else{
2198 echo '<div class="api_not_conected wpstream_brown">'.__('Failed to connect to WpStream.net. Please address CURL connectivity with your hosting provider.','wpstream').'</div>';
2199 }
2200 print '<div class="wpstream_option_wrapper">';
2201 foreach ($wpstream_options_array as $key=>$option){
2202 print '<div class="wpstream_option">';
2203
2204 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
2205 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
2206 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
2207
2208 print '</div>';
2209 }
2210 print '</div>';
2211
2212
2213 print '<input type="submit" name="submit" class="wpstream_button wpstream_button_action" value="'.__('Save Changes','wpstream').'" />';
2214
2215 print '<h3>Video Tutorials</h3>';
2216
2217 print '<a class="how_to_videos" target="_blank" href="https://youtu.be/9DQrxsKcpmQ">How to Live Stream to WordPress with OBS</a>';
2218 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>';
2219 print '<a class="how_to_videos" target="_blank" href="https://youtu.be/h6myD_vhKcg">How to Live-Stream to WordPress using your iPhone</a>';
2220
2221 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>';
2222
2223
2224 print '</div>';
2225 print '</form>';
2226
2227 print '<div class="theme_options_tab_wpstream" style="display:block;" >';
2228 $link_new = admin_url('admin.php?page=wpstream_live_channels');
2229 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
2230 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
2231
2232
2233 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create new Free-To-View channel','wpstream').'</a>';
2234 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create Pay-Per-View channel','wpstream').'</a>';
2235 print '<a href="'.esc_url($link_new).'" class="wpstream_no_chanel_add_channel">'.esc_html('My Channels','wpstream').'</a>';
2236 print '</div>';
2237
2238
2239 }
2240
2241
2242
2243 /**
2244 * Media Management
2245 *
2246 * @since 3.0.1
2247 */
2248
2249 public function wpstream_media_management(){
2250 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_media_management');
2251
2252 $this->main->show_user_data($pack_details);
2253
2254
2255 print '<div id="wpstream_media_upload"><h3>'.__('Upload New Recording','wpstream').'</h3>'.$this->wpstream_present_media_upload().'</div>';
2256
2257 print '<div id="wpstream_file_management"><h3 id="video_management_title">'.__('Your Recordings','wpstream').'</h3>'.$this->wpstream_present_file_management().'</div>';
2258
2259
2260 }
2261
2262
2263
2264
2265 /**
2266 *
2267 *
2268 * WpStream Pagination
2269 *
2270 * @since 3.0.1
2271 *
2272 *
2273 */
2274
2275 public function wpstream_pagination($pages , $range = 2) {
2276 $return='';
2277 $showitems = ($range * 2) + 1;
2278 $paged = ( isset( $_GET['paged'] ) ) ? intval($_GET['paged']) : 1;
2279
2280
2281 if (1 != $pages && $pages != 0) {
2282 $return.= '<ul class="pagination wpstream_pagination">';
2283 $return.= "<li class=\"roundleft\"><a href='" . get_pagenum_link($paged - 1) . "'><</a></li>";
2284
2285 $last_page = get_pagenum_link($pages);
2286 for ($i = 1; $i <= $pages; $i++) {
2287 if (1 != $pages && (!($i >= $paged + $range + 1 || $i <= $paged - $range - 1) || $pages <= $showitems )) {
2288 if ($paged == $i) {
2289 $return.= '<li class="active"><a href="' . esc_url(get_pagenum_link($i)) . '" >' . $i . '</a><li>';
2290 } else {
2291 $return.= '<li><a href="' . esc_url(get_pagenum_link($i)) . '" >' . $i . '</a><li>';
2292 }
2293 }
2294 }
2295
2296 $prev_page = get_pagenum_link($paged + 1);
2297 if (($paged + 1) > $pages) {
2298 $prev_page = get_pagenum_link($paged);
2299 } else {
2300 $prev_page = get_pagenum_link($paged + 1);
2301 }
2302
2303
2304 $return.= "<li class=\"roundright\"><a href='" . $prev_page . "'>></a><li>";
2305 $return.= "<li class=\"roundright\"><a href='" . $last_page . "'>>><li>";
2306 $return.= "</ul>";
2307 }
2308 return $return;
2309 }
2310
2311
2312
2313
2314
2315
2316 /**
2317 * Media upload
2318 *
2319 * @since 3.0.1
2320 */
2321 public function wpstream_present_media_upload(){
2322 $to_return='';
2323 $formInputs=$this->main->wpstream_live_connection->wpstream_get_signed_form_upload_data();
2324
2325 if( !$formInputs['success'] ){
2326 if ($formInputs['error'] == 'not_connected'){
2327 $to_return.='<div class="wpstream_upload_container">'.esc_html__('Not connected. Please connect to WpStream to upload videos.','wpstream').'</div>';
2328 }
2329 else {
2330 $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>';
2331 }
2332 return $to_return;
2333 }
2334
2335 if($formInputs['success'] ===true){
2336
2337
2338
2339 $to_return.='<div class="wpstream_upload_container">';
2340 $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>';
2341 $to_return.='<form action="https://wpstream-video.s3.amazonaws.com/"
2342 method="POST"
2343 enctype="multipart/form-data"
2344 data-singleFileUploads="true"
2345 data-limitMultiFileUploads="1"
2346 data-limitConcurrentUploads="1"
2347 class="direct-upload">';
2348
2349 $to_return.='<input id="wpstream_upload" type="file" class="inputfile inputfile-1" value="Pick a video file" name="file" multiple>';
2350 $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>';
2351
2352
2353 $to_return.='<div class="wpstream_file_drop_color">';
2354 $to_return.='<div class="wpstream_form_ex">'.esc_html__('Drop a video file here!','wpstream').'</div>';
2355 $to_return.='<div class="wpstream_form_ex_details">'.__('The Video File must be encoded with the following settings:<br>
2356
2357 Container: <strong>MP4</strong>,<br>
2358 Video codec: <strong>H264</strong>,<br>
2359 Audio codec: <strong>AAC</strong>.<br>
2360 Media will fail to play if it does not follow the above settings.
2361 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>';
2362 if(is_array($formInputs)){
2363 foreach ($formInputs['ref'] as $name => $value) {
2364 $to_return.='<input type="hidden" name="'. $name.'" value="'.$value.'">';
2365 }
2366 }
2367
2368 $to_return.='
2369 <div class="progress-bar-area"></div></div>
2370 </form>';
2371
2372 $to_return.='</div>';
2373 }
2374
2375 return $to_return;
2376
2377 }
2378
2379
2380
2381
2382
2383 /**
2384 * Display movie list
2385 *
2386 * @since 3.0.1
2387 */
2388 public function wpstream_present_file_management(){
2389 $video_list_raw = $this->main->wpstream_live_connection->wpstream_get_videos_from_api();
2390
2391 if ( $video_list_raw === false ) {
2392 return '<div class="wpstream_upload_container">'.esc_html__('Not connected. Please connect to WpStream to upload videos.','wpstream').'</div>';
2393 }
2394
2395 $video_list_raw_array = [];
2396 if( isset( $video_list_raw['items'] ) ){
2397 $video_list_raw_array = $video_list_raw['items'];
2398 }
2399
2400 $keys = array_column( $video_list_raw_array, 'time' );
2401 array_multisort($keys, SORT_DESC , $video_list_raw_array);
2402
2403 $to_return='';
2404
2405 // show pending items
2406 if ( key_exists( 'pending', $video_list_raw ) && is_array( $video_list_raw['pending'] ) ) {
2407 foreach ( $video_list_raw['pending'] as $key => $video ) {
2408 $video_size = intval($video['size']/1048576);
2409 $video_name = esc_html($video['name']);
2410 if($video_name!=''):
2411 $to_return.='<div class="wpstream_video_wrapper">';
2412 $to_return.='<div class="wpstream_video_title">';
2413 $to_return.='<div class="wpstream_video_notice"></div></div>';
2414 $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>';
2415 $to_return.='<div class="wpstream_video_pending">' . esc_html__( 'The video is still processing', 'wpstream') . '</div>';
2416 $to_return.='</div>';
2417 endif;
2418
2419 }
2420 }
2421
2422 // show uploaded items
2423 if( is_array($video_list_raw['items'] ) ) {
2424 foreach ($video_list_raw_array as $key =>$video){
2425 $video_size = intval($video['size']/1048576);
2426 $video_name = esc_html($video['name']);
2427 if($video_name!=''):
2428 $to_return.='<div class="wpstream_video_wrapper">';
2429
2430 $to_return.='<div class="wpstream_video_title">';
2431 $to_return.='<div class="wpstream_video_notice"></div></div>';
2432 $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>';
2433 $to_return.=' <div class="wpstream_delete_media" ';
2434 $to_return.=' onclick="return confirm(\' Are you sure you wish to delete '.$video_name.'?\')" data-filename="'.$video_name.'">'.esc_html__('delete file','wpstream').'</div>';
2435 $to_return.='<div class="wpstream_get_download_link" data-filename="'.$video_name.'">'.esc_html__('download','wpstream').'</div>';
2436 $to_return.='<a href="" class="wpstream_download_link">'.esc_html__('Click to download! The url will work for the next 20 minutes!','wpstream').'</a>';
2437
2438 $add_free_video_url=admin_url('post-new.php?post_type=wpstream_product_vod').'&new_video_name='. rawurlencode($video_name);
2439 $add_paid_video_url=admin_url('post-new.php?post_type=product').'&new_video_name='. rawurlencode($video_name);
2440
2441
2442
2443 $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>';
2444 if (class_exists('WooCommerce')) {
2445 $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>';
2446 }
2447
2448 $to_return.='</div>';
2449 endif;
2450
2451 }
2452 $current_page= get_current_screen();
2453 }
2454
2455 // no items to show
2456 if ( !is_array( $video_list_raw['items'] ) || ( key_exists( 'pending', $video_list_raw ) && !is_array( $video_list_raw['pending'] ) ) ) {
2457 $to_return.= '<div class="wpstream_video_wrapper">'.esc_html__('You don\'t have any videos.','wpstream').'</div>';
2458 }
2459 return $to_return;
2460 }
2461
2462
2463 /**
2464 * Set defualt channels values
2465 *
2466 * @since 3.0.1
2467 */
2468
2469
2470
2471
2472 public function wpstream_publish_wpstream_product($post_id,$post){
2473 if( $post->post_type == 'wpstream_product' ){
2474 update_post_meta ($post_id,'local_event_options_test','working_on_'.$post_id);
2475 $to_save_option=array();
2476
2477 $global_options= get_option('wpstream_user_streaming_global_channel_options');
2478
2479 $local_events = get_post_meta ($post_id ,'local_event_options',true) ;
2480
2481 if( $local_events =='' ){
2482 if( is_array($global_options) ){
2483 foreach($global_options as $key=>$value){
2484 $to_save_option[sanitize_key($key)]=sanitize_text_field($value);
2485 }
2486
2487 update_post_meta ($post_id,'local_event_options',$to_save_option);
2488
2489 }
2490 }
2491
2492
2493 }
2494 }
2495
2496 /**
2497 * save meta options
2498 *
2499 * @since 3.0.1
2500 */
2501 public function wpstream_free_product_update_post($post_id,$post){
2502
2503 if(!is_object($post) || !isset($post->post_type)) {
2504 return;
2505 }
2506
2507
2508
2509
2510
2511
2512
2513 if( $post->post_type == 'wpstream_product' ||
2514 $post->post_type == 'wpstream_product_vod' ):
2515
2516 $allowed_keys=array(
2517 'wpstream_product_type',
2518 'wpstream_free_video',
2519 'wpstream_free_video_external'
2520 );
2521
2522
2523 foreach ($_POST as $key => $value) {
2524 if( !is_array ($value) ){
2525 if (in_array ($key, $allowed_keys)) {
2526 $postmeta = sanitize_text_field ( $value );
2527 update_post_meta($post_id, sanitize_key($key), $postmeta );
2528 }
2529 }
2530 }
2531
2532 endif;
2533
2534 }
2535
2536
2537 /**
2538 * save meta options
2539 *
2540 * @since 3.0.1
2541 */
2542 public function add_wpstream_product_metaboxes() {
2543 global $post;
2544 $post_id = $post->ID;
2545
2546
2547
2548
2549 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');
2550 add_meta_box( 'custom_metabox_video_collection', esc_html__( 'Video Collection', 'wpstream' ), 'wpstream_bundle_custom_metabox_callback', 'wpstream_bundles', 'normal', 'high' );
2551 add_meta_box( 'woocommerce-product-data', esc_html__( 'Product Data', 'wpstream' ), 'woocommerce_product_data_box', 'product', 'normal', 'default' );
2552
2553 if(function_exists('wc_get_product')):
2554 $product = wc_get_product( $post_id );
2555 if ( $product ) {
2556
2557 if ( $product->get_type() === 'wpstream_bundle' ) {
2558 add_meta_box(
2559 'wpstream_woo_custom_metabox',
2560 esc_html__( 'Video Collection Options', 'wpstream' ),
2561 'wpstream_bundle_custom_metabox_callback',
2562 'product',
2563 'normal',
2564 'default'
2565 );
2566 }
2567 }
2568 endif;
2569
2570 }
2571
2572
2573 /**
2574 * make woocomerce virtual products
2575 *
2576 * @since 3.0.1
2577 */
2578
2579
2580 public function wpstream_make_product_virtual($post_id,$post){
2581 global $post;
2582 if(isset($post->ID)){
2583 if ( $post->post_type !== 'product' ) return;
2584 $term_list = wp_get_post_terms($post->ID, 'product_type');
2585 if( $term_list[0]->name=='video_on_demand' ||
2586 $term_list[0]->name=='live_stream' ||
2587 $term_list[0]->name=='wpstream_bundle'){
2588 update_post_meta( $post->ID, '_virtual', 'yes' );
2589 }
2590 }
2591 }
2592
2593
2594
2595 /**
2596 * render meta options
2597 *
2598 * @since 3.0.1
2599 */
2600 public function display_meta_options( $post ) {
2601 wp_nonce_field( plugin_basename( __FILE__ ), 'estate_agent_noncename' );
2602 global $post;
2603
2604 $is_live = '';
2605 $is_video = '';
2606 $is_video_external = '';
2607 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
2608 $is_video = ' selected ';
2609 $wpstream_free_video = esc_html( $_GET['new_video_name']);
2610 }else{
2611 $wpstream_product_type = esc_html(get_post_meta($post->ID, 'wpstream_product_type', true));
2612 $wpstream_free_video = esc_html(get_post_meta($post->ID, 'wpstream_free_video', true));
2613
2614 if($wpstream_product_type==1){
2615 $is_live = ' selected ';
2616 }
2617
2618 if($wpstream_product_type==2){
2619 $is_video = ' selected ';
2620 }
2621
2622 if($wpstream_product_type==3){
2623 $is_video_external = ' selected ';
2624 }
2625 }
2626
2627 print'
2628 <p class="meta-options">
2629 <label for="wpstream_product_type">'.__('Media Type:','wpstream').' </label><br />
2630 <select id="wpstream_product_type" name="wpstream_product_type">
2631 <option value="2" '.$is_video.'>'.__('Recording','wpstream').'</option>
2632 <option value="3" '.$is_video_external.'>'.__('Self Hosted or External Video','wpstream').'</option>
2633 </select>
2634 </p>
2635 ';
2636
2637
2638 $video_list = $this->main->wpstream_live_connection->wpstream_get_videos();
2639
2640
2641 print '
2642 <p class="meta-options video_free">
2643 <label for="wpstream_free_video">'.__('Choose video:','wpstream').' </label><br />
2644 <select id="wpstream_free_video" name="wpstream_free_video">';
2645
2646 if(is_array($video_list)){
2647 foreach ($video_list as $key=>$value){
2648 print '<option value="'.$key.'"';
2649 if($wpstream_free_video === $key){
2650 print ' selected ';
2651 }
2652 print '>'.$value.'</option>';
2653 }
2654 }
2655
2656 print'
2657 </select>
2658 </p>
2659 ';
2660
2661 $wpstream_free_video_external= esc_html(get_post_meta($post->ID, 'wpstream_free_video_external', true));
2662 print '<p class="meta-options1 video_free_external">
2663 <label for="wpstream_free_video_external">'.__('Video:','wpstream').' </label><br />
2664
2665 <input id="wpstream_free_video_external" type="text" size="36" name="wpstream_free_video_external" value="'.$wpstream_free_video_external.'" />
2666 <input id="wpstream_free_video_external_button" type="button" size="40" class="upload_button button" value="'.esc_html__('Select Video','wpstream').'" />';
2667 if($wpstream_product_type==2){
2668 $show_recording='';
2669 $show_external='style="display:none"';
2670 }else{
2671 $show_recording='style="display:none"';
2672 $show_external='';
2673 }
2674 print '<p '.$show_recording.' class="wpstream_option_vod_source wpstream_show_recording">'.esc_html__('Choose one of your existing recordings.','wpstream').'</p>';
2675 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>';
2676
2677 print '</p> ';
2678 }
2679
2680
2681
2682
2683
2684
2685
2686 /**
2687 * Add new product types to Woocommerce select product type
2688 *
2689 * @since 3.0.1
2690 */
2691 public function wpstream_add_products( $types ){
2692 $types[ 'live_stream' ] = __( 'Live Channel','wpestream' );
2693 $types[ 'video_on_demand' ] = __( 'Video On Demand','wpestream' );
2694
2695 return $types;
2696 }
2697
2698 public function wpstream_add_products_class( $classname, $product_type ) {
2699 if ( 'live_stream' === $product_type ) {
2700 $classname = 'WC_Product_Live_Stream';
2701 }
2702 if ( 'video_on_demand' === $product_type ) {
2703 $classname = 'WC_Product_Video_On_Demand';
2704 }
2705 return $classname;
2706 }
2707
2708 public function wpstream_add_custom_wc_products() {
2709 if( class_exists( 'WooCommerce' ) ){
2710 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_live_stream.php';
2711 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_video_on_demand.php';
2712 }
2713 }
2714
2715 /**
2716 * Js action to do when user pick live stream or video on demand
2717 *
2718 * @since 3.0.1
2719 */
2720
2721 public function wpstream_products_custom_js() {
2722 if ( 'product' != get_post_type() ) :
2723 return;
2724 endif;
2725
2726 ?>
2727 <script type='text/javascript'>
2728 jQuery( document ).ready( function() {
2729 jQuery('.options_group.pricing' ).addClass ( 'show_if_live_stream' ).show();
2730 jQuery('.options_group.pricing' ).addClass ( 'show_if_video_on_demand' ).show();
2731 jQuery('.options_group.pricing' ).addClass ( 'show_if_wpstream_bundle' ).show();
2732
2733 jQuery('._sold_individually_field').parent().addClass('show_if_live_stream').show();
2734 jQuery('._sold_individually_field').parent().addClass('show_if_video_on_demand').show();
2735 jQuery('._sold_individually_field').parent().addClass('show_if_wpstream_bundle').show();
2736
2737 jQuery('._sold_individually_field').show();
2738
2739 var selected = jQuery('#product-type').val();
2740 });
2741 </script>
2742 <?php
2743
2744 }
2745
2746
2747 /**
2748 * Add custom classes to the product types
2749 *
2750 * @since 3.0.1
2751 */
2752
2753 public function wpstream_hide_attributes_data_panel( $tabs) {
2754
2755 $tabs['shipping']['class'][] = 'hide_if_live_stream hide_if_video_on_demand hide_if_wpstream_bundle';
2756 $tabs['inventory']['class'][] = 'show_if_live_stream show_if_video_on_demand show_if_wpstream_bundle';
2757
2758 return $tabs;
2759 }
2760
2761
2762
2763 /**
2764 * Hide buy now on products if Netflix mode
2765 *
2766 * @since 3.12
2767 */
2768
2769
2770 public function wpstream_hide_buy_now_subscription_mode( $purchaseable_product_wpblog,$product){
2771 $product_id=$product->get_id();
2772
2773 $term_list = wp_get_post_terms($product_id, 'product_type');
2774
2775 $subscription_model = intval( get_option('wpstream_global_sub','')) ;
2776
2777 if($subscription_model==1){ // if we have Neflix mode
2778 if( $term_list[0]->name=='live_stream' || $term_list[0]->name=='video_on_demand' || $term_list[0]->name=='wpstream_bundle' ){
2779 return false;
2780 }
2781 }
2782
2783 return $purchaseable_product_wpblog;
2784 }
2785
2786
2787
2788
2789
2790
2791 /**
2792 * Add custom fields to custom product types
2793 *
2794 * @since 3.0.1
2795 */
2796
2797 public function wpstream_add_custom_general_fields() {
2798
2799
2800 global $woocommerce, $post;
2801 if(function_exists('wcs_user_has_subscription')){
2802 echo '<div class="options_group show_if_subscription">';
2803 woocommerce_wp_select(
2804 array(
2805 'id' => '_subscript_live_event',
2806 'label' => __( 'Is a subscription based live channel ?', 'woocommerce' ),
2807 'options' => array("yes"=>"yes","no"=>"no")
2808 )
2809 );
2810 echo '</div>';
2811 }
2812
2813 echo '<div class="options_group show_if_live_stream" style="border:none;"></div>';
2814 echo '<div class="options_group show_if_video_on_demand">';
2815
2816
2817 $selected='';
2818 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
2819 $selected=esc_html($_GET['new_video_name']);
2820 }
2821 if($selected==''){
2822 $selected= get_post_meta($post->ID,'_movie_url',true);
2823 }
2824 if( !current_user_can('administrator') ){
2825 print '<div style="margin:10px;">'.esc_html('You need to be an administrator in order to assign videos','wpstream').'</div>';
2826 }else{
2827 woocommerce_wp_select(
2828 array(
2829 'id' => '_movie_url',
2830 'label' => __( 'Choose video', 'woocommerce' ),
2831 'options' => $this->main->wpstream_live_connection->wpstream_get_videos(),
2832 'selected'=> true,
2833 'value' => $selected
2834 )
2835 );
2836 }
2837
2838
2839
2840 echo '</div>';
2841
2842 if(function_exists('wcs_user_has_subscription')){
2843 $selected_sub='';
2844 echo '<div class="options_group show_if_video_on_demand show_if_live_stream">';
2845 if( isset( $_GET['wpstream_parent_sub']) && $_GET['wpstream_parent_sub']!='' ){
2846 $selected_sub=esc_html($_GET['wpstream_parent_sub']);
2847 }
2848 if($selected_sub==''){
2849 $selected_sub= get_post_meta($post->ID,'_wpstream_parent_sub',true);
2850 }
2851 woocommerce_wp_select(
2852 array(
2853 'id' => '_wpstream_parent_sub',
2854 'name' => '_wpstream_parent_sub[]',
2855 'label' => __( 'Attach to subscription', 'woocommerce' ),
2856 'options' => $this->wpstream_return_subscriptions_created(),
2857 'selected'=> true,
2858 'value' => $selected_sub,
2859 'custom_attributes' => array('multiple' => 'multiple')
2860 )
2861 );
2862
2863 echo '</div>';
2864
2865 }
2866 }
2867
2868
2869 public function wpstream_return_subscriptions_created(){
2870 $return=array('0'=>'none');
2871
2872 $args = array(
2873 'post_type' => 'product',
2874 'posts_per_page' => -1,
2875 'orderby' => 'title',
2876 'order' => 'ASC',
2877 'tax_query' => array(
2878 'relation' => 'AND',
2879 array(
2880 'taxonomy' => 'product_type',
2881 'field' => 'slug',
2882 'terms' => array( 'subscription'),
2883 )
2884 )
2885 );
2886
2887 $subscriptions = new WP_Query($args);
2888 if($subscriptions->have_posts()):
2889 while ($subscriptions->have_posts()): $subscriptions->the_post();
2890 $return[ get_the_ID() ] = get_the_title();
2891 endwhile;
2892 endif;
2893
2894 wp_reset_postdata();
2895 return $return;
2896
2897 }
2898
2899
2900
2901
2902
2903
2904 /**
2905 * Save custom fields
2906 *
2907 * @since 3.0.1
2908 */
2909
2910 public function wpstream_add_custom_general_fields_save( $post_id ){
2911
2912 $permited_values = array(
2913 '_movie_url',
2914 '_subscript_live_event',
2915 '_wpstream_parent_sub',
2916
2917 );
2918
2919
2920
2921 foreach($_POST as $key=>$value){
2922 update_post_meta( $post_id, 'event_passed', 0 );
2923 if( in_array($key, $permited_values) ){
2924 if( !empty( $_POST[$key] ) ){
2925 $key = sanitize_key($key);
2926 $value = sanitize_text_field($_POST[$key]);
2927
2928 if($key=='_wpstream_parent_sub'){
2929 $value= $_POST[$key];
2930 $value = array_map("sanitize_text_field", $value);
2931
2932 }
2933 update_post_meta( $post_id, $key, $value );
2934 }
2935 }
2936 }
2937 //die();
2938
2939 }
2940
2941 /**
2942 * Add to cart redirect
2943 *
2944 * @since 3.0.1
2945 */
2946
2947 public function wpstream_add_to_cart() {
2948 wc_get_template( 'single-product/add-to-cart/simple.php' );
2949 }
2950
2951
2952 /**
2953 * Replace add to cart button
2954 *
2955 * @since 3.0.1
2956 */
2957 public function replacing_add_to_cart_button( $button, $product ) {
2958 global $product;
2959 $product_type = $product->get_type();
2960
2961 if($product_type==='live_stream' || $product_type=='video_on_demand'){
2962 return $button = '<a class="button" href="'.get_site_url().'/shop/?add-to-cart=' .$product->get_id(). '&quantity=1">' . __( 'Add to Cart', 'woocommerce' ) . '</a>';
2963 }else{
2964 return $button;
2965 }
2966 }
2967
2968
2969 /**
2970 * Admin notices
2971 *
2972 * @since 3.0.1
2973 */
2974 public function wpstream_admin_notice() {
2975 global $pagenow;
2976 global $typenow;
2977
2978 $wpstream_notices = get_option('wpstream_notices');
2979
2980 /*
2981 if ( !in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
2982 if( !is_array($wpstream_notices) ||
2983 !isset($wpstream_notices['wpstream_woo_notice']) ||
2984 ( isset($wpestate_notices['wpstream_woo_notice']) && $wpestate_notices['wpstream_woo_notice']!='yes') ){
2985
2986
2987 print '<div class="notice wpstream_notices notice-error is-dismissible" data-notice-type="wpstream_woo_notice" >
2988 <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>
2989 </div>';
2990 }
2991 }
2992 */
2993
2994 if( !in_array ('curl', get_loaded_extensions())) {
2995 print '<div class="notice notice-error is-dismissible">
2996 <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>
2997 </div>';
2998 }
2999
3000
3001 $ajax_nonce = wp_create_nonce( "wpstream_notice_nonce" );
3002 print '<input type="hidden" id="wpstream_notice_nonce" value="'.esc_html($ajax_nonce).'"/>';
3003
3004 }
3005
3006 /**
3007 * Admin notices
3008 *
3009 * @since 3.0.1
3010 */
3011 public function wpstream_update_cache_notice(){
3012
3013 //check_ajax_referer( 'wpstream_notice_nonce', 'security' );
3014
3015 $notice_type = esc_html($_POST['notice_type']);
3016 $notices = get_option('wp_stream_notices');
3017
3018 if(! is_array($notices) ){
3019 $notices=array();
3020 }
3021
3022 $notices[$notice_type]='yes';
3023
3024 update_option('wpstream_notices',$notices);
3025 die();
3026 }
3027
3028
3029
3030
3031 /**
3032 * Activate metaboxes for Streaming controls on sidebar
3033 *
3034 * @since 3.0.1
3035 */
3036 public function wpstream_startstreaming_sidebar_meta() {
3037 global $post;
3038 $term_list = wp_get_post_terms($post->ID, 'product_type');
3039
3040 add_meta_box(
3041 'wpstream-sidebar-meta',
3042 esc_html__('Live Streaming', 'wpstream'),
3043 array($this,'wpstream_start_stream_meta'),
3044 'wpstream_product',
3045 'side',
3046 'high'
3047 );
3048
3049 $is_subscription_live_event = esc_html(get_post_meta($post->ID,'_subscript_live_event',true));
3050 if(!is_wp_error( $term_list )){
3051 if( isset($term_list[0]->name) ){
3052 if( $term_list[0]->name=='live_stream' || ($term_list[0]->name=='subscription' && $is_subscription_live_event=='yes' ) ){
3053 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'product', 'side', 'high');
3054 }
3055 }
3056 }
3057
3058 }
3059
3060 /**
3061 * edited 4.0
3062 *
3063 * Show Streaming controls on sidebar
3064 *
3065 * @since 3.0.1
3066 */
3067 public function wpstream_start_stream_meta(){
3068 global $live_event_for_user;
3069 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
3070
3071 global $post;
3072 $local_event_options = get_post_meta ($post->ID,'local_event_options','');
3073
3074
3075
3076 if( get_post_status( $post->ID ) === 'publish' ) {
3077 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
3078 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
3079 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_start_stream_meta');
3080 if( isset($pack_details['available_data_mb'])){
3081 if ($pack_details['available_data_mb'] <= 0){
3082 print '<input type="hidden" id="wpstream_basic_streaming" value="true">';
3083 }
3084 }
3085
3086 $this->wpstream_live_stream_unit($post->ID);
3087 print '<div class="wpstream_modal_background"></div>';
3088 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er1</div>
3089 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
3090 </div>';
3091 } else {
3092 esc_html_e('To Go Live, please publish your channel first !','wpstream');
3093 }
3094 }
3095
3096
3097
3098
3099
3100
3101 /**
3102 *
3103 *
3104 *
3105 */
3106 public function add_dashboard_page() {
3107 add_dashboard_page( '', '', 'administrator', 'wpstream-onboarding', '' );
3108 }
3109
3110
3111
3112
3113
3114 public function wpstream_load_onboarding_wizard() {
3115
3116 // Check for wizard-specific parameter
3117 // Allow plugins to disable the onboarding wizard
3118 // Check if current user is allowed to save settings.
3119
3120
3121 // Don't load the interface if doing an ajax call.
3122 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
3123 return;
3124 }
3125
3126 set_current_screen();
3127
3128 // Remove an action in the Gutenberg plugin ( not core Gutenberg ) which throws an error.
3129 remove_action( 'admin_print_styles', 'gutenberg_block_editor_admin_print_styles' );
3130
3131 $this->actual_load_onboarding_wizard();
3132
3133 }
3134
3135
3136 /*
3137 * Add on boarding to footer
3138 */
3139
3140
3141
3142 public function wpstream_admin_footer_onboarding(){
3143 if( isset($_GET['page']) && $_GET['page']==='wpstream_onboard') {
3144 $this->wpstream_onboard_display();
3145 }
3146 }
3147
3148
3149 /*
3150 * On Board Display
3151 *
3152 */
3153
3154 public function wpstream_pre_onboard_display(){
3155 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user('wpstream_pre_onboard_display');
3156
3157 $this->main->show_user_data($pack_details);
3158
3159
3160 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/logo_onboarding.svg';
3161 ?>
3162
3163 <div class="wpstream_quick_start_wrapper">
3164 <img class="wpstream_onboarding_logo" src="<?php echo esc_url($thumb); ?>" />
3165
3166 <h1><?php print esc_html__('WpStream','wpstream').' <span class="header_special">'.esc_html__('Quick Start','wpstream').'</span>';?></h1>
3167
3168
3169 <p>
3170 <?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');?>
3171 </p>
3172
3173 <div id="wpstream_trigger_quick_start" class="wpstream_button wpstream_button_action"><?php esc_html_e('Start the Guide','wpstream');?></div>
3174
3175
3176
3177 </div>
3178
3179
3180
3181 <script type="text/javascript">
3182 //<![CDATA[
3183 jQuery(document).ready(function(){
3184 jQuery(".wpstream_on_boarding_wrapper").show();
3185 jQuery(".wpstream_modal_background_onboard").show();
3186 });
3187
3188 //]]>
3189 </script>
3190
3191 <?php
3192
3193 }
3194
3195
3196
3197
3198
3199
3200
3201
3202 /*
3203 *
3204 * On Boarding Content
3205 *
3206 */
3207
3208
3209 public function wpstream_onboard_display() {
3210 $this->onboarding_wizard_header();
3211 $this->wpstream_onboarding_step1();
3212 $this->wpstream_onboarding_step2();
3213 $this->wpstream_onboarding_step3_live_streaming();
3214 $this->wpstream_onboarding_step_3_A_live_streaming_free_view();
3215 $this->wpstream_onboarding_step_3_B_live_streaming_pay_per_view();
3216 $this->wpstream_onboarding_step4_vod();
3217 $this->wpstream_onboarding_step_4_free_vod();
3218 $this->wpstream_onboarding_step_4_ppv_vod();
3219 $this->onboarding_wizard_footer();
3220 }
3221
3222
3223 /*
3224 *
3225 * On Boarding Step 1 - the login/register
3226 *
3227 */
3228
3229
3230 public function wpstream_onboarding_step1(){
3231
3232 $wpstream_options_array =array(
3233 2 => array(
3234 'label' => 'WpStream.net Username or Email',
3235 'name' => 'api_username',
3236 'type' => 'text',
3237 ),
3238 3 => array(
3239 'label' => 'WpStream.net Password',
3240 'name' => 'api_password',
3241 'type' => 'password',
3242 ),
3243
3244 );
3245 $token = $this->main->wpstream_live_connection->wpstream_get_token();
3246
3247 ?>
3248 <div class="wpstream_step_wrapper wpstream_step_1" id="wpstream_step_1">
3249 <div class="wpstream_has_credential">
3250 <h1><?php esc_html_e('WpStream Account','wpstream');?></h1>
3251
3252 <div class="wpstream_on_board_login_wrapper_explanations">
3253 <?php esc_html_e('A WpStream account is required to make use of the plugin.','wpstream');?>
3254 </div>
3255
3256
3257 <div class="wpstream_check_account_status">
3258 <?php esc_html_e( 'Checking if you are already logged.....', 'wpstream' ); ?>
3259 </div>
3260
3261 <div class="wpstream_onboarding_notification"></div>
3262
3263 <div class="wpstream_option_wrapper wpstream_on_board_login_wrapper">
3264 <h2><?php esc_html_e('Login with your WpStream Account','wpstream');?></h2>
3265 <?php
3266
3267 foreach ($wpstream_options_array as $key=>$option){
3268 print '<div class="wpstream_option">';
3269
3270 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
3271 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
3272 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
3273
3274 print '</div>';
3275 }
3276 ?>
3277 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_login" value="<?php esc_html_e('Login','wpstream');?>" />
3278 </div>
3279
3280
3281
3282
3283 <div class="wpstream_on_board_register_wrapper">
3284 <h2><?php esc_html_e('Register for a WpStream Account','wpstream');?></h2>
3285 <div class="wpstream_option">
3286 <label for="wpstream_register_email"><?php esc_html_e('Your Email','wpstream');?></label>
3287 <input id="wpstream_register_email" type="text" size="36" name="wpstream_register_email" value="<?php echo get_option('admin_email'); ?>" />
3288
3289 </div>
3290
3291 <div class="wpstream_option">
3292 <label for="wpstream_register_password"><?php esc_html_e('Your Password','wpstream');?></label>
3293 <input id="wpstream_register_password" type="text" size="36" name="wpstream_register_password" value="<?php echo $this->randomPassword();?>" />
3294 </div>
3295
3296
3297 <?php
3298
3299 $curl_response_decoded['capthca']='';
3300 $curl_response_decoded['capthca_id']='';
3301
3302
3303 if( isset($_GET['page']) && $_GET['page']==='wpstream_onboard') {
3304 $url = 'user/getcapthca';
3305 $curl_post_fields = array();
3306 $curl_response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url,$curl_post_fields,true);
3307 $curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
3308
3309 }
3310
3311 ?>
3312 <div class="wpstream_option">
3313 <?php print '<div id="wpstream_capthca">'.$curl_response_decoded['capthca'].'</div>';?>
3314 <label for="wpstream_register_captcha"><?php esc_html_e('Type the characters above','wpstream');?></label>
3315
3316 <input id="wpstream_register_captcha" type="text" size="36" name="wpstream_register_captcha" />
3317 <input id="wpstream_register_captcha_id" type="hidden" size="36" name="wpstream_register_captcha_id" value="<?php echo esc_html($curl_response_decoded['capthca_id']); ?>" />
3318 </div>
3319
3320
3321
3322 <input type="submit" name="submit" class="wpstream_button wpstream_button_action wpstream_onboard_register" value="<?php esc_html_e('register','wpstream');?>" />
3323 </div>
3324
3325
3326 <div id="wpstream_onboarding_action_login"><?php esc_html_e('I already have a WpStream Account','wpstream');?></div>
3327
3328 <div id="wpstream_onboarding_action_register"><?php esc_html_e('Back to Registration','wpstream');?></div>
3329
3330 </div>
3331
3332
3333 <?php
3334 $ajax_nonce = wp_create_nonce( "wpstream_onboarding_nonce");
3335 print'<input type="hidden" id="wpstream_onboarding_nonce" value="'.esc_html($ajax_nonce).'" /> ';
3336
3337 ?>
3338
3339
3340 <div id="wpstream_on_board" class="wpstream_action_next_step" data-nextthing="wpstream_step_2" style="display:none;" >Move to step 2</div>
3341 </div>
3342 <?php
3343
3344 if( !is_null( $token ) && trim( $token ) !== '' ) {
3345 print '<div id="wpstream_have_token"></div>';
3346 }
3347 }
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358 /*
3359 *
3360 * Generate random pass
3361 *
3362 */
3363
3364 public function randomPassword() {
3365 $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
3366 $pass = array(); //remember to declare $pass as an array
3367 $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
3368 for ($i = 0; $i < 8; $i++) {
3369 $n = rand(0, $alphaLength);
3370 $pass[] = $alphabet[$n];
3371 }
3372 return implode($pass); //turn the array into a string
3373 }
3374
3375
3376 /*
3377 *
3378 *
3379 *
3380 */
3381
3382 public function wpstream_onboarding_step2(){
3383 ?>
3384
3385 <div class="wpstream_step_wrapper wpstream_step_2" id="wpstream_step_2">
3386 <h1>Welcome to <span class="header_special">WpStream</span>! How would you like to start?</h1>
3387
3388 <div class="wpstream_accordion_header wpstream_action_next_step" data-nextthing="wpstream_step_3" ><?php esc_html_e('Go LIVE!','wpstream');?></div>
3389 <div class="wpstram_or">or</div>
3390 <div class="wpstream_accordion_header wpstream_action_next_step" data-nextthing="wpstream_step_4" ><?php esc_html_e('Create a Video-On-Demand (VOD)','wpstream');?></div>
3391
3392 </div>
3393
3394
3395 <?php
3396 }
3397
3398 /*
3399 *
3400 *
3401 *
3402 */
3403
3404 public function wpstream_onboarding_step3_live_streaming(){
3405 ?>
3406
3407 <div class="wpstream_step_wrapper wpstream_step_3 wpstream_onboarding_live" id="wpstream_step_3">
3408 <h1><?php esc_html_e('Do you want to charge a fee for watching?','wpstream'); ?></h1>
3409
3410 <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>
3411 <div class="wpstram_or">or</div>
3412 <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>
3413
3414 <div class="wpstream_initial_onboarding_controls_wrapper">
3415 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3416 </div>
3417
3418 </div>
3419
3420
3421 <?php
3422 }
3423
3424
3425 /*
3426 *
3427 *
3428 *
3429 */
3430 public function wpstream_onboarding_step_3_A_live_streaming_free_view(){
3431 ?>
3432
3433 <div class="wpstream_step_wrapper wpstream_step_3a wpstream_onboarding_live" id="wpstream_step_3a">
3434 <h1><?php esc_html_e('Let’s create your first FTV live channel','wpstream');?></h1>
3435
3436 <div id="wpstream_onboard_live_notice" class="wpstream_onboarding_notification"></div>
3437 <div id="wpstream_onboard_live" class="wpstream_accordion_container">
3438 <label>Name your first Free-To-View channel</label>
3439 <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');?>" >
3440 <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');?>" />
3441
3442 </div>
3443
3444 <div class="wpstream_initial_onboarding_controls_wrapper">
3445 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_3"><?php esc_html_e('Prev','wpstream');?></span>
3446 </div>
3447
3448 </div>
3449
3450
3451 <?php
3452 }
3453
3454
3455 /*
3456 *
3457 *
3458 *
3459 */
3460
3461 public function wpstream_onboarding_step_3_B_live_streaming_pay_per_view(){
3462 ?>
3463
3464 <div class="wpstream_step_wrapper wpstream_step_3b wpstream_onboarding_live" id="wpstream_step_3b">
3465 <h1><?php esc_html_e('Make your live stream Pay Per View','wpstream');?></h1>
3466 <?php
3467 if ( class_exists( 'WooCommerce' ) ) {
3468 ?>
3469 <div id="wpstream_onboard_live_ppv_notice" class="wpstream_onboarding_notification"></div>
3470 <div id="wpstream_onboard_live_ppv" class="wpstream_accordion_container">
3471 <label><?php esc_html_e('Choose a name for your channel','wpstream');?></label>
3472 <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');?>">
3473 <label><?php esc_html_e('Pay-Per-View Price ($)','wpstream');?></label>
3474 <input type="text" name="channel_name" id="wpstream_onboarding_event_price_ppv" class="wpstream_onboarding_event_price" value="10">
3475 <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');?>" />
3476
3477 </div>
3478 <?php
3479 } else {
3480 $this->wpstream_onboarding_woo_warning();
3481 } ?>
3482
3483
3484 <div class="wpstream_initial_onboarding_controls_wrapper">
3485 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_3"><?php esc_html_e('Prev','wpstream');?></span>
3486 </div>
3487 </div>
3488 <?php
3489 }
3490
3491
3492
3493
3494
3495
3496 /*
3497 * WooCommerce not installed Warning
3498 *
3499 *
3500 */
3501
3502 public function wpstream_onboarding_woo_warning(){
3503 print'<div class="wpstream_warning_onboarding">
3504 '.esc_html__('Pay-Per-View streaming requires WooCommerce. Please install the WooCommerce plugin and try again.','wpstream').'
3505 </br>
3506 <div class="wpstream_install_plugin">'. esc_html__('Install WooCommerce','wpstream').'</div>
3507
3508 <div class="wpstream_onboarding_tryagain">'.esc_html__('Try Again','wpstream').'</div>
3509 </div>';
3510 }
3511
3512
3513 /*
3514 *
3515 *
3516 *
3517 */
3518
3519 public function wpstream_onboarding_step4_vod(){
3520 ?>
3521 <div class="wpstream_step_wrapper wpstream_step_4 wpstream_onboarding_vod" id="wpstream_step_4">
3522 <h1><?php esc_html_e('Do you want to charge a fee for watching?','wpstream');?></h1>
3523
3524 <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>
3525 <div class="wpstram_or">or</div>
3526 <input type="hidden" id="wpstream_onboarding_video_list_nonce" value="<?php echo wp_create_nonce( "wpstream_onboarding_video_list_nonce" ); ?>">
3527 <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>
3528 <div class="wpstream_initial_onboarding_controls_wrapper">
3529 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_2"><?php esc_html_e('Prev','wpstream');?></span>
3530 </div>
3531
3532 </div>
3533 <?php
3534 }
3535
3536
3537 /*
3538 *
3539 *
3540 *
3541 */
3542 public function wpstream_onboarding_step_4_free_vod(){
3543
3544 $current_screen=get_current_screen();
3545 if($current_screen->base !=='wpstream_page_wpstream_onboard'){
3546 return;
3547 }
3548 ?>
3549
3550 <div class="wpstream_step_wrapper wpstream_step_4a wpstream_onboarding_live" id="wpstream_step_4a">
3551 <h1><?php esc_html_e('Let’s create your first Free-To-View VOD','wpstream');?></h1>
3552 <div id="wpstream_onboard_vod_free_notice" class="wpstream_onboarding_notification"></div>
3553 <div id="wpstream_onboard_vod_free" class="wpstream_accordion_container">
3554 <div class="spinner"></div>
3555 <div class="wpstream-step-container" style="display: none">
3556 <label><?php esc_html_e('Name your FTV Video-On-Demand','wpstream')?></label>
3557 <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');?>" >
3558 <div id="wpstream_free_vod_dropdown_videos_list"></div>
3559 <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">
3560 </div>
3561 </div>
3562 <?php $this->wpstream_obboarding_file_warning(); ?>
3563
3564 <div class="wpstream_initial_onboarding_controls_wrapper">
3565 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_4"><?php esc_html_e('Prev','wpstream');?></span>
3566 </div>
3567
3568 </div>
3569
3570
3571 <?php
3572 }
3573
3574 /*
3575 *
3576 *
3577 *
3578 */
3579 public function wpstream_obboarding_file_warning(){
3580 print '<div class="wpstream_warning_onboarding" style="display: none">
3581 '.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').'
3582 </br>
3583 <div class="wpstream_upload_video">'.esc_html__('Upload Video','wpstream').'</div>
3584
3585 <div class="wpstream_onboarding_tryagain">'.esc_html__('Try Again','wpstream').'</div>
3586 </div>';
3587 }
3588
3589 /*
3590 *
3591 *
3592 *
3593 */
3594 public function wpstream_onboarding_step_4_ppv_vod(){
3595 $current_screen=get_current_screen();
3596
3597 if($current_screen->base !=='wpstream_page_wpstream_onboard'){
3598 return;
3599 }
3600 ?>
3601
3602 <div class="wpstream_step_wrapper wpstream_step_4b wpstream_onboarding_live" id="wpstream_step_4b">
3603 <h1><?php esc_html_e('Let\'s create your first Pay-Per-View VOD','wpstream');?></h1>
3604
3605 <div id="wpstream_onboard_vod_ppv_notice" class="wpstream_onboarding_notification"></div>
3606 <?php
3607 if ( class_exists( 'WooCommerce' ) ) { ?>
3608 <div id="wpstream_onboard_vod_ppv" class="wpstream_accordion_container">
3609 <div class="spinner"></div>
3610 <div class="wpstream-step-container" style="display: none">
3611 <label><?php esc_html_e('Name your PPV Video-On-Demand','wpstream'); ?></label>
3612 <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');?>">
3613 <div id="wpstream_ppv_vod_dropdown_videos_list"></div>
3614 <label><?php esc_html_e('Pay-Per-View Price','wpstream');?></label>
3615 <input type="text" name="channel_name" class="wpstream_onboarding_vod_price" id="wpstream_onboarding_vod_price" value="10">
3616 <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');?>" />
3617 </div>
3618 </div>
3619 <?php $this->wpstream_obboarding_file_warning(); ?>
3620 <?php } else {
3621 $this->wpstream_onboarding_woo_warning();
3622 } ?>
3623 <div class="wpstream_initial_onboarding_controls_wrapper">
3624 <span class="wpstream_onboard_initial_bubble_prev" data-step="wpstream_step_4"><?php esc_html_e('Prev','wpstream');?></span>
3625 </div>
3626 </div>
3627 <?php
3628 }
3629
3630
3631
3632
3633 /*
3634 *
3635 * On boarding Header
3636 *
3637 */
3638 public function onboarding_wizard_header() {
3639 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/logo_onboarding.svg';
3640 ?>
3641
3642 <div class="wpstream_on_boarding_wrapper">
3643 <div class="wpstream_close_onboarding wpstream_close_initial_onboarding"></div>
3644 <img class="wpstream_onboarding_logo" src="<?php echo esc_url($thumb); ?>" />
3645 <div class="wpstream_close_onboarding_warning"></div>
3646
3647 <?php
3648 }
3649
3650
3651
3652
3653
3654 /*
3655 *
3656 * On Boarding Footer
3657 *
3658 */
3659 public function onboarding_wizard_footer() {
3660 ?>
3661 </div>
3662 <div class="wpstream_modal_background_onboard"></div>
3663 <?php
3664 }
3665
3666
3667
3668 /*
3669 *
3670 * On Boarding create PPV channel
3671 *
3672 */
3673
3674
3675 public function wpstream_on_board_create_channel_ppv(){
3676 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3677 $current_user = wp_get_current_user();
3678
3679 if(current_user_can('administrator')){
3680 $channel_name = sanitize_text_field($_POST['channel_name']);
3681 $channel_price = floatval($_POST['channel_price']);
3682 $my_post = array(
3683 'post_title' => $channel_name,
3684 'post_content' => '',
3685 'post_status' => 'publish',
3686 'post_type' => 'product',
3687 'post_author' => $current_user->ID
3688 );
3689
3690 // Insert the post into the database
3691 $post_id = wp_insert_post( $my_post );
3692
3693 if(is_wp_error($post_id)){
3694 $logger = new WPStream_Logger();
3695 $log_entry = new WpStream_Log_Entry([
3696 'type' => 'error',
3697 'description' => 'Couldn\'t create channel during onboarding because of error: ' . $post_id->get_error_message(),
3698 ]);
3699 $logger->add( $log_entry );
3700 echo json_encode( array('succes'=>false) );
3701 }else{
3702
3703 $product = wc_get_product($post_id);
3704 $price = wc_format_decimal($channel_price);
3705
3706 $product = wc_get_product( $post_id );
3707 $product->set_price( $price );
3708 $product->set_regular_price( $price ); // To be sure
3709 $product->save();
3710 update_post_meta ($post_id,'event_passed',0);
3711 wp_set_object_terms( $post_id, 'live_stream', 'product_type' );
3712
3713
3714
3715
3716 $permalink = get_edit_post_link($post_id);
3717
3718 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3719 $permalink= add_query_arg( 'branch', '2', $permalink );
3720
3721
3722 echo json_encode( array(
3723 'success'=> true,
3724 'link' => ($permalink)
3725 ));
3726 }
3727
3728 }
3729 die();
3730 }
3731
3732 /*
3733 *
3734 * On Boarding create channel
3735 *
3736 */
3737
3738
3739 public function wpstream_on_board_create_channel(){
3740 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3741 $current_user = wp_get_current_user();
3742
3743 if(current_user_can('administrator')){
3744 $channel_name=sanitize_text_field($_POST['channel_name']);
3745 $my_post = array(
3746 'post_title' => $channel_name,
3747 'post_content' => '',
3748 'post_status' => 'publish',
3749 'post_type' => 'wpstream_product',
3750 'post_author' => $current_user->ID
3751 );
3752
3753 // Insert the post into the database
3754 $post_id = wp_insert_post( $my_post );
3755
3756 if( is_wp_error( $post_id ) ) {
3757 $logger = new WPStream_Logger();
3758 $log_entry = new WpStream_Log_Entry([
3759 'type' => 'error',
3760 'description' => 'Couldn\'t create channel during onboarding because of error: ' . $post_id->get_error_message(),
3761 ]);
3762 $logger->add( $log_entry );
3763 echo json_encode( array('succes'=>false) );
3764 } else {
3765 $permalink = get_edit_post_link($post_id);
3766
3767 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3768 $permalink= add_query_arg( 'branch', '1', $permalink );
3769
3770 echo json_encode( array(
3771 'success'=> true,
3772 'link' => ($permalink)
3773 ));
3774 }
3775 }
3776 die();
3777 }
3778
3779 /*
3780 *
3781 * On Boarding create free vod
3782 *
3783 */
3784 public function wpstream_on_board_create_free_vod(){
3785 $current_user = wp_get_current_user();
3786 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3787 if(current_user_can('administrator')){
3788 $channel_name =sanitize_text_field($_POST['channel_name']);
3789 $file_name =sanitize_text_field($_POST['file_name']);
3790 $my_post = array(
3791 'post_title' => $channel_name,
3792 'post_content' => '',
3793 'post_status' => 'publish',
3794 'post_type' => 'wpstream_product_vod',
3795 'post_author' => $current_user->ID
3796 );
3797
3798 // Insert the post into the database
3799 $post_id = wp_insert_post( $my_post );
3800
3801 if(is_wp_error($post_id)){
3802 $logger = new WPStream_Logger();
3803 $log_entry = new WpStream_Log_Entry([
3804 'type' => 'error',
3805 'description' => 'Couldn\'t create free VOD during onboarding because of error: ' . $post_id->get_error_message(),
3806 ]);
3807 $logger->add( $log_entry );
3808 echo json_encode( array('succes'=>false) );
3809 }else{
3810 update_post_meta($post_id, 'wpstream_product_type', 2);
3811 update_post_meta($post_id, 'wpstream_free_video', $file_name);
3812
3813
3814 $permalink = get_edit_post_link($post_id);
3815
3816 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3817 $permalink= add_query_arg( 'branch', '3', $permalink );
3818
3819
3820 echo json_encode( array(
3821 'success'=> true,
3822 'link' => ($permalink)
3823 ));
3824 }
3825
3826 }
3827 die();
3828 }
3829
3830
3831 /*
3832 *
3833 * On Boarding create ppv vod
3834 *
3835 */
3836
3837
3838 public function wpstream_on_board_create_ppv_vod(){
3839 $current_user = wp_get_current_user();
3840 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3841
3842 if(current_user_can('administrator')){
3843 $channel_name = sanitize_text_field($_POST['channel_name']);
3844 $vod_price = floatval($_POST['vod_price']);
3845 $file_name = sanitize_text_field($_POST['file_name']);
3846
3847 $my_post = array(
3848 'post_title' => $channel_name,
3849 'post_content' => '',
3850 'post_status' => 'publish',
3851 'post_type' => 'product',
3852 'post_author' => $current_user->ID
3853 );
3854
3855 // Insert the post into the database
3856 $post_id = wp_insert_post( $my_post );
3857
3858 if( is_wp_error( $post_id ) ) {
3859 $logger = new WPStream_Logger();
3860 $log_entry = new WpStream_Log_Entry([
3861 'type' => 'error',
3862 'description' => 'Couldn\'t create PPV VOD during onboarding because of error: ' . $post_id->get_error_message(),
3863 ]);
3864 $logger->add( $log_entry );
3865 echo json_encode( array('succes'=>false) );
3866 } else {
3867
3868 $product = wc_get_product($post_id);
3869 $price = wc_format_decimal($vod_price);
3870
3871 $product = wc_get_product( $post_id );
3872 $product->set_price( $price );
3873 $product->set_regular_price( $price ); // To be sure
3874 $product->save();
3875 update_post_meta ($post_id,'event_passed',0);
3876 update_post_meta ($post_id,'_movie_url', $file_name);
3877 wp_set_object_terms( $post_id, 'video_on_demand', 'product_type' );
3878
3879
3880
3881
3882 $permalink = get_edit_post_link($post_id);
3883
3884 $permalink= add_query_arg( 'onboard', 'yes', $permalink );
3885 $permalink= add_query_arg( 'branch', '4', $permalink );
3886
3887
3888 echo json_encode( array(
3889 'success'=> true,
3890 'link' => ($permalink) ,
3891 ' $file_name'=> $file_name,
3892 ));
3893 }
3894
3895 }
3896 die();
3897 }
3898
3899
3900 /*
3901 *
3902 * On Boarding login
3903 *
3904 */
3905 public function wpstream_on_board_login(){
3906 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3907
3908 if(current_user_can('administrator')){
3909 $username = sanitize_text_field($_POST['api_username']);
3910 $password = $_POST['api_password'];
3911 update_option('wpstream_api_username',$username);
3912 update_option('wpstream_api_password',$password);
3913
3914 $token = $this->main->wpstream_live_connection->wpstream_get_token();
3915 $videos_list = $this->main->wpstream_live_connection->wpstream_get_videos();
3916 // cleanup any previous echo before sending json
3917 ob_end_clean();
3918 // !DO NOT SEND TOKEN TO THE CLIENT!
3919 if ($token){
3920 echo json_encode( array(
3921 'success'=> true
3922 ));
3923 }
3924 else {
3925 $text = get_option('wpstream_curl_failed') ?
3926 'Login failed with critical error: ' . get_option('wpstream_curl_failed') :
3927 'Wrong username or password!';
3928 echo json_encode( array(
3929 'success'=> false,
3930 'error' => $text,
3931 ));
3932 }
3933
3934 }else{
3935 echo json_encode( array(
3936 'success'=> false,
3937 'token' => esc_html('You are not an administrator','wpstream')
3938 ));
3939 }
3940 die();
3941 }
3942
3943
3944 public function wpstream_register_refresh_capthca(){
3945
3946 if(current_user_can('administrator')){
3947
3948 }
3949 }
3950
3951 /*
3952 *
3953 * On Boarding login
3954 *
3955 */
3956 public function wpstream_on_board_register(){
3957 check_ajax_referer( 'wpstream_onboarding_nonce', 'security' );
3958
3959 if(current_user_can('administrator')){
3960 $wpstream_register_email = sanitize_text_field($_POST['wpstream_register_email']);
3961 $wpstream_register_password = $_POST['wpstream_register_password'];
3962 $wpstream_register_captcha = sanitize_text_field($_POST['wpstream_register_captcha']);
3963 $wpstream_register_captcha_id = sanitize_text_field($_POST['wpstream_register_captcha_id']);
3964
3965 $validate = $this->wpstream_validate_onboard_register($wpstream_register_email,$wpstream_register_password);
3966 if(!$validate['success']){
3967 // cleanup any previous echo before sending json
3968 ob_end_clean();
3969 echo json_encode($validate);
3970 die();
3971 }
3972
3973 $url='user/create';
3974 $curl_post_fields=array(
3975 'email' => $wpstream_register_email,
3976 'password' => $wpstream_register_password,
3977 'captcha' => $wpstream_register_captcha,
3978 'captcha_id' => $wpstream_register_captcha_id,
3979 );
3980
3981
3982
3983 $curl_response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url,$curl_post_fields,true);
3984 $curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
3985
3986
3987
3988 if($curl_response_decoded['success']){
3989
3990 if($curl_response_decoded['request']['registred']){
3991 // we are registerd
3992
3993 update_option('wpstream_api_username',$wpstream_register_email);
3994 update_option('wpstream_api_password',$wpstream_register_password);
3995
3996 $token = $this->main->wpstream_live_connection->wpstream_get_token();
3997
3998 // cleanup any previous echo before sending json
3999 ob_end_clean();
4000 echo json_encode( array(
4001 'success' => true,
4002 'token' => $token ,
4003 'message' => esc_html__('Your Account was created. Please stand by...','wpstream'),
4004
4005 ));
4006 die();
4007 }else{
4008
4009 // cleanup any previous echo before sending json
4010 ob_end_clean();
4011 echo json_encode( array(
4012 'success'=> false,
4013 'message'=> $curl_response_decoded['request']['message'],
4014 'curl'=>$curl_response_decoded,
4015
4016 ));
4017 die();
4018 }
4019
4020
4021
4022
4023 }else{
4024 // cleanup any previous echo before sending json
4025 ob_end_clean();
4026 echo json_encode( array(
4027 'success'=> false,
4028 'message'=> esc_html__('Registration could not be completed. Please try again or register on wpstream.net','wpstream'),
4029
4030 ));
4031 die();
4032 }
4033
4034
4035
4036
4037
4038
4039
4040
4041 }else{
4042 // cleanup any previous echo before sending json
4043 ob_end_clean();
4044 echo json_encode( array(
4045 'success'=> false,
4046 'message' => esc_html('You are not an administrator','wpstream')
4047 ));
4048 die();
4049 }
4050
4051 die();
4052 }
4053
4054
4055 /*
4056 *
4057 * Validate for register
4058 *
4059 */
4060
4061
4062 public function wpstream_validate_onboard_register($wpstream_register_email,$wpstream_register_password){
4063
4064 $return= array(
4065 'success'=>true
4066 );
4067
4068 if ($wpstream_register_email=='' ){
4069 $return= array(
4070 'success'=> false,
4071 'message' => esc_html('The email Field is Empty','wpstream')
4072 );
4073 return $return;die();
4074 }
4075
4076 if(filter_var($wpstream_register_email,FILTER_VALIDATE_EMAIL) === false) {
4077 $return= array(
4078 'success'=> false,
4079 'message' => esc_html__("The email doesn't look right !",'wpstream')
4080 );
4081 return $return;die();
4082 }
4083
4084
4085 $domain = mb_substr(strrchr($wpstream_register_email, "@"), 1);
4086 if( $domain!='' && !checkdnsrr ($domain) ){
4087 $return= array(
4088 'success'=> false,
4089 'message' => esc_html__("The email doesn't look right !",'wpstream')
4090 );
4091 return $return;die();
4092 }
4093
4094
4095
4096 if(strlen($wpstream_register_password)<5){
4097 $return= array(
4098 'success'=> false,
4099 'message' => esc_html('The password is too short. Please use at least 5 characters.','wpstream')
4100 );
4101 return $return;die();
4102 }
4103
4104 return $return;die();
4105 }
4106
4107 /**
4108 * Handle the AJAX request to initiate a multipart upload
4109 *
4110 * @since 3.0.1
4111 */
4112 public function handle_initiate_multipart_upload() {
4113 // Security check - only admins can do this
4114 if (!current_user_can('administrator')) {
4115 wp_send_json_error('Unauthorized access');
4116 return;
4117 }
4118
4119 // Get file details from request
4120 $file_name = sanitize_text_field($_POST['file_name']);
4121 $file_size = intval($_POST['file_size']);
4122 $content_type = sanitize_text_field($_POST['content_type']);
4123 $num_parts = intval($_POST['parts']);
4124
4125 if (empty($file_name) || $file_size <= 0 || $num_parts <= 0) {
4126 wp_send_json_error('Invalid file information');
4127 return;
4128 }
4129
4130 // Prepare a clean filename (similar to the standard upload process)
4131 $file_name_array = explode(".", $file_name);
4132 $file_extension = $file_name_array[count($file_name_array) - 1];
4133 $temp_file_name = $file_name_array[0];
4134 $temp_file_name = str_replace(' ', '_', $temp_file_name);
4135 $temp_file_name = preg_replace('/\W/', '', $temp_file_name);
4136 $clean_file_name = $temp_file_name . '.' . $file_extension;
4137
4138 // Make API call to initiate multipart upload
4139 $url = 'video/upload';
4140 $access_token = $this->main->wpstream_live_connection->wpstream_get_token();
4141
4142 if (!$access_token) {
4143 wp_send_json_error('Not connected to WPStream service');
4144 return;
4145 }
4146
4147 $api_params = array(
4148 'access_token' => $access_token,
4149 'size' => $file_size,
4150 'name' => $clean_file_name,
4151 'content_type' => $content_type,
4152 'parts' => $num_parts
4153 );
4154
4155 $response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url, $api_params, true);
4156 $response_data = json_decode($response, true);
4157
4158 if (!isset($response_data['success']) || $response_data['success'] !== true) {
4159 $error_message = isset($response_data['error']) ? $response_data['error'] : 'Failed to initiate multipart upload';
4160 wp_send_json_error($error_message);
4161 return;
4162 }
4163
4164 // Return the upload ID and pre-signed URLs for each part
4165 wp_send_json_success($response_data);
4166 }
4167
4168 /**
4169 * Handle the AJAX request to complete a multipart upload
4170 *
4171 * @since 3.0.1
4172 */
4173 public function handle_complete_multipart_upload() {
4174 // Security check - only admins can do this
4175 if (!current_user_can('administrator')) {
4176 wp_send_json_error('Unauthorized access');
4177 return;
4178 }
4179
4180 // Get completion details
4181 $parts = json_decode(stripslashes($_POST['parts']), true);
4182 $file_name = sanitize_text_field($_POST['file_name']);
4183 $handle = sanitize_text_field($_POST['handle']);
4184
4185 if (empty($parts) || !is_numeric($parts) || empty($file_name)) {
4186 wp_send_json_error('Invalid completion information');
4187 return;
4188 }
4189
4190 // Make API call to complete the multipart upload
4191 $url = 'video/upload';
4192 $access_token = $this->main->wpstream_live_connection->wpstream_get_token();
4193
4194 if (!$access_token) {
4195 wp_send_json_error('Not connected to WPStream service');
4196 return;
4197 }
4198
4199 $api_params = array(
4200 'access_token' => $access_token,
4201 'parts' => $parts,
4202 'name' => $file_name,
4203 'handle' => $handle,
4204 'action' => 'complete'
4205 );
4206
4207 $response = $this->main->wpstream_live_connection->wpstream_baker_do_curl_base($url, $api_params, true);
4208 $response_data = json_decode($response, true);
4209
4210 if (!isset($response_data['success']) || $response_data['success'] !== true) {
4211 $error_message = isset($response_data['error']) ? $response_data['error'] : 'Failed to complete multipart upload';
4212 wp_send_json_error($error_message);
4213 return;
4214 }
4215
4216 // Return success
4217 wp_send_json_success();
4218 }
4219
4220 public function wpstream_settings_tab_update_plugin() {
4221 if ( !current_user_can( 'update_plugins' ) ) {
4222 wp_send_json_error( __( 'Not enough permissions to make this change', 'wpstream' ) );
4223 }
4224
4225 include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
4226 include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
4227 include_once ABSPATH . 'wp-admin/includes/file.php';
4228
4229 $credentials = request_filesystem_credentials('');
4230 if ( !WP_Filesystem( $credentials ) ) {
4231 wp_send_json_error( __( 'Failed to connect to the filesystem', 'wpstream' ) );
4232 }
4233
4234 $upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
4235 $plugin_path = plugin_basename( WPSTREAM_PLUGIN_PATH . 'wpstream.php' );
4236 $result = $upgrader->upgrade( $plugin_path );
4237 activate_plugin( $plugin_path );
4238
4239 if ( is_wp_error( $result ) ) {
4240 wp_send_json_error( __( 'Update failed due to', 'wpstream' ) . $result->get_error_message() );
4241 }
4242
4243 wp_send_json_success();
4244 }
4245 }
4246