检测轨道末端';s使用Spotify Web API/playback SDK播放
使用Spotify Web API和Web Playback SDK,是否有人知道一种检测曲目何时播放完毕(即歌曲结束)的好方法 我知道Web Playback SDK中有一个名为检测轨道末端';s使用Spotify Web API/playback SDK播放,spotify,Spotify,使用Spotify Web API和Web Playback SDK,是否有人知道一种检测曲目何时播放完毕(即歌曲结束)的好方法 我知道Web Playback SDK中有一个名为player\u state\u changed的事件,但该事件中提供的数据似乎对我帮助不大 在我的网络应用程序中,下一首要播放的歌曲是很自然地决定的。如果我能在当前曲目结束时确定它,那就太好了。因此,没有播放列表。取而代之的是,该应用程序会连续播放单曲,并在当前歌曲结束时确定下一首歌曲 同时,我在这里尝试使用以下代码
player\u state\u changed
的事件,但该事件中提供的数据似乎对我帮助不大
在我的网络应用程序中,下一首要播放的歌曲是很自然地决定的。如果我能在当前曲目结束时确定它,那就太好了。因此,没有播放列表。取而代之的是,该应用程序会连续播放单曲,并在当前歌曲结束时确定下一首歌曲
同时,我在这里尝试使用以下代码:
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(我还没有找到确切的位置和原因)。堆栈显示出dequeueUpdates/tryUpdate/\u processUpdate/\u appendUpdate。然而,我是一个初学者,我必须先学会如何处理Firefox调试器:) 您应该使用
player\u state\u changed
事件,查看正在播放的曲目,查看曲目是否已更改。您可以在playerStateObject.track\u窗口.current\u track
中找到当前曲目
可能的实现如下所示:
let currentTrack = '';
player.on('player_state_changed', state => {
if( state.track_window.current_track.id != currentTrack ) {
// The track changed!
currentTrack = state.track_window.current_track.id;
}
});
编辑:出于某种原因,这不再有效。检查我的另一个答案,它现在可以工作了 这是我的解决办法。它大部分时间都有效。事实上,在我能想象的任何情况下,我都没有把它弄坏。所以,保持最后一个状态并检查它是否变为暂停状态。希望Spotify能让我们的工作更轻松。如果他们愿意,那就太好了。这仍然比每隔1秒左右轮询他们的/me/player/当前正在播放的端点要好
this.player.addListener(
'player_state_changed',
state =>
{
console.log(state);
if(this.state && !this.state.paused && state.paused && state.position === 0) {
console.log('Track ended');
this.setTrackEnd(true);
}
this.state = state;
}
);
我的最后一个答案被打破了,所以我现在将添加新的解决方案,目前可以使用
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;
});
那么,和上一个解决方案有什么不同呢?我检查当前_曲目是否在前一曲目列表中。但现在位置检查出现了问题,因为在轨迹完全结束之前,当前轨迹似乎出现在前一个轨迹列表中。但在我的应用程序中,这并不是问题,因为命令总是有一些小的延迟。但如果之后第二次播放相同的曲目,这将失败。此外,在我的例子中,下一个轨道应该只在当前轨道结束时确定。因此,在您的示例中还没有“下一个”轨迹。我没有播放列表。我曾希望当播放结束/暂停时,当前曲目会变成空的,但事实并非如此。我将编辑我的问题,以显示我目前的处境。谢谢我用的是差不多一样的支票。不久前,他们的Github回购协议也出现了一个问题:请注意,有时会被多次解雇,我们会计算4次,有时会2次。