Première tentative d'une crate pmoqobuz

This commit is contained in:
2025-10-11 15:59:43 +02:00
parent fb94886c53
commit 11187db71b
20 changed files with 3821 additions and 6 deletions

View File

@@ -0,0 +1,118 @@
//! Exemple d'utilisation basique de pmoqobuz
//!
//! Cet exemple montre comment :
//! - Se connecter à Qobuz avec les credentials de la configuration
//! - Rechercher des albums
//! - Récupérer les détails d'un album
//! - Exporter un album en format DIDL-Lite
use pmoqobuz::{QobuzClient, ToDIDL};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Initialiser le logging
tracing_subscriber::fmt::init();
println!("=== PMOQobuz - Exemple d'utilisation basique ===\n");
// Créer un client depuis la configuration
println!("Connexion à Qobuz...");
let client = QobuzClient::from_config().await?;
if let Some(auth_info) = client.auth_info() {
println!("✓ Connecté avec succès !");
println!(" User ID: {}", auth_info.user_id);
if let Some(label) = &auth_info.subscription_label {
println!(" Abonnement: {}", label);
}
}
println!("\n--- Recherche d'albums ---");
let query = "Miles Davis";
println!("Recherche: '{}'...", query);
let albums = client.search_albums(query).await?;
println!("{} album(s) trouvé(s)\n", albums.len());
// Afficher les 5 premiers albums
for (i, album) in albums.iter().take(5).enumerate() {
println!(" {}. {} - {}", i + 1, album.artist.name, album.title);
if let Some(date) = &album.release_date {
println!(" Date: {}", date);
}
if let Some(count) = album.tracks_count {
println!(" Pistes: {}", count);
}
}
// Récupérer les détails du premier album
if let Some(first_album) = albums.first() {
println!("\n--- Détails de l'album ---");
println!("Album: {} - {}", first_album.artist.name, first_album.title);
// Récupérer les tracks
let tracks = client.get_album_tracks(&first_album.id).await?;
println!("Tracks ({}):", tracks.len());
for track in tracks.iter().take(3) {
println!(
" {}. {} - {} ({}:{})",
track.track_number,
track.display_artist().map(|a| a.name.as_str()).unwrap_or("Unknown"),
track.title,
track.duration / 60,
track.duration % 60
);
}
if tracks.len() > 3 {
println!(" ... et {} autres pistes", tracks.len() - 3);
}
// Export DIDL
println!("\n--- Export DIDL-Lite ---");
let didl_container = first_album.to_didl_container("0")?;
println!("Container ID: {}", didl_container.id);
println!("Title: {}", didl_container.title);
println!("Class: {}", didl_container.class);
if let Some(first_track) = tracks.first() {
let didl_item = first_track.to_didl_item(&didl_container.id)?;
println!("\nPremière track en DIDL:");
println!(" Item ID: {}", didl_item.id);
println!(" Title: {}", didl_item.title);
if let Some(artist) = &didl_item.artist {
println!(" Artist: {}", artist);
}
}
}
// Afficher les statistiques du cache
println!("\n--- Statistiques du cache ---");
let stats = client.cache().stats().await;
println!("Albums en cache: {}", stats.albums_count);
println!("Tracks en cache: {}", stats.tracks_count);
println!("Artistes en cache: {}", stats.artists_count);
println!("Total: {} entrées", stats.total_count());
// Favoris
println!("\n--- Albums favoris ---");
match client.get_favorite_albums().await {
Ok(favorites) => {
println!("{} album(s) favori(s)", favorites.len());
for (i, album) in favorites.iter().take(5).enumerate() {
println!(" {}. {} - {}", i + 1, album.artist.name, album.title);
}
if favorites.len() > 5 {
println!(" ... et {} autres", favorites.len() - 5);
}
}
Err(e) => {
println!("⚠ Impossible de récupérer les favoris: {}", e);
}
}
println!("\n✓ Exemple terminé avec succès !");
Ok(())
}