@@ -11,38 +11,52 @@ use crate::soda::{
11
11
utils:: { self , str_replace_extension, time} ,
12
12
} ;
13
13
14
- use super :: entity:: { TmdbEpisode , TmdbSeason , TmdbTV } ;
14
+ use super :: entity:: { TmdbEpisode , TmdbMovie , TmdbSeason , TmdbTV } ;
15
15
16
16
pub ( crate ) fn gen_scrape_files ( scrape_config : & ScrapeConfig , mt_meta : & MTMetadata , mt_info : & MTInfo , path : & str ) {
17
17
match mt_info {
18
- MTInfo :: MOVIE ( _) => todo ! ( ) ,
19
18
MTInfo :: TV ( TVType :: TMDB ( tmdb_tv_info) ) => {
20
19
gen_scrape_tv_files ( scrape_config, path, tmdb_tv_info, mt_meta) ;
21
20
}
21
+ MTInfo :: MOVIE ( MovieType :: TMDB ( tmdb_movie_info) ) => {
22
+ gen_scrape_movie_files ( scrape_config, path, tmdb_movie_info, mt_meta) ;
23
+ }
24
+ }
25
+ }
26
+
27
+ fn gen_scrape_movie_files ( scrape_config : & ScrapeConfig , path : & str , tmdb_info : & super :: entity:: TmdbMovieInfo , mt_meta : & MTMetadata ) {
28
+ // root
29
+ let root_path = Path :: new ( path) . parent ( ) . unwrap ( ) ;
30
+
31
+ // gen movie.nfo file
32
+ if !root_path. join ( "movie.nfo" ) . exists ( ) {
33
+ gen_movie_nfo_file ( & tmdb_info. movie , root_path, Path :: new ( path) ) ;
34
+ } else {
35
+ tracing:: debug!( "movie.nfo file exist, skip gen tvshow.nfo file" ) ;
22
36
}
23
37
}
24
38
25
- fn gen_scrape_tv_files ( scrape_config : & ScrapeConfig , path : & str , tmdb_tv_info : & super :: entity:: TmdbTVInfo , meta : & MTMetadata ) {
39
+ fn gen_scrape_tv_files ( scrape_config : & ScrapeConfig , path : & str , tmdb_info : & super :: entity:: TmdbTVInfo , meta : & MTMetadata ) {
26
40
// root
27
- let tv_root_path = Path :: new ( path) . parent ( ) . unwrap ( ) . parent ( ) . unwrap ( ) ;
41
+ let root_path = Path :: new ( path) . parent ( ) . unwrap ( ) . parent ( ) . unwrap ( ) ;
28
42
29
43
// gen tvshow.nfo file
30
- if !tv_root_path . join ( "tvshow.nfo" ) . exists ( ) {
31
- gen_tvshow_nfo_file ( & tmdb_tv_info . tv , tv_root_path ) ;
44
+ if !root_path . join ( "tvshow.nfo" ) . exists ( ) {
45
+ gen_tvshow_nfo_file ( & tmdb_info . tv , root_path ) ;
32
46
} else {
33
47
tracing:: debug!( "tvshow.nfo file exist, skip gen tvshow.nfo file" ) ;
34
48
}
35
49
36
50
if scrape_config. enable_scrape_image {
37
51
// save tv images
38
- tmdb_tv_info . fanart_tv . is_some_then ( |fanart_tv| {
39
- save_tv_show_images ( & tmdb_tv_info . tv , fanart_tv, tv_root_path ) ;
52
+ tmdb_info . fanart_tv . is_some_then ( |fanart_tv| {
53
+ save_tv_show_images ( & tmdb_info . tv , fanart_tv, root_path ) ;
40
54
} ) ;
41
55
}
42
56
43
57
// season
44
58
meta. season_number ( ) . is_some_then ( |season_number| {
45
- tmdb_tv_info . tv_seasons . get ( season_number) . is_some_then ( |season_info| {
59
+ tmdb_info . tv_seasons . get ( season_number) . is_some_then ( |season_info| {
46
60
let tv_season_path = Path :: new ( path) . parent ( ) . unwrap ( ) ;
47
61
48
62
// gen season.nfo file
@@ -54,15 +68,15 @@ fn gen_scrape_tv_files(scrape_config: &ScrapeConfig, path: &str, tmdb_tv_info: &
54
68
55
69
if scrape_config. enable_scrape_image {
56
70
// save season images
57
- save_season_images ( & season_info. tv_season , tv_root_path , tv_season_path) ;
71
+ save_season_images ( & season_info. tv_season , root_path , tv_season_path) ;
58
72
}
59
73
} ) ;
60
74
} ) ;
61
75
62
76
// episode
63
77
meta. season_number ( ) . is_some_then ( |season_number| {
64
78
meta. episode_number ( ) . is_some_then ( |episode_number| {
65
- tmdb_tv_info . tv_seasons . get ( season_number) . is_some_then ( |season_info| {
79
+ tmdb_info . tv_seasons . get ( season_number) . is_some_then ( |season_info| {
66
80
season_info. tv_episodes . get ( episode_number) . is_some_then ( |episode| {
67
81
let tv_episode_path = Path :: new ( path) ;
68
82
@@ -309,7 +323,11 @@ fn gen_episode_nfo_file(meta: &MTMetadata, season_number: &i64, episode_number:
309
323
let mut xml: Vec < u8 > = Vec :: new ( ) ;
310
324
311
325
//
312
- let mut w = EmitterConfig :: new ( ) . write_document_declaration ( true ) . pad_self_closing ( true ) . perform_indent ( true ) . create_writer ( & mut xml) ;
326
+ let mut w = EmitterConfig :: new ( )
327
+ . write_document_declaration ( true )
328
+ . pad_self_closing ( true )
329
+ . perform_indent ( true )
330
+ . create_writer ( & mut xml) ;
313
331
314
332
// season
315
333
// root
@@ -320,7 +338,8 @@ fn gen_episode_nfo_file(meta: &MTMetadata, season_number: &i64, episode_number:
320
338
dom:: write_text_element ( & mut w, "dateadded" , & time:: now_time_format ( ) ) ;
321
339
322
340
// uniqueid
323
- w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tmdb" ) . attr ( "default" , "true" ) ) . unwrap ( ) ;
341
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tmdb" ) . attr ( "default" , "true" ) )
342
+ . unwrap ( ) ;
324
343
w. write ( XmlEvent :: characters ( & tmdb_episode. tmdb_id_str ( ) ) ) . unwrap ( ) ;
325
344
w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
326
345
@@ -379,7 +398,11 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
379
398
let mut xml: Vec < u8 > = Vec :: new ( ) ;
380
399
381
400
//
382
- let mut w = EmitterConfig :: new ( ) . write_document_declaration ( true ) . pad_self_closing ( true ) . perform_indent ( true ) . create_writer ( & mut xml) ;
401
+ let mut w = EmitterConfig :: new ( )
402
+ . write_document_declaration ( true )
403
+ . pad_self_closing ( true )
404
+ . perform_indent ( true )
405
+ . create_writer ( & mut xml) ;
383
406
384
407
// season
385
408
// root
@@ -410,7 +433,11 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
410
433
// save nfo
411
434
dom:: save_nfo ( & xml, tv_season_path. join ( "season.nfo" ) . to_str ( ) . unwrap ( ) ) ;
412
435
413
- tracing:: debug!( "gen season.nfo file, title = {:?} tv_season_path = {:?} success" , season. title( ) , tv_season_path) ;
436
+ tracing:: debug!(
437
+ "gen season.nfo file, title = {:?} tv_season_path = {:?} success" ,
438
+ season. title( ) ,
439
+ tv_season_path
440
+ ) ;
414
441
}
415
442
416
443
// <?xml version="1.0" encoding="utf-8"?>
@@ -478,31 +505,35 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
478
505
// <season>-1</season>
479
506
// <episode>-1</episode>
480
507
// </tvshow>
481
- fn gen_tvshow_nfo_file ( tmdb_tv : & TmdbTV , tv_root_path : & Path ) {
482
- tracing:: debug!( "gen tvshow.nfo file, title = {:?} tv_root_path = {:?}" , tmdb_tv . name, tv_root_path ) ;
508
+ fn gen_tvshow_nfo_file ( tmdb : & TmdbTV , root_path : & Path ) {
509
+ tracing:: debug!( "gen tvshow.nfo file, title = {:?} root_path = {:?}" , tmdb . name, root_path ) ;
483
510
484
511
let mut xml: Vec < u8 > = Vec :: new ( ) ;
485
512
486
513
//
487
- let mut w = EmitterConfig :: new ( ) . write_document_declaration ( true ) . pad_self_closing ( true ) . perform_indent ( true ) . create_writer ( & mut xml) ;
514
+ let mut w = EmitterConfig :: new ( )
515
+ . write_document_declaration ( true )
516
+ . pad_self_closing ( true )
517
+ . perform_indent ( true )
518
+ . create_writer ( & mut xml) ;
488
519
489
520
// root
490
521
w. write ( XmlEvent :: start_element ( "tvshow" ) ) . unwrap ( ) ;
491
522
492
523
// gen common nfo
493
- gen_common_nfo ( & mut w, tmdb_tv ) ;
524
+ gen_tv_common_nfo ( & mut w, tmdb ) ;
494
525
495
526
// title
496
- dom:: write_text_element ( & mut w, "title" , tmdb_tv . name ( ) ) ;
527
+ dom:: write_text_element ( & mut w, "title" , tmdb . name ( ) ) ;
497
528
498
529
// originaltitle
499
- dom:: write_text_element ( & mut w, "originaltitle" , tmdb_tv . original_language ( ) ) ;
530
+ dom:: write_text_element ( & mut w, "originaltitle" , tmdb . original_language ( ) ) ;
500
531
501
532
// premiered
502
- dom:: write_text_element ( & mut w, "premiered" , tmdb_tv . first_air_date ( ) ) ;
533
+ dom:: write_text_element ( & mut w, "premiered" , tmdb . first_air_date ( ) ) ;
503
534
504
535
// year
505
- dom:: write_text_element ( & mut w, "year" , tmdb_tv . year ( ) ) ;
536
+ dom:: write_text_element ( & mut w, "year" , tmdb . year ( ) ) ;
506
537
507
538
// season
508
539
dom:: write_text_element ( & mut w, "season" , "-1" ) ;
@@ -514,29 +545,157 @@ fn gen_tvshow_nfo_file(tmdb_tv: &TmdbTV, tv_root_path: &Path) {
514
545
w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
515
546
516
547
// save nfo
517
- dom:: save_nfo ( & xml, tv_root_path. join ( "tvshow.nfo" ) . to_str ( ) . unwrap ( ) ) ;
548
+ dom:: save_nfo ( & xml, root_path. join ( "tvshow.nfo" ) . to_str ( ) . unwrap ( ) ) ;
549
+
550
+ tracing:: debug!( "gen tvshow.nfo file, title = {:?} tv_root_path = {:?} success" , tmdb. name, root_path) ;
551
+ }
552
+
553
+ fn gen_tv_common_nfo ( w : & mut EventWriter < & mut Vec < u8 > > , tmdb : & TmdbTV ) {
554
+ // dateadded
555
+ // get now time and format to 2021-01-01 00:00:00
556
+ dom:: write_text_element ( w, "dateadded" , & time:: now_time_format ( ) ) ;
557
+
558
+ // TMDB
559
+ if !tmdb. tmdb_id ( ) . is_empty ( ) {
560
+ // <tmdbid>1418</tmdbid>
561
+ dom:: write_text_element ( w, "tmdbid" , & tmdb. tmdb_id ( ) ) ;
562
+
563
+ // <uniqueid type="tmdb" default="false">1418</uniqueid>
564
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tmdb" ) . attr ( "default" , "false" ) )
565
+ . unwrap ( ) ;
566
+ w. write ( XmlEvent :: characters ( & tmdb. tmdb_id ( ) ) ) . unwrap ( ) ;
567
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
568
+ }
569
+
570
+ // TVDB
571
+ tmdb. tvdb_id ( ) . is_some_then ( |tvdb_id| {
572
+ // <tvdbid>80379</tvdbid>
573
+ dom:: write_text_element ( w, "tvdbid" , & tvdb_id. to_string ( ) ) ;
574
+
575
+ // <uniqueid type="tvdb">80379</uniqueid>
576
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tvdb" ) ) . unwrap ( ) ;
577
+ w. write ( XmlEvent :: characters ( & tvdb_id. to_string ( ) ) ) . unwrap ( ) ;
578
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
579
+ } ) ;
580
+
581
+ // IMDB
582
+ tmdb. imdb_id ( ) . is_some_then ( |imdb_id| {
583
+ // <imdbid>tt0898266</imdbid>
584
+ dom:: write_text_element ( w, "imdbid" , imdb_id) ;
585
+
586
+ // <uniqueid type="imdb" default="true">tt0898266</uniqueid>
587
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "imdb" ) . attr ( "default" , "true" ) )
588
+ . unwrap ( ) ;
589
+ w. write ( XmlEvent :: characters ( imdb_id) ) . unwrap ( ) ;
590
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
591
+ } ) ;
592
+
593
+ // overview
594
+ // plot
595
+ dom:: write_cdata_text_element ( w, "plot" , & tmdb. overview ( ) ) ;
596
+
597
+ // outline
598
+ dom:: write_cdata_text_element ( w, "outline" , & tmdb. overview ( ) ) ;
599
+
600
+ // director
601
+ tmdb. directors ( ) . is_some_then ( |directors| {
602
+ directors. iter ( ) . for_each ( |director| {
603
+ w. write ( XmlEvent :: start_element ( "director" ) . attr ( "tmdbid" , & director. id ( ) ) ) . unwrap ( ) ;
604
+ w. write ( XmlEvent :: characters ( director. name ( ) ) ) . unwrap ( ) ;
605
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
606
+ } ) ;
607
+ } ) ;
608
+
609
+ // actors
610
+ tmdb. actors ( ) . is_some_then ( |actors| {
611
+ actors. iter ( ) . for_each ( |actor| {
612
+ w. write ( XmlEvent :: start_element ( "actor" ) ) . unwrap ( ) ;
613
+
614
+ dom:: write_text_element ( w, "name" , actor. name ( ) ) ;
615
+ dom:: write_text_element ( w, "type" , "Actor" ) ;
616
+ dom:: write_text_element ( w, "role" , actor. character ( ) ) ;
617
+ dom:: write_text_element ( w, "tmdbid" , & actor. id ( ) ) ;
618
+ dom:: write_text_element ( w, "thumb" , & actor. thumb ( ) ) ;
619
+ dom:: write_text_element ( w, "profile" , & actor. profile ( ) ) ;
620
+
621
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
622
+ } ) ;
623
+ } ) ;
624
+
625
+ // genre
626
+ tmdb. genres . is_some_then ( |genres| {
627
+ genres. iter ( ) . for_each ( |genre| dom:: write_text_element ( w, "genre" , genre. name ( ) ) ) ;
628
+ } ) ;
629
+
630
+ // rating
631
+ dom:: write_text_element ( w, "rating" , & tmdb. vote_average ( ) ) ;
632
+ }
633
+
634
+ fn gen_movie_nfo_file ( tmdb : & super :: entity:: TmdbMovie , root_path : & Path , movie_path : & Path ) {
635
+ let movie_path = movie_path. clone ( ) . with_extension ( "nfo" ) ;
636
+
637
+ tracing:: debug!(
638
+ "gen movie.nfo file, title = {:?} root_path = {:?} movie_path = {:?}" ,
639
+ tmdb. title,
640
+ root_path,
641
+ movie_path
642
+ ) ;
643
+
644
+ let mut xml: Vec < u8 > = Vec :: new ( ) ;
645
+
646
+ //
647
+ let mut w = EmitterConfig :: new ( )
648
+ . write_document_declaration ( true )
649
+ . pad_self_closing ( true )
650
+ . perform_indent ( true )
651
+ . create_writer ( & mut xml) ;
652
+
653
+ // root
654
+ w. write ( XmlEvent :: start_element ( "movie" ) ) . unwrap ( ) ;
655
+
656
+ // gen common nfo
657
+ gen_movie_common_nfo ( & mut w, tmdb) ;
658
+
659
+ // title
660
+ dom:: write_text_element ( & mut w, "title" , tmdb. name ( ) ) ;
661
+
662
+ // originaltitle
663
+ dom:: write_text_element ( & mut w, "originaltitle" , tmdb. original_language ( ) ) ;
664
+
665
+ // premiered
666
+ dom:: write_text_element ( & mut w, "premiered" , tmdb. first_air_date ( ) ) ;
667
+
668
+ // year
669
+ dom:: write_text_element ( & mut w, "year" , tmdb. year ( ) ) ;
670
+
671
+ // end root
672
+ w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
673
+
674
+ // save nfo
675
+ dom:: save_nfo ( & xml, movie_path. to_str ( ) . unwrap ( ) ) ;
518
676
519
- tracing:: debug!( "gen tvshow .nfo file, title = {:?} tv_root_path = {:?} success" , tmdb_tv . name , tv_root_path ) ;
677
+ tracing:: debug!( "gen movie .nfo file, title = {:?} tv_root_path = {:?} success" , tmdb . title , root_path ) ;
520
678
}
521
679
522
- fn gen_common_nfo ( w : & mut EventWriter < & mut Vec < u8 > > , tmdb_tv : & TmdbTV ) {
680
+ fn gen_movie_common_nfo ( w : & mut EventWriter < & mut Vec < u8 > > , tmdb : & TmdbMovie ) {
523
681
// dateadded
524
682
// get now time and format to 2021-01-01 00:00:00
525
683
dom:: write_text_element ( w, "dateadded" , & time:: now_time_format ( ) ) ;
526
684
527
685
// TMDB
528
- if !tmdb_tv . tmdb_id ( ) . is_empty ( ) {
686
+ if !tmdb . tmdb_id ( ) . is_empty ( ) {
529
687
// <tmdbid>1418</tmdbid>
530
- dom:: write_text_element ( w, "tmdbid" , & tmdb_tv . tmdb_id ( ) ) ;
688
+ dom:: write_text_element ( w, "tmdbid" , & tmdb . tmdb_id ( ) ) ;
531
689
532
690
// <uniqueid type="tmdb" default="false">1418</uniqueid>
533
- w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tmdb" ) . attr ( "default" , "false" ) ) . unwrap ( ) ;
534
- w. write ( XmlEvent :: characters ( & tmdb_tv. tmdb_id ( ) ) ) . unwrap ( ) ;
691
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "tmdb" ) . attr ( "default" , "false" ) )
692
+ . unwrap ( ) ;
693
+ w. write ( XmlEvent :: characters ( & tmdb. tmdb_id ( ) ) ) . unwrap ( ) ;
535
694
w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
536
695
}
537
696
538
697
// TVDB
539
- tmdb_tv . tvdb_id ( ) . is_some_then ( |tvdb_id| {
698
+ tmdb . tvdb_id ( ) . is_some_then ( |tvdb_id| {
540
699
// <tvdbid>80379</tvdbid>
541
700
dom:: write_text_element ( w, "tvdbid" , & tvdb_id. to_string ( ) ) ;
542
701
@@ -547,25 +706,26 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
547
706
} ) ;
548
707
549
708
// IMDB
550
- tmdb_tv . imdb_id ( ) . is_some_then ( |imdb_id| {
709
+ tmdb . imdb_id ( ) . is_some_then ( |imdb_id| {
551
710
// <imdbid>tt0898266</imdbid>
552
711
dom:: write_text_element ( w, "imdbid" , imdb_id) ;
553
712
554
713
// <uniqueid type="imdb" default="true">tt0898266</uniqueid>
555
- w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "imdb" ) . attr ( "default" , "true" ) ) . unwrap ( ) ;
714
+ w. write ( XmlEvent :: start_element ( "uniqueid" ) . attr ( "type" , "imdb" ) . attr ( "default" , "true" ) )
715
+ . unwrap ( ) ;
556
716
w. write ( XmlEvent :: characters ( imdb_id) ) . unwrap ( ) ;
557
717
w. write ( XmlEvent :: end_element ( ) ) . unwrap ( ) ;
558
718
} ) ;
559
719
560
720
// overview
561
721
// plot
562
- dom:: write_cdata_text_element ( w, "plot" , & tmdb_tv . overview ( ) ) ;
722
+ dom:: write_cdata_text_element ( w, "plot" , & tmdb . overview ( ) ) ;
563
723
564
724
// outline
565
- dom:: write_cdata_text_element ( w, "outline" , & tmdb_tv . overview ( ) ) ;
725
+ dom:: write_cdata_text_element ( w, "outline" , & tmdb . overview ( ) ) ;
566
726
567
727
// director
568
- tmdb_tv . directors ( ) . is_some_then ( |directors| {
728
+ tmdb . directors ( ) . is_some_then ( |directors| {
569
729
directors. iter ( ) . for_each ( |director| {
570
730
w. write ( XmlEvent :: start_element ( "director" ) . attr ( "tmdbid" , & director. id ( ) ) ) . unwrap ( ) ;
571
731
w. write ( XmlEvent :: characters ( director. name ( ) ) ) . unwrap ( ) ;
@@ -574,7 +734,7 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
574
734
} ) ;
575
735
576
736
// actors
577
- tmdb_tv . actors ( ) . is_some_then ( |actors| {
737
+ tmdb . actors ( ) . is_some_then ( |actors| {
578
738
actors. iter ( ) . for_each ( |actor| {
579
739
w. write ( XmlEvent :: start_element ( "actor" ) ) . unwrap ( ) ;
580
740
@@ -590,10 +750,10 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
590
750
} ) ;
591
751
592
752
// genre
593
- tmdb_tv . genres . is_some_then ( |genres| {
753
+ tmdb . genres . is_some_then ( |genres| {
594
754
genres. iter ( ) . for_each ( |genre| dom:: write_text_element ( w, "genre" , genre. name ( ) ) ) ;
595
755
} ) ;
596
756
597
757
// rating
598
- dom:: write_text_element ( w, "rating" , & tmdb_tv . vote_average ( ) ) ;
758
+ dom:: write_text_element ( w, "rating" , & tmdb . vote_average ( ) ) ;
599
759
}
0 commit comments