带有JavaScript的Youtube API-显示播放列表中的所有视频

时间:2018-10-25 13:32:50

标签: javascript api youtube

我正尝试使用以下代码从YouTube播放列表中获取全部137个视频:

function loadVideos() {

  let pagetoken = '';
  let resultCount = 0;
  const mykey = "***********************************";
  const playListID = "PLzMXToX8Kzqggrhr-v0aWQA2g8pzWLBrR";

  const URL =  `https://www.googleapis.com/youtube/v3/playlistItems?
part=snippet
&maxResults=50
&playlistId=${playListID}
&key=${mykey}`;


  fetch(URL)
    .then(response => {
      return response.json();
    })
    .then(function(response) {

      resultCount = response.pageInfo.totalResults;
      console.log("ResultCount: " + resultCount);

      pagetoken = response.nextPageToken;
      console.log("PageToken: " + pagetoken);

      resultCount = resultCount - 50;
      console.log("ResultCount: " + resultCount);

      while (resultCount > 0) {

        const URL = `https://www.googleapis.com/youtube/v3/playlistItems?
part=snippet
&maxResults=50
&playlistId=${playListID}
&key=${mykey}
&pageToken=${pagetoken}`;

        fetch(URL)
          .then(response => {
            return response.json();
          })
          .then(function(response) {
            pagetoken = response.nextPageToken ? response.nextPageToken : null;
            console.log("PageToken: " + pagetoken);
          });
        resultCount = resultCount - 50;
      }
    })
    .catch(function(error) {
      console.log("Looks like there was a problem: \n", error);
    });
} // End of loadVideos function

// Invoking the loadVideos function
loadVideos();

前50个视频已加载 后50个视频也被加载 但是,我的脚本没有加载列表中剩余的37个视频,而是再次加载了前50个视频。

页面令牌似乎没有针对第三次请求进行更新。

我的代码有什么问题?

3 个答案:

答案 0 :(得分:4)

您不需要使用50 - maxResults进行数学运算,只需查找nextPageToken并让代码在有新令牌的情况下重新调用api。

例如

function getUrl(pagetoken) {
  var pt = (typeof pagetoken === "undefined") ? "" :`&pageToken=${pagetoken}`,
      mykey = "************",
      playListID = "PLzMXToX8Kzqggrhr-v0aWQA2g8pzWLBrR",
      URL = `https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=${playListID}&key=${mykey}${pt}`;
  return URL;
}


function apiCall(npt) {
  fetch(getUrl(npt))
  .then(response => {
      return response.json();
  })
  .then(function(response) {
      if(response.error){
        console.log(response.error)
      } else {
        responseHandler(response)
      }

  });
}

function responseHandler(response){
  if(response.nextPageToken)
    apiCall(response.nextPageToken);

  console.log(response)
}
apiCall();

如果您看到api进行了3次调用,因为在第三次之后没有nextPageToken

答案 1 :(得分:1)

您正在遍历异步功能而无需等待响应。尝试在函数声明之前添加async,然后在提取之前等待...

function loadVideos() {
// ...

    .then(async function(response) {
    // ...

        while (resultCount > 0) {
        // ...

            await fetch(URL)
                .then(response => {
                // ...

或者,如果您的设置不支持异步/等待,请使用bluebird的Promise.mapSeries和一个长度为resultCount的空数组,类似this

答案 2 :(得分:1)

我恳请您从代码中删除您的API密钥,然后简单地放其他符号或将其留空以供他人理解。