Spothiefy:如何免费快速地从Yandex.Music迁移

因此,在7月,该国的生活终于开始好起来,因为发生了许多人都期待的事情:Spotify在俄罗斯和其他几个国家推出



但是流媒体音乐昨天没有出现,可以肯定的是,有些人沉迷于Yandex并订阅了Yandex.Music,后来又成为Yandex.Plus。



聆听歌曲变得很方便,选择者学会了选择好的曲目,这导致了包含播放列表和其他需要在新服务中重新添加的便利内容的库的积累。



如果您想尝试,但是太懒了,那么我将告诉您如何免费快速搬运行李。您只需要几个带电池的蟒蛇。



彼得和Spotifai封面



注意!
, .



, . , . .

.



Spotify , . , . , - .



— , . - ., - Spotify. , - , 144 / Ogg Vorbis.



, .



/ .



在简单的设备的帮助下,几天之内,我设法在Spotify中创建了一个音轨进口商,而没有花钱购买soundiiz,这由于某种原因突然增加了负载。



但是有细微差别。



API



Spotify为其Web API服务提供了某种文档,包括用于将播放列表和收藏夹添加到其库的API。



反过来,Yandex.Music没有公共API ,但是也许竞争会促使它们继续提供对第三方开发人员的访问权限,因为这是必要,方便和有用的。

因此,这里我们将走一点弯路,并使用具有可疑声誉的技巧。



那Deezer呢?
Deezer, , API . Python, .





Spotify



这里的一切都很简单。要成为开发人员,您需要在控制台中获取应用程序密钥

他们将为Redirect URIOAuth提供添加,任何人都可以安装。仅一次为多个人提供服务的服务才需要它,但是在我们的情况下,一切都在本地发生。



Yandex音乐



您需要帐户的用户名和密码,但是如果启用了两因素身份验证,则需要从Yandex.Key指定Yandex.Password。



申请操作



我不想停止运行Python应用程序,部署虚拟环境等,因此,我将介绍导入的工作方式。在文章末尾使用程序代码链接到存储库



来自所有平台的API的轨道采用不同的格式,因此它们以最少的必需属性集转换为相同的表示形式:



class Track:
    title = property(lambda self: self.__title)
    album = property(lambda self: self.__albums[0] if len(self.__albums) > 0 else None)
    artist = property(lambda self: self.__artists[0] if len(self.__artists) > 0 else None)

    albums = property(lambda self: self.__albums)
    artists = property(lambda self: self.__artists)


播放列表(包括收藏夹)也具有相同的格式,并包括曲目的迭代器,以方便在循环中使用:



class Playlist:
    class __iterator:
        def __init__(self, playlist):
            pass  #   
        def __next__(self):
            pass  #   

    title = property(lambda self: self.__title)
    tracks = property(lambda self: self.__tracks)
    is_public = property(lambda self: self.__is_public)

    def __len__(self):
        return len(self.__tracks)

    def __iter__(self):
        return Playlist.__iterator(self)

    def __getitem__(self, index):
        return self.__tracks[index]


该类负责与服务进行交互MusicProvider



class MusicProvider:
    favorites = property(lambda self: self.__favorites)
    playlists = property(lambda self: self.__playlists)


YandexMusic (MusicProvider)在初始化期间, 该类在所有播放列表和“我喜欢的”播放列表中的所有曲目上加载信息。



Spotify (MusicProvider)它没有,但是包含用于导入的方法:



class Spotify(MusicProvider):
    def import_playlist(self, playlist):
        pass  #   

    def import_favorites(self, playlist):
        pass  #   


在内部,它使用从Yandex.Music获得的歌曲数据在Spotify数据库中搜索曲目。



找到播放列表中的所有曲目后,将以相同的名称创建(如果不是“喜欢的歌曲”),并将所有找到的旋律添加到其中。



播放列表和保存的曲目需要不同的权限:



  • playlist-modify-private-创建/修改播放列表
  • 用户库修改-将音轨添加到收藏夹


有一个问题:查询字符串长度受到限制,因此,当播放列表中有大量歌曲时,查询将失败,甚至不会启动。为避免这种情况,将曲目列表切成50个片段,并根据几个请求进行添加。Spotify API



方法search支持关键字以搜索专辑/艺术家/标题,我们将无耻地使用它们。



搜索Spotify



Spotify有一个庞大的曲目数据库,但并非所有音乐都在那里。您可以轻松地猜到Spotify缺少的许多音乐与许多Yandex.Music歌曲数据库相交。有些音乐曲目可能是翻唱/混音和其他变态,而有些则可能是不正确的:错误的专辑或音乐家的顺序不同。



用另一种方法来编辑有关曲目的信息会增加另一个问题:Spotify只能有一张专辑,而Yandex.Music会发送一系列专辑。那里可能已经有几个表演者了。



Deezer提供了一张专辑和一位艺术家,但这是另一回事。



因此,以下方法可用于同时吃鱼和坐在椅子上



  • 对于所有的专辑中搜索完全匹配关键字track:artist:album:

    通常,这足够了。
  • 如果未找到曲目(或在Yandex.Music中未指定专辑),则尝试在没有专辑的情况下进行搜索。
  • 如果未找到任何曲目,它将与下一位艺术家一起搜索。


日志中显示未找到的旋律和非标准的音轨搜索条件。您可以看到已添加的内容,并在需要时手动进行处理。



注意



该项目基本上是一项一次性任务的必要项目,它是在空闲时间开发的,而不是用于工业应用,因此对于经验丰富的专家而言,该代码似乎令人讨厌。



但是,在开发该实践时,PEP8或多或少尝试了遵循,并且该程序的整体规模很小。



该程序的源代码



编写本文时的当前Python版本:3.8.4



二手材料:



  • 小猪彼得的插图:《小猪彼得和机器》这本书,Petrushevskaya Ludmila
  • Yandex.Music徽标:YANDEX LLC
  • Spotify徽标:Spotify AB



All Articles