diff --git a/frontend/index.html b/frontend/index.html index 1d3677d..1af30a6 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -972,6 +972,13 @@ async function prioritizeManga(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'}); } diff --git a/src/api.py b/src/api.py index 244e7b5..e91146c 100644 --- a/src/api.py +++ b/src/api.py @@ -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") diff --git a/src/worker.py b/src/worker.py index 03daf7a..80f72d1 100644 --- a/src/worker.py +++ b/src/worker.py @@ -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)