use anyhow::Result;
use async_trait::async_trait;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StreamQuality {
Best,
Worst,
Specific(u32),
}
#[derive(Debug, Clone)]
pub struct QualityInfo {
pub height: u32,
pub bandwidth: u64,
pub codecs: Option<String>,
}
#[derive(Debug, Clone)]
pub struct StreamInfo {
pub id: String,
pub title: String,
pub description: Option<String>,
pub duration_seconds: Option<u64>,
pub manifest_url: String,
pub is_live: bool,
pub qualities: Vec<QualityInfo>,
pub thumbnail_url: Option<String>,
}
#[derive(Debug, Clone)]
pub struct SeriesInfo {
pub id: String,
pub title: String,
pub episodes: Vec<EpisodeInfo>,
}
#[derive(Debug, Clone)]
pub struct EpisodeInfo {
pub id: String,
pub title: String,
pub episode_number: Option<u32>,
pub season_number: Option<u32>,
pub duration_seconds: Option<u64>,
pub publish_date: Option<String>,
}
#[async_trait]
pub trait StreamProvider: Send + Sync {
fn name(&self) -> &'static str;
fn matches(&self, url: &str) -> bool;
async fn get_stream_info(&self, id: &str) -> Result<StreamInfo>;
async fn list_series(&self, series_id: &str) -> Result<SeriesInfo>;
async fn search(&self, query: &str) -> Result<Vec<EpisodeInfo>> {
let _ = query;
Ok(vec![])
}
}