This commit is contained in:
jxxghp
2024-04-14 13:47:12 +08:00
parent 8cd0dd4198
commit 6939bff790
4 changed files with 75 additions and 62 deletions

View File

@ -14,7 +14,6 @@ from app.core.context import Context
from app.core.context import MediaInfo, TorrentInfo from app.core.context import MediaInfo, TorrentInfo
from app.core.event import EventManager from app.core.event import EventManager
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.core.metainfo import MetaInfo
from app.core.module import ModuleManager from app.core.module import ModuleManager
from app.db.message_oper import MessageOper from app.db.message_oper import MessageOper
from app.helper.message import MessageHelper from app.helper.message import MessageHelper
@ -478,18 +477,19 @@ class ChainBase(metaclass=ABCMeta):
return self.run_module("post_torrents_message", message=message, torrents=torrents) return self.run_module("post_torrents_message", message=message, torrents=torrents)
def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str, def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str,
metainfo: MetaInfo = None, force_nfo: bool = False, force_img: bool = False) -> None: metainfo: MetaBase = None, force_nfo: bool = False, force_img: bool = False) -> None:
""" """
刮削元数据 刮削元数据
:param path: 媒体文件路径 :param path: 媒体文件路径
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param metainfo: 源文件的识别元数据
:param transfer_type: 转移模式 :param transfer_type: 转移模式
:param force_nfo: 强制刮削nfo :param force_nfo: 强制刮削nfo
:param force_img: 强制刮削图片 :param force_img: 强制刮削图片
:return: 成功或失败 :return: 成功或失败
""" """
self.run_module("scrape_metadata", path=path, mediainfo=mediainfo, self.run_module("scrape_metadata", path=path, mediainfo=mediainfo, metainfo=metainfo,
metainfo=metainfo, transfer_type=transfer_type, force_nfo=force_nfo, force_img=force_img) transfer_type=transfer_type, force_nfo=force_nfo, force_img=force_img)
def register_commands(self, commands: Dict[str, dict]) -> None: def register_commands(self, commands: Dict[str, dict]) -> None:
""" """

View File

@ -7,7 +7,7 @@ import cn2an
from app.core.config import settings from app.core.config import settings
from app.core.context import MediaInfo from app.core.context import MediaInfo
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.core.metainfo import MetaInfo from app.core.metainfo import MetaInfo, MetaInfoPath
from app.log import logger from app.log import logger
from app.modules import _ModuleBase from app.modules import _ModuleBase
from app.modules.douban.apiv2 import DoubanApi from app.modules.douban.apiv2 import DoubanApi
@ -629,53 +629,83 @@ class DoubanModule(_ModuleBase):
return infos.get("subject_collection_items") return infos.get("subject_collection_items")
def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str, def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str,
metainfo: MetaInfo = None, force_nfo: bool = False, force_img: bool = False) -> None: metainfo: MetaBase = None, force_nfo: bool = False, force_img: bool = False) -> None:
""" """
刮削元数据 刮削元数据
:param path: 媒体文件路径 :param path: 媒体文件路径
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param transfer_type: 传输类型 :param transfer_type: 传输类型
:param metainfo: 源文件的识别元数据
:param force_nfo: 是否强制刮削nfo :param force_nfo: 是否强制刮削nfo
:param force_img: 是否强制刮削图片 :param force_img: 是否强制刮削图片
:return: 成功或失败 :return: 成功或失败
""" """
def __get_mediainfo(_meta: MetaBase, _mediainfo: MediaInfo) -> Optional[MediaInfo]:
"""
获取豆瓣媒体信息
"""
if not _meta.name:
return None
# 查询豆瓣详情
if not _mediainfo.douban_id:
# 根据TMDB名称查询豆瓣数据
_doubaninfo = self.match_doubaninfo(name=_mediainfo.title,
imdbid=_mediainfo.imdb_id,
mtype=_mediainfo.type,
year=_mediainfo.year)
if not _doubaninfo:
logger.warn(f"未找到 {_mediainfo.title} 的豆瓣信息")
return None
_doubaninfo = self.douban_info(doubanid=_doubaninfo.get("id"), mtype=_mediainfo.type)
else:
_doubaninfo = self.douban_info(doubanid=_mediainfo.douban_id,
mtype=_mediainfo.type)
if not _doubaninfo:
logger(f"未获取到 {_mediainfo.douban_id} 的豆瓣媒体信息,无法刮削!")
return None
# 豆瓣媒体信息
_doubanmedia = MediaInfo(douban_info=_doubaninfo)
# 补充图片
self.obtain_images(_doubanmedia)
return _doubanmedia
if settings.SCRAP_SOURCE != "douban": if settings.SCRAP_SOURCE != "douban":
return None return None
if SystemUtils.is_bluray_dir(path): if SystemUtils.is_bluray_dir(path):
# 蓝光原盘 # 蓝光原盘
logger.info(f"开始刮削蓝光原盘:{path} ...") logger.info(f"开始刮削蓝光原盘:{path} ...")
meta = MetaInfo(path.stem) # 优先使用传入metainfo
if not meta.name: meta = metainfo or MetaInfo(path.name)
return
# 查询豆瓣详情
if not mediainfo.douban_id:
# 根据名称查询豆瓣数据
doubaninfo = self.match_doubaninfo(name=mediainfo.title,
imdbid=mediainfo.imdb_id,
mtype=mediainfo.type,
year=mediainfo.year)
if not doubaninfo:
logger.warn(f"未找到 {mediainfo.title} 的豆瓣信息")
return
doubaninfo = self.douban_info(doubanid=doubaninfo.get("id"), mtype=mediainfo.type)
else:
doubaninfo = self.douban_info(doubanid=mediainfo.douban_id,
mtype=mediainfo.type)
if not doubaninfo:
logger(f"未获取到 {mediainfo.douban_id} 的豆瓣媒体信息,无法刮削!")
return
# 豆瓣媒体信息
mediainfo = MediaInfo(douban_info=doubaninfo)
# 补充图片
self.obtain_images(mediainfo)
# 刮削路径 # 刮削路径
scrape_path = path / path.name scrape_path = path / path.name
# 媒体信息
doubanmedia = __get_mediainfo(_meta=meta, _mediainfo=mediainfo)
if not doubanmedia:
return
# 刮削
self.scraper.gen_scraper_files(meta=meta, self.scraper.gen_scraper_files(meta=meta,
mediainfo=mediainfo, mediainfo=doubanmedia,
file_path=scrape_path, file_path=scrape_path,
transfer_type=transfer_type, transfer_type=transfer_type,
force_nfo=force_nfo, force_nfo=force_nfo,
force_img=force_img) force_img=force_img)
elif path.is_file():
# 刮削单个文件
logger.info(f"开始刮削媒体库文件:{path} ...")
# 优先使用传入metainfo
meta = metainfo or MetaInfoPath(path)
# 媒体信息
doubanmedia = __get_mediainfo(_meta=meta, _mediainfo=mediainfo)
if not doubanmedia:
return
# 刮削
self.scraper.gen_scraper_files(meta=meta,
mediainfo=doubanmedia,
file_path=path,
transfer_type=transfer_type,
force_nfo=force_nfo,
force_img=force_img)
else: else:
# 目录下的所有文件 # 目录下的所有文件
for file in SystemUtils.list_files(path, settings.RMT_MEDIAEXT): for file in SystemUtils.list_files(path, settings.RMT_MEDIAEXT):
@ -683,34 +713,14 @@ class DoubanModule(_ModuleBase):
continue continue
logger.info(f"开始刮削媒体库文件:{file} ...") logger.info(f"开始刮削媒体库文件:{file} ...")
try: try:
meta = MetaInfo(file.stem) meta = MetaInfoPath(file)
if not meta.name:
continue
if not mediainfo.douban_id:
# 根据名称查询豆瓣数据
doubaninfo = self.match_doubaninfo(name=mediainfo.title,
imdbid=mediainfo.imdb_id,
mtype=mediainfo.type,
year=mediainfo.year,
season=meta.begin_season)
if not doubaninfo:
logger.warn(f"未找到 {mediainfo.title} 的豆瓣信息")
break
# 查询豆瓣详情
doubaninfo = self.douban_info(doubanid=doubaninfo.get("id"), mtype=mediainfo.type)
else:
doubaninfo = self.douban_info(doubanid=mediainfo.douban_id,
mtype=mediainfo.type)
if not doubaninfo:
logger(f"未获取到 {mediainfo.douban_id} 的豆瓣媒体信息,无法刮削!")
continue
# 豆瓣媒体信息 # 豆瓣媒体信息
mediainfo = MediaInfo(douban_info=doubaninfo) doubanmedia = __get_mediainfo(_meta=meta, _mediainfo=mediainfo)
# 补充图片 if not doubanmedia:
self.obtain_images(mediainfo) return
# 刮削 # 刮削
self.scraper.gen_scraper_files(meta=meta, self.scraper.gen_scraper_files(meta=meta,
mediainfo=mediainfo, mediainfo=doubanmedia,
file_path=file, file_path=file,
transfer_type=transfer_type, transfer_type=transfer_type,
force_nfo=force_nfo, force_nfo=force_nfo,

View File

@ -7,7 +7,6 @@ from app import schemas
from app.core.config import settings from app.core.config import settings
from app.core.context import MediaInfo from app.core.context import MediaInfo
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.core.metainfo import MetaInfo
from app.log import logger from app.log import logger
from app.modules import _ModuleBase from app.modules import _ModuleBase
from app.modules.themoviedb.category import CategoryHelper from app.modules.themoviedb.category import CategoryHelper
@ -263,11 +262,12 @@ class TheMovieDbModule(_ModuleBase):
return [] return []
def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str, def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str,
metainfo: MetaInfo = None, force_nfo: bool = False, force_img: bool = False) -> None: metainfo: MetaBase = None, force_nfo: bool = False, force_img: bool = False) -> None:
""" """
刮削元数据 刮削元数据
:param path: 媒体文件路径 :param path: 媒体文件路径
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param metainfo: 源文件的识别元数据
:param transfer_type: 转移类型 :param transfer_type: 转移类型
:param force_nfo: 强制刮削nfo :param force_nfo: 强制刮削nfo
:param force_img: 强制刮削图片 :param force_img: 强制刮削图片
@ -304,7 +304,6 @@ class TheMovieDbModule(_ModuleBase):
self.scraper.gen_scraper_files(mediainfo=mediainfo, self.scraper.gen_scraper_files(mediainfo=mediainfo,
file_path=file, file_path=file,
transfer_type=transfer_type, transfer_type=transfer_type,
metainfo=metainfo,
force_nfo=force_nfo, force_nfo=force_nfo,
force_img=force_img) force_img=force_img)
logger.info(f"{path} 刮削完成") logger.info(f"{path} 刮削完成")

View File

@ -7,6 +7,7 @@ from requests import RequestException
from app.core.config import settings from app.core.config import settings
from app.core.context import MediaInfo from app.core.context import MediaInfo
from app.core.meta import MetaBase
from app.core.metainfo import MetaInfo from app.core.metainfo import MetaInfo
from app.log import logger from app.log import logger
from app.schemas.types import MediaType from app.schemas.types import MediaType
@ -26,10 +27,11 @@ class TmdbScraper:
self.tmdb = tmdb self.tmdb = tmdb
def gen_scraper_files(self, mediainfo: MediaInfo, file_path: Path, transfer_type: str, def gen_scraper_files(self, mediainfo: MediaInfo, file_path: Path, transfer_type: str,
metainfo: MetaInfo = None, force_nfo: bool = False, force_img: bool = False): metainfo: MetaBase = None, force_nfo: bool = False, force_img: bool = False):
""" """
生成刮削文件包括NFO和图片传入路径为文件路径 生成刮削文件包括NFO和图片传入路径为文件路径
:param mediainfo: 媒体信息 :param mediainfo: 媒体信息
:param metainfo: 源文件的识别元数据
:param file_path: 文件路径或者目录路径 :param file_path: 文件路径或者目录路径
:param transfer_type: 传输类型 :param transfer_type: 传输类型
:param force_nfo: 是否强制生成NFO :param force_nfo: 是否强制生成NFO
@ -76,7 +78,9 @@ class TmdbScraper:
# 电视剧,路径为每一季的文件名 名称/Season xx/名称 SxxExx.xxx # 电视剧,路径为每一季的文件名 名称/Season xx/名称 SxxExx.xxx
else: else:
# 如果有上游传入的元信息则使用,否则使用文件名识别 # 如果有上游传入的元信息则使用,否则使用文件名识别
meta = metainfo or MetaInfo(file_path.stem) meta = metainfo or MetaInfo(file_path.name)
if meta.begin_season is None:
meta.begin_season = mediainfo.season if mediainfo.season is not None else 1
# 根目录不存在时才处理 # 根目录不存在时才处理
if self._force_nfo or not file_path.parent.with_name("tvshow.nfo").exists(): if self._force_nfo or not file_path.parent.with_name("tvshow.nfo").exists():
# 根目录描述文件 # 根目录描述文件
@ -96,7 +100,7 @@ class TmdbScraper:
self.__save_image(url=attr_value, self.__save_image(url=attr_value,
file_path=image_path) file_path=image_path)
# 查询季信息 # 查询季信息
seasoninfo = self.tmdb.get_tv_season_detail(mediainfo.tmdb_id, meta.begin_season or mediainfo.season) seasoninfo = self.tmdb.get_tv_season_detail(mediainfo.tmdb_id, meta.begin_season)
if seasoninfo: if seasoninfo:
# 季目录NFO # 季目录NFO
if self._force_nfo or not file_path.with_name("season.nfo").exists(): if self._force_nfo or not file_path.with_name("season.nfo").exists():