Je récupère les vidéos d'une playlist à l'aide de l'API youtube v3 et récupère 50 éléments sans aucun problème avec ce lien: -
Mais le nombre de vidéos est de 100 et je n’en ai que 50. Comment puis-je obtenir les 50 éléments suivants? J’ai essayé start-index mais cela ne fonctionne pas pour la v3 API . Toute aide est appréciée.
Les résultats de YouTube Data API v3 sont paginés. Vous devez donc obtenir la page suivante de résultats pour les autres.
En gros, dans la réponse, vous avez nextPageToken .
Pour obtenir les résultats restants, effectuez le même appel mais en insérant pageToken dans le jeton que vous avez reçu.
Il y a trois tokes
et aussi vous pouvez définir la taille maximale de la page en utilisant
maxResults = 50 {autorisé Valeurs 1 à 50}
si vous êtes à la page 1, vous n'obtiendrez pas prevPageToken
mais vous obtenez nextPageToken
passer ce jeton à la prochaine demande
pageToken = {nextPageToken obtenir de la dernière demande}
de cette façon, vous pouvez accéder à la page suivante Essayez-le vous-même
Ok, pour d'autres scénarios
Si vous êtes dans une autre page non est sapin ou dernier alors il y aura toutes ces valeurs
@Manoj: vous pouvez trouver votre réponse ci-dessous Si vous êtes en dernière page
Voici un petit exemple réalisé en python à l'aide de la librairie Python Youtube Client Lib .__, qui emprunte également la configuration standard des exemples de l'API youtube
""" 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")
les vidéos seront une liste de toutes vos vidéos concaténées à la première liste. Il continuera à chercher jusqu'à ce qu'il ait toutes les vidéos en raison de la pagination par 50. Une approche similaire peut être adoptée dans d'autres langues.
Dans la liste, il y aura toutes les méta-données vidéo individuelles et l'ordre
Ce code javascript récupère 115 clips (de PLTI6yRvQqlYq9KoU-NHu43uDmKON7Fsjv) Et 91 clips (de PL32C69B40337EF920)
TESTEZ CE fichier 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>
Une autre solution, utilisant la récursivité:
$.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);
}
});
}
Et appelez-le comme suit:
jQuery('body').append('<div id="ytb_container"></div>');
$.fn.loadYoutubeResource('playlistItems', 'playlistId', 'PLmwK57OwOvYVdedKc_vPPfbcsey_R0K8r', 'ytb_container', null, function(){ <callback code>});
voici ma fonction récursive, peut peut-être aider quelqu'un:
Tout d'abord, j'ai créé un bouton pour le premier appel:
<button id="aux" class="btn btn-danger">Click Me</button>
Puis dans la section script:
$(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();
});
});
Cordialement