Cross-platform distribution, UI improvements, and performance optimizations
- PyInstaller frozen sidecar: spec file, build script, and ffmpeg path resolver for self-contained distribution without Python prerequisites - Dual-mode sidecar launcher: frozen binary (production) with dev mode fallback - Parallel transcription + diarization pipeline (~30-40% faster) - GPU auto-detection for diarization (CUDA when available) - Async run_pipeline command for real-time progress event delivery - Web Audio API backend for instant playback and seeking - OpenAI-compatible provider replacing LiteLLM client-side routing - Cross-platform RAM detection (Linux/macOS/Windows) - Settings: speaker count hint, token reveal toggles, dark dropdown styling - Loading splash screen, flexbox layout fix for viewport overflow - Gitea Actions CI/CD pipeline (Linux, Windows, macOS ARM) - Updated README and CLAUDE.md documentation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,17 +8,7 @@
|
||||
|
||||
let { visible = false, percent = 0, stage = '', message = '' }: Props = $props();
|
||||
|
||||
// Map internal stage names to user-friendly labels
|
||||
const stageLabels: Record<string, string> = {
|
||||
'pipeline': 'Pipeline',
|
||||
'loading_model': 'Loading Model',
|
||||
'transcribing': 'Transcribing',
|
||||
'loading_diarization': 'Loading Diarization',
|
||||
'diarizing': 'Speaker Detection',
|
||||
'done': 'Complete',
|
||||
};
|
||||
|
||||
// Pipeline steps for the task list
|
||||
// Pipeline steps in order
|
||||
const pipelineSteps = [
|
||||
{ key: 'loading_model', label: 'Load transcription model' },
|
||||
{ key: 'transcribing', label: 'Transcribe audio' },
|
||||
@@ -27,17 +17,47 @@
|
||||
{ key: 'merging', label: 'Merge results' },
|
||||
];
|
||||
|
||||
function getStepStatus(stepKey: string, currentStage: string): 'pending' | 'active' | 'done' {
|
||||
const stepOrder = pipelineSteps.map(s => s.key);
|
||||
const currentIdx = stepOrder.indexOf(currentStage);
|
||||
const stepIdx = stepOrder.indexOf(stepKey);
|
||||
const stepOrder = pipelineSteps.map(s => s.key);
|
||||
|
||||
if (currentStage === 'done') return 'done';
|
||||
if (stepIdx < currentIdx) return 'done';
|
||||
if (stepIdx === currentIdx) return 'active';
|
||||
// Track the highest step index we've reached (never goes backward)
|
||||
let highestStepIdx = $state(-1);
|
||||
|
||||
// Map non-step stages to step indices for progress tracking
|
||||
function stageToStepIdx(s: string): number {
|
||||
const direct = stepOrder.indexOf(s);
|
||||
if (direct >= 0) return direct;
|
||||
// 'pipeline' stage appears before known steps — don't change highwater mark
|
||||
return -1;
|
||||
}
|
||||
|
||||
$effect(() => {
|
||||
if (!visible) {
|
||||
highestStepIdx = -1;
|
||||
return;
|
||||
}
|
||||
const idx = stageToStepIdx(stage);
|
||||
if (idx > highestStepIdx) {
|
||||
highestStepIdx = idx;
|
||||
}
|
||||
});
|
||||
|
||||
function getStepStatus(stepIdx: number): 'pending' | 'active' | 'done' {
|
||||
if (stepIdx < highestStepIdx) return 'done';
|
||||
if (stepIdx === highestStepIdx) return 'active';
|
||||
return 'pending';
|
||||
}
|
||||
|
||||
// User-friendly display of current stage
|
||||
const stageLabels: Record<string, string> = {
|
||||
'pipeline': 'Initializing...',
|
||||
'loading_model': 'Loading Model',
|
||||
'transcribing': 'Transcribing',
|
||||
'loading_diarization': 'Loading Diarization',
|
||||
'diarizing': 'Speaker Detection',
|
||||
'merging': 'Merging Results',
|
||||
'done': 'Complete',
|
||||
};
|
||||
|
||||
let displayStage = $derived(stageLabels[stage] || stage || 'Processing...');
|
||||
</script>
|
||||
|
||||
@@ -50,8 +70,8 @@
|
||||
</div>
|
||||
|
||||
<div class="steps">
|
||||
{#each pipelineSteps as step}
|
||||
{@const status = getStepStatus(step.key, stage)}
|
||||
{#each pipelineSteps as step, idx}
|
||||
{@const status = getStepStatus(idx)}
|
||||
<div class="step" class:step-done={status === 'done'} class:step-active={status === 'active'}>
|
||||
<span class="step-icon">
|
||||
{#if status === 'done'}
|
||||
|
||||
Reference in New Issue
Block a user