- 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.
pmoqobuz - Client Rust pour l'API Qobuz
Client Rust pour l'API Qobuz avec intégration automatique du Spoofer pour obtenir des AppID et secrets valides.
🎯 Fonctionnalités
- ✅ Authentification automatique avec credentials
- ✅ Spoofer intégré - Obtention automatique d'AppID et secrets valides
- ✅ Signatures MD5 pour les requêtes sensibles (streaming, bibliothèque)
- ✅ Cache en mémoire pour optimiser les performances
- ✅ Support DIDL-Lite pour l'export UPnP/DLNA
- ✅ Recherche dans le catalogue (albums, artistes, tracks, playlists)
- ✅ Favoris et playlists utilisateur
- ✅ Désérialisation robuste (gère integers et strings pour les IDs)
🚀 Utilisation rapide
Configuration minimale
# ~/.pmomusic/config.yaml
accounts:
qobuz:
username: "your_email@example.com"
password: "your_password"
# AppID et secret seront automatiquement obtenus via le Spoofer
Code d'exemple
use pmoqobuz::QobuzClient;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Le Spoofer s'exécute automatiquement si nécessaire
let client = QobuzClient::from_config().await?;
// Rechercher des albums
let albums = client.search_albums("Miles Davis").await?;
for album in albums.iter().take(5) {
println!("{} - {}", album.artist.name, album.title);
}
Ok(())
}
📖 Documentation
- IMPLEMENTATION_STATUS.md - Statut d'implémentation complet
- API_ANALYSIS.md - Analyse des différences avec l'API Python
- examples/basic_usage.rs - Exemple complet
- examples/spoofer.rs - Utilisation manuelle du Spoofer