fix: address final review findings (clip reset, codecs, paths, timeline)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -10,7 +10,8 @@
|
||||
import ExportDialog from '$lib/components/ExportDialog.svelte';
|
||||
import { loadPreferences } from '$lib/stores/preferences.svelte';
|
||||
import { getSelectedClipId, removeClip } from '$lib/stores/clips.svelte';
|
||||
import { adjustShuttle } from '$lib/transport/playback';
|
||||
import { adjustShuttle, resetShuttleRate } from '$lib/transport/playback';
|
||||
import { session } from '$lib/stores/videoSession.svelte';
|
||||
import type { TransportKeyAction } from '$lib/transport/playback';
|
||||
|
||||
let showSetupWizard = $state(true);
|
||||
@@ -24,6 +25,13 @@
|
||||
loadPreferences();
|
||||
});
|
||||
|
||||
$effect(() => {
|
||||
if (session.status === 'resolving') {
|
||||
shuttleRate = 1;
|
||||
resetShuttleRate();
|
||||
}
|
||||
});
|
||||
|
||||
function dispatchTransport(action: TransportKeyAction) {
|
||||
transportControls?.handleKeyAction(action);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,9 @@
|
||||
|
||||
$effect(() => {
|
||||
if (session.duration > 0) {
|
||||
timelineState.visibleStart = 0;
|
||||
timelineState.visibleEnd = session.duration;
|
||||
timelineState.zoom = 1;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
extractWaveform,
|
||||
} from '$lib/bindings/mediaAnalysis';
|
||||
import { clearThumbnailCache } from '$lib/timeline/thumbnailRenderer';
|
||||
import { clearAll as clearAllClips } from '$lib/stores/clips.svelte';
|
||||
|
||||
export type SessionStatus = 'idle' | 'resolving' | 'ready' | 'error';
|
||||
export type DownloadStatus = 'idle' | 'downloading' | 'complete' | 'failed';
|
||||
@@ -32,6 +33,7 @@ export const session = $state({
|
||||
});
|
||||
|
||||
export function setMetadata(meta: VideoMetadata) {
|
||||
clearAllClips();
|
||||
session.url = meta.url;
|
||||
session.title = meta.title;
|
||||
session.duration = meta.duration;
|
||||
@@ -73,6 +75,7 @@ export function setError(msg: string) {
|
||||
}
|
||||
|
||||
export function setResolving() {
|
||||
clearAllClips();
|
||||
clearMediaFields();
|
||||
session.status = 'resolving';
|
||||
session.error = null;
|
||||
|
||||
@@ -17,6 +17,13 @@ export function computeZoom(
|
||||
duration: number
|
||||
): { visibleStart: number; visibleEnd: number; zoom: number } {
|
||||
const currentRange = state.visibleEnd - state.visibleStart;
|
||||
if (currentRange <= 0) {
|
||||
return {
|
||||
visibleStart: state.visibleStart,
|
||||
visibleEnd: state.visibleEnd,
|
||||
zoom: state.zoom,
|
||||
};
|
||||
}
|
||||
const newRange = currentRange / factor;
|
||||
const clampedRange = Math.max(MIN_VISIBLE_RANGE, Math.min(newRange, duration));
|
||||
|
||||
|
||||
@@ -44,6 +44,13 @@ export function jumpKeyframe(direction: 1 | -1) {
|
||||
}
|
||||
}
|
||||
|
||||
export function resetShuttleRate() {
|
||||
const videoEl = document.querySelector('video');
|
||||
if (videoEl) {
|
||||
videoEl.playbackRate = 1;
|
||||
}
|
||||
}
|
||||
|
||||
export function adjustShuttle(dir: 1 | -1, shuttleRate: number): number {
|
||||
const videoEl = document.querySelector('video');
|
||||
if (!videoEl) return shuttleRate;
|
||||
|
||||
Reference in New Issue
Block a user