diff --git a/src/data_manager.rs b/src/data_manager.rs index a7fc953..b1c7437 100644 --- a/src/data_manager.rs +++ b/src/data_manager.rs @@ -51,8 +51,40 @@ impl DataManager { } ) . await ? ; Ok (collection_overview) } + + pub async fn get_film_details ( & self , uuid : String ) -> Result { + let film_details = self . sqlite_client . conn ( |sqlite_connection| { + let film_details = sqlite_connection + . prepare ( " + select + films . uuid , + films . name , + films . original_name , + films . release_date , + films . runtime_minutes , + films . poster_file_path , + sources . video_file_path , + sources . video_track , + sources . audio_file_path , + sources . audio_track , + sources . subtitle_file_path , + sources . subtitle_track + from films left join sources + on films . source = sources . uuid + where films . uuid = (?1) + " ) ? + . query ( [ uuid ] ) ? + . map (row_to_film_details) + . next () ? + . unwrap () ; + Ok (film_details) + } ) . await ? ; + Ok (film_details) + } } + + pub struct CollectionOverview { pub films : Vec , pub series : Vec , @@ -135,11 +167,60 @@ fn row_to_series_overview ( row : & Row ) -> rusqlite :: Result } ) } + + +pub struct FilmDetails { + pub uuid : String , + pub name : String , + pub original_name : Option , + pub release_date : String , + pub runtime_minutes : u32 , + pub poster_file_path : Option , + pub video_file_path : PathBuf , + pub video_track : Option , + pub audio_file_path : PathBuf , + pub audio_track : Option , + pub subtitle_file_path : Option , + pub subtitle_track : Option , +} + +fn row_to_film_details ( row : & Row ) -> rusqlite :: Result { + let uuid = row . get (0) ? ; + let name = row . get (1) ? ; + let original_name = row . get (2) ? ; + let release_date = row . get (3) ? ; + let runtime_minutes = row . get (4) ? ; + let poster_file_path = row . get :: < _ , Option > (5) ? . map ( PathBuf :: from ) ; + let video_file_path = PathBuf :: from ( row . get :: < _ , String > (6) ? ) ; + let video_track = row . get (7) ? ; + let audio_file_path = PathBuf :: from ( row . get :: < _ , String > (8) ? ) ; + let audio_track = row . get (9) ? ; + let subtitle_file_path = row . get :: < _ , Option > (10) ? . map ( PathBuf :: from ) ; + let subtitle_track = row . get (11) ? ; + + Ok ( FilmDetails { + uuid , + name , + original_name , + release_date , + runtime_minutes , + poster_file_path , + video_file_path , + video_track , + audio_file_path , + audio_track , + subtitle_file_path , + subtitle_track , + } ) +} + + + impl From for ZoodexError { fn from ( error : Error ) -> Self { match error { Rusqlite (error) => ZoodexError :: from (error) , - _ => panic ! () , + _ => panic ! ( "{}" , error ) , } } } @@ -150,10 +231,10 @@ impl From < rusqlite :: Error > for ZoodexError { SqliteFailure ( error , _ ) => { match error . code { CannotOpen => CollectionFileReadError , - _ => panic ! () , + _ => panic ! ( "{}" , error ) , } } , - _ => panic ! () , + _ => panic ! ( "{}" , error ) , } } }