2025-10-16 22:13:00 +02:00
|
|
|
//! Exemple d'utilisation basique de pmoplaylist
|
|
|
|
|
//!
|
|
|
|
|
//! Pour exécuter cet exemple :
|
|
|
|
|
//! ```bash
|
|
|
|
|
//! cargo run -p pmoplaylist --example basic_usage
|
|
|
|
|
//! ```
|
|
|
|
|
|
2025-10-19 13:42:29 +02:00
|
|
|
use pmoplaylist::{DEFAULT_IMAGE, FifoPlaylist, Track};
|
2025-10-16 22:13:00 +02:00
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() {
|
|
|
|
|
println!("=== Exemple pmoplaylist ===\n");
|
|
|
|
|
|
|
|
|
|
// 1. Créer une playlist FIFO
|
|
|
|
|
println!("1. Création d'une playlist avec capacité de 5 tracks...");
|
|
|
|
|
let playlist = FifoPlaylist::new(
|
|
|
|
|
"my-radio".to_string(),
|
|
|
|
|
"Ma Radio Préférée".to_string(),
|
|
|
|
|
5,
|
|
|
|
|
DEFAULT_IMAGE,
|
|
|
|
|
);
|
|
|
|
|
println!(" ✓ Playlist créée: {}", playlist.title().await);
|
|
|
|
|
println!(" ✓ ID: {}", playlist.id().await);
|
|
|
|
|
println!(" ✓ Capacité: 5 tracks");
|
|
|
|
|
println!(" ✓ Update ID initial: {}\n", playlist.update_id().await);
|
|
|
|
|
|
|
|
|
|
// 2. Ajouter des tracks
|
|
|
|
|
println!("2. Ajout de 3 tracks...");
|
|
|
|
|
let tracks = vec![
|
2025-10-19 13:42:29 +02:00
|
|
|
Track::new(
|
|
|
|
|
"track-1",
|
|
|
|
|
"Bohemian Rhapsody",
|
|
|
|
|
"http://example.com/queen/bohemian.flac",
|
|
|
|
|
)
|
|
|
|
|
.with_artist("Queen")
|
|
|
|
|
.with_album("A Night at the Opera")
|
|
|
|
|
.with_duration(354)
|
|
|
|
|
.with_image("http://example.com/covers/queen-anato.jpg"),
|
|
|
|
|
Track::new(
|
|
|
|
|
"track-2",
|
|
|
|
|
"Stairway to Heaven",
|
|
|
|
|
"http://example.com/zeppelin/stairway.mp3",
|
|
|
|
|
)
|
|
|
|
|
.with_artist("Led Zeppelin")
|
|
|
|
|
.with_album("Led Zeppelin IV")
|
|
|
|
|
.with_duration(482),
|
|
|
|
|
Track::new(
|
|
|
|
|
"track-3",
|
|
|
|
|
"Hotel California",
|
|
|
|
|
"http://example.com/eagles/hotel.flac",
|
|
|
|
|
)
|
|
|
|
|
.with_artist("Eagles")
|
|
|
|
|
.with_album("Hotel California")
|
|
|
|
|
.with_duration(391),
|
2025-10-16 22:13:00 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
for track in tracks {
|
|
|
|
|
playlist.append_track(track.clone()).await;
|
2025-10-19 13:42:29 +02:00
|
|
|
println!(
|
|
|
|
|
" ✓ Ajouté: {} - {}",
|
|
|
|
|
track.title,
|
|
|
|
|
track.artist.unwrap_or_default()
|
|
|
|
|
);
|
2025-10-16 22:13:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
println!("\n Total tracks: {}", playlist.len().await);
|
|
|
|
|
println!(" Update ID: {}\n", playlist.update_id().await);
|
|
|
|
|
|
|
|
|
|
// 3. Tester le comportement FIFO
|
|
|
|
|
println!("3. Test du comportement FIFO (capacité = 5)...");
|
|
|
|
|
println!(" Ajout de 4 tracks supplémentaires...");
|
|
|
|
|
|
|
|
|
|
for i in 4..=7 {
|
|
|
|
|
let track = Track::new(
|
|
|
|
|
format!("track-{}", i),
|
|
|
|
|
format!("Song Number {}", i),
|
2025-10-19 13:42:29 +02:00
|
|
|
format!("http://example.com/songs/{}.mp3", i),
|
2025-10-16 22:13:00 +02:00
|
|
|
);
|
|
|
|
|
playlist.append_track(track).await;
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-19 13:42:29 +02:00
|
|
|
println!(
|
|
|
|
|
" ✓ Total tracks (limité par capacité): {}",
|
|
|
|
|
playlist.len().await
|
|
|
|
|
);
|
2025-10-16 22:13:00 +02:00
|
|
|
|
|
|
|
|
// Afficher les tracks actuels
|
|
|
|
|
let items = playlist.get_items(0, 10).await;
|
|
|
|
|
println!("\n Tracks actuels dans la FIFO:");
|
|
|
|
|
for (idx, track) in items.iter().enumerate() {
|
|
|
|
|
println!(" {}. {} ({})", idx + 1, track.title, track.id);
|
|
|
|
|
}
|
|
|
|
|
println!(" (Les tracks 1 et 2 ont été supprimés automatiquement)\n");
|
|
|
|
|
|
|
|
|
|
// 4. Supprimer le plus ancien
|
|
|
|
|
println!("4. Suppression du track le plus ancien...");
|
|
|
|
|
if let Some(removed) = playlist.remove_oldest().await {
|
|
|
|
|
println!(" ✓ Supprimé: {} ({})", removed.title, removed.id);
|
|
|
|
|
}
|
|
|
|
|
println!(" Total tracks: {}", playlist.len().await);
|
|
|
|
|
println!(" Update ID: {}\n", playlist.update_id().await);
|
|
|
|
|
|
|
|
|
|
// 5. Supprimer par ID
|
|
|
|
|
println!("5. Suppression d'un track par ID (track-5)...");
|
|
|
|
|
if playlist.remove_by_id("track-5").await {
|
|
|
|
|
println!(" ✓ Track supprimé");
|
|
|
|
|
}
|
|
|
|
|
println!(" Total tracks: {}", playlist.len().await);
|
|
|
|
|
println!(" Update ID: {}\n", playlist.update_id().await);
|
|
|
|
|
|
|
|
|
|
// 6. Générer un Container DIDL-Lite
|
|
|
|
|
println!("6. Génération du Container DIDL-Lite...");
|
|
|
|
|
let container = playlist.as_container().await;
|
|
|
|
|
println!(" Container:");
|
|
|
|
|
println!(" - ID: {}", container.id);
|
|
|
|
|
println!(" - Parent ID: {}", container.parent_id);
|
|
|
|
|
println!(" - Title: {}", container.title);
|
|
|
|
|
println!(" - Class: {}", container.class);
|
2025-10-19 13:42:29 +02:00
|
|
|
println!(
|
|
|
|
|
" - Child Count: {}\n",
|
|
|
|
|
container.child_count.unwrap_or_default()
|
|
|
|
|
);
|
2025-10-16 22:13:00 +02:00
|
|
|
|
|
|
|
|
// 7. Générer des Items DIDL-Lite
|
|
|
|
|
println!("7. Génération des Items DIDL-Lite...");
|
2025-10-19 13:42:29 +02:00
|
|
|
let didl_items = playlist
|
|
|
|
|
.as_objects(0, 10, Some("http://myserver/api/default-image"))
|
|
|
|
|
.await;
|
2025-10-16 22:13:00 +02:00
|
|
|
|
|
|
|
|
println!(" Items DIDL-Lite:");
|
|
|
|
|
for (idx, item) in didl_items.iter().enumerate() {
|
|
|
|
|
println!("\n Item {}:", idx + 1);
|
|
|
|
|
println!(" - ID: {}", item.id);
|
|
|
|
|
println!(" - Title: {}", item.title);
|
|
|
|
|
println!(" - Artist: {}", item.artist.as_deref().unwrap_or("N/A"));
|
|
|
|
|
println!(" - Album: {}", item.album.as_deref().unwrap_or("N/A"));
|
|
|
|
|
println!(" - Class: {}", item.class);
|
|
|
|
|
println!(" - Parent ID: {}", item.parent_id);
|
|
|
|
|
|
|
|
|
|
if !item.resources.is_empty() {
|
|
|
|
|
println!(" - Resource URI: {}", item.resources[0].url);
|
|
|
|
|
if let Some(ref duration) = item.resources[0].duration {
|
|
|
|
|
println!(" - Duration: {}", duration);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let Some(ref art) = item.album_art {
|
|
|
|
|
println!(" - Album Art: {}", art);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 8. Image par défaut
|
|
|
|
|
println!("\n8. Image par défaut...");
|
|
|
|
|
let default_image = playlist.default_image().await;
|
2025-10-19 13:42:29 +02:00
|
|
|
println!(
|
|
|
|
|
" ✓ Taille de l'image par défaut: {} bytes",
|
|
|
|
|
default_image.len()
|
|
|
|
|
);
|
2025-10-16 22:13:00 +02:00
|
|
|
println!(" (Cette image peut être servie via un endpoint HTTP)\n");
|
|
|
|
|
|
|
|
|
|
// 9. Vider la playlist
|
|
|
|
|
println!("9. Vidage de la playlist...");
|
|
|
|
|
playlist.clear().await;
|
|
|
|
|
println!(" ✓ Playlist vidée");
|
|
|
|
|
println!(" Total tracks: {}", playlist.len().await);
|
|
|
|
|
println!(" Is empty: {}", playlist.is_empty().await);
|
|
|
|
|
println!(" Update ID final: {}\n", playlist.update_id().await);
|
|
|
|
|
|
|
|
|
|
println!("=== Exemple terminé ===");
|
|
|
|
|
}
|