From b989d083858085427038fbe7aa75c3da52a68bae Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Tue, 19 May 2026 13:04:03 +0800 Subject: [PATCH] fix(workflow): use core torrent info for RSS action (#5786) --- app/schemas/context.py | 2 ++ app/workflow/actions/fetch_rss.py | 4 +-- tests/test_workflow_fetch_rss.py | 47 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 tests/test_workflow_fetch_rss.py diff --git a/app/schemas/context.py b/app/schemas/context.py index 5fe04c14f..e4092d0d5 100644 --- a/app/schemas/context.py +++ b/app/schemas/context.py @@ -232,6 +232,8 @@ class TorrentInfo(BaseModel): labels: Optional[list] = Field(default_factory=list) # 种子优先级 pri_order: Optional[int] = 0 + # 种子分类 电影/电视剧 + category: Optional[str] = None # 促销 volume_factor: Optional[str] = None # 剩余免费时间 diff --git a/app/workflow/actions/fetch_rss.py b/app/workflow/actions/fetch_rss.py index bce885976..3fbd5d30e 100644 --- a/app/workflow/actions/fetch_rss.py +++ b/app/workflow/actions/fetch_rss.py @@ -5,11 +5,11 @@ from pydantic import Field from app.workflow.actions import BaseAction from app.chain.media import MediaChain from app.core.config import settings, global_vars -from app.core.context import Context +from app.core.context import Context, TorrentInfo from app.core.metainfo import MetaInfo from app.helper.rss import RssHelper from app.log import logger -from app.schemas import ActionParams, ActionContext, TorrentInfo +from app.schemas import ActionParams, ActionContext class FetchRssParams(ActionParams): diff --git a/tests/test_workflow_fetch_rss.py b/tests/test_workflow_fetch_rss.py new file mode 100644 index 000000000..df5fa948e --- /dev/null +++ b/tests/test_workflow_fetch_rss.py @@ -0,0 +1,47 @@ +import unittest +from datetime import datetime +from unittest.mock import patch + +from app.core.context import TorrentInfo +from app.schemas import ActionContext +from app.workflow.actions.fetch_rss import FetchRssAction + + +class FetchRssActionTest(unittest.TestCase): + """ + RSS 工作流动作测试。 + """ + + def test_execute_builds_core_torrent_info_for_downstream_workflow(self): + """ + 工作流产出的种子信息应使用 core TorrentInfo,避免下载事件下游收到缺少运行时接口的 schema 对象。 + """ + rss_items = [ + { + "title": "Example RSS Torrent", + "enclosure": "https://example.com/example.torrent", + "link": "https://example.com/details", + "size": 1024, + "pubdate": datetime(2026, 5, 19, 8, 30, 0), + } + ] + + with patch("app.workflow.actions.fetch_rss.RssHelper") as rss_helper, \ + patch("app.workflow.actions.fetch_rss.global_vars.is_workflow_stopped", return_value=False): + rss_helper.return_value.parse.return_value = rss_items + + context = FetchRssAction("fetch-rss").execute( + workflow_id=1, + params={"url": "https://example.com/rss.xml"}, + context=ActionContext(), + ) + + torrent_info = context.torrents[0].torrent_info + self.assertIsInstance(torrent_info, TorrentInfo) + self.assertIsNone(torrent_info.category) + self.assertTrue(callable(getattr(torrent_info, "to_dict", None))) + self.assertEqual("2026-05-19 08:30:00", torrent_info.pubdate) + + +if __name__ == "__main__": + unittest.main()