diff --git a/src/external_sync.rs b/src/external_sync.rs index 1299eb6..665be38 100644 --- a/src/external_sync.rs +++ b/src/external_sync.rs @@ -1561,7 +1561,7 @@ mod tests { #[test] fn simkl_watching_items_are_kept_for_continue_watching() { let items = simkl_watching_to_items_json( - r#"[{"show":{"title":"Example","ids":{"imdb":"tt42"}},"last_watched":"2026-07-21T00:00:00.000Z"}]"#, + r#"{"shows":[{"show":{"title":"Example","ids":{"imdb":"tt42"}},"last_watched":"2026-07-21T00:00:00.000Z"}]}"#, "[]", ) .expect("items"); diff --git a/src/external_sync/provider_mappers.rs b/src/external_sync/provider_mappers.rs index f320608..79bd75f 100644 --- a/src/external_sync/provider_mappers.rs +++ b/src/external_sync/provider_mappers.rs @@ -2,9 +2,21 @@ use super::{ranked_winner, saved_at_ms, trakt_id_from_source, trakt_ids_from_con use crate::content_identity::parse_video_id_json; use serde_json::{json, Value}; +fn simkl_entries(json: &str, key: &str) -> Vec { + match serde_json::from_str::(json).ok() { + Some(Value::Array(entries)) => entries, + Some(Value::Object(response)) => response + .get(key) + .and_then(Value::as_array) + .cloned() + .unwrap_or_default(), + _ => Vec::new(), + } +} + pub(crate) fn simkl_watching_to_items_json(shows_json: &str, movies_json: &str) -> Option { - let shows: Vec = serde_json::from_str(shows_json).unwrap_or_default(); - let movies: Vec = serde_json::from_str(movies_json).unwrap_or_default(); + let shows = simkl_entries(shows_json, "shows"); + let movies = simkl_entries(movies_json, "movies"); let mut items: Vec = Vec::new(); for entry in &shows { let Some(show) = entry.get("show") else { @@ -137,8 +149,8 @@ pub(crate) fn trakt_watched_shows_to_items_json(shows_json: &str) -> Option Option { - let shows: Vec = serde_json::from_str(shows_json).unwrap_or_default(); - let movies: Vec = serde_json::from_str(movies_json).unwrap_or_default(); + let shows = simkl_entries(shows_json, "shows"); + let movies = simkl_entries(movies_json, "movies"); let mut items: Vec = Vec::new(); for entry in &shows { let Some(show) = entry.get("show") else { @@ -172,8 +184,8 @@ pub(crate) fn simkl_watchlist_to_items_json(shows_json: &str, movies_json: &str) } pub(crate) fn simkl_watched_to_ids_json(shows_json: &str, movies_json: &str) -> Option { - let shows: Vec = serde_json::from_str(shows_json).unwrap_or_default(); - let movies: Vec = serde_json::from_str(movies_json).unwrap_or_default(); + let shows = simkl_entries(shows_json, "shows"); + let movies = simkl_entries(movies_json, "movies"); let mut ids: serde_json::Map = serde_json::Map::new(); for entry in &shows { if let Some(id) = entry.get("show").and_then(trakt_id_from_source) {