mirror of
https://github.com/dbv111m/musicgrabber.git
synced 2026-10-19 01:31:29 -05:00
Telegram bot: working queue refresh + retry buttons
Cancel button dropped (no per-job cancel endpoint in v4.3.1), queue
refresh re-renders live statuses, retry calls /api/jobs/{id}/retry.
Verified live against a native v4.3.1 run: search, queue, job status,
retry semantics; source failures (YouTube 403, Monochrome no-stream)
are VPS IP reputation, not contract.
This commit is contained in:
1 parent
21dd9a7da3
commit
f4ad9220a2
2 files changed
+42
-4
No files matched your search
@@ -511,3 +511,8 @@ docker compose -f docker-compose.yml -f docker-compose.telegram.yml up -d
|
||||
Совместимо с приложением v4.3.1: поиск `/api/search`, загрузка `/api/download`
|
||||
(`convert_audio`), статусы `/api/jobs/*`, статистика `/api/stats`. Проверка
|
||||
дубликатов происходит на сервере (library index), отдельный запрос боту не нужен.
|
||||
|
||||
Кнопки в /queue: «Обновить» перерисовывает статусы, у упавших задач — «повтор»
|
||||
через `/api/jobs/{id}/retry`. Отмены отдельной задачи в API приложения нет —
|
||||
кнопки отмены убраны. Контракт бота сверен с приложением v4.3.1 вживую
|
||||
(поиск, постановка в очередь, статусы, retry).
|
||||
+37
-4
@@ -418,9 +418,7 @@ def build_queue_keyboard(jobs: list):
|
||||
}.get(status, "❓")
|
||||
|
||||
label = f"{status_emoji} {title}"
|
||||
if status in ["queued", "downloading"]:
|
||||
callback = f"cancel_{job_id}"
|
||||
elif status == "failed":
|
||||
if status == "failed":
|
||||
callback = f"retry_{job_id}"
|
||||
else:
|
||||
callback = "noop"
|
||||
@@ -893,6 +891,39 @@ async def callback_noop(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
await update.callback_query.answer()
|
||||
|
||||
|
||||
async def callback_queue_refresh(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""Re-render the queue keyboard with fresh statuses."""
|
||||
query = update.callback_query
|
||||
chat_id = query.message.chat_id
|
||||
jobs = await get_user_jobs(chat_id)
|
||||
text = f"📋 <b>Мои загрузки</b>\n\nВсего: {len(jobs)}"
|
||||
await query.answer()
|
||||
try:
|
||||
await query.edit_message_text(text, parse_mode="HTML", reply_markup=build_queue_keyboard(jobs))
|
||||
except Exception:
|
||||
pass # nothing changed -> Telegram rejects identical edits
|
||||
|
||||
|
||||
async def callback_retry(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""Retry a failed job via the app API, then refresh the queue view."""
|
||||
query = update.callback_query
|
||||
chat_id = query.message.chat_id
|
||||
job_id = query.data.split("_", 1)[1]
|
||||
await query.answer()
|
||||
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=30) as client:
|
||||
response = await client.post(
|
||||
f"{API_BASE_URL}/api/jobs/{job_id}/retry",
|
||||
headers=_api_headers(),
|
||||
)
|
||||
response.raise_for_status()
|
||||
await query.edit_message_text("🔄 Задача поставлена на повтор.", parse_mode="HTML")
|
||||
except Exception as e:
|
||||
logger.error(f"Retry error: {e}")
|
||||
await query.edit_message_text(f"❌ Не удалось повторить: {e}", parse_mode="HTML")
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Bot setup
|
||||
# =============================================================================
|
||||
@@ -932,7 +963,9 @@ def setup_bot():
|
||||
app.add_handler(CallbackQueryHandler(callback_download, pattern="^download_\\d+$"))
|
||||
app.add_handler(CallbackQueryHandler(callback_page, pattern="^page_\\d+$"))
|
||||
app.add_handler(CallbackQueryHandler(callback_search_cancel, pattern="^search_cancel$"))
|
||||
app.add_handler(CallbackQueryHandler(callback_noop, pattern="^set_folder$|^cancel_|^retry_|^queue_refresh$"))
|
||||
app.add_handler(CallbackQueryHandler(callback_queue_refresh, pattern="^queue_refresh$"))
|
||||
app.add_handler(CallbackQueryHandler(callback_retry, pattern="^retry_"))
|
||||
app.add_handler(CallbackQueryHandler(callback_noop, pattern="^set_folder$|^cancel_"))
|
||||
|
||||
return app
|
||||
|
||||
|
||||
Reference in new issue
Block a user