diff --git a/src-tauri/src/types.rs b/src-tauri/src/types.rs index 2292b83..2203b60 100644 --- a/src-tauri/src/types.rs +++ b/src-tauri/src/types.rs @@ -1,3 +1,5 @@ +use serde::{Deserialize, Deserializer}; + pub mod audio_quality; pub mod available_media_formats; pub mod bangumi_follow_info; @@ -36,3 +38,12 @@ pub mod user_info; pub mod user_video_info; pub mod video_quality; pub mod watch_later_info; + +fn deserialize_null_default<'de, D, T>(deserializer: D) -> Result +where + T: Default + Deserialize<'de>, + D: Deserializer<'de>, +{ + let opt = Option::deserialize(deserializer)?; + Ok(opt.unwrap_or_default()) +} diff --git a/src-tauri/src/types/player_info.rs b/src-tauri/src/types/player_info.rs index 40e0902..31325d5 100644 --- a/src-tauri/src/types/player_info.rs +++ b/src-tauri/src/types/player_info.rs @@ -1,6 +1,8 @@ use serde::{Deserialize, Serialize}; use specta::Type; +use super::deserialize_null_default; + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Type)] #[serde(default)] #[allow(clippy::struct_excessive_bools)] @@ -30,6 +32,7 @@ pub struct PlayerInfo { pub online_count: i64, pub need_login_subtitle: bool, pub subtitle: SubtitleInPlayerInfo, + #[serde(default, deserialize_with = "deserialize_null_default")] pub view_points: Vec, pub preview_toast: String, pub options: Options,