use std::time::Duration;
use crate::download::DownloadPriority;
#[derive(Debug, Clone, serde::Serialize)]
pub struct GlobalSnapshot {
pub downloads: DownloadStats,
pub fetches: FetchStats,
pub post_processing: PostProcessStats,
pub playlists: PlaylistStats,
pub active_count: usize,
pub active_downloads: Vec<ActiveDownloadSnapshot>,
pub recent_downloads: Vec<DownloadSnapshot>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct DownloadStats {
pub attempted: u64,
pub completed: u64,
pub failed: u64,
pub canceled: u64,
pub queued: u64,
pub total_bytes: u64,
pub total_retries: u64,
pub total_duration: Duration,
pub avg_duration: Option<Duration>,
pub avg_speed_bytes_per_sec: Option<f64>,
pub peak_speed_bytes_per_sec: f64,
pub success_rate: Option<f64>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct ActiveDownloadSnapshot {
pub download_id: u64,
pub url: String,
pub priority: DownloadPriority,
pub downloaded_bytes: u64,
pub total_bytes: u64,
pub progress: Option<f64>,
pub peak_speed_bytes_per_sec: f64,
pub elapsed: Option<Duration>,
pub time_since_queued: Duration,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct DownloadSnapshot {
pub download_id: u64,
pub url: String,
pub priority: DownloadPriority,
pub outcome: DownloadOutcomeSnapshot,
pub bytes: u64,
pub duration: Option<Duration>,
pub queue_wait: Option<Duration>,
pub peak_speed_bytes_per_sec: f64,
pub retry_count: u32,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, serde::Serialize)]
pub enum DownloadOutcomeSnapshot {
Completed,
Failed,
Canceled,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct FetchStats {
pub attempted: u64,
pub succeeded: u64,
pub failed: u64,
pub avg_duration: Option<Duration>,
pub success_rate: Option<f64>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct PostProcessStats {
pub attempted: u64,
pub succeeded: u64,
pub failed: u64,
pub avg_duration: Option<Duration>,
pub success_rate: Option<f64>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct PlaylistStats {
pub playlists_fetched: u64,
pub playlists_fetch_failed: u64,
pub items_successful: u64,
pub items_failed: u64,
pub item_success_rate: Option<f64>,
}
impl std::fmt::Display for GlobalSnapshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"GlobalSnapshot(active={}, downloads={}, fetches={}, playlists={})",
self.active_count, self.downloads, self.fetches, self.playlists
)
}
}
impl std::fmt::Display for DownloadStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"DownloadStats(attempted={}, completed={}, failed={})",
self.attempted, self.completed, self.failed
)
}
}
impl std::fmt::Display for ActiveDownloadSnapshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"ActiveDownloadSnapshot(id={}, downloaded={}, total={})",
self.download_id, self.downloaded_bytes, self.total_bytes
)
}
}
impl std::fmt::Display for DownloadSnapshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"DownloadSnapshot(id={}, outcome={}, bytes={})",
self.download_id, self.outcome, self.bytes
)
}
}
impl std::fmt::Display for DownloadOutcomeSnapshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Completed => f.write_str("Completed"),
Self::Failed => f.write_str("Failed"),
Self::Canceled => f.write_str("Canceled"),
}
}
}
impl std::fmt::Display for FetchStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"FetchStats(attempted={}, succeeded={}, failed={})",
self.attempted, self.succeeded, self.failed
)
}
}
impl std::fmt::Display for PostProcessStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"PostProcessStats(attempted={}, succeeded={}, failed={})",
self.attempted, self.succeeded, self.failed
)
}
}
impl std::fmt::Display for PlaylistStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"PlaylistStats(fetched={}, items_ok={}, items_failed={})",
self.playlists_fetched, self.items_successful, self.items_failed
)
}
}