Releases: iTroy0/WebP-Converter
v2.2
WebP → Video Converter v2.2
Major correctness + UX release. Update strongly recommended.
Fixed
- Frame timing: conversions now preserve each frame's real duration (variable frame rate). Previously every file was flattened to a constant FPS — animations with mixed frame delays played too fast/slow. Toggle "Use original frame timing" to switch back to forced FPS.
- Aspect ratio: resolution presets (480p/720p/1080p/4K) fit inside the target box instead of stretching. Combining files with different sizes now letterboxes instead of distorting.
- Needless re-encode resize on "Same Resolution" removed (sharper output).
- Paths containing quotes no longer break ffmpeg; last frame duration no longer dropped.
- MP4 gets
+faststart(instant streaming start); WebM/VP9 encoding is much faster (row-mt,deadline good). - GIF output properly quantized with transparency support and true per-frame timing; combining into GIF now allowed.
- No more orphan ffmpeg processes or corrupt partial files when cancelling or closing mid-conversion.
- Crash fixes: deleted queue files, rapid preview switching, close-during-convert, non-Windows app icon.
- Decode errors now surface in the UI (previously invisible in windowed builds) and the batch continues past bad files.
Added
- Drag & drop files or whole folders into the window
- Real encode progress (live percentage from ffmpeg)
- "Add Folder" button
- Preview: checkerboard behind transparency, true frame timing, frame/duration info, Space to pause
- Clean output filenames:
name.mp4,name (1).mp4— no more random suffixes - In-window stacked toasts; success toast click opens the output folder
Ctrl+Enterto start conversion; window size remembered between sessions- Launcher scripts now find Python reliably and show dependency errors instead of hiding them
Download
- Windows:
WebP.Converter.exebelow — portable, no install needed - Linux/macOS: run from source (
./start.sh), see README
v2.1
What's new
Bug fixes
- Fix thread-safety: snapshot all tkinter vars on main thread before worker dispatch
- Fix video clip resource leak (ffmpeg process not closed on error)
- Fix GIF export leaking file handles
- Fix progress bar inaccuracy in combine mode
- Fix preview compositing ignoring disposal methods
- Clamp custom resolution to 7680px max to prevent memory exhaustion
- Validate and sanitize all values loaded from settings.json
- Move settings file to platform config dir (%APPDATA% / ~/.config)
- Pin dependency versions in requirements.txt
UX improvements
- Cancel button (Escape) that kills ffmpeg instantly mid-encode
- Per-file status indicators in queue (⟳ converting / ✓ done / ✕ error)
- Keyboard shortcuts: Ctrl+O add files, Delete remove, Escape cancel
- Click-to-toggle preview playback
- File count shown in queue header
- Custom resolution fields hidden when not in use
- Controls locked during conversion
- Toast notifications clamped to screen bounds
Architecture
- Replaced moviepy with direct ffmpeg via imageio-ffmpeg (instant cancel, smaller build)
- Cross-platform: Linux/macOS launcher (start.sh), platform-adaptive fonts
- App icon added
WebP Converter v1.0 – Stable
🔧 Code Quality & Architecture
Double threading eliminated — the original code had start_conversion_thread spawning a thread that called start_conversion, which spawned another thread. Collapsed into a single clean flow.
Thread safety fixed — all UI widget updates from background threads (progress bar, labels, button state) are now routed through self.after(0, ...) to prevent crashes.
_ui() helper — added a unified method to safely schedule any UI call from a background thread, accepting both *args and **kwargs.
Conversion lock — clicking Start during an active conversion shows a toast instead of launching a second conversion. The button is disabled and changes text to "⏳ CONVERTING…" during the process.
Settings persistence expanded — originally only fps, format, and output folder were saved. Now also saves CRF and resolution preset across sessions.
Temp directory — replaced hardcoded temp_frames/ folder in the working directory with tempfile.TemporaryDirectory, which is guaranteed to clean up even if an error occurs.
🐛 Bug Fixes
set_selected_file no longer rebuilds the entire file list — the original rebuilt all rows on every click. Now it only updates the two affected rows' highlight colors.
Late-binding closure bug — on_enter/on_leave/on_click handlers in the file list now use default argument capture to avoid all referencing the last loop value.
self.after(10) with no callback — was a no-op that did nothing useful but was being called from a background thread unsafely. Removed.
GIF + combine validation — now fires before any frame extraction begins, not after wasting time extracting everything.
Even dimensions enforced — libx264 hard-requires width and height to be divisible by 2. Added make_even() helper applied to all resize paths (custom, preset, and Same Resolution) so the encoder never rejects the output.
from moviepy import ImageSequenceClip — updated to match moviepy v2.x import style (was moviepy.editor for v1.x).
CTkImage for preview — replaced ImageTk.PhotoImage with ctk.CTkImage to eliminate HiDPI scaling warnings on every frame render.
Preview aspect ratio — was forcing every image to 400×400. Now uses aspect_fit() to scale within bounds while preserving the original ratio.
Preview loads on a background thread — large animated WebPs no longer freeze the UI while loading frames.
Preview after IDs tracked — cancelled properly via self.after_cancel() to prevent orphaned callbacks stacking up.
✨ Features Added
Files append instead of replace — picking files a second time adds to the queue, skipping duplicates. The original wiped the list on every file selection.
Output folder displayed in UI — a label always shows where files will be saved, updates immediately when changed.
Remove file auto-previews next — removing a file from the queue automatically loads a preview of the next available file instead of going blank.
Empty queue placeholder — shows "No files added yet" text instead of a blank scrollable area.
File metadata in queue rows — each row now shows filename, file size, dimensions, frame count, and estimated duration.
Status indicator in title bar — a ● READY / CONVERTING / DONE / ERROR label in the top-right corner reflects the current app state with color coding.
Left panel render fix — CTkScrollableFrame has a known bug where children don't render until the user manually scrolls. Fixed by nudging the canvas scroll position 100ms after startup.
Mixed resolution warning on combine — when combining files of different sizes, an amber toast tells the user exactly what resolution everything is being normalized to, rather than silently downscaling.
🎨 UI Redesign
Two-column layout — settings on the left (scrollable), preview + queue on the right, instead of everything stacked vertically.
Design token system — all colors defined as named constants (ACCENT, CARD, BG, RED, GREEN, etc.) at the top of the file for easy theming.
Cyan accent palette (#00c2d4) — applied consistently to sliders, buttons, selected rows, section headers, and the status indicator.
Section cards — each logical group (FILES, FORMAT & RESOLUTION, ENCODING, CONVERT, PREVIEW, QUEUE) is wrapped in a dark card with a rounded border and an accent-colored header with a hairline divider.
Slider rows — live value displayed inline on the right side of the label in monospace bold, no separate label below.
Convert button — larger (46px tall), black text on cyan, visually disabled state during conversion.
Segoe UI + Consolas typography — replaced Arial throughout. Technical metadata (paths, dimensions, frame counts) uses Consolas monospace.
Queue row selection — selected file gets a cyan border + dark teal background. Hover state gives a subtle highlight on unselected rows. Remove button only shows red on hover.

WebP_Converter 0.3
1.📊Enhanced Progress Bar
a. Implemented a smooth, animated progress bar that updates in b. real-time during the conversion process.
c. Displays detailed status messages, such as "Extracting frames" and "Encoding video," to inform users of the current operation.
2.📽️Custom Resolution Support
a. Added the ability for users to specify custom output resolutions.
b. Users can input desired width and height values for the output video or GIF.
WebP_Converter 0.2
✅ 1. Added GIF Export Support
Your app can now export to .gif format, not just .mp4, .mkv, .webm.
adjusted arguments for best possible quality for .gif files
✅ 2. Adjustment to UI
You can now resize the window (both width and height freely).
Minimized restriction on minimum size.
Adjust spacings
Set some order into the UI
✅ 3. Widened the Animation Preview
Previews of selected WebPs are now bigger (400x400 instead of 300x300).
✅ 4. Multithreaded Frame Extraction
Frame saving during extraction now happens with multi-core (ThreadPoolExecutor).
Speeds up frame extraction dramatically for big WebPs.
increases bundled exe size but very useful
✅ 5. Resolution Preset Dropdown
A new dropdown was added to the settings panel with the label: “Resolution Preset:”
The options in the dropdown are:
"Same Resolution" (default)
"480p"
"720p"
"1080p"
"4K"
✅ 6. Compression Quality Setting (CRF Slider)
Added a CRF slider: range from 18 (high quality) to 30 (more compression)
defaults 22
✅ 7. FPS Slider range from 1 to 60
defaults 16
✅ 8. Bug fixes
Make open_output_folder() cross-platform it was windows only
WebP_Converter_GUI 0.1
Intial Release, expect some bugs

