Skip to content

Commit 81fe4a3

Browse files
authored
Merge pull request #3 from neckaros/t3code/remove-trakt-forced-source
remove forced Trakt metadata source
2 parents c7d0c79 + 58f7b30 commit 81fe4a3

4 files changed

Lines changed: 265 additions & 293 deletions

File tree

src/model/episodes.rs

Lines changed: 77 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use nanoid::nanoid;
55
use query_external_ip::SourceError;
66
use rs_plugin_common_interfaces::{
77
domain::rs_ids::RsIds,
8-
lookup::{RsLookupEpisode, RsLookupQuery},
8+
lookup::{RsLookupEpisode, RsLookupMetadataResult, RsLookupQuery},
99
ImageType, MediaType,
1010
};
1111
use serde::{Deserialize, Serialize};
@@ -30,6 +30,7 @@ use crate::{
3030
};
3131

3232
use super::{
33+
entity_search::merge_result_ids,
3334
error::{Error, Result},
3435
medias::{RsSort, RsSortOrder},
3536
store::sql::SqlOrder,
@@ -105,6 +106,61 @@ pub struct EpisodeForUpdate {
105106
}
106107

107108
impl ModelController {
109+
async fn lookup_episodes_metadata(
110+
&self,
111+
library_id: &str,
112+
serie_id: &str,
113+
ids: &RsIds,
114+
requesting_user: &ConnectedUser,
115+
) -> RsResult<Vec<Episode>> {
116+
let mut episodes = Vec::new();
117+
let mut empty_streak = 0;
118+
119+
for season in 1..=100 {
120+
let mut groups = self
121+
.exec_lookup_metadata_grouped(
122+
RsLookupQuery::Episode(RsLookupEpisode {
123+
ids: Some(ids.clone()),
124+
season,
125+
number: None,
126+
..Default::default()
127+
}),
128+
Some(library_id.to_string()),
129+
requesting_user,
130+
None,
131+
None,
132+
)
133+
.await?;
134+
merge_result_ids(&mut groups);
135+
136+
let season_episodes: Vec<Episode> = groups
137+
.into_iter()
138+
.flat_map(|(_, _, r)| r.results)
139+
.filter_map(|result| match result.metadata {
140+
RsLookupMetadataResult::Episode(mut episode) => {
141+
episode.serie = serie_id.to_string();
142+
Some(episode)
143+
}
144+
_ => None,
145+
})
146+
.collect();
147+
148+
if season_episodes.is_empty() {
149+
empty_streak += 1;
150+
if empty_streak >= 2 && !episodes.is_empty() {
151+
break;
152+
}
153+
} else {
154+
empty_streak = 0;
155+
episodes.extend(season_episodes);
156+
}
157+
}
158+
159+
episodes.sort_by_key(|episode| (episode.season, episode.number));
160+
episodes.dedup_by(|a, b| a.season == b.season && a.number == b.number);
161+
Ok(episodes)
162+
}
163+
108164
pub async fn get_episodes(
109165
&self,
110166
library_id: &str,
@@ -158,12 +214,17 @@ impl ModelController {
158214
query.serie_ref = Some(serie.item.id);
159215
store.get_episodes(query).await?
160216
} else {
161-
self.trakt.all_episodes(&id).await.map_err(|_| {
162-
SourcesError::NotFound(Some(format!(
163-
"get_episodes_by_id - Unable to find episodes on trakt for {:?}",
217+
let episodes = self
218+
.lookup_episodes_metadata(library_id, &serie_id, &id, requesting_user)
219+
.await?;
220+
if episodes.is_empty() {
221+
return Err(SourcesError::NotFound(Some(format!(
222+
"get_episodes_by_id - Unable to find episodes for {:?}",
164223
id
165224
)))
166-
})?
225+
.into());
226+
}
227+
episodes
167228
}
168229
} else {
169230
store.get_episodes(query).await?
@@ -459,16 +520,16 @@ impl ModelController {
459520
let ids = self
460521
.get_serie_ids(library_id, serie_id, requesting_user)
461522
.await?;
462-
let all_episodes: Vec<Episode> = self
463-
.trakt
464-
.all_episodes(&ids)
465-
.await?
466-
.into_iter()
467-
.map(|mut e| {
468-
e.serie = serie_id.to_owned();
469-
e
470-
})
471-
.collect();
523+
let mut all_episodes = self
524+
.lookup_episodes_metadata(library_id, serie_id, &ids, requesting_user)
525+
.await?;
526+
if all_episodes.is_empty() {
527+
return Err(SourcesError::NotFound(Some(format!(
528+
"refresh_episodes - Unable to find episodes for {:?}",
529+
ids
530+
)))
531+
.into());
532+
}
472533
let store = self.store.get_library_store_optional(library_id).ok_or(
473534
Error::LibraryStoreNotFoundFor(
474535
library_id.clone().to_string(),
@@ -501,7 +562,7 @@ impl ModelController {
501562
use super::entity_images::EntityImageConfig;
502563

503564
if RsIds::is_id(serie_id) {
504-
let mut serie_ids: RsIds = serie_id.to_string().try_into()?;
565+
let serie_ids: RsIds = serie_id.to_string().try_into()?;
505566
let store = self.store.get_library_store_optional(library_id).ok_or(
506567
Error::LibraryStoreNotFoundFor(
507568
library_id.clone().to_string(),
@@ -521,11 +582,6 @@ impl ModelController {
521582
)
522583
.await;
523584
}
524-
// Enrich IDs via Trakt if needed
525-
if serie_ids.tmdb().is_none() {
526-
let serie = self.trakt.get_serie(&serie_ids).await?;
527-
serie_ids = serie.into();
528-
}
529585
let composite_id = format!("{}-episode-{}x{}", serie_id, season, episode);
530586
let query = RsLookupQuery::Episode(RsLookupEpisode {
531587
ids: Some(serie_ids),

0 commit comments

Comments
 (0)