youtube_image = 'https://i3.ytimg.com/vi/';
$this->youtube_api = 'https://youtube.com/get_video_info';
$this->youtube_sample = 'https://www.youtube.com/watch?v=Xb9FXJy4SYU';
//file
if ( file_exists( trailingslashit( plugin_dir_path( __FILE__ ) ).'mona-youtube-api.php' ) )
require_once( trailingslashit( plugin_dir_path( __FILE__ ) ).'mona-youtube-api.php' );
if ( file_exists( trailingslashit( plugin_dir_path( __FILE__ ) ).'mona-youtube-downloader-widget.php' ) )
require_once( trailingslashit( plugin_dir_path( __FILE__ ) ).'mona-youtube-downloader-widget.php' );
//widget
add_action( 'widgets_init', array( $this, 'mona_create_widget' ) );
//shortcode
add_shortcode( 'mona_youtube_downloader', array( $this, 'mona_shortcode_downloader' ) );
// ajax action
add_action( 'wp_ajax_mona_youtube_downloader', array( $this, 'mona_ajax_youtube_downloader' ) );
add_action( 'wp_ajax_nopriv_mona_youtube_downloader', array( $this, 'mona_ajax_youtube_downloader' ) );
}
/**
* Widget
*/
function mona_create_widget(){
if ( class_exists( 'Mona_Youtube_Downloader_Widget' ) ){
register_widget('Mona_Youtube_Downloader_Widget');
}
}
/**
* Shortcode
*/
function mona_shortcode_downloader( $atts = array() ){
ob_start();
extract(
shortcode_atts(
array(
'text' => 'Get',
),
$atts,
'mona_youtube_downloader'
)
);
$this->mona_render_downloader( $text );
return ob_get_clean();
}
/**
* Functions
*/
function mona_get_youtube_video_type(){
return array( 'video/webm', 'video/mp4' );
}
function mona_get_youtube_audio_type(){
return array( 'audio/webm', 'audio/mp4' );
}
function mona_get_round_number( $number ){
$number = $number * 10;
if( (int) ( $number / 1000000000 ) > 0 ){
$number = (int) ( $number / 1000000000 );
$number = '~'.(double) ( $number / 10 ).'B';
}else
if( (int) ( $number / 1000000 ) > 0 ){
$number = (int) ( $number / 1000000 );
$number = '~'.(double) ( $number / 10 ).'M';
}else
if( (int) ( $number / 1000 ) > 0 ){
$number = (int) ( $number / 1000 );
$number = '~'.(double) ( $number / 10 ).'K';
}
return $number;
}
function mona_get_youtube_id( $link ){
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $id);
if(!empty($id)) {
return $id = $id[0];
}
return $link;
}
function mona_get_youtube_thumbnail( $data ){
return isset( $data['iurl'] ) ? $data['iurl'] : $this->mona_get_youtube_thumbnail_default($data['video_id']);
}
function mona_get_youtube_thumbnail_default( $id ){
return $this->youtube_image.$id.'/maxresdefault.jpg';
}
function mona_get_youtube_data( $link ){
$id = $this->mona_get_youtube_id( $link );
$response = Mona_Youtube_API::get($id, $this->youtube_api);
// HTTP Code
$response_code = @$response['response_code'];
if ($response_code != 200) {
$response_msg = @$response['response_msg'];
return array(
'return_flag' => false,
'data' => array(
'errorcode' => $response_code,
'reason' => $response_msg,
),
);
}
// Body
$data = @$response['body'];
parse_str($data , $details);
if (@$details['status'] == 'fail') {
return array(
'return_flag' => false,
'data' => $details,
);
}
$my_formats_array = explode(',' , $details['adaptive_fmts']);
$avail_formats[] = '';
$i = 0;
$ipbits = $ip = $itag = $sig = $quality_label = '';
$expire = time();
foreach ($my_formats_array as $format) {
parse_str($format);
$avail_formats[$i]['itag'] = $itag;
$avail_formats[$i]['quality'] = $quality_label;
$type = explode(';', $type);
$avail_formats[$i]['type'] = $type[0];
$avail_formats[$i]['url'] = urldecode($url) . '&signature=' . $sig;
parse_str(urldecode($url));
$avail_formats[$i]['expires'] = date("G:i:s T", $expire);
$avail_formats[$i]['ipbits'] = $ipbits;
$avail_formats[$i]['ip'] = $ip;
$i++;
}
return array(
'return_flag' => true,
'video_id' => $details['video_id'],
'author' => $details['author'],
'title' => $details['title'],
'iurl' => $this->mona_get_youtube_thumbnail( $details ),
'view' => $this->mona_get_round_number( (double) $details['view_count'] ),
'duration' => ( $details['length_seconds'] > 3600 ) ? gmdate( 'H:i:s', $details['length_seconds'] ) : gmdate( 'i:s', $details['length_seconds'] ),
'videos' => $avail_formats,
'details' => $details,
);
}
function mona_get_youtube_video_data( $url ){
$data_all = $this->mona_get_youtube_data( $url );
if( !@$data_all['return_flag'] ){
$error_code = @$data_all['data']['errorcode'];
$error_msg = @$data_all['data']['reason'];
return array(
'return_flag' => false,
'message' => sprintf(
__( 'Sorry, error code: %s. Reason: %s' ),
$error_code,
$error_msg
),
);
}
$data = $data_all['videos'];
//video
$return_video = array();
$ext_video = $this->mona_get_youtube_video_type();
if( count( $data ) > 0 ){
foreach( $data as $item ){
$video_type = $item['type'];
$video_quality = $item['quality'];
$video_quality_arg = explode( 'p', $video_quality );
$video_url = $item['url'];
if( in_array( $video_type, $ext_video ) ){
$video_quality = (int) $video_quality_arg[0];
$video_type = str_replace('video/','',$video_type);
if( !isset( $return_video[$video_quality] ) ){
$obj = array(
'ext' => $video_type,
'url' => $video_url,
);
if( isset( $video_quality_arg[1] ) && $video_quality_arg[1] != '' ){
$obj['fps'] = $video_quality_arg[1];
}
$return_video[$video_quality] = $obj;
}
}
}
}
$data_all['videos'] = $return_video;
//audio
$return_audio = array();
$ext_audio = $this->mona_get_youtube_audio_type();
if( count( $data ) > 0 ){
foreach( $data as $item ){
$audio_type = $item['type'];
if( in_array( $audio_type, $ext_audio ) ){
$return_audio = $this->mona_retrieve_audio_item( $return_audio, $item );
}
}
}
$data_all['audios'] = $return_audio;
return array(
'return_flag' => true,
'data' => $data_all,
);
}
function mona_retrieve_audio_item( $array = array(), $item ){
$defination = $this->mona_get_audio_defination();
$audio_itag = $item['itag'];
$audio_url = $item['url'];
if( isset( $defination[$audio_itag] ) ){
array_push(
$array,
array(
'ext' => $defination[$audio_itag]['ext'],
'bitrate' => $defination[$audio_itag]['bitrate'],
'url' => $audio_url,
)
);
}
return $array;
}
function mona_get_audio_defination(){
return array(
'139' => array(
'ext' => 'm4a',
'bitrate' => '48 Kbps',
),
'140' => array(
'ext' => 'm4a',
'bitrate' => '128 Kbps',
),
'141' => array(
'ext' => 'm4a',
'bitrate' => '256 Kbps',
),
'171' => array(
'ext' => 'webm',
'bitrate' => '128 Kbps',
),
'172' => array(
'ext' => 'webm',
'bitrate' => '256 Kbps',
),
);
}
/**
* Render
*/
function mona_render_downloader( $text ){
//css
wp_enqueue_style( 'mona-youtube-downloader-style', trailingslashit( plugin_dir_url( __FILE__ ) ) . 'css/style.css', array(), null, 'all' );
//js
wp_enqueue_script( 'mona-simplePopup-script', trailingslashit( plugin_dir_url( __FILE__ ) ) . 'js/jquery.simplePopup.js', array( 'jquery' ), true );
wp_enqueue_script( 'mona-youtube-downloader-script', trailingslashit( plugin_dir_url( __FILE__ ) ) . 'js/script.js', array( 'jquery' ), true );
$localize = array(
'ajax' => esc_url( admin_url( 'admin-ajax.php' ) ),
);
wp_localize_script( 'mona-youtube-downloader-script', 'mona_ajax', $localize ); ?>
mona_get_youtube_video_data( $text );
if( !@$data['return_flag'] ){
$message = isset( $data['message'] ) ? $data['message'] : __( 'Video not found.' );
wp_send_json_error( array( 'message' => $message ) );
}
$data = $data['data'];
if( $data && count( $data ) > 0 ){
wp_send_json_success( array( 'youtube_data' => $data ) );
}
}
wp_send_json_error( array( 'message' => __( 'Video not found.' ) ) );
}
}
new Mona_Youtube_Downloader();
if ( !function_exists( 'mona_get_youtube_id' ) ){
function mona_get_youtube_id( $string = '' ){
$youtube_downloader = new Mona_Youtube_Downloader();
return $youtube_downloader->mona_get_youtube_id( $string );
}
}
if ( !function_exists( 'mona_get_youtube_thumbnail' ) ){
function mona_get_youtube_thumbnail( $string = '' ){
$youtube_downloader = new Mona_Youtube_Downloader();
$string = mona_get_youtube_id( $string );
return $youtube_downloader->mona_get_youtube_thumbnail_default( $string );
}
}
if ( !function_exists( 'mona_get_youtube_data' ) ){
function mona_get_youtube_data( $link = '' ){
$youtube_downloader = new Mona_Youtube_Downloader();
return $youtube_downloader->mona_get_youtube_data( $link );
}
}
if ( !function_exists( 'mona_get_youtube_video_data' ) ){
function mona_get_youtube_video_data( $link = '' ){
$youtube_downloader = new Mona_Youtube_Downloader();
return $youtube_downloader->mona_get_youtube_video_data( $link );
}
}
}