# Player — Agent Documentation This file is written for coding agents working on the `player` project. --- ## Architecture Overview The project is a **self-hosted media player** designed for simplicity (KISS): minimal dependencies, no frontend frameworks, interface-driven Go code for easy testing. ### Backend - **Language / Runtime:** Go 1.23 - **HTTP Server:** `net/http` stdlib only; `http.ServeMux` with pattern matching - **Database:** SQLite via `modernc.org/sqlite` - **Media Processing:** `ffmpeg` / `ffprobe` installed in runtime container - **Password Hashing:** `golang.org/x/crypto/bcrypt` **Layered architecture:** | Layer | Package | Role | |-------|---------|------| | Entrypoint | `cmd/mediaplayer` | Flags, config, dependency wiring, server start | | API / Transport | `internal/api` | `Server` struct holds `http.ServeMux`, route table, middleware, handlers | | Service | `internal/service` | Business logic: `MediaService`, `AdminService`, `ProgressService`, `GCWorker` | | Repository | `internal/repository` | `Store` interface (composite of per-entity repos); concrete SQLite in `sqlite.go` | | Domain | `internal/model` | Pure structs (`Media`, `User`, `Set`, `Session`, etc.) — zero external deps | | Utilities | `internal/auth`, `internal/scanner`, `internal/probe`, `internal/thumb`, `internal/clock`, `internal/setassign` | Hasher, session manager, filesystem scanner, ffprobe wrapper, thumbnail generator, clock abstraction, permission helper | All external dependencies are injected via constructors (e.g., `NewServer`, `NewMediaService`, `NewFSScanner`). Hand-written mocks live in `internal/repository/mock.go` and `internal/service/mock.go`. ### Frontend - **Stack:** Vanilla ES modules, no bundler or build step - **Pages:** `index.html` (SPA), `login.html`, `bootstrap.html` - **Styling:** CSS Custom Properties (`var(--*)`) defined in `web/css/theme.css`; utility/component/layout styles in separate files - **PWA:** `manifest.json` + `web/sw.js` caches static assets for offline usage - **Media Player:** HTML5 `