3

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

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

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

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

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

我想要实现的是:

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

任何指针将不胜感激。

干杯

4

4 回答 4

0

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

于 2013-09-16T09:24:38.927 回答
0

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

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

希望能帮助到你。

于 2013-11-14T12:41:55.007 回答
0

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

我试图通过做一个请求瀑布来解决这个问题(等待上一个请求完成)。

于 2015-08-31T21:16:24.540 回答
0

在 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

于 2017-05-11T17:32:56.080 回答