diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index c8f9f938..d2be9f51 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -765,6 +765,16 @@ class DoubanModule(_ModuleBase): logger.error(f"刮削文件 {file} 失败,原因:{str(e)}") logger.info(f"{path} 刮削完成") + def meta_nfo(self, mediainfo: MediaInfo, season: int = None, **kwargs) -> Optional[str]: + """ + 获取NFO文件内容文本 + :param mediainfo: 媒体信息 + :param season: 季号 + """ + if settings.SCRAP_SOURCE != "douban": + return None + return self.scraper.get_meta_nfo(mediainfo=mediainfo, season=season) + def obtain_images(self, mediainfo: MediaInfo) -> Optional[MediaInfo]: """ 补充抓取媒体信息图片 diff --git a/app/modules/douban/scraper.py b/app/modules/douban/scraper.py index 2fad1c79..f51dd9ce 100644 --- a/app/modules/douban/scraper.py +++ b/app/modules/douban/scraper.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Union +from typing import Union, Optional from xml.dom import minidom from app.core.config import settings @@ -17,6 +17,27 @@ class DoubanScraper: _force_nfo = False _force_img = False + def get_meta_nfo(self, mediainfo: MediaInfo, season: int = None) -> Optional[str]: + """ + 获取NFO文件内容文本 + :param mediainfo: 媒体信息 + :param season: 季号 + """ + if mediainfo.type == MediaType.MOVIE: + # 电影元数据文件 + doc = self.__gen_movie_nfo_file(mediainfo=mediainfo) + else: + if season: + # 季元数据文件 + doc = self.__gen_tv_season_nfo_file(mediainfo=mediainfo, season=season) + else: + # 电视剧元数据文件 + doc = self.__gen_tv_nfo_file(mediainfo=mediainfo) + if doc: + return doc.toprettyxml(indent=" ", encoding="utf-8") + + return None + def gen_scraper_files(self, meta: MetaBase, mediainfo: MediaInfo, file_path: Path, transfer_type: str, force_nfo: bool = False, force_img: bool = False): @@ -84,7 +105,7 @@ class DoubanScraper: logger.error(f"{file_path} 刮削失败:{str(e)}") @staticmethod - def __gen_common_nfo(mediainfo: MediaInfo, doc, root): + def __gen_common_nfo(mediainfo: MediaInfo, doc: minidom.Document, root: minidom.Node): # 简介 xplot = DomUtils.add_node(doc, root, "plot") xplot.appendChild(doc.createCDATASection(mediainfo.overview or "")) @@ -108,7 +129,7 @@ class DoubanScraper: def __gen_movie_nfo_file(self, mediainfo: MediaInfo, - file_path: Path): + file_path: Path = None) -> minidom.Document: """ 生成电影的NFO描述文件 :param mediainfo: 豆瓣信息 @@ -127,11 +148,14 @@ class DoubanScraper: # 年份 DomUtils.add_node(doc, root, "year", mediainfo.year or "") # 保存 - self.__save_nfo(doc, file_path.with_suffix(".nfo")) + if file_path: + self.__save_nfo(doc, file_path.with_suffix(".nfo")) + + return doc def __gen_tv_nfo_file(self, mediainfo: MediaInfo, - dir_path: Path): + dir_path: Path = None) -> minidom.Document: """ 生成电视剧的NFO描述文件 :param mediainfo: 媒体信息 @@ -152,9 +176,13 @@ class DoubanScraper: DomUtils.add_node(doc, root, "season", "-1") DomUtils.add_node(doc, root, "episode", "-1") # 保存 - self.__save_nfo(doc, dir_path.joinpath("tvshow.nfo")) + if dir_path: + self.__save_nfo(doc, dir_path.joinpath("tvshow.nfo")) - def __gen_tv_season_nfo_file(self, mediainfo: MediaInfo, season: int, season_path: Path): + return doc + + def __gen_tv_season_nfo_file(self, mediainfo: MediaInfo, + season: int, season_path: Path = None) -> minidom.Document: """ 生成电视剧季的NFO描述文件 :param mediainfo: 媒体信息 @@ -179,7 +207,9 @@ class DoubanScraper: # seasonnumber DomUtils.add_node(doc, root, "seasonnumber", str(season)) # 保存 - self.__save_nfo(doc, season_path.joinpath("season.nfo")) + if season_path: + self.__save_nfo(doc, season_path.joinpath("season.nfo")) + return doc def __save_image(self, url: str, file_path: Path): """ diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index 9e9f48dd..0ed01ccf 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -332,6 +332,19 @@ class TheMovieDbModule(_ModuleBase): force_img=force_img) logger.info(f"{path} 刮削完成") + def meta_nfo(self, meta: MetaBase, mediainfo: MediaInfo, + season: int = None, episode: int = None) -> Optional[str]: + """ + 获取NFO文件内容文本 + :param meta: 元数据 + :param mediainfo: 媒体信息 + :param season: 季号 + :param episode: 集号 + """ + if settings.SCRAP_SOURCE != "themoviedb": + return None + return self.scraper.get_meta_nfo(meta=meta, mediainfo=mediainfo, season=season, episode=episode) + def tmdb_discover(self, mtype: MediaType, sort_by: str, with_genres: str, with_original_language: str, page: int = 1) -> Optional[List[MediaInfo]]: """ diff --git a/app/modules/themoviedb/scraper.py b/app/modules/themoviedb/scraper.py index 91717880..b22afd0e 100644 --- a/app/modules/themoviedb/scraper.py +++ b/app/modules/themoviedb/scraper.py @@ -26,8 +26,8 @@ class TmdbScraper: def __init__(self, tmdb): self.tmdb = tmdb - def meta_nfo(self, meta: MetaBase, mediainfo: MediaInfo, - season: int = None, episode: int = None) -> Optional[str]: + def get_meta_nfo(self, meta: MetaBase, mediainfo: MediaInfo, + season: int = None, episode: int = None) -> Optional[str]: """ 获取NFO文件内容文本 :param meta: 元数据