@@ -5,7 +5,7 @@ use nanoid::nanoid;
55use query_external_ip:: SourceError ;
66use rs_plugin_common_interfaces:: {
77 domain:: rs_ids:: RsIds ,
8- lookup:: { RsLookupEpisode , RsLookupQuery } ,
8+ lookup:: { RsLookupEpisode , RsLookupMetadataResult , RsLookupQuery } ,
99 ImageType , MediaType ,
1010} ;
1111use serde:: { Deserialize , Serialize } ;
@@ -30,6 +30,7 @@ use crate::{
3030} ;
3131
3232use 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
107108impl 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