5

所以,这是我获取 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”。

4

3 回答 3

2

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

 $playlistListFeed = $yt->retrieveAllEntriesForFeed($yt->getPlaylistListFeed($userName));
于 2012-08-27T06:11:06.597 回答
1

听起来您想遵循分页上的开发指南示例

于 2011-08-15T16:16:04.090 回答
1

由于我浪费了一整天“只是想在我的网站上显示我的视频列表”,我想我会粘贴一些示例代码,这些代码教会了我很多东西。正如预期的那样,Zend_Gdata_YouTube::已经在 Magento 安装中。下面的代码将显示一个统一的“视频”列表,其中播放列表与其他视频在列表中的显示相同。 更新:我从我的回答中做了一个 Magento 扩展

这只是我放入 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();

在这里,您有一个 Zend 对象数组$playlistListFeed

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         
于 2013-02-27T01:44:52.653 回答