PluginProbe
WpStream – Live Streaming, Video on Demand, Pay Per View / 3.1.8
WpStream – Live Streaming, Video on Demand, Pay Per View v3.1.8
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 4.5.12 All 180 releases
wpstream / admin / class-wpstream-admin.php

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

1,063 lines 46.9 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
311 $live_class='';
312 if(isset($live_event_for_user[$the_id])) {
313 $live_class=" wpstream_show_started";
314 }
315
316
317 print '<div class="event_list_unit '.$live_class.' ">';
318 $ip= get_post_meta($the_id,'ip',true);
319
320
321 if(has_post_thumbnail($the_id)){
322 $thumb = get_the_post_thumbnail_url($the_id,'thumbnail');
323 }else{
324 $thumb= plugin_dir_url( dirname( __FILE__ ) ). 'img/default_150.jpg';
325 }
326
327
328 print '<div class="event_thumb_wrapper"><img class="event_thumb" src="'.$thumb.'" alt="show_imagge"></div>';
329 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> ';
330
331 $live_event_stream_name = get_post_meta($the_id,'live_event_stream_name',true);
332 $live_event_array = get_post_meta($the_id,'live_event_uri',true);
333 $live_event_uri = '';
334
335
336 $pending_streaming_class = '';
337 $wpstream_ready_to_stream_class = '';
338 $external_software_streaming_class = '';
339 $wpstream_no_stream_class = '';
340 $carnat_key1 = '';
341 $carnat_key2 = '';
342 $uri = '';
343 $webcaster_url = '';
344 $rtmp_ip_uri = '';
345 $uri_ip = '';
346
347 if(is_array($live_event_for_user) && isset($live_event_for_user[$the_id])) {
348
349 $pending_streaming_class = 'show_stream_data pending_trigger';
350 $wpstream_ready_to_stream_class = 'hide_stream_data';
351 $external_software_streaming_class = 'show_stream_data';
352 $wpstream_no_stream_class = 'hide_stream_data';
353 if(isset($live_event_for_user[$the_id]['live_uri'])){
354 $explode = explode('wpstream.net/', $live_event_for_user[$the_id]['live_uri']);
355 $uri = $explode[0].'wpstream.net/wpstream/';
356 $stream_name = get_post_meta($the_id,'live_event_stream_name',true);
357 $carnat_key1 = $live_event_for_user[$the_id]['carnat1'];
358 $carnat_key2 = $live_event_for_user[$the_id]['carnat2'];
359 $webcaster_url = 'https://'.$live_event_for_user[$the_id]['subdomain_key'].'.live.streamer.wpstream.net:8443/'.$live_event_for_user[$the_id]['carnat2'];
360
361 $rtmp_ip_uri = 'http://'.$live_event_for_user[$the_id]['ip'].':8444';
362 $uri_ip= 'rtmp://'.$live_event_for_user[$the_id]['ip'].'/wpstream/';
363 }
364
365 }else{
366
367 $pending_streaming_class = 'hide_stream_data';
368 $wpstream_ready_to_stream_class = 'hide_stream_data';
369 $external_software_streaming_class = 'hide_stream_data';
370 $wpstream_no_stream_class = 'show_stream_data';
371 }
372
373
374
375
376 print' <div class="pending_streaming '.$pending_streaming_class.' " data-server-id="'.$the_id.'" data-server-url="'.$rtmp_ip_uri.'">';
377 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').' ';
378 print '<img class="server_loading_new" src="'.plugin_dir_url( dirname( __FILE__ ) ).'img/loading.gif" alt="loading" /></div>';
379 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>';
380 print '</div>';
381
382
383 print '<div class="wpstream_ready_to_stream '.$wpstream_ready_to_stream_class.'">';
384 print '<div class="wpstream_channel_status"><span class="dashicons dashicons-yes"></span>'.esc_html__('Ready To Stream !','wpstream').'</div>';
385 print '<div class="start_webcaster wpstream_button" data-webcaster-url="'.$webcaster_url.'" >'.esc_html__('Start Browser Broadcast','wpstream').'</div>';
386 print '<div class="start_external wpstream_button" >'.esc_html__('Broascast With 3rd Party Software','wpstream').'</div>';
387 print '</div>';
388
389
390
391 print '<div class="external_software_streaming '. $external_software_streaming_class.' ">';
392 print '<div class="event_list_unit_notificationx"><strong>'.__('URL:').' </strong> <div class="wpstream_live_uri_text">' . $uri_ip.'</div><div class="copy_live_uri">'.__('copy to clipboard','wpstream').'</div>';
393 print '<div class="event_list_stream_key_wrap"><strong>'.__('Stream key:').' </strong><div class="wpstream_live_key_text">'. $carnat_key1.'?auth='.$carnat_key2.'</div><div class="copy_live_key">'.__('copy to clipboard','wpstream').'</div></div>';
394 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>';
395 print ' <img class="how_to" src="'.plugin_dir_url( dirname( __FILE__ ) ).'img/how_to_obs.jpg" alt="show_imagge">';
396 print'</div>';
397 print'</div>';
398
399
400
401
402 print '<div class="wpstream_no_stream '.$wpstream_no_stream_class.' ">';
403 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>';
404 print '<div class="record_wrapper">Record ? <input type="checkbox" name="record_event" class="record_event"/>Yes</div>';
405 print '<input class="start_event wpstream_button" type="button" data-show-id="'.$the_id.'" value="'.esc_html__('Broadcast To Channel','wpstream').'">';
406 print '<input class="close_event wpstream_button" type="button" data-show-id="'.$the_id.'" value="'.esc_html__('Delete Channel','wpstream').'">';
407 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>';
408
409
410 print '<div class="wpstream_social_media_broadcast">';
411
412 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>';
413 print '</div>';
414
415 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>';
416 print '</div>';
417
418
419 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>';
420 print '</div>';
421
422 print '<div class="wpstream_on_facebook_container wpstream_social_stream_container">';
423 print 'Some Facebook Settings for event '.$the_id;
424 print '</div>';
425
426 print '<div class="wpstream_on_youtube_container wpstream_social_stream_container">';
427 print '<label for="wpstream_youtube_rtmp'.$the_id.'">'.esc_html__('Youtube RTMP','wpstream').'</label>';
428 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 )).'">';
429 print '</div>';
430
431 print '<div class="wpstream_on_twich_container wpstream_social_stream_container">';
432 print '<label for="wpstream_twich_rtmp'.$the_id.'">'.esc_html__('Twich RTMP','wpstream').'</label>';
433 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 )).'">';
434 print '</div>';
435
436
437 print '</div>';
438 print '</div>';
439
440
441 print '</div>';
442 }
443
444
445
446
447
448
449
450
451
452
453
454 /**
455 * Set credential admin function
456 *
457 * @since 3.0.1
458 */
459 public function wpstream_set_wpstream_credentials(){
460
461 if($_SERVER['REQUEST_METHOD'] === 'POST'){
462 $allowed_html = array();
463 $exclude_array = array();
464 $allowed_html = array();
465
466 foreach($_POST as $variable=>$value){
467 if ($variable!='submit'){
468 if (!in_array($variable, $exclude_array) ){
469 update_option( sanitize_key('wpstream_'.$variable), wp_kses ($value,$allowed_html) );
470 }
471 }
472 }
473
474
475
476
477 update_option('wp_estate_token_expire',0);
478 update_option('wp_estate_curent_token',' ');
479 delete_transient( 'wpstream_token_request');
480
481 }
482
483
484 $allowed_html = array();
485 $api_key = esc_html( get_option('wpstream_api_key','') );
486
487
488 $wpstream_options_array =array(
489 2 => array(
490 'label' => 'WpStream.net Username or Email',
491 'name' => 'api_username',
492 'type' => 'text',
493 ),
494 3 => array(
495 'label' => 'WpStream.net Password',
496 'name' => 'api_password',
497 'type' => 'password',
498 ),
499 // 0 => array(
500 // 'label' => 'API Key',
501 // 'name' => 'api_key',
502 // 'type' => 'text',
503 // ),
504 // 1 => array(
505 // 'label' => 'API Secret Key',
506 // 'name' => 'api_secret_key',
507 // 'type' => 'text',
508 // ),
509
510 );
511
512
513 $token = $this->main->wpstream_live_connection->wpstream_get_token();
514 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user();
515
516 $this->main->show_user_data($pack_details);
517
518 print '<form method="post" action="" >';
519 print '<div class="theme_options_tab_wpstream" style="display:block;" >
520 <h1>'.__('WpStream Credentials','wpstream').'</h1>';
521
522
523 if( get_option('wpstream_api_username')=='' || get_option('wpstream_api_password')== ' '){
524 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>';
525 }else if($token==''){
526 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>';
527 }else if( $this->main->wpstream_live_connection->wpstream_client_check_api_status() ){
528 echo '<div class="api_conected">'.__('Conected to WpStream.net!','wpstream').'</div>';
529 }else{
530 echo '<div class="api_not_conected wpstream_brown">'.__('Failed to connect to WpStream.net. Please address CURL connectivity with your hosting provider.','wpstream').'</div>';
531 }
532 print '<div class="wpstream_option_wrapper">';
533 foreach ($wpstream_options_array as $key=>$option){
534 print '<div class="wpstream_option">';
535
536 $options_value = esc_html( get_option('wpstream_'.$option['name'],'') );
537 print '<label for="'.$option['name'].'">'.$option['label'].'</label>';
538 print '<input id="'.$option['name'].'" type="'.$option['type'].'" size="36" name="'.$option['name'].'" value="'.esc_html($options_value).'" />';
539
540 print '</div>';
541 }
542 print '</div>';
543
544
545 print '<input type="submit" name="submit" class="wpstream_button" value="'.__('Save Changes','wpstream').'" />';
546
547
548
549 print '</div>';
550 print '</form>';
551
552 print '<div class="theme_options_tab_wpstream" style="display:block;" >';
553 $link_new = admin_url('admin.php?page=wpstream_new_general_set');
554 $link_new_paid = admin_url('post-new.php?post_type=product').'&new_stream='. rawurlencode('new');
555 $link_new_free = admin_url('post-new.php?post_type=wpstream_product');
556
557
558 print '<a href="'.esc_url($link_new_free).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create new free channel','wpstream').'</a>';
559 print '<a href="'.esc_url($link_new_paid).'" class="wpstream_no_chanel_add_channel">'.esc_html__('Create pay-per-view channel','wpstream').'</a>';
560 print '<a href="'.esc_url($link_new).'" class="wpstream_no_chanel_add_channel">'.esc_html('My Channels','wpstream').'</a>';
561 print '</div>';
562
563
564 }
565
566
567
568 /**
569 * Media Management
570 *
571 * @since 3.0.1
572 */
573 public function wpstream_media_management(){
574 $pack_details = $this->main->wpstream_live_connection->wpstream_request_pack_data_per_user();
575
576 $this->main->show_user_data($pack_details);
577
578
579 print '<div id="wpstream_media_upload"><h3>'.__('Media Upload','wpstream').'</h3>'.$this->wpstream_present_media_upload().'</div>';
580
581 print '<div id="wpstream_file_management"><h3 id="video_management_title">'.__('Video Management','wpstream').'</h3>'.$this->wpstream_present_file_management().'</div>';
582
583 }
584
585
586
587 /**
588 * Media upload
589 *
590 * @since 3.0.1
591 */
592 public function wpstream_present_media_upload(){
593 $to_return='';
594 $formInputs=$this->main->wpstream_live_connection->wpstream_get_signed_form_upload_data();
595
596 if($formInputs === 'notenough'){
597 $to_return.='<div class="wpstream_upload_alert">'.esc_html__('You do not have enough bandwidth or storage to upload a video!','wpstream').'</div>';
598 return $to_return;
599 }
600
601
602 $to_return.='<div class="wpstream_upload_container">';
603 $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>';
604 $to_return.='<form action="https://wpstream-videos.s3.amazonaws.com/"
605 method="POST"
606 enctype="multipart/form-data"
607 class="direct-upload">';
608
609 $to_return.='<input id="wpstream_upload" type="file" class="inputfile inputfile-1" value="Pick a video file" name="file" multiple>';
610 $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>';
611
612
613 $to_return.='<div class="wpstream_file_drop_color">';
614 $to_return.='<div class="wpstream_form_ex">'.esc_html__('Drop a video file here!','wpstream').'</div>';
615 $to_return.='<div class="wpstream_form_ex_details">'.esc_html__('The Video File must be encoded with the following settings:
616
617 Container: MP4,
618 Video codec: H264,
619 Audio codec: AAC. Media will fail to play back if it does not follow the above settings.
620 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>';
621 if(is_array($formInputs)){
622 foreach ($formInputs as $name => $value) {
623 $to_return.='<input type="hidden" name="'. $name.'" value="'.$value.'">';
624 }
625 }
626
627 $to_return.='
628 <div class="progress-bar-area"></div></div>
629 </form>';
630
631 $to_return.='</div>';
632 return $to_return;
633
634 }
635
636
637
638 /**
639 * Display movie list
640 *
641 * @since 3.0.1
642 */
643 public function wpstream_present_file_management(){
644 $video_list_raw = $this->main->wpstream_live_connection->wpstream_get_videos_from_storage_raw_data();
645
646 $to_return='';
647 if(is_array($video_list_raw)){
648 foreach ($video_list_raw as $key =>$video){
649 $to_return.='<div class="wpstream_video_wrapper">';
650
651 $to_return.='<div class="wpstream_video_title">';
652 $to_return.='<div class="wpstream_video_notice"></div></div>';
653 $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>';
654 $to_return.=' <div class="wpstream_delete_media" ';
655 $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>';
656 $to_return.='<div class="wpstream_get_download_link" data-filename="'.$video['video_name_storage'].'">'.esc_html__('get download link','wpstream').'</div>';
657 $to_return.='<a href="" class="wpstream_download_link">'.esc_html__('Click to download! The url will work for the next 20 minutes!','wpstream').'</a>';
658
659 $add_free_video_url=admin_url('post-new.php?post_type=wpstream_product').'&new_video_name='. rawurlencode($video['video_name_storage']);
660 $add_paid_video_url=admin_url('post-new.php?post_type=product').'&new_video_name='. rawurlencode($video['video_name_storage']);
661
662
663
664 $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>';
665 $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>';
666
667 $to_return.='</div>';
668
669 }
670 } else {
671 $to_return.= '<div class="wpstream_video_wrapper">'.esc_html__('You don\'t have any videos.','wpstream').'</div>';
672 }
673 return $to_return;
674 }
675
676
677
678
679
680 /**
681 * save meta options
682 *
683 * @since 3.0.1
684 */
685 public function wpstream_free_product_update_post($post_id,$post){
686
687 if(!is_object($post) || !isset($post->post_type)) {
688 return;
689 }
690
691 if($post->post_type!='wpstream_product'){
692 return;
693 }
694
695
696 $allowed_keys=array(
697 'wpstream_product_type',
698 'wpstream_free_video',
699 'wpstream_free_video_external'
700 );
701
702 $allowed_html=array();
703
704 foreach ($_POST as $key => $value) {
705 if( !is_array ($value) ){
706 if (in_array ($key, $allowed_keys)) {
707 $postmeta = wp_kses ( $value,$allowed_html );
708 update_post_meta($post_id, sanitize_key($key), $postmeta );
709 }
710 }
711 }
712 }
713
714
715 /**
716 * save meta options
717 *
718 * @since 3.0.1
719 */
720 public function add_wpstream_product_metaboxes() {
721 add_meta_box( 'add_wpstream_product_metaboxes-sectionid', __( 'Live Channel/Video Settings', 'wpestate' ),array($this,'display_meta_options'),'wpstream_product' ,'normal','default');
722 }
723
724
725
726 /**
727 * render meta options
728 *
729 * @since 3.0.1
730 */
731 public function display_meta_options( $post ) {
732 wp_nonce_field( plugin_basename( __FILE__ ), 'estate_agent_noncename' );
733 global $post;
734
735 $is_live = '';
736 $is_video = '';
737 $is_video_external = '';
738 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
739 $is_video = ' selected ';
740 $wpstream_free_video = esc_html( $_GET['new_video_name']);
741 }else{
742 $wpstream_product_type = esc_html(get_post_meta($post->ID, 'wpstream_product_type', true));
743 $wpstream_free_video = esc_html(get_post_meta($post->ID, 'wpstream_free_video', true));
744
745 if($wpstream_product_type==1){
746 $is_live = ' selected ';
747 }
748
749 if($wpstream_product_type==2){
750 $is_video = ' selected ';
751 }
752
753 if($wpstream_product_type==3){
754 $is_video_external = ' selected ';
755 }
756 }
757
758 print'
759 <p class="meta-options">
760 <label for="wpstream_product_type">'.__('Media Type:','wpstream').' </label><br />
761 <select id="wpstream_product_type" name="wpstream_product_type">
762 <option value="1" '.$is_live.'>'.__('Free Live Channel - encrypted streaming & copy protection','wpstream').'</option>
763 <option value="2" '.$is_video.'>'.__('Free Video - encrypted streaming & copy protection','wpstream').'</option>
764 <option value="3" '.$is_video_external.'>'.__('Free Video - unprotected','wpstream').'</option>
765 </select>
766 </p>
767 ';
768
769
770
771 print '
772 <p class="meta-options video_free">
773 <label for="wpstream_free_video">'.__('Choose video:','wpstream').' </label><br />
774 <select id="wpstream_free_video" name="wpstream_free_video">';
775 $video_list = $this->main->wpstream_live_connection->wpstream_get_videos();
776
777 if(is_array($video_list)){
778 foreach ($video_list as $key=>$value){
779 print '<option value="'.$key.'"';
780 if($wpstream_free_video === $key){
781 print ' selected ';
782 }
783 print '>'.$value.'</option>';
784 }
785 }
786 print'
787 </select>
788 </p>
789 ';
790
791 $wpstream_free_video_external= esc_html(get_post_meta($post->ID, 'wpstream_free_video_external', true));
792 print '<p class="meta-options1 video_free_external">
793 <label for="wpstream_free_video_external">'.__('Choose video:','wpstream').' </label><br />
794
795 <input id="wpstream_free_video_external" type="text" size="36" name="wpstream_free_video_external" value="'.$wpstream_free_video_external.'" />
796 <input id="wpstream_free_video_external_button" type="button" size="40" class="upload_button button" value="'.esc_html__('Select Video','wpstream').'" />
797
798 <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>
799
800 </p> ';
801 }
802
803
804
805
806
807
808
809 /**
810 * Add new product types to Woocommerce select product type
811 *
812 * @since 3.0.1
813 */
814 public function wpstream_add_products( $types ){
815 $types[ 'live_stream' ] = __( 'Live Channel','wpestream' );
816 $types[ 'video_on_demand' ] = __( 'Video On Demand','wpestream' );
817
818 return $types;
819 }
820
821
822
823 /**
824 * Js action to do when user pick live stream or video on demand
825 *
826 * @since 3.0.1
827 */
828
829 public function wpstream_products_custom_js() {
830 if ( 'product' != get_post_type() ) :
831 return;
832 endif;
833
834 ?>
835 <script type='text/javascript'>
836 jQuery( document ).ready( function() {
837 jQuery( '.options_group.pricing' ).addClass ( 'show_if_live_stream' ).show();
838 jQuery( '.options_group.pricing' ).addClass ( 'show_if_video_on_demand' ).show();
839 var selected = jQuery('#product-type').val();
840 });
841 </script>
842 <?php
843
844 }
845
846
847 /**
848 * Add custom classes to the product types
849 *
850 * @since 3.0.1
851 */
852
853 public function wpstream_hide_attributes_data_panel( $tabs) {
854
855 $tabs['shipping']['class'][] = 'hide_if_live_stream hide_if_video_on_demand';
856 // $tabs['general']['class'][] = 'show_if_live_stream show_if_video_on_demand';
857
858 return $tabs;
859 }
860
861
862 /**
863 * Add custom fields to custom product types
864 *
865 * @since 3.0.1
866 */
867
868 public function wpstream_add_custom_general_fields() {
869
870 global $woocommerce, $post;
871 if(function_exists('wcs_user_has_subscription')){
872 echo '<div class="options_group show_if_subscription">';
873 woocommerce_wp_select(
874 array(
875 'id' => '_subscript_live_event',
876 'label' => __( 'Is a subscription based live channel ?', 'woocommerce' ),
877 'options' => array("yes"=>"yes","no"=>"no")
878 )
879 );
880 echo '</div>';
881 }
882
883 echo '<div class="options_group show_if_live_stream" style="border:none;"></div>';
884 echo '<div class="options_group show_if_video_on_demand">';
885 $selected='';
886 if( isset( $_GET['new_video_name']) && $_GET['new_video_name']!='' ){
887 $selected=esc_html($_GET['new_video_name']);
888 }
889 if($selected==''){
890 $selected= get_post_meta($post->ID,'_movie_url',true);
891 }
892
893 woocommerce_wp_select(
894 array(
895 'id' => '_movie_url',
896 'label' => __( 'Select the video file.', 'woocommerce' ),
897 'options' => $this->main->wpstream_live_connection->wpstream_get_videos(),
898 'selected'=> true,
899 'value' => $selected
900 )
901 );
902
903 echo '</div>';
904 }
905
906 /**
907 * Save custom fields
908 *
909 * @since 3.0.1
910 */
911
912 public function wpstream_add_custom_general_fields_save( $post_id ){
913
914 $permited_values = array(
915 '_movie_url',
916 '_subscript_live_event'
917 );
918 $allowed_html=array();
919 foreach($_POST as $key=>$value){
920 update_post_meta( $post_id, 'event_passed', 0 );
921 if( in_array($key, $permited_values) ){
922 if( !empty( $_POST[$key] ) ){
923 update_post_meta( $post_id, wp_kses ($key,$allowed_html), wp_kses ( $_POST[$key],$allowed_html) );
924 }
925 }
926 }
927
928 }
929
930 /**
931 * Add to cart redirect
932 *
933 * @since 3.0.1
934 */
935
936 public function wpstream_add_to_cart() {
937 wc_get_template( 'single-product/add-to-cart/simple.php' );
938 }
939
940
941 /**
942 * Replace add to cart button
943 *
944 * @since 3.0.1
945 */
946 public function replacing_add_to_cart_button( $button, $product ) {
947 global $product;
948 $product_type = $product->get_type();
949
950 if($product_type==='live_stream' || $product_type=='video_on_demand'){
951 return $button = '<a class="button" href="'.get_site_url().'/shop/?add-to-cart=' .$product->get_id(). '&quantity=1">' . __( 'Add to Cart', 'woocommerce' ) . '</a>';
952 }else{
953 return $button;
954 }
955 }
956
957
958 /**
959 * Admin notices
960 *
961 * @since 3.0.1
962 */
963 public function wpstream_admin_notice() {
964 global $pagenow;
965 global $typenow;
966
967 if ( !in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
968 print '<div class="notice notice-error is-dismissible">
969 <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>
970 </div>';
971 }
972 if( !in_array ('curl', get_loaded_extensions())) {
973 print '<div class="notice notice-error is-dismissible">
974 <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>
975 </div>';
976 }
977
978
979 $wpestate_notices = get_option('wp_stream_notices');
980
981 if( !is_array($wpestate_notices) ||
982 !isset($wpestate_notices['wpstream_update_1021']) ||
983 ( isset($wpestate_notices['wpstream_update_1021']) && $wpestate_notices['wpstream_update_1021']!='yes') ){
984
985 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">
986 <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>
987 </div>';
988 }
989
990
991
992
993
994 $ajax_nonce = wp_create_nonce( "wpstream_notice_nonce" );
995 print '<input type="hidden" id="wpstream_notice_nonce" value="'.esc_html($ajax_nonce).'"/>';
996
997 }
998
999 /**
1000 * Admin notices
1001 *
1002 * @since 3.0.1
1003 */
1004 public function wpstream_update_cache_notice(){
1005
1006 //check_ajax_referer( 'wpstream_notice_nonce', 'security' );
1007
1008 $notice_type = esc_html($_POST['notice_type']);
1009 $notices = get_option('wp_stream_notices');
1010
1011 if(! is_array($notices) ){
1012 $notices=array();
1013 }
1014
1015 $notices[$notice_type]='yes';
1016
1017 update_option('wp_stream_notices',$notices);
1018 die();
1019 }
1020
1021
1022
1023 /**
1024 * Activate metaboxes for Streaming controls on sidebar
1025 *
1026 * @since 3.0.1
1027 */
1028 public function wpstream_startstreaming_sidebar_meta() {
1029 global $post;
1030 $term_list = wp_get_post_terms($post->ID, 'product_type');
1031 if( get_post_meta($post->ID, 'wpstream_product_type', true)==1 ){
1032 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'wpstream_product', 'side', 'high');
1033 }
1034
1035 $is_subscription_live_event = esc_html(get_post_meta($post->ID,'_subscript_live_event',true));
1036
1037
1038 if(!is_wp_error( $term_list )){
1039 if( isset($term_list[0]->name) ){
1040 if( $term_list[0]->name=='live_stream' || ($term_list[0]->name=='subscription' && $is_subscription_live_event=='yes' ) ){
1041 add_meta_box('wpstream-sidebar-meta', esc_html__('Live Streaming', 'wpstream'), array($this,'wpstream_start_stream_meta'), 'product', 'side', 'high');
1042 }
1043 }
1044 }
1045
1046 }
1047
1048 /**
1049 * Show Streaming controls on sidebar
1050 *
1051 * @since 3.0.1
1052 */
1053 public function wpstream_start_stream_meta(){
1054 global $live_event_for_user;
1055 global $post;
1056
1057 $ajax_nonce = wp_create_nonce( "wpstream_start_event_nonce" );
1058 print '<input type="hidden" id="wpstream_start_event_nonce" value="'.$ajax_nonce.'">';
1059 $live_event_for_user = $this->main->wpstream_live_connection->wpstream_get_live_event_for_user();
1060 $this->wpstream_live_stream_unit($post->ID);
1061
1062 }
1063 }