网易云音乐歌单共享

背景需求

网易云音乐只支持收藏歌单,比如 A 可以收藏 B 的歌单,B 可以对歌单进行增删,A 收藏的歌单也发生相应的变化

但如果想实现 A 和 B 都可以对歌单进行增删就行不通了,因为网易云音乐不支持这个功能

如果 A 建一个歌单,B 建一个歌单,然后互相收藏就太蠢了

所以目前已知的背景就是:

  1. 只能对自己创建的歌单进行增删歌曲
  2. 无法对收藏的他人的歌单进行增删歌曲
  3. 收藏的歌单被创建者更新时,收藏者可以得到相应的更新

需求就是:

  1. 有且只有一份共享的歌单
  2. 对共享歌单的增删操作要简单

需求分析

动动脑筋,可以换个角度实现共享功能:

  1. 新申请一个帐号 C,C 创建一个歌单
  2. A 和 B 共同收藏 C 歌单
  3. A 和 B 各自新建一个歌单
  4. A 平时只对自己创建的歌单进行增删歌曲,B 亦然
  5. 利用脚本从 A 和 B 的歌单读取所有歌曲并整合,最终更新到 C 的歌单
  6. A 和 B 就能从 C 歌单中得到最全的歌曲,以此实现共享歌单的功能

功能实现

知道了原理之后,其实最难的是第五步

其实只要网易云音乐提供了相应的 API 即可,Google 之后发现已经有轮子可以用了:网易云音乐 API

然后根据 API 写脚本代码了,脚本的逻辑如下:

  1. 抓取 A 的歌单歌曲,抓取 B 的歌单歌曲,抓取 C 的歌单歌曲
  2. 对 A 和 B 的歌曲进行合并并去重
  3. 去重的结果与 C 对比,得到此次应该添加和删除的歌曲列表
  4. 登录 C 帐号,对 C 的歌单进行添加操作和删除操作

最后,用 crontab 定时触发抓取的逻辑即可

Show me the code

关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 抓取 A 的歌曲
FooSongList = fetchSongList(RootUrl+FetchSongListUrl+FooSongListId)
// 抓取 B 的歌曲
BarSongList = fetchSongList(RootUrl+FetchSongListUrl+BarSongListId)
// 抓取 C 的歌曲
OurOldSongList = fetchSongList(RootUrl+FetchSongListUrl+OurSongListId)

// 对 A 和 B 的歌曲进行合并并去重
ourNewSongList = list(set(FooSongList+BarSongList))
print("ourNewSongList:")
print(ourNewSongList)

// 去重的结果与 C 对比,得到此次应该添加的歌曲列表
songListToAdd = list(set(ourNewSongList)-set(OurOldSongList));
print("songListToAdd:")
print(songListToAdd)

// 去重的结果与 C 对比,得到此次应该删除的歌曲列表
songListToDel = list(set(OurOldSongList)-set(ourNewSongList));
print("songListToDel:")
print(songListToDel)

// 登录 C 帐号,对 C 的歌单添加此次新增的歌曲
if len(songListToAdd):
syncSongsToOurSongList(songListToAdd, "Add")

// 登录 C 帐号,对 C 的歌单删除此次删除的歌曲
if len(songListToDel):
syncSongsToOurSongList(songListToDel, "Del")

完整项目地址

后记

跟其他 技术改变生活 系列的文章一样,依然是那句话

至此,虽然是简简单单的功能,但是,it makes my world better.

一杯冰可乐