用 Workflow 从网易云音乐迁移数据至 Apple Music 或 Spotify

请注意,本文编写于 829 天前,最后修改于 62 天前,其中某些信息可能已经过时。

注意:由于网易云音乐使用的 API 时常变动,文中 Workflow 无法使用时,请在本文下面留言,并附上具体的无法使用的链接,我看到后会尽快排查。另外因为学业繁忙,可能处理不是很及时,还请谅解

2017 年 11 月 29 日更新:修改了转移歌单所使用的网易云音乐 API。新的 Workflow 链接:网易云音乐➡️ Apple Music

关于音乐平台的选择,通常可以分为两类人:一是只关心纯净的聆听体验,这类人的音乐平台是Apple MusicSpotify 等;二是在前者之外还喜欢有一些社交元素,比如在评论区参与讨论,这类人的音乐平台则是网易云音乐、虾米等。我之前一直在使用网易云音乐,直到我慢慢意识到听歌是一件非常私人的事,纯净的聆听体验于我可能更重要。

前段时间 Apple Music 推出了针对大学生的特价活动,再加上 Apple Music 相对全面的曲库,想必很多人心里已经在痒痒了,跃跃欲试;另一方面 Spotify 在音乐爱好者之间口碑一向不错,高质量的推荐和基于场景的歌单符合许多人对优秀播放器的定义。但即使这样,我也难以做到从网易云音乐无痛转移,原因则是我在网易云音乐收集的大量歌单。歌单对很多人都很重要,经过长时间聆听、筛选,最终留下来的一定是最能体现自己音乐品味的那部分。这篇文章就为这样一群人而写:想要尝试新的平台、但是无论如何不能放弃自己的珍藏的这群人。

转移大量的音乐,一首一首手动添加自然是不行,这里介绍借用自动化工具 Workflow 和 IFTTT 进行迁移的方法。

如何将歌单转移到 Apple Music

先将 Workflow 链接放到这里: 网易云音乐➡️ Apple Music

使用时在网易云音乐客户端里复制歌单分享链接,然后运行这个 Workflow。

分析

取得对应歌单信息的最好方法是利用平台的 API,API 信息查询官方文档一般能找到。对网易云音乐来说,可以用以下 API 获得歌单信息。

GET http://music.163.com/api/v3/playlist/detail?id=歌单ID&n=5000

这个 API 里只有一个未知参数:歌单 ID 。这个 ID 也很容易取到,我们给别人发送歌单链接的时候,复制出来的链接都是这样的形式:

iOS版:http://music.163.com/playlist/437754500/45408568?userid=45408568
桌面版:http://music.163.com/#/m/playlist?id=437754500&userid=45408568

对比这二者,在 Playlist 后面都能发现一串数字,这就是歌单 ID。在实际的情况中,歌单位数不一定是 9 位,可能是其它位数「感谢微博上的 @Mini_Goooo」。取数的方法很多,可以用 Split Text 按照 / 一个个截断再选择到目标,这里用更简单高效的正则匹配的方法,也就是使用 Match Text 这个动作,Pattern填正则表达式:

\d{4,11}

这个表达式的意思就是取得字串中连续的 4 到 11 位数字。这样取的原因是可以避开前面的的 163,也能囊括目前我遇到的大部分歌单 ID,如果你要转移的歌单 ID 位数不在这个范围内,对应修改上面括号内的数使之符合你的歌单 ID 位数即可。URL 的格式是歌单 ID 在前面,取第一个结果也就取得了歌单 ID。

006tLtW4jw1fap2x593h4j30ko0k8ta9.jpg
006tLtW4jw1fap2x593h4j30ko0k8ta9.jpg

重写 API 到这里:

GET http://music.163.com/api/v3/playlist/detail?id=歌单ID&n=5000

在这个 URL 后面跟上 Get Contents of URL,Method 选择 GET,运行成功将返回 JSON 格式的数据块。我们只用关注里面的几个 Key:

  • playlist,里面包含了返回的歌单数据;
  • playlist 下名叫 name 的 key ,里面包含了歌单名称;
  • playlist 下名叫 tracks 的 key , 里面包含了每首歌的信息;
  • tracks 下又有一个名叫 name 的 key ,里面包含的是歌曲名;
  • tracks 下名叫 ar 的 key ,里面包含歌曲的演奏者。

这些信息在 Apple Music 里创建歌单以及添加歌曲时都会用到。所以用多个 Get Dictionary Value 来取出来。这里解释一下为什么 ar 要取 First Item,这是因为有的歌曲演奏者不止一个,为了防止在运行过程中需要手动选择哪一个,就索性只用第一个演奏者。在实际的 iTunes 匹配时一个演唱者也够了。

需要遍历的是歌曲,歌曲信息包含在 tracks 里,于是我们需要在 tracks 后面跟上 Repeat With Each ,对每首歌都分别取得歌曲名和演奏者,然后在 iTunes 里匹配,取得的结果添加到Apple Music 里,这就是基本逻辑。这里要指出在使用前请保证 Search iTunes Store 里的 Country 要和你的 Apple Music 的所在区域对应,否则会报错。

在实际的应用中,有可能出现匹配不到歌曲的情况,这种情况我们也要处理。这里借用了我之前在微博上看到的一个 Workflow 的思路,来源记不清了。总的来说如果没有找到歌曲,Search iTunes Store 这一步必然不返回结果,于是在这一步后面接上一个 Count Items ,如果值等于 0 ,那就在失败记录里添上一条;如果值不等于零就执行添加到 Apple Music 的动作。 Workflow 结束的地方再把这个失败记录展示出来,便于后期再手动添加。整个 Workflow 就解析到这里。

006tLtW4jw1fadzkmfz2rj30ku1ysn3q.jpg
006tLtW4jw1fadzkmfz2rj30ku1ysn3q.jpg

注意事项与存在的问题

经反应有人会遇到这些问题,我把我现在听说过的总结一下。

  • 提示遇到「未知错误」请检查 Workflow 是否有权限访问你的 Apple Music 资料库,并保证 Search iTunes Store 里的 Country 与你的 Apple Music 所在区域一致。
  • 提示「The requested operation is not enabled for this device」这应该是一个 Apple Music 方面的 Bug,你可以尝试重启你的设备,或者关闭再重新开启 iCloud 音乐资料库。一般来说尝试这两步后就能解决。
  • Workflow 中途停止检查你要转移的歌单 ID 位数是否出现了我前文说到的问题,另外这个 Workflow 是用来迁移歌单的,不适用于单曲。适用单曲的版本请看文末。

网易云音乐是做得很好的国内音乐平台,但由于一些历史遗留原因,歌曲信息有不少错误、缺失、张冠李戴的情况,再加上 Apple Music 自身的曲库问题,歌曲匹配不到的可能性还是很高的。如果你的 Apple Music 是中区的,平常用网易云音乐听的歌又比较小众,失败率就进一步升高。这一点我也没有办法,只能靠这俩公司自己去完善自己的数据库。

==由于我不再使用 Spotify,因此以下有关 Spotify 的内容暂时不会再更新。内容可能过时,但原理是不会变的,还请自助排查。==

如何将歌单转移到 Spotify

分析

有了上文的铺垫,我们已经能够获取到歌单信息了。但是如果要转移到的是 Spotify 还有一点困难:Workflow 中没有对应的 Spotify 的动作。这里可以借助 IFTTT 来完成,用 IFTTT 其实有好处,就是运行速度比较快。

首先使用 Workflow 获取到歌单的歌单名称,每首歌的歌曲名和每首歌的演唱者,一首一首地传入 IFTTT。

Workflow 链接:网易云音乐 ➡️ Spotify

006tLtW4jw1fajsuxcuu3j31kw16odqq.jpg
006tLtW4jw1fajsuxcuu3j31kw16odqq.jpg

然后在 IFTTT 中制作一个 Applet,触发条件就是 Workflow 中的 trigger,执行动作是添加到 Spotify,对应填入歌单名,歌曲名和歌手。点击 Workflow 中 Trigger IFTTT Applet 这一步中的 Create Recipe,跳转到 IFTTT 中,如图填写信息即可。

006tLtW4jw1fajt41sqsaj315k16gdlt.jpg
006tLtW4jw1fajt41sqsaj315k16gdlt.jpg

Bonus:如果要转移单曲呢?

经过了前面的分析和实践,转移单曲也是很简单了,不过是改变一下使用的 API 和解析数据的方式。

转移网易云音乐单曲到 Apple Music

Workflow 链接:网易云音乐 ➡️ Apple Music 单曲版

使用方式,在网易云音乐里复制单曲分享链接,然后运行这个 Workflow。如果添加失败将会将这首歌的信息放进你的提醒事项,方便你后续手动再添加。

转移网易云音乐单曲到 Spotify

Workflow 链接:网易云音乐 ➡️ Spotify 单曲版

同样需要借助 IFTTT 来添加歌曲。在 Workflow 中取得歌曲信息后如图设置 Trigger:

006tLtW4jw1fap31ifh24j30ku0gs764.jpg
006tLtW4jw1fap31ifh24j30ku0gs764.jpg

然后点击 Create Recipe 跳转到 IFTTT 里创建对应的 Applet 即可。

006tLtW4jw1fap32bq9tzj315y112qal.jpg
006tLtW4jw1fap32bq9tzj315y112qal.jpg

结语

Apple Music、Spotify、网易云音乐三家各有所长,分享本文的目的是希望大家能更无障碍地愉快玩耍。

另一方面,Workflow 于我而言是能力非凡的自动化工具,工具放在这里,能做到什么事还是看使用者的能力和脑洞。学习成本是有的,不过当用这个工具真正实现了自己的需求,成就感无与伦比。

祝大家在音乐世界玩得开心~

Comments

添加新评论

已有 41 条评论

网易到 Spotify 现在用捷径还能实现吗?触发ifttt applet 此操作当前不可用

不能触发 ifttt 的话文章里的方法就是无效的。

感谢博主提供的捷径,但是我遇到了“所请求的操作在此设备上未启用。”是什么原因?

这是很久以前就有的 bug,现在已知的一种方法是关闭再重新开启 iCloud 音乐资料库。

“Expected 647198652 to be of class NSNumber but got NSTaggedPointerString Value did not match expected type”感觉应该是从iTunes返回的数据格式和类型有所变化,捷径应用未能正确解析和匹配 不仅仅是搜索iTunes应用 App Store搜索应用也是一样的

从他的报错信息来看就是这样

感谢博主的辛勤劳动。但在运行途中出现了“Expected 647198652 to be of class NSNumber but got NSTaggedPointerString Value did not match expected type”然后就无法继续进行了。
请问是否有解决办法呢?
我在用的是ios12.0.0的机器

熊猫小A 熊猫小A 回复 @JCheck

#comment-590,这应该是 shortcuts 应用自身的问题,我目前没办法修复。

也遇到了Expected 471744 to be of class NSNumber but got NSTaggedPointerString (Value did not match expected type)。经排查发现是‘search iTunes Store’这一步的问题,现在的情况是新开一个shortcut,里面只放这一个模块随便搜一些东西都会遇到这个问题

谢谢你的反馈,我看了一下,确实如此。这也许是 shortcut 自身的问题,我应该没办法解决……

厉害了博主 厉害了博主

每一篇都很用心。

熊猫小A 熊猫小A 回复 @厉害了博主

谢谢~

您好,请问一下“ Expected 471744 to be of class NSNumber but got NSTaggedPointerString (Value did not match expected type)”,这个是什么原因呢?
iOS 12,最新版「捷径」,使用的是您17年更新的那个 Workflow。
麻烦了!

熊猫小A 熊猫小A 回复 @Florxy

你好,是否所有歌单都会出现这个问题呢?
这看上去像是捷径或者 iOS 的问题,我需要排查一下,能把出问题的歌单链接给我吗?

Florxy Florxy 回复 @熊猫小A

谢谢您的回复!由于我就这一个歌单想转到 Apple Music,所以我没试过其他歌单,但是我试过之前您提供的单曲转换的 Workflow,也不行。
歌单如下:http://music.163.com/playlist/4645563/3544585?userid=3544585
感谢!

FINVOLA FINVOLA 回复 @熊猫小A

我也出现了欸

yuhao yuhao 回复 @Florxy

同遇到了这个问题!

熊猫小A 熊猫小A 回复 @Florxy

似乎是 shortcut 自身的问题,见#comment-590

Florxy Florxy 回复 @熊猫小A

那好吧,依然谢谢博主了!

熊猫小A 熊猫小A 回复 @Florxy

不谢,静待苹果修复吧~

你好,我在使用您的 Workflow 时,无论是单曲版还是歌单版都会提示 "The requested operation is not enabled for this device.",在尝试 开关 iCloud音乐资料库、重启机器 后依然会提示 "The requested operation is not enabled for this device.",请问还有其它方法吗?
系统环境 10.3.3,Workflow 1.7.8(508),使用的 Workflow 为本页面提供的最新版本。
谢谢

你好,我刚刚测试了一下,在我的设备(iOS 11.3.1)上是可以正常运行的。这个问题基本上可以确定是 iOS 或者 Workflow 的 bug,但我目前没有 iOS 10 的设备,没办法调试。但大部分遇到这个问题时开关 iCloud 音乐资料库就可以解决问题,我也没有别的更好的办法,抱歉 (ó﹏ò。)

uts uts 回复 @熊猫小A

好吧23333 我会再去试下的。 Thank you all the same~

张若琛 张若琛

您好,我的会显示the requested operation is not enabled for this device,是哪里有问题么

熊猫小A 熊猫小A 回复 @张若琛

应该是 Apple Music 或者 Workflow 的 bug,在 设置 - 音乐 里,把 iCloud音乐资料库关闭再重新开启试试。

get dictionary value那里有问题。跳出一个选项 全都是metadata,点了之后就停了

熊猫小A 熊猫小A 回复 @hanzhen

麻烦提供一下歌单链接

  1. 1
  2. 2