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