Fixed
- Queue Cancellation Semantics: Canceling a queued conversion now prevents it from starting later in the background. Queue state now tracks canceled IDs, avoids duplicate task IDs, and removes canceled items before worker launch.
- Process Signal Safety: Pause/resume/cancel controls now ignore invalid PID
0placeholders, preventing unsafe Unix signal targeting. ML upscale startup no longer publishes a fake PID, and unexpected encoder shutdowns now return an explicit worker error instead of reporting silent success. - FFmpeg Stream Mapping: Standard conversions now always map streams deterministically (
0:v:0,0:a?,0:s?) when track overrides are not selected, eliminating ambiguous defaults and missing-stream edge cases. - Audio Config Application: Audio codec and bitrate settings are now applied consistently even when no explicit source audio tracks are selected.
- Cross-Tab Config Consistency: Configuration normalization now runs in the shared state layer (including preset application), so container/codec/preset/upscale compatibility is enforced even if the Video tab was never opened.
- Compatibility Rule Unification: Video container/codec/preset compatibility now comes from a shared frontend module used by both UI selection logic and config normalization, preventing drift between tab behavior and saved state validation.
- Input Validation Hardening: Backend validation now rejects incompatible codec/container combinations and blocks ML upscaling with audio-only outputs before task enqueue.
- Subtitle Container Handling: Subtitle stream behavior is now container-aware (
mov_textfor MP4/MOV,webvttfor WebM,copyfor MKV) and no longer auto-maps subtitle tracks when only burn-in subtitles are requested. - Queue Startup Recovery: Conversion queue startup now handles per-file enqueue failures gracefully, marking only failed items as errors while continuing with valid tasks and keeping processing state in sync.
- Timecode Input UX: Trim timecode fields now support pasting valid values (
HH:MM:SS.mmm,MM:SS, or seconds), reducing manual editing friction. - Lint Stability: Added a scoped ESLint override for Shiki-rendered log HTML in
LogsView, resolving thesvelte/no-at-html-tagslint failure for trusted, syntax-highlighted output. - Queue Logic: Resolved an issue where completed files would be re-queued for conversion when restarting the batch. The queue now explicitly ignores files with a "Completed" status.
- Titlebar UX: The "Start Conversion" button is now disabled when all selected files have already been successfully processed, providing better visual feedback and preventing accidental re-runs.
Added
- Hardware Decoding Support: Integrated GPU-accelerated video decoding for input files using NVIDIA CUDA and Apple VideoToolbox. This reduces CPU load and improves conversion speed by offloading the decoding phase to the hardware.
- Log Syntax Highlighting: Integrated Shiki highlighting engine into
LogsViewfor improved readability of FFmpeg output. - Custom Log Language: Developed a comprehensive TextMate grammar for FFmpeg logs, featuring specialized highlighting for codecs, timestamps, file paths, CPU capabilities, and conversion phases (DECODE/ENCODE/UPSCALE).
Changed
- Settings Accessibility: Users can now switch between all configuration tabs (Source, Output, Video, etc.) even after a file has been converted, while maintaining the locked state of individual settings.
- Store Convention Consistency:
updateStorenow uses the same object-based$statepattern as other frontend stores, reducing architectural divergence in shared state management.