web-dev-qa-db-ja.com

youtube v3 APIを使用して、YouTubeプレイリストからすべての動画を取得します

このリンクを使用して、YouTube v3 APIを使用してプレイリストの動画を取得し、問題なく50個のアイテムを取得します。

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=PLB03EA9545DD188C3&key=MY_API_KEY

しかし、ビデオ数は100で、50しか取得できません。次の50のアイテムを取得するにはどうすればよいですか? start-indexを試しましたが、v3 APIでは機能しません。どんな助けも大歓迎です。

49
amrinder007

YouTube Data API v3の結果はページ分割されます。そのため、他の人のために結果の次のページを取得する必要があります。

基本的に、応答には nextPageToken があります。

残りの結果を取得するには、まったく同じ呼び出しを行いますが、受け取ったトークンに pageToken を設定します。

46
Ibrahim Ulukaya

Therは3つのトークです

  1. pageToken
  2. nextPageToken
  3. prevPageToken

また、次を使用して最大ページサイズを設定できます

maxResults = 50 {許容値1〜50}

ページ1にいる場合、prevPageTokenを取得しません

しかし、nextPageTokenを取得します

このトークンを次のリクエストに渡します

pageToken = {nextPageToken最後のリクエストから取得}

この方法で、次のページに移動できます Try it YourSelf

編集済み

OK、他のシナリオ用

あなたが他のページにいる場合、最初または最後ではない場合、これらすべての値があります

  1. pageToken = 'いくつかの値'
  2. nextPageToken = 'いくつかの値'
  3. prevPageToken = 'いくつかの値'

@Manoj:最後のページにいる場合は、以下の答えを見つけることができます

  1. pageToken = 'いくつかの値'
  2. nextPageToken = 'いくつかの値'
  3. prevPageToken = null
27
Trikaldarshi

これはpython Python Youtube Client Libを使用して作成された小さな例です。これはyoutube APIの例から定型的なセットアップも借用しています。

""" Pull All Youtube Videos from a Playlist """

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser


DEVELOPER_KEY = "YOURKEY HERE"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def fetch_all_youtube_videos(playlistId):
    """
    Fetches a playlist of videos from youtube
    We splice the results together in no particular order

    Parameters:
        parm1 - (string) playlistId
    Returns:
        playListItem Dict
    """
    youtube = build(YOUTUBE_API_SERVICE_NAME,
                    YOUTUBE_API_VERSION,
                    developerKey=DEVELOPER_KEY)
    res = youtube.playlistItems().list(
    part="snippet",
    playlistId=playlistId,
    maxResults="50"
    ).execute()

    nextPageToken = res.get('nextPageToken')
    while ('nextPageToken' in res):
        nextPage = youtube.playlistItems().list(
        part="snippet",
        playlistId=playlistId,
        maxResults="50",
        pageToken=nextPageToken
        ).execute()
        res['items'] = res['items'] + nextPage['items']

        if 'nextPageToken' not in nextPage:
            res.pop('nextPageToken', None)
        else:
            nextPageToken = nextPage['nextPageToken']

    return res

if __== '__main__':
  # comedy central playlist, has 332 video
  # https://www.youtube.com/watch?v=tJDLdxYKh3k&list=PLD7nPL1U-R5rDpeH95XsK0qwJHLTS3tNT
  videos = fetch_all_youtube_videos("PLD7nPL1U-R5rDpeH95XsK0qwJHLTS3tNT")

ビデオは、最初のリストに連結されたすべてのビデオのリストになります。 50ページごとにページネーションが行われるため、すべての動画を取得するまでフェッチを続けます。他の言語でも同様のアプローチをとることができます。

リストには、個々のビデオメタデータと順序がすべて含まれます。

16
stanzheng

このjavascriptは、115個のクリップ(PLTI6yRvQqlYq9KoU-NHu43uDmKON7Fsjvから)と91個のクリップ(PL32C69B40337EF920から)を取得します。
次のhtmlファイルをテストします。
http://pvhung20.url.ph/api3/retrieve-all-videos-stackoverflow.html

sum = 0;
sumN = 1;
var nextPageToken;

function getVids(PageToken){
    pid = $('#searchtext1').val();
    $.get(
        "https://www.googleapis.com/youtube/v3/playlistItems",{
        part : 'snippet', 
        maxResults : 50,
        playlistId : pid,
        pageToken : PageToken,
        key: 'YOUR API3 KEY'
        },
        function(data){
              myPlan(data);
        }        
    );  
 }

  function myPlan(data){
      total = data.pageInfo.totalResults;
      nextPageToken=data.nextPageToken;
      for(i=0;i<data.items.length;i++){
          document.getElementById('area1').value +=  
          sumN + '-' + data.items[i].snippet.title+'\n'+
          data.items[i].snippet.resourceId.videoId +'\n\n';
          sum++ ; sumN++;
          if(sum == (total-1) ){              
              sum = 0;  
              return;      
          }
      }  
      if(sum <(total-1)){
          getVids(nextPageToken);
      }    
 }
 
 function init(){
    $('#area1').val('');
 }
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
  
  <body onload="$('#area1').val('')">
    
  <input type="text"  value="PLTI6yRvQqlYq9KoU-NHu43uDmKON7Fsjv" 
  id="searchtext1" size="75">&nbsp;
  <button onclick="getVids()">Get Items</button>
  <br><br>
  IDs for test: <br>PLTI6yRvQqlYq9KoU-NHu43uDmKON7Fsjv<br>
  PL32C69B40337EF920
  <br><br>         
  <textarea id="area1" style="width:600px;height:500px">
  </textarea>
9
hung phan

再帰を使用した別のソリューション:

$.fn.loadYoutubeResource = function(resource_request, resource_type, resource_id, resource_container, pageToken = null, callback = null){
    $.ajax({
            url: "https://www.googleapis.com/youtube/v3/" + resource_request,
            type: 'get',
            dataType: 'json',
            data: {
                    part : 'snippet', 
                    [resource_type]: resource_id,
                    maxResults : 50,
                    pageToken: pageToken,
                    key: '< API Key >', 
                  },
            success:    function(data) {
                                console.log("New resource " + resource_type + " loaded:");
                                console.log(data);                                          
                                for(var index = 0; index < data.items.length; index++){                                         
                                    var url = data.items[index]['snippet'].thumbnails.default.url;
                                    var ytb_id = data.items[index]['id'];   
                                    jQuery('#' + resource_container).append('<img class="tube_thumbs" src="' + url + '" id="' + ytb_id 
                                                                        + '" title="' + data.items[index]['snippet']['title'] + '" >');
                                    }
                                if ( data.nextPageToken == null)
                                    return callback();
                                $.fn.loadYoutubeResource(resource_request, resource_type, resource_id, resource_container, data.nextPageToken, callback);                   
                        }
            });     
        }        

そして、次のように呼び出します。

jQuery('body').append('<div id="ytb_container"></div>');

$.fn.loadYoutubeResource('playlistItems', 'playlistId', 'PLmwK57OwOvYVdedKc_vPPfbcsey_R0K8r', 'ytb_container', null, function(){ <callback code>});
0
Samuel

ここに私の再帰関数があり、おそらく誰かを助けることができます:

まず、最初の呼び出し用のボタンを作成しました。

<button id="aux" class="btn btn-danger">Click Me</button>    

次に、スクリプトセクションで:

   $(document).ready(function () {

        function getVideos(t) {
            var url = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=YourAPIKey&channelId=YourChannelID&maxResults=50";
            if (t != undefined) {
                url = url + "&pageToken=" + t
            }
            $.ajax({
                type: 'GET',
                url: url,
                dataType: 'json',
                success: function (html) {
                    console.log(html.items);
                    if (html.nextPageToken != undefined) {
                        getVideos(html.nextPageToken);
                    }
                }
            });
        };

        //initial call
        $("#aux").click(function () {
            getVideos();
        });
 });

よろしく

0
user3053204