feat(event): send events for resource download based on source

This commit is contained in:
InfinityPacer
2024-12-06 02:08:36 +08:00
parent 4c511eaea6
commit c030166cf5
4 changed files with 37 additions and 9 deletions

View File

@@ -51,7 +51,7 @@ def download(
torrent_info=torrentinfo torrent_info=torrentinfo
) )
did = DownloadChain().download_single(context=context, username=current_user.name, did = DownloadChain().download_single(context=context, username=current_user.name,
downloader=downloader, save_path=save_path) downloader=downloader, save_path=save_path, source="Manual")
if not did: if not did:
return schemas.Response(success=False, message="任务添加失败") return schemas.Response(success=False, message="任务添加失败")
return schemas.Response(success=True, data={ return schemas.Response(success=True, data={
@@ -84,7 +84,7 @@ def add(
torrent_info=torrentinfo torrent_info=torrentinfo
) )
did = DownloadChain().download_single(context=context, username=current_user.name, did = DownloadChain().download_single(context=context, username=current_user.name,
downloader=downloader, save_path=save_path) downloader=downloader, save_path=save_path, source="Manual")
if not did: if not did:
return schemas.Response(success=False, message="任务添加失败") return schemas.Response(success=False, message="任务添加失败")
return schemas.Response(success=True, data={ return schemas.Response(success=True, data={

View File

@@ -20,7 +20,7 @@ from app.helper.message import MessageHelper
from app.helper.torrent import TorrentHelper from app.helper.torrent import TorrentHelper
from app.log import logger from app.log import logger
from app.schemas import ExistMediaInfo, NotExistMediaInfo, DownloadingTorrent, Notification from app.schemas import ExistMediaInfo, NotExistMediaInfo, DownloadingTorrent, Notification
from app.schemas.event import ResourceSelectionEventData from app.schemas.event import ResourceSelectionEventData, ResourceDownloadEventData
from app.schemas.types import MediaType, TorrentStatus, EventType, MessageChannel, NotificationType, ChainEventType from app.schemas.types import MediaType, TorrentStatus, EventType, MessageChannel, NotificationType, ChainEventType
from app.utils.http import RequestUtils from app.utils.http import RequestUtils
from app.utils.string import StringUtils from app.utils.string import StringUtils
@@ -192,7 +192,7 @@ class DownloadChain(ChainBase):
logger.error(f"下载种子文件失败:{torrent.title} - {torrent_url}") logger.error(f"下载种子文件失败:{torrent.title} - {torrent_url}")
self.post_message(Notification( self.post_message(Notification(
channel=channel, channel=channel,
source=source, source=source if channel else None,
mtype=NotificationType.Manual, mtype=NotificationType.Manual,
title=f"{torrent.title} 种子下载失败!", title=f"{torrent.title} 种子下载失败!",
text=f"错误信息:{error_msg}\n站点:{torrent.site_name}", text=f"错误信息:{error_msg}\n站点:{torrent.site_name}",
@@ -204,7 +204,8 @@ class DownloadChain(ChainBase):
def download_single(self, context: Context, torrent_file: Path = None, def download_single(self, context: Context, torrent_file: Path = None,
episodes: Set[int] = None, episodes: Set[int] = None,
channel: MessageChannel = None, source: str = None, channel: MessageChannel = None,
source: str = None,
downloader: str = None, downloader: str = None,
save_path: str = None, save_path: str = None,
userid: Union[str, int] = None, userid: Union[str, int] = None,
@@ -216,13 +217,36 @@ class DownloadChain(ChainBase):
:param torrent_file: 种子文件路径 :param torrent_file: 种子文件路径
:param episodes: 需要下载的集数 :param episodes: 需要下载的集数
:param channel: 通知渠道 :param channel: 通知渠道
:param source: 通知来源 :param source: 来源消息通知、Subscribe、Manual等
:param downloader: 下载器 :param downloader: 下载器
:param save_path: 保存路径 :param save_path: 保存路径
:param userid: 用户ID :param userid: 用户ID
:param username: 调用下载的用户名/插件名 :param username: 调用下载的用户名/插件名
:param media_category: 自定义媒体类别 :param media_category: 自定义媒体类别
""" """
# 发送资源下载事件,允许外部拦截下载
event_data = ResourceDownloadEventData(
context=context,
episodes=episodes,
channel=channel,
source=source,
downloader=downloader,
save_path=save_path,
userid=userid,
username=username,
media_category=media_category
)
# 触发资源下载事件
event = eventmanager.send_event(ChainEventType.ResourceDownload, event_data)
if event and event.event_data:
event_data: ResourceDownloadEventData = event.event_data
# 如果事件被取消,跳过资源下载
if event_data.cancel:
logger.debug(
f"Resource download canceled by event: {event_data.source},"
f"Reason: {event_data.reason}")
return None
_torrent = context.torrent_info _torrent = context.torrent_info
_media = context.media_info _media = context.media_info
_meta = context.meta_info _meta = context.meta_info
@@ -366,7 +390,7 @@ class DownloadChain(ChainBase):
# 只发送给对应渠道和用户 # 只发送给对应渠道和用户
self.post_message(Notification( self.post_message(Notification(
channel=channel, channel=channel,
source=source, source=source if channel else None,
mtype=NotificationType.Manual, mtype=NotificationType.Manual,
title="添加下载任务失败:%s %s" title="添加下载任务失败:%s %s"
% (_media.title_year, _meta.season_episode), % (_media.title_year, _meta.season_episode),
@@ -394,7 +418,7 @@ class DownloadChain(ChainBase):
:param no_exists: 缺失的剧集信息 :param no_exists: 缺失的剧集信息
:param save_path: 保存路径 :param save_path: 保存路径
:param channel: 通知渠道 :param channel: 通知渠道
:param source: 通知来源 :param source: 来源(消息通知、订阅、手工下载等)
:param userid: 用户ID :param userid: 用户ID
:param username: 调用下载的用户名/插件名 :param username: 调用下载的用户名/插件名
:param media_category: 自定义媒体类别 :param media_category: 自定义媒体类别

View File

@@ -111,6 +111,8 @@ class MessageChain(ChainBase):
info = self.message_parser(source=source, body=body, form=form, args=args) info = self.message_parser(source=source, body=body, form=form, args=args)
if not info: if not info:
return return
# 更新消息来源
source = info.source
# 渠道 # 渠道
channel = info.channel channel = info.channel
# 用户ID # 用户ID

View File

@@ -399,6 +399,7 @@ class SubscribeChain(ChainBase, metaclass=Singleton):
save_path=subscribe.save_path, save_path=subscribe.save_path,
media_category=subscribe.media_category, media_category=subscribe.media_category,
downloader=subscribe.downloader, downloader=subscribe.downloader,
source="Subscribe"
) )
# 判断是否应完成订阅 # 判断是否应完成订阅
@@ -789,7 +790,8 @@ class SubscribeChain(ChainBase, metaclass=Singleton):
username=subscribe.username, username=subscribe.username,
save_path=subscribe.save_path, save_path=subscribe.save_path,
media_category=subscribe.media_category, media_category=subscribe.media_category,
downloader=subscribe.downloader) downloader=subscribe.downloader,
source="Subscribe")
# 判断是否要完成订阅 # 判断是否要完成订阅
self.finish_subscribe_or_not(subscribe=subscribe, meta=meta, mediainfo=mediainfo, self.finish_subscribe_or_not(subscribe=subscribe, meta=meta, mediainfo=mediainfo,
downloads=downloads, lefts=lefts) downloads=downloads, lefts=lefts)