Skip to content

Commit

Permalink
Merge pull request #658 from Stremio/feat/resource-response-cache
Browse files Browse the repository at this point in the history
feat: Add Cache response fields for addon Response
  • Loading branch information
tymmesyde authored Mar 25, 2024
2 parents 5c98d34 + c82c021 commit 5a27db8
Showing 1 changed file with 76 additions and 0 deletions.
76 changes: 76 additions & 0 deletions src/types/addon/response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,77 @@ use crate::types::{
resource::{MetaItem, MetaItemPreview, Stream, Subtitles},
};

/// Resource response that handles the optional cache values defined in the SDK.
/// This is a shim struct to avoid the custom Deserialize impl that skips those fields
/// for the [`ResourceResponse`] enum.
///
/// See <https://github.com/Stremio/stremio-addon-sdk/tree/master/docs/api/requests>
///
/// - [`ResourceResponse::Metas`]`: <https://github.com/Stremio/stremio-addon-sdk/blob/master/docs/api/requests/defineCatalogHandler.md#returns>
/// - [`ResourceResponse::MetaDetailed`]: None
/// - [`ResourceResponse::Meta`]: <https://github.com/Stremio/stremio-addon-sdk/blob/master/docs/api/requests/defineMetaHandler.md#returns>
/// - [`ResourceResponse::Addons`]: <https://github.com/Stremio/stremio-addon-sdk/blob/master/docs/api/requests/defineResourceHandler.md#returns>
/// - [`ResourceResponse::Streams`]: <https://github.com/Stremio/stremio-addon-sdk/blob/master/docs/api/requests/defineStreamHandler.md#returns>
/// - [`ResourceResponse::Subtitles`]: <https://github.com/Stremio/stremio-addon-sdk/blob/master/docs/api/requests/defineSubtitlesHandler.md#returns>
/// -
///
/// # Examples
///
/// ```
/// use serde_json::json;
///
/// use stremio_core::types::{
/// addon::{ResourceResponseCache, ResourceResponse},
/// resource::{Stream, StreamSource, StreamBehaviorHints},
/// };
///
/// let cache_info_json = json!({
/// "streams": [
/// {
/// "name": "Addon\n4k",
/// "title": "South Park - Seasons 1 to 25 (S01-S25) Collectors Edition The Movie and Extras [NVEnc 10Bit 1080p to 2160p HEVC][DD DDP & TrueHD 5.1Ch]\nSeason 02/South Park - S02E05 - Conjoined Fetus Lady.mp4",
/// "url": "https://example-url-stream.com/South_Park_S02_E05.mp4",
/// },
/// ],
/// "cacheMaxAge": 3600,
/// "staleRevalidate": 14400,
/// "staleError": 604800,
///
/// });
///
/// let response_cache = serde_json::from_value(cache_info_json).expect("Should deserialize");
/// assert_eq!(ResourceResponseCache {
/// cache_max_age: Some(3600),
/// stale_revalidate: Some(14400),
/// stale_error: Some(604800),
/// resource: ResourceResponse::Streams{
/// streams: vec![
/// Stream {
/// source: StreamSource::Url { url: "https://example-url-stream.com/South_Park_S02_E05.mp4".parse().unwrap() },
/// name: Some("Addon\n4k".into()),
/// description: Some("South Park - Seasons 1 to 25 (S01-S25) Collectors Edition The Movie and Extras [NVEnc 10Bit 1080p to 2160p HEVC][DD DDP & TrueHD 5.1Ch]\nSeason 02/South Park - S02E05 - Conjoined Fetus Lady.mp4".into()),
/// thumbnail: None,
/// subtitles: vec![],
/// behavior_hints: StreamBehaviorHints::default(),
/// }
/// ]
/// }
/// }, response_cache);
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ResourceResponseCache {
/// (in seconds) which sets the `Cache-Control` header to `max-age=$cacheMaxAge` and overwrites the global cache time set in serveHTTP options
pub cache_max_age: Option<u64>,
/// (in seconds) which sets the `Cache-Control` header to `stale-while-revalidate=$staleRevalidate`
pub stale_revalidate: Option<u64>,
/// (in seconds) which sets the `Cache-Control` header to `stale-if-error=$staleError`
pub stale_error: Option<u64>,
#[serde(flatten)]
pub resource: ResourceResponse,
}

/// Resource Response from an addon.
///
/// Deserializing the struct from json will skip any invalid Vec items
Expand All @@ -16,22 +87,27 @@ use crate::types::{
#[serde_as]
pub enum ResourceResponse {
Metas {
#[serde_as(as = "VecSkipError<_>")]
metas: Vec<MetaItemPreview>,
},
#[serde(rename_all = "camelCase")]
MetasDetailed {
#[serde_as(as = "VecSkipError<_>")]
metas_detailed: Vec<MetaItem>,
},
Meta {
meta: MetaItem,
},
Streams {
#[serde_as(as = "VecSkipError<_>")]
streams: Vec<Stream>,
},
Subtitles {
#[serde_as(as = "VecSkipError<_>")]
subtitles: Vec<Subtitles>,
},
Addons {
#[serde_as(as = "VecSkipError<_>")]
addons: Vec<DescriptorPreview>,
},
}
Expand Down

0 comments on commit 5a27db8

Please sign in to comment.