本文介绍了使用Spotify Web API/Playback SDK检测曲目的播放结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用Spotify Web API和Web Playback SDK,有谁知道检测曲目播放何时结束(即歌曲结束)的好方法?
我知道Web播放SDK中有一个名为player_state_changed
的事件,但事件中提供的数据似乎对我帮助不大。
在我的Web应用程序中,下一首要播放的歌曲是相当自发地确定的。这将是很好的,如果我可以确定它,当目前的轨道已经走到了尽头。因此,没有播放列表。相反,该应用程序会连续播放单曲,并在当前歌曲结束时确定下一首歌曲。
同时,我在下面的代码中尝试:
var bCallingNextSong = false;
player.addListener('player_state_changed', state => {
if (state != null &&
state.position == 0 &&
state.duration == 0 &&
state.paused == true) {
if (!bCallingNextSong) {
playNextSong();
}
}
});
function playNextSong() {
$.ajax({
url:"playback.php", //the page containing php script
type: "post", //request type,
dataType: 'json',
data: {action: "next", device: deviceId},
success: function(result) {
bCallingNextSong = false;
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
bCallingNextSong = false;
}
});
}
和playback.php
中:
switch ($action) {
case "next":
//some blackbox magic here to determine next song, do logging etc.
//but for now just play the same song over and over
$api->play($deviceId, ['uris' => "spotify:track:0eGsygTp906u18L0Oimnem"],]);
echo json_encode(array("answer"=>"played next"));
break;
// more code
}
然而,这经常(但不总是)抛出InvalidStateError(我还没有找到确切的位置和原因)。堆栈显示dequeeUpdates/tryUpdate/_process Update/_appendUpdate。然而,我还是一个初学者,我必须首先学习如何处理Firefox调试器。:)
推荐答案
我的上一个答案错误,所以我现在将添加新的解决方案,这些解决方案暂时有效。
this.player.addListener('player_state_changed', (state) => {
console.log(state);
if (
this.state
&& state.track_window.previous_tracks.find(x => x.id === state.track_window.current_track.id)
&& !this.state.paused
&& state.paused
) {
console.log('Track ended');
this.setTrackEnd(true);
}
this.state = state;
});
那么与上一个解决方案有什么不同呢?我检查Current_Track是否在以前的曲目列表中。但现在位置检查出现了问题,因为在曲目完全结束之前,当前曲目似乎出现在先前曲目列表中。但在我的应用程序中,这不是问题,因为命令总是会有很小的延迟。
这篇关于使用Spotify Web API/Playback SDK检测曲目的播放结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!