mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
fix 手动整理时目录匹配Bug
This commit is contained in:
+15
-3
@@ -120,7 +120,7 @@ class TransferChain(ChainBase):
|
|||||||
# 非MoviePilot下载的任务,按文件识别
|
# 非MoviePilot下载的任务,按文件识别
|
||||||
mediainfo = None
|
mediainfo = None
|
||||||
|
|
||||||
# 执行整理
|
# 执行整理,匹配源目录
|
||||||
state, errmsg = self.__do_transfer(
|
state, errmsg = self.__do_transfer(
|
||||||
fileitem=FileItem(
|
fileitem=FileItem(
|
||||||
storage="local",
|
storage="local",
|
||||||
@@ -131,7 +131,8 @@ class TransferChain(ChainBase):
|
|||||||
extension=file_path.suffix.lstrip('.'),
|
extension=file_path.suffix.lstrip('.'),
|
||||||
),
|
),
|
||||||
mediainfo=mediainfo,
|
mediainfo=mediainfo,
|
||||||
download_hash=torrent.hash
|
download_hash=torrent.hash,
|
||||||
|
src_match=True
|
||||||
)
|
)
|
||||||
|
|
||||||
# 设置下载任务状态
|
# 设置下载任务状态
|
||||||
@@ -148,7 +149,8 @@ class TransferChain(ChainBase):
|
|||||||
target_storage: str = None, target_path: Path = None,
|
target_storage: str = None, target_path: Path = None,
|
||||||
transfer_type: str = None, scrape: bool = None,
|
transfer_type: str = None, scrape: bool = None,
|
||||||
season: int = None, epformat: EpisodeFormat = None,
|
season: int = None, epformat: EpisodeFormat = None,
|
||||||
min_filesize: int = 0, download_hash: str = None, force: bool = False) -> Tuple[bool, str]:
|
min_filesize: int = 0, download_hash: str = None,
|
||||||
|
force: bool = False, src_match: bool = False) -> Tuple[bool, str]:
|
||||||
"""
|
"""
|
||||||
执行一个复杂目录的整理操作
|
执行一个复杂目录的整理操作
|
||||||
:param fileitem: 文件项
|
:param fileitem: 文件项
|
||||||
@@ -164,6 +166,7 @@ class TransferChain(ChainBase):
|
|||||||
:param min_filesize: 最小文件大小(MB)
|
:param min_filesize: 最小文件大小(MB)
|
||||||
:param download_hash: 下载记录hash
|
:param download_hash: 下载记录hash
|
||||||
:param force: 是否强制整理
|
:param force: 是否强制整理
|
||||||
|
:param src_match: 是否源目录匹配
|
||||||
返回:成功标识,错误信息
|
返回:成功标识,错误信息
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -379,6 +382,15 @@ class TransferChain(ChainBase):
|
|||||||
if download_file:
|
if download_file:
|
||||||
download_hash = download_file.download_hash
|
download_hash = download_file.download_hash
|
||||||
|
|
||||||
|
# 查询整理目标目录
|
||||||
|
if not target_directory:
|
||||||
|
if target_path:
|
||||||
|
target_directory = self.directoryhelper.get_dir(mediainfo, dest_path=target_path)
|
||||||
|
elif src_match:
|
||||||
|
target_directory = self.directoryhelper.get_dir(mediainfo, src_path=file_path)
|
||||||
|
else:
|
||||||
|
target_directory = self.directoryhelper.get_dir(mediainfo)
|
||||||
|
|
||||||
# 执行整理
|
# 执行整理
|
||||||
transferinfo: TransferInfo = self.transfer(fileitem=file_item,
|
transferinfo: TransferInfo = self.transfer(fileitem=file_item,
|
||||||
meta=file_meta,
|
meta=file_meta,
|
||||||
|
|||||||
+11
-12
@@ -4,7 +4,7 @@ from typing import List, Optional
|
|||||||
from app import schemas
|
from app import schemas
|
||||||
from app.core.context import MediaInfo
|
from app.core.context import MediaInfo
|
||||||
from app.db.systemconfig_oper import SystemConfigOper
|
from app.db.systemconfig_oper import SystemConfigOper
|
||||||
from app.schemas.types import SystemConfigKey, MediaType
|
from app.schemas.types import SystemConfigKey
|
||||||
|
|
||||||
|
|
||||||
class DirectoryHelper:
|
class DirectoryHelper:
|
||||||
@@ -59,10 +59,10 @@ class DirectoryHelper:
|
|||||||
:param local: 是否本地目录
|
:param local: 是否本地目录
|
||||||
"""
|
"""
|
||||||
# 处理类型
|
# 处理类型
|
||||||
if media:
|
if not media:
|
||||||
media_type = media.type.value
|
return None
|
||||||
else:
|
# 电影/电视剧
|
||||||
media_type = MediaType.UNKNOWN.value
|
media_type = media.type.value
|
||||||
dirs = self.get_dirs()
|
dirs = self.get_dirs()
|
||||||
# 按照配置顺序查找
|
# 按照配置顺序查找
|
||||||
for d in dirs:
|
for d in dirs:
|
||||||
@@ -70,16 +70,15 @@ class DirectoryHelper:
|
|||||||
download_path = Path(d.download_path)
|
download_path = Path(d.download_path)
|
||||||
# 媒体库目录
|
# 媒体库目录
|
||||||
library_path = Path(d.library_path)
|
library_path = Path(d.library_path)
|
||||||
# 下载目录不匹配, 不符合条件, 通常处理`下载`匹配
|
# 有源目录时,源目录不匹配下载目录
|
||||||
if src_path and download_path != src_path:
|
if src_path and not src_path.is_relative_to(download_path):
|
||||||
continue
|
continue
|
||||||
# 媒体库目录不匹配, 或监控方式为None(即不自动整理), 不符合条件, 通常处理`整理`匹配
|
# 有文件项时,文件项不匹配下载目录
|
||||||
if dest_path:
|
|
||||||
if library_path != dest_path or not d.monitor_type:
|
|
||||||
continue
|
|
||||||
# 没有目录配置时起作用, 通常处理`手动整理`未选择`目标目录`的情况
|
|
||||||
if fileitem and not Path(fileitem.path).is_relative_to(download_path):
|
if fileitem and not Path(fileitem.path).is_relative_to(download_path):
|
||||||
continue
|
continue
|
||||||
|
# 有目标目录时,目标目录不匹配媒体库目录
|
||||||
|
if dest_path and not dest_path.is_relative_to(library_path):
|
||||||
|
continue
|
||||||
# 本地目录
|
# 本地目录
|
||||||
if local and d.storage != "local":
|
if local and d.storage != "local":
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -65,9 +65,8 @@ class FileManagerModule(_ModuleBase):
|
|||||||
"""
|
"""
|
||||||
测试模块连接性
|
测试模块连接性
|
||||||
"""
|
"""
|
||||||
directoryhelper = DirectoryHelper()
|
|
||||||
# 检查目录
|
# 检查目录
|
||||||
dirs = directoryhelper.get_dirs()
|
dirs = self.directoryhelper.get_dirs()
|
||||||
if not dirs:
|
if not dirs:
|
||||||
return False, "未设置任何目录"
|
return False, "未设置任何目录"
|
||||||
for d in dirs:
|
for d in dirs:
|
||||||
@@ -349,14 +348,6 @@ class FileManagerModule(_ModuleBase):
|
|||||||
fileitem=fileitem,
|
fileitem=fileitem,
|
||||||
message=f"{target_path} 不是有效目录")
|
message=f"{target_path} 不是有效目录")
|
||||||
# 获取目标路径
|
# 获取目标路径
|
||||||
directoryhelper = DirectoryHelper()
|
|
||||||
if not target_directory:
|
|
||||||
# 根据目的路径查找目录配置
|
|
||||||
if target_path:
|
|
||||||
target_directory = directoryhelper.get_dir(mediainfo, dest_path=target_path)
|
|
||||||
else:
|
|
||||||
target_directory = directoryhelper.get_dir(mediainfo, fileitem=fileitem)
|
|
||||||
|
|
||||||
if target_directory:
|
if target_directory:
|
||||||
# 拼装媒体库一、二级子目录
|
# 拼装媒体库一、二级子目录
|
||||||
target_path = self.__get_dest_dir(mediainfo=mediainfo, target_dir=target_directory)
|
target_path = self.__get_dest_dir(mediainfo=mediainfo, target_dir=target_directory)
|
||||||
@@ -378,7 +369,7 @@ class FileManagerModule(_ModuleBase):
|
|||||||
# 覆盖模式
|
# 覆盖模式
|
||||||
overwrite_mode = target_directory.overwrite_mode
|
overwrite_mode = target_directory.overwrite_mode
|
||||||
elif target_path:
|
elif target_path:
|
||||||
# 自定义目标路径,仅适用于手动整理的场景
|
# 手动整理的场景,有自定义目标路径
|
||||||
need_scrape = scrape or False
|
need_scrape = scrape or False
|
||||||
need_rename = True
|
need_rename = True
|
||||||
need_notify = False
|
need_notify = False
|
||||||
|
|||||||
+4
-6
@@ -263,19 +263,17 @@ class Monitor(metaclass=Singleton):
|
|||||||
try:
|
try:
|
||||||
item = self._queue.get(timeout=self._transfer_interval)
|
item = self._queue.get(timeout=self._transfer_interval)
|
||||||
if item:
|
if item:
|
||||||
self.__handle_file(storage=item.get("storage"),
|
self.__handle_file(storage=item.get("storage"), event_path=item.get("filepath"))
|
||||||
event_path=item.get("filepath"),
|
|
||||||
mon_path=item.get("mon_path"))
|
|
||||||
except queue.Empty:
|
except queue.Empty:
|
||||||
continue
|
continue
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"整理队列处理出现错误:{e}")
|
logger.error(f"整理队列处理出现错误:{e}")
|
||||||
|
|
||||||
def __handle_file(self, storage: str, event_path: Path, mon_path: Path):
|
def __handle_file(self, storage: str, event_path: Path):
|
||||||
"""
|
"""
|
||||||
整理一个文件
|
整理一个文件
|
||||||
|
:param storage: 存储
|
||||||
:param event_path: 事件文件路径
|
:param event_path: 事件文件路径
|
||||||
:param mon_path: 监控目录
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __get_bluray_dir(_path: Path):
|
def __get_bluray_dir(_path: Path):
|
||||||
@@ -386,7 +384,7 @@ class Monitor(metaclass=Singleton):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# 查询转移目的目录
|
# 查询转移目的目录
|
||||||
dir_info = self.directoryhelper.get_dir(mediainfo, src_path=mon_path)
|
dir_info = self.directoryhelper.get_dir(mediainfo, src_path=event_path)
|
||||||
if not dir_info:
|
if not dir_info:
|
||||||
logger.warn(f"{event_path.name} 未找到对应的目标目录")
|
logger.warn(f"{event_path.name} 未找到对应的目标目录")
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user