Skip to content

Commit 66258d8

Browse files
committed
update
1 parent 89cb09d commit 66258d8

File tree

2 files changed

+215
-52
lines changed

2 files changed

+215
-52
lines changed

soda_resource_tools_lib/src/soda/tmdb/scraper.rs

+199-39
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,52 @@ use crate::soda::{
1111
utils::{self, str_replace_extension, time},
1212
};
1313

14-
use super::entity::{TmdbEpisode, TmdbSeason, TmdbTV};
14+
use super::entity::{TmdbEpisode, TmdbMovie, TmdbSeason, TmdbTV};
1515

1616
pub(crate) fn gen_scrape_files(scrape_config: &ScrapeConfig, mt_meta: &MTMetadata, mt_info: &MTInfo, path: &str) {
1717
match mt_info {
18-
MTInfo::MOVIE(_) => todo!(),
1918
MTInfo::TV(TVType::TMDB(tmdb_tv_info)) => {
2019
gen_scrape_tv_files(scrape_config, path, tmdb_tv_info, mt_meta);
2120
}
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");
2236
}
2337
}
2438

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) {
2640
// root
27-
let tv_root_path = Path::new(path).parent().unwrap().parent().unwrap();
41+
let root_path = Path::new(path).parent().unwrap().parent().unwrap();
2842

2943
// 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);
3246
} else {
3347
tracing::debug!("tvshow.nfo file exist, skip gen tvshow.nfo file");
3448
}
3549

3650
if scrape_config.enable_scrape_image {
3751
// 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);
4054
});
4155
}
4256

4357
// season
4458
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| {
4660
let tv_season_path = Path::new(path).parent().unwrap();
4761

4862
// gen season.nfo file
@@ -54,15 +68,15 @@ fn gen_scrape_tv_files(scrape_config: &ScrapeConfig, path: &str, tmdb_tv_info: &
5468

5569
if scrape_config.enable_scrape_image {
5670
// 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);
5872
}
5973
});
6074
});
6175

6276
// episode
6377
meta.season_number().is_some_then(|season_number| {
6478
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| {
6680
season_info.tv_episodes.get(episode_number).is_some_then(|episode| {
6781
let tv_episode_path = Path::new(path);
6882

@@ -309,7 +323,11 @@ fn gen_episode_nfo_file(meta: &MTMetadata, season_number: &i64, episode_number:
309323
let mut xml: Vec<u8> = Vec::new();
310324

311325
//
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);
313331

314332
// season
315333
// root
@@ -320,7 +338,8 @@ fn gen_episode_nfo_file(meta: &MTMetadata, season_number: &i64, episode_number:
320338
dom::write_text_element(&mut w, "dateadded", &time::now_time_format());
321339

322340
// 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();
324343
w.write(XmlEvent::characters(&tmdb_episode.tmdb_id_str())).unwrap();
325344
w.write(XmlEvent::end_element()).unwrap();
326345

@@ -379,7 +398,11 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
379398
let mut xml: Vec<u8> = Vec::new();
380399

381400
//
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);
383406

384407
// season
385408
// root
@@ -410,7 +433,11 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
410433
// save nfo
411434
dom::save_nfo(&xml, tv_season_path.join("season.nfo").to_str().unwrap());
412435

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+
);
414441
}
415442

416443
// <?xml version="1.0" encoding="utf-8"?>
@@ -478,31 +505,35 @@ fn gen_season_nfo_file(meta: &MTMetadata, season: &TmdbSeason, tv_season_path: &
478505
// <season>-1</season>
479506
// <episode>-1</episode>
480507
// </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);
483510

484511
let mut xml: Vec<u8> = Vec::new();
485512

486513
//
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);
488519

489520
// root
490521
w.write(XmlEvent::start_element("tvshow")).unwrap();
491522

492523
// gen common nfo
493-
gen_common_nfo(&mut w, tmdb_tv);
524+
gen_tv_common_nfo(&mut w, tmdb);
494525

495526
// title
496-
dom::write_text_element(&mut w, "title", tmdb_tv.name());
527+
dom::write_text_element(&mut w, "title", tmdb.name());
497528

498529
// originaltitle
499-
dom::write_text_element(&mut w, "originaltitle", tmdb_tv.original_language());
530+
dom::write_text_element(&mut w, "originaltitle", tmdb.original_language());
500531

501532
// 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());
503534

504535
// year
505-
dom::write_text_element(&mut w, "year", tmdb_tv.year());
536+
dom::write_text_element(&mut w, "year", tmdb.year());
506537

507538
// season
508539
dom::write_text_element(&mut w, "season", "-1");
@@ -514,29 +545,157 @@ fn gen_tvshow_nfo_file(tmdb_tv: &TmdbTV, tv_root_path: &Path) {
514545
w.write(XmlEvent::end_element()).unwrap();
515546

516547
// 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());
518676

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);
520678
}
521679

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) {
523681
// dateadded
524682
// get now time and format to 2021-01-01 00:00:00
525683
dom::write_text_element(w, "dateadded", &time::now_time_format());
526684

527685
// TMDB
528-
if !tmdb_tv.tmdb_id().is_empty() {
686+
if !tmdb.tmdb_id().is_empty() {
529687
// <tmdbid>1418</tmdbid>
530-
dom::write_text_element(w, "tmdbid", &tmdb_tv.tmdb_id());
688+
dom::write_text_element(w, "tmdbid", &tmdb.tmdb_id());
531689

532690
// <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();
535694
w.write(XmlEvent::end_element()).unwrap();
536695
}
537696

538697
// TVDB
539-
tmdb_tv.tvdb_id().is_some_then(|tvdb_id| {
698+
tmdb.tvdb_id().is_some_then(|tvdb_id| {
540699
// <tvdbid>80379</tvdbid>
541700
dom::write_text_element(w, "tvdbid", &tvdb_id.to_string());
542701

@@ -547,25 +706,26 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
547706
});
548707

549708
// IMDB
550-
tmdb_tv.imdb_id().is_some_then(|imdb_id| {
709+
tmdb.imdb_id().is_some_then(|imdb_id| {
551710
// <imdbid>tt0898266</imdbid>
552711
dom::write_text_element(w, "imdbid", imdb_id);
553712

554713
// <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();
556716
w.write(XmlEvent::characters(imdb_id)).unwrap();
557717
w.write(XmlEvent::end_element()).unwrap();
558718
});
559719

560720
// overview
561721
// plot
562-
dom::write_cdata_text_element(w, "plot", &tmdb_tv.overview());
722+
dom::write_cdata_text_element(w, "plot", &tmdb.overview());
563723

564724
// outline
565-
dom::write_cdata_text_element(w, "outline", &tmdb_tv.overview());
725+
dom::write_cdata_text_element(w, "outline", &tmdb.overview());
566726

567727
// director
568-
tmdb_tv.directors().is_some_then(|directors| {
728+
tmdb.directors().is_some_then(|directors| {
569729
directors.iter().for_each(|director| {
570730
w.write(XmlEvent::start_element("director").attr("tmdbid", &director.id())).unwrap();
571731
w.write(XmlEvent::characters(director.name())).unwrap();
@@ -574,7 +734,7 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
574734
});
575735

576736
// actors
577-
tmdb_tv.actors().is_some_then(|actors| {
737+
tmdb.actors().is_some_then(|actors| {
578738
actors.iter().for_each(|actor| {
579739
w.write(XmlEvent::start_element("actor")).unwrap();
580740

@@ -590,10 +750,10 @@ fn gen_common_nfo(w: &mut EventWriter<&mut Vec<u8>>, tmdb_tv: &TmdbTV) {
590750
});
591751

592752
// genre
593-
tmdb_tv.genres.is_some_then(|genres| {
753+
tmdb.genres.is_some_then(|genres| {
594754
genres.iter().for_each(|genre| dom::write_text_element(w, "genre", genre.name()));
595755
});
596756

597757
// rating
598-
dom::write_text_element(w, "rating", &tmdb_tv.vote_average());
758+
dom::write_text_element(w, "rating", &tmdb.vote_average());
599759
}

0 commit comments

Comments
 (0)