1- use std:: collections:: HashMap ;
1+ use std:: collections:: { HashMap , HashSet } ;
22
33use async_recursion:: async_recursion;
44use nanoid:: nanoid;
55use query_external_ip:: SourceError ;
66use rs_plugin_common_interfaces:: {
7- domain:: rs_ids:: RsIds ,
7+ domain:: rs_ids:: { ApplyRsIds , RsIds } ,
88 lookup:: { RsLookupEpisode , RsLookupMetadataResult , RsLookupQuery } ,
99 ImageType , MediaType ,
1010} ;
@@ -32,6 +32,7 @@ use crate::{
3232use super :: {
3333 entity_search:: merge_result_ids,
3434 error:: { Error , Result } ,
35+ history:: { episode_history_id, history_id_rsids} ,
3536 medias:: { RsSort , RsSortOrder } ,
3637 store:: sql:: SqlOrder ,
3738 users:: { ConnectedUser , HistoryQuery } ,
@@ -106,6 +107,22 @@ pub struct EpisodeForUpdate {
106107}
107108
108109impl ModelController {
110+ async fn episode_series_by_ref (
111+ & self ,
112+ library_id : & str ,
113+ episodes : & [ Episode ] ,
114+ ) -> RsResult < HashMap < String , Serie > > {
115+ let store = self . store . get_library_store ( library_id) ?;
116+ let serie_refs: HashSet < String > = episodes. iter ( ) . map ( |episode| episode. serie . clone ( ) ) . collect ( ) ;
117+ let mut series = HashMap :: new ( ) ;
118+ for serie_ref in serie_refs {
119+ if let Some ( serie) = store. get_serie ( & serie_ref) . await ? {
120+ series. insert ( serie_ref, serie. item ) ;
121+ }
122+ }
123+ Ok ( series)
124+ }
125+
109126 async fn lookup_episodes_metadata (
110127 & self ,
111128 library_id : & str ,
@@ -245,27 +262,35 @@ impl ModelController {
245262 requesting_user : & ConnectedUser ,
246263 library_id : Option < String > ,
247264 ) -> RsResult < ( ) > {
248- let ids: RsIds = episode. clone ( ) . into ( ) ;
249- let watched = self
250- . get_watched (
251- HistoryQuery {
252- types : vec ! [ MediaType :: Episode ] ,
253- id : Some ( ids. clone ( ) ) ,
254- ..Default :: default ( )
255- } ,
256- requesting_user,
257- library_id. clone ( ) ,
258- )
259- . await ?;
260- let progress = self
261- . get_view_progress ( ids, requesting_user, library_id)
262- . await ?;
263- if let Some ( progress) = progress {
264- episode. progress = Some ( progress. progress ) ;
265- }
266- let watched = watched. first ( ) ;
267- if let Some ( watched) = watched {
268- episode. watched = Some ( watched. date ) ;
265+ if let Some ( library_id) = library_id {
266+ let store = self . store . get_library_store ( & library_id) ?;
267+ if let Some ( serie) = store. get_serie ( & episode. serie ) . await ? {
268+ let history_id = episode_history_id ( & serie. item , episode) ;
269+ let watched = self
270+ . get_watched (
271+ HistoryQuery {
272+ types : vec ! [ MediaType :: Episode ] ,
273+ id : Some ( history_id_rsids ( history_id. clone ( ) ) ) ,
274+ ..Default :: default ( )
275+ } ,
276+ requesting_user,
277+ Some ( library_id. clone ( ) ) ,
278+ )
279+ . await ?;
280+ let progress = self
281+ . get_view_progress (
282+ history_id_rsids ( history_id) ,
283+ requesting_user,
284+ Some ( library_id) ,
285+ )
286+ . await ?;
287+ if let Some ( progress) = progress {
288+ episode. progress = Some ( progress. progress ) ;
289+ }
290+ if let Some ( watched) = watched. first ( ) {
291+ episode. watched = Some ( watched. date ) ;
292+ }
293+ }
269294 }
270295 episode. fill_imdb_ratings ( & self . imdb ) . await ;
271296 Ok ( ( ) )
@@ -276,6 +301,11 @@ impl ModelController {
276301 requesting_user : & ConnectedUser ,
277302 library_id : Option < String > ,
278303 ) -> RsResult < ( ) > {
304+ let series_by_ref = if let Some ( library_id) = library_id. as_deref ( ) {
305+ self . episode_series_by_ref ( library_id, episodes) . await ?
306+ } else {
307+ HashMap :: new ( )
308+ } ;
279309 let watched = self
280310 . get_watched (
281311 HistoryQuery {
@@ -304,15 +334,12 @@ impl ModelController {
304334 . collect :: < HashMap < _ , _ > > ( ) ;
305335
306336 for episode in episodes {
307- let ids = RsIds :: from ( episode. clone ( ) ) ;
308- let ids_string: Vec < String > = ids. into ( ) ;
309- for id in ids_string {
310- let watch = watched. get ( & id) ;
311- if let Some ( watch) = watch {
337+ if let Some ( serie) = series_by_ref. get ( & episode. serie ) {
338+ let history_id = episode_history_id ( serie, episode) ;
339+ if let Some ( watch) = watched. get ( & history_id) {
312340 episode. watched = Some ( * watch) ;
313341 }
314- let progress = progresses. get ( & id) ;
315- if let Some ( progress) = progress {
342+ if let Some ( progress) = progresses. get ( & history_id) {
316343 episode. progress = Some ( * progress) ;
317344 }
318345 }
@@ -520,6 +547,20 @@ impl ModelController {
520547 let ids = self
521548 . get_serie_ids ( library_id, serie_id, requesting_user)
522549 . await ?;
550+ let existing_episodes = self
551+ . get_episodes (
552+ library_id,
553+ EpisodeQuery {
554+ serie_ref : Some ( serie_id. to_string ( ) ) ,
555+ ..Default :: default ( )
556+ } ,
557+ requesting_user,
558+ )
559+ . await ?;
560+ let existing_ids_by_episode: HashMap < ( u32 , u32 ) , RsIds > = existing_episodes
561+ . into_iter ( )
562+ . map ( |episode| ( ( episode. season , episode. number ) , RsIds :: from ( episode) ) )
563+ . collect ( ) ;
523564 let mut all_episodes = self
524565 . lookup_episodes_metadata ( library_id, serie_id, & ids, requesting_user)
525566 . await ?;
@@ -530,6 +571,15 @@ impl ModelController {
530571 ) ) )
531572 . into ( ) ) ;
532573 }
574+ for episode in & mut all_episodes {
575+ if let Some ( existing_ids) =
576+ existing_ids_by_episode. get ( & ( episode. season , episode. number ) )
577+ {
578+ let mut merged_ids = RsIds :: from ( episode. clone ( ) ) ;
579+ merged_ids. merge ( existing_ids) ;
580+ episode. apply_rs_ids ( & merged_ids) ;
581+ }
582+ }
533583 let store = self . store . get_library_store_optional ( library_id) . ok_or (
534584 Error :: LibraryStoreNotFoundFor (
535585 library_id. clone ( ) . to_string ( ) ,
0 commit comments