From f00a09a4ce6148e71f835f2cc5a445728319d64d Mon Sep 17 00:00:00 2001 From: KhooLy <73142442+KhooLy@users.noreply.github.com> Date: Tue, 7 Jul 2026 13:58:18 +0300 Subject: [PATCH] fix(search-plan): JSON-encode transport-url/genre FFI returns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolve_transport_url_json and resolve_feed_option_genre_json feed opt_json() at the FFI boundary, which requires valid JSON — a bare URL/genre string isn't, so resolveTransportUrl/resolveFeedOptionGenre would fail from the frontend whenever they had a result. Finishes an in-progress fix that JSON-encoded the transport-url return but missed the early-return genre branch, and updates home_ranking.rs's direct (non-FFI) callers to unwrap the now JSON-encoded string before embedding it in a json!() literal, since json!() already does its own string encoding. --- src/home_ranking.rs | 8 ++++++-- src/search_plan.rs | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/home_ranking.rs b/src/home_ranking.rs index f7c6833..96d76ef 100644 --- a/src/home_ranking.rs +++ b/src/home_ranking.rs @@ -898,7 +898,9 @@ fn resolve_folder_catalog_sources(folder: &Map, addons_json: &str if s.get("catalogId").and_then(Value::as_str).is_none() { continue; } - if let Some(t_url) = resolve_transport_url_json(&s.to_string(), addons_json) { + if let Some(t_url) = resolve_transport_url_json(&s.to_string(), addons_json) + .and_then(|json| serde_json::from_str::(&json).ok()) + { let catalog_id = s.get("catalogId").and_then(Value::as_str).unwrap_or(""); let content_type = s.get("type").and_then(Value::as_str).unwrap_or("movie"); let mut entry = @@ -914,7 +916,9 @@ fn resolve_folder_catalog_sources(folder: &Map, addons_json: &str if resolved.is_empty() { if let Some(catalog_id) = folder.get("catalogId").and_then(Value::as_str) { let src = json!({ "catalogId": catalog_id, "type": "movie" }); - if let Some(t_url) = resolve_transport_url_json(&src.to_string(), addons_json) { + if let Some(t_url) = resolve_transport_url_json(&src.to_string(), addons_json) + .and_then(|json| serde_json::from_str::(&json).ok()) + { let mut entry = json!({ "transportUrl": t_url, "catalogId": catalog_id, "type": "movie" }); if let Some(g) = folder.get("genre").and_then(Value::as_str) { diff --git a/src/search_plan.rs b/src/search_plan.rs index 4a620b7..6dac9e6 100644 --- a/src/search_plan.rs +++ b/src/search_plan.rs @@ -660,7 +660,7 @@ pub(crate) fn resolve_transport_url_json(source_json: &str, addons_json: &str) - }) }); if matches { - return Some(t_url.to_string()); + return serde_json::to_string(t_url).ok(); } } None @@ -682,7 +682,7 @@ pub(crate) fn resolve_feed_option_genre_json( .and_then(Value::as_str) .filter(|s| !s.trim().is_empty()) { - return Some(genre.to_string()); + return serde_json::to_string(genre).ok(); } let transport_url = option.get("transportUrl").and_then(Value::as_str)?; @@ -721,7 +721,7 @@ pub(crate) fn resolve_feed_option_genre_json( .and_then(Value::as_str); let resolved = default_genre.or(if is_required { first_option } else { None })?; - Some(resolved.to_string()) + serde_json::to_string(resolved).ok() } #[cfg(test)]