我正在尝试使用PHP中的curl_multi创建播放列表并添加播放列表。我需要使用多个请求的原因是该过程似乎需要花费很长时间才能添加(最多)200个播放列表项目并在我们的平台上达到30秒超时(我无法更改)。
多卷曲请求工作正常,而且非常快,但我从YouTube回来的回复显示播放列表会相互覆盖 - YouTube生成的id参数对于多个项目是相同的,并且position属性是相同的不同的要求。因此,在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
我想要实现的目标之一是:
任何指针都会非常感激。
干杯
答案 0 :(得分:0)
这是API的一个“已知”问题,它已经在过去被提交为缺陷。但是,它不再是一个开放的缺陷问题。但问题尚未解决,但通过减少故障可以略微改善。也许将其作为增强功能提交给您提出可能更好的结果。 (例如,API必须100%确保所有有效的videoId实际上都存在于播放列表中,方法是通过内部检索进行“验证”。这比您可以做的更快,因为您不必发送额外的请求。)在每个请求之间添加延迟应该可以减少故障。 您可以在此处提交增强或缺陷(检查后,如果尚未提交): https://code.google.com/p/gdata-issues/issues/list?q=label:API-YouTube
答案 1 :(得分:0)
作为一种解决方法,我将视频分批分组,其中包含来自每个播放列表的视频。因此,如果您有5个播放列表,则第一批将包含5个视频,每个播放列表中的第一个视频,依此类推。这不是一个很好的解决方案,但它比没有批处理要好。
对于分组在40个播放列表中的~1000个视频,插入操作快6倍。 此处还有为Youtube API团队提交的issue。
希望它有所帮助。
答案 2 :(得分:0)
您看到的问题与播放列表位置有关。由于插入请求是异步的,因此以下请求将覆盖先前的请求。
我试图通过执行请求的瀑布来解决此问题(等待上一个请求完成)。
答案 3 :(得分: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);
}
});
}