Transcriber: video accept, delete buttons, live status spinner; Files: delete button

This commit is contained in:
2026-09-03 20:49:52 +10:00
parent f46975ae32
commit 6ccba43b37
3 changed files with 98 additions and 15 deletions

View File

@@ -38,7 +38,7 @@ from .database import (
get_user_by_username,
init_db,
)
from .tasks import ensure_user_bucket, transcribe_audio, transcribe_sheetmusic
from .tasks import celery_app, ensure_user_bucket, transcribe_audio, transcribe_sheetmusic
from .s3 import list_prefix, list_recent, s3_bucket_name, s3_client
from .tools import section_color, section_label, tools_for_user
@@ -559,11 +559,12 @@ async def transcriber_transcribe(
if user is None:
return RedirectResponse("/login", status_code=303)
bucket = s3_bucket_name(user.username)
task_id = ""
try:
transcribe_audio.delay(bucket, key, user.username)
task_id = transcribe_audio.delay(bucket, key, user.username).id
except Exception:
logger.warning("could not enqueue transcription (broker down?)", exc_info=True)
return RedirectResponse("/transcriber?status=started", status_code=303)
return RedirectResponse(f"/transcriber?status=started&task={task_id}", status_code=303)
@app.post("/transcriber/upload")
@@ -582,11 +583,46 @@ async def transcriber_upload(
await run_in_threadpool(
lambda: s3_client().put_object(Bucket=bucket, Key=key, Body=content)
)
task_id = ""
try:
transcribe_audio.delay(bucket, key, user.username)
task_id = transcribe_audio.delay(bucket, key, user.username).id
except Exception:
logger.warning("could not enqueue transcription after upload", exc_info=True)
return RedirectResponse("/transcriber?status=started", status_code=303)
return RedirectResponse(f"/transcriber?status=started&task={task_id}", status_code=303)
@app.get("/api/transcriber/status")
async def transcriber_status(task: str):
from celery.result import AsyncResult
r = AsyncResult(task, app=celery_app)
return {"state": r.state, "result": r.result if r.state == "SUCCESS" else None}
@app.post("/transcriber/delete")
async def transcriber_delete(request: Request, key: Annotated[str, Form()]) -> HTMLResponse:
user = await _current_user(request)
if user is None:
return RedirectResponse("/login", status_code=303)
bucket = s3_bucket_name(user.username)
try:
await run_in_threadpool(lambda: s3_client().delete_object(Bucket=bucket, Key=key))
except Exception:
logger.warning("transcriber delete failed", exc_info=True)
return RedirectResponse("/transcriber", status_code=303)
@app.post("/files/delete")
async def files_delete(request: Request, name: Annotated[str, Form()]) -> HTMLResponse:
user = await _current_user(request)
if user is None:
return RedirectResponse("/login", status_code=303)
p = _resolve_shared(user.username, name)
if p is not None:
try:
p.unlink()
except Exception:
logger.warning("files delete failed", exc_info=True)
return RedirectResponse("/files", status_code=303)
@app.get("/transcriber/download")
@@ -618,11 +654,12 @@ async def transcriber_sheetmusic(
if user is None:
return RedirectResponse("/login", status_code=303)
bucket = s3_bucket_name(user.username)
task_id = ""
try:
transcribe_sheetmusic.delay(bucket, key, user.username)
task_id = transcribe_sheetmusic.delay(bucket, key, user.username).id
except Exception:
logger.warning("could not enqueue sheet-music transcription", exc_info=True)
return RedirectResponse("/transcriber?status=started-mus", status_code=303)
return RedirectResponse(f"/transcriber?status=started-mus&task={task_id}", status_code=303)
@app.get("/api/status")