使用Spotify API创建组广播电台

我的许多同事在工作中都使用Spotify,多年来,我一直在寻找一款应用程序,该应用程序可以播放来自多个帐户的音乐,并在每个人的最爱之间交替播放。 我从来没有找到可以实现这一目标的工具。

几周前,我终于决定自己构建一些东西。

目标? 一个办公室范围的广播电台,播放每个人的音乐。 或者换句话说,是一个主播放列表,该播放列表从Spotify上的不同贡献者帐户中提取歌曲。

输入Spotify API

自2014年以来,Spotify已在加拿大上市,并提供免费的,广告支持的音乐流媒体服务。 Spotify的一大优点是其开放的API,可让您轻松查看和修改播放列表。

借助于一个简单的PHP包装器(https://github.com/jwilsson/spotify-web-api-php),我能够创建一个接口来通过其API与Spotify进行交互。 包装器不存储或播放任何音乐; 它只是一个从Spotify请求数据,重新组织数据并将其发送回的工具。

步骤1:验证

在Spotify允许您访问其数据之前,您需要进行身份验证(与大多数API一样)。 Spotify遵循惯例,并通过oAuth使其非常容易。

首先,我登录了我的Spotify开发人员帐户并创建了一个新应用。 我授权了一个指向我的应用程序的回调URL,该URL指示身份验证完成后Spotify应该重定向到的位置。

Spotify会为您创建的每个新应用程序生成两个重要的凭据:客户端ID和客户端密钥。 返回我的PHP包装器代码,我添加了此回调URL以创建新的会话,并将这些凭证作为变量CLIENT_ID和CLIENT_SECRET插入:

  $ session =新的SpotifyWebAPI \ Session(CLIENT_ID,CLIENT_SECRET,$ callback_url); 

接下来,我传递了应用程序所需范围的列表。 范围指示应用程序将访问哪些数据以及用户将需要授予哪些权限。 在这种情况下,必需的范围是“读取”和“修改”。

打包后,便可以获取授权URL,检索授权代码,请求访问令牌,最后使用访问令牌访问Spotify API。

  if(isset($ _ GET ['code'])){ 
$ session-> requestAccessToken($ _ GET ['code']);
$ access_token = $ session-> getAccessToken();
$ api =新的SpotifyWebAPI \ SpotifyWebAPI();
$ api-> setAccessToken($ access_token);
}其他{
$ scopes =数组(
“播放列表读取为私有”,
“用户只读”,
“播放列表-修改-私人”,
“播放列表-修改-公开”,
“播放列表读取专用”
);
$ authorize_url = $ session-> getAuthorizeUrl(array(
'scope'=> $ scopes
));
header('Location:'。$ authorize_url);
}

步骤2:提取使用者播放清单

至此,我的应用程序已可以访问用户播放列表,但尚未开始从中提取曲目信息的工作。

首先,我创建了一个变量来存储将要添加到主播放列表的每个用户的用户名。 我还创建了变量COMMON_PLAYLIST来存储公共播放列表标题。 每个贡献者都使用此变量来为包含他们希望共享的歌曲的播放列表添加标题。

该应用程序遍历用户名列表,在每个用户的播放列表中搜索标题与COMMON_PLAYLIST变量匹配的播放列表。 该播放列表中的任何曲目都可以从应用程序中提取。

  $ user_playlists = $ api-> getUserPlaylists($ user); 
if(!empty($ user_playlists)){
foreach($ user_playlists-> items as $ playlist){
if($ playlist-> name == COMMON_PLAYLIST)){
$ tracks = $ api-> getUserPlaylistTracks($ user,$ playlist-> id);
if(!empty($ tracks)){
foreach($ tracks-> items as $ track){
$ user_tracks [$ user] [] = $ track-> track-> id;
}
}
}
}
}

步骤3:建立主要播放清单

在这一点上,我拥有一系列用户,并且为每个用户提供了他们贡献的曲目的播放列表。 现在,我需要通过从每个用户的列表中随机抽取曲目来建立主播放列表,直到没有曲目离开为止。

关键是每个用户一次选择一个曲目,这样每个人都轮流播放一首歌曲。 我通过创建一个主播放列表(一个空数组),然后循环浏览每个用户的播放列表,随机选择一首歌曲并将其添加到主播放列表来完成此操作。 将曲目添加到主播放列表后,该曲目将从该用户的曲目数组中删除。

  $ master_playlist = array(); 
while(!empty($ user_tracks)){
foreach($ user_tracks as $ user =>&$ tracks){
$ random_track_key = mt_rand(0,count($ tracks)-1);
$ master_playlist [] = $ tracks [$ random_track_key];
未设置($ tracks [$ random_track_key]);
$ tracks = array_values($ tracks);
if(empty($ user_tracks [$ user])){
未设置($ user_tracks [$ user]);
}
}
}

步骤4:将主要播放列表添加到Spotify

现在,我有了一个主播放列表数组,其中包含每个人的歌曲。 最后的任务是将列表重新放回Spotify,以便可以播放曲目。

我使用Spotify API访问我在自己的帐户上创建的COMMON_PLAYLIST播放列表,并将其内容替换为主播放列表数组中的歌曲。

  $ playlists = $ api-> getMyPlaylists(); 
foreach($ playlists-> items as $ playlist){
if($ playlist-> name == COMMON_PLAYLIST){
$ api-> replaceUserPlaylistTracks($ playlist-> owner-> id,$ playlist-> id,array_filter($ master_playlist));
}
}

结果是一个Spotify播放列表,其中填充了我的同事所贡献的所有歌曲。

此时,只需要打开Spotify,吸引一些体面的扬声器并播放所有人的歌曲以供所有人收听,就可以了。

有什么问题吗

推特:@joeuttaro
http://joeuttaro.com