use super::{CameoClient, CameoClientError};
#[cfg(feature = "cache")]
use crate::cache::CacheKey;
use crate::{
core::pagination::Page,
unified::{
media_id::MediaId,
models::{UnifiedMovie, UnifiedTvShow},
},
};
impl CameoClient {
pub async fn movie_recommendations(
&self,
id: &MediaId,
page: Option<u32>,
) -> Result<Page<UnifiedMovie>, CameoClientError> {
#[cfg(feature = "cache")]
let key = CacheKey::Discovery {
provider: id.provider().to_string(),
endpoint: format!("movie_recommendations_{id}"),
page: page.unwrap_or(1),
};
#[cfg(feature = "cache")]
if let Some(hit) = self.cache_get::<Page<UnifiedMovie>>(&key).await {
return Ok(hit);
}
let result = self
.route(&self.recommendation, id)?
.movie_recommendations(id, page)
.await?;
#[cfg(feature = "cache")]
{
self.cache_put(key, &result, self.cache_discovery_ttl())
.await;
self.cache_movie_items(&result).await;
}
Ok(result)
}
pub async fn tv_recommendations(
&self,
id: &MediaId,
page: Option<u32>,
) -> Result<Page<UnifiedTvShow>, CameoClientError> {
#[cfg(feature = "cache")]
let key = CacheKey::Discovery {
provider: id.provider().to_string(),
endpoint: format!("tv_recommendations_{id}"),
page: page.unwrap_or(1),
};
#[cfg(feature = "cache")]
if let Some(hit) = self.cache_get::<Page<UnifiedTvShow>>(&key).await {
return Ok(hit);
}
let result = self
.route(&self.recommendation, id)?
.tv_recommendations(id, page)
.await?;
#[cfg(feature = "cache")]
{
self.cache_put(key, &result, self.cache_discovery_ttl())
.await;
self.cache_tv_items(&result).await;
}
Ok(result)
}
pub async fn similar_movies(
&self,
id: &MediaId,
page: Option<u32>,
) -> Result<Page<UnifiedMovie>, CameoClientError> {
#[cfg(feature = "cache")]
let key = CacheKey::Discovery {
provider: id.provider().to_string(),
endpoint: format!("similar_movies_{id}"),
page: page.unwrap_or(1),
};
#[cfg(feature = "cache")]
if let Some(hit) = self.cache_get::<Page<UnifiedMovie>>(&key).await {
return Ok(hit);
}
let result = self
.route(&self.recommendation, id)?
.similar_movies(id, page)
.await?;
#[cfg(feature = "cache")]
{
self.cache_put(key, &result, self.cache_discovery_ttl())
.await;
self.cache_movie_items(&result).await;
}
Ok(result)
}
pub async fn similar_tv_shows(
&self,
id: &MediaId,
page: Option<u32>,
) -> Result<Page<UnifiedTvShow>, CameoClientError> {
#[cfg(feature = "cache")]
let key = CacheKey::Discovery {
provider: id.provider().to_string(),
endpoint: format!("similar_tv_{id}"),
page: page.unwrap_or(1),
};
#[cfg(feature = "cache")]
if let Some(hit) = self.cache_get::<Page<UnifiedTvShow>>(&key).await {
return Ok(hit);
}
let result = self
.route(&self.recommendation, id)?
.similar_tv_shows(id, page)
.await?;
#[cfg(feature = "cache")]
{
self.cache_put(key, &result, self.cache_discovery_ttl())
.await;
self.cache_tv_items(&result).await;
}
Ok(result)
}
}