fix 优化重命名后的媒体文件根路径获取

This commit is contained in:
景大侠
2025-07-08 22:37:32 +08:00
parent 8c27b8c33e
commit 8ea0a32879
5 changed files with 92 additions and 25 deletions
+18 -4
View File
@@ -8,11 +8,13 @@ from app import schemas
from app.chain.media import MediaChain from app.chain.media import MediaChain
from app.chain.storage import StorageChain from app.chain.storage import StorageChain
from app.chain.transfer import TransferChain from app.chain.transfer import TransferChain
from app.core.config import settings
from app.core.metainfo import MetaInfoPath from app.core.metainfo import MetaInfoPath
from app.core.security import verify_token, verify_apitoken from app.core.security import verify_token, verify_apitoken
from app.db import get_db from app.db import get_db
from app.db.models.transferhistory import TransferHistory from app.db.models.transferhistory import TransferHistory
from app.db.user_oper import get_current_active_superuser from app.db.user_oper import get_current_active_superuser
from app.helper.directory import DirectoryHelper
from app.schemas import MediaType, FileItem, ManualTransferItem from app.schemas import MediaType, FileItem, ManualTransferItem
router = APIRouter() router = APIRouter()
@@ -35,11 +37,23 @@ def query_name(path: str, filetype: str,
if not new_path: if not new_path:
return schemas.Response(success=False, message="未识别到新名称") return schemas.Response(success=False, message="未识别到新名称")
if filetype == "dir": if filetype == "dir":
parents = Path(new_path).parents media_path = DirectoryHelper.get_media_root_path(
if len(parents) > 2: rename_format=(
new_name = parents[1].name settings.TV_RENAME_FORMAT
if mediainfo.type == MediaType.TV
else settings.MOVIE_RENAME_FORMAT
),
rename_path=Path(new_path),
)
if media_path:
new_name = media_path.name
else: else:
new_name = parents[0].name # fallback
parents = Path(new_path).parents
if len(parents) > 2:
new_name = parents[1].name
else:
new_name = parents[0].name
else: else:
new_name = Path(new_path).name new_name = Path(new_path).name
return schemas.Response(success=True, data={ return schemas.Response(success=True, data={
+5 -5
View File
@@ -180,13 +180,13 @@ class StorageChain(ChainBase):
# 重命名格式 # 重命名格式
rename_format = settings.TV_RENAME_FORMAT \ rename_format = settings.TV_RENAME_FORMAT \
if mtype == MediaType.TV else settings.MOVIE_RENAME_FORMAT if mtype == MediaType.TV else settings.MOVIE_RENAME_FORMAT
# 计算重命名中的文件夹层数 media_path = DirectoryHelper.get_media_root_path(
rename_format_level = len(rename_format.split("/")) - 1 rename_format, rename_path=Path(fileitem.path)
if rename_format_level < 1: )
if not media_path:
return True return True
# 处理媒体文件根目录 # 处理媒体文件根目录
dir_item = self.get_file_item(storage=fileitem.storage, dir_item = self.get_file_item(storage=fileitem.storage, path=media_path)
path=Path(fileitem.path).parents[rename_format_level - 1])
else: else:
# 处理上级目录 # 处理上级目录
dir_item = self.get_parent_item(fileitem) dir_item = self.get_parent_item(fileitem)
+34
View File
@@ -4,6 +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.log import logger
from app.schemas.types import SystemConfigKey from app.schemas.types import SystemConfigKey
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
@@ -109,3 +110,36 @@ class DirectoryHelper:
return matched_dir return matched_dir
return matched_dirs[0] return matched_dirs[0]
return None return None
@staticmethod
def get_media_root_path(rename_format: str, rename_path: Path) -> Optional[Path]:
"""
获取重命名后的媒体文件根路径
:param rename_format: 重命名格式
:param rename_path: 重命名后的路径
:return: 媒体文件根路径
"""
# 计算重命名中的文件夹层数
rename_list = rename_format.split("/")
rename_format_level = len(rename_list) - 1
if rename_format_level <= 0:
# 无效重命名格式
logger.error(f"重命名格式 {rename_format} 不正确")
return None
for level, name in enumerate(rename_list):
# 处理特例,有的人重命名的第一层是年份、分辨率
if "{{title}}" in name:
# 找出含标题的这一层作为媒体根目录
rename_format_level -= level
break
else:
# 假定第一层目录是媒体根目录
logger.warn(f"重命名格式 {rename_format} 缺少 {{{{title}}}}")
if rename_format_level > len(rename_path.parents):
# 通常因为路径以/结尾,被Path规范化删除了
logger.error(f"路径 {rename_path} 不匹配重命名格式 {rename_format}")
return None
# 媒体根路径
media_root = rename_path.parents[rename_format_level - 1]
return media_root
+7 -11
View File
@@ -547,17 +547,13 @@ class FileManagerModule(_ModuleBase):
rename_dict=handler.get_naming_dict(meta=meta, rename_dict=handler.get_naming_dict(meta=meta,
mediainfo=mediainfo) mediainfo=mediainfo)
) )
# 计算重命名中的文件夹层数 # 获取重命名后的媒体文件根路径
rename_list = rename_format.split("/") media_path = DirectoryHelper.get_media_root_path(
rename_format_level = len(rename_list) - 1 rename_format, rename_path=target_path
for level, name in enumerate(rename_list): )
# 处理特例,有的人重命名第一层是年份、分辨率 if not media_path:
if "{{title}}" in name: # 忽略
# 找出含标题的这一层作为扫描路径 continue
rename_format_level -= level
break
# 取相对路径的第1层目录
media_path = target_path.parents[rename_format_level - 1]
if dir_path.is_relative_to(media_path): if dir_path.is_relative_to(media_path):
# 兜底检查,避免不必要的扫盘 # 兜底检查,避免不必要的扫盘
logger.warn(f"{media_path} 是媒体库目录 {dir_path} 的父目录,忽略获取媒体文件列表,请检查重命名格式!") logger.warn(f"{media_path} 是媒体库目录 {dir_path} 的父目录,忽略获取媒体文件列表,请检查重命名格式!")
+28 -5
View File
@@ -10,6 +10,7 @@ from app.core.context import MediaInfo
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 MetaInfoPath from app.core.metainfo import MetaInfoPath
from app.helper.directory import DirectoryHelper
from app.helper.message import TemplateHelper from app.helper.message import TemplateHelper
from app.log import logger from app.log import logger
from app.modules.filemanager.storages import StorageBase from app.modules.filemanager.storages import StorageBase
@@ -116,7 +117,19 @@ class TransHandler:
template_string=rename_format, template_string=rename_format,
rename_dict=self.get_naming_dict(meta=in_meta, rename_dict=self.get_naming_dict(meta=in_meta,
mediainfo=mediainfo) mediainfo=mediainfo)
).parent )
new_path = DirectoryHelper.get_media_root_path(
rename_format, rename_path=new_path
)
if not new_path:
self.__set_result(
success=False,
message="重命名格式无效",
fileitem=fileitem,
transfer_type=transfer_type,
need_notify=need_notify,
)
return self.result
else: else:
new_path = target_path / fileitem.name new_path = target_path / fileitem.name
# 整理目录 # 整理目录
@@ -156,7 +169,7 @@ class TransHandler:
if in_meta.begin_episode is None: if in_meta.begin_episode is None:
logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数") logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数")
self.__set_result(success=False, self.__set_result(success=False,
message=f"未识别到文件集数", message="未识别到文件集数",
fileitem=fileitem, fileitem=fileitem,
fail_list=[fileitem.path], fail_list=[fileitem.path],
transfer_type=transfer_type, transfer_type=transfer_type,
@@ -185,9 +198,19 @@ class TransHandler:
file_ext=f".{fileitem.extension}" file_ext=f".{fileitem.extension}"
) )
) )
# 计算重命名中的文件夹层级 folder_path = DirectoryHelper.get_media_root_path(
rename_format_level = len(rename_format.split("/")) - 1 rename_format, rename_path=new_file
folder_path = new_file.parents[rename_format_level - 1] )
if not folder_path:
self.__set_result(
success=False,
message="重命名格式无效",
fileitem=fileitem,
fail_list=[fileitem.path],
transfer_type=transfer_type,
need_notify=need_notify,
)
return self.result
else: else:
new_file = target_path / fileitem.name new_file = target_path / fileitem.name
folder_path = target_path folder_path = target_path