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

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

1,034 lines 41.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The file that defines the core plugin class
4 *
5 * A class definition that includes attributes and functions used across both the
6 * public-facing side of the site and the admin area.
7 *
8 * @link http://wpstream.net
9 * @since 3.0.1
10 *
11 * @package Wpstream
12 * @subpackage Wpstream/includes
13 */
14
15 /**
16 * The core plugin class.
17 *
18 * This is used to define internationalization, admin-specific hooks, and
19 * public-facing site hooks.
20 *
21 * Also maintains the unique identifier of this plugin as well as the current
22 * version of the plugin.
23 *
24 * @since 3.0.1
25 * @package Wpstream
26 * @subpackage Wpstream/includes
27 * @author wpstream <office@wpstream.net>
28 */
29 class Wpstream {
30
31 /**
32 * Store plugin main class to allow public access.
33 *
34 * @since 3.0.1
35 * @var object The main class.
36 */
37 public $main;
38 public $admin;
39
40 /**
41 * The loader that's responsible for maintaining and registering all hooks that power
42 * the plugin.
43 *
44 * @since 3.0.1
45 * @access protected
46 * @var Wpstream_Loader $loader Maintains and registers all hooks for the plugin.
47 */
48 protected $loader;
49
50 /**
51 * The unique identifier of this plugin.
52 *
53 * @since 3.0.1
54 * @access protected
55 * @var string $plugin_name The string used to uniquely identify this plugin.
56 */
57 protected $plugin_name;
58
59 /**
60 * The current version of the plugin.
61 *
62 * @since 3.0.1
63 * @access protected
64 * @var string $version The current version of the plugin.
65 */
66 protected $version;
67
68 /**
69 * Define the core functionality of the plugin.
70 *
71 * Set the plugin name and the plugin version that can be used throughout the plugin.
72 * Load the dependencies, define the locale, and set the hooks for the admin area and
73 * the public-facing side of the site.
74 *
75 * @since 3.0.1
76 */
77
78 public $wpstream_live_connection;
79 public $wpstream_player;
80 public $quota_manager;
81 public $xtest;
82 public $plugin_admin;
83
84 public function __construct() {
85 $this->main = $this;
86
87 if ( defined( 'WPSTREAM_PLUGIN_VERSION' ) ) {
88 $this->version = WPSTREAM_PLUGIN_VERSION;
89 } else {
90 $this->version = '3.0.1';
91 }
92
93 $this->plugin_name = 'wpstream';
94
95 $this->load_dependencies();
96 $this->define_admin_hooks();
97 $this->define_public_hooks();
98 $this->define_ajax_hooks();
99 $this->wpstream_load_page_templates();
100 $this->wpstream_load_theme_notice();
101
102 $this->wpstream_conection();
103 $this->wpstream_player();
104 $this->wpstream_init_quota_manager();
105
106 }
107
108
109
110
111
112 public function wpstream_convert_band($megabits){
113 $gigabit = $megabits * 0.001;
114 return floatval( sprintf( '%.1f', $gigabit ) );
115 }
116
117
118 public $wpstream_ajax;
119
120 private function define_ajax_hooks() {
121 require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-wpstream-ajax.php';
122 $this->wpstream_ajax = new WpStream_Ajax( $this->main );
123 }
124
125
126 private function wpstream_conection(){
127 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-live-api-connection.php';
128 $this->wpstream_live_connection = new Wpstream_Live_Api_Connection();
129 }
130
131
132 private function wpstream_player(){
133 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-player.php';
134 $this->wpstream_player = new Wpstream_Player($this->main);
135 }
136
137 private function wpstream_init_quota_manager() {
138 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-quota-manager.php';
139 $this->quota_manager = new Wpstream_Quota_Manager( $this );
140 }
141
142
143 private function wpstream_load_page_templates() {
144 require_once WPSTREAM_PLUGIN_PATH . 'includes/class-wpstream-templates.php';
145 new WpStream_Template_Loader();
146 }
147
148 private function wpstream_load_theme_notice() {
149 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-theme-notice.php';
150 new WPStream_Theme_Notice();
151 }
152
153
154 /**
155 * Load the required dependencies for this plugin.
156 *
157 * Include the following files that make up the plugin:
158 *
159 * - Wpstream_Loader. Orchestrates the hooks of the plugin.
160 * - Wpstream_i18n. Defines internationalization functionality.
161 * - Wpstream_Admin. Defines all hooks for the admin area.
162 * - Wpstream_Public. Defines all hooks for the public side of the site.
163 *
164 * Create an instance of the loader which will be used to register the hooks
165 * with WordPress.
166 *
167 * @since 3.0.1
168 * @access private
169 */
170 private function load_dependencies() {
171
172 /**
173 * The class responsible for orchestrating the actions and filters of the
174 * core plugin.
175 */
176 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-loader.php';
177
178 /**
179 * The class responsible for defining internationalization functionality
180 * of the plugin.
181 */
182 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream-i18n.php';
183
184 /**
185 * The class responsible for defining all actions that occur in the admin area.
186 */
187 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-wpstream-admin.php';
188
189 /**
190 * The class responsible for defining all actions that occur in the public-facing
191 * side of the site.
192 */
193 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-wpstream-public.php';
194 /**
195 * The class responsible for custom post type
196
197 */
198 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wpstream_product.php';
199 if( class_exists( 'WooCommerce' ) ){
200 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_live_stream.php';
201 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wc_product_video_on_demand.php';
202 }
203
204 require_once plugin_dir_path(__FILE__) . 'Helpers/class-wpstream-log-entry.php';
205 require_once plugin_dir_path(__FILE__) . 'Logger/class-wpstream-logger.php';
206
207 $this->loader = new Wpstream_Loader();
208
209 }
210
211 /**
212 * Define the locale for this plugin for internationalization.
213 *
214 * Uses the Wpstream_i18n class in order to set the domain and to register the hook
215 * with WordPress.
216 *
217 * @since 3.0.1
218 * @access private
219 */
220 private function set_locale() {
221
222 $plugin_i18n = new Wpstream_i18n();
223
224 $this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain', 1 );
225
226 }
227
228 /**
229 * Register all of the hooks related to the admin area functionality
230 * of the plugin.
231 *
232 * @since 3.0.1
233 * @access private
234 */
235 private function define_admin_hooks() {
236
237 $plugin_admin = new Wpstream_Admin( $this->get_plugin_name(), $this->get_version(), $this->main );
238
239 $this->admin = $plugin_admin;
240
241 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
242 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
243 $this->loader->add_action( 'admin_menu', $plugin_admin, 'wpstream_manage_admin_menu',999);
244
245 $plugin_post_types = new Wpstream_Product();
246 $this->loader->add_action( 'init', $plugin_post_types, 'create_custom_post_type', 999 );
247
248 // save and render metaboxed
249 $this->loader->add_action( 'add_meta_boxes', $plugin_admin, 'add_wpstream_product_metaboxes' );
250 $this->loader->add_action( 'save_post', $plugin_admin, 'wpstream_free_product_update_post',1,2 );
251 $this->loader->add_action( 'publish_wpstream_product', $plugin_admin, 'wpstream_publish_wpstream_product',1,2 );
252
253
254
255 // make product virtual
256 $this->loader->add_action( 'save_post', $plugin_admin, 'wpstream_make_product_virtual', 99999, 2 );
257
258
259
260 // show streaming controls on sidebar
261 $this->loader->add_action('add_meta_boxes', $plugin_admin, 'wpstream_startstreaming_sidebar_meta');
262
263 // on boarding actions
264 $this->loader->add_action('admin_footer',$plugin_admin, 'wpstream_admin_footer_onboarding');
265 $this->loader->add_action( 'wp_ajax_wpstream_on_board_create_channel', $plugin_admin,'wpstream_on_board_create_channel' );
266 $this->loader->add_action( 'wp_ajax_wpstream_on_board_create_channel_ppv', $plugin_admin,'wpstream_on_board_create_channel_ppv' );
267 $this->loader->add_action( 'wp_ajax_wpstream_on_board_create_free_vod', $plugin_admin,'wpstream_on_board_create_free_vod' );
268 $this->loader->add_action( 'wp_ajax_wpstream_on_board_create_ppv_vod', $plugin_admin,'wpstream_on_board_create_ppv_vod' );
269
270
271 $this->loader->add_action( 'wp_ajax_wpstream_on_board_login', $plugin_admin,'wpstream_on_board_login' );
272 $this->loader->add_action( 'wp_ajax_wpstream_on_board_register', $plugin_admin,'wpstream_on_board_register' );
273 $this->loader->add_action( 'wp_ajax_wpstream_get_captcha_challenge', $plugin_admin, 'wpstream_get_captcha_challenge' );
274 $this->loader->add_action( 'wp_ajax_nopriv_wpstream_get_captcha_challenge', $plugin_admin, 'wpstream_get_captcha_challenge' );
275
276 // Register AJAX actions for multipart uploads
277 $this->loader->add_action( 'wp_ajax_wpstream_initiate_multipart_upload', $plugin_admin, 'handle_initiate_multipart_upload' );
278 $this->loader->add_action( 'wp_ajax_wpstream_complete_multipart_upload', $plugin_admin, 'handle_complete_multipart_upload' );
279
280 $this->loader->add_action( 'admin_notices', $plugin_admin,'wpstream_admin_notice' );
281 $this->loader->add_action( 'admin_notices', $plugin_admin,'wpstream_plugin_update_available_notice' );
282
283 $this->loader->add_action( 'wp_ajax_wpstream_update_cache_notice', $plugin_admin,'wpstream_update_cache_notice' );
284 // $this->loader->add_action( 'wp_ajax_wpstream_get_videos_list', $plugin_admin,'wpstream_get_videos_list' );
285
286
287 $this->loader->add_action( 'wp_ajax_wpstream_settings_tab_update_plugin', $plugin_admin, 'wpstream_settings_tab_update_plugin' );
288
289 // add and save category extra fields
290 $this->loader->add_action( 'category_edit_form_fields', $plugin_post_types, 'wpstream_category_callback_function', 10, 2);
291 $this->loader->add_action( 'category_add_form_fields', $plugin_post_types, 'wpstream_category_callback_add_function' );
292 $this->loader->add_action( 'created_category', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
293 $this->loader->add_action( 'edited_category', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
294
295 $this->loader->add_action( 'product_cat_edit_form_fields', $plugin_post_types, 'wpstream_category_callback_function', 10, 2);
296 $this->loader->add_action( 'product_cat_add_form_fields', $plugin_post_types, 'wpstream_category_callback_add_function' );
297 $this->loader->add_action( 'created_product_cat', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
298 $this->loader->add_action( 'edited_product_cat', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
299
300
301 $this->loader->add_action( 'wpstream_category_edit_form_fields', $plugin_post_types, 'wpstream_category_callback_function', 10, 2);
302 $this->loader->add_action( 'wpstream_category_add_form_fields', $plugin_post_types, 'wpstream_category_callback_add_function' );
303 $this->loader->add_action( 'created_wpstream_category', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
304 $this->loader->add_action( 'edited_wpstream_category', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
305
306
307 $this->loader->add_action( 'wpstream_actors_edit_form_fields', $plugin_post_types, 'wpstream_category_callback_function', 10, 2);
308 $this->loader->add_action( 'wpstream_actors_add_form_fields', $plugin_post_types, 'wpstream_category_callback_add_function' );
309 $this->loader->add_action( 'created_wpstream_actors', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
310 $this->loader->add_action( 'edited_wpstream_actors', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
311
312 $this->loader->add_action( 'wpstream_movie_rating_edit_form_fields', $plugin_post_types, 'wpstream_category_callback_function', 10, 2);
313 $this->loader->add_action( 'wpstream_movie_rating_add_form_fields', $plugin_post_types, 'wpstream_category_callback_add_function' );
314 $this->loader->add_action( 'created_wpstream_movie_rating', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
315 $this->loader->add_action( 'edited_wpstream_movie_rating', $plugin_post_types, 'wpstream_category_save_extra_fields_callback', 10, 2);
316
317
318 if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
319
320 $this->loader->add_action( 'init', $plugin_admin, 'wpstream_add_custom_wc_products' );
321 $this->loader->add_filter( 'product_type_selector', $plugin_admin, 'wpstream_add_products' );
322 $this->loader->add_filter( 'woocommerce_product_class', $plugin_admin, 'wpstream_add_products_class', 10, 2 );
323 $this->loader->add_action( 'admin_footer', $plugin_admin, 'wpstream_products_custom_js' );
324 $this->loader->add_filter( 'woocommerce_product_data_tabs', $plugin_admin, 'wpstream_hide_attributes_data_panel',10,1 );
325 $this->loader->add_filter( 'woocommerce_is_purchasable', $plugin_admin, 'wpstream_hide_buy_now_subscription_mode',10,2);
326
327 $this->loader->add_filter( 'woocommerce_product_options_general_product_data',$plugin_admin, 'wpstream_add_custom_general_fields', 10,1);
328 $this->loader->add_filter( 'woocommerce_process_product_meta',$plugin_admin, 'wpstream_add_custom_general_fields_save',10,1 );
329 $this->loader->add_action( 'woocommerce_live_stream_add_to_cart', $plugin_admin, 'wpstream_add_to_cart',10,1);
330 $this->loader->add_action( 'woocommerce_video_on_demand_add_to_cart', $plugin_admin, 'wpstream_add_to_cart',10,1);
331 $this->loader->add_filter( 'woocommerce_loop_add_to_cart_link', $plugin_admin,'replacing_add_to_cart_button', 10, 2 );
332 }
333 }
334
335
336
337
338
339 /**
340 * Register all of the hooks related to the public-facing functionality
341 * of the plugin.
342 *
343 * @since 3.0.1
344 * @access private
345 */
346 private function define_public_hooks() {
347
348 $plugin_public = new Wpstream_Public( $this->get_plugin_name(), $this->get_version(), $this->main );
349
350 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
351 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
352
353 $this->loader->add_action( 'init', $plugin_public,'wpstream_my_custom_endpoints' );
354 $this->loader->add_filter( 'query_vars',$plugin_public, 'wpstream_my_custom_query_vars', 0 );
355
356 //live stream action
357 $this->loader->add_action('init',$plugin_public,'wpstream_set_cookies',0);
358 $this->loader->add_action('init',$plugin_public,'wpstream_live_streaming_key');
359 $this->loader->add_action('init',$plugin_public,'wpstream_live_streaming_key_for_3rdparty');
360 $this->loader->add_action('init',$plugin_public,'wpstream_live_streaming_key_vod',10);
361
362 // woo action
363 $this->loader->add_action( 'woocommerce_before_single_product', $plugin_public,'wpstream_non_image_content_wrapper_start', 20 );
364 $this->loader->add_action( 'woocommerce_after_single_product', $plugin_public,'wpstream_non_image_content_wrapper_end', 20 );
365 $this->loader->add_action( 'woocommerce_thankyou_order_received_text', $plugin_public,'wpstream_thankyou_extra', 20,2 );
366 $this->loader->add_action( 'woocommerce_email_order_details', $plugin_public,'wpstream_email_order_details', 20,4 );
367
368 $this->loader->add_filter( 'woocommerce_account_menu_items', $plugin_public,'wpstream_custom_my_account_menu_items' );
369 $this->loader->add_action( 'woocommerce_account_event-list_endpoint', $plugin_public,'wpstream_custom_endpoint_content_event_list' );
370 $this->loader->add_action( 'woocommerce_account_video-list_endpoint', $plugin_public,'wpstream_custom_endpoint_video_list' );
371
372 $this->loader->add_action( 'after_switch_theme', $plugin_public,'wpstream_custom_flush_rewrite_rules' );
373 $this->loader->add_action('init', $plugin_public,'wpstream_shortcodes');
374 $this->loader->add_action('vc_before_init', $plugin_public,'wpstream_bakery_shortcodes');
375
376 $this->loader->add_action('wo_before_api', 'wpstream_cors_check_and_response',10,1);
377
378 $this->loader->add_filter( 'wpstream_search_template_item_post_type', $plugin_public, 'wpstream_search_template_add_item_post_type' );
379 $this->loader->add_filter( 'wpstream_sidebar_id_by_post_type', $plugin_public, 'wpstream_sidebar_id_by_post_type' );
380 $this->loader->add_filter( 'wpstream_header_search_values', $plugin_public, 'wpstream_header_search_values' );
381 $this->loader->add_filter( 'wpstream_extend_category_archive_query_filter', $plugin_public, 'wpstream_extend_category_archive_query_filter_callback' );
382 $this->loader->add_filter( 'wpstream_archives_lists_taxonomy_labels', $plugin_public, 'wpstream_archives_lists_taxonomy_labels_callback' );
383 $this->loader->add_filter( 'wpstream_author_archive_list_taxonomy_labels', $plugin_public, 'wpstream_author_archive_list_taxonomy_labels_callback' );
384 $this->loader->add_action( 'wpstream_vod_attached_to_channel', $plugin_public, 'wpstream_vod_attached_to_channel' );
385 $this->loader->add_action( 'wpstream_additional_content_post_type', $plugin_public, 'wpstream_additional_content_post_type_callback' );
386 $this->loader->add_action( 'wpstream_post_author_content_post_type_list', $plugin_public, 'wpstream_post_author_content_post_type_list_callback' );
387 $this->loader->add_action( 'wpstream_author_content_simple_post_type_message', $plugin_public, 'wpstream_author_content_simple_post_type_message_callback', 10, 2 );
388 $this->loader->add_action( 'wpstream_author_content_post_type_message', $plugin_public, 'wpstream_author_content_post_type_message_callback', 10, 2 );
389 $this->loader->add_action( 'wpstream_show_sidebar_for_post_type', $plugin_public, 'wpstream_show_sidebar_for_post_type_callback', 10, 2 );
390 $this->loader->add_action( 'wpstream_video_episodes_post_type', $plugin_public, 'wpstream_video_episodes_post_type_callback' );
391 $this->loader->add_action( 'wpstream_video_past_broadcast_post_type', $plugin_public, 'wpstream_video_past_broadcast_post_type_callback' );
392 $this->loader->add_action( 'wpstream_additional_content_post_type_label', $plugin_public, 'wpstream_additional_content_post_type_label_callback', 10, 2 );
393 }
394
395 /**
396 * Run the loader to execute all of the hooks with WordPress.
397 *
398 * @since 3.0.1
399 */
400 public function run() {
401 $this->loader->run();
402 }
403
404 /**
405 * The name of the plugin used to uniquely identify it within the context of
406 * WordPress and to define internationalization functionality.
407 *
408 * @since 3.0.1
409 * @return string The name of the plugin.
410 */
411 public function get_plugin_name() {
412 return $this->plugin_name;
413 }
414
415 /**
416 * The reference to the class that orchestrates the hooks with the plugin.
417 *
418 * @since 3.0.1
419 * @return Wpstream_Loader Orchestrates the hooks of the plugin.
420 */
421 public function get_loader() {
422 return $this->loader;
423 }
424
425 /**
426 * Retrieve the version number of the plugin.
427 *
428 * @since 3.0.1
429 * @return string The version number of the plugin.
430 */
431 public function get_version() {
432 return $this->version;
433 }
434
435 public function is_plugin_outdated(){
436 $update_data = get_site_transient('update_plugins');
437 $plugin_path = 'wpstream/wpstream.php';
438
439 if (isset($update_data->response[$plugin_path])) {
440 return true;
441 }
442
443 return false;
444 }
445
446
447
448 public function show_user_data($pack_details){
449 if( isset($pack_details['available_data_mb']) && isset( $pack_details['available_storage_mb']) ){
450 $wpstream_convert_band = $this->wpstream_convert_band($pack_details['available_data_mb']);
451 if( $wpstream_convert_band < 0 ) {
452 $wpstream_convert_band = 0;
453 }
454
455 $wpstream_convert_storage = $this->wpstream_convert_band($pack_details['available_storage_mb']);
456 if( $wpstream_convert_storage < 0 ) {
457 $wpstream_convert_storage = 0;
458 }
459
460 print '<div class="pack_details_wrapper">'
461 . '<strong>' . __('Your account information: ', 'wpstream') . '</strong> '
462 . __('You have ', 'wpstream') . '<strong id="wpstream_available_data">' . abs( $wpstream_convert_band ) . ' GB</strong> '
463 . __('available cloud data and ', 'wpstream')
464 . '<strong id="wpstream_available_storage">' . abs( $wpstream_convert_storage ) . ' GB</strong> '
465 . __('available cloud storage', 'wpstream') . '.';
466
467 print '<a href="https://wpstream.net/pricing/" class="wpstream_upgrade_topbar" target="_blank">'.esc_html__('Upgrade Plan','wpstream').'</a>';
468 print '</div>';
469 print'<input type="hidden" id="wpstream_band" value="'.$pack_details['available_data_mb'].'">';
470 print'<input type="hidden" id="wpstream_storage" value="'.$pack_details['available_storage_mb'].'">';
471
472 }
473 }
474
475
476 /**
477 * help function for media list elementor widget
478 *
479 * @since 3.0.1
480 * @return string
481 */
482
483 public function wpstream_media_list_elementor_function($attributes, $content = null){
484
485
486 $media_number=3;
487 if ( isset($attributes['media_number']) ){
488 $media_number=$attributes['media_number'];
489 }
490
491
492 $row_number=3;
493 if ( isset($attributes['row_number']) ){
494 $row_number=$attributes['row_number'];
495 }
496 if($row_number>4){
497 $row_number=4;
498 }
499
500
501 ob_start();
502
503 // check if is vod or live stream
504 $meta_query = array();
505 $tax_query_array= array();
506 $tax_query = array();
507
508 // check if the media is paid or free
509 $event_types = array();
510 $product_type_free_paid = 0;
511 if ( isset($attributes['product_type_free_paid']) ){
512 $product_type_free_paid=$attributes['product_type_free_paid'];
513
514 if($product_type_free_paid==0){
515 $event_types=array('wpstream_product');
516
517 if ( isset($attributes['product_type']) && intval($attributes['product_type'])==2){
518 $event_types=array('wpstream_product_vod');
519 }
520
521 }else{
522 $event_types=array('product');
523 if ( isset($attributes['product_type']) ){
524 $product_type = $attributes['product_type'];
525 $product_type_slug = 'video_on_demand';
526 if($product_type==1){
527 $product_type_slug ='live_stream';
528 }
529
530 $tax_query_array = array(
531 'taxonomy' => 'product_type',
532 'field' => 'slug',
533 'terms' => $product_type_slug
534 );
535
536 $tax_query= array(
537 'relation' => 'AND',
538 $tax_query_array
539 );
540
541 }
542 }
543
544 }
545 $see_product='';
546 if(isset($attributes['free_label'])){
547 $see_product=$attributes['free_label'];
548 }
549
550 // pagination
551 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
552 if( is_front_page() ){
553 $paged= (get_query_var('page')) ? get_query_var('page') : 1;
554 }
555
556
557 //order
558 $orderby='ID';
559 $order ='ASC';
560 if ( isset($attributes['order_by']) ){
561 $order_by=intval($attributes['order_by']);
562 switch ($order_by) {
563 case 0:
564 $orderby='ID';
565 $order ='ASC';
566 break;
567 case 1:
568 $orderby='ID';
569 $order ='DESC';
570 break;
571 case 2:
572 $orderby='title';
573 $order ='ASC';
574 break;
575 case 3:
576 $orderby='title';
577 $order ='DESC';
578 break;
579 }
580 }
581
582 // building wp_query arg array
583 $args = array(
584 'post_type' => $event_types,
585 'post_status' => 'publish',
586 'meta_query' => $meta_query,
587 'posts_per_page' => $media_number,
588 'paged' => $paged,
589 'orderby' => $orderby,
590 'order' => $order,
591 'tax_query' => $tax_query
592 );
593
594
595
596 // show live events
597 if ( isset($attributes['product_show_live']) && $attributes['product_show_live']=='yes'){
598 $live_event_for_user = $this->main->wpstream_live_connection->api20_wpstream_request_live_stream_for_user_for_shortcode('shortcode');
599
600
601 if( is_array($live_event_for_user) ){
602 $live_event_for_user[]=0;
603
604 $args['post__in']=$live_event_for_user;
605 }
606 }
607
608
609
610
611 $media_list= new WP_Query($args);
612 if($media_list->have_posts()){
613 print '<ul class="wpstream_media_list_wrapper products columns-'.esc_attr($row_number).'" >';
614 while($media_list->have_posts()):$media_list->the_post();
615 if($product_type_free_paid==0 ){
616
617 $thumb=wp_get_attachment_image_src(get_post_thumbnail_id(),'medium');
618
619 $thumb_src='';
620 if( isset($thumb[0]) ){
621 $thumb_src=$thumb[0];
622 }
623
624 if(($thumb_src)==''){
625 $thumb_src= plugin_dir_url( dirname( __FILE__ ) ). 'img/default_300.png';
626 }
627 print '<li class="wpstream_product_unit">'
628 .'<a href="'.get_permalink().'" class="product_title" ><div class="product_image" style="background-image:url('.esc_url($thumb_src).')"></div></a>'
629 .'<a href="'.get_permalink().'" class="product_title" >'.get_the_title().'</a>';
630
631 if($see_product!=''){
632 print '<a href="'.get_permalink().'"class="see_product">'.$see_product.'</a>';
633 }
634 print '</li>';
635 }else{
636 wc_get_template_part( 'content', 'product' );
637 }
638 endwhile;
639 print '</ul>';
640 }else{
641 print esc_html__('No media found! ','wpstream');
642 }
643
644
645 wp_reset_query();
646 wp_reset_postdata();
647
648 $this->wpstream_pagination($media_list->max_num_pages,$range=2);
649 $return_string= ob_get_contents();
650 ob_end_clean();
651
652 return $return_string;
653 }
654
655
656
657
658
659
660 /*
661 *
662 *
663 * Pagination for media lista
664 *
665 *
666 *
667 */
668
669
670
671
672 function wpstream_pagination($pages = '', $range = 2){
673
674 $showitems = ($range * 2)+1;
675 global $paged;
676 if(empty($paged)) $paged = 1;
677
678
679 if($pages == ''){
680 global $wp_query;
681 $pages = $wp_query->max_num_pages;
682 if(!$pages)
683 {
684 $pages = 1;
685 }
686 }
687
688 if(1 != $pages){
689 print '<ul class="wpstream_pagination ">';
690 print '<li class="roundleft"><a href="'.get_pagenum_link($paged - 1).'"> < </a></li>';
691
692 for ($i=1; $i <= $pages; $i++)
693 {
694 if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
695 {
696 if ($paged == $i){
697 print '<li class="active"><a href="'.esc_url(get_pagenum_link($i)).'" >'.$i.'</a><li>';
698 }else{
699 print '<li><a href="'.esc_url(get_pagenum_link($i)).'" >'.$i.'</a><li>';
700 }
701 }
702 }
703
704 $prev_page= get_pagenum_link($paged + 1);
705 if ( ($paged +1) > $pages){
706 $prev_page= get_pagenum_link($paged );
707 }else{
708 $prev_page= get_pagenum_link($paged + 1);
709 }
710
711
712 print '<li class="roundright"><a href="'.$prev_page.'"> > </a><li>';
713 print '</ul>';
714 }
715 }
716
717
718
719
720
721
722
723
724
725
726
727
728
729 /**
730 * help function for player elementr widget
731 *
732 * @since 3.0.1
733 * @return string
734 */
735
736 public function wpstream_insert_player_elementor($attributes, $content = null){
737 $product_id = '';
738 $return_string = '';
739 $attributes = shortcode_atts(
740 array(
741 'id' => 0,
742 'user_id' => 0,
743 ), $attributes) ;
744
745
746 if ( isset($attributes['id']) ){
747 $product_id=$attributes['id'];
748 }
749 if ( isset($attributes['user_id']) ){
750 $user_id = intval( $attributes['user_id'] );
751 }
752
753 if(intval($product_id)==0 && $user_id!=0 ){
754 $product_id= $this->wpstream_player_retrive_first_id($user_id);
755 }
756
757
758
759
760 ob_start();
761 ?>
762 <div class="wpstream_insert_player_elementor_wrapper">
763 <?php
764 $this->main->wpstream_player->wpstream_video_player_shortcode($product_id);
765 ?>
766 </div>
767 <?php
768 $return_string= ob_get_contents();
769 ob_end_clean();
770
771 return $return_string;
772 }
773
774 /**
775 * help function for player low latency elementor widget
776 *
777 * @since 3.0.1
778 * @return string
779 */
780
781 public function wpstream_insert_player__low_latency_elementor($attributes, $content = null){
782 $product_id = '';
783 $return_string = '';
784 $attributes = shortcode_atts(
785 array(
786 'id' => 0,
787 'user_id' => 0,
788 ), $attributes) ;
789
790
791 if ( isset($attributes['id']) ){
792 $product_id=$attributes['id'];
793 }
794
795 if ( isset($attributes['user_id']) ){
796 $user_id = intval( $attributes['user_id'] );
797 }
798
799 if(intval($product_id)==0 && $user_id!=0){
800 $product_id= $this->wpstream_player_retrive_first_id($user_id);
801 }
802
803
804 ob_start();
805 $this->main->wpstream_player->wpstream_video_player_shortcode_low_latency($product_id);
806 $return_string= ob_get_contents();
807 ob_end_clean();
808
809 return $return_string;
810 }
811
812
813
814 public function wpstream_player_retrive_first_id($received_user_id=''){
815 $channel_type = get_option ('wpstream_user_streaming_channel_type');
816 $product_id = $this->wpstream_get_current_event_per_author($received_user_id,$channel_type);
817 return $product_id;
818 }
819
820
821
822 /**
823 * help function for chat elementor widget
824 *
825 * @since 3.0.1
826 * @return string
827 */
828
829 public function wpstream_insert_chat_elementor($attributes, $content = null){
830 $product_id = '';
831 $return_string = '';
832 $attributes = shortcode_atts(
833 array(
834 'id' => 0,
835 ), $attributes) ;
836
837
838 if ( isset($attributes['id']) ){
839 $product_id=$attributes['id'];
840 }
841
842 $return_string.= '<div class="wpstream_plugin_chat_wrapper">';
843 ob_start();
844 $this->main->wpstream_player->wpstream_chat_wrapper($product_id);
845 $return_string.= ob_get_contents();
846 ob_end_clean();
847 $return_string.='</div>';
848 $this->main->wpstream_player->wpstream_connect_to_chat($product_id);
849
850 return $return_string;
851 }
852
853
854 /**
855 * edited 4.0
856 *
857 * Check if user is allowed to stream
858 *
859 * @since 3.7
860 */
861
862 public function wpstream_check_user_can_stream(){
863 $current_user = wp_get_current_user();
864
865 if( !is_user_logged_in() ){
866 return false;
867 exit('user not logged in');
868 }
869
870 if(current_user_can('administrator')){
871 // admins can always brodcast
872 return true;
873 }
874
875 $extra_roles = get_option( 'wpstream_stream_role', true );
876 $user_role = '';
877 if( is_array( $current_user->roles) && count( $current_user->roles ) > 0 ){
878 $user_role = $current_user->roles[0];
879 }
880
881 if ( is_array($extra_roles) && in_array( $user_role, $extra_roles ) ) {
882 return true;
883 }
884
885 if(function_exists('wpstream_get_option') && intval(wpstream_get_option('allow_streaming_regular_users',''))==1 ){
886 return true;
887 }
888
889 return false;
890 }
891
892
893 /**
894 * Start Streaming wrapper
895 *
896 * @since 3.7
897 */
898
899 public function wpstream_live_stream_unit_wrapper($item_id,$type){
900 $item_id = intval($item_id);
901
902 if($item_id == 0){
903 //retrive or create channel for front end streamers
904 $item_id=$this->wpstream_retrive_front_end_channel();
905 }
906 print'<div class="wpstream_modal_background"></div>';
907 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er2</div>
908 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
909 </div>';
910 $this->admin->wpstream_live_stream_unit( $item_id,$type );
911 }
912
913
914 /**
915 * Start Streaming wrapper for wpstream theme
916 *
917 * @since 3.7
918 */
919
920 public function wpstream_live_stream_unit_wrapper_for_theme($item_id,$type){
921 $item_id = intval($item_id);
922
923 if($item_id == 0){
924 //retrive or create channel for front end streamers
925 $item_id=$this->wpstream_retrive_front_end_channel();
926 }
927 print'<div class="wpstream_modal_background"></div>';
928 print '<div class="wpstream_error_modal_notification"><div class="wpstream_error_content">er2</div>
929 <div class="wpstream_error_ok wpstream_button" type="button">'.esc_html__('Close','wpstream').'</div>
930 </div>';
931 $this->admin->wpstream_live_stream_unit_for_theme( $item_id,$type );
932 }
933
934
935 /**
936 * retrive channel for front end streaming
937 *
938 * @since 3.7
939 */
940 public function wpstream_retrive_front_end_channel(){
941
942 $current_user = wp_get_current_user();
943 $channel_type = get_option ('wpstream_user_streaming_channel_type');
944 $channel_price = floatval( get_option ('wpstream_user_streaming_default_price') );
945
946 $front_end_streamin_channel = $this->wpstream_get_current_event_per_author($current_user->ID,$channel_type);
947
948 if(intval($front_end_streamin_channel) == 0){
949 $front_end_streamin_channel= $this->wpstrea_create_front_end_event($current_user->ID,$current_user->user_login ,$channel_type,$channel_price);
950 }
951 return $front_end_streamin_channel;
952
953 }
954
955 /**
956 * create the event from front end
957 *
958 * @since 3.7
959 */
960
961 public function wpstrea_create_front_end_event($userID,$userLogin,$channel_type,$channel_price){
962
963 if( !$this->wpstream_check_user_can_stream() ){
964 return;
965 }
966
967 $post_type='wpstream_product';
968 if($channel_type=='paid'){
969 $post_type='product';
970 }
971
972 $post = array(
973 'post_title' => sprintf( esc_html__('%s Channel','wpstream'),$userLogin),
974 'post_content' => '',
975 'post_type' => $post_type ,
976 'post_author' => $userID,
977 'post_status' => 'publish',
978 );
979 $post_id = wp_insert_post($post );
980 if($channel_type=='paid'){
981 $product = wc_get_product($post_id);
982 $price = wc_format_decimal($channel_price);
983
984 $product = wc_get_product( $post_id );
985 // Set the product active price (regular)
986 $product->set_price( $price );
987 $product->set_regular_price( $price ); // To be sure
988 $product->save();
989 update_post_meta ($post_id,'event_passed',0);
990 wp_set_object_terms( $post_id, 'live_stream', 'product_type' );
991 }
992 update_post_meta($post_id,'wpstream_product_type',1);
993
994 return $post_id;
995 }
996
997
998 public function wpstream_get_current_event_per_author($userID,$channel_type){
999
1000 $post_type='wpstream_product';
1001 if($channel_type=='paid'){
1002 $post_type='product';
1003 }
1004
1005 $args = array(
1006
1007 'post_type' => $post_type,
1008 'author' => $userID,
1009 'posts_per_page' => 1,
1010 'fields' => 'ids'
1011 )
1012 ;
1013 $author_posts = new WP_Query( $args );
1014 if( $author_posts->have_posts() ) {
1015 $author_posts->the_post();
1016 $the_id= get_the_ID();
1017 }else{
1018 $the_id= 0;
1019 }
1020
1021 wp_reset_query();
1022 wp_reset_postdata();
1023 return $the_id;
1024 }
1025
1026 /**
1027 * Cleanup old logs
1028 */
1029 public function cleanup_logs() {
1030 $logger = new WPStream_Logger();
1031 $logger->clear_old_logs();
1032 }
1033 }
1034