About This Site
A personal collection of videos from my mountain adventures — hiking, rock climbing, bouldering, and gym sessions. No cloud, no database, just files on disk and a fast Blazor Server interface.
Features
- 🏔️ Four video galleries — Mountains, Rock Climbing, Bouldering, Indoor Climbing
- 🎬 Automatic H.264 compression on upload via FFmpeg (~720p, configurable quality)
- 🖱️ Hover card expansion with fullscreen overlay (close with X, background click, or Escape)
- 🔐 Login-protected upload, edit, and delete
- 📁 Zero database — metadata stored as JSON files alongside each video
- 🖼️ Custom SVG icons throughout the UI
Technology
- ASP.NET Core 8.0 with Blazor Server
- Xabe.FFmpeg — H.264 video compression (auto-downloaded on first run)
- Cookie authentication with credentials.json
- File-based JSON storage — no SQL Server, no Entity Framework
- Responsive CSS with glassmorphism, gradients and smooth transitions
Architecture & Design Patterns
The codebase is built around SOLID principles with the following patterns:
- Repository —
IVideoRepository / JsonVideoRepositorydecouples persistence from business logic - Decorator —
LoggingVideoRepositorywraps any repository with transparent structured logging - Strategy —
ICompressionStrategy / H264CompressionStrategymakes the video codec swappable without touching the service layer - Result —
OperationResult<T>replaces raw bool + string tuples with expressive, type-safe outcomes - Options —
VideoStorageOptionsviaIOptions<T>exposes all codec settings in appsettings.json - Factory Method —
Video.Create(...)centralises object construction - Value Object / DTO —
VideoUploadRequestsealed record groups upload parameters immutably - Template / DRY —
CategoryGallery.razoris one reusable component behind all four category pages
SOLID
- S — each class has one job: VideoService orchestrates, JsonVideoRepository persists, FileStorageService handles files, H264CompressionStrategy encodes
- O — new compression codec or new category requires only a new class / constant, zero existing code modified
- L — LoggingVideoRepository is a fully valid drop-in for JsonVideoRepository via IVideoRepository
- I — five small focused interfaces instead of one large service class
- D — every component and service injects interfaces, never concrete classes