diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 2274f56c..44bc8aa1 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -131,6 +131,7 @@ class TransferChain(ChainBase): extension=file_path.suffix.lstrip('.'), ), mediainfo=mediainfo, + downloader=torrent.downloader, download_hash=torrent.hash, src_match=True ) @@ -149,8 +150,8 @@ class TransferChain(ChainBase): target_storage: str = None, target_path: Path = None, transfer_type: str = None, scrape: bool = None, library_type_folder: bool = False, library_category_folder: bool = False, - season: int = None, epformat: EpisodeFormat = None, - min_filesize: int = 0, download_hash: str = None, + season: int = None, epformat: EpisodeFormat = None, min_filesize: int = 0, + downloader: str = None, download_hash: str = None, force: bool = False, src_match: bool = False) -> Tuple[bool, str]: """ 执行一个复杂目录的整理操作 @@ -167,6 +168,7 @@ class TransferChain(ChainBase): :param season: 季 :param epformat: 剧集格式 :param min_filesize: 最小文件大小(MB) + :param downloader: 下载器 :param download_hash: 下载记录hash :param force: 是否强制整理 :param src_match: 是否源目录匹配 @@ -478,6 +480,7 @@ class TransferChain(ChainBase): 'meta': file_meta, 'mediainfo': file_mediainfo, 'transferinfo': transferinfo, + 'downloader': downloader, 'download_hash': download_hash, }) @@ -517,7 +520,7 @@ class TransferChain(ChainBase): if all_success and current_transfer_type in ["move"]: # 下载器hash if download_hash: - if self.remove_torrents(download_hash): + if self.remove_torrents(download_hash, downloader=downloader): logger.info(f"移动模式删除种子成功:{download_hash} ") # 删除残留目录 if fileitem: diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index 46b2c21d..821d63bf 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Set, Tuple, Optional, Union, List +from typing import Set, Tuple, Optional, Union, List, Dict from qbittorrentapi import TorrentFilesList from torrentool.torrent import Torrent @@ -204,66 +204,75 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase[Qbittorrent]): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server: Qbittorrent = self.get_instance(downloader) - if not server: - return None - + if downloader: + server: Qbittorrent = self.get_instance(downloader) + if not server: + return None + servers = {downloader: server} + else: + servers: Dict[str, Qbittorrent] = self.get_instances() ret_torrents = [] if hashs: # 按Hash获取 - torrents, _ = server.get_torrents(ids=hashs, tags=settings.TORRENT_TAG) - for torrent in torrents or []: - content_path = torrent.get("content_path") - if content_path: - torrent_path = Path(content_path) - else: - torrent_path = Path(torrent.get('save_path')) / torrent.get('name') - ret_torrents.append(TransferTorrent( - title=torrent.get('name'), - path=torrent_path, - hash=torrent.get('hash'), - size=torrent.get('total_size'), - tags=torrent.get('tags') - )) + for name, server in servers.items(): + torrents, _ = server.get_torrents(ids=hashs, tags=settings.TORRENT_TAG) + for torrent in torrents or []: + content_path = torrent.get("content_path") + if content_path: + torrent_path = Path(content_path) + else: + torrent_path = Path(torrent.get('save_path')) / torrent.get('name') + ret_torrents.append(TransferTorrent( + downloader=name, + title=torrent.get('name'), + path=torrent_path, + hash=torrent.get('hash'), + size=torrent.get('total_size'), + tags=torrent.get('tags') + )) elif status == TorrentStatus.TRANSFER: # 获取已完成且未整理的 - torrents = server.get_completed_torrents(tags=settings.TORRENT_TAG) - for torrent in torrents or []: - tags = torrent.get("tags") or [] - if "已整理" in tags: - continue - # 内容路径 - content_path = torrent.get("content_path") - if content_path: - torrent_path = Path(content_path) - else: - torrent_path = torrent.get('save_path') / torrent.get('name') - ret_torrents.append(TransferTorrent( - title=torrent.get('name'), - path=torrent_path, - hash=torrent.get('hash'), - tags=torrent.get('tags') - )) + for name, server in servers.items(): + torrents = server.get_completed_torrents(tags=settings.TORRENT_TAG) + for torrent in torrents or []: + tags = torrent.get("tags") or [] + if "已整理" in tags: + continue + # 内容路径 + content_path = torrent.get("content_path") + if content_path: + torrent_path = Path(content_path) + else: + torrent_path = torrent.get('save_path') / torrent.get('name') + ret_torrents.append(TransferTorrent( + downloader=name, + title=torrent.get('name'), + path=torrent_path, + hash=torrent.get('hash'), + tags=torrent.get('tags') + )) elif status == TorrentStatus.DOWNLOADING: # 获取正在下载的任务 - torrents = server.get_downloading_torrents(tags=settings.TORRENT_TAG) - for torrent in torrents or []: - meta = MetaInfo(torrent.get('name')) - ret_torrents.append(DownloadingTorrent( - hash=torrent.get('hash'), - title=torrent.get('name'), - name=meta.name, - year=meta.year, - season_episode=meta.season_episode, - progress=torrent.get('progress') * 100, - size=torrent.get('total_size'), - state="paused" if torrent.get('state') in ("paused", "pausedDL") else "downloading", - dlspeed=StringUtils.str_filesize(torrent.get('dlspeed')), - upspeed=StringUtils.str_filesize(torrent.get('upspeed')), - left_time=StringUtils.str_secends( - (torrent.get('total_size') - torrent.get('completed')) / torrent.get('dlspeed')) if torrent.get( - 'dlspeed') > 0 else '' - )) + for name, server in servers.items(): + torrents = server.get_downloading_torrents(tags=settings.TORRENT_TAG) + for torrent in torrents or []: + meta = MetaInfo(torrent.get('name')) + ret_torrents.append(DownloadingTorrent( + downloader=name, + hash=torrent.get('hash'), + title=torrent.get('name'), + name=meta.name, + year=meta.year, + season_episode=meta.season_episode, + progress=torrent.get('progress') * 100, + size=torrent.get('total_size'), + state="paused" if torrent.get('state') in ("paused", "pausedDL") else "downloading", + dlspeed=StringUtils.str_filesize(torrent.get('dlspeed')), + upspeed=StringUtils.str_filesize(torrent.get('upspeed')), + left_time=StringUtils.str_secends( + (torrent.get('total_size') - torrent.get('completed')) / torrent.get('dlspeed')) if torrent.get( + 'dlspeed') > 0 else '' + )) else: return None return ret_torrents diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index 730b010d..e2d126a7 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Set, Tuple, Optional, Union, List +from typing import Set, Tuple, Optional, Union, List, Dict from torrentool.torrent import Torrent from transmission_rpc import File @@ -196,60 +196,70 @@ class TransmissionModule(_ModuleBase, _DownloaderBase[Transmission]): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server: Transmission = self.get_instance(downloader) - if not server: - return None + if downloader: + server: Transmission = self.get_instance(downloader) + if not server: + return None + servers = {downloader: server} + else: + servers: Dict[str, Transmission] = self.get_instances() ret_torrents = [] if hashs: # 按Hash获取 - torrents, _ = server.get_torrents(ids=hashs, tags=settings.TORRENT_TAG) - for torrent in torrents or []: - ret_torrents.append(TransferTorrent( - title=torrent.name, - path=Path(torrent.download_dir) / torrent.name, - hash=torrent.hashString, - size=torrent.total_size, - tags=",".join(torrent.labels or []) - )) + for name, server in servers.items(): + torrents, _ = server.get_torrents(ids=hashs, tags=settings.TORRENT_TAG) + for torrent in torrents or []: + ret_torrents.append(TransferTorrent( + downloader=name, + title=torrent.name, + path=Path(torrent.download_dir) / torrent.name, + hash=torrent.hashString, + size=torrent.total_size, + tags=",".join(torrent.labels or []) + )) elif status == TorrentStatus.TRANSFER: # 获取已完成且未整理的 - torrents = server.get_completed_torrents(tags=settings.TORRENT_TAG) - for torrent in torrents or []: - # 含"已整理"tag的不处理 - if "已整理" in torrent.labels or []: - continue - # 下载路径 - path = torrent.download_dir - # 无法获取下载路径的不处理 - if not path: - logger.debug(f"未获取到 {torrent.name} 下载保存路径") - continue - ret_torrents.append(TransferTorrent( - title=torrent.name, - path=Path(torrent.download_dir) / torrent.name, - hash=torrent.hashString, - tags=",".join(torrent.labels or []) - )) + for name, server in servers.items(): + torrents = server.get_completed_torrents(tags=settings.TORRENT_TAG) + for torrent in torrents or []: + # 含"已整理"tag的不处理 + if "已整理" in torrent.labels or []: + continue + # 下载路径 + path = torrent.download_dir + # 无法获取下载路径的不处理 + if not path: + logger.debug(f"未获取到 {torrent.name} 下载保存路径") + continue + ret_torrents.append(TransferTorrent( + downloader=name, + title=torrent.name, + path=Path(torrent.download_dir) / torrent.name, + hash=torrent.hashString, + tags=",".join(torrent.labels or []) + )) elif status == TorrentStatus.DOWNLOADING: # 获取正在下载的任务 - torrents = server.get_downloading_torrents(tags=settings.TORRENT_TAG) - for torrent in torrents or []: - meta = MetaInfo(torrent.name) - dlspeed = torrent.rate_download if hasattr(torrent, "rate_download") else torrent.rateDownload - upspeed = torrent.rate_upload if hasattr(torrent, "rate_upload") else torrent.rateUpload - ret_torrents.append(DownloadingTorrent( - hash=torrent.hashString, - title=torrent.name, - name=meta.name, - year=meta.year, - season_episode=meta.season_episode, - progress=torrent.progress, - size=torrent.total_size, - state="paused" if torrent.status == "stopped" else "downloading", - dlspeed=StringUtils.str_filesize(dlspeed), - upspeed=StringUtils.str_filesize(upspeed), - left_time=StringUtils.str_secends(torrent.left_until_done / dlspeed) if dlspeed > 0 else '' - )) + for name, server in servers.items(): + torrents = server.get_downloading_torrents(tags=settings.TORRENT_TAG) + for torrent in torrents or []: + meta = MetaInfo(torrent.name) + dlspeed = torrent.rate_download if hasattr(torrent, "rate_download") else torrent.rateDownload + upspeed = torrent.rate_upload if hasattr(torrent, "rate_upload") else torrent.rateUpload + ret_torrents.append(DownloadingTorrent( + downloader=name, + hash=torrent.hashString, + title=torrent.name, + name=meta.name, + year=meta.year, + season_episode=meta.season_episode, + progress=torrent.progress, + size=torrent.total_size, + state="paused" if torrent.status == "stopped" else "downloading", + dlspeed=StringUtils.str_filesize(dlspeed), + upspeed=StringUtils.str_filesize(upspeed), + left_time=StringUtils.str_secends(torrent.left_until_done / dlspeed) if dlspeed > 0 else '' + )) else: return None return ret_torrents diff --git a/app/schemas/transfer.py b/app/schemas/transfer.py index 15aa819a..db80838a 100644 --- a/app/schemas/transfer.py +++ b/app/schemas/transfer.py @@ -10,6 +10,7 @@ class TransferTorrent(BaseModel): """ 待转移任务信息 """ + downloader: Optional[str] = None title: Optional[str] = None path: Optional[Path] = None hash: Optional[str] = None @@ -22,6 +23,7 @@ class DownloadingTorrent(BaseModel): """ 下载中任务信息 """ + downloader: Optional[str] = None hash: Optional[str] = None title: Optional[str] = None name: Optional[str] = None