Files
pmomusic/pmoqobuz
Eric Coissac 5095dd6964 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.
2026-03-25 12:25:43 +01:00
..
2025-12-14 20:39:08 +01:00
2025-10-16 22:12:15 +02:00
2025-12-17 08:47:07 +01:00
2025-12-17 07:23:25 +01:00
2025-12-13 13:56:55 +01:00
2025-12-11 21:35:17 +00:00
2025-12-11 21:35:17 +00:00
2025-12-11 21:35:17 +00:00
2025-12-11 21:35:17 +00:00

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