我正在尝试制作一个将加载给定Youtube播放列表并从中播放随机视频的网页.
在我运行时,我正在努力从API获取播放列表信息
player.getPlaylist()
API每次都会返回一个元素数组(当前提示的视频),无论提示的视频或播放列表如何.
我的JavaScript是API文档中几乎100%的复制/粘贴内容,我无法弄清楚为什么无法在播放列表中获得完整的视频列表.
<script>
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode
.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
playerVars: {
listType: 'playlist',
list: 'PLbIZ6k-SE9SiarIg09JXUdK2kDX5_OB25',
autoplay: 0,
controls: 1
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(event) {
console.log(event.target.getPlaylist());
}
var done = false;
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.ENDED && !done) {
done = true;
console.log('Video Finished');
stopVideo();
}
}
function stopVideo() {
player.stopVideo();
}
</script>
有人可以伸出援手指出我的错误或正确的方向吗?
解决方法:
以这种方式加载时,播放列表似乎并没有提示,只有第一个视频提示. getPlaylist()仅返回一个视频,并且播放器加载后不会触发onStateChange事件来确认这一点.
但是,我们可以使用cuePlaylist()强制播放器提示播放列表.在此JSFiddle中可以看到以下内容.
我们修改构造函数以不加载任何内容:
playerVars: {
autoplay: 0,
controls: 1
},
我们修改onPlayerReady()来提示播放列表:
function onPlayerReady(event) {
event.target.cuePlaylist({
listType: 'playlist',
list: 'PLbIZ6k-SE9SiarIg09JXUdK2kDX5_OB25',
});
}
我们修改onPlayerStateChange()以检查CUED状态并在触发时获取播放列表:
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.CUED) {
console.log(event.target.getPlaylist());
}
if (event.data == YT.PlayerState.ENDED && !done) {
done = true;
console.log('Video Finished');
stopVideo();
}
}
之后控制台输出以下内容:
Array [ "j_OyHUqIIOU", "PK8dsAeMmPk", "lfvceHUBWnU", "Xz5z1hBxejg",
"OubvTOHWTms", "5WKU7gG_ApU", "XjwO9InuFJk", "lNqChN3WHh8" ]