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)