Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
981dc86
* Fixing #736 thumbnail and crop preview generation failing with FFmp…
cdgriffith Mar 24, 2026
fd52e5f
* Adding gamma and hue options to the Equalizer in the Advanced panel…
cdgriffith Apr 5, 2026
8876fc2
* Adding #405 sharpen filter (CAS) to the Advanced panel (FFmpeg cas …
cdgriffith Apr 5, 2026
bea2082
PR Fixes
cdgriffith Apr 5, 2026
4238acd
* Adding warning in Data & Attachments tab and reason text when track…
cdgriffith Apr 5, 2026
f16d0f4
* Adding #344 lossless encoding option for AVC (x264), AV1 (AOM), VP9…
cdgriffith Apr 5, 2026
9798278
* Fixing #130 auto-crop producing invalid crop rectangles for non-sta…
cdgriffith Apr 5, 2026
38b6332
* Adding #544 Download HDR10 Metadata button in Source Details tab fo…
cdgriffith Apr 5, 2026
9b03e7e
* Adding customer installer
cdgriffith Apr 6, 2026
3b4d66e
Installer updates
cdgriffith May 19, 2026
9e2cfeb
Fix PR 740 GUI core review findings
cdgriffith Oct 21, 2026
ccd3d98
Fix filter/command-builder review findings for PR 740
cdgriffith Oct 21, 2026
82a13ca
Fix PR 740 encoder review findings
cdgriffith Oct 21, 2026
c062732
Fix PR 740 review findings: scale, auto-crop, info/data panels, profi…
cdgriffith Oct 21, 2026
4bafbb3
Merge branch 'fix/740-filters' into pr740-review-fixes
cdgriffith Oct 21, 2026
1f751b6
Merge branch 'fix/740-encoders' into pr740-review-fixes
cdgriffith Oct 21, 2026
9ad0fed
Merge branch 'fix/740-gui-core' into pr740-review-fixes
cdgriffith Oct 21, 2026
2e21dec
Merge branch 'fix/740-gui-misc' into pr740-review-fixes
cdgriffith Oct 21, 2026
79197f8
Fix FFmpeg NVENC bitrate mode, cover attachment metadata index, legac…
cdgriffith Oct 21, 2026
296a7d3
Treat string "False" interlaced value as progressive when restoring d…
cdgriffith Oct 21, 2026
7877866
Fix PR 740 review findings in Go installer/launcher/uninstaller and b…
cdgriffith Oct 21, 2026
5edc512
Merge branch 'fix/740-installer' into pr740-review-fixes
cdgriffith Oct 21, 2026
e51a50c
Fix uninstaller self-delete with non-ASCII paths and visible ping con…
cdgriffith Oct 21, 2026
29bb729
Installer: report elevated helper result via exit code; harden legacy…
cdgriffith Oct 21, 2026
9f7c075
Changelog for PR 740 review fixes
cdgriffith Oct 21, 2026
2cf808f
Fix PyInstaller `LD_LIBRARY_PATH` contamination breaking FFmpeg on Li…
anne-o-pixel Oct 21, 2026
ac79262
Fix overwrite prompt escape, after-done action on cancel, Notifier pr…
cdgriffith Oct 21, 2026
9c61adf
Run preview ffmpeg without shell, with timeout; debounce crop window …
cdgriffith Oct 21, 2026
4d4f3cf
Debounce time/crop field updates and serialize thumbnail generation
cdgriffith Oct 21, 2026
33e95d4
Re-index audio widgets after deleting a duplicate track; commit title…
cdgriffith Oct 21, 2026
1bf3b2a
Add timeouts to post-encode probe and history thumbnail
cdgriffith Oct 21, 2026
16e3930
Fix runner exit codes, process-tree control and worker cleanup
cdgriffith Oct 21, 2026
f93a662
Rigaya encoders: skip HDR10 static metadata when tone mapping, shlex …
cdgriffith Oct 21, 2026
57cad8e
HDR10+ extract: stop busy-wait and close stderr file
cdgriffith Oct 21, 2026
6252206
Fix FFmpeg download refresh passing config
cdgriffith Oct 21, 2026
4e2931e
Fix GPU vendor detection and fingerprint/download handling
cdgriffith Oct 21, 2026
dd26a9c
Rigaya encoders: fix VCE --pa argv, valid --vpp-deblock params, --vpp…
cdgriffith Oct 21, 2026
9a19992
Rigaya feature detection: check return code instead of stderr, add ti…
cdgriffith Oct 21, 2026
8616431
Harden program downloads: timeouts, checksums, asset selection, errors
cdgriffith Oct 21, 2026
4de6f1f
Adding SVT-AV1 tunes 3-5, variance boost, enable-tf, startup-mg-size …
cdgriffith Oct 21, 2026
ba00c6f
Harden config, queue and history persistence
cdgriffith Oct 21, 2026
3cc4aed
Harden update check and fix quoted_path space stripping
cdgriffith Oct 21, 2026
03a80f4
Open log dir via QDesktopServices, escape rich text paths, remove dea…
cdgriffith Oct 21, 2026
cf337a2
Fix VAAPI encoders: low_power, scaling, software-frame filter chain, …
cdgriffith Oct 21, 2026
c0df312
Rigaya encoders: drop codec-restricted options, wire NVEnc profile an…
cdgriffith Oct 21, 2026
ef9cbfc
NVEncC: add --tune support (hq, uhq, lowlatency, ultralowlatency, los…
cdgriffith Oct 21, 2026
894157c
Fix HDR10+ detection, concat parsing, cropdetect flag and attachment …
cdgriffith Oct 21, 2026
3bd60e7
Fix filter, subtitle, audio and PGS OCR review findings
cdgriffith Oct 21, 2026
da6d982
Rigaya encoders: add quality based VBR (--qvbr) for NVEncC, QSVEncC a…
cdgriffith Oct 21, 2026
b0dafa5
Fix VVC two-pass/VBV params, x265 stats path and HDR gating; add shar…
cdgriffith Oct 21, 2026
0f34d2a
Fix VP9 CRF mode ignoring speed
cdgriffith Oct 21, 2026
c6db8f7
Fix GIF HDR tone mapping, apply fps before scale, build filtergraph once
cdgriffith Oct 21, 2026
e30540b
Changelog for software encoder review fixes
cdgriffith Oct 21, 2026
3ee302d
NVENC presets/options, hvc1 tag, VideoToolbox single pass and profile…
cdgriffith Oct 21, 2026
96a5d50
Merge rev/svtav1 into integration
cdgriffith Oct 21, 2026
8fb07b1
Merge rev/data into integration
cdgriffith Oct 21, 2026
9b0c377
Merge rev/core into integration
cdgriffith Oct 21, 2026
f7881de
Merge rev/gui into integration
cdgriffith Oct 21, 2026
b07cc21
Merge rev/rigaya into integration
cdgriffith Oct 21, 2026
7103ce0
Merge rev/filters into integration
cdgriffith Oct 21, 2026
d7e12b5
Merge rev/vaapi into integration
cdgriffith Oct 21, 2026
f03b5a4
Merge rev/nvenc-hvc1 into integration
cdgriffith Oct 21, 2026
723d73b
Merge rev/software into integration
cdgriffith Oct 21, 2026
5fe7c51
Fix review findings: quoted start_extra and audio title sync
cdgriffith Oct 21, 2026
1cee2db
Move corrupt history aside, time out hung thumbnails, restore PATH sa…
cdgriffith Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 0 additions & 120 deletions .claude/settings.local.json

This file was deleted.

68 changes: 68 additions & 0 deletions .claude/skills/build-installer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
description: Build the FastFlix installer, distribution, launcher, and uninstaller
---

# Building the FastFlix Installer & Distribution

## Prerequisites

- Go 1.22+ installed
- `go-winres` installed (pinned): `go install github.com/tc-hib/go-winres@v0.3.3`, with `%GOPATH%\bin` on PATH
- Python 3.13+ with `uv`
- Internet access (first build downloads embeddable Python and wheels)

`zstandard` is not a project dependency; run the script through `uv run --with zstandard`.

## Full Build (everything from scratch)

```bash
uv run --with zstandard python scripts/build_distribution.py --archive --installer
```

This produces `dist/FastFlix_installer.exe`. The script:
- Downloads the embeddable Python (version constant `DEFAULT_PYTHON_VERSION` in the script)
- Builds a fresh FastFlix wheel (wipes `dist/wheels`, requires exactly one wheel)
- Installs dependencies pinned from `uv.lock` for the bundled CPython 3.13 / win_amd64 (`--arch arm64` for ARM64)
- Syncs `cmd/*/winres/winres.json` with `fastflix/version.py` (versions + copyright year)
- Runs `go-winres make` in each `cmd/*` and builds `FastFlix.exe` + `uninstall.exe` (+ installer with `--installer`)
with `-X main.Version=... -X main.BuildDate=...`
- Trims unused PySide6 modules (~527 MB savings), keeping third-party licence files
- Creates `fastflix_dist.tar.zst`, copies `licenses.txt`, generates `terms_translations.json`

Use `--archive` alone to stop before building the installer.

## Manual rebuilds (after Go code changes)

Run `go-winres make` in the `cmd/<name>` directory first (the `.syso` files are gitignored), then:

```bash
go build -ldflags="-s -w -X main.Version=6.3.0 -X main.BuildDate=2026-01-01" -o dist/FastFlix/FastFlix.exe ./cmd/launcher
go build -ldflags="-s -w -H windowsgui -X main.Version=6.3.0" -o dist/FastFlix/uninstall.exe ./cmd/uninstaller
go build -ldflags="-s -w -H windowsgui -X main.Version=6.3.0 -X main.BuildDate=2026-01-01" -o dist/FastFlix_installer.exe ./cmd/installer # needs the archive
```

## Checks

```bash
GOOS=windows go vet ./...
go test ./cmd/internal/...
```

## Important Notes

- **Launcher**: Built WITHOUT `-H windowsgui` (needs console for logs); passes all arguments through to `python -m fastflix`
- **Installer/Uninstaller**: Built WITH `-H windowsgui` (no console)
- **Shared logic** (path safety, manifest-based removal, registry, self-delete batch) is in `cmd/internal/ffinstall`; never delete directories with `RemoveAll` on a registry-derived path without `ffinstall.SafeToRemove`
- **Uninstall** removes only files listed by `install_manifest.txt` (top-level entries) and keeps user files like a portable `fastflix.yaml`
- **DO NOT** use `CREATE_NO_WINDOW` flag on the launcher's child process - breaks FFmpeg pipe handles
- **DO NOT** use `walk` or other Go GUI frameworks - they have `TTM_ADDTOOL` failures on modern Windows. Use raw Win32 API.
- For `WM_DRAWITEM`-style lParam casts use `*(**T)(unsafe.Pointer(&lParam))` (keeps `go vet` clean)

## Testing

```bash
dist/FastFlix/FastFlix.exe --version
dist/FastFlix/FastFlix.exe --test
dist/FastFlix_installer.exe
"%LOCALAPPDATA%\Programs\FastFlix\uninstall.exe"
```
68 changes: 34 additions & 34 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,41 +96,41 @@ jobs:
run: |
mkdir dist
New-Item -Path Env: -Name VERSION -Value $(python.exe scripts\get_version.py)
New-Item -Path Env: -Name EXACT_VERSION -Value $(python.exe scripts\get_version.py exact)
New-Item -Path Env: -Name PRODUCT_VERSION -Value $(python.exe scripts\get_version.py nsis)
echo "Building branch $env:GITHUB_REF - version $env:VERSION"
echo "::set-env name=VERSION::$env:VERSION"
echo "::set-env name=EXACT_VERSION::$env:EXACT_VERSION"
echo "::set-env name=PRODUCT_VERSION::$env:PRODUCT_VERSION"
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: go.sum

- name: Install go-winres (icon / manifest / version resources)
shell: bash
run: |
go install github.com/tc-hib/go-winres@v0.3.3
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
- name: Install Python Dependencies
run: uv sync --frozen

- name: Build single executable
# Builds python runtime + dependencies (pinned by uv.lock), runs go-winres for the launcher and
# uninstaller, builds FastFlix.exe + uninstall.exe, writes cmd/installer/fastflix_dist.tar.zst, then
# runs go-winres for the installer and builds dist\FastFlix_installer.exe with
# -ldflags "-s -w -H windowsgui -X main.Version=<fastflix/version.py> -X main.BuildDate=<today>".
- name: Build distribution and installer
shell: cmd
run: uv run pyinstaller FastFlix_Windows_OneFile.spec
run: uv run --with zstandard python scripts\build_distribution.py --archive --installer

- name: Build installer executable
- name: Go vet
shell: cmd
run: uv run pyinstaller FastFlix_Windows_Installer.spec

# - uses: skymatic/code-sign-action@v1
# with:
# certificate: '${{ secrets.CODE_CERT_B64 }}'
# password: '${{ secrets.CODE_CERT_PASS }}'
# certificatesha1: '${{ secrets.CODE_CERT_THUMB }}'
# description: 'FastFlix'
# timestampUrl: 'http://timestamp.sectigo.com'
# folder: 'dist\FastFlix'
# recursive: false
run: go vet ./...

- name: Package installer
- name: Go tests
shell: cmd
run: |
makensis.exe /INPUTCHARSET UTF8 /DVERSION=${{ env.EXACT_VERSION }} /DPRODUCT_VERSION=${{ env.PRODUCT_VERSION }} FastFlix.nsi
move FastFlix_installer.exe dist\FastFlix_${{ env.VERSION }}_installer.exe
run: go test ./cmd/internal/...

# - uses: skymatic/code-sign-action@v1
# with:
Expand All @@ -140,29 +140,29 @@ jobs:
# description: 'FastFlix'
# timestampUrl: 'http://timestamp.sectigo.com'
# folder: 'dist'
# recursive: false
# recursive: true

- name: Test executable
- name: Test launcher
shell: cmd
run: |
dist\FastFlix.exe --version
dist\FastFlix.exe --test
dist\FastFlix\FastFlix.exe --version
dist\FastFlix\FastFlix.exe --test
- name: Package single executable
- name: Package installer and portable archive
shell: cmd
run: |
move dist\*.exe .
move docs\build-licenses.txt LICENSE
move dist\FastFlix_installer.exe dist\FastFlix_${{ env.VERSION }}_installer.exe
copy docs\build-licenses.txt dist\FastFlix\LICENSE
7z a -mm=Deflate -mfb=258 -mpass=15 dist\FastFlix_${{ env.VERSION }}_win64.zip .\dist\FastFlix\*
- name: Upload standalone executable artifact
- name: Upload portable archive artifact
uses: actions/upload-artifact@v4
with:
name: FastFlix_${{ env.VERSION }}_win64
path: |
FastFlix.exe
LICENSE
path: dist/FastFlix_${{ env.VERSION }}_win64.zip

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: FastFlix_${{ env.VERSION }}_installer
path: FastFlix_${{ env.VERSION }}_installer.exe
path: dist/FastFlix_${{ env.VERSION }}_installer.exe
1 change: 1 addition & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ jobs:
- name: Run tests
env:
PYTEST_QT_API: pyside6
QT_QPA_PLATFORM: offscreen
run: uv run pytest tests -v
11 changes: 10 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,13 @@ iso-639-3.*
build-dir/
benchmarking/

./.claude/settings.local.json
.claude/settings.local.json

# Go installer build artifacts
cmd/installer/fastflix_dist.*
cmd/*/*.syso
cmd/installer/licenses.txt
cmd/installer/terms_translations.json

# Build script cache (downloaded Python embeddable, get-pip.py)
scripts/cache/
Loading
Loading