Arreglando el plugin de ListenBrainz para Jellyfin para que funcione con multiples artistas

Arreglando el plugin de ListenBrainz para Jellyfin para que funcione con multiples artistas

Hola a todos,

Esta semana, instalé los plugins de ListenBrainz y Last.FM a mi servidor local de Jellyfin, en donde tengo mi colección de CDs almacenada y la escucho usando la app de Finamp para Android.

El plugin de Last.FM ha funcionado muy bien, pero noté que con el de ListenBranz habia un problema. Cuando escuchaba canciones con varios artistas, esas pistas no eran sometidas ni se mostraban en la sección de «reproduciendo». Así que tomé un tiempo para buscar el problema.

Mi música está almacenada en formato Monkey’s Audio .ape, ya que estos comprimen mejor que FLAC. Pensé que el problema sería con el formato de los tags, que es APEv2. Luego de investigar un poco en GitHub, ya había un problema similar, lo cual me sirvió como punto de comienzo.

Una vez comencé a jugar con la librería de Mutagen en Python, pensé que el problema sería que APEv2 usa un caracter nulo \x00 para separar contenido. Para mi sorpresa, ese no fue el caso, ya que el código C# del plugin estaba separando los artistas con una coma y espacio.

Así que modifiqué el archivo AudioExtensions.cs para que divida los artistas y luego haga un «trim». El resultado del código es el siguiente:

jellyfin-plugin-listenbrainz multiple artist fix VS Code

Básicamente, la línea 56 cambió de:

ArtistMbids = item.ProviderIds.GetValueOrDefault("MusicBrainzArtist")?.Split(';', '/'),

a:

ArtistMbids = item.ProviderIds.GetValueOrDefault("MusicBrainzArtist")?.Split(';', '/', ',').Select(s => s.Trim()).ToArray(),

Esto asegura que el campo artist_mbids sea dividido usando la coma de separador en adición a ; y / y luego hace un «trim» para remover el espacio en blanco que está presente luego de la coma.

Originalmente, este plugin fallaba en someter estas pistas a ListenBrainz debido a un error BadRequest:

[2024-09-21 14:04:49.618 +00:00] [DBG] [20] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Response status is BadRequest, will not retry
[2024-09-21 14:04:49.619 +00:00] [DBG] [20] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Got response:
Data: "{\"code\":400,\"error\":\"artist_mbids MBID format invalid.\",\"track_metadata\":{\"additional_info\":{\"artist_mbids\":[\"17f0182e-146a-4115-8c83-aa291b4e3acc, bb53bece-e3ed-4a9e-9348-265745dcb239\"],\"duration_ms\":205000,\"isrc\":\"USAT29700167\",\"media_player\":\"Jellyfin\",\"recording_mbid\":\"c5a61a3a-46e4-4c7b-b511-b9a67912b86d\",\"release_group_mbid\":\"2c5b5cf7-d6fc-32e9-b68f-8e8fb8747aaa\",\"release_mbid\":\"9a7768c5-7a5a-4a80-9f3e-0a86ec174c8c\",\"submission_client\":\"ListenBrainz plugin for Jellyfin\",\"submission_client_version\":\"1.0.0.0\",\"tags\":[],\"track_mbid\":\"8f4f0b0e-3729-398a-a2bd-1ad76021a07c\",\"tracknumber\":1},\"artist_name\":\"Jonathan Dokuchitz, Kelsey Grammer and Townspeople\",\"release_name\":\"Anastasia\",\"track_name\":\"A Rumor in St. Petersburg\"}}
[2024-09-21 14:04:49.619 +00:00] [DBG] [20] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Did not hit any rate limits, all OK
[2024-09-21 14:04:49.619 +00:00] [DBG] [20] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Request has been processed, freeing up resources
[2024-09-21 14:04:49.619 +00:00] [INF] [23] Jellyfin.Plugin.ListenBrainz: Failed to send 'playing now' listen: "Sending now playing failed"

Con la división de coma añadido, fallaba debido al espacio en blanco:

[2024-09-21 14:17:44.825 +00:00] [DBG] [16] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Response status is BadRequest, will not retry
[2024-09-21 14:17:44.825 +00:00] [DBG] [16] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Got response:
Data: "{\"code\":400,\"error\":\"artist_mbids MBID format invalid.\",\"track_metadata\":{\"additional_info\":{\"artist_mbids\":[\"17f0182e-146a-4115-8c83-aa291b4e3acc\",\" bb53bece-e3ed-4a9e-9348-265745dcb239\"],\"duration_ms\":168000,\"isrc\":\"USAT29700169\",\"media_player\":\"Jellyfin\",\"recording_mbid\":\"e8330f3b-aff9-48f1-912e-156de9e12ca7\",\"release_group_mbid\":\"2c5b5cf7-d6fc-32e9-b68f-8e8fb8747aaa\",\"release_mbid\":\"9a7768c5-7a5a-4a80-9f3e-0a86ec174c8c\",\"submission_client\":\"ListenBrainz plugin for Jellyfin\",\"submission_client_version\":\"1.0.0.0\",\"tags\":[],\"track_mbid\":\"7208f8b5-3541-3a39-b220-67e9757aac11\",\"tracknumber\":3},\"artist_name\":\"Liz Callaway\",\"release_name\":\"Anastasia\",\"track_name\":\"Once Upon a December\"}}
[2024-09-21 14:17:44.827 +00:00] [DBG] [16] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Did not hit any rate limits, all OK
[2024-09-21 14:17:44.828 +00:00] [DBG] [16] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Request has been processed, freeing up resources
[2024-09-21 14:17:44.849 +00:00] [INF] [21] Jellyfin.Plugin.ListenBrainz: Failed to send 'playing now' listen: "Sending now playing failed"
[2024-09-21 14:17:44.849 +00:00] [DBG] [21] Jellyfin.Plugin.ListenBrainz: Failed to send 'playing now' listen

Ahora, luego de remover ese espacio, se envía exitosamente:

[2024-09-21 14:31:18.480 +00:00] [DBG] [25] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Sending request:
Data: "{\"listen_type\":\"playing_now\",\"payload\":[{\"track_metadata\":{\"artist_name\":\"Kelsey Grammer, Liz Callaway and Jonathan Dokuchitz\",\"track_name\":\"Learn to Do It\",\"release_name\":\"Anastasia\",\"additional_info\":{\"artist_mbids\":[\"17f0182e-146a-4115-8c83-aa291b4e3acc\",\"bb53bece-e3ed-4a9e-9348-265745dcb239\"],\"release_group_mbid\":\"2c5b5cf7-d6fc-32e9-b68f-8e8fb8747aaa\",\"release_mbid\":\"9a7768c5-7a5a-4a80-9f3e-0a86ec174c8c\",\"recording_mbid\":\"59542aed-9689-4e29-8ee8-70db2c18b2b9\",\"track_mbid\":\"a5762a61-6b06-3a94-9f1a-c7180747df10\",\"tracknumber\":5,\"isrc\":\"USAT29700182\",\"tags\":[],\"media_player\":\"Jellyfin\",\"submission_client\":\"ListenBrainz plugin for Jellyfin\",\"submission_client_version\":\"1.0.0.0\",\"duration_ms\":156000}}}]}"
[2024-09-21 14:31:18.482 +00:00] [INF] [23] Jellyfin.Plugin.ListenBrainz: Attempting to sync favorite status for track "In the Dark of the Night" and user "moisespr123"
[2024-09-21 14:31:18.482 +00:00] [INF] [23] Jellyfin.Plugin.ListenBrainz: Recording MBID is available, using it for favorite sync
[2024-09-21 14:31:18.487 +00:00] [DBG] [23] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Waiting for previous request to complete (if any)
[2024-09-21 14:31:18.642 +00:00] [DBG] [25] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Response status is OK, will not retry
[2024-09-21 14:31:18.642 +00:00] [DBG] [25] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Got response:
[2024-09-21 14:31:18.642 +00:00] [DBG] [25] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Did not hit any rate limits, all OK
[2024-09-21 14:31:18.642 +00:00] [DBG] [25] Jellyfin.Plugin.ListenBrainz.ListenBrainzApi: Request has been processed, freeing up resources
[2024-09-21 14:31:18.642 +00:00] [INF] [21] Jellyfin.Plugin.ListenBrainz: Successfully sent 'playing now' listen

Hice un Pull Request en GitHub y espero que se integre al código pronto, ya que esto podría ayudar a usuarios con un problema similar.

GitHub Pull Request for ListenBrainz Jellifin plugin to fix multiple artists MBID problem

Puedes ver mis perfiles de Last.FM y ListenBrainz a continuación: