it-swarm.com.ru

Получить все видео из плейлиста YouTube с помощью API YouTube v3

Я извлекаю видео из плейлиста с помощью API youtube v3 и без проблем получаю 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 .... Любая помощь приветствуется.

45
amrinder007

Результаты API данных YouTube v3 разбиты на страницы. Так что вам нужно получить следующую страницу результатов для остальных. 

В основном в ответе у вас есть nextPageToken .

Чтобы получить остальные результаты, сделайте тот же самый точный вызов, но установив pageToken в полученный токен.

41
Ibrahim Ulukaya

Есть три жетона 

  1. pageToken 
  2. nextPageToken
  3. prevPageToken

а также вы можете установить максимальный размер страницы, используя 

maxResults = 50 {допустимые значения от 1 до 50}

если вы находитесь на странице 1, вы не получите prevPageToken

но вы получаете nextPageToken 

передать этот токен следующему запросу 

pageToken = {nextPageToken получить из последнего запроса}

таким образом, вы можете перейти к следующей странице Попробуйте YourSelf

Отредактированный

Хорошо, для других сценариев

Если вы находитесь на любой другой странице, не являющейся первой или последней, тогда будут все эти значения

  1. pageToken = 'Некоторые значения'
  2. nextPageToken = 'Некоторые значения'
  3. prevPageToken = 'Некоторые значения'

@Manoj: вы можете найти свой ответ ниже , Если вы находитесь на последней странице 

  1. pageToken = 'Некоторые значения'
  2. nextPageToken = 'Некоторые значения'
  3. prevPageToken = null
25
Trikaldarshi

Это небольшой пример, сделанный в python с использованием Python Youtube Client Lib Он также заимствует шаблонную настройку из примеров 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")

видео будет список всех ваших видео, соединенных в первый список. Он будет загружаться до тех пор, пока не получит все видео из-за нумерации страниц на 50. Подобный подход может быть использован и на других языках.

В списке будут все отдельные метаданные видео и порядок. 

15
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