那么,这里是我的代码获取一个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&max-results=25"/>
<link rel="next" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/users/pennstate/playlists?start-index=26&max-results=25"/>
然而,getplaylistfeed似乎没有任何参数来指定"start-index"或"max-results"。
这是一个有用的Zend函数,不仅用于检索下一页,而且用于检索提要的所有可用条目。
$playlistListFeed = $yt->retrieveAllEntriesForFeed($yt->getPlaylistListFeed($userName));
听起来你想要遵循Dev Guide关于分页的示例。
因为我浪费了一整天"只是试图得到我的视频列表在我的网站上显示",我想我应该粘贴一些示例代码,只是教会了我很多。正如预期的那样,Zend_Gdata_YouTube::
已经在Magento安装中。下面的代码将呈现一个统一的"视频"列表,其中播放列表在列表中与其他视频并排显示相同。更新:我做了一个Magento扩展我的回答。
这只是一个通用的php我放入var/export。在顶部,您必须包含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 playlistn"; }
}
这里我们有一个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 "nn";
print_r($playlists);
下面是帮助我开始使用这些愚蠢的GData YouTube Zend对象的代码:
echo "nn";
show_methods($videoEntry);
echo "nn";
show_methods($playlistListFeed[0]);
echo "nn";
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