upd
This commit is contained in:
@@ -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'});
|
||||
}
|
||||
|
||||
|
||||
17
src/api.py
17
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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user