diff --git a/src/types/addon/response.rs b/src/types/addon/response.rs index af9339cc19..947109169d 100644 --- a/src/types/addon/response.rs +++ b/src/types/addon/response.rs @@ -58,6 +58,7 @@ use crate::types::{ /// 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![], +/// tags: vec![], /// behavior_hints: StreamBehaviorHints::default(), /// } /// ] diff --git a/src/types/resource/meta_item.rs b/src/types/resource/meta_item.rs index 1e52f4dcfb..2ea9568678 100644 --- a/src/types/resource/meta_item.rs +++ b/src/types/resource/meta_item.rs @@ -2,6 +2,7 @@ use core::cmp::Ordering; use std::borrow::Cow; use std::collections::HashMap; +use std::vec; use chrono::{DateTime, Utc}; use either::Either; @@ -214,6 +215,7 @@ impl From for MetaItemPreview { }, name: None, description: None, + tags: vec![], thumbnail: None, subtitles: vec![], behavior_hints: Default::default(), diff --git a/src/types/resource/stream.rs b/src/types/resource/stream.rs index 478b902899..56c1bfe89f 100644 --- a/src/types/resource/stream.rs +++ b/src/types/resource/stream.rs @@ -31,6 +31,7 @@ use crate::types::resource::Subtitles; /// description: None, /// thumbnail: None, /// subtitles: vec![], +/// tags: vec![], /// behavior_hints: StreamBehaviorHints::default(), /// }; /// @@ -47,6 +48,7 @@ use crate::types::resource::Subtitles; /// "description": null, /// "thumbnail": null, /// "subtitles": null, +/// "tags": null, /// "behaviorHints": null, /// }); /// @@ -69,6 +71,9 @@ pub struct Stream { #[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde_as(as = "DefaultOnNull>")] pub subtitles: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + #[serde_as(as = "DefaultOnNull>")] + pub tags: Vec, #[serde(default, skip_serializing_if = "is_default_value")] #[serde_as(as = "DefaultOnNull")] pub behavior_hints: StreamBehaviorHints, @@ -146,6 +151,7 @@ impl Stream { }, name: None, description: None, + tags: vec![], thumbnail: None, subtitles: vec![], behavior_hints: Default::default(), @@ -548,6 +554,14 @@ pub struct StreamBehaviorHints { pub other: HashMap, } +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)] +#[cfg_attr(test, derive(Derivative))] +#[cfg_attr(test, derivative(Default))] +pub struct Tag { + pub name: String, + pub value: String, +} + fn is_default_value(value: &T) -> bool { *value == T::default() } diff --git a/src/unit_tests/ctx/notifications/update_notifications.rs b/src/unit_tests/ctx/notifications/update_notifications.rs index b3ceb38e0b..d790f7e82f 100644 --- a/src/unit_tests/ctx/notifications/update_notifications.rs +++ b/src/unit_tests/ctx/notifications/update_notifications.rs @@ -298,6 +298,7 @@ fn test_pull_notifications_and_play_in_player() { }, name: None, description: None, + tags: vec![], thumbnail: None, subtitles: vec![], behavior_hints: Default::default(), diff --git a/src/unit_tests/ctx/uninstall_addon.rs b/src/unit_tests/ctx/uninstall_addon.rs index be4d380da1..d9ca3bf588 100644 --- a/src/unit_tests/ctx/uninstall_addon.rs +++ b/src/unit_tests/ctx/uninstall_addon.rs @@ -51,6 +51,7 @@ fn create_addon_streams_item(addon: &Descriptor) -> StreamsItem { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints::default(), }; diff --git a/src/unit_tests/deep_links/external_player_link.rs b/src/unit_tests/deep_links/external_player_link.rs index 65a89d8052..2f7a405797 100644 --- a/src/unit_tests/deep_links/external_player_link.rs +++ b/src/unit_tests/deep_links/external_player_link.rs @@ -21,6 +21,7 @@ fn external_player_link_magnet() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -40,6 +41,7 @@ fn external_player_link_http() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -68,6 +70,7 @@ fn external_player_link_torrent() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -109,6 +112,7 @@ fn external_player_link_external() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -129,6 +133,7 @@ fn external_player_link_youtube() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -157,6 +162,7 @@ fn external_player_link_player_frame() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; diff --git a/src/unit_tests/deep_links/library_item_deep_links.rs b/src/unit_tests/deep_links/library_item_deep_links.rs index a55ac5512f..4bfde173bd 100644 --- a/src/unit_tests/deep_links/library_item_deep_links.rs +++ b/src/unit_tests/deep_links/library_item_deep_links.rs @@ -33,6 +33,7 @@ static TORRENT_STREAMS_ITEM: Lazy = Lazy::new(|| { name: Some("PaidTV".to_owned()), description: Some("Ahsoka S01E05 Part Five 1080p".to_owned()), thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints::default(), }; diff --git a/src/unit_tests/deep_links/stream_deep_links.rs b/src/unit_tests/deep_links/stream_deep_links.rs index d98e6325fc..15840e962b 100644 --- a/src/unit_tests/deep_links/stream_deep_links.rs +++ b/src/unit_tests/deep_links/stream_deep_links.rs @@ -25,6 +25,7 @@ fn stream_deep_links_magnet() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -48,6 +49,7 @@ fn stream_deep_links_http() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -79,6 +81,7 @@ fn stream_deep_links_http_with_request_headers() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints { not_web_ready: false, @@ -116,6 +119,7 @@ fn stream_deep_links_http_with_request_response_headers_and_query_params() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints { not_web_ready: false, @@ -166,6 +170,7 @@ fn stream_deep_links_torrent() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -228,6 +233,7 @@ fn stream_deep_links_torrent_without_file_index() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -285,6 +291,7 @@ fn stream_deep_links_external() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -308,6 +315,7 @@ fn stream_deep_links_youtube() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -343,6 +351,7 @@ fn stream_deep_links_player_frame() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; @@ -363,6 +372,7 @@ fn stream_deep_links_requests() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: Default::default(), }; diff --git a/src/unit_tests/player/next_stream.rs b/src/unit_tests/player/next_stream.rs index e9f07a9677..643f6b1ba0 100644 --- a/src/unit_tests/player/next_stream.rs +++ b/src/unit_tests/player/next_stream.rs @@ -29,6 +29,7 @@ fn create_stream(binge_group: &str) -> Stream { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints { binge_group: Some(binge_group.to_owned()), diff --git a/src/unit_tests/serde/default_tokens_ext.rs b/src/unit_tests/serde/default_tokens_ext.rs index 3d22a9e471..c5fa68d522 100644 --- a/src/unit_tests/serde/default_tokens_ext.rs +++ b/src/unit_tests/serde/default_tokens_ext.rs @@ -6,7 +6,7 @@ use crate::types::library::LibraryItemState; use crate::types::profile::{Auth, AuthKey, GDPRConsent, Settings, User}; use crate::types::resource::{ MetaItem, MetaItemBehaviorHints, PosterShape, SeriesInfo, StreamBehaviorHints, StreamSource, - Subtitles, + Subtitles, Tag, }; use crate::types::True; use serde_test::Token; @@ -51,6 +51,22 @@ impl DefaultTokens for LibraryItemState { } } +impl DefaultTokens for Tag { + fn default_tokens() -> Vec { + vec![ + Token::Struct { + name: "Tag", + len: 2, + }, + Token::Str("name"), + Token::Str(""), + Token::Str("value"), + Token::Str(""), + Token::StructEnd, + ] + } +} + impl DefaultTokens for Subtitles { fn default_tokens() -> Vec { vec![ diff --git a/src/unit_tests/serde/meta_item_preview.rs b/src/unit_tests/serde/meta_item_preview.rs index 42a8da1a62..44ccd106b4 100644 --- a/src/unit_tests/serde/meta_item_preview.rs +++ b/src/unit_tests/serde/meta_item_preview.rs @@ -425,6 +425,7 @@ fn meta_item_preview_de_legacy_links() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints::default(), }, @@ -435,6 +436,7 @@ fn meta_item_preview_de_legacy_links() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints::default(), } @@ -515,6 +517,7 @@ fn meta_item_preview_de_ignore_legacy_when_links() { name: None, description: None, thumbnail: None, + tags: vec![], subtitles: vec![], behavior_hints: StreamBehaviorHints::default(), }], diff --git a/src/unit_tests/serde/stream.rs b/src/unit_tests/serde/stream.rs index 3d6442967a..aa71d0fdf9 100644 --- a/src/unit_tests/serde/stream.rs +++ b/src/unit_tests/serde/stream.rs @@ -1,4 +1,4 @@ -use crate::types::resource::{Stream, StreamBehaviorHints, StreamSource, Subtitles}; +use crate::types::resource::{Stream, StreamBehaviorHints, StreamSource, Subtitles, Tag}; use crate::unit_tests::serde::default_tokens_ext::{DefaultFlattenTokens, DefaultTokens}; use serde_test::{assert_de_tokens, assert_tokens, Configure, Token}; @@ -12,6 +12,7 @@ fn stream() { description: None, thumbnail: None, subtitles: vec![], + tags: vec![], behavior_hints: StreamBehaviorHints::default(), }, Stream { @@ -20,6 +21,7 @@ fn stream() { description: Some("description".to_owned()), thumbnail: Some("thumbnail".to_owned()), subtitles: vec![Subtitles::default()], + tags: vec![Tag::default()], behavior_hints: StreamBehaviorHints { not_web_ready: true, ..StreamBehaviorHints::default() @@ -49,6 +51,13 @@ fn stream() { Token::Seq { len: Some(1) }, ], Subtitles::default_tokens(), + vec![ + Token::SeqEnd, + Token::Str("tags"), + Token::Some, + Token::Seq { len: Some(1) }, + ], + Tag::default_tokens(), vec![ Token::SeqEnd, Token::Str("behaviorHints"), @@ -70,6 +79,7 @@ fn stream() { description: None, thumbnail: None, subtitles: vec![], + tags: vec![], behavior_hints: StreamBehaviorHints::default(), } .readable(), @@ -85,6 +95,8 @@ fn stream() { Token::None, Token::Str("subtitles"), Token::None, + Token::Str("tags"), + Token::None, Token::Str("behaviorHints"), Token::None, ], diff --git a/src/unit_tests/serde/video.rs b/src/unit_tests/serde/video.rs index 1b33cb010f..114aad0e37 100644 --- a/src/unit_tests/serde/video.rs +++ b/src/unit_tests/serde/video.rs @@ -106,6 +106,7 @@ fn video() { description: None, thumbnail: None, subtitles: vec![], + tags: vec![], behavior_hints: StreamBehaviorHints::default(), }], series_info: None, @@ -123,6 +124,7 @@ fn video() { description: None, thumbnail: None, subtitles: vec![], + tags: vec![], behavior_hints: StreamBehaviorHints::default(), }], series_info: None,