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

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

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