我如何创建一个函数来获取YouTube视频时间

时间:2013-02-27 作者:Batman

TomJ Nowell发布了这段代码来帮助我检索YouTube视频时间。

功能

// function to parse the code from the URL
function parse_youtube_video_id_from_url( $video_url ) {
    $splited_data = explode( \'=\', $video_url );
    $video_unique_code = substr( $splited_data[1], 0, -strlen( strrchr( $splited_data[1], \'&\' ) ) );
    return $video_unique_code;
}

// use the youtube APIs to get a json string containing data about the video
function get_youtube_json_video_data( $video_code ) {
    $api_url = \'https://gdata.youtube.com/feeds/api/videos?v=2&alt=jsonc&q=\'.$video_code;
    $data = wp_remote_get( $api_url );
    return $data[\'body\'];
}
获取数据:

<?php $youtubecode = \'QiNIfGiNiOk\';
$video_data = get_youtube_json_video_data($youtubecode);
$video_data = json_decode( $video_data ); 
echo \'<pre>\'.print_r($video_data,true).\'</pre>\';
?>
上述代码检索的数据(例如):

stdClass Object
(
    [apiVersion] => 2.1
    [data] => stdClass Object
        (
            [updated] => 2013-02-27T18:29:22.395Z
            [totalItems] => 1
            [startIndex] => 1
            [itemsPerPage] => 25
            [items] => Array
                (
                    [0] => stdClass Object
                        (
                            [id] => QiNIfGiNiOk
                            [uploaded] => 2012-11-30T18:20:08.000Z
                            [updated] => 2013-02-26T22:33:56.000Z
                            [uploader] => ramonsteck
                            [category] => Entertainment
                            [title] => After Earth - Trailer 2013
                            [description] => Unete www.facebook.com/Cinemovs Historias Paranormales Reales, Películas de Terror Online y proximos estrenos de cine.
                            [thumbnail] => stdClass Object
                                (
                                    [sqDefault] => http://i.ytimg.com/vi/QiNIfGiNiOk/default.jpg
                                    [hqDefault] => http://i.ytimg.com/vi/QiNIfGiNiOk/hqdefault.jpg
                                )

                            [player] => stdClass Object
                                (
                                    [default] => https://www.youtube.com/watch?v=QiNIfGiNiOk&feature=youtube_gdata_player
                                    [mobile] => https://m.youtube.com/details?v=QiNIfGiNiOk
                                )

                            [content] => stdClass Object
                                (
                                    [5] => https://www.youtube.com/v/QiNIfGiNiOk?version=3&f=videos&app=youtube_gdata
                                    [1] => rtsp://v1.cache6.c.youtube.com/CiILENy73wIaGQnpiI1ofEgjQhMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
                                    [6] => rtsp://v1.cache6.c.youtube.com/CiILENy73wIaGQnpiI1ofEgjQhMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
                                )

                            [duration] => 123
                            [aspectRatio] => widescreen
                            [rating] => 2.6722891
                            [likeCount] => 174
                            [ratingCount] => 415
                            [viewCount] => 247218
                            [favoriteCount] => 0
                            [commentCount] => 63
                            [accessControl] => stdClass Object
                                (
                                    [comment] => allowed
                                    [commentVote] => allowed
                                    [videoRespond] => moderated
                                    [rate] => allowed
                                    [embed] => allowed
                                    [list] => allowed
                                    [autoPlay] => allowed
                                    [syndicate] => allowed
                                )

                        )

                )

        )

)
如何获取视频的持续时间(例如“1:23”)。

他告诉我:

创建一个函数,将该函数挂接到“save\\u post”和“publish\\u post”操作中,这些操作根据上述代码更新post meta/custom字段

如何创建该函数挂钩?我该如何组合:

自定义字段是我输入的键:

<?php $key="trailer"; echo get_post_meta($post->ID, $key, true); ?>
要检索视频数据,请指定YouTube URL代码,例如:

$youtubecode = \'QiNIfGiNiOk\';
--------------------------更新-有效的代码-------------------------

<?php 
$key="trailer";
$youtubecode = get_post_meta($post->ID, $key, true);
$video_data = get_youtube_json_video_data($youtubecode);
$video_data = json_decode( $video_data ); 
foreach ( $video_data->data->items as $data ){
                echo brsfl_secondsToTime($data->duration);
    }
?>
-------------------------------感谢Brasofilo----------------------------

1 个回复
最合适的回答,由SO网友:brasofilo 整理而成

以下是我用来从YouTube响应中提取数据的函数wp_remote_get.

这只是基本的东西,您必须调整、补充和集成到代码中。

add_action( \'save_post\', \'brsfl_save_postdata\' );

function brsfl_save_postdata( $post_id ) 
{
    // IMPORTANT!
    // Check for DOING_AUTOSAVE and wp_verify_nonce()

    $consult = brsfl_yt_api( $_POST[\'yt_id\'] );
    if( $consult )
    {
        $youtube[\'yt_time\'] = $consult[\'yt_time\'];
        $youtube[\'yt_likes\'] = $consult[\'yt_likes\'];
        $youtube[\'yt_dislikes\'] = $consult[\'yt_dislikes\'];
        $youtube[\'yt_average\'] = $consult[\'yt_average\'];
        $youtube[\'yt_raters\'] = $consult[\'yt_raters\'];
        $youtube[\'yt_viewcount\'] = $consult[\'yt_viewcount\'];
        $youtube[\'yt_title\'] = $consult[\'yt_title\'];
        $youtube[\'yt_thumb\'] = $consult[\'yt_thumb\'];
        update_post_meta( $post_id, \'youtube\', $youtube );
    }   
}


/** 
 * Consult YouTube API
 * https://developers.google.com/youtube/2.0/developers_guide_protocol_video_entries
 */
function brsfl_yt_api( $video_id ) 
{
    // get Video Info
    $youtube = wp_remote_get( 
        \'https://gdata.youtube.com/feeds/api/videos/\'
        . $video_id
        . \'?v=2&alt=json\',

        array(
             \'timeout\' => 120, 
            \'httpversion\' => \'1.1\' 
        ) 
    );

    // Full response: https://gist.github.com/e5a8cda8141b10711ad2
    if ( $youtube[\'response\'][\'code\'] == \'200\' )
    {
        $youtube_array = json_decode( $youtube[\'body\'], true );
        $mediagroup = $youtube_array[\'entry\'][\'media$group\'];
        $yt_rating  = $youtube_array[\'entry\'][\'yt$rating\'];
        $yt_stats   = $youtube_array[\'entry\'][\'yt$statistics\'];
        $gd_rating  = $youtube_array[\'entry\'][\'gd$rating\'];

        $return[\'yt_time\']      = brsfl_secondsToTime( $mediagroup[\'yt$duration\'][\'seconds\'] );
        $return[\'yt_likes\']     = $yt_rating[\'numLikes\'];
        $return[\'yt_dislikes\']  = $yt_rating[\'numDislikes\'];
        $return[\'yt_average\']   = $gd_rating[\'average\'];
        $return[\'yt_raters\']    = $gd_rating[\'numRaters\'];
        $return[\'yt_viewcount\'] = $yt_stats[\'viewCount\'];
        $return[\'yt_title\']     = $youtube_array[\'entry\'][\'title\'][\'$t\'];
        $return[\'yt_thumb\']     = $mediagroup[\'media$thumbnail\'][1][\'url\'];

        return $return;
    }   
    return false;
}


/** 
 * Convert seconds to timecode
 * http://stackoverflow.com/q/8273804
 */
function brsfl_secondsToTime($inputSeconds) 
{

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = floor($inputSeconds / $secondsInADay);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // DAYS
    if( (int)$days == 0 )
        $days = \'\';
    elseif( (int)$days < 10 )
        $days = \'0\' . (int)$days . \':\';
    else
        $days = (int)$days . \':\';

    // HOURS
    if( (int)$hours == 0 )
        $hours = \'\';
    elseif( (int)$hours < 10 )
        $hours = \'0\' . (int)$hours . \':\';
    else 
        $hours = (int)$hours . \':\';

    // MINUTES
    if( (int)$minutes == 0 )
        $minutes = \'\';
    elseif( (int)$minutes < 10 )
        $minutes = \'0\' . (int)$minutes . \':\';
    else 
        $minutes = (int)$minutes . \':\';

    // SECONDS
    if( (int)$seconds == 0 )
        $seconds = \'00\';
    elseif( (int)$seconds < 10 )
        $seconds = \'0\' . (int)$seconds;

    return $days . $hours . $minutes . $seconds;
}

结束

相关推荐

WordPress中Single-{post-type}.php的固定链接结构

我尝试了多种方法将我的自定义帖子类型显示为single-{post-type} 最后,我用过之后,效果很好:\'rewrite\'=> false, 在那之前,我用\'rewrite\' => array( \'slug\' => \'custom-post-type\' ) 但对我来说从来都不管用。不知道我哪里出错了。现在我应该感到很高兴,因为它的工作没有任何错误。但permalink有一点困惑,因为它的显示:localhost/myblog/?news=break