Advertisement
arie_cristianD

override_class_player

Aug 9th, 2023
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.07 KB | None | 0 0
  1. <?php
  2. /**
  3.  * @author Jegtheme
  4.  */
  5.  
  6. namespace JNEWS_PODCAST\Player;
  7.  
  8. /**
  9.  * Class Player
  10.  *
  11.  * @package JNEWS_PODCAST\Player
  12.  */
  13. class Player {
  14.  
  15.     /**
  16.      * Instance of Player
  17.      *
  18.      * @var Player
  19.      */
  20.     private static $instance;
  21.  
  22.     protected $shortcode = array(
  23.         'player' => 'jeg_player',
  24.         'track'  => 'jeg_player_track',
  25.     );
  26.  
  27.     protected $total = 0;
  28.  
  29.     protected $types = array(
  30.         'audio',
  31.     );
  32.  
  33.     protected $type;
  34.  
  35.     /**
  36.      * Player constructor.
  37.      */
  38.     private function __construct() {
  39.         add_action( 'template_redirect', array( $this, 'render_player' ) );
  40.         add_action( 'jnews_share_top_bar', array( $this, 'render_player_in_post' ), 99 );
  41.         do_action( 'jnews_render_element', $this->shortcode['player'], array( $this, 'player_shortcode' ) );
  42.         do_action( 'jnews_render_element', $this->shortcode['track'], array( $this, 'player_track_shortcode' ) );
  43.         add_filter( 'wp_print_styles', array( $this, 'add_single_episode_to_playlist' ) );
  44.     }
  45.  
  46.     /**
  47.      * Singleton page of Player class
  48.      *
  49.      * @return Player
  50.      */
  51.     public static function get_instance() {
  52.         if ( null === static::$instance ) {
  53.             static::$instance = new static();
  54.         }
  55.  
  56.         return static::$instance;
  57.     }
  58.  
  59.     /**
  60.      * Callback for [jeg_player] shortcode
  61.      *
  62.      * @param array  $atts
  63.      * @param string $content
  64.      *
  65.      * @return string
  66.      */
  67.     public function player_shortcode( $atts = array(), $content = '' ) {
  68.         $html = '';
  69.         if ( defined( 'JNEWS_THEME_URL' ) ) {
  70.             static $instance = 0;
  71.             $instance ++;
  72.             wp_enqueue_script( 'jnews-jplayer', JNEWS_PODCAST_URL . '/assets/js/jplayer/jquery.jplayer.js', array( 'jquery' ), JNEWS_PODCAST_VERSION, true );
  73.             wp_enqueue_script( 'jnews-jplayer-playlist', JNEWS_PODCAST_URL . '/assets/js/jnews.playlist.js', array( 'jquery' ), JNEWS_PODCAST_VERSION, true );
  74.             wp_enqueue_style( 'font-awesome', JNEWS_THEME_URL . '/assets/css/font-awesome.min.css', null, jnews_get_theme_version() );
  75.             $cover_item         = '<div class="jeg_player_current_item__cover"></div>';
  76.             $item_title_wrapper = '<div class="jeg_player_current_item__title_wrapper">
  77.                                        <div class="jeg_player_current_item__title jeg_post_title"><span>-</span></div>
  78.                                    </div>';
  79.             $jeg_player_bar     = '<div class="jeg_player_bar">
  80.                                         <div class="jeg_player_bar__current_time"><span>00:00</span></div>
  81.                                         <div class="jeg_progress_bar">
  82.                                             <div class="jeg_progress_bar__seek">
  83.                                                 <div class="jeg_progress_bar__play"><div tabindex="-1" class="jeg_progress_bar__ball"></div></div>
  84.                                             </div>
  85.                                         </div>
  86.                                         <div class="jeg_player_bar__duration"><span>00:00</span></div>
  87.                                     </div>';
  88.             $jeg_playlist       = '<div class="jeg_playlist">
  89.                                         <ul class="jeg_playlist_inner">
  90.                                             <li></li>
  91.                                         </ul>
  92.                                     </div>';
  93.             $main_control       =
  94.                 '<a href="javascript:;" class="jeg_player_control__previous disabled" tabindex="1" title="' . jnews_return_translation( 'Previous', 'jnews-podcast', 'previous' ) . '"><i class="fa fa-fast-backward"></i></a>' .
  95.                 '<a href="javascript:;" class="jeg_player_control__play" tabindex="1" title="' . jnews_return_translation( 'Play', 'jnews-podcast', 'play' ) . '"><i class="fa fa-play"></i></a>' .
  96.                 '<a href="javascript:;" class="jeg_player_control__pause" tabindex="1" title="' . jnews_return_translation( 'Pause', 'jnews-podcast', 'pause' ) . '"><i class="fa fa-pause"></i></a>' .
  97.                 '<a href="javascript:;" class="jeg_player_control__next" tabindex="1" title="' . jnews_return_translation( 'Next', 'jnews-podcast', 'next' ) . '"><i class="fa fa-fast-forward"></i></a>';
  98.             $shuffle_btn        =
  99.                 '<a href="javascript:;" class="jeg_player_control__shuffle_off" tabindex="1" title="' . jnews_return_translation( 'Shuffle', 'jnews-podcast', 'shuffle' ) . '"><i class="fa fa-random"></i></a>' .
  100.                 '<a href="javascript:;" class="jeg_player_control__shuffle" tabindex="1" title="' . jnews_return_translation( 'Shuffle', 'jnews-podcast', 'shuffle' ) . '"><i class="fa fa-random"></i></a>';
  101.             $repeat_btn         =
  102.                 '<a href="javascript:;" class="jeg_player_control__repeat_off" tabindex="1" title="' . jnews_return_translation( 'Repeat', 'jnews-podcast', 'repeat' ) . '"><i class="fa fa-repeat"></i></a>' .
  103.                 '<a href="javascript:;" class="jeg_player_control__repeat" tabindex="1" title="' . jnews_return_translation( 'Repeat', 'jnews-podcast', 'repeat' ) . '"><i class="fa fa-repeat"></i></a>';
  104.  
  105.             // Get Track
  106.             $track = '';
  107.             if ( ! empty( $content ) ) {
  108.                 $content = wp_strip_all_tags( nl2br( do_shortcode( $content ) ) );
  109.  
  110.                 // Replace last comma
  111.                 if ( false !== ( $pos = strrpos( $content, ',' ) ) ) {
  112.                     $content = substr_replace( $content, '', $pos, 1 );
  113.                 }
  114.                 $track  = '<script class="jnews_player_playlist_script" type="application/json">';
  115.                 $track .= $content;
  116.                 $track .= '</script>';
  117.             }
  118.  
  119.             $html = '
  120.             <div class="jeg_player audio_player style_' . $instance . '">
  121.                 <div class="jeg_player_wrapper">
  122.                     <div id="jeg-player-' . $instance . '" class="jeg_jplayer"></div>
  123.                     <div id="jeg-player-container-' . $instance . '" class="jeg_audio">
  124.                         <div class="jeg_player_inner">
  125.                             <div class="jeg_player_controls_wrap">
  126.                                 <div class="jeg_control_bar_left">
  127.                                     <!-- player-control -->
  128.                                     <div class="jeg_player_control">
  129.                                         ' . $main_control . '
  130.                                     </div>
  131.                                 </div>
  132.                                 <div class="jeg_control_bar_center">
  133.                                     <div class="jeg_player_current_item">
  134.                                         ' . $cover_item . '
  135.                                         <!-- player-progress -->
  136.                                         <div class="jeg_player_current_item__content">
  137.                                            ' . $item_title_wrapper . $jeg_player_bar . '
  138.                                         </div>
  139.                                     </div>
  140.                                 </div>
  141.                                 <div class="jeg_control_bar_toggle_player">
  142.                                     <a href="javascript:;" class="jeg_player_control__toggle_player" tabindex="1" title="' . jnews_return_translation( 'Toggle Player', 'jnews-podcast', 'toggle_player' ) . '"><i class="fa fa-angle-up"></i></a>
  143.                                 </div>
  144.                                 <div class="jeg_control_bar_right">
  145.                                     <!-- control-last -->
  146.                                     <div class="jeg_player_control last">
  147.                                             ' . $shuffle_btn . $repeat_btn . '
  148.                                             <a href="javascript:;" class="jeg_player_control__playlist_toggle" tabindex="1" title="' . jnews_return_translation( 'Toggle PlayList', 'jnews-podcast', 'toggle_playList' ) . '">
  149.                                                 <i class="fa fa-list-ul"></i>
  150.                                                 <div class="jeg_player_control__playlist">
  151.                                                     <span class="jeg_player_control__close_player">
  152.                                                         <i class="fa fa-angle-down"></i>
  153.                                                     </span>
  154.                                                     <div class="jeg_block_heading">
  155.                                                         <h3 class="jeg_block_title">
  156.                                                             <span>' . jnews_return_translation( 'Queue', 'jnews-podcast', 'queue' ) . '</span>
  157.                                                         </h3>
  158.                                                     </div>
  159.                                                     <ul class="jeg_player_control__playlist_inner">
  160.                                                         <li></li>
  161.                                                     </ul>
  162.                                                 </div>
  163.                                             </a>
  164.                                             <div class="jeg_player_bar__volume_icon">
  165.                                                 <a href="javascript:;" class="jeg_player_control__mute" tabindex="1" title="' . jnews_return_translation( 'Mute', 'jnews-podcast', 'mute' ) . '"><i class="fa fa-volume-up"></i></a>
  166.                                                 <a href="javascript:;" class="jeg_player_control__unmute" tabindex="1" title="' . jnews_return_translation( 'Unmute', 'jnews-podcast', 'unmute' ) . '"><i class="fa fa-volume-off"></i></a>
  167.                                             </div>
  168.                                     </div>
  169.                                     <div class="jeg_player_bar volume">
  170.                                         <div class="jeg_volume_bar_wrapper">
  171.                                             <div title="' . jnews_return_translation( 'Volume', 'jnews-podcast', 'volume' ) . '" class="jeg_volume_bar">
  172.                                                 <div class="jeg_volume_bar__value"><div tabindex="-1" class="jeg_progress_bar__ball"></div></div>
  173.                                             </div>
  174.                                         </div>
  175.                                     </div>
  176.                                 </div>
  177.                             </div>
  178.                             ' . $jeg_playlist . '
  179.                             <div class="jeg_no_solution">
  180.                                 <span>Update Required</span>
  181.                                 <a href="http://get.adobe.com/flashplayer/" target="_blank">Flash plugin</a>
  182.                             </div>
  183.                         </div>
  184.                         <div class="jeg_mobile_player_wrapper">
  185.                             <span class="jeg_player_control__close_player" data-playeropen>
  186.                                 <i class="fa fa-angle-down"></i>
  187.                             </span>
  188.                             <div class="jeg_player_current_item_cover_container">
  189.                                 ' . $cover_item . '
  190.                             </div>
  191.                             ' . $item_title_wrapper . '
  192.                             <div class="jeg_player_bar_container">
  193.                                 ' . $jeg_player_bar . '
  194.                             </div>
  195.                             ' . $jeg_playlist . '
  196.                             <div class="jeg_player_control">
  197.                                 ' . $shuffle_btn . $main_control . $repeat_btn . '
  198.                             </div>
  199.                         </div>
  200.                     </div>
  201.                 </div>
  202.                 ' . $track . '
  203.             </div>';
  204.  
  205.         }
  206.  
  207.         return $html;
  208.     }
  209.  
  210.     /**
  211.      * @param array  $atts
  212.      * @param string $content
  213.      *
  214.      * @return string
  215.      */
  216.     public function player_track_shortcode( $atts = array(), $content = '' ) {
  217.         $atts = shortcode_atts(
  218.             array(
  219.                 'series'    => '',
  220.                 'thumbnail' => sprintf( '%s/wp-includes/images/media/%s.png', get_site_url(), 'audio' ),
  221.                 'title'     => '',
  222.                 'href'      => '',
  223.                 'src'       => '',
  224.             ),
  225.             $atts,
  226.             $this->shortcode['track']
  227.         );
  228.  
  229.         $data['series_name']    = sanitize_text_field( $atts['series'] );
  230.         $data['post_title']     = sanitize_text_field( $atts['title'] );
  231.         $data['post_thumbnail'] = esc_url( $atts['thumbnail'] );
  232.         $data['post_url']       = esc_url( $atts['href'] );
  233.         $data['upload']         = esc_url( $atts['src'] );
  234.  
  235.         return wp_json_encode( $data ) . ',';
  236.     }
  237.  
  238.     /**
  239.      *  Render Player
  240.      */
  241.     public function render_player() {
  242.         if ( jnews_podcast_option( 'podcast_enable_player', false ) && jnews_podcast_option( 'podcast_global_player', false ) ) {
  243.             add_action( 'wp_footer', array( $this, 'player' ) );
  244.             add_filter( 'body_class', array( $this, 'add_body_class' ) );
  245.         }
  246.     }
  247.  
  248.     /**
  249.      * @param $classes
  250.      *
  251.      * @return array
  252.      */
  253.     public function add_body_class( $classes ) {
  254.         $classes[] = 'jnews_global_player';
  255.  
  256.         return $classes;
  257.     }
  258.  
  259.     /**
  260.      * @param $post_id
  261.      */
  262.     public function render_player_in_post( $post_id ) {
  263.         $player      = '';
  264.         $result      = $this->is_single_episode();
  265.         $lock_player = false;
  266.         if ( function_exists( 'jpw_pages_list' ) ) {
  267.             $paywall_truncater = \JNews\Paywall\Truncater\Truncater::instance();
  268.             if ( $paywall_truncater->check_status() ) {
  269.                 $paywall_truncater->show_button( true );
  270.                 $lock_player = true;
  271.             }
  272.         }
  273.         if ( ! empty( $result ) && ! $lock_player && jnews_podcast_option( 'podcast_enable_player', false ) && ! jnews_podcast_option( 'podcast_global_player', false ) ) {
  274.             $data   = $this->get_episode_data( $post_id );
  275.             $track  = "[jeg_player_track series='{$data['series_name']}' thumbnail='{$data['post_thumbnail']}' title='{$data['post_title']}' href='{$data['post_url']}' src='{$data['episode_upload']}' ]";
  276.             $player = do_shortcode( '[jeg_player]' . $track . '[/jeg_player]' );
  277.         }else {
  278.             $data   = $this->get_episode_data( $add_your_post_id_here );
  279.             $track  = "[jeg_player_track series='{$data['series_name']}' thumbnail='{$data['post_thumbnail']}' title='{$data['post_title']}' href='{$data['post_url']}' src='{$data['episode_upload']}' ]";
  280.             $player = do_shortcode( '[jeg_player]' . $track . '[/jeg_player]' );
  281.         }
  282.  
  283.         if ( ! empty( $result ) && ! $lock_player && jnews_podcast_option( 'podcast_enable_player', false ) && jnews_podcast_option( 'podcast_global_player', false ) ) {
  284.             $player = jnews_podcast_add_media_menu( $post_id, 'single_episode', 'plus' );
  285.         }else {
  286.             $player = jnews_podcast_add_media_menu( $add_your_post_id_here, 'single_episode', 'plus' );
  287.         }
  288.  
  289.         echo jnews_sanitize_output( $player );
  290.     }
  291.  
  292.     /**
  293.      * @return array|bool
  294.      */
  295.     public function is_single_episode() {
  296.         $result = false;
  297.  
  298.         if ( is_singular( 'post' ) ) {
  299.             $post_id = get_the_ID();
  300.             $args    = array(
  301.                 'post_id' => $post_id,
  302.             );
  303.             $result  = $this->set_player_data( $args );
  304.         }
  305.  
  306.         return $result;
  307.     }
  308.  
  309.     /**
  310.      * Set Player Data
  311.      *
  312.      * @param array $data
  313.      *
  314.      * @return array
  315.      */
  316.     public function set_player_data( $data ) {
  317.         $multiple_data = false;
  318.         $result        = array();
  319.         if ( is_array( $data ) ) {
  320.             if ( ! isset( $data['post_id'] ) ) {
  321.                 $multiple_data = true;
  322.             }
  323.             if ( $multiple_data ) {
  324.                 foreach ( $data as $key => $value ) {
  325.                     if ( isset( $value['post_id'] ) ) {
  326.                         $episode_data = $this->get_episode_data( $value['post_id'] );
  327.                         if ( ! empty( $episode_data ) ) {
  328.                             $result[] = array(
  329.                                 'series_name'    => $episode_data['series_name'],
  330.                                 'post_thumbnail' => $episode_data['post_thumbnail'],
  331.                                 'post_title'     => $episode_data['post_title'],
  332.                                 'post_url'       => $episode_data['post_url'],
  333.                                 'upload'         => $episode_data['episode_upload'],
  334.                                 'post_type'      => $episode_data['post_type'],
  335.                             );
  336.                         }
  337.                     }
  338.                 }
  339.             } else {
  340.                 $episode_data = $this->get_episode_data( $data['post_id'] );
  341.                 if ( ! empty( $episode_data ) ) {
  342.                     $result = array(
  343.                         'series_name'    => $episode_data['series_name'],
  344.                         'post_thumbnail' => $episode_data['post_thumbnail'],
  345.                         'post_title'     => $episode_data['post_title'],
  346.                         'post_url'       => $episode_data['post_url'],
  347.                         'upload'         => $episode_data['episode_upload'],
  348.                         'post_type'      => $episode_data['post_type'],
  349.                     );
  350.                 }
  351.             }
  352.         }
  353.  
  354.         return $result;
  355.     }
  356.  
  357.     /**
  358.      * Get episode data
  359.      *
  360.      * @param $post_id
  361.      *
  362.      * @return array
  363.      */
  364.     public function get_episode_data( $post_id ) {
  365.         $data                 = array();
  366.         $jnews_podcast_option = get_post_meta( $post_id, 'jnews_podcast_option', true );
  367.         $enable               = ( isset( $jnews_podcast_option['enable_podcast'] ) && '1' === $jnews_podcast_option['enable_podcast'] );
  368.         $upload               = isset( $jnews_podcast_option['upload'] ) && ! empty( $jnews_podcast_option['upload'] ) ? $jnews_podcast_option['upload'] : '';
  369.         if ( $enable && ! empty( $upload ) ) {
  370.             $series = wp_get_post_terms( $post_id, 'jnews-series' );
  371.             $series = is_wp_error( $series ) ? '' : $series;
  372.             $series = is_array( $series ) ? ( ! empty( $series ) ? $series[0] : $series ) : $series;
  373.             if ( has_post_thumbnail( $post_id ) ) {
  374.                 $image = get_the_post_thumbnail_url( $post_id, 'jnews-75x75' );
  375.             } else {
  376.                 $image = sprintf( '%s/wp-includes/images/media/%s.png', get_site_url(), 'audio' );
  377.                 if ( ! empty( $series ) ) {
  378.                     $attribute = jnews_podcast_attribute( $series->term_id, array( 'fields' => array( 'image' ) ) );
  379.                     if ( $attribute['image'] ) {
  380.                         $image = wp_get_attachment_image_url( $attribute['image'], 'post-thumbnail' );
  381.                     }
  382.                 }
  383.             }
  384.             if ( ! empty( $series ) ) {
  385.                 $data = array(
  386.                     'series_name'    => $series->name,
  387.                     'post_thumbnail' => $image,
  388.                     'post_title'     => get_the_title( $post_id ),
  389.                     'post_url'       => get_post_permalink( $post_id ),
  390.                     'episode_upload' => $upload,
  391.                     'post_type'      => get_post_type( $post_id ),
  392.                 );
  393.                 if ( function_exists( 'jpw_pages_list' ) ) {
  394.                     $paywall_truncater = \JNews\Paywall\Truncater\Truncater::instance();
  395.                     if ( $paywall_truncater->check_status( $post_id ) ) {
  396.                         $data['episode_upload'] = '';
  397.                     }
  398.                 }
  399.             }
  400.         }
  401.  
  402.         return $data;
  403.     }
  404.  
  405.     /**
  406.      * Player Template
  407.      */
  408.     public function player() {
  409.         jnews_podcast_get_template_part( 'include/fragment/player/player' );
  410.     }
  411.  
  412.     /**
  413.      * add single to playlist
  414.      */
  415.     public function add_single_episode_to_playlist() {
  416.         $result = $this->is_single_episode();
  417.         if ( ! empty( $result ) ) {
  418.             wp_localize_script( 'jnews-podcast', 'single_podcast_data', $result );
  419.         }
  420.     }
  421. }
  422.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement