diff --git a/app/chain/download.py b/app/chain/download.py index 553e0cde5..288b3f290 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -1779,6 +1779,7 @@ class DownloadChain(ChainBase): "episode": history.episodes, "image": history.image, } + torrent.site_name = history.torrent_site # 下载用户 torrent.userid = history.userid torrent.username = history.username diff --git a/app/schemas/transfer.py b/app/schemas/transfer.py index fc852cf84..b27cb83fe 100644 --- a/app/schemas/transfer.py +++ b/app/schemas/transfer.py @@ -17,6 +17,7 @@ class DownloaderTorrent(BaseModel): downloader: Optional[str] = None hash: Optional[str] = None title: Optional[str] = None + site_name: Optional[str] = None name: Optional[str] = None year: Optional[str] = None season_episode: Optional[str] = None diff --git a/docs/mcp-api.md b/docs/mcp-api.md index dad58e858..104459706 100644 --- a/docs/mcp-api.md +++ b/docs/mcp-api.md @@ -170,7 +170,7 @@ AniList 榜单、探索、详情、人物和推荐接口优先通过 `anilist-ch | 方法 | 路径 | 说明 | | :--- | :--- | :--- | -| GET | `/api/v1/download/` | 查询正在下载的任务,参数:`name` | +| GET | `/api/v1/download/` | 查询正在下载的任务,参数:`name`;关联下载历史时返回媒体类型及来源站点 `site_name` | | POST | `/api/v1/download/` | 添加含媒体信息的下载任务,请求体包含媒体信息和种子信息 | | POST | `/api/v1/download/add` | 添加不含媒体信息的下载任务,请求体包含 `torrent_in`,可选 `media_source` + `media_id`;继续兼容四种专用 ID,并支持 `downloader`、`save_path` | | POST | `/api/v1/download/subtitle` | 下载字幕到识别出的媒体下载目录,请求体包含 `subtitle_in`,可选 `media_source` + `media_id`;继续兼容四种专用 ID,并支持 `save_path` | diff --git a/skills/moviepilot-api/SKILL.md b/skills/moviepilot-api/SKILL.md index 17439c6e3..286e78b24 100644 --- a/skills/moviepilot-api/SKILL.md +++ b/skills/moviepilot-api/SKILL.md @@ -175,7 +175,7 @@ Streaming search sends `{"type":"heartbeat"}` every 15 seconds without business | Method | Path | Description | |--------|------|-------------| -| GET | `/api/v1/download/` | List active downloads. Params: `name` (downloader name) | +| GET | `/api/v1/download/` | List active downloads. Params: `name` (downloader name); linked history adds media type and source `site_name` | | POST | `/api/v1/download/` | Add download (with media info). Body: JSON | | POST | `/api/v1/download/add` | Add download without media info. Body: `torrent_in`, optional `media_source` + `media_id` (all four dedicated IDs remain supported), `downloader`, `save_path` | | POST | `/api/v1/download/subtitle` | Download subtitle file to the recognized media download directory. Body: `subtitle_in`, optional `media_source` + `media_id` (all four dedicated IDs remain supported), `save_path` | diff --git a/tests/test_download_chain.py b/tests/test_download_chain.py index 2aa5568cc..b13f2f618 100644 --- a/tests/test_download_chain.py +++ b/tests/test_download_chain.py @@ -9,7 +9,7 @@ from app.chain.download import DownloadChain from app.core.config import settings from app.core.context import Context, MediaInfo, SubtitleInfo, TorrentInfo from app.core.metainfo import MetaInfo -from app.schemas import FileItem, NotExistMediaInfo, TransferDirectoryConf +from app.schemas import DownloaderTorrent, FileItem, NotExistMediaInfo, TransferDirectoryConf from app.schemas.types import MediaType @@ -1036,3 +1036,36 @@ def test_batch_download_keeps_count_check_without_complete_coverage(monkeypatch) assert lefts == {} assert context.confirmed_full_coverage is False chain.download_single.assert_called_once() + + +def test_downloading_includes_media_type_and_source_site(monkeypatch): + """ + 正在下载任务应从下载历史回填媒体类型和来源站点。 + """ + torrent = DownloaderTorrent(hash="download-hash", title="Demo.Release") + history = SimpleNamespace( + episodes="E02", + image="https://images.example.com/demo.jpg", + seasons="S01", + title="示例剧集", + tmdbid=1001, + torrent_site="示例站点", + type="电视剧", + userid="user-1", + username="tester", + ) + chain = DownloadChain.__new__(DownloadChain) + monkeypatch.setattr(chain, "list_torrents", lambda **_kwargs: [torrent]) + monkeypatch.setattr( + download_module, + "DownloadHistoryOper", + lambda: SimpleNamespace(get_by_hashes=lambda _hashes: {torrent.hash: history}), + ) + + result = chain.downloading(name="qb-main") + + assert result == [torrent] + assert torrent.media["type"] == "电视剧" + assert torrent.site_name == "示例站点" + assert torrent.userid == "user-1" + assert torrent.username == "tester"