2011-08-15 18 views
5

tanto, aquí está mi código para obtener listas de reproducción públicas de un usuario de YouTube:Obtener la lista completa lista de reproducción para un usuario de YouTube a través de la API

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

El problema es que esto sólo se consigue la primera página o en los resultados. ¿Alguna idea sobre cómo usar Zend Gdata para recuperar la página siguiente de resultados?

El XML gdata cruda muestra las direcciones URL necesarios:

<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"/> 

Sin embargo, getPlaylistListFeed no parece tener ningún parámetro para especificar "start-index" o "max-results".

+0

supongo que hay que decir, que sé que podría modificar getPlaylistListFeed tomar dichos parámetros y luego modificar el URI en consecuencia , pero de alguna manera no creo haber encontrado una falla tan simple en un producto Zend. – poolnoodl

Respuesta

2

Esta es una función útil de Zend para recuperar no solo la página siguiente, sino también todas las entradas disponibles para un feed.

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

Desde que perdí todo el día "tratando de obtener una lista de mis videos para mostrar en mi sitio web", que pensé en pegar un código de ejemplo que sólo me enseñó mucho. Y como era de esperar, Zend_Gdata_YouTube:: ya está en las instalaciones de Magento. El siguiente código presentará una lista unificada de "videos", donde las listas de reproducción aparecen iguales en la lista que los otros videos uno al lado del otro. Actualización: Hice un Magento extension out of my answer.

Esto es solo un php genérico que solté en var/export. En la parte superior, debe incluir app/Mage.php.

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

Aquí, usted tiene una serie de objetos en 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; 

Ahora, dentro de la lista de reproducción, miro los videos de esta lista de reproducción y reúno estadísticas de cada uno. Sumar sus tiempos para obtener un tiempo de juego total y luego capturar el mayor conteo de visitas y clasificación de los videos en la lista de reproducción.

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

Terminé usando el XML para obtener los datos en miniatura.

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

Las listas de reproducción se manejan, ahora a conseguir los videos restantes que no están en las listas de reproducción:

////////////////////////////////////////////////////////////////////// 
// 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"; } 
} 

Aquí tenemos una serie de videos de youtube, en la parte superior están las playlsits clasificadas por el más antiguo primero, seguido de los videos del usuario que no aparecen en las listas de reproducción en el primer pedido más antiguo. Así que encontré este código de clasificación simple para cambiar el orden. Gran artículo sobre clasificación y vale la pena leerlo si estás aquí tratando de ordenar matrices multidimensionales.

////////////////////////////////////////////////////////////////////// 
// 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); 

Aquí está el código que me ayudó a empezar a trabajar con estos objetos torpes 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"; 
    } 
} 

Estas son dos de las entradas de matriz para mostrar la estructura. Tenga en cuenta que las listas de reproducción tienen una clave videos con una matriz de videos dentro de ella.Las pruebas de la clave videos pueden indicarle que se trata de una lista de reproducción. El usuario puede hacer clic en url para abrir el video o la lista de reproducción en el sitio de 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 
    ) 

Y, por último, el tipo de cosas que salga de 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   
Cuestiones relacionadas