#![allow(async_fn_in_trait)]
use super::models::{
UnifiedEpisode, UnifiedMovie, UnifiedMovieDetails, UnifiedPerson, UnifiedPersonDetails,
UnifiedSearchResult, UnifiedSeasonDetails, UnifiedTvShow, UnifiedTvShowDetails,
UnifiedWatchProviders,
};
use crate::core::pagination::PaginatedResponse;
pub trait SearchProvider {
type Error: std::error::Error + Send + Sync + 'static;
async fn search_movies(
&self,
query: &str,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn search_tv_shows(
&self,
query: &str,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
async fn search_people(
&self,
query: &str,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedPerson>, Self::Error>;
async fn search_multi(
&self,
query: &str,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedSearchResult>, Self::Error>;
}
pub trait DetailProvider {
type Error: std::error::Error + Send + Sync + 'static;
async fn movie_details(&self, id: i32) -> Result<UnifiedMovieDetails, Self::Error>;
async fn tv_show_details(&self, id: i32) -> Result<UnifiedTvShowDetails, Self::Error>;
async fn person_details(&self, id: i32) -> Result<UnifiedPersonDetails, Self::Error>;
}
pub trait DiscoveryProvider {
type Error: std::error::Error + Send + Sync + 'static;
async fn trending_movies(
&self,
time_window: crate::core::config::TimeWindow,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn trending_tv_shows(
&self,
time_window: crate::core::config::TimeWindow,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
async fn popular_movies(
&self,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn top_rated_movies(
&self,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn popular_tv_shows(
&self,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
async fn top_rated_tv_shows(
&self,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
}
pub trait RecommendationProvider {
type Error: std::error::Error + Send + Sync + 'static;
async fn movie_recommendations(
&self,
id: i32,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn tv_recommendations(
&self,
id: i32,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
async fn similar_movies(
&self,
id: i32,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedMovie>, Self::Error>;
async fn similar_tv_shows(
&self,
id: i32,
page: Option<u32>,
) -> Result<PaginatedResponse<UnifiedTvShow>, Self::Error>;
}
pub trait SeasonProvider {
type Error: std::error::Error + Send + Sync + 'static;
async fn season_details(
&self,
show_id: i32,
season_number: u32,
) -> Result<UnifiedSeasonDetails, Self::Error>;
async fn episode_details(
&self,
show_id: i32,
season_number: u32,
episode_number: u32,
) -> Result<UnifiedEpisode, Self::Error>;
}
pub trait WatchProviderTrait {
type Error: std::error::Error + Send + Sync + 'static;
async fn movie_watch_providers(&self, id: i32) -> Result<UnifiedWatchProviders, Self::Error>;
async fn tv_watch_providers(&self, id: i32) -> Result<UnifiedWatchProviders, Self::Error>;
}
pub trait MediaProvider: SearchProvider + DetailProvider + DiscoveryProvider {}
impl<T> MediaProvider for T where T: SearchProvider + DetailProvider + DiscoveryProvider {}