无法将多个视频插入播放列表 - YouTube API v3

时间:2015-02-22 04:41:35

标签: javascript youtube-api youtube-data-api youtube-javascript-api

我正在尝试将多个视频添加到播放列表,但只有一个视频添加到播放列表中。我可以成功创建播放列表并将视频插入播放列表,但无法将多个视频插入播放列表。

以下是我这样做的简单方法。 addTheseVideosToPlaylist()函数是我失败的地方。还会显示createPlaylist()和addToPlaylist()。

有一个全局播放列表可以跟踪创建的播放列表。

var playlistId

我创建了一个这样的播放列表:

function createPlaylist() {
  var request = gapi.client.youtube.playlists.insert({
    part: 'snippet,status',
    resource: {
      snippet: {
        title: 'hard coded title',
        description: 'Hard Coded Description'
      },
      status: {
        privacyStatus: 'private'
      }
    }
  });

  request.execute(function(response) {
    var result = response.result;
    if (result) {
      playlistId = result.id;
      console.log("created playlist " + playlistId)
    } 
  });
}

我根据以下有效视频ID向创建的播放列表添加视频:

function addToPlaylist(id, startPos, endPos) {
  console.log("in addToPlaylist with " + id  + "sending to playlist : " + playlistId);

  var details = {
    videoId: id,
    kind: 'youtube#video'
  }

  var request = gapi.client.youtube.playlistItems.insert({
    part: 'snippet',
    resource: {
      snippet: {
        playlistId: playlistId,
        resourceId: details
      }
    }
  }).execute();
}

以上两个功能相当标准,工作正常。但是,在addTheseVideosToPlaylist()中将多个视频添加到播放列表时,我遇到了问题。我有一系列有效的视频ID,对于每个id,我会将其添加到创建的播放列表中。问题是并非所有视频都添加到播放列表中,只添加了一个视频。

function addTheseVideosToPlaylist() {
  var links = [
    "wtLJPvx7-ys",
    "K3meJyiYWFw",
    "3TtVsy98ces"
  ]
  for(i = 0; i < links.length; i++) 
    addToPlaylist(links[i]);
}

总而言之,我成功创建了播放列表并向播放列表中添加了视频,但是当我尝试通过添加阵列中的每个链接将多个视频插入播放列表时,播放列表只包含一个视频。

如果有人知道如何解决这个问题,我感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

我知道这是一个老问题,但我想我现在明白为什么你需要增加延迟。您需要在发送下一个插入请求之前延迟每个插入请求。 我的解决方案是递归,只有当我从请求得到响应时才发送下一个请求直到数组结束

function addVideoToPlayList(pId, videosIdArray, index)
{
      var vId = videosIdArray[index];
      var details = {
            videoId: vId,
            kind: 'youtube#video'
      }

      var request = gapi.client.youtube.playlistItems.insert({
        part: 'snippet',
        resource: {
          snippet: {
            playlistId: pId,
            resourceId: details
          }
        }
      });
      request.execute(function(response) {
          console.log(response);

          if(videosIdArray.length == index+1)
          {
              //end! 
          }
          else{
              addVideoToPlayList(pId,videosIdArray,++index);
          }

        $('#status').html($('#status').html()+'<pre>' + JSON.stringify(response.result) + '</pre><br/>');
      });
}

如何调用此函数的示例:

addVideoToPlayList(destPlaylistId,videosIdArray,0);

答案 1 :(得分:3)

除了Rohan的回答,底部的函数调用应该是:

 function myLoop(video_id) {
         addToPlaylist(video_id);
         setTimeout(function() {
             counter++;
             if(counter < links.length)
                myLoop(links[counter]);
         }, 3000);
   }

它缺少“video_id”作为参数。

对我有用。

整个工作代码是:

    // global array holds links and a global counter variable
  var links = [
    "wtLJPvx7-ys",
    "K3meJyiYWFw",
    "3TtVsy98ces"
  ]
  var counter = 0;

function addVideosToPlaylist() {
    myLoop(links[0]);
}


     function myLoop(video_id) {
         addToPlaylist(video_id);
         setTimeout(function() {
             counter++;
             if(counter < links.length)
                myLoop(links[counter]);
         }, 3000);
   }

答案 2 :(得分:1)

一种解决方案是将每个插入的延迟添加到播放列表中。我不完全确定为什么需要延迟。

我正在使用setTimeout()的自定义循环; 使用延迟的示例实现:

// global array holds links and a global counter variable
  var links = [
    "wtLJPvx7-ys",
    "K3meJyiYWFw",
    "3TtVsy98ces"
  ]
  var counter = 0;

function addVideosToPlaylist() {
    myLoop(links[0]);
}


     function myLoop() {
         addToPlaylist(video_id);
         setTimeout(function() {
             counter++;
             if(counter < links.length)
                myLoop(links[counter]);
         }, 3000);
   }