このリンクを使用して、YouTube v3 APIを使用してプレイリストの動画を取得し、問題なく50個のアイテムを取得します。
しかし、ビデオ数は100で、50しか取得できません。次の50のアイテムを取得するにはどうすればよいですか? start-indexを試しましたが、v3 APIでは機能しません。どんな助けも大歓迎です。
YouTube Data API v3の結果はページ分割されます。そのため、他の人のために結果の次のページを取得する必要があります。
基本的に、応答には nextPageToken があります。
残りの結果を取得するには、まったく同じ呼び出しを行いますが、受け取ったトークンに pageToken を設定します。
Therは3つのトークです
また、次を使用して最大ページサイズを設定できます
maxResults = 50 {許容値1〜50}
ページ1にいる場合、prevPageToken
を取得しません
しかし、nextPageToken
を取得します
このトークンを次のリクエストに渡します
pageToken = {nextPageToken最後のリクエストから取得}
この方法で、次のページに移動できます Try it YourSelf
OK、他のシナリオ用
あなたが他のページにいる場合、最初または最後ではない場合、これらすべての値があります
@Manoj:最後のページにいる場合は、以下の答えを見つけることができます
これは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ページごとにページネーションが行われるため、すべての動画を取得するまでフェッチを続けます。他の言語でも同様のアプローチをとることができます。
リストには、個々のビデオメタデータと順序がすべて含まれます。
この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">
<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>
再帰を使用した別のソリューション:
$.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>});
ここに私の再帰関数があり、おそらく誰かを助けることができます:
まず、最初の呼び出し用のボタンを作成しました。
<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();
});
});
よろしく