feat(playback): seek audio on transcript click, push position on timeupdate (FR-REC-5)

This commit is contained in:
iamdoubz committed 2026-07-12 09:28:21 -05:00
1 parent 96d02cc220
commit 2389fb05a5
1 file changed
+16
+16
View File
@@ -4,6 +4,7 @@
import { meetings } from "../stores/meetings.svelte";
import { calendar } from "../stores/calendar.svelte";
import { settings } from "../stores/settings.svelte";
import { player } from "../stores/player.svelte";
import {
api,
errorMessage,
@@ -39,10 +40,12 @@
// ---- Recording playback (FR-REC-5) ----
let audioSrc = $state<string | null>(null);
let audioError = $state<string | null>(null);
let audioEl = $state<HTMLAudioElement | null>(null);
$effect(() => {
const m = meetings.selected;
audioSrc = null;
audioError = null;
player.reset();
if (m?.recorded) {
const id = m.id;
api
@@ -56,6 +59,17 @@
}
});
// Seek + play when a transcript segment is clicked (player.seek bumps the
// nonce so re-clicking the same segment still jumps). Reading seekNonce is
// what makes this effect re-run.
$effect(() => {
player.seekNonce;
const ms = player.seekMs;
if (ms == null || !audioEl) return;
audioEl.currentTime = ms / 1000;
void audioEl.play().catch(() => {});
});
// ---- Summary + action items (T5.4/T5.5/T5.6, FR-LLM-2/3/4) ----
let llmStatus = $state<LlmStatus | null>(null);
async function refreshLlmStatus() {
@@ -490,6 +504,8 @@
controls
controlsList="nodownload noplaybackrate"
oncontextmenu={(e) => e.preventDefault()}
bind:this={audioEl}
ontimeupdate={() => audioEl && (player.currentMs = audioEl.currentTime * 1000)}
src={audioSrc}
></audio>
{:else if audioError}