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

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