feat: Snapshots & viewer#22
Merged
Merged
Conversation
- Snapshot entity + SnapshotId/Source/Kind in Core - ISnapshotRepository + SqliteSnapshotRepository (Dapper, UTC ISO-8601) - migration 009_snapshots with (CameraId, TakenAt) index - DI registration in SharedComposition
- SnapshotService in Core picks the HD source by priority: live mainstream -> Majestic HTTP -> brief mainstream open -> SD fallback - thumbnails via SkiaThumbnailGenerator (Video); indexes each capture - ICameraCredentialsProvider seam keeps the service unit-testable - snapshot button on grid tiles + reuse in single-camera page - IconCamera/IconImage lucide glyphs
- Recordings page gains a segmented Recordings/Snapshots switch - SnapshotBrowserPageViewModel: camera + date-preset filters, sort, per-day timeline, multi-select with batch delete - gallery via WrapPanel; thumbnails decode capped at 320px - en/ru strings
- ImageViewerViewModel: prev/next over the filtered set, zoom/pan, rotate, flip, fit, 1:1, slideshow, copy, delete, properties - window on desktop (modal) / full-screen overlay on mobile - wheel + drag + pinch + arrow-key navigation - browser opens snapshots in-app; reloads on viewer deletes - en/ru strings
- SnapshotEdit/IImageEditor in Core; SkiaImageEditor composites arrows, boxes, text and crop, normalized coords - editor mode in the viewer: tool/color/thickness, undo, save copy - saves always as *_edited.jpg via SnapshotService.SaveEditAsync; original untouched; new DB row (Source=Edited) - en/ru strings
- IShareService in Core; desktop reveals in file manager - Android ACTION_SEND via FileProvider (manifest provider + file_paths) - iOS UIActivityViewController - share button in viewer + browser selection toolbar - en/ru strings; all five heads build
- SnapshotServiceTests: HD source-priority (live main > majestic > brief open > SD fallback), never SD when HD available - SqliteSnapshotRepositoryTests: CRUD + camera/date filters - SkiaImagingTests: thumbnail downscale, editor crop + annotation - ROADMAP: phase 14 done; snapshot share sheet ticked
- Video.Tests needs the Skia native; the SkiaSharp package bundles win/osx natives but Linux needs SkiaSharp.NativeAssets.Linux - the app loads Avalonia.Skia's native at runtime, so this is test-only - fixes 3 SkiaImagingTests failing on Linux CI (cannot open libSkiaSharp)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Turns ad-hoc snapshots into a managed feature: always-HD capture, a SQLite index, a browser, an in-app viewer with basic editing, and share. All five heads build (Win/Lin/Mac/Android/iOS), 0 warnings.
SnapshotService(Core) picks the HD source bypriority: running mainstream → Majestic HTTP
/image.jpg→ briefly open themainstream → SD fallback. Never persists an SD frame when an HD source exists.
Snapshot button added to grid tiles; single-camera page reuses the service.
Snapshotstable (migration 009) +SnapshotRepository,entity / strongly-typed id / source & kind enums in Core.
page (keeps the mobile bottom nav at 5/5). Camera + date-preset filters, sort,
per-day timeline, multi-select with batch delete.
zoom / pan / rotate / flip / fit / 1:1 / slideshow, prev-next over the current
filter, wheel + drag + pinch + arrow-key navigation.
Composited by
SkiaImageEditorfrom normalized coordinates; saved always asa copy (
*_edited.jpg), original untouched.IShareServicein Core; desktop reveals in the file manager,Android
ACTION_SENDvia FileProvider, iOSUIActivityViewController.thumbnail/editor compose.
Related
Type
Checklist
TreatWarningsAsErrors=true).dotnet test); new Core logic has unit tests.AppreferencesCoreonly (Infrastructure / Video / Devices wired via DI in a head).Platforms tested
Screenshots / notes