fix(subscription): preserve batch search execution (#6419)

This commit is contained in:
InfinityPacer
2026-08-23 19:35:54 +08:00
committed by GitHub
parent af338a0a5d
commit 45b41a5caa
5 changed files with 150 additions and 15 deletions
+30 -7
View File
@@ -95,20 +95,43 @@ def get_delete_subscriptions_by_identity_command(
)
def _start_subscription_search_batch(
subscribe_ids: tuple[int, ...] | None,
state: str | None,
) -> None:
"""把一个请求的搜索目标作为同一调度任务提交。"""
if subscribe_ids is None:
start_scheduler_job(
"subscribe_search",
sid=None,
state=state,
manual=True,
)
return
start_scheduler_job(
"subscribe_search",
sids=subscribe_ids,
state=None,
manual=True,
)
def get_search_subscriptions_command(
task_registry: TaskRegistry = Depends(get_background_task_registry),
db: AsyncSession = Depends(get_async_session),
runtime: HostRuntime = Depends(get_host_runtime),
) -> SearchSubscriptionsCommand:
"""组装手工订阅搜索用例,并把调度延迟到响应后的后台任务。"""
def schedule_search(subscribe_id: int | None, state: str | None) -> None:
"""按历史参数提交订阅搜索调度任务。"""
def schedule_search(
subscribe_ids: tuple[int, ...] | None,
state: str | None,
) -> None:
"""把当前用户的搜索目标提交为一个顺序后台批次。"""
resolve_background_task_registry(task_registry).create_sync(
start_scheduler_job,
job_id="subscribe_search",
sid=subscribe_id,
state=state,
manual=True,
_start_subscription_search_batch,
subscribe_ids,
state,
owner="api.subscribe.search",
)
return SearchSubscriptionsCommand(
+4 -4
View File
@@ -29,7 +29,7 @@ class SubscribeSearchRepository(Protocol):
...
SubscribeSearchScheduler = Callable[[int | None, str | None], None]
SubscribeSearchScheduler = Callable[[tuple[int, ...] | None, str | None], None]
class SearchSubscriptionsCommand:
@@ -54,7 +54,7 @@ class SearchSubscriptionsCommand:
candidate = await self._repository.get_candidate(subscribe_id)
if not self._can_access(candidate, actor):
return False
self._schedule_search(subscribe_id, None)
self._schedule_search((subscribe_id,), None)
return True
if actor.is_superuser:
@@ -65,8 +65,8 @@ class SearchSubscriptionsCommand:
actor.username,
"R",
)
for current_id in subscribe_ids:
self._schedule_search(current_id, None)
if subscribe_ids:
self._schedule_search(tuple(subscribe_ids), None)
return True
@staticmethod
+20 -1
View File
@@ -1512,6 +1512,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
state: Optional[str] = 'N',
manual: Optional[bool] = False,
progress_callback: Optional[Callable[..., None]] = None,
sids: Optional[tuple[int, ...]] = None,
) -> None:
"""
执行订阅搜索。
@@ -1520,6 +1521,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
"""
return self._execute_search(
sid=sid,
sids=sids,
state=state,
manual=manual,
progress_callback=progress_callback,
@@ -1531,6 +1533,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
state: Optional[str] = 'N',
manual: Optional[bool] = False,
progress_callback: Optional[Callable[..., None]] = None,
sids: Optional[tuple[int, ...]] = None,
) -> None:
"""
订阅搜索
@@ -1538,6 +1541,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
:param state: 订阅状态 N:新建, R:订阅中, P:待定, S:暂停
:param manual: 是否手动搜索
:param progress_callback: 定时服务进度更新回调
:param sids: 订阅ID集合,有值时按给定顺序处理
:return: 更新订阅状态为R或删除订阅
"""
lock_acquired = False
@@ -1550,9 +1554,16 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
if sid:
subscribe = subscribeoper.get(sid)
subscribes = [subscribe] if subscribe else []
elif sids is not None:
subscribes = [
subscribe
for current_id in sids
if (subscribe := subscribeoper.get(current_id)) is not None
]
else:
subscribes = subscribeoper.list(self.get_states_for_search(state))
total_num = len(subscribes)
processed_subscribes = []
if progress_callback:
progress_callback(
value=0,
@@ -1565,6 +1576,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
for index, subscribe in enumerate(subscribes, start=1):
if global_vars.is_system_stopped:
break
processed_subscribes.append(subscribe)
if progress_callback:
progress_callback(
value=(index - 1) / total_num * 100 if total_num else 100,
@@ -1586,7 +1598,7 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
logger.debug(f"订阅标题:{subscribe.name} 新增小于1分钟,暂不搜索...")
continue
# 随机休眠1-5分钟
if not sid and state in ['R', 'P']:
if not sid and sids is None and state in ['R', 'P']:
sleep_time = random.randint(60, 300)
logger.info(f'订阅搜索随机休眠 {sleep_time} 秒 ...')
if progress_callback:
@@ -1757,6 +1769,13 @@ class SubscribeChain(MusicSubscribeMixin, InteractionChainMixin, ChainBase):
if subscribes:
if sid:
self.messagehelper.put(f'{subscribes[0].name} 搜索完成!', title="订阅搜索", role="system")
elif sids is not None:
for subscribe in processed_subscribes:
self.messagehelper.put(
f'{subscribe.name} 搜索完成!',
title="订阅搜索",
role="system",
)
else:
self.messagehelper.put('所有订阅搜索完成!', title="订阅搜索", role="system")
else: