EncodeForge v0.5.0
First stable release of the complete PySide6 rewrite. EncodeForge has been rebuilt from the ground up in Python/PySide6 with Fluent Design, replacing the deprecated JavaFX line (v0.4.1 and earlier). This release consolidates the v0.5.0-alpha-1 and v0.5.0-alpha-2 pre-releases plus a full correctness/safety audit into one stable build — the notes below cover everything that changed since v0.4.1.
Highlights
- Complete rewrite from JavaFX/Java to Python + PySide6 (Fluent Design). The legacy JavaFX codebase, Maven build, and JAR packaging are fully retired.
- GUI and CLI now share a single core (
EncodeForgeCore) — no logic duplication, lazy-initialized so heavy dependencies (Whisper) don't slow startup. - Hardware-accelerated encoding across NVENC, AMF, Quick Sync, and VideoToolbox, with GPU auto-detection.
- Local AI subtitle generation via faster-whisper (CTranslate2) — 10–20x faster than the old PyTorch-based Whisper, with automatic GPU backend selection (CUDA, ROCm, MPS) and CPU fallback.
- 8+ metadata providers (TMDB, TVDB, OMDB, Trakt, Fanart.tv, AniDB, Kitsu, Jikan/MAL, TVmaze) and 8+ subtitle providers (OpenSubtitles, Addic7ed, SubDL, Subf2m, YIFY, Podnapisi, SubDivX, Jimaku).
- New Auto and All Providers modes for metadata lookup, ready-made naming pattern templates with live preview, and a redesigned Settings/Accounts experience with per-key Test buttons.
- A full defect audit before shipping stable: batch rename data-loss protection, atomic/permission-safe settings writes, archive path-traversal validation, redacted exports, and dozens of correctness fixes across encoding, subtitles, and renaming.
Added
EncodeForgeCore— single entry point for all GUI and CLI operations, with thread-safe lazy handler initialization.- Handler layer —
ConversionHandler,FileHandler,SubtitleHandler,RenamingHandler; all business logic lives outside the UI. - Provider layer — abstract-base + concrete-implementation pattern for metadata and subtitle subsystems, with fallback chains.
SettingsManager— JSON-backed nested dataclass settings (EncoderSettings,SubtitleSettings,RenamerSettings,UISettings).DownloadManager— resumable downloads with SHA256 verification.ThemeManager— glassmorphism CSS theming with dark/light mode.FFmpegSetupDialog— detects, downloads, and configures FFmpeg on first launch.- CLI — full Click-based CLI (
encode,subtitle,rename,gui) sharing the same core as the GUI, withencodeforge,encodeforge-cli,encodeforge-guientry points. - Auto & All Providers modes — Auto tries metadata providers in priority order and returns the first good match; All Providers queries every source in parallel and merges the most complete result.
- API key Test buttons — live ✓ / ✗ validation for each provider key in Settings → Accounts, plus direct links to each provider's sign-up page.
- Naming pattern templates — ready-made layouts, one-tap building blocks, saved custom templates, and a live filename preview.
- Manual match picker and support for multi-episode files in the Renamer.
- Library layout settings for the Renamer.
- OSDB hash-based fallback for subtitle/renaming matches when text search comes up empty.
Improved
- Provider picker only shows providers you've actually set up — free ones (TVmaze, AniDB, Kitsu, Jikan) are always available; keyed ones appear once configured.
- Episode titles from OMDB and Trakt now use the real episode name instead of a placeholder like "Episode 3".
- Subtitles tab surfaces status while providers are being checked and gives clear success/failure messaging instead of only logging it.
- OpenSubtitles sign-in guidance — the app now tells you when an account is required and disables Apply/Batch until you've added credentials or switched providers.
- Settings dialog is wider with better-fitting form fields; smaller, less crowded input styling throughout.
- Dependencies trimmed: removed unused
pandas/numpy(~100 MB), the obsoletepathlibbackport, andPyQt-Fluent-Widgets(which pulled in a second Qt binding). Build-only tooling moved torequirements-dev.txt.
Fixed
Data loss & safety
- Batch rename could destroy files — silent-overwrite renames on macOS/Linux could collapse two files onto one destination. Collisions and empty names are now refused.
- Settings loss on upgrade — a single unrecognized key in one settings section could wipe every section, including saved API keys. Sections now load independently.
- Corrupt settings after an unclean exit —
settings.jsonis now written atomically with owner-only permissions. - Exported settings leaked API keys — exports are now redacted by default.
- Archive extraction — FFmpeg archive downloads are validated against zip-slip/tar-slip path traversal before extraction.
- Profile names — sanitized so a name containing
../can no longer read or delete files outside the profiles directory.
Wrong results
- Subtitle language handling — several providers mangled language codes (
ger→GEinstead ofDE); a substring match let an English request return Slovenian or French results. Language handling is now shared and normalized across 30+ languages. - Subtitles for the wrong episode — Addic7ed pulled from the season page instead of the episode page.
- Corrupt subtitle files reported as successful — failed downloads/unpacks are now validated as real subtitle text instead of being written and reported as success.
- Mojibake in Spanish subtitles — SubDivX content was being re-encoded unconditionally, corrupting UTF-8 text.
- Resolutions and years parsed incorrectly —
Show.1920x1080.mkvno longer parses as season 1920/episode 1080;Blade.Runner.2049.2017.mkvno longer uses 2049 as the year. - Release-group anime filenames (e.g.
[SubsPlease] Show - [12].mkv) now match and rename correctly. - English title preference no longer misidentifies titles like "The Night Of" or "Doctor Who" as Japanese.
- Bitmap subtitles (PGS/VobSub) are now copied where the container allows it instead of aborting the encode.
- Video-only files now encode correctly — audio stream mapping is no longer mandatory.
- Progress stuck at 0% for sources without a frame count now falls back to elapsed time.
- Profiles saved but never applied, and
ffprobepath corruption when FFmpeg lived in a custom directory, are both fixed.
Stability
- App hung on exit during an encode — the window closed but the process kept running.
- Stop did not stop — queued files could start anyway, and cancelled rows could still show "Completed."
- Removing a queued row corrupted other rows' progress/completion state.
- Log rotation bug destroyed logs after 5,000 lines, leaving bug reports with nothing useful.
- Batch subtitle failures opened one dialog per file (40 failures = 40 dialogs) — now a single summary.
- GPU detection re-ran external tools on every call and could freeze the UI; results are now cached.
- Whisper on GPU-less machines now falls back to CPU instead of failing, and reports real progress instead of sitting at 10%.
Everything else
- AI subtitle generation, crash recovery of interrupted batches, "Convert to SRT," hardware-accelerated encoder selection (AMF/QSV/VideoToolbox no longer silently produced NVENC args), API key Test buttons, desktop notifications, "Open Output Folder" on Linux/macOS, Sidebar Add Files/Folder on the Subtitles and Metadata tabs, the Subtitles tab provider list actually respecting your selection, and Preview→Apply Rename actually applying fetched metadata.
- TMDB genre crash, TVDB v3→v4 API migration, AMD GPU detection via
rocm-smi, GPU detection fallback to PowerShell on Windows 11 wherewmicis missing, and an unsafeeval()-based FPS parser replaced withfractions.Fraction.
Changed
- Whisper stack — replaced PyTorch-based OpenAI Whisper with faster-whisper (CTranslate2): faster, lower memory, smaller dependency footprint.
- Packaging —
pip install .now correctly shipsmain.py/cli.py, fixing all three console scripts. - CI — test suite now runs on every branch across Linux, macOS, and Windows; the macOS workflow (previously a stale JavaFX/Maven build) now builds the current PySide6 app.
- API keys — bundled OpenSubtitles/SubDL keys can be overridden via
ENCODEFORGE_OPENSUBTITLES_KEY/ENCODEFORGE_SUBDL_KEY; a user-supplied OpenSubtitles key is now actually used; keys are no longer written to debug logs. - OMDb and AniDB are now contacted over HTTPS.
Removed
- Kitsunekko subtitle provider — was a non-functional placeholder that fabricated fake results.
- JavaFX/Java codebase, Maven build, JAR packaging — fully retired in favor of Python packaging and Nuitka.
Known Limitations
- Several subtitle scrapers (Podnapisi, SubDivX, Jimaku) target site layouts that have since changed and may return no results; they fail quietly rather than erroring.
- The CLI's
guisubcommand is fully wired;encode,subtitle, andrenamesubcommands remain in progress. - Theme selection, two-pass encoding, and a few other settings are still displayed but not yet wired up.
Full Changelog
Compare: v0.4.1...v0.5.0