Releases: captincrum/flick-fix
2.8.1 – Theming, Collapsible UI, and the Compression Filter System
This release is a front-end and experience overhaul. Every backend processing
module (scan, repair, quality, smart-compression, logging) is unchanged and
fully compatible with v2.7 logs and config.json — so upgrading is drop-in.
Highlights: a 6-theme switcher built on a full CSS design-token refactor,
a collapsible card layout for every panel, the Compression Review filter &
cap system now in the shipped build, tip-bubble help text throughout, and a
meaningfully larger test suite.
Theming (app.js / index.html / style.css)
- New theme switcher in the header with live colour swatches — no reload required
- Six built-in themes: True black, Warm slate, Sage, Slate grey, Warm white, and Light
applyThemeandinitThemeSwitchersetdata-themeon the document root and persist the choice- Entire colour palette refactored into CSS custom properties (design tokens) — backgrounds, borders, text, accents, and translucent overlays are now single-source variables, which is what makes instant theme switching possible
- Every theme is defined as a small token override block, so new themes are trivial to add
Collapsible Card UI (app.js / index.html / style.css)
- Settings, Operation mode, Smart compression, Options, Filter, Summary, Console, and Live log panels all collapse and expand
initCollapsibles,paneToggle, andtoggledrive the chevron animation and open/closed state- Live collapse summaries show key values while a card is closed (e.g. selected paths, active mode, filter status) via
updateSummaries - Settings summary is mode-aware — it shows the library root for scan/compress modes and both paths for scan-&-repair, and falls back to "No path set" cleanly
- Log pane starts expanded and collapses from its header; Human/Machine pills remain reachable
Compression Filter & Cap System (app.js / index.html / style.css)
- Filter panel inside the review modal, styled to match the Options and Summary cards
- Confidence filter (High / Medium / Low), auto-gated with a tooltip when the probe data has no variance to filter on
- Resolution filter (≤720p / 1080p / ≥4K), bucketed by video width
- Minimum savings (MB) and minimum savings (%) thresholds with themed number steppers
- Cap modes: No limit / Top savers / Total saved / Size after — ranked biggest-saver-first after filtering
- All predicate filters combine with AND logic; live updates with a 250 ms debounce on typed entry
- Two resets: Reset Filters (thresholds and caps) and Reset Checkbox (manual selections)
- Functions added:
applyCompressionFilter,initCompressionFilter,_filterLeafMatches,_readFilterConfig,_applyFilterConfig,_onCapModeChange,_readFilterNum,_stepFilterNum,_clampFilterBox,_anyFilterActive,_debounceFilter,updateFilterSummary,resetCompressionFilter,resetCompressionCheckboxes
Selection Persistence (app.js)
- Manual picks are sticky —
_recordManualrecords only deviations from the verdict defaults and survives filter and cap changes - The active filter configuration is saved and restored on modal reopen via
_readFilterConfig/_applyFilterConfig - Save/load format stays server-agnostic — no server changes required
Help Text & Iconography (index.html / style.css)
- Static descriptions replaced with tip bubbles that update with the relevant control (workers, scan mode, GPU status, CRF, probe method)
- Material Symbols icon font wired in for crisp UI glyphs
- New resume-scroll button to jump the live log back to the latest line
Server (server.ps1)
- The PowerShell console window is now actually hidden on launch via a Win32
ShowWindow(SW_HIDE) call — in v2.7 this was commented out, so a bare console flashed up - Extensive inline documentation and section cleanup throughout the request loop
- No endpoint changes — the HTTP contract is identical to v2.7
Tests (Run-Tests.ps1 / ui.spec.js)
- PowerShell unit tests: 175 across 18 suites (up from 158)
- Playwright UI tests: 188 across 22 describe blocks (up from 160 across 18)
- New UI coverage for the theme switcher, collapsible panes, the mode-aware settings summary, and the full filter/cap system (debounce, data-gating, themed steppers, cap modes, sticky manual picks)
Upgrade notes: v2.8.1 reads existing v2.7 config.json and log files without
migration. No breaking changes.
GPU Encoding, Review Filters, and Slim Persistence
2.7.0 – GPU Encoding, Review Filters, and Slim Persistence
GPU Encoding (Common.psm1 / SmartCompression.psm1 / UM-Errors.ps1)
- Auto‑detect NVIDIA NVENC, AMD AMF, and Intel QSV hardware encoders at startup
UM-ResolveEncoderselects the best available hardware encoder for the active codec familyUM-ResolveEncoderArgsapplies encoder‑specific quality flags (CQP for NVENC, quality mode for AMF, global quality for QSV)UM-TestGpuEncodervalidates the hardware encoder can initialize before processing the library- GPU preflight in Smart Compression fails fast with one actionable message instead of failing per‑file
UM-ExplainGpuErrorextracts the relevant driver lines from ffmpeg output and suggests the CPU fallback- Sample encode bitrate now measured via output file size instead of parsing ffmpeg summary lines, fixing silent failures on GPU encoders that don't print the summary
Server (server.ps1)
- Added
/gpu-detectendpoint with cached hardware encoder detection (NVENC → AMF → QSV) - Added
/disk-spaceendpoint for pre‑compression free‑space validation - Added
/compress/startendpoint with payload validation, queue persistence, and pipeline launch - Added
/compression/selectionsand/compression/selections/saveendpoints for persistent review state - Config now persists
UseGPU,CrfValue, andCompressionOutputPathacross sessions /logs/clearnow removesCompressionSelections.jsonalongside log data
Client – GPU Toggle (app.js / index.html / style.css)
- CPU ↔ GPU toggle in the main settings panel and inside the compression review modal
- Toggle auto‑disables when no GPU is detected or in Scan Only mode
- GPU status label shows the detected encoder name or "No GPU detected"
- Modal GPU toggle syncs with the main settings toggle on open
Client – Compression Review Tree (app.js / index.html / style.css)
- Three‑state folder checkboxes cycle smart (compress‑only) → none → smart for bulk select/deselect
- Resizable Name column with drag handle
- Skip‑reason labels replace generic "Skip" with specifics: HEVC/AV1, Too Short, Low Bitrate, Would Grow, < 10% Saving, Probe Failed
- Confidence level shown per file in the verdict column (High / Medium / Low)
- Folder verdict counts show selected vs total (e.g. "276 / 773")
- Skip rows visually dimmed with disabled checkboxes and reduced opacity
- Striped tree rows for readability
- Summary card with live‑updating folder count, file count, size before/after, and total saved
- Summary counts now display thousands separators
- Independent Workers slider and CPU/GPU toggle inside the modal, separate from main settings
- Compressed Root path saved to config and restored on modal reopen
- Modal auto‑opens when a Smart Compression probe completes
- Review button dynamically enables/disables based on probe data availability
- Disk space validated against estimated output size before compression starts
Client – Filter & Cap System (app.js / index.html / style.css)
- Filter panel added to the review modal with the same card styling as Options and Summary
- Confidence filter: independent High / Medium / Low checkboxes, auto‑gated with a hover tooltip ("Requires accurate probe") when no variance exists in the data
- Resolution filter: ≤720p / 1080p / ≥4K checkboxes, bucketed by video width (≤1280 / 1281–2560 / ≥2561); none checked means no restriction
- Minimum saving (MB) threshold with themed stepper, range 1–9999, step 10
- Minimum space saved (%) threshold with themed stepper, range 10–95, step 1
- Cap selection dropdown: No limit / Top savers / Free up at least / Keep output under
- Top savers keeps the N largest savers from the filtered pool
- Free up at least accumulates savings until the GB target is met, including the file that crosses the line
- Keep output under accumulates estimated compressed output up to the GB budget, stopping before it crosses
- All predicate filters combine with AND logic; caps rank biggest‑saver‑first after filtering
- Live filtering on all controls with 250ms debounce on typed numeric entry
- Reset Defaults button restores all filter and cap controls to their initial state
Client – Selection Persistence (app.js)
CompressionSelections.jsonnow stores only manual deviations from verdict defaults plus the active filter configuration, instead of a boolean for every scanned file- Skip‑verdict files are never stored — their state is re‑derived from the log on open
- Manual picks are sticky: they survive filter and cap changes and persist across modal close/reopen
- Filter configuration (confidence, resolution, thresholds, cap mode and value) saved and restored on reopen
- File size reduced from ~1 MB to single‑digit KB on typical libraries
- No server changes required — the save/load endpoints remain format‑agnostic
Pipeline (GUI-Core.ps1 / SmartCompression.psm1)
- Config bootstraps the
UseGPUfield, passed through pipeline settings into the worker context EncodeMethod,Encoder, andEncodeErrorfields logged on every probe result for diagnostics- Compression workers receive the GPU flag independently from the probe workers
Tests (Run-Tests.ps1 / ui_spec.js)
- 165 PowerShell unit tests across 18 suites, up from 47 tests and 13 suites in v2.5
- 160 Playwright UI tests across 18 suites, up from 17 tests and 5 suites in v2.5
- Suite 16: GPU Encoder Resolution — verifies
UM-ResolveEncoderandUM-ResolveEncoderArgsacross NVENC, AMF, QSV, and CPU fallback - Suite 17: GPU Integration Contracts — validates preflight testing, error explanation, and module exports
- Suite 18: GPU Client Contracts — confirms toggle wiring, modal sync, and
/gpu-detectusage in app.js - Suite 15 expanded with contracts for the filter functions, cap modes, themed steppers, debounce, data‑gating, and slim selection persistence
Log Caching, Faster Polling, and Performance Upgrades
2.6.0 – Log Caching, Faster Polling, and Performance Upgrades
Server (web_server.ps1)
- Added in‑memory log cache with incremental reads using FileStream.Seek
- Added
/logs/totalendpoint for zero‑I/O line‑count retrieval - Added
/logs/searchendpoint with backslash‑aware server‑side filtering - Added
/status-allendpoint combining console status and log count - Rewrote
/logs/sliceto parse only requested ranges from cache - Updated
/logs/clearto fully reset cache state - Improved file‑lock handling to safely skip updates when workers hold the file
Client (web_app.js)
- Poller now checks
/logs/totalfirst to avoid unnecessary slice fetches - Switched to
setTimeoutchaining with idle backoff to prevent stacked requests - Console and log polling unified through
/status-all - Search filter now uses server‑side
/logs/searchwith 300ms debounce - Clearing filters reloads fresh data instead of reusing stale results
- Updated UI actions to use server‑side search instead of full‑log fetches
- Button handlers now use
apiLogTotal()for counts - Removed virtual scroll spacer in live mode
- Scroll‑up behavior now pages back a flat 200 entries
- Added stale‑state guards to prevent incorrect UI rendering after async operations
Scan Resume (Modules_Scan.psm1)
- Skip‑list now reads raw lines and parses only relevant entries
- Replaced O(n²) scan in
UM-IsScannedwithHashSet<string>for O(1) lookups - Eliminated ~222 million comparisons on large libraries
Logging (Modules_Logging.psm1)
- Fixed double‑newline issue in
UM-AppendLogEntry - Added
UM-LogShowCompletefor future completion‑marker support
UI (web_app.js / web_style.css)
- Fixed blank‑line spacing in machine logs
- Added
.machine-logclass for machine‑mode‑specific formatting - Removed redundant client‑side filtering in
renderLogFile
v2.5 — Smart Compression & CI Pipeline
What's New in v2.5
Smart Compression
- Full probe pipeline using sample encodes to predict space savings before committing
- Fast mode (1 sample) and Accurate mode (3 samples at 25%, 50%, 75%)
- Interactive Compression Results tree — review estimated savings per file, season, and show before compressing
- Hard filters automatically skip files that are already HEVC/AV1/VP9, too short, low bitrate, or would grow larger
- Confidence scoring (High / Medium / Low) based on sample variance
- Disk space check before compression begins
- Parallel compression workers with independent worker count control
- Restart-safe — skips already-completed files on resume
Live Console Progress
- Per-worker display during probing: folder, file, sample progress (e.g. 1/3), and sample timer
- Per-worker display during compression: folder, file, elapsed time, MB/s speed, and estimated progress
- Progress shown as
~52% (1.56GB of ~2.80GB)— honest estimate with size context - Overall completion percentage and elapsed session time for all phases
Bug Fixes
- Cancel now correctly kills all FFmpeg child processes immediately
- Compression worker count no longer inherits from the Settings worker slider
- Console no longer displays blank heartbeat output when no repair is active
- Worker count in compression console now reflects actual compression workers, not probe workers
CI Pipeline
- 47 automated PowerShell unit tests covering file structure, config validation, module imports, and core logic
- 17 Playwright UI tests covering buttons, sliders, modals, and mode switching
- GitHub Actions running all 64 tests automatically on every push
- Branch protection rules enforcing tests must pass before merging to main
Project
- Rebranded from Media Integrity Pipeline to Fli
Version 2.0
v2.0 – New Web-Based Interface, Major UX Overhaul, Engine Stability Improvements
This release introduces the new msedge --app web-based interface for the Media Integrity Pipeline, replacing the WPF UI while keeping the underlying Scan/Repair/QC engine fully intact. The goal of v2.0 is to modernize the interface, streamline user interactions, and resolve nearly all known UX issues from v1.0.
New Interface (WPF → Web App)
- Replaced WPF UI with a modern web-based interface launched via
msedge --app - Automated startup of
server.ps1and browser launch for a one-click experience - Hid browser address bar for a clean, app-like presentation
- Updated layout, styling, and interaction flow for clarity and responsiveness
UI/UX Improvements
- Capitalized status letter for consistency
- Updated Human/Machine Log toggle label
- Unified Start button styling to match toggle colors during execution
- Greyed out non-applicable options while a process is running
- Added "Mode" text for each phase in the console output
- Removed text highlighting when expanding collapsible sections
- Improved CSS for the “Clear Logs” prompt
- Added custom messaging when deleting files
- Added a “Jump to Bottom” button for live log viewing
- Enabled autoscroll behavior with user override when scrolling upward
- Updated Phase 1 verbiage to reflect correct behavior
Functional & Engine Improvements
- All live logs now display correctly
- Live logs update in real time without buffering or stalling
- UnifiedLog.json now appends instead of overwriting
- UnifiedLog.json now creates the live human log
- Cleaned up console output behavior across all phases
- Ensured correct phase transitions for Full, ScanOnly, and RepairOnly
- Reworked config file structure for clarity and future expansion
- Stabilized config read/write logic
- Removed UI printing from Repair module to prevent UI crashes
- Improved thread job handling for stable live updates
- Ensured sequential Scan → Repair execution in Full mode
Mode Selection Logic
- Full Mode
- Enables scan path, repair path, and “Scan All Episodes”
- Scan Only
- Disables repair path
- Repair Only
- Disables scan path and “Scan All Episodes”
Known Issues
- Repair timers still not functioning correctly (ongoing work)
- Quality button remains visible; scheduled for removal in a future update
Future Work (Planned for v2.1+)
- New Compression Mode:
- Compress entire libraries or individual shows
- Automatically reject compression if quality loss exceeds user-defined thresholds
- Default recommended threshold: ~6% quality loss
Summary
Version 2.0 delivers a modernized interface, major UX improvements, and numerous stability enhancements while preserving the reliability of the underlying pipeline engine. This release sets the foundation for future features such as intelligent compression and expanded automation.
Version 1.0
Media Integrity Pipeline — Version 1.0
This release marks the first stable, production-ready version of the Media Integrity Pipeline using the WPF interface. All core functionality has been validated and is working as expected.
Highlights
- Fully functional WPF UI
- All known bugs resolved
- Stable end-to-end pipeline execution
- Reliable operation across all modes:
- Full
- ScanOnly
- RepairOnly
Known Limitations
- The Quality button remains visible and is scheduled for removal in a future update
Summary
Version 1.0 represents a solid, dependable baseline for the project. The pipeline is stable, predictable, and ready for general use.