diff --git a/Blackboard/Done/bug_url_cover.md b/Blackboard/Done/bug_url_cover.md new file mode 100644 index 00000000..1ee36c7a --- /dev/null +++ b/Blackboard/Done/bug_url_cover.md @@ -0,0 +1,57 @@ +# Bug URL relative de la cover - TERMINÉ + +## Description du bug + +Le document DIDL généré par les PMO playlists possédait une URL absolue pour le flux audio, mais une URL relative pour la cover. Les deux entités (flux audio et cover) sont stockées dans des caches `pmoaudiocache` et `pmocovers` respectivement. + +## Crates concernées + +- **pmoqobuz** (crate corrigée) +- pmoplaylist, pmocache, pmoaudiocache, pmocovers, pmodidl (explorées pour l'analyse) + +## Analyse + +### Architecture des URLs dans PMOMusic + +1. **`pmocache::FileCache::route_for`** retourne une route **relative** (ex: `/audio/flac/abc123`, `/covers/images/def456`) + +2. **Les sources (`pmoqobuz`, `pmoparadise`)** reçoivent un `base_url` à leur création et sont responsables de convertir les URLs relatives en absolues avant de retourner les résultats de Browse. + +3. **`pmoplaylist::ReadHandle::to_items`** génère des items DIDL avec des URLs relatives pour l'audio ET la cover. + +### Localisation du bug + +Le bug se trouvait dans **`pmoqobuz/src/source.rs`** dans la fonction `adapt_playlist_items_to_qobuz`. + +Cette fonction convertissait correctement l'URL audio en URL absolue mais **oubliait de faire la même conversion pour `item.album_art`** (la cover). + +### Comparaison avec pmoparadise + +`pmoparadise/src/source.rs` faisait déjà correctement les deux conversions (audio et cover). + +## Correction appliquée + +### Fichier modifié + +- `pmoqobuz/src/source.rs` + +### Modification + +Ajout de la conversion de l'URL de la cover dans `adapt_playlist_items_to_qobuz` : + +```rust +// Convertir l'URL de la cover en URL absolue si elle est relative +if let Some(art) = item.album_art.as_mut() { + if art.starts_with('/') { + *art = format!("{}{}", self.inner.base_url, art); + } +} +``` + +## Pattern architectural + +Chaque source qui utilise `pmoplaylist::to_items()` doit post-traiter les items pour convertir les URLs relatives (`/audio/...`, `/covers/...`) en URLs absolues en utilisant son `base_url`. + +## Statut + +**TERMINÉ** - La compilation réussit après la correction. diff --git a/Blackboard/Report/bug_url_cover.md b/Blackboard/Report/bug_url_cover.md new file mode 100644 index 00000000..bee0a43d --- /dev/null +++ b/Blackboard/Report/bug_url_cover.md @@ -0,0 +1,76 @@ +# Rapport : Correction du bug URL relative de la cover + +## Tâche originale + +Le document DIDL généré par les PMO playlists possédait une URL absolue pour le flux audio, mais une URL relative pour la cover. Les deux entités (flux audio et cover) sont stockées dans des caches `pmoaudiocache` et `pmocovers` respectivement. + +## Analyse + +### Architecture des URLs dans PMOMusic + +1. **`pmocache::FileCache::route_for`** retourne une route **relative** (ex: `/audio/flac/abc123`, `/covers/images/def456`) + +2. **Les sources (`pmoqobuz`, `pmoparadise`)** reçoivent un `base_url` à leur création et sont responsables de convertir les URLs relatives en absolues avant de retourner les résultats de Browse. + +3. **`pmoplaylist::ReadHandle::to_items`** génère des items DIDL avec des URLs relatives pour l'audio ET la cover. + +### Localisation du bug + +Le bug se trouvait dans **`pmoqobuz/src/source.rs`** dans la fonction `adapt_playlist_items_to_qobuz` (ligne ~595). + +Cette fonction convertissait correctement l'URL audio en URL absolue : +```rust +if let Some(resource) = item.resources.first_mut() { + if resource.url.starts_with('/') { + resource.url = format!("{}{}", self.inner.base_url, resource.url); + } +} +``` + +**Mais ne faisait pas la même conversion pour `item.album_art`** (la cover). + +### Comparaison avec pmoparadise + +`pmoparadise/src/source.rs` fait correctement les deux conversions (lignes 505-526 et 585-595) : +```rust +// Pour l'audio +if resource.url.starts_with('/') { + resource.url = format!("{}{}", self.base_url, resource.url); +} + +// Pour la cover +if let Some(art) = item.album_art.as_mut() { + if art.starts_with('/') { + *art = format!("{}{}", self.base_url, art); + } +} +``` + +## Correction appliquée + +### Fichier modifié + +- `pmoqobuz/src/source.rs` + +### Modification + +Ajout de la conversion de l'URL de la cover dans `adapt_playlist_items_to_qobuz` : + +```rust +// Convertir l'URL de la cover en URL absolue si elle est relative +if let Some(art) = item.album_art.as_mut() { + if art.starts_with('/') { + *art = format!("{}{}", self.inner.base_url, art); + } +} +``` + +Cette modification a été ajoutée après la conversion de l'URL audio et avant l'assignation du `parent_id`. + +## Vérification + +La compilation de `pmoqobuz` réussit après la correction. + +## Remarques + +Le pattern de conversion des URLs relatives en absolues est cohérent dans le projet : chaque source qui utilise `pmoplaylist::to_items()` doit post-traiter les items pour convertir les URLs relatives (`/audio/...`, `/covers/...`) en URLs absolues en utilisant son `base_url`. diff --git a/Blackboard/Todo/bug_url_cover.md b/Blackboard/Todo/bug_url_cover.md deleted file mode 100644 index b4993223..00000000 --- a/Blackboard/Todo/bug_url_cover.md +++ /dev/null @@ -1,16 +0,0 @@ -**Il faut suivre les instructions générales placées dans le fichier : Blackboard/Rules.md** - -## Crate concernée -- **pmoplaylist** -- **pmocache** -- **pmoaudiocache** -- **pmocover** -- **pmodidl** - -Le bug doit se situer dans la crâte PMO Playlist. Les autres crates ne sont cités car elles doivent être utilisées par PMO Playlist pour cette fonctionnalité. - -## Description du bug - -Le document didl Généré par les PMO playlists, Possède une URL absolue pour le flux audio, Mais relative pour l'URL de la cover. Les deux entités flux audio et cover sont stockées dans des caches PMO audio cache et PMO Cover respectivement. - -Il faut comprendre comment est construite l'URL absolue du flux audio et appliquer la même recette à l'URL de la cover. diff --git a/Cargo.lock b/Cargo.lock index 77a0aa4a..b6a884ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "PMOMusic" -version = "0.3.5" +version = "0.3.6" dependencies = [ "axum 0.8.7", "console-subscriber", diff --git a/PMOMusic/Cargo.toml b/PMOMusic/Cargo.toml index 01b94a0d..65750eae 100644 --- a/PMOMusic/Cargo.toml +++ b/PMOMusic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "PMOMusic" -version = "0.3.5" +version = "0.3.6" edition = "2024" [dependencies] diff --git a/pmoqobuz/src/source.rs b/pmoqobuz/src/source.rs index 5a256e9c..4684f809 100644 --- a/pmoqobuz/src/source.rs +++ b/pmoqobuz/src/source.rs @@ -602,6 +602,13 @@ impl QobuzSource { } } + // Convertir l'URL de la cover en URL absolue si elle est relative + if let Some(art) = item.album_art.as_mut() { + if art.starts_with('/') { + *art = format!("{}{}", self.inner.base_url, art); + } + } + item.parent_id = parent_id.clone(); adapted.push(item); } diff --git a/version.txt b/version.txt index c2c0004f..449d7e73 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.3.5 +0.3.6