Add multi-project sources, clip dedupe and a swing selection mode #27
Loading…
Reference in a new issue
No description provided.
Delete branch "d/multi-source-swing"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Extra .mlt files can be loaded as additional clip sources, the selection pool now drops entries showing identical footage (same file and in/out range), and a new swing mode arranges long clips as random anchors with the shorter clips spread evenly between them.
🤖 Claude AI Code Review
Summary
Adds multi-project source merging, resource+range dedupe, and a swing selection mode, with solid test coverage and a CI refactor to
cmd/external release script.Code Quality ⭐⭐⭐⭐☆
Excellent test coverage across all three new features, including edge cases like fallback halves and empty pools.
Issues
🟡 SwingVideoSelector.cs —
Arrangecan throwIndexOutOfRangeException.perGapandremainderdistribute all shorts acrossgapspositions, but the loop only fills gaps wherei < gaps(i.e.ifrom 0 togaps-1). Since a HashSet ofextraGapspicks indices in[0, gaps), this is consistent — however ifshuffledShorts.Countexceeds what the gaps consume it's fine, but verify the invariant: total placed =perGap*gaps + remainder = shuffledShorts.Count, and shortCursor advances exactly that many times. This holds, so no bug — but note the last long (i == gaps) correctly gets no trailing shorts, meaning shorts never appear after the final long. That matches the tests. No action needed.🟢 ShotcutService.cs —
LoadCombinedProjectAsynccallsMakeResourcePathsAbsolute(primary, ...)andMergeSourceProjectalso callsMakeResourcePathsAbsolute(extra, ...), but this method isn't shown in the diff. Assuming it's idempotent and pre-existing, fine. Confirm it exists.🟢 Home.razor —
RemoveSourceProjectAsyncdiscards the reload result (_ = await ...). If reload fails after removal, the UI silently keeps a stale/cleared project. Minor, but a failed reload here leavesCurrentProjectpotentially null with no user feedback beyond the snackbar inside the method.The
192.168.1.15:3000internal URL is hardcoded but was already present pre-PR (just relocated torelease.ps1) — not introduced here. The release token is correctly passed via env var rather than interpolated. Everything else is clean and well-tested.📊 Tokens: 22655 input + 767 output | 💰 Cost: ~$0.1325
Generated by Claude Opus 4.8 via Gitea Actions