Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测轨道末端';s使用Spotify Web API/playback SDK播放_Spotify - Fatal编程技术网

检测轨道末端';s使用Spotify Web API/playback SDK播放

检测轨道末端';s使用Spotify Web API/playback SDK播放,spotify,Spotify,使用Spotify Web API和Web Playback SDK,是否有人知道一种检测曲目何时播放完毕(即歌曲结束)的好方法 我知道Web Playback SDK中有一个名为player\u state\u changed的事件,但该事件中提供的数据似乎对我帮助不大 在我的网络应用程序中,下一首要播放的歌曲是很自然地决定的。如果我能在当前曲目结束时确定它,那就太好了。因此,没有播放列表。取而代之的是,该应用程序会连续播放单曲,并在当前歌曲结束时确定下一首歌曲 同时,我在这里尝试使用以下代码

使用Spotify Web API和Web Playback SDK,是否有人知道一种检测曲目何时播放完毕(即歌曲结束)的好方法

我知道Web Playback SDK中有一个名为
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次。