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

1,089 lines 48.7 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 public function __construct( $plugin_name, $version,$plugin_main ) {
61
62 $this->plugin_name = $plugin_name;
63 $this->version = $version;
64 $this->main = $plugin_main;
65
66 }
67
68 /**
69 * Register the stylesheets for the admin area.
70 *
71 * @since 3.0.1
72 */
73 public function enqueue_styles() {
74
75 /**
76 * This function is provided for demonstration purposes only.
77 *
78 * An instance of this class should be passed to the run() function
79 * defined in Wpstream_Loader as all of the hooks are defined
80 * in that particular class.
81 *
82 * The Wpstream_Loader will then create the relationship
83 * between the defined hooks and the functions defined in this
84 * class.
85 */
86
87 wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/wpstream-admin.css', array(), $this->version, 'all' );
88
89 }
90
91 /**
92 * Register the JavaScript for the admin area.
93 *
94 * @since 3.0.1
95 */
96 public function enqueue_scripts() {
97
98 wp_enqueue_script("jquery-ui-slider");
99 wp_enqueue_script("jquery-ui-datepicker");
100 wp_enqueue_script('jquery.fileupload', plugin_dir_url( __FILE__ ) .'js/jquery.fileupload.js',array(), '1.0', true);
101 wp_enqueue_script('wpstream-admin-control', plugin_dir_url( __FILE__ ) .'js/admin_control.js',array(), '1.0', true);
102 wp_localize_script('wpstream-admin-control', 'wpstream_admin_control_vars',
103 array(
104 'admin_url' => get_admin_url(),
105 'loading_url' => WPSTREAM_PLUGIN_DIR_URL.'/img/loading.gif',
106 'download_mess' => esc_html__('Click to download!','wpstream'),
107 'uploading' => esc_html('We are uploading your file.Do not close this window!','wpstream'),
108 'upload_complete2' => esc_html('Upload Complete! You can upload another file!','wpstream'),
109 'not_accepted' => esc_html('The file is not an accepted video format','wpstream'),
110 'upload_complete' => esc_html('Upload Complete!','wpstream'),
111 'no_band' => esc_html('Not enough bandwidth.','wpsteam'),
112 'no_band_no_store' => esc_html('Not enough bandwidth or storage.','wpsteam')
113
114 ));
115 }
116
117
118 /**
119 * Add Plugin Administation menu
120 *
121 * @since 3.0.1
122 */
123
124 public function wpstream_manage_admin_menu() {
125
126 add_menu_page( __('WpStream','wpestream'), __('WpStream ','wpstream'), 'administrator', 'wpstream_plugin_options', array($this,'wpstream_set_wpstream_credentials') );
127 add_submenu_page( 'wpstream_plugin_options', __('WpStream Options','wpestream'), __('WpStream Options','wpestream'), 'administrator', 'wpstream_plugin_options', array($this,'wpstream_set_wpstream_credentials') );
128 add_submenu_page( 'wpstream_plugin_options', __('WpStream Channels','wpestream'), __('WpStream Channels','wpestream'), 'administrator', 'wpstream_new_general_set', array( $this,'wpstream_new_general_set'));
129 add_submenu_page( 'wpstream_plugin_options', __('WpStream Media Management','wpestream'), __('WpStream Media Management','wpestream'), 'administrator', 'wpstream_media_management', array($this,'wpstream_media_management'));
130 }
131
132
133
134 /**
135 * Shows events wpstream
136 *
137 * @since 3.0.1
138 */
139
140 public function wpstream_new_general_set() {
141
142 $no_channel=1;
143
144 if(class_exists ('WC_Subscription')){
145
146 }
147
148 //event_passed
149 $args = array(
150 'posts_per_page' => -1,
151 'post_type' => 'product',
152 'post_status' => 'publish',
153 'meta_query' => array(
154 array(
155 'key' => 'event_passed',
156 'value' => 1,
157 'compare' => '!=',
158 )
159 ),
160
161 'tax_query' => array(
162 'relation' => 'AND',
163 array(
164 'taxonomy' => 'product_type',
165 'field' => 'slug',
166 'terms' => array('live_stream','subscription')
167 )
168 ),
169 );
170
171
172
173 $event_list = new WP_Query($args);
174 global $live_event_for_user;
175 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
176 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user();
177
178 $this->main->show_user_data($pack_details);
179
180
181
182
183 if( $event_list->have_posts()){
184
185
186 print '<div class="pack_details_wrapper_transparent">
187 <h3>'.__('Your Pay-Per-View Channel List','wpstream').'</h3>';
188
189
190 $link_new = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
191
192 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new pay-per-view channel.','wpstream').'</a>';
193 print '</div>';
194
195 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
196
197 while ($event_list->have_posts()): $event_list->the_post();
198
199 $the_id = get_the_ID();
200 $is_subscription_live_event = esc_html(get_post_meta($the_id,'_subscript_live_event',true));
201 $term_list = wp_get_post_terms($the_id, 'product_type');
202
203 if( $term_list[0]->name=='subscription' && $is_subscription_live_event=='no'){
204 continue;
205 }
206
207 $this->wpstream_live_stream_unit($the_id);
208
209 endwhile;
210
211 print'</div>';
212 $no_channel=1;
213 }else{
214 $no_channel=0;
215 }
216
217
218 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
219 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
220 $current_user = wp_get_current_user();
221 $allowded_html = array();
222 $userID = $current_user->ID;
223 $user_live_streams = get_user_meta($userID,'live_shows');
224
225
226 wp_reset_postdata();
227
228
229
230
231 // free
232
233 $args_free = array(
234 'posts_per_page' => -1,
235 'post_type' => 'wpstream_product',
236 'post_status' => 'publish',
237 'meta_query' => array(
238 'relation' => 'AND',
239 array(
240 'key' => 'wpstream_product_type',
241 'value' => 1,
242 'compare' => '==',
243 ),
244
245 ),
246
247
248 );
249 $event_list_free = new WP_Query($args_free);
250
251
252 if( $event_list_free->have_posts()){
253 print '<div class="pack_details_wrapper_transparent">
254 <h3>'.__('Your Free Channel List','wpestate').'</h3>';
255
256 $link_new = admin_url('post-new.php?post_type=wpstream_product');
257 print '<a href="'.esc_url($link_new).'" class="wpstream_create_new_product_link">'.esc_html__('Create new free channel.','wpstream').'</a>';
258 print '</div>';
259 print '<div style="clear: both;"></div><div class="event_list_wrapper">';
260
261 while ($event_list_free->have_posts()): $event_list_free->the_post();
262
263
264 $the_id = get_the_ID();
265
266 if( get_post_meta ($the_id,'event_passed',true)!=1){
267 $this->wpstream_live_stream_unit($the_id);
268 }
269
270 endwhile;
271
272 print'</div>';
273 $no_channel=1;
274 }else{
275 $no_channel=0;
276 }
277
278
279
280 if($no_channel==0){
281 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
282 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
283 print '<div class="no_events_warning"> '.__('* You don\'t have any live channels!','wpstream');
284
285 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new free channel ','wpstream').'</a>';
286 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Add new pay-per-view channel ','wpstream').'</a>';
287
288 print '</div>';
289 }
290
291
292
293
294 }
295 // end wpstream_new_general_set
296
297
298
299
300
301
302
303 /**
304 * Shows event unit card in admin
305 *
306 * @since 3.0.1
307 */
308 public function wpstream_live_stream_unit($the_id){
309 global $live_event_for_user;
310 //print_r($live_event_for_user);
311
312 $live_class='';
313 if(isset($live_event_for_user[$the_id])) {
314 $live_class=" wpstream_show_started";
315 }
316
317
318 print '<div class="event_list_unit '.$live_class.' ">';
319 $ip= get_post_meta($the_id,'ip',true);
320
321
322 if(has_post_thumbnail($the_id)){
323 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
324 }else{
325 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/default_150.jpg';
326 }
327
328
329 print '<div class="event_thumb_wrapper"><img class="event_thumb" src="'.$thumb.'" alt="show_imagge"></div>';
330
331
332 global $wpstream_plugin;
333 $current_user = wp_get_current_user();
334 // print_R( $wpstream_plugin->wpstream_live_connection->api20_wpstream_get_live_event_for_user($the_id));
335 // print_R( $wpstream_plugin->wpstream_live_connection->wpstream_request_live_stream_uri($the_id,0,));
336
337
338 print '<h3 data-prodid="'.$the_id.'">'.get_the_title($the_id).' - '.esc_html__('Id','wpstream').': '.$the_id.'<a class="view_channel" href="'.get_permalink($the_id).'" target="_blank">'.esc_html__('View Channel','wprentals').'</a></h3> ';
339
340 $live_event_stream_name = get_post_meta($the_id,'live_event_stream_name',true);
341 $live_event_array = get_post_meta($the_id,'live_event_uri',true);
342 $live_event_uri = '';
343
344
345 $pending_streaming_class = '';
346 $wpstream_ready_to_stream_class = '';
347 $external_software_streaming_class = '';
348 $wpstream_no_stream_class = '';
349 $carnat_key1 = '';
350 $carnat_key2 = '';
351 $uri = '';
352 $webcaster_url = '';
353 $rtmp_ip_uri = '';
354 $uri_ip = '';
355 $server_id = '';
356 $obs_uri = '';
357 $obs_stream = '';
358 $webCasterUrl = '';
359 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
360
361 $pending_streaming_class = 'show_stream_data pending_trigger';
362 $wpstream_ready_to_stream_class = 'hide_stream_data';
363 $external_software_streaming_class = 'show_stream_data';
364 $wpstream_no_stream_class = 'hide_stream_data';
365 if(isset($live_event_for_user[$the_id]['live_uri'])){
366 $explode = explode('wpstream.net/', $live_event_for_user[$the_id]['live_uri']);
367 $uri = $explode[0].'wpstream.net/wpstream/';
368 $stream_name = get_post_meta($the_id,'live_event_stream_name',true);
369 $carnat_key1 = $live_event_for_user[$the_id]['carnat1'];
370 $carnat_key2 = $live_event_for_user[$the_id]['carnat2'];
371 $webcaster_url = 'https://'.$live_event_for_user[$the_id]['subdomain_key'].'.live.streamer.wpstream.net:8443/'.$live_event_for_user[$the_id]['carnat2'];
372
373 $rtmp_ip_uri = 'http://'.$live_event_for_user[$the_id]['ip'].':8444';
374 $uri_ip= 'rtmp://'.$live_event_for_user[$the_id]['ip'].'/wpstream/';
375
376 // starting from 2.0
377 $server_id = get_post_meta($the_id,'server_id',true);
378 $obs_uri = get_post_meta($the_id,'obs_uri',true);
379 $obs_stream = get_post_meta($the_id,'obs_stream',true);
380 $webCasterUrl= get_post_meta($the_id,'webCasterUrl',true);
381
382 }
383
384 }else{
385
386 $pending_streaming_class = 'hide_stream_data';
387 $wpstream_ready_to_stream_class = 'hide_stream_data';
388 $external_software_streaming_class = 'hide_stream_data';
389 $wpstream_no_stream_class = 'show_stream_data';
390 }
391
392
393
394
395 print' <div class="pending_streaming '.$pending_streaming_class.' " data-show-id="'.$the_id.'" data-server-id="'.$server_id.'" data-server-url="'.$rtmp_ip_uri.'">';
396 print'<div class="wpstream_channel_status not_ready_to_stream"><span class="dashicons dashicons-dismiss"></span>'.esc_html__('Getting ready to stream. Please wait...','wprentals').' ';
397 print '<img class="server_loading_new" src="'.plugin_dir_url( dirname( __FILE__ ) ).'img/loading.gif" alt="loading" /></div>';
398 print '<div class="multiple_warning_events"> '.esc_html__('* You can run multiple live events on a single channel. **Once deleted, you can no longer broadcast to it.','wpstream').'</div>';
399 print '</div>';
400
401
402 print '<div class="wpstream_ready_to_stream '.$wpstream_ready_to_stream_class.'">';
403 print '<div class="wpstream_channel_status"><span class="dashicons dashicons-yes"></span>'.esc_html__('Ready To Stream !','wpstream').'</div>';
404 print '<div class="start_webcaster wpstream_button" data-webcaster-url="'.$webCasterUrl.'" >'.esc_html__('Start Browser Broadcast','wpstream').'</div>';
405 print '<div class="start_external wpstream_button" >'.esc_html__('Broascast With 3rd Party Software','wpstream').'</div>';
406 print '</div>';
407
408
409
410 print '<div class="external_software_streaming '. $external_software_streaming_class.' ">';
411 print '<div class="event_list_unit_notificationx"><strong>'.__('URL:').' </strong> <div class="wpstream_live_uri_text">' . $obs_uri.'</div><div class="copy_live_uri">'.__('copy to clipboard','wpstream').'</div>';
412 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong><div class="wpstream_live_key_text">'. $obs_stream.'</div><div class="copy_live_key">'.__('copy to clipboard','wpstream').'</div></div>';
413 print '<div class="warning_stream">'.sprintf(esc_html__('For professional results use %s with above credentials. You may also use the "RTMP Camera" app on Android phones and tablets or the "Broadcast Me" app on iPhone and iPad.','wpstream'),'<a href="https://obsproject.com/download" target="_blank">OBS Studio software</a>').'</div>';
414 print ' <img class="how_to" src="'.plugin_dir_url( dirname( __FILE__ ) ).'img/how_to_obs.jpg" alt="show_imagge">';
415 print'</div>';
416 print'</div>';
417
418
419
420
421 print '<div class="wpstream_no_stream '.$wpstream_no_stream_class.' ">';
422 print '<div class="event_list_unit_notificationx"><span class="server_notification">'.__('Channel is inactive.','wpestream').' <img class="server_loading" src="'.plugins_url().'/wpstream/img/loading.gif" alt="loading" /></span></div>';
423 print '<div class="record_wrapper">Record ? <input type="checkbox" name="record_event" class="record_event"/>Yes</div>';
424 print '<div class="encrypt_wrapper">Encrypt ? <input type="checkbox" name="encrypt_event" class="encrypt_event"/>Yes</div>';
425
426 print '<input class="start_event wpstream_button" type="button" data-show-id="'.$the_id.'" value="'.esc_html__('Broadcast To Channel','wpstream').'">';
427 print '<input class="close_event wpstream_button" type="button" data-show-id="'.$the_id.'" value="'.esc_html__('Delete Channel','wpstream').'">';
428 print '<div class="multiple_warning_events"> '.esc_html__('* You can run multiple live events on a single channel. **Once deleted, you can no longer broadcast to it.','wpstream').'</div>';
429
430
431 print '<div class="wpstream_social_media_broadcast">';
432
433 print '<div class="wpstream_social_media_unit"><input type="checkbox" class="wpstream_on_facebook" id="wpstream_on_facebook'.$the_id.'"><label for="wpstream_on_facebook'.$the_id.'">'.esc_html__('Stream on Facebook','wpstream').'</label>';
434 print '</div>';
435
436 print '<div class="wpstream_social_media_unit"><input type="checkbox" class="wpstream_on_youtube" id="wpstream_on_youtube'.$the_id.'"><label for="wpstream_on_youtube'.$the_id.'">'.esc_html__('Stream on Youtube','wpstream').'</label>';
437 print '</div>';
438
439
440 print '<div class="wpstream_social_media_unit"><input type="checkbox" class="wpstream_on_twich" id="wpstream_on_twich'.$the_id.'"><label for="wpstream_on_twich'.$the_id.'">'.esc_html__('Stream on Twich','wpstream').'</label>';
441 print '</div>';
442
443 print '<div class="wpstream_on_facebook_container wpstream_social_stream_container">';
444 print 'Some Facebook Settings for event '.$the_id;
445 print '</div>';
446
447 print '<div class="wpstream_on_youtube_container wpstream_social_stream_container">';
448 print '<label for="wpstream_youtube_rtmp'.$the_id.'">'.esc_html__('Youtube RTMP','wpstream').'</label>';
449 print '<input type="text" class="wpstream_youtube_rtmp" id="wpstream_youtube_rtmp'.$the_id.'" value="'.esc_html(get_post_meta($the_id,'wpstream_youtube_rtmp',true )).'">';
450 print '</div>';
451
452 print '<div class="wpstream_on_twich_container wpstream_social_stream_container">';
453 print '<label for="wpstream_twich_rtmp'.$the_id.'">'.esc_html__('Twich RTMP','wpstream').'</label>';
454 print '<input type="text" class="wpstream_twich_rtmp" id="wpstream_twich_rtmp'.$the_id.'" value="'.esc_html(get_post_meta($the_id,'wpstream_twich_rtmp',true )).'">';
455 print '</div>';
456
457
458 print '</div>';
459 print '</div>';
460
461
462 print '</div>';
463 }
464
465
466
467
468
469
470
471
472
473
474
475 /**
476 * Set credential admin function
477 *
478 * @since 3.0.1
479 */
480 public function wpstream_set_wpstream_credentials(){
481
482 if($_SERVER['REQUEST_METHOD'] === 'POST'){
483 $allowed_html = array();
484 $exclude_array = array();
485 $allowed_html = array();
486
487 foreach($_POST as $variable=>$value){
488 if ($variable!='submit'){
489 if (!in_array($variable, $exclude_array) ){
490 update_option( sanitize_key('wpstream_'.$variable), wp_kses ($value,$allowed_html) );
491 }
492 }
493 }
494
495
496
497
498 update_option('wp_estate_token_expire',0);
499 update_option('wp_estate_curent_token',' ');
500 delete_transient( 'wpstream_token_request');
501
502 }
503
504
505 $allowed_html = array();
506 $api_key = esc_html( get_option('wpstream_api_key','') );
507
508
509 $wpstream_options_array =array(
510 2 => array(
511 'label' => 'WpStream.net Username or Email',
512 'name' => 'api_username',
513 'type' => 'text',
514 ),
515 3 => array(
516 'label' => 'WpStream.net Password',
517 'name' => 'api_password',
518 'type' => 'password',
519 ),
520 // 0 => array(
521 // 'label' => 'API Key',
522 // 'name' => 'api_key',
523 // 'type' => 'text',
524 // ),
525 // 1 => array(
526 // 'label' => 'API Secret Key',
527 // 'name' => 'api_secret_key',
528 // 'type' => 'text',
529 // ),
530
531 );
532
533
534 $token = $this->main->wpstream_live_connection->wpstream_get_token();
535 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user();
536
537 $this->main->show_user_data($pack_details);
538
539 print '<form method="post" action="" >';
540 print '<div class="theme_options_tab_wpstream" style="display:block;" >
541 <h1>'.__('WpStream Credentials','wpstream').'</h1>';
542
543
544 if( get_option('wpstream_api_username')=='' || get_option('wpstream_api_password')== ' '){
545 echo '<div class="api_not_conected wpstream_orange">'.__('To connect your plugin, enter your WpStream credentials below or go <a href="https://wpstream.net/my-account/" target="_blank">here</a> to create an account.','wpstream').'</div>';
546 }else if($token==''){
547 echo '<div class="api_not_conected">'.__(' 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.','wpstream').'</div>';
548 }else if( $this->main->wpstream_live_connection->wpstream_client_check_api_status() ){
549 echo '<div class="api_conected">'.__('Conected to WpStream.net!','wpstream').'</div>';
550 }else{
551 echo '<div class="api_not_conected wpstream_brown">'.__('Failed to connect to WpStream.net. Please address CURL connectivity with your hosting provider.','wpstream').'</div>';
552 }
553 print '<div class="wpstream_option_wrapper">';
554 foreach ($wpstream_options_array as $key=>$option){
555 print '<div class="wpstream_option">';
556
557 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
558 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
559 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
560
561 print '</div>';
562 }
563 print '</div>';
564
565
566 print '<input type="submit" name="submit" class="wpstream_button" value="'.__('Save Changes','wpstream').'" />';
567
568
569
570 print '</div>';
571 print '</form>';
572
573 print '<div class="theme_options_tab_wpstream" style="display:block;" >';
574 $link_new = admin_url('admin.php?page=wpstream_new_general_set');
575 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
576 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
577
578
579 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create new free channel','wpstream').'</a>';
580 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create pay-per-view channel','wpstream').'</a>';
581 print '<a href="'.esc_url($link_new).'" class="wpstream_no_chanel_add_channel">'.esc_html('My Channels','wpstream').'</a>';
582 print '</div>';
583
584
585 }
586
587
588
589 /**
590 * Media Management
591 *
592 * @since 3.0.1
593 */
594 public function wpstream_media_management(){
595 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user();
596
597 $this->main->show_user_data($pack_details);
598
599
600 print '<div id="wpstream_media_upload"><h3>'.__('Media Upload','wpstream').'</h3>'.$this->wpstream_present_media_upload().'</div>';
601
602 print '<div id="wpstream_file_management"><h3 id="video_management_title">'.__('Video Management','wpstream').'</h3>'.$this->wpstream_present_file_management().'</div>';
603
604 }
605
606
607
608 /**
609 * Media upload
610 *
611 * @since 3.0.1
612 */
613 public function wpstream_present_media_upload(){
614 $to_return='';
615 $formInputs=$this->main->wpstream_live_connection->wpstream_get_signed_form_upload_data();
616
617 if($formInputs === 'notenough'){
618 $to_return.='<div class="wpstream_upload_alert">'.esc_html__('You do not have enough bandwidth or storage to upload a video!','wpstream').'</div>';
619 return $to_return;
620 }
621
622
623 $to_return.='<div class="wpstream_upload_container">';
624 $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>';
625 $to_return.='<form action="https://wpstream-videos.s3.amazonaws.com/"
626 method="POST"
627 enctype="multipart/form-data"
628 class="direct-upload">';
629
630 $to_return.='<input id="wpstream_upload" type="file" class="inputfile inputfile-1" value="Pick a video file" name="file" multiple>';
631 $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">Choose a file&hellip;</span></label>';
632
633
634 $to_return.='<div class="wpstream_file_drop_color">';
635 $to_return.='<div class="wpstream_form_ex">'.esc_html__('Drop a video file here!','wpstream').'</div>';
636 $to_return.='<div class="wpstream_form_ex_details">'.esc_html__('The Video File must be encoded with the following settings:
637
638 Container: MP4,
639 Video codec: H264,
640 Audio codec: AAC. Media will fail to play back if it does not follow the above settings.
641 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>';
642 if(is_array($formInputs)){
643 foreach ($formInputs as $name => $value) {
644 $to_return.='<input type="hidden" name="'. $name.'" value="'.$value.'">';
645 }
646 }
647
648 $to_return.='
649 <div class="progress-bar-area"></div></div>
650 </form>';
651
652 $to_return.='</div>';
653 return $to_return;
654
655 }
656
657
658
659 /**
660 * Display movie list
661 *
662 * @since 3.0.1
663 */
664 public function wpstream_present_file_management(){
665 $video_list_raw = $this->main->wpstream_live_connection->wpstream_get_videos_from_storage_raw_data();
666
667 $to_return='';
668 if(is_array($video_list_raw)){
669 foreach ($video_list_raw as $key =>$video){
670 $to_return.='<div class="wpstream_video_wrapper">';
671
672 $to_return.='<div class="wpstream_video_title">';
673 $to_return.='<div class="wpstream_video_notice"></div></div>';
674 $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['video_name_storage'].'</span></div>';
675 $to_return.=' <div class="wpstream_delete_media" ';
676 $to_return.=' onclick="return confirm(\' Are you sure you wish to delete '.$video['video_name_storage'].'?\')" data-filename="'.$video['video_name_storage'].'">'.esc_html__('delete file','wpstream').'</div>';
677 $to_return.='<div class="wpstream_get_download_link" data-filename="'.$video['video_name_storage'].'">'.esc_html__('get download link','wpstream').'</div>';
678 $to_return.='<a href="" class="wpstream_download_link">'.esc_html__('Click to download! The url will work for the next 20 minutes!','wpstream').'</a>';
679
680 $add_free_video_url=admin_url('post-new.php?post_type=wpstream_product').'&new_video_name='. rawurlencode($video['video_name_storage']);
681 $add_paid_video_url=admin_url('post-new.php?post_type=product').'&new_video_name='. rawurlencode($video['video_name_storage']);
682
683
684
685 $to_return .='<a class="create_new_free_video" href="'.esc_url($add_free_video_url).'">'.esc_html__('Create new free VOD from this video').'</a>';
686 $to_return .='<a class="create_new_ppv_video" href="'.esc_url($add_paid_video_url).'">'.esc_html__('Create pay-per-view VOD from this video').'</a>';
687
688 $to_return.='</div>';
689
690 }
691 } else {
692 $to_return.= '<div class="wpstream_video_wrapper">'.esc_html__('You don\'t have any videos.','wpstream').'</div>';
693 }
694 return $to_return;
695 }
696
697
698
699
700
701 /**
702 * save meta options
703 *
704 * @since 3.0.1
705 */
706 public function wpstream_free_product_update_post($post_id,$post){
707
708 if(!is_object($post) || !isset($post->post_type)) {
709 return;
710 }
711
712 if($post->post_type!='wpstream_product'){
713 return;
714 }
715
716
717 $allowed_keys=array(
718 'wpstream_product_type',
719 'wpstream_free_video',
720 'wpstream_free_video_external'
721 );
722
723 $allowed_html=array();
724
725 foreach ($_POST as $key => $value) {
726 if( !is_array ($value) ){
727 if (in_array ($key, $allowed_keys)) {
728 $postmeta = wp_kses ( $value,$allowed_html );
729 update_post_meta($post_id, sanitize_key($key), $postmeta );
730 }
731 }
732 }
733 }
734
735
736 /**
737 * save meta options
738 *
739 * @since 3.0.1
740 */
741 public function add_wpstream_product_metaboxes() {
742 add_meta_box( 'add_wpstream_product_metaboxes-sectionid', __( 'Live Channel/Video Settings', 'wpestate' ),array($this,'display_meta_options'),'wpstream_product' ,'normal','default');
743 }
744
745
746
747 /**
748 * render meta options
749 *
750 * @since 3.0.1
751 */
752 public function display_meta_options( $post ) {
753 wp_nonce_field( plugin_basename( __FILE__ ), 'estate_agent_noncename' );
754 global $post;
755
756 $is_live = '';
757 $is_video = '';
758 $is_video_external = '';
759 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
760 $is_video = ' selected ';
761 $wpstream_free_video = esc_html( $_GET['new_video_name']);
762 }else{
763 $wpstream_product_type = esc_html(get_post_meta($post->ID, 'wpstream_product_type', true));
764 $wpstream_free_video = esc_html(get_post_meta($post->ID, 'wpstream_free_video', true));
765
766 if($wpstream_product_type==1){
767 $is_live = ' selected ';
768 }
769
770 if($wpstream_product_type==2){
771 $is_video = ' selected ';
772 }
773
774 if($wpstream_product_type==3){
775 $is_video_external = ' selected ';
776 }
777 }
778
779 print'
780 <p class="meta-options">
781 <label for="wpstream_product_type">'.__('Media Type:','wpstream').' </label><br />
782 <select id="wpstream_product_type" name="wpstream_product_type">
783 <option value="1" '.$is_live.'>'.__('Free Live Channel - encrypted streaming & copy protection','wpstream').'</option>
784 <option value="2" '.$is_video.'>'.__('Free Video - encrypted streaming & copy protection','wpstream').'</option>
785 <option value="3" '.$is_video_external.'>'.__('Free Video - unprotected','wpstream').'</option>
786 </select>
787 </p>
788 ';
789
790
791
792 print '
793 <p class="meta-options video_free">
794 <label for="wpstream_free_video">'.__('Choose video:','wpstream').' </label><br />
795 <select id="wpstream_free_video" name="wpstream_free_video">';
796 $video_list = $this->main->wpstream_live_connection->wpstream_get_videos();
797
798 if(is_array($video_list)){
799 foreach ($video_list as $key=>$value){
800 print '<option value="'.$key.'"';
801 if($wpstream_free_video === $key){
802 print ' selected ';
803 }
804 print '>'.$value.'</option>';
805 }
806 }
807 print'
808 </select>
809 </p>
810 ';
811
812 $wpstream_free_video_external= esc_html(get_post_meta($post->ID, 'wpstream_free_video_external', true));
813 print '<p class="meta-options1 video_free_external">
814 <label for="wpstream_free_video_external">'.__('Choose video:','wpstream').' </label><br />
815
816 <input id="wpstream_free_video_external" type="text" size="36" name="wpstream_free_video_external" value="'.$wpstream_free_video_external.'" />
817 <input id="wpstream_free_video_external_button" type="button" size="40" class="upload_button button" value="'.esc_html__('Select Video','wpstream').'" />
818
819 <p>'.esc_html__('You can choose a video from your computer or use the url from external source or use the url of a YouTube Video or use the url from a Vimeo video.','wpstream').'</p>
820
821 </p> ';
822 }
823
824
825
826
827
828
829
830 /**
831 * Add new product types to Woocommerce select product type
832 *
833 * @since 3.0.1
834 */
835 public function wpstream_add_products( $types ){
836 $types[ 'live_stream' ] = __( 'Live Channel','wpestream' );
837 $types[ 'video_on_demand' ] = __( 'Video On Demand','wpestream' );
838
839 return $types;
840 }
841
842
843
844 /**
845 * Js action to do when user pick live stream or video on demand
846 *
847 * @since 3.0.1
848 */
849
850 public function wpstream_products_custom_js() {
851 if ( 'product' != get_post_type() ) :
852 return;
853 endif;
854
855 ?>
856 <script type='text/javascript'>
857 jQuery( document ).ready( function() {
858 jQuery('.options_group.pricing' ).addClass ( 'show_if_live_stream' ).show();
859 jQuery('.options_group.pricing' ).addClass ( 'show_if_video_on_demand' ).show();
860 jQuery('._sold_individually_field').parent().addClass('show_if_live_stream').show();
861 jQuery('._sold_individually_field').parent().addClass('show_if_video_on_demand').show();
862 jQuery('._sold_individually_field').show();
863
864 var selected = jQuery('#product-type').val();
865 });
866 </script>
867 <?php
868
869 }
870
871
872 /**
873 * Add custom classes to the product types
874 *
875 * @since 3.0.1
876 */
877
878 public function wpstream_hide_attributes_data_panel( $tabs) {
879
880 $tabs['shipping']['class'][] = 'hide_if_live_stream hide_if_video_on_demand';
881 $tabs['inventory']['class'][] = 'show_if_live_stream show_if_video_on_demand';
882 // $tabs['general']['class'][] = 'show_if_live_stream show_if_video_on_demand';
883
884 return $tabs;
885 }
886
887
888 /**
889 * Add custom fields to custom product types
890 *
891 * @since 3.0.1
892 */
893
894 public function wpstream_add_custom_general_fields() {
895
896 global $woocommerce, $post;
897 if(function_exists('wcs_user_has_subscription')){
898 echo '<div class="options_group show_if_subscription">';
899 woocommerce_wp_select(
900 array(
901 'id' => '_subscript_live_event',
902 'label' => __( 'Is a subscription based live channel ?', 'woocommerce' ),
903 'options' => array("yes"=>"yes","no"=>"no")
904 )
905 );
906 echo '</div>';
907 }
908
909 echo '<div class="options_group show_if_live_stream" style="border:none;"></div>';
910 echo '<div class="options_group show_if_video_on_demand">';
911 $selected='';
912 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
913 $selected=esc_html($_GET['new_video_name']);
914 }
915 if($selected==''){
916 $selected= get_post_meta($post->ID,'_movie_url',true);
917 }
918
919 woocommerce_wp_select(
920 array(
921 'id' => '_movie_url',
922 'label' => __( 'Select the video file.', 'woocommerce' ),
923 'options' => $this->main->wpstream_live_connection->wpstream_get_videos(),
924 'selected'=> true,
925 'value' => $selected
926 )
927 );
928
929 echo '</div>';
930 }
931
932 /**
933 * Save custom fields
934 *
935 * @since 3.0.1
936 */
937
938 public function wpstream_add_custom_general_fields_save( $post_id ){
939
940 $permited_values = array(
941 '_movie_url',
942 '_subscript_live_event'
943 );
944 $allowed_html=array();
945 foreach($_POST as $key=>$value){
946 update_post_meta( $post_id, 'event_passed', 0 );
947 if( in_array($key, $permited_values) ){
948 if( !empty( $_POST[$key] ) ){
949 update_post_meta( $post_id, wp_kses ($key,$allowed_html), wp_kses ( $_POST[$key],$allowed_html) );
950 }
951 }
952 }
953
954 }
955
956 /**
957 * Add to cart redirect
958 *
959 * @since 3.0.1
960 */
961
962 public function wpstream_add_to_cart() {
963 wc_get_template( 'single-product/add-to-cart/simple.php' );
964 }
965
966
967 /**
968 * Replace add to cart button
969 *
970 * @since 3.0.1
971 */
972 public function replacing_add_to_cart_button( $button, $product ) {
973 global $product;
974 $product_type = $product->get_type();
975
976 if($product_type==='live_stream' || $product_type=='video_on_demand'){
977 return $button = '<a class="button" href="'.get_site_url().'/shop/?add-to-cart=' .$product->get_id(). '&quantity=1">' . __( 'Add to Cart', 'woocommerce' ) . '</a>';
978 }else{
979 return $button;
980 }
981 }
982
983
984 /**
985 * Admin notices
986 *
987 * @since 3.0.1
988 */
989 public function wpstream_admin_notice() {
990 global $pagenow;
991 global $typenow;
992
993 if ( !in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
994 print '<div class="notice notice-error is-dismissible">
995 <p>'.__( 'WpStream Pay Per View / Subscription mode works only with WooCommerce - If you want to charge money for your live events or videos you need to activate WooCommerce plugin', 'wpestate' ).'</p>
996 </div>';
997 }
998 if( !in_array ('curl', get_loaded_extensions())) {
999 print '<div class="notice notice-error is-dismissible">
1000 <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.', 'wpestate' ).'</p>
1001 </div>';
1002 }
1003
1004
1005 $wpestate_notices = get_option('wp_stream_notices');
1006
1007 if( !is_array($wpestate_notices) ||
1008 !isset($wpestate_notices['wpstream_update_1021']) ||
1009 ( isset($wpestate_notices['wpstream_update_1021']) && $wpestate_notices['wpstream_update_1021']!='yes') ){
1010
1011 print '<div id ="setting-error-wprentals-cache" data-notice-type="wpstream_update_1021" data-dismissible="disable-done-notice-forever" class="wpestate_notices updated settings-error notice is-dismissible">
1012 <p>'.esc_html__( 'New! We just released WpStream WordPress Theme - a turn key solution for video delivery & live streaming. This theme is built around WpStream plugin and is the perfect solution for video streaming or rentals platform. ','wpstream').'<a href="https://wpstream.net/wpstream-theme-a-live-streaming-wordpress-theme" target="_blank">'.esc_html__('Download Theme','wpstream').'</a></p>
1013 </div>';
1014 }
1015
1016
1017
1018
1019
1020 $ajax_nonce = wp_create_nonce( "wpstream_notice_nonce" );
1021 print '<input type="hidden" id="wpstream_notice_nonce" value="'.esc_html($ajax_nonce).'"/>';
1022
1023 }
1024
1025 /**
1026 * Admin notices
1027 *
1028 * @since 3.0.1
1029 */
1030 public function wpstream_update_cache_notice(){
1031
1032 //check_ajax_referer( 'wpstream_notice_nonce', 'security' );
1033
1034 $notice_type = esc_html($_POST['notice_type']);
1035 $notices = get_option('wp_stream_notices');
1036
1037 if(! is_array($notices) ){
1038 $notices=array();
1039 }
1040
1041 $notices[$notice_type]='yes';
1042
1043 update_option('wp_stream_notices',$notices);
1044 die();
1045 }
1046
1047
1048
1049 /**
1050 * Activate metaboxes for Streaming controls on sidebar
1051 *
1052 * @since 3.0.1
1053 */
1054 public function wpstream_startstreaming_sidebar_meta() {
1055 global $post;
1056 $term_list = wp_get_post_terms($post->ID, 'product_type');
1057 if( get_post_meta($post->ID, 'wpstream_product_type', true)==1 ){
1058 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'wpstream_product', 'side', 'high');
1059 }
1060
1061 $is_subscription_live_event = esc_html(get_post_meta($post->ID,'_subscript_live_event',true));
1062
1063
1064 if(!is_wp_error( $term_list )){
1065 if( isset($term_list[0]->name) ){
1066 if( $term_list[0]->name=='live_stream' || ($term_list[0]->name=='subscription' && $is_subscription_live_event=='yes' ) ){
1067 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'product', 'side', 'high');
1068 }
1069 }
1070 }
1071
1072 }
1073
1074 /**
1075 * Show Streaming controls on sidebar
1076 *
1077 * @since 3.0.1
1078 */
1079 public function wpstream_start_stream_meta(){
1080 global $live_event_for_user;
1081 global $post;
1082
1083 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
1084 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
1085 $live_event_for_user = $this->main->wpstream_live_connection->api20_wpstream_request_live_stream_for_user();
1086 $this->wpstream_live_stream_unit($post->ID);
1087
1088 }
1089 }