使用Spotify Web API/Playback SDK检测曲目的播放结束 [英] Detect end of a track's playback with Spotify Web API / Playback SDK

查看:18
本文介绍了使用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检测曲目的播放结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆