web-dev-qa-db-fra.com

Récupérer toutes les vidéos de la liste de lecture youtube à l'aide de l'API youtube v3

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: -

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

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.

45
amrinder007

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.

41
Ibrahim Ulukaya

Il y a trois tokes 

  1. pageToken 
  2. nextPageToken
  3. prevPageToken

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

Édité

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

  1. pageToken = 'Quelques valeurs'
  2. nextPageToken = 'Quelques valeurs'
  3. prevPageToken = 'Quelques valeurs'

@Manoj: vous pouvez trouver votre réponse ci-dessous Si vous êtes en dernière page 

  1. pageToken = 'Quelques valeurs'
  2. nextPageToken = 'Quelques valeurs'
  3. prevPageToken = null
25
Trikaldarshi

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 

15
stanzheng

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

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>});
0
Samuel

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

0
user3053204