Skip to content

Commit 3c86033

Browse files
authored
construct a version if they are none delivered (#39)
1 parent 3aeaf87 commit 3c86033

File tree

4 files changed

+67
-10
lines changed

4 files changed

+67
-10
lines changed

src/media/anime/episode.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::common::{Image, Request};
22
use crate::crunchyroll::Executor;
3+
use crate::media::anime::util::{fix_empty_episode_versions, fix_empty_season_versions};
34
use crate::media::util::request_media;
45
use crate::media::Media;
56
use crate::{Crunchyroll, Locale, Result, Season, Series};
@@ -27,7 +28,7 @@ pub struct EpisodeVersion {
2728
pub original: bool,
2829

2930
#[cfg(feature = "__test_strict")]
30-
variant: crate::StrictValue,
31+
pub(crate) variant: crate::StrictValue,
3132
}
3233

3334
impl EpisodeVersion {
@@ -149,6 +150,7 @@ pub struct Episode {
149150
pub eligible_region: String,
150151

151152
/// All versions of this episode (same episode but each entry has a different language).
153+
#[serde(deserialize_with = "crate::internal::serde::deserialize_maybe_null_to_default")]
152154
pub versions: Vec<EpisodeVersion>,
153155

154156
#[cfg(feature = "__test_strict")]
@@ -206,9 +208,11 @@ impl Episode {
206208
"https://www.crunchyroll.com/content/v2/cms/seasons/{}",
207209
self.season_id
208210
);
209-
Ok(request_media(self.executor.clone(), endpoint)
211+
let mut season: Season = request_media::<Season>(self.executor.clone(), endpoint)
210212
.await?
211-
.remove(0))
213+
.remove(0);
214+
fix_empty_season_versions(&mut season);
215+
Ok(season)
212216
}
213217

214218
/// Show in which audios this [`Episode`] is also available.
@@ -247,15 +251,17 @@ impl Episode {
247251
#[async_trait::async_trait]
248252
impl Media for Episode {
249253
async fn from_id(crunchyroll: &Crunchyroll, id: impl AsRef<str> + Send) -> Result<Self> {
250-
Ok(request_media(
254+
let mut episode: Episode = request_media(
251255
crunchyroll.executor.clone(),
252256
format!(
253257
"https://www.crunchyroll.com/content/v2/cms/episodes/{}",
254258
id.as_ref()
255259
),
256260
)
257261
.await?
258-
.remove(0))
262+
.remove(0);
263+
fix_empty_episode_versions(&mut episode);
264+
Ok(episode)
259265
}
260266

261267
async fn __set_executor(&mut self, executor: Arc<Executor>) {

src/media/anime/season.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::common::Request;
22
use crate::crunchyroll::Executor;
3+
use crate::media::anime::util::{fix_empty_episode_versions, fix_empty_season_versions};
34
use crate::media::util::request_media;
45
use crate::media::Media;
56
use crate::{Crunchyroll, Episode, Locale, Result, Series};
@@ -21,7 +22,7 @@ pub struct SeasonVersion {
2122
pub original: bool,
2223

2324
#[cfg(feature = "__test_strict")]
24-
variant: crate::StrictValue,
25+
pub(crate) variant: crate::StrictValue,
2526
}
2627

2728
impl SeasonVersion {
@@ -92,6 +93,7 @@ pub struct Season {
9293
pub availability_notes: String,
9394

9495
/// All versions of this season (same season but each entry has a different language).
96+
#[serde(deserialize_with = "crate::internal::serde::deserialize_maybe_null_to_default")]
9597
pub versions: Vec<SeasonVersion>,
9698

9799
#[cfg(feature = "__test_strict")]
@@ -125,7 +127,11 @@ impl Season {
125127
"https://www.crunchyroll.com/content/v2/cms/seasons/{}/episodes",
126128
self.id
127129
);
128-
request_media(self.executor.clone(), endpoint).await
130+
let mut episodes: Vec<Episode> = request_media(self.executor.clone(), endpoint).await?;
131+
for episode in &mut episodes {
132+
fix_empty_episode_versions(episode);
133+
}
134+
Ok(episodes)
129135
}
130136

131137
/// Show in which audios this [`Season`] is also available.
@@ -164,15 +170,17 @@ impl Season {
164170
#[async_trait::async_trait]
165171
impl Media for Season {
166172
async fn from_id(crunchyroll: &Crunchyroll, id: impl AsRef<str> + Send) -> Result<Self> {
167-
Ok(request_media(
173+
let mut season: Season = request_media(
168174
crunchyroll.executor.clone(),
169175
format!(
170176
"https://www.crunchyroll.com/content/v2/cms/seasons/{}",
171177
id.as_ref()
172178
),
173179
)
174180
.await?
175-
.remove(0))
181+
.remove(0);
182+
fix_empty_season_versions(&mut season);
183+
Ok(season)
176184
}
177185

178186
async fn __set_executor(&mut self, executor: Arc<Executor>) {

src/media/anime/series.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::categories::Category;
22
use crate::crunchyroll::Executor;
3+
use crate::media::anime::util::fix_empty_season_versions;
34
use crate::media::util::request_media;
45
use crate::media::{Media, PosterImages};
56
use crate::{Crunchyroll, Locale, MusicVideo, Result, Season};
@@ -136,7 +137,11 @@ impl Series {
136137
"https://www.crunchyroll.com/content/v2/cms/series/{}/seasons",
137138
self.id
138139
);
139-
request_media(self.executor.clone(), endpoint).await
140+
let mut seasons: Vec<Season> = request_media(self.executor.clone(), endpoint).await?;
141+
for season in &mut seasons {
142+
fix_empty_season_versions(season);
143+
}
144+
Ok(seasons)
140145
}
141146

142147
/// Get music videos which are related to this series.

src/media/anime/util.rs

+38
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
#[cfg(feature = "__test_strict")]
2+
use crate::internal::strict::StrictValue;
3+
use crate::media::{EpisodeVersion, SeasonVersion};
4+
use crate::{Episode, Locale, Season};
5+
16
#[cfg(feature = "experimental-stabilizations")]
27
pub(crate) fn parse_locale_from_slug_title<S: AsRef<str>>(slug_title: S) -> crate::Locale {
38
split_locale_from_slug_title(slug_title).1
@@ -41,3 +46,36 @@ pub(crate) fn real_dedup_vec<T: Clone + Eq>(input: &mut Vec<T>) {
4146
}
4247
*input = dedup
4348
}
49+
50+
pub(crate) fn fix_empty_season_versions(season: &mut Season) {
51+
if season.versions.is_empty() {
52+
season.versions.push(SeasonVersion {
53+
executor: season.executor.clone(),
54+
id: season.id.clone(),
55+
audio_locale: season
56+
.audio_locales
57+
.first()
58+
.unwrap_or(&Locale::ja_JP)
59+
.clone(),
60+
original: true,
61+
#[cfg(feature = "__test_strict")]
62+
variant: StrictValue::default(),
63+
})
64+
}
65+
}
66+
67+
pub(crate) fn fix_empty_episode_versions(episode: &mut Episode) {
68+
if episode.versions.is_empty() {
69+
episode.versions.push(EpisodeVersion {
70+
executor: episode.executor.clone(),
71+
id: episode.id.clone(),
72+
media_id: String::new(),
73+
audio_locale: episode.audio_locale.clone(),
74+
season_id: episode.season_id.clone(),
75+
is_premium_only: episode.is_premium_only,
76+
original: true,
77+
#[cfg(feature = "__test_strict")]
78+
variant: StrictValue::default(),
79+
})
80+
}
81+
}

0 commit comments

Comments
 (0)