diff --git a/crates/arr-api/src/metadata.rs b/crates/arr-api/src/metadata.rs index 1b8bb74..07999cf 100644 --- a/crates/arr-api/src/metadata.rs +++ b/crates/arr-api/src/metadata.rs @@ -46,7 +46,8 @@ pub struct MovieMetadata { pub status: String, pub poster_path: Option, pub backdrop_path: Option, - pub vote_average: f64, + /// Absent when TMDB has no votes for the title (#156). + pub vote_average: Option, pub vote_count: u32, pub homepage: Option, /// §9.6 links out to `IMDb` for movies. @@ -68,7 +69,8 @@ pub struct SeriesMetadata { pub status: String, pub poster_path: Option, pub backdrop_path: Option, - pub vote_average: f64, + /// Absent when TMDB has no votes for the title (#156). + pub vote_average: Option, pub vote_count: u32, pub homepage: Option, /// §9.6 links out to TVDB for series. diff --git a/crates/arr-meta/src/model.rs b/crates/arr-meta/src/model.rs index dc68591..dfe64b7 100644 --- a/crates/arr-meta/src/model.rs +++ b/crates/arr-meta/src/model.rs @@ -223,7 +223,10 @@ pub struct MovieDetail { pub genres: Vec, pub backdrop_path: Option, pub poster_path: Option, - pub vote_average: f64, + /// Zero normalised away, like [`Movie::vote_average`]: TMDB sends `0` + /// where "no votes yet" is meant, and a detail page must not show it as + /// a rating. + pub vote_average: Option, pub vote_count: u32, pub homepage: Option, pub status: String, @@ -244,7 +247,10 @@ pub struct SeriesDetail { pub genres: Vec, pub backdrop_path: Option, pub poster_path: Option, - pub vote_average: f64, + /// Zero normalised away, like [`Movie::vote_average`]: TMDB sends `0` + /// where "no votes yet" is meant, and a detail page must not show it as + /// a rating. + pub vote_average: Option, pub vote_count: u32, pub homepage: Option, pub status: String, @@ -771,7 +777,7 @@ impl From for MovieDetail { .collect(), backdrop_path: non_empty(raw.backdrop_path), poster_path: non_empty(raw.poster_path), - vote_average: raw.vote_average, + vote_average: rating(raw.vote_average), vote_count: raw.vote_count, homepage: non_empty(raw.homepage), status: raw.status, @@ -799,7 +805,7 @@ impl From for SeriesDetail { .collect(), backdrop_path: non_empty(raw.backdrop_path), poster_path: non_empty(raw.poster_path), - vote_average: raw.vote_average, + vote_average: rating(raw.vote_average), vote_count: raw.vote_count, homepage: non_empty(raw.homepage), status: raw.status, diff --git a/crates/arr-meta/tests/tmdb.rs b/crates/arr-meta/tests/tmdb.rs index 335b8ac..95f1c6f 100644 --- a/crates/arr-meta/tests/tmdb.rs +++ b/crates/arr-meta/tests/tmdb.rs @@ -613,7 +613,7 @@ async fn movie_detail_parses_the_rich_fields() { assert_eq!(movie.genres[0].name, "Science Fiction"); assert!(movie.poster_path.is_some()); assert!(movie.backdrop_path.is_some()); - assert!((movie.vote_average - 8.152).abs() < f64::EPSILON); + assert!((movie.vote_average.expect("rated") - 8.152).abs() < f64::EPSILON); assert_eq!(movie.vote_count, 6_249); assert_eq!(movie.homepage.as_deref(), Some("https://www.dunemovie.com")); assert_eq!(movie.status, "Released");