Upload a recording (audio, or video with the camera off), get a private Swedish transcript, and chat about it. - ADR-033: RLS-scoped private transcript store; ffprobe/ffmpeg intake; gateway transcription (iguana kb-whisper, berget fallback); in-process single-replica worker; chat over the transcript (local models only). - ADR-034: optional two-engine mode (pianissimo + kb-whisper) reconciled by a LOCAL model; off unless TAPIR_RECONCILE_BASE_MODEL is set. - ADR-035: real progress (phases, running/quiet/lost), phase logging, every judged spot stored, merged segments. - Hardening from four adversarial reviews: errors logged and stored as kinds never text; per-engine deadlines; converted-length check; bounded queue; client hang-ups are not errors; strict local-alias check. - Dockerfile: static ffmpeg/ffprobe 7.0.2 pinned by sha256 (#34). Built and inspected by hand; CI does not build the image on a PR, so its first CI build is this merge. Uploads stay OFF until TAPIR_UPLOADS_ENABLED is set in the deployment. Closes #33, #34, #42, #43, #44. Co-authored-by: Mathias <mthbqv@gmail.com>
This commit was merged in pull request #39.
This commit is contained in:
@@ -6,6 +6,8 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/a-h/templ"
|
||||
|
||||
"git.d-ma.be/mathias/tapir/internal/adapters/chat"
|
||||
"git.d-ma.be/mathias/tapir/internal/adapters/store"
|
||||
)
|
||||
@@ -43,6 +45,28 @@ type chatView struct {
|
||||
History []chat.Turn
|
||||
Truncated bool
|
||||
Error string
|
||||
// PostURL and Subject let the same chat panel serve an UPLOADED recording
|
||||
// (ADR-033): where the form posts, and what the transcript is called. Empty
|
||||
// means a YouTube video (/v/{VideoID}/chat, "video"), so existing callers are
|
||||
// unchanged.
|
||||
PostURL templ.SafeURL
|
||||
Subject string
|
||||
}
|
||||
|
||||
// postURL is where the chat form posts.
|
||||
func (v chatView) postURL() templ.SafeURL {
|
||||
if v.PostURL != "" {
|
||||
return v.PostURL
|
||||
}
|
||||
return chatURL(v.VideoID)
|
||||
}
|
||||
|
||||
// subject is what the transcript is called in the panel's wording.
|
||||
func (v chatView) subject() string {
|
||||
if v.Subject != "" {
|
||||
return v.Subject
|
||||
}
|
||||
return "video"
|
||||
}
|
||||
|
||||
// handleChat renders the chat page for a summarized video (GET). Entry is scoped
|
||||
|
||||
Reference in New Issue
Block a user