feat(cache): fix lazy PK metadata resolution and playlist track ordering

- In `track_metadata.rs`, implement fallback logic for lazy PKs: first try real_pk, then fallback to lazy_pk for metadata keys seeded before download.
- In `db.rs`, add debug logging after migration to track remaining metadata under lazy_pk.
- In `source.rs` (Qobuz):
  - Detect and repair playlists with missing cache entries by forcing refresh when `items.len() < total`.
  - Preserve original track order after parallel processing by attaching and sorting on original index.
  - Handle missing performer/cover gracefully with warnings and provider fallback.
- In `metadata_cache.rs` (Radio France), simplify logging and improve test coverage for expiration logic.
- In `cache.rs`, add debug/warning logs when metadata or cover seeding fails during lazy caching.
This commit is contained in:
2026-03-25 12:25:34 +01:00
parent 09cc2dcf94
commit 5095dd6964
5 changed files with 92 additions and 25 deletions

View File

@@ -35,6 +35,18 @@ impl AudioCacheTrackMetadata {
}
fn read_raw(&self, key: &str) -> Result<Option<Value>, MetadataError> {
// Si le pk est un lazy pk déjà téléchargé (pk != lazy_pk dans l'asset),
// lire d'abord sous le real_pk (métadonnées écrites par FlacCacheSink),
// puis fallback sous le lazy_pk (cover_pk, qobuz_track_id semés à l'enregistrement).
if pmocache::is_lazy_pk(&self.pk) {
if let Ok(Some(real_pk)) = self.cache.db.get_pk_by_lazy_pk(&self.pk) {
if let Ok(Some(v)) = self.cache.db.get_a_metadata(&real_pk, key) {
return Ok(Some(v));
}
// Fallback vers lazy_pk pour les clés semées avant téléchargement (cover_pk, etc.)
return self.cache.db.get_a_metadata(&self.pk, key).map_err(map_db_err);
}
}
self.cache
.db
.get_a_metadata(&self.pk, key)