mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-08 17:08:35 +08:00
fix:去除文件操作全局锁
This commit is contained in:
@@ -580,6 +580,11 @@ class TransferChain(ChainBase, metaclass=Singleton):
|
|||||||
fileitem = task.fileitem
|
fileitem = task.fileitem
|
||||||
|
|
||||||
with task_lock:
|
with task_lock:
|
||||||
|
# 获取当前最新总数
|
||||||
|
current_total = self.jobview.total()
|
||||||
|
# 更新总数,取当前总数和当前已处理+运行中+队列中的最大值
|
||||||
|
self._total_num = max(self._total_num, current_total)
|
||||||
|
|
||||||
# 如果当前没有在运行的任务且处理数为0,说明是一个新序列的开始
|
# 如果当前没有在运行的任务且处理数为0,说明是一个新序列的开始
|
||||||
if self._active_tasks == 0 and self._processed_num == 0:
|
if self._active_tasks == 0 and self._processed_num == 0:
|
||||||
logger.info("开始整理队列处理...")
|
logger.info("开始整理队列处理...")
|
||||||
@@ -588,7 +593,6 @@ class TransferChain(ChainBase, metaclass=Singleton):
|
|||||||
# 重置计数
|
# 重置计数
|
||||||
self._processed_num = 0
|
self._processed_num = 0
|
||||||
self._fail_num = 0
|
self._fail_num = 0
|
||||||
self._total_num = self.jobview.total()
|
|
||||||
__process_msg = f"开始整理队列处理,当前共 {self._total_num} 个文件 ..."
|
__process_msg = f"开始整理队列处理,当前共 {self._total_num} 个文件 ..."
|
||||||
logger.info(__process_msg)
|
logger.info(__process_msg)
|
||||||
self._progress.update(value=0,
|
self._progress.update(value=0,
|
||||||
@@ -605,6 +609,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
|
|||||||
text=__process_msg)
|
text=__process_msg)
|
||||||
# 整理
|
# 整理
|
||||||
state, err_msg = self.__handle_transfer(task=task, callback=item.callback)
|
state, err_msg = self.__handle_transfer(task=task, callback=item.callback)
|
||||||
|
|
||||||
with task_lock:
|
with task_lock:
|
||||||
if not state:
|
if not state:
|
||||||
# 任务失败
|
# 任务失败
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ class LocalStorage(StorageBase):
|
|||||||
return None
|
return None
|
||||||
path_obj = Path(fileitem.path) / name
|
path_obj = Path(fileitem.path) / name
|
||||||
if not path_obj.exists():
|
if not path_obj.exists():
|
||||||
path_obj.mkdir(parents=True)
|
path_obj.mkdir(parents=True, exist_ok=True)
|
||||||
return self.__get_diritem(path_obj)
|
return self.__get_diritem(path_obj)
|
||||||
|
|
||||||
def get_folder(self, path: Path) -> Optional[schemas.FileItem]:
|
def get_folder(self, path: Path) -> Optional[schemas.FileItem]:
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class Rclone(StorageBase):
|
|||||||
logger.info(f"【rclone】配置写入文件:{filepath}")
|
logger.info(f"【rclone】配置写入文件:{filepath}")
|
||||||
path = Path(filepath)
|
path = Path(filepath)
|
||||||
if not path.parent.exists():
|
if not path.parent.exists():
|
||||||
path.parent.mkdir(parents=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
path.write_text(conf.get('content'), encoding='utf-8')
|
path.write_text(conf.get('content'), encoding='utf-8')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ from app.schemas import TransferInfo, TmdbEpisode, TransferDirectoryConf, FileIt
|
|||||||
from app.schemas.types import MediaType, ChainEventType
|
from app.schemas.types import MediaType, ChainEventType
|
||||||
from app.utils.system import SystemUtils
|
from app.utils.system import SystemUtils
|
||||||
|
|
||||||
lock = Lock()
|
|
||||||
|
|
||||||
|
|
||||||
class TransHandler:
|
class TransHandler:
|
||||||
"""
|
"""
|
||||||
@@ -383,113 +381,111 @@ class TransHandler:
|
|||||||
and fileitem.storage != "local" and target_storage != "local"):
|
and fileitem.storage != "local" and target_storage != "local"):
|
||||||
return None, f"不支持 {fileitem.storage} 到 {target_storage} 的文件整理"
|
return None, f"不支持 {fileitem.storage} 到 {target_storage} 的文件整理"
|
||||||
|
|
||||||
# 加锁
|
if fileitem.storage == "local" and target_storage == "local":
|
||||||
with lock:
|
# 创建目录
|
||||||
if fileitem.storage == "local" and target_storage == "local":
|
if not target_file.parent.exists():
|
||||||
# 创建目录
|
target_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
if not target_file.parent.exists():
|
# 本地到本地
|
||||||
target_file.parent.mkdir(parents=True)
|
if transfer_type == "copy":
|
||||||
# 本地到本地
|
state = source_oper.copy(fileitem, target_file.parent, target_file.name)
|
||||||
if transfer_type == "copy":
|
elif transfer_type == "move":
|
||||||
state = source_oper.copy(fileitem, target_file.parent, target_file.name)
|
state = source_oper.move(fileitem, target_file.parent, target_file.name)
|
||||||
elif transfer_type == "move":
|
elif transfer_type == "link":
|
||||||
state = source_oper.move(fileitem, target_file.parent, target_file.name)
|
state = source_oper.link(fileitem, target_file)
|
||||||
elif transfer_type == "link":
|
elif transfer_type == "softlink":
|
||||||
state = source_oper.link(fileitem, target_file)
|
state = source_oper.softlink(fileitem, target_file)
|
||||||
elif transfer_type == "softlink":
|
else:
|
||||||
state = source_oper.softlink(fileitem, target_file)
|
return None, f"不支持的整理方式:{transfer_type}"
|
||||||
|
if state:
|
||||||
|
return __get_targetitem(target_file), ""
|
||||||
|
else:
|
||||||
|
return None, f"{fileitem.path} {transfer_type} 失败"
|
||||||
|
elif fileitem.storage == "local" and target_storage != "local":
|
||||||
|
# 本地到网盘
|
||||||
|
filepath = Path(fileitem.path)
|
||||||
|
if not filepath.exists():
|
||||||
|
return None, f"文件 {filepath} 不存在"
|
||||||
|
if transfer_type == "copy":
|
||||||
|
# 复制
|
||||||
|
# 根据目的路径创建文件夹
|
||||||
|
target_fileitem = target_oper.get_folder(target_file.parent)
|
||||||
|
if target_fileitem:
|
||||||
|
# 上传文件
|
||||||
|
new_item = target_oper.upload(target_fileitem, filepath, target_file.name)
|
||||||
|
if new_item:
|
||||||
|
return new_item, ""
|
||||||
|
else:
|
||||||
|
return None, f"{fileitem.path} 上传 {target_storage} 失败"
|
||||||
else:
|
else:
|
||||||
return None, f"不支持的整理方式:{transfer_type}"
|
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
||||||
if state:
|
elif transfer_type == "move":
|
||||||
|
# 移动
|
||||||
|
# 根据目的路径获取文件夹
|
||||||
|
target_fileitem = target_oper.get_folder(target_file.parent)
|
||||||
|
if target_fileitem:
|
||||||
|
# 上传文件
|
||||||
|
new_item = target_oper.upload(target_fileitem, filepath, target_file.name)
|
||||||
|
if new_item:
|
||||||
|
# 删除源文件
|
||||||
|
source_oper.delete(fileitem)
|
||||||
|
return new_item, ""
|
||||||
|
else:
|
||||||
|
return None, f"{fileitem.path} 上传 {target_storage} 失败"
|
||||||
|
else:
|
||||||
|
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
||||||
|
elif fileitem.storage != "local" and target_storage == "local":
|
||||||
|
# 网盘到本地
|
||||||
|
if target_file.exists():
|
||||||
|
logger.warn(f"文件已存在:{target_file}")
|
||||||
|
return __get_targetitem(target_file), ""
|
||||||
|
# 网盘到本地
|
||||||
|
if transfer_type in ["copy", "move"]:
|
||||||
|
# 下载
|
||||||
|
tmp_file = source_oper.download(fileitem=fileitem, path=target_file.parent)
|
||||||
|
if tmp_file:
|
||||||
|
# 创建目录
|
||||||
|
if not target_file.parent.exists():
|
||||||
|
target_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
# 将tmp_file移动后target_file
|
||||||
|
SystemUtils.move(tmp_file, target_file)
|
||||||
|
if transfer_type == "move":
|
||||||
|
# 删除源文件
|
||||||
|
source_oper.delete(fileitem)
|
||||||
return __get_targetitem(target_file), ""
|
return __get_targetitem(target_file), ""
|
||||||
else:
|
else:
|
||||||
return None, f"{fileitem.path} {transfer_type} 失败"
|
return None, f"{fileitem.path} {fileitem.storage} 下载失败"
|
||||||
elif fileitem.storage == "local" and target_storage != "local":
|
elif fileitem.storage == target_storage:
|
||||||
# 本地到网盘
|
# 同一网盘
|
||||||
filepath = Path(fileitem.path)
|
if not source_oper.is_support_transtype(transfer_type):
|
||||||
if not filepath.exists():
|
return None, f"存储 {fileitem.storage} 不支持 {transfer_type} 整理方式"
|
||||||
return None, f"文件 {filepath} 不存在"
|
|
||||||
if transfer_type == "copy":
|
|
||||||
# 复制
|
|
||||||
# 根据目的路径创建文件夹
|
|
||||||
target_fileitem = target_oper.get_folder(target_file.parent)
|
|
||||||
if target_fileitem:
|
|
||||||
# 上传文件
|
|
||||||
new_item = target_oper.upload(target_fileitem, filepath, target_file.name)
|
|
||||||
if new_item:
|
|
||||||
return new_item, ""
|
|
||||||
else:
|
|
||||||
return None, f"{fileitem.path} 上传 {target_storage} 失败"
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
|
||||||
elif transfer_type == "move":
|
|
||||||
# 移动
|
|
||||||
# 根据目的路径获取文件夹
|
|
||||||
target_fileitem = target_oper.get_folder(target_file.parent)
|
|
||||||
if target_fileitem:
|
|
||||||
# 上传文件
|
|
||||||
new_item = target_oper.upload(target_fileitem, filepath, target_file.name)
|
|
||||||
if new_item:
|
|
||||||
# 删除源文件
|
|
||||||
source_oper.delete(fileitem)
|
|
||||||
return new_item, ""
|
|
||||||
else:
|
|
||||||
return None, f"{fileitem.path} 上传 {target_storage} 失败"
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
|
||||||
elif fileitem.storage != "local" and target_storage == "local":
|
|
||||||
# 网盘到本地
|
|
||||||
if target_file.exists():
|
|
||||||
logger.warn(f"文件已存在:{target_file}")
|
|
||||||
return __get_targetitem(target_file), ""
|
|
||||||
# 网盘到本地
|
|
||||||
if transfer_type in ["copy", "move"]:
|
|
||||||
# 下载
|
|
||||||
tmp_file = source_oper.download(fileitem=fileitem, path=target_file.parent)
|
|
||||||
if tmp_file:
|
|
||||||
# 创建目录
|
|
||||||
if not target_file.parent.exists():
|
|
||||||
target_file.parent.mkdir(parents=True)
|
|
||||||
# 将tmp_file移动后target_file
|
|
||||||
SystemUtils.move(tmp_file, target_file)
|
|
||||||
if transfer_type == "move":
|
|
||||||
# 删除源文件
|
|
||||||
source_oper.delete(fileitem)
|
|
||||||
return __get_targetitem(target_file), ""
|
|
||||||
else:
|
|
||||||
return None, f"{fileitem.path} {fileitem.storage} 下载失败"
|
|
||||||
elif fileitem.storage == target_storage:
|
|
||||||
# 同一网盘
|
|
||||||
if not source_oper.is_support_transtype(transfer_type):
|
|
||||||
return None, f"存储 {fileitem.storage} 不支持 {transfer_type} 整理方式"
|
|
||||||
|
|
||||||
if transfer_type == "copy":
|
if transfer_type == "copy":
|
||||||
# 复制文件到新目录
|
# 复制文件到新目录
|
||||||
target_fileitem = target_oper.get_folder(target_file.parent)
|
target_fileitem = target_oper.get_folder(target_file.parent)
|
||||||
if target_fileitem:
|
if target_fileitem:
|
||||||
if source_oper.copy(fileitem, Path(target_fileitem.path), target_file.name):
|
if source_oper.copy(fileitem, Path(target_fileitem.path), target_file.name):
|
||||||
return target_oper.get_item(target_file), ""
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{fileitem.path} 复制文件失败"
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
|
||||||
elif transfer_type == "move":
|
|
||||||
# 移动文件到新目录
|
|
||||||
target_fileitem = target_oper.get_folder(target_file.parent)
|
|
||||||
if target_fileitem:
|
|
||||||
if source_oper.move(fileitem, Path(target_fileitem.path), target_file.name):
|
|
||||||
return target_oper.get_item(target_file), ""
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{fileitem.path} 移动文件失败"
|
|
||||||
else:
|
|
||||||
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
|
||||||
elif transfer_type == "link":
|
|
||||||
if source_oper.link(fileitem, target_file):
|
|
||||||
return target_oper.get_item(target_file), ""
|
return target_oper.get_item(target_file), ""
|
||||||
else:
|
else:
|
||||||
return None, f"【{target_storage}】{fileitem.path} 创建硬链接失败"
|
return None, f"【{target_storage}】{fileitem.path} 复制文件失败"
|
||||||
else:
|
else:
|
||||||
return None, f"不支持的整理方式:{transfer_type}"
|
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
||||||
|
elif transfer_type == "move":
|
||||||
|
# 移动文件到新目录
|
||||||
|
target_fileitem = target_oper.get_folder(target_file.parent)
|
||||||
|
if target_fileitem:
|
||||||
|
if source_oper.move(fileitem, Path(target_fileitem.path), target_file.name):
|
||||||
|
return target_oper.get_item(target_file), ""
|
||||||
|
else:
|
||||||
|
return None, f"【{target_storage}】{fileitem.path} 移动文件失败"
|
||||||
|
else:
|
||||||
|
return None, f"【{target_storage}】{target_file.parent} 目录获取失败"
|
||||||
|
elif transfer_type == "link":
|
||||||
|
if source_oper.link(fileitem, target_file):
|
||||||
|
return target_oper.get_item(target_file), ""
|
||||||
|
else:
|
||||||
|
return None, f"【{target_storage}】{fileitem.path} 创建硬链接失败"
|
||||||
|
else:
|
||||||
|
return None, f"不支持的整理方式:{transfer_type}"
|
||||||
|
|
||||||
return None, "未知错误"
|
return None, "未知错误"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user