Невозможно вставить несколько видео в плейлист — 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)
        }
    });
}

Я добавляю видео в созданный плейлист с допустимым идентификатором видео, как показано ниже:

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(). У меня есть массив действительных идентификаторов видео, и для каждого идентификатора я добавлю его в созданный список воспроизведения. Проблема в том, что не все видео добавляются в плейлист, добавляется только одно видео.

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

В общем, мне удалось создать список воспроизведения и добавить видео в список воспроизведения, но когда я пытаюсь вставить несколько видео в список воспроизведения, добавляя каждую ссылку в массив, список воспроизведения содержит только одно видео.

Как я могу решить эту проблему?


person Rohan    schedule 22.02.2015    source источник


Ответы (3)


В дополнение к ответу Рохана вызов функции внизу должен быть:

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);
}
person Markus Bucher    schedule 30.03.2015

Кажется, теперь я понимаю, почему нужно добавить задержку. Вам нужно откладывать каждый запрос на вставку, прежде чем отправлять следующий.

Мое решение - рекурсия. Только когда я получаю ответ на запрос, я отправляю следующий запрос до конца массива:

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);
person visionix visionix    schedule 25.09.2016
comment
Это лучшее решение, поскольку требуемая задержка может зависеть от скорости соединения. Кроме того, если задержка недостаточна, видео добавляются несколько раз или пропускаются. - person DavisDude; 07.02.2017

Одним из решений является добавление задержки для каждой вставки в список воспроизведения. Я не совсем уверен, зачем нужна задержка.

Я также использую собственный цикл с 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);
}
person Rohan    schedule 24.02.2015