Skip to content

Commit

Permalink
fix #2913
Browse files Browse the repository at this point in the history
  • Loading branch information
jxxghp committed Oct 23, 2024
1 parent c4619ed commit a0ad8fa
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 105 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ jobs:
- name: Generate Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.app_version }}
name: ${{ env.app_version }}
tag_name: v${{ env.app_version }}
name: v${{ env.app_version }}
draft: false
prerelease: false
make_latest: false
Expand Down
12 changes: 4 additions & 8 deletions app/chain/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ def list_torrents(self, status: TorrentStatus = None,
return self.run_module("list_torrents", status=status, hashs=hashs, downloader=downloader)

def transfer(self, fileitem: FileItem, meta: MetaBase, mediainfo: MediaInfo,
transfer_type: str, target_storage: str = None, target_path: Path = None,
transfer_type: str = None, target_storage: str = None, target_path: Path = None,
episodes_info: List[TmdbEpisode] = None,
scrape: bool = None) -> Optional[TransferInfo]:
"""
Expand All @@ -401,17 +401,13 @@ def transfer(self, fileitem: FileItem, meta: MetaBase, mediainfo: MediaInfo,
transfer_type=transfer_type, target_storage=target_storage,
target_path=target_path, episodes_info=episodes_info, scrape=scrape)

def transfer_completed(self, hashs: str, path: Path = None,
downloader: str = None, transfer_type: str = None) -> None:
def transfer_completed(self, hashs: str, downloader: str = None) -> None:
"""
转移完成后的处理
下载器转移完成后的处理
:param hashs: 种子Hash
:param path: 源目录
:param downloader: 下载器
:param transfer_type: 整理方式
"""
return self.run_module("transfer_completed", hashs=hashs, path=path,
downloader=downloader, transfer_type=transfer_type)
return self.run_module("transfer_completed", hashs=hashs, downloader=downloader)

def remove_torrents(self, hashs: Union[str, list], delete_file: bool = True,
downloader: str = None) -> bool:
Expand Down
67 changes: 29 additions & 38 deletions app/chain/transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,16 @@ def process(self) -> bool:
logger.warn(f"文件不存在:{file_path}")
continue
# 检查是否为下载器监控目录中的文件
transfer_dirinfo = None
is_downloader_monitor = False
for dir_info in download_dirs:
if dir_info.monitor_type != "downloader":
continue
if not dir_info.download_path:
continue
if file_path.is_relative_to(Path(dir_info.download_path)):
transfer_dirinfo = dir_info
is_downloader_monitor = True
break
if not transfer_dirinfo:
if not is_downloader_monitor:
logger.debug(f"文件 {file_path} 不在下载器监控目录中,不通过下载器进行整理")
continue
# 查询下载记录识别情况
Expand All @@ -127,7 +127,7 @@ def process(self) -> bool:
mediainfo = None

# 执行整理
self.__do_transfer(
state, errmsg = self.__do_transfer(
fileitem=FileItem(
storage="local",
path=str(file_path),
Expand All @@ -136,15 +136,14 @@ def process(self) -> bool:
size=file_path.stat().st_size,
extension=file_path.suffix.lstrip('.'),
),
target_storage=transfer_dirinfo.library_storage,
mediainfo=mediainfo,
download_hash=torrent.hash,
notify=transfer_dirinfo.notify
download_hash=torrent.hash
)

# 设置下载任务状态
self.transfer_completed(hashs=torrent.hash, path=torrent.path,
transfer_type=transfer_dirinfo.transfer_type)
if state:
self.transfer_completed(hashs=torrent.hash)

# 结束
logger.info("所有下载器中下载完成的文件已整理完成")
return True
Expand All @@ -155,7 +154,7 @@ def __do_transfer(self, fileitem: FileItem,
target_path: Path = None, transfer_type: str = None,
season: int = None, epformat: EpisodeFormat = None,
min_filesize: int = 0, scrape: bool = None,
force: bool = False, notify: bool = True) -> Tuple[bool, str]:
force: bool = False) -> Tuple[bool, str]:
"""
执行一个复杂目录的整理操作
:param fileitem: 文件项
Expand Down Expand Up @@ -193,6 +192,8 @@ def __do_transfer(self, fileitem: FileItem,
fail_num = 0
# 跳过数量
skip_num = 0
# 本次整理方式
current_transfer_type = transfer_type

# 获取待整理路径清单
trans_items = self.__get_trans_fileitems(fileitem)
Expand Down Expand Up @@ -412,6 +413,7 @@ def __do_transfer(self, fileitem: FileItem,
continue

# 汇总信息
current_transfer_type = transferinfo.transfer_type
mkey = (file_mediainfo.tmdb_id, file_meta.begin_season)
if mkey not in medias:
# 新增信息
Expand Down Expand Up @@ -454,7 +456,7 @@ def __do_transfer(self, fileitem: FileItem,
transfer_meta = metas[mkey]
transfer_info = transfers[mkey]
# 发送通知
if notify:
if transfer_info.need_notify:
se_str = None
if media.type == MediaType.TV:
se_str = f"{transfer_meta.season} {StringUtils.format_ep(season_episodes[mkey])}"
Expand All @@ -473,9 +475,21 @@ def __do_transfer(self, fileitem: FileItem,
self.eventmanager.send_event(EventType.TransferComplete, {
'meta': transfer_meta,
'mediainfo': media,
'transferinfo': transfer_info
'transferinfo': transfer_info,
'download_hash': download_hash,
})

# 移动模式处理
if current_transfer_type in ["move"]:
# 下载器hash
if download_hash:
if self.remove_torrents(download_hash):
logger.info(f"移动模式删除种子成功:{download_hash} ")
# 删除残留文件
if fileitem:
logger.warn(f"删除残留文件夹:【{fileitem.storage}{fileitem.path}")
self.storagechain.delete_file(fileitem)

# 结束进度
logger.info(f"{fileitem.path} 整理完成,共 {total_num} 个文件,"
f"失败 {fail_num} 个,跳过 {skip_num} 个")
Expand Down Expand Up @@ -617,21 +631,10 @@ def __re_transfer(self, logid: int, mtype: MediaType = None,

# 强制整理
if history.src_fileitem:
# 解析源文件对象
fileitem = FileItem(**history.src_fileitem)
# 检查目录是否发送通知
transfer_dirinfo = None
for dir_info in self.directoryhelper.get_download_dirs():
if not dir_info.download_path:
continue
if fileitem.path.is_relative_to(Path(dir_info.download_path)):
transfer_dirinfo = dir_info
break
state, errmsg = self.__do_transfer(fileitem=fileitem,
state, errmsg = self.__do_transfer(fileitem=FileItem(**history.src_fileitem),
mediainfo=mediainfo,
download_hash=history.download_hash,
force=True,
notify=transfer_dirinfo.notify if transfer_dirinfo else False)
force=True)
if not state:
return False, errmsg

Expand Down Expand Up @@ -666,16 +669,6 @@ def manual_transfer(self,
:param force: 是否强制整理
"""
logger.info(f"手动整理:{fileitem.path} ...")

# 检查目录是否发送通知
transfer_dirinfo = None
for dir_info in self.directoryhelper.get_download_dirs():
if not dir_info.download_path:
continue
if fileitem.path.is_relative_to(Path(dir_info.download_path)):
transfer_dirinfo = dir_info
break

if tmdbid or doubanid:
# 有输入TMDBID时单个识别
# 识别媒体信息
Expand All @@ -702,7 +695,6 @@ def manual_transfer(self,
min_filesize=min_filesize,
scrape=scrape,
force=force,
notify=transfer_dirinfo.notify if transfer_dirinfo else False
)
if not state:
return False, errmsg
Expand All @@ -720,8 +712,7 @@ def manual_transfer(self,
epformat=epformat,
min_filesize=min_filesize,
scrape=scrape,
force=force,
notify=transfer_dirinfo.notify if transfer_dirinfo else False)
force=force)
return state, errmsg

def send_transfer_message(self, meta: MetaBase, mediainfo: MediaInfo,
Expand Down
32 changes: 22 additions & 10 deletions app/modules/filemanager/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ def storage_usage(self, storage: str) -> Optional[StorageUsage]:
return storage_oper.usage()

def transfer(self, fileitem: FileItem, meta: MetaBase, mediainfo: MediaInfo,
transfer_type: str, target_storage: str = None, target_path: Path = None,
transfer_type: str = None, target_storage: str = None, target_path: Path = None,
episodes_info: List[TmdbEpisode] = None,
scrape: bool = None) -> TransferInfo:
"""
Expand Down Expand Up @@ -329,12 +329,15 @@ def transfer(self, fileitem: FileItem, meta: MetaBase, mediainfo: MediaInfo,
need_rename = dir_info.renaming
# 覆盖模式
overwrite_mode = dir_info.overwrite_mode
# 是否需要通知
need_notify = dir_info.notify
# 拼装媒体库一、二级子目录
target_path = self.__get_dest_dir(mediainfo=mediainfo, target_dir=dir_info)
elif target_path:
# 自定义目标路径
# 自定义目标路径,仅适用于手动整理的场景
need_scrape = scrape or False
need_rename = True
need_notify = False
overwrite_mode = "never"
else:
# 未找到有效的媒体库目录
Expand All @@ -355,7 +358,8 @@ def transfer(self, fileitem: FileItem, meta: MetaBase, mediainfo: MediaInfo,
target_path=target_path,
episodes_info=episodes_info,
need_scrape=need_scrape,
need_rename=need_rename)
need_rename=need_rename,
need_notify=need_notify)

def __get_storage_oper(self, _storage: str, _func: str = None) -> Optional[StorageBase]:
"""
Expand Down Expand Up @@ -811,7 +815,8 @@ def transfer_media(self,
target_path: Path,
episodes_info: List[TmdbEpisode] = None,
need_scrape: bool = False,
need_rename: bool = True
need_rename: bool = True,
need_notify: bool = True,
) -> TransferInfo:
"""
识别并整理一个文件或者一个目录下的所有文件
Expand All @@ -825,6 +830,7 @@ def transfer_media(self,
:param episodes_info: 当前季的全部集信息
:param need_scrape: 是否需要刮削
:param need_rename: 是否需要重命名
:param need_notify: 是否需要通知
:return: TransferInfo、错误信息
"""

Expand Down Expand Up @@ -854,7 +860,8 @@ def transfer_media(self,
return TransferInfo(success=False,
message=errmsg,
fileitem=fileitem,
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)

logger.info(f"文件夹 {fileitem.path} 整理成功")
# 返回整理后的路径
Expand All @@ -875,7 +882,8 @@ def transfer_media(self,
message=f"未识别到文件集数",
fileitem=fileitem,
fail_list=[fileitem.path],
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)

# 文件结束季为空
in_meta.end_season = None
Expand Down Expand Up @@ -938,7 +946,8 @@ def transfer_media(self,
target_item=target_item,
target_diritem=target_diritem,
fail_list=[fileitem.path],
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)
case 'never':
# 存在不覆盖
return TransferInfo(success=False,
Expand All @@ -947,7 +956,8 @@ def transfer_media(self,
target_item=target_item,
target_diritem=target_diritem,
fail_list=[fileitem.path],
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)
case 'latest':
# 仅保留最新版本
logger.info(f"当前整理覆盖模式设置为仅保留最新版本,将覆盖:{new_file}")
Expand All @@ -969,7 +979,8 @@ def transfer_media(self,
message=err_msg,
fileitem=fileitem,
fail_list=[fileitem.path],
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)

logger.info(f"文件 {fileitem.path} 整理成功")
return TransferInfo(success=True,
Expand All @@ -981,7 +992,8 @@ def transfer_media(self,
file_list=[fileitem.path],
file_list_new=[new_item.path],
need_scrape=need_scrape,
transfer_type=transfer_type)
transfer_type=transfer_type,
need_notify=need_notify)

@staticmethod
def __get_naming_dict(meta: MetaBase, mediainfo: MediaInfo, file_ext: str = None,
Expand Down
17 changes: 1 addition & 16 deletions app/modules/qbittorrent/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import shutil
from pathlib import Path
from typing import Set, Tuple, Optional, Union, List

Expand All @@ -14,7 +13,6 @@
from app.schemas import TransferTorrent, DownloadingTorrent
from app.schemas.types import TorrentStatus, ModuleType
from app.utils.string import StringUtils
from app.utils.system import SystemUtils


class QbittorrentModule(_ModuleBase, _DownloaderBase[Qbittorrent]):
Expand Down Expand Up @@ -269,29 +267,16 @@ def list_torrents(self, status: TorrentStatus = None,
return None
return ret_torrents

def transfer_completed(self, hashs: str, path: Path = None,
downloader: str = None, transfer_type: str = None) -> None:
def transfer_completed(self, hashs: str, downloader: str = None) -> None:
"""
转移完成后的处理
:param hashs: 种子Hash
:param path: 源目录
:param downloader: 下载器
:param transfer_type: 整理方式
"""
server: Qbittorrent = self.get_instance(downloader)
if not server:
return None
server.set_torrents_tag(ids=hashs, tags=['已整理'])
# 移动模式删除种子
if transfer_type and transfer_type in ["move"]:
if self.remove_torrents(hashs):
logger.info(f"移动模式删除种子成功:{hashs} ")
# 删除本地残留文件
if path and path.exists():
files = SystemUtils.list_files(path, settings.RMT_MEDIAEXT)
if not files:
logger.warn(f"删除残留文件夹:{path}")
shutil.rmtree(path, ignore_errors=True)

def remove_torrents(self, hashs: Union[str, list], delete_file: bool = True,
downloader: str = None) -> Optional[bool]:
Expand Down
Loading

0 comments on commit a0ad8fa

Please sign in to comment.