All notable changes to this project will be documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
subforge.guimodule: PyQt6 desktop frontend.- Drag-and-drop drop zone (also clickable → file dialog).
- Mode combo (auto / transcribe / translate / mux / all), language inputs, whisper model combo, burn-in & bilingual toggles.
- Background
QThreadworker — UI stays responsive; pipeline progress events come back as Qt signals. QSystemTrayIconnotification on completion.- Styles use
palette(...)roles so dark / light themes follow the OS.
- CLI:
--guiflag, andsubforgewith no args now launches the GUI.
- TUI / GUI both reuse the same
subforge.pipeline+subforge.progressplumbing introduced in v0.3.0; only the sink differs.
subforge.progressmodule: thread-safe log/progress sink swappable viause_sink()context manager. The defaultStderrSinkkeeps existing CLI behaviour; frontends provide their ownCallableSink.subforge.tuimodule: Textual TUI launched withsubforge --tui. File path input, mode radio (auto/transcribe/translate/mux/all), source/target language inputs, Whisper model field, burn-in & bilingual checkboxes, run / quit buttons, live log panel, progress bar bound to the same events the CLI prints.--tuiCLI flag.
transcribe,translate,video,pipelinenow route their output throughsubforge.progressinstead of writing to stderr directly. The CLI sees no difference; the TUI captures the same stream.- Whisper transcription advances progress by segment end-time, with the total set to the audio duration reported by faster-whisper.
subforge.videomodule:extract_audio,mux_soft,burn_in— thin subprocess wrappers aroundffmpegwith controlled filter-graph escaping.subforge.pipelinemodule: composes the transcribe/translate/mux steps; newrun_allchains video → audio → SRT → translated SRT → muxed video.- CLI modes
muxandall; new flags--burn,--keep-audio,--keep-subs,--subs. - Default output naming:
movie.{tgt}.{ext}for video; burn-in falls back to.mp4when the source container is not mp4/mkv.
detect_modenow maps video extensions toall(was: error). Audio and.srtdefaults unchanged.
- Project scaffold:
pyproject.toml(hatchling),src/subforge/package layout,subforgeconsole script. argparseCLI with--mode,--from,--to,--model,-o,--keep-original.- Mode auto-detection from file extension
(
.srt→ translate, audio/video → transcribe). - Transcription via
faster-whisper(default modelbase), per-segment progress to stderr. - Translation via
deep-translator(Google backend), batch with per-line fallback. .gitignorefor Python / editor / media artifacts.