New "Video | Shorts" tab strip on the main page. The existing Video tab and
its render pipeline are unchanged; Shorts is a new, independent workflow
sharing the same render-progress/log/output controls.
- Services/ShortsPipeline.cs: C# port of amigadb-short.sh rather than
shelling out to bash — end users on plain Windows don't have bash/WSL, and
shipping this as a native part of the app keeps distribution self-contained.
All 19 visual style filtergraphs (brand, pixel, mirror, crop, workbench,
blur, crt, copper, stars, grid, tiles, scan, starfield, plasma,
rasterbars, vhs, monitor, split, spectrum) are copied verbatim from the
bash heredocs. Per explicit decision, kept parity with the script's actual
behavior where the brand-style HOOK_BOX_Y/INFO_BOX_Y/font-size variables
are computed but never actually used in the final filter (dead code in
the original) rather than "fixing" it and changing rendered output.
Reuses ToolExtractor/MediaProbe/ProcessRunner exactly as RenderPipeline
does, so FFmpeg resolution and NVENC fallback behave identically.
- Models/ShortSettings.cs: job parameters + ShortStyle enum.
- AppSettings gains sticky Shorts defaults (style, hook, website, font,
background image, CRF, preset) alongside the existing Video defaults.
- MainPage: Video/Shorts tab buttons toggle two content panels; the
background-image field auto-hides for non-brand styles; font field
defaults to the first bold system font found (Segoe UI Bold, Segoe UI
Semibold, Arial Bold, Calibri Bold); blank output path is auto-derived
from the input filename and style, matching the script's default.
- 13 new unit tests (escaping order, meta-line joining, validation,
every style producing a non-empty filter, the drawtext trailer's timing
gates). Full run is 72/72 passing.
- Fixed a bug caught during manual testing: MainPage.Resources["PrimaryButtonStyle"]
looked in the Page's own (empty) resource dictionary instead of
Application.Current.Resources, throwing on every tab switch.
Verified end-to-end: rendered a real Short from an existing video through
the actual running app (not just unit tests) and inspected extracted
frames — hook/title/meta/website text overlays appear and disappear at the
correct timestamps with correct styling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Remove unused `using Microsoft.Win32;` from MainPage.xaml.cs (leftover
from the WPF OpenFileDialog era; WinUI uses Windows.Storage.Pickers)
- Trim App.xaml.cs down to the two usings it actually needs instead of the
full WinUI3 template boilerplate list
- Change App.MainWindowInstance to an internal setter (only MainWindow
itself should assign it)
- Add AutomationProperties.Name to the icon-only Settings button so screen
readers announce it (it only had a mouse tooltip before)
- Delete Assets/AppIcon.ico: unreferenced by both the manifest and code,
the real app icon comes from ApplicationIcon (branding/AmiReel.ico) and
AppWindow.SetIcon at runtime
- Drop the systemAIModels capability from Package.appxmanifest; the app
doesn't call any Windows AI API, so declaring it is an unnecessary
privilege request
Verified: dotnet build produces 0 warnings/errors, app launches unchanged.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>