+2
-2
src/components/admin-data-table.ts
+2
-2
src/components/admin-data-table.ts
······
······
+6
-3
src/components/auth.ts
+6
-3
src/components/auth.ts
+392
src/components/class-view.ts
+392
src/components/class-view.ts
···
···+<p>${this.searchQuery ? "Try a different search term" : "Upload an audio file to get started!"}</p>
+251
src/components/classes-overview.ts
+251
src/components/classes-overview.ts
···
···
+67
-28
src/components/transcript-view-modal.ts
+67
-28
src/components/transcript-view-modal.ts
······························-? html`<vtt-viewer .vttContent=${this.transcript.vtt_content ?? ""} .audioId=${`audio-${this.transcript.id}`}></vtt-viewer>`-: html`<div class="transcript-text">${this.transcript.vtt_content || "No transcript available"}</div>`}
······························+? html`<vtt-viewer .vttContent=${this.transcript.vtt_content ?? ""} .audioId=${`audio-${this.transcript.id}`}></vtt-viewer>`+: html`<div class="transcript-text">${this.transcript.vtt_content || "No transcript available"}</div>`
+208
-80
src/components/transcription.ts
+208
-80
src/components/transcription.ts
······················································-return html`<vtt-viewer .vttContent=${job.vttContent ?? ""} .audioId=${`audio-${job.id}`}></vtt-viewer>`;<div class="upload-area ${this.dragOver ? "drag-over" : ""} ${!this.serviceAvailable ? "disabled" : ""}"···<input type="file" class="file-input" accept="audio/mpeg,audio/wav,audio/m4a,audio/mp4,audio/aac,audio/ogg,audio/webm,audio/flac,.m4a" @change=${this.handleFileSelect} ${!this.serviceAvailable ? "disabled" : ""} />-<div class="progress-fill ${job.status === "processing" ? "indeterminate" : ""}" style="${job.status === "processing" ? "" : `width: ${job.progress}%`}"></div>
······················································<div class="upload-area ${this.dragOver ? "drag-over" : ""} ${!this.serviceAvailable ? "disabled" : ""}"···<input type="file" class="file-input" accept="audio/mpeg,audio/wav,audio/m4a,audio/mp4,audio/aac,audio/ogg,audio/webm,audio/flac,.m4a" @change=${this.handleFileSelect} ${!this.serviceAvailable ? "disabled" : ""} />
+56
-19
src/components/user-modal.ts
+56
-19
src/components/user-modal.ts
························-if (!confirm("Are you sure you want to change this user's password? This will log them out of all devices.")) {······-if (!confirm("Are you sure you want to logout this user from ALL devices? This will terminate all active sessions.")) {······-if (!confirm("Are you sure you want to revoke this passkey? The user will no longer be able to use it to sign in.")) {
························+"Are you sure you want to change this user's password? This will log them out of all devices.",······+"Are you sure you want to logout this user from ALL devices? This will terminate all active sessions.",······+"Are you sure you want to revoke this passkey? The user will no longer be able to use it to sign in.",
+5
-8
src/components/user-settings.ts
+5
-8
src/components/user-settings.ts
············
············
+102
-62
src/components/vtt-viewer.ts
+102
-62
src/components/vtt-viewer.ts
·········-transcriptDiv.querySelectorAll('.current-segment').forEach((el) => { (el as HTMLElement).classList.remove('current-segment'); });·········-const endOffset = si < sentences.length - 1 ? startOffset + sentenceDuration - 0.001 : paraEnd - paraStart;-return html`<span class="segment" data-start="${spanStart}" data-end="${spanEnd}">${sent}</span>${si < sentences.length - 1 ? ' ' : ''}`;···-const paragraphs = Array.from(paragraphGroups.values()).map(group => group.join(' ').replace(/\s+/g, ' ').trim());
··················+return html`<span class="segment" data-start="${spanStart}" data-end="${spanEnd}">${sent}</span>${si < sentences.length - 1 ? " " : ""}`;···
+8
src/db/schema.ts
+8
src/db/schema.ts
···
+39
-19
src/index.ts
+39
-19
src/index.ts
··················-"SELECT id, filename, original_filename, status, progress, created_at FROM transcriptions WHERE user_id = ? ORDER BY created_at DESC",·········-"INSERT INTO transcriptions (id, user_id, filename, original_filename, status) VALUES (?, ?, ?, ?, ?)",
··················+"SELECT id, filename, original_filename, class_name, status, progress, created_at FROM transcriptions WHERE user_id = ? ORDER BY created_at DESC",·········+"INSERT INTO transcriptions (id, user_id, filename, original_filename, class_name, status) VALUES (?, ?, ?, ?, ?, ?)",+"INSERT INTO transcriptions (id, user_id, filename, original_filename, status) VALUES (?, ?, ?, ?, ?)",
+1
-2
src/lib/admin.test.ts
+1
-2
src/lib/admin.test.ts
+6
-6
src/lib/auth.test.ts
+6
-6
src/lib/auth.test.ts
······
······
+9
-13
src/lib/auth.ts
+9
-13
src/lib/auth.ts
···->("SELECT id, email, name, avatar, created_at, role, last_login FROM users ORDER BY created_at DESC")······
···+"SELECT id, email, name, avatar, created_at, role, last_login FROM users ORDER BY created_at DESC",······
+1
-1
src/lib/client-auth.test.ts
+1
-1
src/lib/client-auth.test.ts
+4
-3
src/lib/client-passkey.ts
+4
-3
src/lib/client-passkey.ts
······
······
+16
-9
src/lib/passkey.ts
+16
-9
src/lib/passkey.ts
············
············
+1
-1
src/lib/rate-limit.test.ts
+1
-1
src/lib/rate-limit.test.ts
+3
-4
src/lib/transcript-storage.test.ts
+3
-4
src/lib/transcript-storage.test.ts
······
······
+11
-15
src/lib/transcription.ts
+11
-15
src/lib/transcription.ts
············
············
+7
-7
src/lib/vtt-cleaner.test.ts
+7
-7
src/lib/vtt-cleaner.test.ts
·········
·········
+96
-78
src/lib/vtt-cleaner.ts
+96
-78
src/lib/vtt-cleaner.ts
···-if (segments.length === 0) return { segments: '', paragraphNumber: null, highestParagraphNumber: 0 };·········-console.log(`[VTTCleaner] Processing chunk ${chunkIndex} with ${inputSegments.length} segments${hasTextContext ? ' and previous paragraph text context' : ''}`);-const nextParagraphNumber = previousParagraphNumber ? String(parseInt(previousParagraphNumber, 10) + 1) : '1';Use the format "Paragraph X-Y" where X is the paragraph number and Y is the segment number within that paragraph:···Also go through and rewrite the words to extract the meaning and not necessarily the exact phrasing if it sounds unnatural when written. I want the text to remain lined up with the original though so don't rewrite entire paragraphs but you can remove ums, alrights, and similar. Also remove all contextual tags like [background noise]. Add punctuation if it's missing to make the text readable. If there is no more context to fit a segment then just skip it and move to the next one.-`The following is the last paragraph from the previous chunk and is provided for context only. DO NOT include it in your output - it's already in the transcript:-Now process the following new segments, continuing from the previous paragraph. ${previousParagraphNumber ? `Start your paragraphs with number ${nextParagraphNumber} (unless you're continuing the previous paragraph).` : ''}`Return ONLY the VTT content WITHOUT the "WEBVTT" header and nothing else. No explanations or additional text.`;···-console.warn("[VTTCleaner] LLM configuration incomplete (need LLM_API_KEY, LLM_API_BASE_URL, LLM_MODEL), returning uncleaned VTT");···-console.log(`[VTTCleaner] Split into ${chunks.length} chunks for sequential processing with paragraph context`);-console.log(`[VTTCleaner] Completed chunk ${i}/${chunks.length - 1}${previousParagraphText ? ' (with context)' : ''}`);-const { segments: lastParagraphText, paragraphNumber, highestParagraphNumber } = extractLastParagraphAndHighestNumber(processedChunk);-console.log(`[VTTCleaner] Using paragraph ${paragraphNumber || 'unknown'} as context for next chunk (highest paragraph: ${highestParagraphNumber})`);···`[VTTCleaner] Successfully cleaned ${segments.length} segments in ${chunks.length} sequential chunks with paragraph context`,···
············+`[VTTCleaner] Processing chunk ${chunkIndex} with ${inputSegments.length} segments${hasTextContext ? " and previous paragraph text context" : ""}`,Use the format "Paragraph X-Y" where X is the paragraph number and Y is the segment number within that paragraph:···Also go through and rewrite the words to extract the meaning and not necessarily the exact phrasing if it sounds unnatural when written. I want the text to remain lined up with the original though so don't rewrite entire paragraphs but you can remove ums, alrights, and similar. Also remove all contextual tags like [background noise]. Add punctuation if it's missing to make the text readable. If there is no more context to fit a segment then just skip it and move to the next one.+? `The following is the last paragraph from the previous chunk and is provided for context only. DO NOT include it in your output - it's already in the transcript:+Now process the following new segments, continuing from the previous paragraph. ${previousParagraphNumber ? `Start your paragraphs with number ${nextParagraphNumber} (unless you're continuing the previous paragraph).` : ""}`Return ONLY the VTT content WITHOUT the "WEBVTT" header and nothing else. No explanations or additional text.`;···+"[VTTCleaner] LLM configuration incomplete (need LLM_API_KEY, LLM_API_BASE_URL, LLM_MODEL), returning uncleaned VTT",···+`[VTTCleaner] Split into ${chunks.length} chunks for sequential processing with paragraph context`,+`[VTTCleaner] Completed chunk ${i}/${chunks.length - 1}${previousParagraphText ? " (with context)" : ""}`,+`[VTTCleaner] Using paragraph ${paragraphNumber || "unknown"} as context for next chunk (highest paragraph: ${highestParagraphNumber})`,···`[VTTCleaner] Successfully cleaned ${segments.length} segments in ${chunks.length} sequential chunks with paragraph context`,···
+3
-3
src/pages/admin.html
+3
-3
src/pages/admin.html
·········
·········
+32
src/pages/class.html
+32
src/pages/class.html
···
···+href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='0.9em' font-size='90'>🪻</text></svg>">
+32
src/pages/classes.html
+32
src/pages/classes.html
···
···+href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='0.9em' font-size='90'>🪻</text></svg>">
+1
-1
src/pages/index.html
+1
-1
src/pages/index.html
+1
-1
src/pages/settings.html
+1
-1
src/pages/settings.html
+7
-1
src/pages/transcribe.html
+7
-1
src/pages/transcribe.html
···+<a href="/classes" style="color: var(--paynes-gray); text-decoration: none; font-size: 0.875rem;"><p class="page-subtitle">Upload your audio files and get accurate transcripts powered by Whisper</p>
+20
-20
src/styles/header.css
+20
-20
src/styles/header.css
···
···
+44
-44
src/styles/main.css
+44
-44
src/styles/main.css
······
······