Files
flaskProject/app/services/file_service.py
T
YanLongChangAn 6cbacab98b feat(app): 添加 ASMR 和磁力链接功能模块
- 新增 asmr_bp 蓝图模块和 AsmrService 服务
- 新增 magnet_bp 蓝图模块和 MagnetService 服务
- 在应用初始化时注册新的蓝图模块
- 将 switch 语句替换为 if-elif 语句进行配置管理
- 在前端界面添加 ASMR 功能入口
- 增加 libtorrent 依赖包
- 修复字符串引号使用问题
- 增加文件重命名异常处理
- 扩展类型注解支持 Union 类型
- 增加请求超时时间到 30 秒
- 优化前端错误处理逻辑
2026-06-01 18:43:06 +08:00

80 lines
2.7 KiB
Python

import os
from typing import List, Optional
from app.services.folder_service import FolderService
from app.utils import windows_sort_unicode
from app.constants import IGNORE_DIRS, SEPARATORS, SPECIAL_PREFIXES, SPECIAL_DIRS
class FileService:
def __init__(self, paths: List[str]):
self.paths = paths
self.result_list: list[str] = []
def perform_rename(self, entry: os.DirEntry[str], new_name: str) -> Optional[str]:
if new_name == entry.name:
return None
new_path = os.path.join(os.path.dirname(entry.path), new_name)
try:
os.rename(entry.path, new_path)
except Exception as e:
print(e)
self.result_list.insert(0, new_path)
# return new_path
def process_folder_name(self, entry: os.DirEntry[str]) -> Optional[str]:
if not any(sep in entry.name for sep in SEPARATORS):
return None
# 替换所有分隔符为+
new_name = entry.name
for sep in SEPARATORS:
new_name = new_name.replace(sep, "+")
# 分割并排序各部分
parts = new_name.split("+")
sorted_parts = windows_sort_unicode(parts)
new_name = "+".join(sorted_parts)
if new_name == entry.name:
return None
return self.perform_rename(entry, new_name)
def process_file_name(self, entry: os.DirEntry[str]) -> Optional[str]:
parent_dir = os.path.basename(os.path.dirname(entry.path))
name, ext = os.path.splitext(entry.name)
ext = ext.lower()
name = name.upper()
# 排除特殊文件夹,仅处理大小写问题
if parent_dir in SPECIAL_DIRS:
return self.perform_rename(entry, f"{name}{ext}")
name = name.replace("-", "")
name = name.replace(" ", "")
# 处理特殊前缀
for prefix in SPECIAL_PREFIXES:
if name.startswith(prefix):
return self.perform_rename(entry, f"{prefix}-{name[len(prefix):]}{ext}")
# 在字母和数字之间添加连字符
new_name = []
for i, char in enumerate(name):
if i > 0 and not name[i - 1].isnumeric() and char.isnumeric():
new_name.append(f"-{char}")
else:
new_name.append(char)
if ''.join(new_name[-2:]) == "4K":
new_name.insert(-2, "-")
return self.perform_rename(entry, f"{''.join(new_name)}{ext}")
def rename(self) -> List[str]:
FolderService(paths=self.paths, ignore_dirs=IGNORE_DIRS, folder_callback=self.process_folder_name,
file_callback=self.process_file_name).process_folder()
return self.result_list