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

@@ -972,6 +972,13 @@ async function prioritizeManga(url) {
} }
async function stopManga(url) { async function stopManga(url) {
// Немедленно обновляем UI, не дожидаясь WS-события
if(state.mangas[url]) {
state.mangas[url].status = 'stopped';
state.mangas[url].is_active = false;
renderList();
loadStats();
}
await fetch('/api/mangas/stop?url='+encodeURIComponent(url), {method:'POST'}); await fetch('/api/mangas/stop?url='+encodeURIComponent(url), {method:'POST'});
} }

View File

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

View File

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