- Remplacer les appels à `covers_absolute_url_for` par `covers_route_for` pour générer des URLs relatives basées sur les routes - Introduire le trait `CoverCacheable` pour généraliser le cache des covers (Album, Playlist, Artist, Track) - Remplacer les fonctions spécifiques (`cache_album_covers`, etc.) par une fonction générique `cache_covers` - Simplifier le code en unifiant la logique de mise en cache des covers - Corriger l'initialisation de `PMO_SERVER_URL` pour utiliser `base_url()` (incluant le port) au lieu d'une URL brute
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