Skip to content

Latest commit

 

History

History
239 lines (154 loc) · 16.6 KB

File metadata and controls

239 lines (154 loc) · 16.6 KB

Changelog

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.


[0.5.0-alpha-2] — 2026-03-28

Renamer overhaul, smarter provider selection, a cleaner Settings experience, and stability/layout improvements on top of the first PySide6 alpha.

Added

  • 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).

Improved

  • 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 patternsFormat / 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.

Fixed

  • 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.mkv was classified as a movie because 1920 looked 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.

Release Links


[0.5.0-alpha-1] — 2026-03-25

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).

Highlights

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.


Fixed

FFmpeg & Conversion Pipeline

  • FFmpeg path resolution — All FFmpeg/FFprobe subprocess calls now route through FFmpegManager instead of falling back to bare "ffmpeg"/"ffprobe" strings. On systems where FFmpeg is installed outside of PATH (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-detectionget_ffprobe_path() now triggers the full FFmpeg detection routine when called before detection has run, instead of silently returning None.
  • Audio normalization with stream copy — Enabling audio normalization (loudnorm filter) while the audio codec was set to copy caused a hard FFmpeg error, because filters cannot be applied to a copy stream. The codec is now automatically switched to aac in 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/0 raises ZeroDivisionError) and is generally unsafe. Replaced with fractions.Fraction for 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_existing was 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_selection not persisted — The audio track selection (all / first audio only) was read via getattr with a default because the field was missing from ConversionSettings. It is now a proper dataclass field and will round-trip correctly through settings serialization.

GPU Detection

  • AMD GPU detection via rocm-smi — The rocm-smi output parser checked for 'Card series' (lowercase s) but the actual output uses 'Card Series' (capital S), 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 11wmic, used to detect AMD and Intel GPUs, has been removed from some Windows 11 builds. Both _detect_amd and _detect_intel now fall back to Get-CimInstance Win32_VideoController via PowerShell when wmic is unavailable.

Subtitle Providers

  • OpenSubtitles.com — Fixed a circular import crash (from subtitle_manager import SubtitleProviders) that caused a ModuleNotFoundError at runtime whenever a search was attempted. OpenSubtitlesManager now properly extends BaseSubtitleProvider and calls self.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 stored download_url directly 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 stale self.providers list 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.

Added

Architecture

  • 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 layerConversionHandler, FileHandler, SubtitleHandler, RenamingHandler contain 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.

GUI (PySide6 + PyQt-Fluent-Widgets)

  • 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.

CLI

  • Full CLI built with Click, sharing EncodeForgeCore with the GUI.
  • Commands: encode, subtitle, rename, gui.
  • encodeforge, encodeforge-cli, encodeforge-gui entry points via setup.py.

Metadata Providers

  • TMDB, TVDB, OMDB, Trakt, Fanart.tv, AniDB, Kitsu, Jikan/MAL, TVmaze
  • MetadataGrabber aggregates providers and returns best match with fallback chain.

Subtitle Providers

  • 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).
  • SubtitleManager tries providers in configured order; returns first successful result.

Build

  • Nuitka build system (build_nuitka.py) produces self-contained executables for Windows and Linux.
  • GitHub Actions CI for automated cross-platform builds.

Removed

Subtitle Providers

  • 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 file core/providers/subtitle/kitsunekko_provider.py has been deleted.

Platform / distribution

  • 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.

Changed

  • 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-1 for the PySide6 line.
  • setup.py classifiers updated to reflect PySide6/Qt6 environment.

Release Links


[0.4.1] — 2025-10-24

Note: Final JavaFX release (deprecated). Current binaries are the PySide6 line; see v0.5.0-alpha-2.

Highlights

  • 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.

Fixes

  • Resolved macOS launch hang affecting JavaFX initialization.

CI/CD

  • Updated macOS artifact workflow so the packaged JAR carried the 0.4.1 version label.

Release Links


[0.4.0] — 2025-10-23

Note: Final major JavaFX release. Consolidated from development branches v0.3.2 and v0.3.3.

Added

Audio Normalization

  • New FFmpeg flag to normalize audio levels during encoding.
  • Configurable via settings; integrated into the encoding workflow.

GPU-Accelerated AI Subtitle Generation

  • 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.

Changed

  • 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.

Fixes

  • Resolved Whisper AI setup dialog issues and improved error handling during installation.

Release Links


[0.3.1] — 2024

Initial Public Release

First stable public release of EncodeForge (formerly FFmpeg Batch Transcoder). Built on JavaFX.

Features

  • 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

GitHub Releases · Report a Bug · Request a Feature