Skip to content

EncodeForge - v0.5.0

Latest

Choose a tag to compare

@SirStig SirStig released this 23 Jul 04:45

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 layerConversionHandler, 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, with encodeforge, encodeforge-cli, encodeforge-gui entry points.
  • Auto & All Providers modesAuto 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 obsolete pathlib backport, and PyQt-Fluent-Widgets (which pulled in a second Qt binding). Build-only tooling moved to requirements-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 exitsettings.json is 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 (gerGE instead of DE); 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 incorrectlyShow.1920x1080.mkv no longer parses as season 1920/episode 1080; Blade.Runner.2049.2017.mkv no 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 ffprobe path 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 where wmic is missing, and an unsafe eval()-based FPS parser replaced with fractions.Fraction.

Changed

  • Whisper stack — replaced PyTorch-based OpenAI Whisper with faster-whisper (CTranslate2): faster, lower memory, smaller dependency footprint.
  • Packagingpip install . now correctly ships main.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 gui subcommand is fully wired; encode, subtitle, and rename subcommands 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