Get complete playlist listing for a YouTube User via API

前端 未结 3 1943
刺人心
刺人心 2021-01-13 05:39

So, here\'s my code for getting a youtube user\'s public playlists:

function getyoutubeplaylists($userName) {
$yt = connectyoutube();
$yt->setMajorProtoco         


        
相关标签:
3条回答
  • 2021-01-13 06:12

    This is a useful Zend function for retrieving not only the next page but all available entries for a feed.

     $playlistListFeed = $yt->retrieveAllEntriesForFeed($yt->getPlaylistListFeed($userName));
    
    0 讨论(0)
  • 2021-01-13 06:13

    Since I wasted all day "just trying to get a list of my videos to show on my website", I thought I'd paste up some sample code that just taught me a lot. And as expected, Zend_Gdata_YouTube:: is already in Magento installations. The code below will present a unified list of "videos", where playlists appear the same in the list as the other videos alongside each other. Update: I made a Magento extension out of my answer.

    This is just a generic php I dropped into var/export. At the top, you have to include app/Mage.php.

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

    Here, you've got an array of Zend objects in $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;
    

    Now, within the playlist, I look at the videos of this playlist and gather stats on each one. I sum their times to get a total playtime and then capture the highest view count and rating from the videos in the playlist.

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

    I ended up using the XML to get the thumbnail data.

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

    The playlists are handled, now let's get the remaining videos that aren't in playlists:

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

    Here we have an array of our youtube videos, at the top are the playlsits ordered by oldest first, followed by the user's videos not appearing in playlists in same oldest first order. So I found this simple sort code to change the order. Great article there about sorting and worth a read if you're here trying to sort multidimensional arrays.

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

    Here is the code that helped me get started working with these goofy GData YouTube Zend objects:

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

    Here are two of the array entries to show the structure. Note that playlists have a videos key with an array of the videos inside it. Testing for the videos key can tell you it's a playlist. The url is what your user can click on to open the video or playlist on the youtube site.

    [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
        )
    

    And finally, the kind of stuff you get out of 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         
    
    0 讨论(0)
  • 2021-01-13 06:26

    It sounds like you want to follow the Dev Guide example on pagination.

    0 讨论(0)
提交回复
热议问题