播放列表项批量插入 YouTube API v3


Playlistitems batch insert YouTube API v3

我正在尝试创建一个播放列表并使用 PHP 中的 curl_multi 添加播放列表项。我需要使用多请求的原因是该过程似乎需要很长时间才能添加(最多)200 个播放列表项目,并在我们的平台上达到 30 秒超时(我无法更改)。

multi curl 请求工作正常,而且非常快,但我从 YouTube 返回的响应显示播放列表项正在相互覆盖 - YouTube 生成的 id 参数对于多个项目是相同的,并且对于不同的请求,位置属性是相同的。因此,从 200 个请求中,我的播放列表中大约有 130 个成功的播放列表项目。

为了尝试解决方法,我在构造请求时设置了 snippet.position,但这也不起作用,因为我怀疑我无法将项目添加到不是现有播放列表项目位置增量的位置。

我一直在寻找解决方案,这似乎是一个已知问题

https://groups.google.com/forum/#!msg/google-api-javascript-client/9Qdf0LCYSZs/MOcYxFKtWMQJhttps://stackoverflow.com/questions/14310562/how-to-correctly-use-google-api-python-clients-batchhttprequest

我想要实现的是:

  • v3 中的一个选项(我可能错过了)用于将多个播放列表项批量插入播放列表。似乎可以在 v2 中添加多个条目,但不能在 v3 中添加。
  • 一种确保我的多卷曲请求不会相互覆盖的方法
  • 添加播放列表项作为构建播放列表的一部分

任何指示将不胜感激。

干杯

这是 API 的"已知"问题,过去已经作为缺陷提交。但是,这不再是未解决的缺陷问题。但是问题还没有解决,只是通过减少失败而略有改善。也许将其作为增强功能提交,您可以在其中提出可能更好的结果。(例如,API 必须通过内部检索进行"验证",确保播放列表中实际存在所有有效的 videoId。这比您可以做的更快,因为您不必发送额外的请求。在每个请求之间添加延迟应该可以减少失败次数。您可以在此处提交增强或缺陷(检查后,如果尚未提交):https://code.google.com/p/gdata-issues/issues/list?q=label:API-YouTube

作为一种解决方法,我将包含每个播放列表中的视频的视频分组为批次。因此,如果您有 5 个播放列表,第一批将包含 5 个视频,每个播放列表中的第一个视频,依此类推。这不是一个很好的解决方案,但总比没有批处理要好。

对于分组在 40 个播放列表中的 ~1000 个视频,插入操作速度提高了 6 倍。这也是向Youtube API团队提交的问题。

希望对您有所帮助。

您看到的问题与播放列表位置有关。由于插入请求是异步的,因此以下请求将覆盖上一个请求。

我正在尝试通过执行请求瀑布(等待上一个请求完成)来解决此问题。

在 JavaScript 中,递归函数的工作原理请参阅以下答案。https://stackoverflow.com/a/39687078/4254357

基于这个答案,我可以通过调用此函数一次在播放列表中添加多个视频(60 个项目)。 值得尝试递归函数。

    function AddSong(addingVideoIds, idx, addingPlaylist_id) {
        gapi.client.request({
            path: '/youtube/v3/playlistItems?part=snippet',
            method: 'POST',
            body:JSON.stringify({
                snippet: {
                    playlistId: addingPlaylist_id,
                    position: 0,
                    resourceId: {
                        videoId: addingVideoIds[idx],
                        kind: 'youtube#video'
                    }
                }
            })
        }).then(function(response) {
            jsonObj = response.result;
            $(".status").append("<span style='font-weight:bold;'>" + jsonObj.snippet.title + "</span><br/>");
            if (idx < addingVideoIds.length) {
                AddSong(addingVideoIds, ++idx, addingPlaylist_id);
            } else {
                $(".status").append("idx: " + idx);
            }
        }, function(reason) {
            $(".error").append("[" + addingVideoIds[i] + "]" + reason.statusText + "<br/>");
            if (idx < addingVideoIds.length) {
                AddSong(addingVideoIds, ++idx, addingPlaylist_id);
            } else {
                $(".status").append("idx: " + idx);
            }
        });
    }

https://github.com/konbuerimaki/text2playlist