Files
MoviePilot/app/workflow/actions/add_subscribe.py
jxxghp 6d4ce83837 fix(types): clear host mypy debt and prevent typing regressions
严格检查全部宿主源码,清零类型错误预算并移除按模块类型豁免。
按原因、所属方法、错误码及语法指纹锁定必要兼容例外和站点类型桩,
CI 阻断新增忽略、检查范围退化、本地桩替代真实接口及新的类型错误。

修复空值、异步和供应方类型边界,保持插件与 API 兼容合同,
并补充存储、订阅、通知、Agent 和工作流边界的回归覆盖。
2026-10-21 22:03:18 +08:00

100 lines
3.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
根据工作流上下文创建媒体订阅。
"""
from app.application.configuration import get_chain_runtime_config_snapshot
from app.chain.subscribe.facade import SubscribeChain
from app.domain.context import MediaInfo
from app.runtime.log import logger
from app.runtime.stop import runtime_stop_state
from app.schemas.subscribe import Subscribe
from app.schemas.workflow import ActionContext, ActionParams
from app.workflow.actions import BaseAction
class AddSubscribeParams(ActionParams):
"""
添加订阅参数
"""
pass
class AddSubscribeAction(BaseAction):
"""
添加订阅
"""
contract = {
"inputs": [{"name": "medias", "label": "媒体", "kind": "list"}],
"outputs": [{"name": "subscribes", "label": "订阅", "kind": "list"}],
}
def __init__(self, action_id: str) -> None:
"""
初始化当前动作的结果集合与失败状态。
"""
super().__init__(action_id)
self._added_subscribes: list[int] = []
self._has_error = False
name = "添加订阅"
description = "根据媒体列表添加订阅"
data = AddSubscribeParams().model_dump()
@property
def success(self) -> bool:
"""
返回动作是否未遇到终止性的处理失败。
"""
return not self._has_error
def execute(self, workflow_id: int, params: dict[str, object], context: ActionContext) -> ActionContext:
"""
将medias中的信息添加订阅,如果订阅不存在的话
"""
_started = False
subscribechain = None
for media in context.medias or []:
if runtime_stop_state.is_workflow_stopped(workflow_id):
break
# 检查缓存
cache_key = f"{media.type}-{media.title}-{media.year}-{media.season}"
if self.check_cache(workflow_id, cache_key):
logger.info(f"{media.title} {media.year} 已添加过订阅,跳过")
continue
mediainfo = MediaInfo()
mediainfo.from_dict(media.model_dump())
subscribechain = SubscribeChain()
if subscribechain.exists(mediainfo):
logger.info(f"{media.title} 已存在订阅")
continue
# 添加订阅
_started = True
sid, message = subscribechain.add(mtype=mediainfo.type,
title=mediainfo.title or "",
year=mediainfo.year or "",
season=mediainfo.season,
media_source=mediainfo.media_source,
media_id=mediainfo.media_id,
username=get_chain_runtime_config_snapshot().superuser)
if sid:
self._added_subscribes.append(sid)
# 保存缓存
self.save_cache(workflow_id, cache_key)
if self._added_subscribes:
logger.info(f"已添加 {len(self._added_subscribes)} 个订阅")
if subscribechain is None:
subscribechain = SubscribeChain()
for sid in self._added_subscribes:
subscribe = subscribechain.subscription_repository.get(sid)
if subscribe:
if context.subscribes is None:
context.subscribes = []
context.subscribes.append(Subscribe.model_validate(subscribe.to_dict()))
elif _started:
self._has_error = True
self.job_done(f"已添加 {len(self._added_subscribes)} 个订阅")
return context