通过API获取YouTube用户的完整播放列表

时间:2011-08-15 15:36:02

标签: php youtube youtube-api gdata-api zend-gdata

所以,这是获取youtube用户的公共播放列表的代码:

function getyoutubeplaylists($userName) {
$yt = connectyoutube();
$yt->setMajorProtocolVersion(2);
$playlistListFeed = $yt->getPlaylistListFeed($userName);
foreach ($playlistListFeed as $playlistListEntry) {
    $playlist['title'] = $playlistListEntry->title->text;
    $playlist['id'] = $playlistListEntry->getPlaylistID();
    $playlists[] = $playlist;
    $playlistVideoFeed = $yt->getPlaylistVideoFeed($playlistListEntry->getPlaylistVideoFeedUrl());
    foreach ($playlistVideoFeed as $videoEntry) {
        $playlist_assignment['youtube_id'] = substr($videoEntry->getVideoWatchPageUrl(),31,11);
        $playlist_assignment['id'] = $playlist['id'];
        $playlist_assignments[] = $playlist_assignment;
    }
}
$everything['playlists'] = $playlists;
$everything['playlist_assignments'] = $playlist_assignments;
return $everything;
}

问题是,这只会获得第一页或结果。关于如何使用Zend Gdata检索下一页结果的任何想法?

原始gdata XML显示了所需的URL:

<link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/users/pennstate/playlists?start-index=1&amp;max-results=25"/>
<link rel="next" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/users/pennstate/playlists?start-index=26&amp;max-results=25"/>

但是,getPlaylistListFeed似乎没有任何参数来指定“start-index”或“max-results”。

3 个答案:

答案 0 :(得分:2)

这是一个有用的Zend函数,不仅可以检索下一页,还可以检索Feed的所有可用条目。

 $playlistListFeed = $yt->retrieveAllEntriesForFeed($yt->getPlaylistListFeed($userName));

答案 1 :(得分:1)

听起来您想要关注Dev Guide example on pagination

答案 2 :(得分:1)

由于我整天都浪费了“只是试图获取我的网站上显示的视频列表”,我想我会粘贴一些示例代码,这些代码只是教会了我很多。正如预期的那样,Zend_Gdata_YouTube::已经在Magento安装中。下面的代码将显示“视频”的统一列表,其中播放列表在列表中与其他视频一起显示为相同。 更新:我制作了Magento extension out of my answer

这只是我放入var / export的通用php。在顶部,您必须包含app/Mage.php

<?
$userName='cacycleworksdotcom';
$yt = new Zend_Gdata_YouTube();
//////////////////////////////////////////////////////////////////////
// Get playlists.
$playlistListFeed = $yt->retrieveAllEntriesForFeed($yt->getPlaylistListFeed($userName));
$playlist=Array();
$videoEntry=NULL;
$playlistvideos=Array();

这里,$playlistListFeed中有一个Zend对象数组。

foreach ($playlistListFeed as $idx=>$playlistListEntry) {
    // process each playlist
    $playlists[$idx]['title'] = $playlistListEntry->title->text;
    $url=$playlistListEntry->getSelfLink()->href;
    $id=explode("/PL",$url);
    $playlists[$idx]['id'] = $id[1];
    $playlistVideoFeed = $yt->getPlaylistVideoFeed($playlistListEntry->getPlaylistVideoFeedUrl());
    $playlists[$idx]['time']=0;
    $playlists[$idx]['views']=0;
    $playlists[$idx]['rating']=0;

现在,在播放列表中,我会查看此播放列表的视频,并收集每个播放列表的统计信息。我总结他们的时间来获得总的游戏时间,然后从播放列表中的视频中捕获最高的观看次数和评级。

    foreach ($playlistVideoFeed as $videoEntry) {
        // info of each video inside this playlist
        $_id=substr($videoEntry->getVideoWatchPageUrl(),31,11);
        $playlistvideos[]=$_id;
        $_url=$videoEntry->getVideoWatchPageUrl();
        $playlists[$idx]['videos'][$_id]=$_url;
        $playlists[$idx]['time']+=$videoEntry->getVideoDuration();
        $_views=$videoEntry->getVideoViewCount();
        if( $_views > $playlists[$idx]['views'] )
            $playlists[$idx]['views']=$_views;
        $_rating=$videoEntry->getRating()->average;
        if( $_rating > $playlists[$idx]['rating'] )
            $playlists[$idx]['rating']=$_rating;
    }

我最终使用XML来获取缩略图数据。

    $xml=$playlistListEntry->getXML();
    // $playlists[$idx]['xml']=$xml;    // store original XML for now
    $xml = simplexml_load_string($xml); // transfer into object
    $attrs=$xml->group->thumbnail[1];
    $playlists[$idx]['thumb']=(string)$attrs['url'];
    //                                1st vid id         playlist id
    // http://www.youtube.com/watch?v=mcnIAErKc-g&list=PLEDADE9CA0E65BA78
    $videoid=array_keys( $playlists[$idx]['videos']);
    $videoid=$videoid[0];
    $playlists[$idx]['url'] = "http://www.youtube.com/watch?v=$videoid&list=PL".$playlists[$idx]['id'];     
}

处理播放列表,现在让我们获取不在播放列表中的剩余视频:

//////////////////////////////////////////////////////////////////////
// Videos themselves
$idx=count($playlists);
$userFeed = $yt->getUserUploads($userName);
foreach ($userFeed as $videoEntry) {
    $idx++;
    $_id=substr($videoEntry->getVideoWatchPageUrl(),31,11);
    if( ! in_array($_id, $playlistvideos) ) {
        $_url=$videoEntry->getVideoWatchPageUrl();
        $playlists[$idx]['id']=$_id;
        $playlists[$idx]['url']=$_url;
        $playlists[$idx]['title']=$videoEntry->title->text;
        $playlists[$idx]['views']=$videoEntry->getVideoViewCount();
        $playlists[$idx]['rating']=$videoEntry->getRating()->average;
        $thumbs=$videoEntry->getVideoThumbnails();
        // these need resizing to width="320" height="180"
        $playlists[$idx]['thumb']=$thumbs[0]['url'];
        $playlists[$idx]['time']=$videoEntry->getVideoDuration();
    } // else { echo "$_id already in playlist\n";  }
}

这里我们有一系列的YouTube视频,顶部是最早排序的播放列表,其次是用户的视频没有出现在同一个最旧的第一个订单的播放列表中。所以我找到了这个简单的排序代码来改变顺序。如果您在这里尝试对多维数组进行排序,那么有关于排序和值得阅读的好文章。

//////////////////////////////////////////////////////////////////////
// http://www.the-art-of-web.com/php/sortarray/
function orderBy($data, $field) {
    $code = "return strnatcmp(\$a['$field'], \$b['$field']);";
    //  swap $a and $b to make descending instead of ascending
    usort($data, create_function('$b,$a', $code)); //('$a,$b', $code));
    return $data;
}
$playlists = orderBy($playlists, 'views');
//////////////////////////////////////////////////////////////////////
echo "\n\n";
print_r($playlists);

以下代码帮助我开始使用这些愚蠢的GData YouTube Zend对象:

echo "\n\n";
show_methods($videoEntry);
echo "\n\n";
show_methods($playlistListFeed[0]);
echo "\n\n";
show_methods($playlistListFeed);

function show_methods( $_a ) {
    echo "<h3>Methods for ".get_class($_a)."</h3>";
    $_a= get_class_methods($_a);
    $_a=array_unique($_a);
    array_multisort(&$_a);
    $i=0;
    foreach( $_a as $method ) {
        $i++;
        printf("%-30.30s",$method);
        if($i%5==0)
            echo "\n";
    }
}

以下是显示结构的两个数组条目。请注意,播放列表中包含一个videos键,其中包含一系列视频。测试videos密钥可以告诉您它是一个播放列表。 url是您的用户点击以打开YouTube网站上的视频或播放列表的内容。

[1] => Array
    (
        [title] => Ducatitech.com "HowTo" Adjust your Valves
        [id] => 970EC735D36A95E8
        [time] => 855
        [views] => 144847
        [rating] => 4.9322033
        [videos] => Array
            (
                [dIj3nSJGPZw] => http://www.youtube.com/watch?v=dIj3nSJGPZw&feature=youtube_gdata_player
                [3WQY1MRlmH4] => http://www.youtube.com/watch?v=3WQY1MRlmH4&feature=youtube_gdata_player
            )

        [thumb] => http://i.ytimg.com/vi/dIj3nSJGPZw/mqdefault.jpg
        [url] => http://www.youtube.com/watch?v=dIj3nSJGPZw&list=PL970EC735D36A95E8
            )

        [thumb] => http://i.ytimg.com/vi/mcnIAErKc-g/mqdefault.jpg
        [url] => http://www.youtube.com/watch?v=mcnIAErKc-g&list=PLEDADE9CA0E65BA78
    )
[7] => Array
    (
        [id] => 80yCiFkOB9g
        [url] => http://www.youtube.com/watch?v=80yCiFkOB9g&feature=youtube_gdata_player
        [title] => Ducatitech.com: ExactFit Timing Belt Tensile Test
        [views] => 7589
        [rating] => 4.25
        [thumb] => http://i.ytimg.com/vi/80yCiFkOB9g/0.jpg
        [time] => 625
    )

最后,你从show_methods()获得的东西:

Methods for Zend_Gdata_YouTube_VideoEntry

__construct                   __get                         __isset                       __set                         __toString                    
__unset                       addVideoDeveloperTag          delete                        encode                        ensureMediaGroupIsNotNull     
flushNamespaceLookupCache     getAlternateLink              getAuthor                     getCategory                   getComments                   
getContent                    getContributor                getControl                    getDOM                        getEditLink                   
getEtag                       getExtensionAttributes        getExtensionElements          getFeedLink                   getFlashPlayerUrl             
getHttpClient                 getId                         getLicenseLink                getLink                       getLocation                   
getMajorProtocolVersion       getMediaGroup                 getMediaSource                getMinorProtocolVersion       getNextLink                   
getNoEmbed                    getPreviousLink               getPublished                  getRacy                       getRating                     
getRecorded                   getRights                     getSelfLink                   getService                    getSource                     
getStatistics                 getSummary                    getText                       getTitle                      getTitleValue                 
getUpdated                    getVideoCategory              getVideoCommentFeedUrl        getVideoComplaintsLink        getVideoDescription           
getVideoDeveloperTags         getVideoDuration              getVideoGeoLocation           getVideoId                    getVideoRatingInfo            
getVideoRatingsLink           getVideoRecorded              getVideoResponsesLink         getVideoState                 getVideoTags                  
getVideoThumbnails            getVideoTitle                 getVideoViewCount             getVideoWatchPageUrl          getWhere                      
getXML                        isVideoEmbeddable             isVideoPrivate                lookupNamespace               registerAllNamespaces