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

Can not insert multiple videos into a playlist - YouTube API v3

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

下面是我执行此操作的一种简单方法。函数 addTheseVideosToPlaylist() 正是我失败的地方。还显示了 createPlaylist() 和 addToPlaylist()。

有一个全局 playlistId 来跟踪创建的播放列表。

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]);
}

总而言之,我成功创建了播放列表并将视频添加到播放列表,但是当我尝试通过将每个 link 添加到数组中来将多个视频插入播放列表时,播放列表仅包含一个视频。

我该如何解决这个问题?

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

我也在使用自定义循环 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);
}

加上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);
}

我想我现在明白你为什么需要添加延迟了。您需要在发送下一个插入请求之前延迟每个插入请求。

我的解决方案是递归。只有当我收到请求的响应时,我才会发送下一个请求直到数组末尾:

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);