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

@@ -328,6 +328,7 @@ impl SourceCacheManager {
None
};
let metadata_is_some = metadata.is_some();
let mut final_metadata = metadata;
if final_metadata.is_none() {
if let Some(data) = provider_data.as_ref() {
@@ -352,10 +353,25 @@ impl SourceCacheManager {
if let Some(meta) = final_metadata.as_ref() {
self.seed_audio_metadata(lazy_pk, meta);
} else {
#[cfg(feature = "server")]
tracing::warn!(
"cache_audio_lazy_with_provider: no metadata to seed for {} \
(meta_hint={}, provider_data={})",
lazy_pk,
metadata_is_some,
provider_data.as_ref().map(|d| d.metadata.is_some()).unwrap_or(false)
);
}
if let Some(cover_pk) = final_cover_pk {
let _ = self.set_audio_metadata(lazy_pk, "cover_pk", json!(cover_pk));
} else {
#[cfg(feature = "server")]
tracing::debug!(
"cache_audio_lazy_with_provider: no cover_pk seeded for {}",
lazy_pk
);
}
Ok(lazy_pk.to_string())