This commit is contained in:
jxxghp
2023-08-30 23:59:27 +08:00
parent 854fafd880
commit f0666986f0
4 changed files with 41 additions and 24 deletions

View File

@ -16,9 +16,10 @@ 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.module import ModuleManager from app.core.module import ModuleManager
from app.helper.format import FormatParser
from app.log import logger from app.log import logger
from app.schemas import TransferInfo, TransferTorrent, ExistMediaInfo, DownloadingTorrent, CommingMessage, Notification, \ from app.schemas import TransferInfo, TransferTorrent, ExistMediaInfo, DownloadingTorrent, CommingMessage, Notification, \
WebhookEventInfo, EpisodeFormat WebhookEventInfo
from app.schemas.types import TorrentStatus, MediaType, MediaImageType, EventType from app.schemas.types import TorrentStatus, MediaType, MediaImageType, EventType
from app.utils.object import ObjectUtils from app.utils.object import ObjectUtils
@ -274,7 +275,7 @@ class ChainBase(metaclass=ABCMeta):
def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo,
transfer_type: str, transfer_type: str,
target: Path = None, target: Path = None,
epformat: EpisodeFormat = None) -> Optional[TransferInfo]: formater: FormatParser = None) -> Optional[TransferInfo]:
""" """
文件转移 文件转移
:param path: 文件路径 :param path: 文件路径
@ -282,12 +283,12 @@ class ChainBase(metaclass=ABCMeta):
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param transfer_type: 转移模式 :param transfer_type: 转移模式
:param target: 转移目标路径 :param target: 转移目标路径
:param epformat: 自定义剧集识别格式 :param formater: 自定义剧集识别格式
:return: {path, target_path, message} :return: {path, target_path, message}
""" """
return self.run_module("transfer", path=path, meta=meta, mediainfo=mediainfo, return self.run_module("transfer", path=path, meta=meta, mediainfo=mediainfo,
transfer_type=transfer_type, target=target, transfer_type=transfer_type, target=target,
epformat=epformat) formater=formater)
def transfer_completed(self, hashs: Union[str, list], path: Path = None) -> None: def transfer_completed(self, hashs: Union[str, list], path: Path = None) -> None:
""" """

View File

@ -16,6 +16,7 @@ from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.models.downloadhistory import DownloadHistory from app.db.models.downloadhistory import DownloadHistory
from app.db.models.transferhistory import TransferHistory from app.db.models.transferhistory import TransferHistory
from app.db.transferhistory_oper import TransferHistoryOper from app.db.transferhistory_oper import TransferHistoryOper
from app.helper.format import FormatParser
from app.helper.progress import ProgressHelper from app.helper.progress import ProgressHelper
from app.log import logger from app.log import logger
from app.schemas import TransferInfo, TransferTorrent, Notification, EpisodeFormat from app.schemas import TransferInfo, TransferTorrent, Notification, EpisodeFormat
@ -122,12 +123,22 @@ class TransferChain(ChainBase):
# 汇总转移信息 # 汇总转移信息
transfers = {} transfers = {}
# 有集自定义格式
formaterHandler = FormatParser(eformat=epformat.format,
details=epformat.detail,
part=epformat.part,
offset=epformat.offset) if epformat else None
# 开始进度 # 开始进度
self.progress.start(ProgressKey.FileTransfer) self.progress.start(ProgressKey.FileTransfer)
# 总数 # 总数
transfer_files = SystemUtils.list_files(directory=path, transfer_files = SystemUtils.list_files(directory=path,
extensions=settings.RMT_MEDIAEXT, extensions=settings.RMT_MEDIAEXT,
min_filesize=min_filesize) min_filesize=min_filesize)
if formaterHandler:
# 有集自定义格式,过滤文件
transfer_files = [f for f in transfer_files if formaterHandler.match(f.name)]
# 总数
total_num = len(transfer_files) total_num = len(transfer_files)
# 已处理数量 # 已处理数量
processed_num = 0 processed_num = 0
@ -147,6 +158,10 @@ class TransferChain(ChainBase):
else: else:
file_paths = [trans_path] file_paths = [trans_path]
if formaterHandler:
# 有集自定义格式,过滤文件
file_paths = [f for f in file_paths if formaterHandler.match(f.name)]
# 转移所有文件 # 转移所有文件
for file_path in file_paths: for file_path in file_paths:
# 回收站及隐藏的文件不处理 # 回收站及隐藏的文件不处理
@ -209,7 +224,7 @@ class TransferChain(ChainBase):
path=file_path, path=file_path,
transfer_type=transfer_type, transfer_type=transfer_type,
target=target, target=target,
epformat=epformat) formater=formaterHandler)
if not transferinfo: if not transferinfo:
logger.error("文件转移模块运行失败") logger.error("文件转移模块运行失败")
return False, "文件转移模块运行失败" return False, "文件转移模块运行失败"
@ -245,6 +260,13 @@ class TransferChain(ChainBase):
metas[file_mediainfo.tmdb_id].begin_episode = file_meta.begin_episode metas[file_mediainfo.tmdb_id].begin_episode = file_meta.begin_episode
if (metas[file_mediainfo.tmdb_id].end_episode or 0) < (file_meta.end_episode or 0): if (metas[file_mediainfo.tmdb_id].end_episode or 0) < (file_meta.end_episode or 0):
metas[file_mediainfo.tmdb_id].end_episode = file_meta.end_episode metas[file_mediainfo.tmdb_id].end_episode = file_meta.end_episode
metas[file_mediainfo.tmdb_id].total_episode += file_meta.total_episode
# 合并元数据季度
if (metas[file_mediainfo.tmdb_id].begin_season or 0) > (file_meta.begin_season or 0):
metas[file_mediainfo.tmdb_id].begin_season = file_meta.begin_season
if (metas[file_mediainfo.tmdb_id].end_season or 0) < (file_meta.end_season or 0):
metas[file_mediainfo.tmdb_id].end_season = file_meta.end_season
metas[file_mediainfo.tmdb_id].total_season += file_meta.total_season
# 合并转移 # 合并转移
transfers[file_mediainfo.tmdb_id].file_count += transferinfo.file_count transfers[file_mediainfo.tmdb_id].file_count += transferinfo.file_count
transfers[file_mediainfo.tmdb_id].file_list.extend(transferinfo.file_list) transfers[file_mediainfo.tmdb_id].file_list.extend(transferinfo.file_list)
@ -281,7 +303,7 @@ class TransferChain(ChainBase):
self.scrape_metadata(path=transfers[tmdbid].target_path, mediainfo=media) self.scrape_metadata(path=transfers[tmdbid].target_path, mediainfo=media)
# 发送通知 # 发送通知
self.send_transfer_message(meta=metas[tmdbid], self.send_transfer_message(meta=metas[tmdbid],
mediainfo=mediainfo, mediainfo=media,
transferinfo=transfers[tmdbid]) transferinfo=transfers[tmdbid])
# 结束进度 # 结束进度
logger.info(f"{path} 转移完成,共 {total_num} 个文件," logger.info(f"{path} 转移完成,共 {total_num} 个文件,"

View File

@ -5,16 +5,16 @@ from typing import Optional, List, Tuple, Union
from jinja2 import Template from jinja2 import Template
from app.core.context import MediaInfo
from app.core.metainfo import MetaInfo
from app.core.config import settings from app.core.config import settings
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.helper.format import FormatParser
from app.log import logger from app.log import logger
from app.modules import _ModuleBase from app.modules import _ModuleBase
from app.modules.filetransfer.format_parser import FormatParser from app.schemas import TransferInfo
from app.schemas import TransferInfo, EpisodeFormat
from app.utils.system import SystemUtils
from app.schemas.types import MediaType from app.schemas.types import MediaType
from app.utils.system import SystemUtils
lock = Lock() lock = Lock()
@ -32,7 +32,7 @@ class FileTransferModule(_ModuleBase):
def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo,
transfer_type: str, target: Path = None, transfer_type: str, target: Path = None,
epformat: EpisodeFormat = None) -> TransferInfo: formater: FormatParser = None) -> TransferInfo:
""" """
文件转移 文件转移
:param path: 文件路径 :param path: 文件路径
@ -40,7 +40,7 @@ class FileTransferModule(_ModuleBase):
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param transfer_type: 转移方式 :param transfer_type: 转移方式
:param target: 目标路径 :param target: 目标路径
:param epformat: 集识别格式 :param formater: 集识别格式
:return: {path, target_path, message} :return: {path, target_path, message}
""" """
# 获取目标路径 # 获取目标路径
@ -55,7 +55,7 @@ class FileTransferModule(_ModuleBase):
mediainfo=mediainfo, mediainfo=mediainfo,
transfer_type=transfer_type, transfer_type=transfer_type,
target_dir=target, target_dir=target,
epformat=epformat) formater=formater)
@staticmethod @staticmethod
def __transfer_command(file_item: Path, target_file: Path, transfer_type: str) -> int: def __transfer_command(file_item: Path, target_file: Path, transfer_type: str) -> int:
@ -321,7 +321,7 @@ class FileTransferModule(_ModuleBase):
mediainfo: MediaInfo, mediainfo: MediaInfo,
transfer_type: str, transfer_type: str,
target_dir: Path, target_dir: Path,
epformat: EpisodeFormat = None, formater: FormatParser = None,
) -> TransferInfo: ) -> TransferInfo:
""" """
识别并转移一个文件或者一个目录下的所有文件 识别并转移一个文件或者一个目录下的所有文件
@ -330,7 +330,7 @@ class FileTransferModule(_ModuleBase):
:param mediainfo: 媒体信息 :param mediainfo: 媒体信息
:param target_dir: 目的文件夹,非空的转移到该文件夹,为空时则按类型转移到配置文件中的媒体库文件夹 :param target_dir: 目的文件夹,非空的转移到该文件夹,为空时则按类型转移到配置文件中的媒体库文件夹
:param transfer_type: 文件转移方式 :param transfer_type: 文件转移方式
:param epformat: 识别的剧集格式 :param formater: 识别的剧集格式
:return: TransferInfo、错误信息 :return: TransferInfo、错误信息
""" """
# 检查目录路径 # 检查目录路径
@ -404,16 +404,10 @@ class FileTransferModule(_ModuleBase):
in_meta.total_episode = 1 in_meta.total_episode = 1
in_meta.end_episode = None in_meta.end_episode = None
# 有集自定义格式
formaterHandler = FormatParser(eformat=epformat.format,
details=epformat.detail,
part=epformat.part,
offset=epformat.offset) if epformat else None
# 自定义识别集数、PART # 自定义识别集数、PART
if formaterHandler: if formater:
# 开始集、结束集、PART # 开始集、结束集、PART
begin_ep, end_ep, part = formaterHandler.split_episode(in_path.stem) begin_ep, end_ep, part = formater.split_episode(in_path.stem)
if begin_ep is not None: if begin_ep is not None:
in_meta.begin_episode = begin_ep in_meta.begin_episode = begin_ep
in_meta.part = part in_meta.part = part