All notable changes to EncodeForge will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Renamer overhaul, smarter provider selection, a cleaner Settings experience, and stability/layout improvements on top of the first PySide6 alpha.
- Auto & All Providers mode — Two new options sit at the top of the provider picker. Auto tries providers in priority order and returns the first good match (fast). All Providers queries every source in parallel and picks the most complete result — best episode title, air date, and overview wins.
- API key test buttons — Each key field in Settings → Accounts now has a Test button. Click it and a live ✓ / ✗ status appears next to the field without leaving the dialog.
- Direct links to API key sign-up pages — Every provider field shows a small “Get free API key →” link that opens the registration page directly in your browser (TMDB, TVDB, OMDb, Trakt, Fanart.tv, AniDB, OpenSubtitles).
- Provider picker only shows what you have set up — Providers that require an API key are hidden from the dropdown until you add that key in Settings. Free providers (TVmaze, AniDB, Kitsu, Jikan) are always available.
- Episode titles from all providers — OMDB and Trakt previously returned a placeholder like “Episode 3” instead of the real title. Both now fetch the actual episode name from their APIs.
- Settings dialog is wider — The window opens at a more comfortable size so input fields aren’t cramped, and form fields now stretch to fill the available space.
- Smaller, less crowded input fields — Text and placeholder font in dropdowns and text boxes is slightly smaller, reducing visual noise across the whole app.
- No more inline API key field on the Renamer tab — Keys are managed once in Settings → Accounts, not duplicated on each tab.
- Multi-file rename order fixed — When renaming several files at once, each file now always gets the metadata that belongs to it. A background-thread ordering bug could previously apply the wrong name to the wrong file.
- Metadata / rename tab — Dropped the extra preview area so the before/after columns get the room. After fetch, each suggested name stays on the correct row.
- Naming patterns — Format / Templates offers ready-made layouts, one-tap building blocks, saved custom templates, and a live sample so the final filenames match what you set.
- Subtitles tab — Searching and applying subtitles now keeps you informed: you see status text while providers are checked, and you get clear messages when nothing turns up or when a step fails (instead of only finding out in the log).
- Download and apply errors — If a subtitle cannot be downloaded or applied (for example access denied or daily limits), the app shows a dialog, a notification, and updates the main status bar so failures are obvious.
- OpenSubtitles sign-in — When OpenSubtitles is in play but you have not added your account in Settings, the app shows a short tip and disables Apply / Batch apply where an account is needed, so you are guided to add your username and password or choose other providers.
- Preview — Picking a search result now shows either a text preview (if the file is already local) or a plain explanation that you still need to use Apply to fetch it.
- TMDB genre crash — Fetching TV show metadata could silently fail due to an internal type error in the genre field. Fixed.
- TVDB API calls updated — The app was using outdated v3-style endpoints. All TVDB lookups now use the correct v4 API paths.
- Year pattern mis-detecting resolutions as movie years — A file named
Show.1920x1080.mkvwas classified as a movie because1920looked like a year. The detection now only matches valid year ranges (1900–2099) and ignores resolution strings. - Encoder: Add Files / Add Folder — Those buttons could error right after clicking them. They work reliably again.
- FFmpeg vs FFprobe — If FFmpeg was installed in a custom folder (for example the one the app downloads for you), video info sometimes still looked for “ffprobe” on the system path and failed. The app now looks for FFprobe next to your FFmpeg executable and remembers both paths when you save setup.
- FFmpeg setup window — Opening FFmpeg setup from the main window no longer runs auto-setup in the background and closes the window on its own. You stay in the dialog until you finish or cancel.
- Starting an encode — Starting encoding could crash because the conversion engine wasn’t fully initialized yet. That path is initialized before encoding runs.
- Subtitles tab layout — The Whisper status line no longer stretches the top section and shoves the file list, results, and preview to the bottom. The main subtitle workspace uses the window height as expected.
- Compare — v0.5.0-alpha-1...v0.5.0-alpha-2
First PySide6 pre-release on GitHub Releases. Installers for macOS (Apple Silicon) and Windows are published; Linux packages (.deb, .rpm, AppImage) are not uploaded yet. The previous v0.4.1 line was JavaFX (deprecated).
Complete rewrite from JavaFX to PySide6. EncodeForge has been rebuilt from the ground up using Python and PySide6 with Fluent Design components. The legacy JavaFX/Java codebase has been retired entirely. The GUI and CLI now share a single core (EncodeForgeCore) with no logic duplication.
- FFmpeg path resolution — All FFmpeg/FFprobe subprocess calls now route through
FFmpegManagerinstead of falling back to bare"ffmpeg"/"ffprobe"strings. On systems where FFmpeg is installed outside ofPATH(e.g. Homebrew-only macOS, custom Windows installs), conversions previously failed silently. They now raise a clear error if FFmpeg is not detected. - FFmpeg detection fallthrough — If
shutil.which()resolves FFmpeg to a broken binary (e.g. a dead Homebrew symlink), detection no longer stops there. It now logs a warning and continues searching common installation paths on all platforms. - FFprobe auto-detection —
get_ffprobe_path()now triggers the full FFmpeg detection routine when called before detection has run, instead of silently returningNone. - Audio normalization with stream copy — Enabling audio normalization (
loudnormfilter) while the audio codec was set tocopycaused a hard FFmpeg error, because filters cannot be applied to a copy stream. The codec is now automatically switched toaacin this case, with a log warning explaining the override. - 10-bit video H.264 hardware fallback — The fallback path that re-encodes 10-bit sources to 8-bit H.264 using hardware encoders (NVENC, AMF, QSV, VideoToolbox) was structurally unreachable — it shared the same conditions as the HEVC block above it, so if HEVC hardware was available it returned early, and if it wasn't, the H.264 block couldn't match either. The fallback now correctly activates only when no HEVC hardware encoder is found.
- Unsafe FPS parsing — Frame rate values from FFprobe were parsed using
eval(), which could crash on malformed input (e.g.0/0raisesZeroDivisionError) and is generally unsafe. Replaced withfractions.Fractionfor safe, stdlib-only parsing. - Partial output file cleanup — When a conversion fails or produces an empty output file, the partial file is now deleted automatically. Previously it was left on disk, blocking re-runs unless
overwrite_existingwas enabled. - Output path deduplication loop — The loop that generates unique output filenames (e.g.
video_1.mp4,video_2.mp4) had no upper bound. Added a 9,999-attempt cap that returns a clear error instead of looping indefinitely. audio_track_selectionnot persisted — The audio track selection (all/first audio only) was read viagetattrwith a default because the field was missing fromConversionSettings. It is now a proper dataclass field and will round-trip correctly through settings serialization.
- AMD GPU detection via rocm-smi — The rocm-smi output parser checked for
'Card series'(lowercases) but the actual output uses'Card Series'(capitalS), causing AMD GPUs to never be detected on ROCm Linux systems. Fixed with a case-insensitive match and corrected column extraction. - GPU detection on Windows 11 —
wmic, used to detect AMD and Intel GPUs, has been removed from some Windows 11 builds. Both_detect_amdand_detect_intelnow fall back toGet-CimInstance Win32_VideoControllervia PowerShell whenwmicis unavailable.
- OpenSubtitles.com — Fixed a circular import crash (
from subtitle_manager import SubtitleProviders) that caused aModuleNotFoundErrorat runtime whenever a search was attempted.OpenSubtitlesManagernow properly extendsBaseSubtitleProviderand callsself.extract_media_metadata()directly. - Addic7ed — Fixed the episode subtitle search navigating to the show overview page (
/show/{id}) instead of the season page (/show/{id}/{season}), which caused the provider to never return episode-specific results. Download method now uses the storeddownload_urldirectly instead of re-searching with a garbled file ID. - SubDL — Expanded language code conversion from 5 languages to the full set of 30+ supported ISO 639-2 codes. Previously, uncommon languages silently fell back to wrong 2-letter prefixes.
subtitle_manager.py— Removed staleself.providerslist referencing non-existent internal names. Replaced 4-language hardcoded language normalization with a complete 2-letter → 3-letter mapping (30+ languages). Removed phantom provider names (Subscene,AnimeSubtitles) from the scoring table.
EncodeForgeCore— New single entry point for all GUI and CLI operations. Lazily initializes handlers on first use via a thread lock, keeping startup fast even with heavy dependencies like Whisper.- Handler layer —
ConversionHandler,FileHandler,SubtitleHandler,RenamingHandlercontain all business logic; no UI code in core. - Provider layer — Abstract-base + concrete-implementation pattern for both metadata (8+ providers) and subtitle (8+ providers) subsystems.
SettingsManager— JSON-backed nested dataclass settings (EncoderSettings,SubtitleSettings,RenamerSettings,UISettings).DownloadManager— Resumable downloads with SHA256 hash verification and progress callbacks.ThemeManager— Glassmorphism CSS theming with dark/light mode support.WorkerPool— QThread-based worker pool with signal/slot progress integration.
- Tabbed
MainWindow— Encoder, Subtitles, Renamer, Processes, and Settings tabs. - Real-time per-file and overall progress bars.
- Drag-and-drop file addition across all tabs.
- Comprehensive log viewer with export support.
FFmpegSetupDialog— Detects, downloads, and configures FFmpeg on first launch.SettingsDialog— Full settings UI with API key management and hardware acceleration toggle.
- Full CLI built with Click, sharing
EncodeForgeCorewith the GUI. - Commands:
encode,subtitle,rename,gui. encodeforge,encodeforge-cli,encodeforge-guientry points viasetup.py.
- TMDB, TVDB, OMDB, Trakt, Fanart.tv, AniDB, Kitsu, Jikan/MAL, TVmaze
MetadataGrabberaggregates providers and returns best match with fallback chain.
- OpenSubtitles.com (API), Addic7ed, SubDL (API), Subf2m, YIFY, Podnapisi, SubDivX, Jimaku (Kitsunekko was removed — see Removed)
WhisperManager— Local AI subtitle generation via faster-whisper (CTranslate2) with GPU device selection (CUDA, ROCm, MPS, CPU).SubtitleManagertries providers in configured order; returns first successful result.
- Nuitka build system (
build_nuitka.py) produces self-contained executables for Windows and Linux. - GitHub Actions CI for automated cross-platform builds.
- Kitsunekko — Removed. The provider was a non-functional placeholder:
search()never made any network requests and instead fabricated fake result objects, logging "prepared N placeholder result(s)". Downloads would fail for every result it produced. The filecore/providers/subtitle/kitsunekko_provider.pyhas been deleted.
- JavaFX / Java codebase — Fully retired. The previous JavaFX implementation is no longer maintained or distributed.
- Maven build system — replaced by Python packaging (
setup.py) and Nuitka. - JAR packaging — replaced by Nuitka-compiled native executables.
- Whisper stack — Replaced OpenAI Whisper with PyTorch by faster-whisper, which uses CTranslate2 for inference: faster transcription, lower memory use, and a lighter dependency footprint than the previous PyTorch-based pipeline.
- Application rebranded from a Java desktop app to a Python/PySide6 desktop app.
- All version references updated to
0.5.0-alpha-1for the PySide6 line. setup.pyclassifiers updated to reflect PySide6/Qt6 environment.
- GitHub Release — v0.5.0-alpha-1
- Direct downloads — macOS Apple Silicon (.zip) · Windows (.exe)
- Compare — v0.4.1...v0.5.0-alpha-1
Note: Final JavaFX release (deprecated). Current binaries are the PySide6 line; see v0.5.0-alpha-2.
- Major UI refresh: reorganized logs, settings views, and modernized tables.
- Swing-based splash screen to surface startup progress and initialization errors before the main window loads.
- Resolved macOS launch hang affecting JavaFX initialization.
- Updated macOS artifact workflow so the packaged JAR carried the 0.4.1 version label.
- Full Changelog: 0.4.0...0.4.1
Note: Final major JavaFX release. Consolidated from development branches v0.3.2 and v0.3.3.
- New FFmpeg flag to normalize audio levels during encoding.
- Configurable via settings; integrated into the encoding workflow.
- Intelligent PyTorch installation: auto-detects NVIDIA CUDA, AMD ROCm, or Apple Silicon and downloads the appropriate PyTorch build.
- Falls back to CPU if no GPU is detected.
- 10–20x speed improvement for Whisper AI subtitle generation on supported hardware.
- Enhanced visual depth — improved dark theme consistency and component minimum sizes.
- Lazy initialization — Whisper manager and core Python modules deferred to first use; faster startup, lower idle memory.
- Resolved Whisper AI setup dialog issues and improved error handling during installation.
- Full Changelog: v0.3.1...v0.4.0
First stable public release of EncodeForge (formerly FFmpeg Batch Transcoder). Built on JavaFX.
- Hardware-accelerated video encoding — NVENC, AMF, Quick Sync, VideoToolbox
- Batch processing with queue management and real-time progress
- AI subtitle generation via OpenAI Whisper
- 9 subtitle provider integrations
- Smart file renaming with 10 metadata providers (TMDB, TVDB, OMDB, Trakt, AniDB, Kitsu, Jikan/MAL, TVmaze, Fanart.tv)
- Custom naming patterns with preview mode
- Dark-themed JavaFX desktop application for Windows, macOS, and Linux