use chrono::Utc;
use futures_util::StreamExt;
use rs2_stream::media::streaming::StreamingServiceFactory;
use rs2_stream::media::types::{MediaChunk, MediaStream, MediaType, QualityLevel};
use std::collections::HashMap;
use std::path::PathBuf;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let streaming_service = StreamingServiceFactory::create_file_streaming_service();
let stream_config = MediaStream {
id: "example-file-stream".to_string(),
user_id: 1,
content_type: MediaType::Mixed,
quality: QualityLevel::High,
chunk_size: 64 * 1024, created_at: Utc::now(),
metadata: HashMap::new(),
};
let file_path = PathBuf::from("examples/test_media.txt");
if !file_path.exists() {
use std::fs::File;
use std::io::Write;
let mut file = File::create(&file_path)?;
file.write_all(b"This is a test media file for the streaming example. It contains some sample data that will be streamed in chunks.")?;
println!("Created test file: {:?}", file_path);
}
println!("Starting file stream from: {:?}", file_path);
let chunk_stream = streaming_service
.start_file_stream(file_path, stream_config)
.await;
let mut chunk_count = 0;
let mut _total_bytes = 0;
let mut chunk_stream = std::pin::pin!(chunk_stream);
while let Some(chunk) = chunk_stream.next().await {
chunk_count += 1;
_total_bytes += chunk.data.len();
println!(
"Received chunk #{}: type={:?}, size={} bytes, priority={:?}",
chunk.sequence_number,
chunk.chunk_type,
chunk.data.len(),
chunk.priority
);
if chunk_count >= 100 {
break;
}
}
let metrics = streaming_service.get_metrics().await;
println!("\nStream Metrics:");
println!(" Name: {}", metrics.name.as_deref().unwrap_or("unknown"));
println!(" Bytes processed: {}", metrics.bytes_processed);
println!(" Items processed: {}", metrics.items_processed);
println!(" Errors: {}", metrics.errors);
println!(
" Average item size: {:.2} bytes",
metrics.average_item_size
);
println!(" Processing time: {:?}", metrics.processing_time);
streaming_service.shutdown().await;
println!("Streaming service shut down");
Ok(())
}
fn process_chunk(_chunk: &MediaChunk) {
std::thread::sleep(Duration::from_millis(10));
}