Apple Music para el desarrollador

Palabras introductorias


No importa cuánto regañen a Apple por la naturaleza cerrada de la plataforma y el ecosistema en sí, algunas de sus soluciones son una excepción. Hay muchos servicios de transmisión en el mercado, pero proporcionar un SDK completo para la transmisión de productos de terceros es extremadamente pequeño, para el mercado ruso la lista de SDK disponibles oficialmente se limita a Deezer y Apple Music. Por supuesto, cuando Spotify llegue a nuestro mercado, habrá más SDK disponibles, pero hasta ahora hay dos jugadores y solo uno de ellos tiene una amplia base de usuarios.


Dio la casualidad de que tenía experiencia con el SDK de Deezer para Android y en este momento estoy trabajando activamente con el SDK de Apple Music ( MusicKit ) para iOS. Y la principal diferencia con la experiencia con Deezer es que MusicKit es la punta del iceberg, también es una API disponible públicamente. A diferencia de Deezer, donde repetir la mayor parte de la funcionalidad de la aplicación oficial es solo un proceso largo, es imposible repetir la funcionalidad incluso de las páginas web de Apple Music utilizando solo la API pública. Incluso si Apple usa MusicKit en sus soluciones, además de esto, usa muchas solicitudes de API indocumentadas y API privadas que no están permitidas para los mortales.


En el artículo hablaré sobre trabajar con MusicKit desde el punto de vista del desarrollador en el contexto de la implementación de " tareas simples ": buscar en el catálogo, mostrar imágenes en los resultados de búsqueda, obtener canciones, recomendaciones e incluso reproducir algún tipo de música. Mirando hacia el futuro, diré que gran parte de lo anterior será cierto para trabajar con Apple Music en Android y Javascript.


Si es necesario, estoy listo para dar respuestas detalladas con un código para preguntas en los comentarios.


Separa las moscas de las chuletas


Cuando trabaje con MusicKit en iOS, deberá interactuar con las siguientes entidades:


  • StoreKit para obtener autorización en Apple Music y ofrecer una suscripción al servicio ( referencia si puede suscribirse al programa de Afiliados )
  • API HTTP para buscar y recuperar diversa información de un directorio
  • iTunes Search API para buscar en el directorio de iTunes (una alternativa muy útil a la API HTTP ). Apple indica un límite de un máximo de 20 solicitudes por minuto, esto suele ser suficiente cuando se realizan solicitudes desde dispositivos de usuario
  • Media Player para jugar y administrar la cola

Además, cuando se conecta a un programa de afiliados, puede solicitar acceso al volcado de metadatos de Enterprise Partner Feed , que Apple recomienda usar en lugar de solicitudes frecuentes a la API de búsqueda de iTunes.


Y por si acaso, Music.app es la aplicación Music en dispositivos iOS, que es el reproductor oficial de Apple Music.


Fuentes de información, en orden decreciente de su utilidad:


  • Documentación oficial
  • Buscar toda la documentación de Apple
  • Experimento científico Método 1 con API HTTP
  • Consola de desarrollador en su navegador favorito, anclado a la página web de la entidad de interés en Apple Music
  • Foros de desarrolladores de Apple
  • Stackoverflow

Buscar Imágenes


La forma más obvia de verificar si se puede hacer algo en su aplicación es el hecho de que algo como esto está disponible en la aplicación oficial. Aquí tomamos, por ejemplo, una búsqueda. Estamos buscando el grupo "The Police" y en Music.app tenemos una foto del grupo con un Sting sonriente:


búsqueda policial

Genial, usaremos la API de búsqueda . En la emisión, tenemos la clave de artwork con un enlace de url incrustado para todo excepto artistas. Es extraño Comprueba de nuevo, en Music.app todo está ahí. Además, la interfaz web también tiene una fotografía, y un enlace a la página web está disponible en la API del motor de búsqueda json.


La API de búsqueda de iTunes tampoco artistLinkUrl imagen, pero también incluye la dirección de la página web con la clave artistLinkUrl en la artistLinkUrl .


Bueno, qué hacer, debe descargar la página web y obtener la dirección de la imagen, afortunadamente, los desarrolladores se encargaron y registraron la dirección de la imagen en la metainformación:


 <meta property="og:image" content="https://is5-ssl.mzstatic.com/image/thumb/Features113/v4/bb/a2/66/bba266dd-570b-bff7-d7c6-777982582964/mzl.tdrwskof.jpg/1200x630cw.png" id="ember52310559" class="ember-view"> 

Hablando formalmente, ya hemos violado las reglas de Apple que prohíben "raspar" sus páginas web. De hecho, todas las aplicaciones de terceros hacen esto, excepto aquellas que buscan imágenes que utilizan servicios de terceros.


Hay una desventaja más: solicitamos una página de varios cientos de kilobytes de tamaño. Para una aplicación que ya maneja grandes cantidades de datos ( reproducir música ), es tolerable ( especialmente si considera que los datos se transmiten en forma comprimida ), pero en el caso general no es muy.


Los tamaños de las imágenes se pueden ajustar a sus necesidades: en la url hay plantillas para reemplazar ( {w} , {h} ), y en la página web el enlace a la imagen tiene el mismo formato, por lo que no hay dificultad para obtener la imagen del tamaño correcto. Si desea obtener una imagen redondeada, debe agregar cw antes de la extensión.


Bono sobre imágenes para mostrar en el reproductor


Durante la reproducción, el reproductor de Media Player funciona en la construcción MPMediaItem , que, en particular, proporciona un objeto Artwork . Es muy conveniente para mostrar una imagen de una pista en el reproductor. El único problema es que, en la práctica, este objeto, sea lo que sea que se diga, no proporciona imágenes para transmitir música ( que es cualquier música de Apple Music ), por lo que debe "reproducir" el elemento MPMediaItem reproduce con las canciones que se agregaron a la cola y se descargaron La imagen es similar a los álbumes.


Búsqueda por género


ITunes y la aplicación Apple Music tienen listas de géneros y canciones principales. Encontrar un género no debería ser difícil, porque podemos buscar cualquier cosa.


Esto está lejos del caso. La API no busca por género y no proporciona una lista de géneros. Es posible solicitar información ( de nombre útil ) de un género por su identificador,
pero la mayor parte de la información en la API contiene solo el nombre del género, no el identificador.


El beneficio para iTunes es la descarga de todos los géneros ( todos ellos, incluidos los "géneros" de las aplicaciones móviles ). Los identificadores de géneros ( como otros identificadores de iTunes ) corresponden completamente a los identificadores en Apple Music. La descarga está disponible para todas las regiones (la región se indica en la clave cc , no en el storefront como en la API de Apple Music ), pero de hecho solo los nombres difieren ( se traducen ). La estructura de los géneros es jerárquica y hay repeticiones de los nombres de los géneros.


En general, una búsqueda por género debe hacerse localmente, y tenga en cuenta que el funk jazz, jazz funk y jazz funk son lo mismo. No es difícil, pero no es tan simple como pedirle a la API de búsqueda que busque por género.


Después de haber encontrado un género, puede solicitar una tabla (una lista de las canciones más populares ) para este género. Para géneros raros, es muy posible obtener el lanzamiento de solo 3 canciones.


Dato curioso: para algunos álbumes y artistas ( Ed Sheeran de los famosos ), solo uno de los géneros simplemente indica el género de nivel superior de "Música". Si desea hacer recomendaciones basadas en géneros, entonces este género debe ignorarse.


Canciones de artista


Cuando una aplicación necesita reproducir canciones de un artista ( grupo musical ) con mayor frecuencia, esto significa que es necesario reproducir canciones populares de este grupo. Apple Music permite solicitar canciones como un enlace de "canciones" 2 para el artista. La salida tiene un máximo de 20 canciones 3 , claramente ordenadas por popularidad.


A veces todavía quieres obtener un poco más de canciones. Con grupos muy populares, hay una opción para obtener listas de reproducción como " [Nombre del artista]: Essentials " y " [Nombre del artista]: Detalles " (" [Nombre del artista]: Próximos pasos "), pero En general, esta opción no es adecuada. Otra opción: tomar 20 canciones populares y terminar el resto de los álbumes, el beneficio de Apple Music hace posible obtener de inmediato todos los álbumes de artistas ( enlaces como albums ) y todas las canciones en ellos ( include="tracks" ) en una sola solicitud.


Pero si obtienes todas las canciones del artista, surge otro problema: debes seleccionar las populares de todas estas canciones. Desafortunadamente, la API de información de popularidad no proporciona 4 . Puede tomar canciones aleatorias de toda la lista, pero en la práctica este enfoque conduce a la reproducción frecuente de grabaciones completamente interesantes ( transcripciones en vivo, grabaciones de ensayos, parodias, etc. ), lo que es especialmente notable en grupos muy populares 5 .


Tratemos de obtener canciones populares de una manera diferente. Incluso antes de la llegada de MusicKit, Apple comenzó a proporcionar API de búsqueda en iTunes Store. Como ya se mencionó, el catálogo en Apple Music e iTunes Store son los mismos 6 y, en consecuencia, los identificadores de las canciones también son los mismos. Esta API devuelve 50 canciones de forma predeterminada, pero puede solicitar hasta 200 canciones. Los resultados también están ordenados por popularidad.


Curiosamente, la propia Apple no utiliza ninguna de estas opciones en su propia interfaz web. Utilizan la API 7 no documentada ( lectura, privada ), en la emisión de la cual falta todo lo que falta, incluido el identificador ( y no solo el nombre ) del género y el índice de popularidad. No me atreví a usar esta API en la práctica 8 , ya que los identificadores de género se pueden obtener mediante la búsqueda inversa por nombres de género 9 , y el índice de popularidad numérico no es tan importante cuando obtienes una lista de canciones ordenadas por popularidad.


El hecho curioso que llamo el " problema de Hugh Laurie " es que el catálogo de Apple Music tiene toneladas de contenido no musical. En particular, varias compilaciones de programas de comedia y stand-ups. Esto está bien, por un lado ( pagamos por la música, pero también tuvimos diálogos divertidos con Stephen Fry que puedes escuchar antes de irte a la cama ), y por otro lado, conduce a algún tipo de charla cuando se nos pide que enciendas la música. En consecuencia, cuando el contexto operativo de la aplicación indica directamente que el usuario quiere escuchar música, uno tiene que eliminar independientemente de la lista de " canciones " aquellos cuyos géneros se designan como " palabra hablada " y " comedia ".


Recomendaciones


Reproducir recomendaciones (también son " canciones similares ", " estaciones de radio ", " te gustará ", etc.) se ha convertido en la funcionalidad básica de los reproductores de transmisión. Convencionalmente, las recomendaciones se pueden dividir en dos tipos 10 : para el usuario ( basado en el historial de escucha, compras y me gusta ) y para el objeto musical ( artista, pista, menos frecuentemente álbum y lista de reproducción ).


Con las preferencias del usuario en Apple Music, formalmente, 11 todo está bien: puede solicitar una lista de recomendaciones personales, que incluye " mezclas personales " ( listas de reproducción ) y álbumes recomendados. De los álbumes, se puede obtener una lista de canciones utilizando las API ( tracks ) , para listas de reproducción de manera similar. Tenga en cuenta que las pistas pueden incluir no solo canciones ( type = "songs" ), sino también videoclips, por lo que el filtrado adicional de los datos recibidos no afectará.


Con otras recomendaciones, todo es un poco más complicado. Si mira Music.app, se muestran " artistas similares " allí y puede encender la " estación de radio " para este artista. Este último pierde la mezcla del artista y las recomendaciones para él.


policía similar

Parece que todo es simple: para los artistas probablemente haya una conexión de " artistas similares ". Me apresuro a molestar, no hay tal conexión. Tampoco hay información de similitud en el esquema de datos de Enterprise Partner Feed.


Bien, ¿podemos solicitar una " estación de radio " para el artista y obtener una lista de canciones? Y de nuevo, no, realmente podemos solicitar una estación de radio, su identificador está en la emisión de las conexiones del artista. Pero en la información de la estación no hay información sobre las canciones, álbumes o artistas que se están reproduciendo, solo hay un objeto de servicio con información para reproducir playParams . La idea con playParams simple: playParams este diccionario 12 en la cola de reproducción y escuchamos.


Todo esto es bueno si desea reproducir solo una estación de radio ( como lo hace Music.app ), pero ¿qué sucede si desea mezclar canciones de la estación de radio 13 con algo más? Obviamente, de alguna manera necesitamos obtener una lista de artistas similares.


En Media Player , las colas de reproducción juegan un papel importante, en particular MPMusicPlayerControllerMutableQueue . La cola le permite: insertar descriptores después de cierto objeto jugable, eliminar objetos especificados y también obtener una lista de todos los objetos en la cola. Al consultar los objetos para obtener resultados, debemos obtener una matriz de MPMediaItem . Y MPMediaItem , en particular, incluye el identificador de la canción . Solo hay un problema: los constructores de colas no son una API pública, lo traduciré: Media Player puede proporcionar una cola lista (a veces editable ), pero es imposible crearla usted mismo 14 .


Bueno, cavar un poco hacia las muletas puede ser útil. Si Media Player me puede dar una cola variable, entonces necesito tomarla. Para hacer esto, tendrá que trabajar con el reproductor actual ( singleton ), por lo que debe actuar rápidamente, de lo contrario, el usuario puede perder algo incorrecto y el reproductor aún tendrá tiempo para precargar las canciones que hasta ahora son innecesarias. Cambiamos la cola de reproducción actual ( agregamos el descriptor de la estación ), miramos lo que sucedió, revertimos los cambios en la cola con una nueva transacción ( eliminamos lo que realmente se agregó a la cola ).


Desafortunadamente, encontramos que solo dos objetos MPMediaItem se MPMediaItem a la cola. Ambas parecen canciones ( hay el nombre del artista, el nombre de la pista, la duración de la pista ), pero no incluyen el identificador de la canción. Si miras Music.app, encontramos que todo converge allí: al encender la estación de radio se reproducirá la canción, y en la cola solo habrá una canción para reproducir. Cuando pasa a la siguiente canción, la cola se actualiza.


No tiene sentido tratar de construir muletas con más estaciones de radio; tienes que usar otras opciones.


Recuerde que, en Music.app y la interfaz web, se muestran artistas similares. Artistas similares solo están disponibles para las bandas más populares 15 . Nuevamente, debe recurrir al método prohibido de analizar una página web. De los profesionales: ya estamos descargando una página web para obtener una imagen, de modo que podamos obtener artistas similares de ella de inmediato.


En el código de la página html, vemos un gran objeto json, del cual primero obtenemos los identificadores de artistas similares ( ["data"]["relationships"]["artistContemporaries"] ):


datos de la página web

y luego usando estos identificadores obtenemos los datos del artista del mismo json ( ["included"] con el tipo de lockup/artist ):


página web incluida

Al tener los identificadores de los artistas, podemos solicitar sus pistas. La API le permite solicitar múltiples artistas por sus identificadores en una sola solicitud con enlaces habilitados. Por desgracia, en la práctica, la API devuelve un error que indica la imposibilidad de agregar una lista de pistas al resultado. Esto solo se puede hacer solicitando artistas uno a la vez o solicitando directamente canciones para un solo artista. En este caso, puede usar la API de búsqueda de iTunes ya mencionada, que le dará un poco más de información útil.


Las listas de " artistas similares " en Apple Music son bastante buenas, pero en la práctica a menudo resultan estar vacías. En el caso de una lista vacía de recomendaciones, debe utilizar servicios de terceros. Clásicos - Last.fm, un poco más sofisticado - Spotify. Los resultados de ambos deben coincidir con los objetos del catálogo de Apple Music. La solución "en la frente" es buscar a cada artista por nombre con exactamente un resultado y luego recibir las canciones como se describió anteriormente. Las soluciones son un poco más interesantes, pero es más costoso usar musicbrainz para combinar. Musicbrainz proporciona información sobre identificadores 16 en otros servicios, es decir Puede asociar un identificador en Spotify con un identificador en Apple Music. La situación con Last.fm es aún mejor: Last.fm devuelve identificadores de musicbrainz en la lista de recomendaciones. La sobrecarga radica en los límites del uso de musicbrainz, con mucho tráfico que tiene que levantar su propio clon de musicbrainz (afortunadamente, esto es posible ) o desarrollar su propia API alrededor de una base de datos , cuyos volcados se pueden descargar fácilmente.


Para los grupos nuevos, incluso Last.fm no dará recomendaciones, las opciones alternativas serán recomendaciones de "género". Tomamos los géneros del artista ( en base al nombre obtenemos identificadores de la lista ya cargada de todos los géneros ), obtenemos la tabla para cada género, mezclamos las canciones recibidas. Esto es mejor que nada.


Dos cosas son inseparables: jugador y cola


Media Player es responsable de reproducir en iOS desde Apple Music; le permite trabajar con música de Apple Music y el directorio personal del usuario 17 . El marco es de alto nivel y en la situación de trabajar con contenido de transmisión para bajar a un nivel inferior a 18 no funcionará.


El marco proporciona dos reproductores con una interfaz de software común: uno reproduce música directamente en la aplicación Music.app y el otro funciona de manera más o menos independiente. Usar el primero para algo serio no tiene sentido 19 . Y la documentación descaradamente miente 20 que el segundo jugador no funciona en segundo plano


Desde el punto de vista arquitectónico, trabajar con este asunto es simple: le decimos al jugador qué reproducir ( por ejemplo, llenar la cola, en función de una serie de identificadores de canción ) y controlar la reproducción ( reproducir, pausar, siguiente, anterior ).


No hay un control directo de la cola de reproducción, debe realizar un cambio transaccional , lo que lleva tiempo. Además, a menudo se llama al controlador HandHandler con un error de tiempo de espera, que se traduce como " No sé si pude hacer algo o si estoy haciendo otra cosa, pero estoy cansado de esperar por mí mismo ". La mayoría de las veces, la transacción va bien y los errores que llegan al controlador deben ignorarse. Algunos de los cambios se pueden hacer a un nivel ligeramente superior , sin embargo, si ya tuvo que usar cambios transaccionales, entonces es mejor usarlos para todo.


En general, las colas son bastante flexibles, y si no es probable que su aplicación funcione alguna vez con otros servicios de transmisión 21 , puede hacer muchas cosas interesantes con las colas, en particular, indicar a qué hora comienza a reproducirse cada elemento y durante cuánto tiempo.


De los otros " inconvenientes " de un enfoque de tan alto nivel, vale la pena señalar la incapacidad para procesar las acciones del usuario. Al presionar al usuario en el auricular del botón " siguiente pista " no se solicitará el programa " qué debo hacer ", el jugador sabe mejor qué hacer y cambiará la canción él mismo. Por lo tanto, solo puede ver los cambios realmente completados en el estado del jugador y tomar algunas decisiones después del hecho.


Por otro lado, no tiene que hacer mucho: la información sobre cómo jugar en la pantalla de bloqueo simplemente está allí y todos los botones funcionan, Apple Watch y Siri pueden controlar la reproducción, y la transmisión a través de AirPlay a Apple TV funciona desde la caja 22 .


Es posible repetir la funcionalidad y la interfaz de la cola Music.app en su aplicación, pero la aparente simplicidad de los elementos de arrastrar y soltar de la cola en realidad resulta ser un malabarismo de transacciones para cambiar la cola y sincronizar la cola deseada y la cola real de 23 jugadores.


Algunas palabras sobre SDK para otras plataformas


De hecho, trabajar con la API no es diferente en otras plataformas, pero los SDK no se copian completamente con iOS y, en algunos lugares, son más convenientes 24 , aunque la idea general de una cola en tándem y un reproductor persiste.


Por lo tanto, en Android, puede obtener la cola actual y mover los elementos de la cola sin trucos con un cambio transaccional de la misma ( eliminar de la cola y agregar al lugar correcto con los dedos cruzados ).


MusicKit JS también proporciona métodos de envoltura especiales para trabajar con la API de Apple Music,
pero al usar envoltorios no se puede prescindir de leer la documentación de la API en sí. Trabajar con la cola y el reproductor no es más conveniente que el SDK de iOS , pero con pequeños complementos puede ser soportable .


Unas palabras sobre el simulador


Puede trabajar en el simulador con MusicKit solo en el contexto de la comunicación con la API HTTP, pero incluso en este caso tendrá que estabilizar el token del usuario para realizar solicitudes y no hacerlo a través de StoreKit . Es completamente imposible reproducir música de Apple Music en el simulador, porque falta la aplicación Music.app.


De hecho, debe desarrollar sus propios complementos a través del SDK y, cuando se ejecuta en el simulador, utilizar implementaciones alternativas ( simuladas ). De hecho, durante el desarrollo, el simulador es útil solo para trabajar en la interfaz de usuario. La abstracción propia también será útil en capturas de pantalla automáticas para la aplicación ( y de hecho al crear capturas de pantalla usando un simulador ), ya que tener ambas generaciones de iPad Pros "grandes" en el arsenal solo para tomar capturas de pantalla de tu jugador en ambos es extremadamente poco rentable y estúpido .


Como experimento interesante, pero no muy útil, puede realizar una implementación alternativa de su propio reproductor de alto nivel basado en MusicKit JS.


Acerca del feed de socios empresariales


Por un lado, Apple proporciona un volcado de metadatos a pedido y dice que lo use para reducir la carga en la API y obtener información que la API no tiene. Por otro lado, tenemos un problema claro con las gallinas y los huevos: el acceso al programa de Afiliados se proporciona especificando un enlace a la aplicación. Es bastante difícil desarrollar una aplicación utilizando los datos que solo se pueden obtener con la aplicación publicada en la App Store.


Y, por supuesto, los datos no dan la primera esquina. Cada aplicación se verifica dentro de los cinco días hábiles. Al momento de escribir esto, no he logrado tener un volcado de metadatos en mis manos. Apple envolvió mi solicitud sin especificar los motivos exactos. , - " Apple Music " , Apple . - , -, . , Apple , , .


, , . Apple Music ( , ), . , , Apple Music . , , .


Enterprise Partner Feed :


  • Apple Music API iTunes Search API
  • (" "), -


, - :


  1. . , , .
    , . , -
  2. - , , . , - , -.
  3. , SDK , . Apple 25 SDK 26 , , , API , SDK .
  4. , " code level " . " Q&A " " Tech Notes ", , - .
  5. . , , . API ( Last.fm, musicbrainz, iTunes Search API ) IP . Apple Music . " " , 27 .
  6. , Apple Music API, , . - App Store , ( ) , , ( ). 28 , , , 29 . Apple 30 .
  7. , - Apple Music — Ember. , , html DOM Javascript.
  8. -, , . , .


SDK, batch API, , « » Apple Music. , , SDK . SDK, .


, .



1 ( )


2 ,


3 , Music.app - ( ), API ( "" )


4 limit : Specified limit for relationship 'songs' exceeds maximum of 20


5 The Beatles


6 , Apple Music iTunes Store. API iTunes Store `isStreamablez, Apple Music .


7 : https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtistSeeAll?cc=ru&ids=424279384§ion=0


8 , , , iTunes ( ) iTunes Store


9


10 , !


11 , Apple Music : , ,


12 , MPMusicPlayerPlayParametersQueueDescriptor


13 Apple Music , ( ) . .


14 , , App Store


15 ( ) ( ) ( ) ( ) . .


16 -,


17 , iTunes Store iTunes Match


18 API URL


19 — -, . , .


20 : ( When your app moves to the background, the music player stops playing the current media. ). AVPlayer , , Info.plist .


21 .


22 , MPMediaItem


23


24 , SDK , , . iOS Media Player , API .


25 , — , .


26 SDK , Apple Music. Apple , .


27 , — . , Enterprise Partner Feed, musicbrainz, API. , ( ) . , .


28 RIP


29 API Bing


30

Source: https://habr.com/ru/post/464811/


All Articles