Remove legacy WPF app, flatten WinUI project to repo root, rename namespace

The repo carried two parallel UIs (WPF + WinUI) sharing Models/Services via
cross-directory Link includes. Now that WinUI is the only frontend, collapse
the structure so the WinUI project IS the repo root instead of a nested
sibling folder:

- Delete the WPF project entirely (App.xaml, MainWindow.xaml, csproj) and its
  bin/obj output
- Move AmiReel.WinUI/* up to the repo root (App, MainWindow, MainPage,
  DialogHelper, Assets, Package.appxmanifest, app.manifest, Properties,
  .github/instructions, AGENTS.md) via git mv, preserving history
- Rename AmiReel.WinUI.csproj -> AmiReel.csproj; regenerate the solution as
  AmiReel.slnx (the newer XML solution format) with a single project
- Rename namespace AmigaDB.VideoRenderer.{Models,Services} -> AmiReel.{...}
  and AmiReel_WinUI -> AmiReel across all files, including the embedded
  ffmpeg/ffprobe resource logical names in the csproj and ToolExtractor
- Models/ and Services/ no longer need the Link-based cross-directory
  <Compile Include>; they're picked up by the SDK's default globbing now
  that they live under the project directory
- Rename assets/ -> branding/ (source icon art) to avoid a case-insensitive
  collision with Assets/ (packaged tile art) once both sit at repo root
- Merge the two .gitignore files into one; track the PublishProfiles pubxml
  files instead of ignoring them (no secrets, and they keep publish
  reproducible across machines) as branding, gitignore, etc.
- Simplify publish-win-x64.ps1 (drop the -Target Wpf/WinUI switch, there's
  only one target now) and rewrite README.md to describe the single-project
  layout, build/run/publish commands, and file structure

Verified: dotnet build succeeds for both AmiReel.csproj and AmiReel.slnx, and
the built exe launches and renders identically to before the move.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 14:07:10 +02:00
parent 3e881b79b8
commit 603af17e56
66 changed files with 641 additions and 1905 deletions
+75 -121
View File
@@ -1,111 +1,90 @@
# AmiReel
AmiReel is a Windows video-rendering tool for turning Amiga AVI captures into:
AmiReel is a Windows desktop app for turning Amiga (or any) screen recordings into:
- a 4K 50 FPS final video,
- PNG/JPG thumbnails,
- an animated WebP preview,
- and a publishable Windows desktop app workflow.
- an animated WebP preview.
The repository currently contains two desktop frontends that share the same render pipeline:
- `AmiReel.WinUI`
The newer WinUI 3 application. This is the default publish target.
- `AmigaDB.VideoRenderer.csproj`
The existing WPF application.
Built with **WinUI 3** on the Windows App SDK, driving FFmpeg under the hood.
## Features
- multiple ordered AVI inputs
- Multiple ordered video inputs`.avi`, `.mp4`, `.m4v`, `.mov`, `.mkv`, `.webm`, `.wmv`, `.flv`, `.mpg`, `.mpeg`, `.ts`, `.3gp`
- Drag-and-drop or file-picker source selection
- 3840×2160 output at 50 FPS
- NVIDIA NVENC with automatic CPU `libx264` fallback
- configurable trim, fade, end-card hold, and thumbnail interval
- optional end-card image
- live render progress with frame counters
- FFmpeg log output
- source video preview and final render preview
- dark and light themes
- optional move of source recordings into `originals` in the output folder
- optional custom `ffmpeg.exe` / `ffprobe.exe` paths
- automatic FFmpeg detection from `PATH`
- single-file WinUI publish for easier distribution
- Configurable trim, fade, end-card hold, and thumbnail interval
- Optional end-card image
- Live render progress with frame counters and FFmpeg log output
- Source and final-render preview (built-in or a custom player)
- Dark and light themes
- Optional move of source recordings into `originals/` in the output folder
- Optional custom `ffmpeg.exe` / `ffprobe.exe` paths, with automatic detection from `PATH`
- Self-contained single-file publish for easy distribution
## Project Layout
```
AmiReel.csproj Project file
AmiReel.slnx Solution file
App.xaml(.cs) Application entry point
MainWindow.xaml(.cs) Window shell: custom title bar, theming, exit confirmation
MainPage.xaml(.cs) Main UI: source list, settings, render controls
DialogHelper.cs Shared ContentDialog styling (Settings, exit, error dialogs)
Package.appxmanifest MSIX packaging identity and tile/icon declarations
app.manifest Win32 manifest (DPI awareness, OS compatibility)
Assets/ Packaged app icons and tiles (all required sizes)
branding/ Source artwork the Assets/ tiles are generated from
Models/
AppSettings.cs Persisted user settings
RenderSettings.cs Render job parameters
SupportedVideoFormats.cs Accepted input file extensions
Services/
RenderPipeline.cs Main render workflow (FFmpeg orchestration)
ProcessRunner.cs FFmpeg process execution and progress parsing
ToolExtractor.cs FFmpeg resolution, extraction, and fallback logic
MediaProbe.cs Duration/audio-stream probing via ffprobe
FfmpegLibraryProbe.cs NVENC capability probing
AppSettingsStore.cs Settings load/save (JSON in %LOCALAPPDATA%)
UserFacingErrors.cs Exception-to-message translation
ThirdParty/ Embedded ffmpeg.exe / ffprobe.exe (not checked in, see below)
publish-win-x64.ps1 Publish script
```
## Requirements
For development:
- Windows 10 or Windows 11
- .NET SDK
- WPF project: .NET 8 SDK
- WinUI project: .NET 10 SDK and WinUI/Windows App SDK support
- Windows x64 FFmpeg binaries in `ThirdParty`
- .NET 10 SDK with WinUI 3 / Windows App SDK workload
- Windows x64 FFmpeg binaries in `ThirdParty/`:
- `ThirdParty\ffmpeg.exe`
- `ThirdParty\ffprobe.exe`
For end users:
- Windows 10 or Windows 11 x64
- the published AmiReel executable
- FFmpeg is not required separately if you distribute AmiReel with embedded `ThirdParty` FFmpeg binaries
## Project Layout
- `AmiReel.WinUI\`
WinUI 3 frontend
- `MainWindow.xaml` and `MainWindow.xaml.cs`
WPF frontend
- `Services\RenderPipeline.cs`
Main render workflow
- `Services\ProcessRunner.cs`
FFmpeg process execution and progress parsing
- `Services\ToolExtractor.cs`
FFmpeg resolution, extraction, and fallback logic
- `publish-win-x64.ps1`
Publish script
- The published `AmiReel.exe` — FFmpeg is not required separately if you distribute AmiReel with the embedded `ThirdParty` binaries
## Run in Development
### WinUI
```powershell
dotnet build .\AmiReel.WinUI\AmiReel.WinUI.csproj
dotnet run --project .\AmiReel.WinUI\AmiReel.WinUI.csproj
```
### WPF
```powershell
dotnet build .\AmigaDB.VideoRenderer.csproj
dotnet run --project .\AmigaDB.VideoRenderer.csproj
dotnet build .\AmiReel.csproj
dotnet run --project .\AmiReel.csproj
```
## Publish
### Default: WinUI
The publish script now defaults to the WinUI application:
```powershell
.\publish-win-x64.ps1
```
This publishes the WinUI app as a self-contained single-file executable.
At the end of the script you will see:
- the release folder path
- the final executable path
Example output path:
This publishes a self-contained, single-file `win-x64` executable. At the end of the script
you'll see the release folder and final executable path, for example:
```text
AmiReel.WinUI\bin\Release\net10.0-windows10.0.26100.0\win-x64\publish\AmiReel.exe
```
### Publish WPF instead
```powershell
.\publish-win-x64.ps1 -Target Wpf
bin\Release\net10.0-windows10.0.26100.0\win-x64\publish\AmiReel.exe
```
## Installation
@@ -113,42 +92,33 @@ AmiReel.WinUI\bin\Release\net10.0-windows10.0.26100.0\win-x64\publish\AmiReel.ex
### For developers
1. Clone the repository.
2. Add `ffmpeg.exe` and `ffprobe.exe` to `ThirdParty`.
3. Restore and build the desired app:
2. Add `ffmpeg.exe` and `ffprobe.exe` to `ThirdParty\`.
3. Restore and build:
```powershell
dotnet build .\AmigaDB.VideoRenderer.sln
dotnet build .\AmiReel.slnx
```
4. Run either the WinUI or WPF project.
### For end users
1. Copy the published `AmiReel.exe` from the publish folder to any location, for example:
```text
C:\Apps\AmiReel\
```
1. Copy the published `AmiReel.exe` to any location, for example `C:\Apps\AmiReel\`.
2. Double-click `AmiReel.exe`.
3. If FFmpeg is embedded in the build, no extra setup is required.
4. If you want to use your own FFmpeg build:
open `Settings` and select:
- `ffmpeg.exe`
- `ffprobe.exe`
4. To use your own FFmpeg build instead, open **Settings** and set:
- `ffmpeg.exe` path
- `ffprobe.exe` path
### Optional desktop shortcut
1. Right-click `AmiReel.exe`.
2. Choose `Send to` -> `Desktop (create shortcut)`.
Right-click `AmiReel.exe`**Send to****Desktop (create shortcut)**.
## FFmpeg Behavior
AmiReel resolves FFmpeg in this order:
1. custom paths from settings
2. `ffmpeg.exe` and `ffprobe.exe` found on system `PATH`
3. embedded `ThirdParty` binaries
1. Custom paths from Settings
2. `ffmpeg.exe` / `ffprobe.exe` found on the system `PATH`
3. Embedded `ThirdParty` binaries (extracted to `%LOCALAPPDATA%\AmiReel\tools` on first use)
If NVENC cannot be initialized, AmiReel automatically falls back to CPU `libx264`.
@@ -160,41 +130,25 @@ User settings are stored in:
%LOCALAPPDATA%\AmiReel\settings.json
```
This includes values such as:
- output folder
- end-card path
- FFmpeg paths
- theme
- encoder selection
- timing settings
- whether source videos are moved into `originals` after a successful render
This includes: output folder, end-card path, FFmpeg/preview-player paths, theme, encoder
selection, timing settings, and whether source videos are moved into `originals/` after a
successful render.
## Notes for Distribution
- If you distribute FFmpeg binaries with AmiReel, you are responsible for complying with the license terms of the FFmpeg build you use.
- Keep any required notices, source offer, or attribution required by that FFmpeg distribution.
- Windows Explorer may cache executable icons. If a freshly published build still shows an old icon, rename the file or refresh the icon cache before assuming the embed failed.
- If you distribute FFmpeg binaries with AmiReel, you are responsible for complying with the
license terms of the FFmpeg build you use. Keep any required notices, source offer, or
attribution required by that distribution.
- Windows Explorer may cache executable icons. If a freshly published build still shows an old
icon, rename the file or refresh the icon cache before assuming the embed failed.
## Troubleshooting
### App falls back to CPU instead of NVENC
**App falls back to CPU instead of NVENC** — FFmpeg could not initialize `h264_nvenc`. AmiReel
continues automatically with CPU encoding.
This usually means FFmpeg could not initialize `h264_nvenc`. AmiReel will continue with CPU encoding automatically.
**FFmpeg tool error** — If the embedded FFmpeg is missing or broken, AmiReel tries configured
tool paths, then FFmpeg from `PATH`. Set the paths manually in **Settings** if needed.
### FFmpeg tool error
If embedded FFmpeg is missing or broken, AmiReel will try:
1. configured tool paths
2. FFmpeg from `PATH`
If needed, set the paths manually in `Settings`.
### Render failed popup
The popup shows a short human-readable summary. Full technical details remain available in the `FFmpeg log` panel.
## Current Default Recommendation
Use the WinUI build for publishing and distribution unless you specifically need the WPF variant.
**Render failed popup** — Shows a short human-readable summary. Full technical details remain
available in the **FFmpeg log** panel.