Spothiefy: cómo pasar de Yandex.Music rápidamente, gratis

Entonces, en julio, la vida en el país finalmente comenzó a cambiar para mejor, porque sucedió algo que mucha gente estaba esperando: Spotify se lanzó en Rusia y varios otros países.



Pero la transmisión de música no apareció ayer, y probablemente haya quienes estén enganchados a Yandex y usen una suscripción a Yandex.Music, que luego se convirtió en Yandex.Plus.



Se volvió conveniente escuchar canciones, los selectores aprendieron a seleccionar buenas pistas y esto llevó a la acumulación de una biblioteca con listas de reproducción y otras cosas convenientes que deben agregarse nuevamente en el nuevo servicio.



Si quieres probar, pero eres demasiado vago, entonces te diré cómo mover tus pertenencias rápidamente, gratis. Solo necesitas unas pitones con pilas.



Peter y la portada de Spotifai



¡Atención!
, .



, . , . .

.



Spotify , . , . , - .



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



, .



/ .



Con la ayuda de dispositivos simples, en un par de días logré hacer un importador de pistas en Spotify y no gastar dinero en soundiiz, lo que por alguna razón aumentó repentinamente la carga.



Pero hay matices.



API



Spotify proporciona algún tipo de documentación para su servicio Web API, incluida una API para agregar listas de reproducción y favoritos a su biblioteca.



A su vez, Yandex.Music no tiene una API pública , pero tal vez la competencia los incite a brindar acceso a desarrolladores externos , porque es necesario, conveniente y útil.

Por lo tanto, aquí iremos un poco por un camino curvo, y usaremos trucos de dudosa reputación.



¿Y qué pasa con Deezer?
Deezer, , API . Python, .





Spotify



Aquí todo es sencillo. Para convertirse en desarrollador, debe obtener la clave de la aplicación en la consola .

Ofrecerán agregar Redirect URIpara OAuth, que puede ser instalado por cualquier persona. solo es necesario para los servicios que atienden a muchas personas a la vez, pero en nuestro caso todo sucede a nivel local.



Yandex.Music



Necesita un nombre de usuario y una contraseña para su cuenta, pero si la autenticación de dos factores está habilitada, debe especificar Yandex.Password de Yandex.Key.



Operación de la aplicación



No quiero detenerme en ejecutar aplicaciones Python, implementar un entorno virtual, etc., así que describiré cómo funciona la importación. Enlace al repositorio con el código del programa al final del artículo .



Las pistas de las API de todas las plataformas vienen en un formato diferente, por lo que se convierten a la misma presentación con el conjunto mínimo de propiedades requerido:



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)


Las listas de reproducción (incluidas las favoritas) también tienen el mismo formato e incluyen un iterador de pistas para facilitar su uso en bucles:



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]


La clase es responsable de interactuar con los servicios MusicProvider:



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


YandexMusic (MusicProvider)En la inicialización, la clase carga información sobre todas las listas de reproducción y todas las pistas de la lista de reproducción "Me gustó".



Spotify (MusicProvider)no lo hace, pero contiene métodos para importar:



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

    def import_favorites(self, playlist):
        pass  #   


En el interior, busca pistas en la base de datos de Spotify utilizando datos de canciones obtenidos de Yandex.Music.



Una vez que se encuentran todas las pistas de la lista de reproducción, se crea (si no es "Canciones que me gustan") con el mismo nombre y se le agregan todas las melodías encontradas.



Las listas de reproducción y las pistas guardadas requieren diferentes permisos:



  • playlist-modified-private - para crear / modificar listas de reproducción
  • user-library-modified - para agregar pistas de audio a favoritos


Hay un problema: la longitud de la cadena de consulta es limitada, por lo que cuando hay una gran cantidad de canciones en la lista de reproducción, la consulta falla sin siquiera comenzar. Para evitar esta situación, la lista de pistas se corta en pedazos de 50 piezas y la adición se realiza con varias solicitudes.



El método de la searchAPI de Spotify admite palabras clave para buscar álbumes / artistas / títulos, que usaremos descaradamente.



Buscar Spotify



Spotify tiene una gran base de datos de pistas, pero no toda la música está ahí. Puede adivinar fácilmente que mucha música que falta en Spotify se cruza con gran parte de la base de datos de canciones de Yandex.Music. Algunas de las pistas de música pueden ser versiones / remixes y otras perversiones, y algunas pueden ser incorrectas: el álbum equivocado o el orden de los músicos es diferente.



Otro problema es agregado por un enfoque diferente para compilar información sobre pistas: Spotify solo puede tener un álbum y Yandex.Music envía una variedad de álbumes. Puede que ya haya varios artistas allí y allá.



Deezer ofrece un álbum y un artista, pero esa es otra historia.



Por lo tanto, se utiliza el siguiente enfoque para comer pescado y sentarse en la silla :



  • Para todos los álbumes se buscaron clave de concordancia exacta track:, artist:, album:.

    La mayoría de las veces, esto es suficiente.
  • Si no se encuentra la pista (o el álbum no está especificado en Yandex.Music), se intenta buscar sin un álbum.
  • Si no se encuentra ninguna pista, busca con el siguiente artista.


Las melodías no encontradas y las condiciones de búsqueda de pistas de audio no estándar se muestran en el registro. Puede ver qué se ha agregado exactamente y, si es necesario, procesarlo manualmente.



Nota



Este proyecto es en general necesario para una tarea única, se desarrolló en tiempo libre, no para su uso en aplicaciones industriales, por lo que para un especialista experimentado el código puede parecer repugnante.



Sin embargo, mientras se desarrollaba la práctica, se ha intentado más o menos seguir PEP8, y el tamaño general del programa es bastante pequeño.



Códigos fuente del programa



Versión actual de Python en el momento de escribir este artículo: 3.8.4



Materiales usados:



  • Ilustración de Peter the Pig: El libro "Peter the Pig and the Machine", Petrushevskaya Ludmila
  • Logotipo de Yandex.Music: YANDEX LLC
  • Logotipo de Spotify: Spotify AB



All Articles