This commit is contained in:
2026-05-01 02:02:36 +03:00
parent b4e4a51ae5
commit 9d5d840898
3 changed files with 20 additions and 6 deletions

View File

@@ -154,13 +154,14 @@ async def _queue_worker_loop():
_db = StateDB()
try:
current_status = _db.get_manga(url)
# Если статус уже "queued" — значит нас приоритизировали и поставили обратно
# в очередь; не перетираем на "stopped"
if current_status and current_status["status"] != "queued":
if current_status and current_status["status"] == "queued":
# Нас приоритизировали и поставили обратно в очередь — уведомляем
await ws_manager.broadcast({"type": "manga_queued", "url": url, "format": fmt})
elif current_status and current_status["status"] != "stopped":
# Статус ещё не "stopped" (например отменили не через /stop, а внутренне)
_db.update_manga_status(url, "stopped")
await ws_manager.broadcast({"type": "manga_stopped", "url": url})
else:
await ws_manager.broadcast({"type": "manga_queued", "url": url, "format": fmt})
# Если статус уже "stopped" — API-эндпоинт уже всё сделал, ничего не дублируем
finally:
_db.close()
except Exception as e:
@@ -988,7 +989,11 @@ async def stop_manga(url: str):
task = active_tasks.get(url)
if task and not task.done():
task.cancel()
# Статус обновит воркер после CancelledError
# Сразу обновляем статус и уведомляем клиентов — не ждём пока воркер
# обработает CancelledError (это может занять секунды пока браузер завершит операцию)
db.update_manga_status(url, "stopped")
await ws_manager.broadcast({"type": "manga_stopped", "url": url})
await _broadcast_queue_positions()
else:
# Манга в очереди (ещё не начата) — просто помечаем как stopped
db.update_manga_status(url, "stopped")

View File

@@ -313,6 +313,8 @@ async def download_manga(
await ctx.close()
except asyncio.CancelledError:
# Прокидываем выше — обработка статуса уже сделана API-эндпоинтом
# (или воркером в _queue_worker_loop).
raise
except Exception as e:
logger.error("Manga worker error {}: {}", url, e)