Spothiefy: como sair do Yandex.Music rapidamente e de graça

Então, em julho, a vida no país finalmente começou a mudar para melhor, porque aconteceu algo que muitos residentes esperavam: o Spotify foi lançado na Rússia e em vários outros países.



Mas o streaming de música não apareceu ontem, e provavelmente existem aqueles que são viciados em Yandex e usam uma assinatura de Yandex.Music, que mais tarde se tornou Yandex.Plus.



Tornou-se conveniente ouvir as músicas, os seletores aprenderam a selecionar boas faixas, e isso levou ao acúmulo de uma biblioteca com listas de reprodução e outras coisas convenientes que precisam ser adicionadas novamente no novo serviço.



Se você quiser tentar, mas é muito preguiçoso, vou lhe ensinar como mover seus pertences rapidamente, de graça. Você só precisa de algumas pythons com baterias.



Capa de Peter e Spotifai



Atenção!
, .



, . , . .

.



Spotify , . , . , - .



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



, .



/ .



Com a ajuda de aparelhos simples, em alguns dias consegui fazer um importador de faixas no Spotify e não gastar dinheiro com soundiiz, o que por algum motivo de repente aumentou a carga.



Mas existem nuances.



API



O Spotify fornece algum tipo de documentação para seu serviço de API da Web, incluindo uma API para adicionar listas de reprodução e favoritos à sua biblioteca.



Por sua vez, Yandex.Music não tem uma API pública , mas talvez a competição os estimule a fornecer acesso a desenvolvedores terceirizados, porque é necessário, conveniente e útil.

Portanto, aqui iremos um pouco por um caminho curvo, e usaremos truques de reputação duvidosa.



E o Deezer?
Deezer, , API . Python, .





Spotify



Tudo é simples aqui. Para se tornar um desenvolvedor, você precisa obter a chave do aplicativo no console .

Eles se oferecerão para adicionar Redirect URIpara OAuth, que pode ser instalado por qualquer pessoa. só é necessário para serviços que atendem muita gente ao mesmo tempo, mas no nosso caso tudo acontece localmente.



Yandex.Music



Você precisa de um nome de usuário e senha para sua conta, mas se a autenticação de dois fatores estiver ativada, você precisará especificar Yandex.Password de Yandex.Key.



Operação do aplicativo



Não quero me alongar em executar aplicativos Python, implantar um ambiente virtual, etc., então vou descrever como funciona a importação. Link para o repositório com o código do programa no final do artigo .



As trilhas de APIs de todas as plataformas vêm em formatos diferentes, portanto, são reduzidas à mesma apresentação com o conjunto mínimo de propriedades necessário:



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)


Listas de reprodução (incluindo favoritos) também têm o mesmo formato e incluem um iterador de faixa para fácil uso em loops:



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]


A classe é responsável por interagir com os serviços MusicProvider:



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


YandexMusic (MusicProvider)Na inicialização, a classe carrega informações sobre todas as listas de reprodução e todas as faixas da lista de reprodução "Gostei".



Spotify (MusicProvider)não faz, mas contém métodos para importar:



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

    def import_favorites(self, playlist):
        pass  #   


Dentro, ele procura faixas no banco de dados do Spotify usando dados de música obtidos no Yandex.Music.



Depois que todas as faixas da lista de reprodução são encontradas, ela é criada (se não for "Músicas favoritas") com o mesmo nome e todas as melodias encontradas são adicionadas a ela.



Listas de reprodução e faixas salvas requerem permissões diferentes:



  • playlist-modify-private - para criar / modificar playlists
  • user-library-modify - para adicionar faixas de áudio aos favoritos


Há um problema: o comprimento da string de consulta é limitado, então, quando há um grande número de músicas na lista de reprodução, a consulta falha mesmo antes de começar. Para evitar esta situação, a lista de faixas é cortada em pedaços de 50 e o acréscimo é feito com vários pedidos.



O método da searchAPI do Spotify oferece suporte a palavras-chave para pesquisar álbuns / artistas / títulos, que usaremos descaradamente.



Pesquisar Spotify



O Spotify tem um grande banco de dados de trilhas, mas nem todas as músicas estão lá. Você pode facilmente adivinhar que muitas músicas ausentes no Spotify se sobrepõem a muitas do banco de dados de músicas Yandex.Music. Algumas das faixas de música podem ser covers / remixes e outras perversões, e algumas podem simplesmente estar inseridas incorretamente: o álbum errado ou a ordem dos músicos é diferente.



Outro problema é adicionado por uma abordagem diferente para compilar informações sobre as faixas: o Spotify pode ter apenas um álbum e o Yandex.Music envia uma série de álbuns. Pode já haver vários performers lá e lá.



Deezer fornece um álbum e um artista, mas isso é outra história.



Portanto, a seguinte abordagem é usada para comer o peixe e sentar na cadeira :



  • Para todos os álbuns são pesquisados por palavras-chave de correspondência exata track:, artist:, album:.

    Na maioria das vezes, isso é o suficiente.
  • Se a faixa não for encontrada (ou o álbum não estiver especificado em Yandex.Music), será feita uma tentativa de busca sem um álbum.
  • Se nenhuma faixa for encontrada, ele procura o próximo artista.


Melodias não encontradas e condições de busca de faixa de áudio fora do padrão são exibidas no registro. Você pode ver o que exatamente foi adicionado e, se necessário, processá-lo manualmente.



Nota



Este projeto é em geral necessário para uma tarefa única, ele foi desenvolvido em tempo livre, não para uso em aplicações industriais, então para um especialista experiente o código pode parecer nojento.



No entanto, ao desenvolver a prática, o PEP8 mais ou menos tentou ser seguido, e o tamanho geral do programa é bastante pequeno.



Códigos-fonte do programa



Versão atual do Python no momento da escrita: 3.8.4



Materiais usados:



  • Ilustração de Pedro, o Porco: O livro "Pedro, o Porco e a Máquina", Petrushevskaya Ludmila
  • Yandex.Music logo: YANDEX LLC
  • Logotipo do Spotify: Spotify AB



All Articles