Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Tom J Nowell posted this code to help me retrieve the YouTube video time.

Functions

// 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'];
}

Getting the data:

<?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>';
?>

The data that the above code retrieves (e.g.):

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
                                )

                        )

                )

        )

)

How can I get the duration of the video (e.g. '1:23').

He told me to:

create a function, hook that function into the 'save_post' and 'publish_post' actions, that updates the post meta/custom field based on the above code

How can I create that function hook? And how can i put together:

Custom Field were I put the key:

<?php $key="trailer"; echo get_post_meta($post->ID, $key, true); ?>

To retrieve the video data, specify the YouTube URL code such as:

$youtubecode = 'QiNIfGiNiOk';

-------------------------- UPDATE - The code that Works -------------------------

<?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);
    }
?>

--------------------------------- Thanks to Brasofilo ----------------------------

share|improve this question

1 Answer 1

up vote 1 down vote accepted

The following are the functions that I use to extract data from a YouTube response to wp_remote_get.

It's just the basic stuff, you'll have to adjust, complement and integrate into your code.

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;
}
share|improve this answer
    
brasofilo, i canot make it work.. –  Batman Mar 2 '13 at 18:01
    
Brasofilo, i make it work.. now how can i retrive somting like this <?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>'; foreach ( $video_data->data->items as $data ){ echo "{$data->duration}"; } ?> Now i retive the time like this.. how can i retrive someting like this : 1:23 –  Batman Mar 2 '13 at 18:11
    
I don't see you using the functions I provided... There's one there called secondsToTime that does exactly this, converts 83 seconds to 1:23 :P –  brasofilo Mar 2 '13 at 18:15
    
how can i include that? –  Batman Mar 2 '13 at 18:18
    
echo brsfl_secondsToTime($data->duration); - Pro tip: start reading PHP tutorials as soon as you can. –  brasofilo Mar 2 '13 at 18:22

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.