Première tentative d'une crate pmoqobuz
This commit is contained in:
118
pmoqobuz/examples/basic_usage.rs
Normal file
118
pmoqobuz/examples/basic_usage.rs
Normal 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(())
|
||||
}
|
||||
100
pmoqobuz/examples/server_with_covers.rs
Normal file
100
pmoqobuz/examples/server_with_covers.rs
Normal file
@@ -0,0 +1,100 @@
|
||||
//! Exemple d'utilisation de pmoqobuz avec pmoserver et pmocovers
|
||||
//!
|
||||
//! Cet exemple montre comment :
|
||||
//! - Créer un serveur HTTP avec pmoserver
|
||||
//! - Initialiser le cache d'images avec pmocovers
|
||||
//! - Initialiser le client Qobuz avec intégration pmocovers
|
||||
//! - Les images d'albums sont automatiquement mises en cache
|
||||
//!
|
||||
//! Pour tester :
|
||||
//! ```bash
|
||||
//! cargo run --example server_with_covers --features "pmoserver,covers"
|
||||
//! ```
|
||||
//!
|
||||
//! Endpoints disponibles :
|
||||
//! - GET /qobuz/search?q=query&type=albums - Recherche d'albums (images auto-cachées)
|
||||
//! - GET /qobuz/albums/{id} - Détails d'un album (image auto-cachée)
|
||||
//! - GET /qobuz/favorites/albums - Albums favoris (images auto-cachées)
|
||||
//! - GET /covers/images/{pk} - Image originale mise en cache
|
||||
//! - GET /covers/images/{pk}/{size} - Variante redimensionnée
|
||||
//! - GET /api/covers - API REST du cache d'images
|
||||
//! - GET /swagger-ui - Documentation interactive
|
||||
|
||||
#[cfg(all(feature = "pmoserver", feature = "covers"))]
|
||||
use pmocovers::CoverCacheExt;
|
||||
|
||||
#[cfg(all(feature = "pmoserver", feature = "covers"))]
|
||||
use pmoqobuz::QobuzServerExt;
|
||||
|
||||
#[cfg(all(feature = "pmoserver", feature = "covers"))]
|
||||
use pmoserver::ServerBuilder;
|
||||
|
||||
#[cfg(all(feature = "pmoserver", feature = "covers"))]
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
// Initialiser le logging
|
||||
tracing_subscriber::fmt()
|
||||
.with_max_level(tracing::Level::INFO)
|
||||
.init();
|
||||
|
||||
println!("=== PMOQobuz + PMOCovers - Serveur HTTP avec cache d'images ===\n");
|
||||
|
||||
// Créer le serveur depuis la configuration
|
||||
let mut server = ServerBuilder::new_configured().build();
|
||||
|
||||
println!("1. Initialisation du cache d'images (pmocovers)...");
|
||||
// Initialiser le cache d'images avec la configuration
|
||||
let cache = server.init_cover_cache_configured().await?;
|
||||
println!(" ✓ Cache d'images initialisé: {}", cache.cache_dir());
|
||||
|
||||
println!("\n2. Initialisation du client Qobuz avec intégration pmocovers...");
|
||||
// Initialiser le client Qobuz avec intégration pmocovers
|
||||
// Les images d'albums seront automatiquement ajoutées au cache
|
||||
let client = server.init_qobuz_client_configured_with_covers(cache.clone()).await?;
|
||||
|
||||
if let Some(auth_info) = client.auth_info() {
|
||||
println!(" ✓ Client Qobuz connecté !");
|
||||
println!(" User ID: {}", auth_info.user_id);
|
||||
if let Some(label) = &auth_info.subscription_label {
|
||||
println!(" Abonnement: {}", label);
|
||||
}
|
||||
}
|
||||
|
||||
println!("\n3. Démarrage du serveur HTTP...");
|
||||
server.start().await;
|
||||
|
||||
println!("\n✓ Serveur démarré avec succès !\n");
|
||||
println!("Endpoints disponibles :");
|
||||
println!(" • Qobuz API:");
|
||||
println!(" - GET /qobuz/search?q=query&type=albums");
|
||||
println!(" - GET /qobuz/albums/{{id}}");
|
||||
println!(" - GET /qobuz/albums/{{id}}/tracks");
|
||||
println!(" - GET /qobuz/favorites/albums");
|
||||
println!(" - GET /qobuz/favorites/artists");
|
||||
println!(" - GET /qobuz/cache/stats");
|
||||
println!(" • Images (auto-cachées depuis Qobuz):");
|
||||
println!(" - GET /covers/images/{{pk}}");
|
||||
println!(" - GET /covers/images/{{pk}}/{{size}}");
|
||||
println!(" • API REST du cache:");
|
||||
println!(" - GET /api/covers");
|
||||
println!(" - POST /api/covers");
|
||||
println!(" - DELETE /api/covers/{{pk}}");
|
||||
println!(" • Documentation:");
|
||||
println!(" - GET /swagger-ui");
|
||||
println!("\nExemple de requête :");
|
||||
println!(" curl 'http://localhost:3000/qobuz/search?q=Miles%20Davis&type=albums' | jq '.[0].image_cached'");
|
||||
println!(" # Retourne: \"/covers/images/{{pk}}\"");
|
||||
println!("\nAppuyez sur Ctrl+C pour arrêter le serveur...\n");
|
||||
|
||||
// Attendre indéfiniment
|
||||
server.wait().await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(not(all(feature = "pmoserver", feature = "covers")))]
|
||||
fn main() {
|
||||
eprintln!("Cet exemple nécessite les features 'pmoserver' et 'covers'");
|
||||
eprintln!("Exécutez: cargo run --example server_with_covers --features \"pmoserver,covers\"");
|
||||
std::process::exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user