mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 20:17:13 +08:00
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
"""下载任务查询与控制应用服务。"""
|
|
|
|
from typing import Callable, List, Optional
|
|
|
|
from app.schemas.transfer import DownloaderTorrent
|
|
from app.schemas.types import TorrentStatus
|
|
|
|
|
|
class DownloadTaskService:
|
|
"""通过下载器和历史端口查询、启停及删除下载任务。"""
|
|
|
|
def __init__(
|
|
self,
|
|
list_torrents: Callable[..., List[DownloaderTorrent]],
|
|
get_history_by_hashes: Callable[[list[str]], dict],
|
|
start_torrents: Callable[..., bool],
|
|
stop_torrents: Callable[..., bool],
|
|
remove_torrents: Callable[..., bool],
|
|
) -> None:
|
|
"""注入下载器操作和历史读取端口。"""
|
|
self._list_torrents = list_torrents
|
|
self._get_history_by_hashes = get_history_by_hashes
|
|
self._start_torrents = start_torrents
|
|
self._stop_torrents = stop_torrents
|
|
self._remove_torrents = remove_torrents
|
|
|
|
def downloading(self, name: Optional[str] = None) -> List[DownloaderTorrent]:
|
|
"""查询下载中任务,并附加对应下载历史的媒体与用户信息。"""
|
|
torrents = self._list_torrents(
|
|
downloader=name,
|
|
status=TorrentStatus.DOWNLOADING,
|
|
)
|
|
if not torrents:
|
|
return []
|
|
history_map = self._get_history_by_hashes(
|
|
[torrent.hash for torrent in torrents if torrent.hash]
|
|
)
|
|
for torrent in torrents:
|
|
history = history_map.get(torrent.hash)
|
|
if not history:
|
|
continue
|
|
torrent.media = {
|
|
"media_source": history.media_source,
|
|
"media_id": history.media_id,
|
|
"type": history.type,
|
|
"title": history.title,
|
|
"season": history.seasons,
|
|
"episode": history.episodes,
|
|
"image": history.poster,
|
|
"poster": history.poster,
|
|
"backdrop": history.image,
|
|
}
|
|
torrent.site_name = history.torrent_site
|
|
torrent.userid = history.userid
|
|
torrent.username = history.username
|
|
return torrents
|
|
|
|
def set_downloading(
|
|
self,
|
|
hash_str: str,
|
|
operation: str,
|
|
name: Optional[str] = None,
|
|
) -> bool:
|
|
"""按 start/stop 操作控制单个下载任务。"""
|
|
if operation == "start":
|
|
return self._start_torrents(hashs=[hash_str], downloader=name)
|
|
if operation == "stop":
|
|
return self._stop_torrents(hashs=[hash_str], downloader=name)
|
|
return False
|
|
|
|
def remove_downloading(
|
|
self,
|
|
hash_str: str,
|
|
name: Optional[str] = None,
|
|
) -> bool:
|
|
"""删除单个下载任务。"""
|
|
return self._remove_torrents(hashs=[hash_str], downloader=name)
|