101 lines
3.4 KiB
Rust
101 lines
3.4 KiB
Rust
|
|
//! Example demonstrating Radio Paradise with cache support
|
|||
|
|
//!
|
|||
|
|
//! This example shows how to use the RadioParadiseSource with pmocovers
|
|||
|
|
//! and pmoaudiocache to cache both cover images and audio tracks.
|
|||
|
|
//!
|
|||
|
|
//! Run with:
|
|||
|
|
//! ```bash
|
|||
|
|
//! cargo run --example with_cache --features cache
|
|||
|
|
//! ```
|
|||
|
|
|
|||
|
|
use pmoparadise::{RadioParadiseClient, RadioParadiseSource};
|
|||
|
|
use pmocovers::Cache as CoverCache;
|
|||
|
|
use pmoaudiocache::AudioCache;
|
|||
|
|
use pmosource::MusicSource;
|
|||
|
|
use std::sync::Arc;
|
|||
|
|
use tokio::time::{sleep, Duration};
|
|||
|
|
|
|||
|
|
#[tokio::main]
|
|||
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
|
|
// Initialize tracing
|
|||
|
|
tracing_subscriber::fmt::init();
|
|||
|
|
|
|||
|
|
println!("🎵 Radio Paradise with Cache Support");
|
|||
|
|
println!("=====================================\n");
|
|||
|
|
|
|||
|
|
// Create the Radio Paradise client
|
|||
|
|
println!("📡 Connecting to Radio Paradise...");
|
|||
|
|
let client = RadioParadiseClient::new().await?;
|
|||
|
|
println!("✅ Connected!\n");
|
|||
|
|
|
|||
|
|
// Initialize caches
|
|||
|
|
println!("💾 Initializing caches...");
|
|||
|
|
let cover_cache = Arc::new(CoverCache::new("./cache/covers", 500)?);
|
|||
|
|
let audio_cache = Arc::new(AudioCache::new("./cache/audio", 100)?);
|
|||
|
|
println!("✅ Caches initialized!\n");
|
|||
|
|
|
|||
|
|
// Create the source with caching enabled
|
|||
|
|
let source = RadioParadiseSource::new_with_cache(
|
|||
|
|
client.clone(),
|
|||
|
|
"http://localhost:8080",
|
|||
|
|
50,
|
|||
|
|
Some(cover_cache.clone()),
|
|||
|
|
Some(audio_cache.clone()),
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
println!("📻 Source: {}", source.name());
|
|||
|
|
println!("🆔 ID: {}", source.id());
|
|||
|
|
println!("📝 Supports FIFO: {}\n", source.supports_fifo());
|
|||
|
|
|
|||
|
|
// Fetch current playing information
|
|||
|
|
println!("🎧 Fetching current track information...");
|
|||
|
|
let now_playing = client.now_playing().await?;
|
|||
|
|
let block = Arc::new(now_playing.block.clone());
|
|||
|
|
|
|||
|
|
println!("\n🎵 Now Playing:");
|
|||
|
|
println!(" Event: {}", block.event);
|
|||
|
|
if let Some(song) = &now_playing.current_song {
|
|||
|
|
println!(" Title: {}", song.title);
|
|||
|
|
println!(" Artist: {}", song.artist);
|
|||
|
|
println!(" Album: {}", song.album);
|
|||
|
|
}
|
|||
|
|
println!();
|
|||
|
|
|
|||
|
|
// Add current song to the source
|
|||
|
|
println!("➕ Adding current track to FIFO with caching...");
|
|||
|
|
if let Some(song) = &now_playing.current_song {
|
|||
|
|
source.add_song(block.clone(), song, now_playing.current_song_index.unwrap_or(0)).await?;
|
|||
|
|
println!("✅ Track added and caching started!");
|
|||
|
|
println!(" - Cover image will be cached to: ./cache/covers/");
|
|||
|
|
println!(" - Audio will be cached to: ./cache/audio/\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Wait a bit for caching to start
|
|||
|
|
println!("⏳ Waiting for cache operations to complete...");
|
|||
|
|
sleep(Duration::from_secs(5)).await;
|
|||
|
|
|
|||
|
|
// Get items from FIFO
|
|||
|
|
println!("\n📋 Items in FIFO:");
|
|||
|
|
let items = source.get_items(0, 10).await?;
|
|||
|
|
for (i, item) in items.iter().enumerate() {
|
|||
|
|
println!(" {}. {} - {}",
|
|||
|
|
i + 1,
|
|||
|
|
item.artist.as_deref().unwrap_or("Unknown"),
|
|||
|
|
item.title
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// Show resolved URI (will use cached version if available)
|
|||
|
|
if let Ok(uri) = source.resolve_uri(&item.id).await {
|
|||
|
|
println!(" URI: {}", uri);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
println!("\n✨ Example complete!");
|
|||
|
|
println!("\n💡 Tips:");
|
|||
|
|
println!(" - Run the example again to see faster loading from cache");
|
|||
|
|
println!(" - Check ./cache/covers/ for cached cover images");
|
|||
|
|
println!(" - Check ./cache/audio/ for cached FLAC files");
|
|||
|
|
|
|||
|
|
Ok(())
|
|||
|
|
}
|