summaryrefslogtreecommitdiff
path: root/web
AgeCommit message (Collapse)Author
2026-05-06Add Down/j hotkey to exit filter and return to thumbnail gridPaul Buetow
2026-05-06Add player logo to site headerPaul Buetow
2026-05-06Fix music video duration display in progress barPaul Buetow
2026-05-06Add 'R' hotkey to play a random track from the current media listPaul Buetow
2026-05-05Add fullscreen crop mode toggle (hotkey c)Paul Buetow
- In fullscreen, press 'c' to toggle object-fit between contain (default) and fill (stretches to fill, no aspect ratio preservation). - Adds .player.crop-mode video { object-fit: fill; } in player.css. - Adds toggleCrop() in player.js that toggles a crop-mode class and a small UI indicator (✂️) in the controls, visible only in fullscreen. - Resets crop mode back to contain when exiting fullscreen (via Escape, minimize, or fullscreenchange event). - Wires the 'c' hotkey in keyboard.js and registers toggleCrop in app.js. - Adds crop-indicator to index.html and detach.html controls, and documents the shortcut in the help modal.
2026-05-05Fix podcast migration backward compatibility and login logo widthPaul Buetow
2026-05-05Fix podcast support critical bugs from code reviewPaul Buetow
- Fix boolean scanning from SQLite INTEGER columns (intToBool helper) - Fix BrowseSet LIMIT 0 returning zero episodes (use 1000 instead) - Fix checkFeed double-fetch by parsing from resp.Body directly + Add ParseFeedReader for body reuse - Fix file handle leak in DownloadEpisode (explicit Close before ImportMediaFile) - Fix incomplete rollback in DownloadEpisode (remove file + delete media row) - Fix 204 No Content handler writing 'null' body - Fix DownloadCoverImage to accept *http.Client with timeout - Deduplicate uniqueFilename into shared internal/service/filename.go - Wire frontend renderPodcastEpisodes into renderBrowse from API data - Refactor podcasts.js: remove extra API call, fix toggle toast, remove duplicate toast - Add Config.PodcastCheckMinutes + PODCAST_CHECK_INTERVAL_MINUTES env var - Start background CheckFeeds goroutine in main.go with ticker - Update NewPodcastService to accept checkInterval parameter - Log errors from CheckFeeds and episode creation instead of silently discarding
2026-05-05Add frontend podcast manager UI and episode rendererPaul Buetow
2026-05-05Add frontend podcast support: API wrappers, episode cards, feed manager modalPaul Buetow
2026-05-04Widen logo crop to preserve full wordmarkPaul Buetow
2026-05-04Fix logo crop: preserve full wordmark while removing excess whitespacePaul Buetow
2026-05-04Trim excess whitespace from logo PNGsPaul Buetow
2026-05-04Use white-background PNG logo for README, favicon, and loginPaul Buetow
- Generate logo.png (white bg) from SVG for README and login screen - Regenerate favicon.ico from white-background logo - Keep original logo.svg available for future edits - Update server routes and middleware to serve new logo.png
2026-05-04Add project logo, favicon, and display logo on login screenPaul Buetow
- Add logo.svg at project root and reference it in README.md - Generate favicon.ico from logo and place in web/ - Serve logo.svg and favicon.ico as static assets - Display logo on the login page with responsive sizing
2026-05-03fix(admin): fix rescan goroutine lifecycle and race on shared ScanProgressPaul Buetow
- Protect adminService scan state (cancel func + progress pointer) with sync.Mutex. - Allocate fresh ScanProgress per trigger and pass it to the scanner, eliminating races on the previously shared progress struct. - Cancel previous scan context before starting a new one. - Add tests for cancellation, fresh progress per scan, concurrent triggers, and empty progress when never started. - Fix race-prone tests by polling Running==true before waiting for completion.
2026-05-03Fix media info and detached playback statePaul Buetow
2026-05-03Fix: Sidebar visibility on page loadPaul Buetow
2026-05-03feat: hybrid cache-busting for thumbnails and coversPaul Buetow
- Add Cache-Control: no-cache headers to thumbnail and cover endpoints (GET /api/media/{id}/thumbnail, GET /api/sets/{id}/cover, GET /s/{token}/thumbnail) so browsers revalidate instead of serving stale cached images after regeneration. - Add frontend cache-busting via ?t=Date.now() after folder cover regeneration so the browser fetches the newly overwritten image. - Replace toolbar filters with inline search syntax (min:, max:, tag:, like:, type:, sort:, minsize:, maxsize:) for faster filtering. - Remove dedicated toolbar and advanced filter panel; consolidate all filtering into the search bar. - Expand filter state to support filesize_min/filesize_max.
2026-05-02refine playback navigation and player modesPaul Buetow
2026-05-02add playback navigation shortcutsPaul Buetow
2026-05-02add player minimize togglePaul Buetow
2026-05-02show audiobook covers as cardsPaul Buetow
2026-05-02show buffered media progressPaul Buetow
2026-05-02fix detached playback and scan progressPaul Buetow
2026-05-02feat: secure shares with keyboard-first My Shares modal (hotkeys S/L)Paul Buetow
2026-05-02more on thisPaul Buetow
2026-05-02switch sidebar hotkey to s, always rebuild/rescan in start.sh, bump sw.js cachePaul Buetow
2026-05-02fix:xPaul Buetow
2026-05-01Add player stage collapse, multi-set selection, grid nav, m4b support, ↵Paul Buetow
content-type fixes, thumbnail refresh, and verbose logging
2026-05-01add readme and so onPaul Buetow
2026-05-01Add support for audiobook/cover images with ancestor lookup and fix keyboard ↵Paul Buetow
navigation Backend: - Add UpdateMediaThumbnail to MediaRepo for efficient thumbnail-only updates - Update ScannerStore interface to include thumbnail update capability - Update mock implementations across repository and API layers for interface changes - Enhance scanner to detect image files in ancestor directories for audio covers - Add background goroutine for async rescan to avoid HTTP timeout Frontend: - Fix hjkl cursor keys to navigate grid properly - Implement ancestor directory cover image lookup for audiobooks Infrastructure: - Add start.sh helper script for quick server startup during development
2026-05-01Add cover image detection for audio files in scannerPaul Buetow
During scanning, when an audio file is found in a directory that also contains an image file (jpg/png/gif), the scanner now assigns that image as the audio file's thumbnail_path. This is common for audiobooks which have cover.jpg alongside the audio files. Changes: - scanner: two-pass walk to collect sibling images, then pair with audio - CSS: add .row-cover style for audio items with covers - JS: render audio rows with cover images when thumbnail_path is set
2026-05-01Minimalist UI: hide all elements until activated; add help modal and ↵Paul Buetow
keyboard shortcuts - Redesign UI to be invisible by default: only header + '?' button shown - Press m to show sidebar, t for toolbar, / for search, ? for help - Add help modal with all keyboard shortcuts - Fix scanner to skip corrupt/unprobeable files instead of aborting - Fix scanner to skip thumbnail errors instead of aborting - Fix rescan to use background context so it completes after HTTP response - Rename project from KISS Media Player to Player
2026-04-30mobile: responsive layout, touch-friendly progress bar, collapsible filtersPaul Buetow
- Add mobile breakpoints (860px/520px) with compact header, full-width sidebar overlay, flexible search bar, and adaptive toolbar. - Player now spans full width on mobile and has reduced stage height. - Progress bar gains touch-drag support (touchstart/move/end) for mobile seeking. - Collapse advanced filters (tags/duration/filesize) behind a 'Filters' toggle to keep the default toolbar KISS. Only type and favorites remain always visible.
2026-04-30task la: finish admin SPA workflows (permissions matrix UI, trash restore, ↵Paul Buetow
self-delete UX)
2026-04-30[ma] Add missing SPA controls: download, tags, thumbnail/cover regen, ↵Paul Buetow
upload, filesize display, duration/filesize/tag filters, favorites
2026-04-30na: Remove inline styles and non-theme color literals from frontendPaul Buetow
2026-04-30Wire playback resume end to end (task ka)Paul Buetow
- Add JSON tags to model structs so API responses use camelCase keys (e.g., id, file_name, position_seconds). - MediaDetail now includes progress; add ResumeFrom() helper on MediaDetail. - Frontend playSelected() fetches /api/media/:id and reads progress.position_seconds before starting playback, then passes resume position to selectAndPlay(). - player.js selectAndPlay/loadMedia accept resumeFrom parameter instead of reading media.resume_from from list items. - Backend test coverage: handlers_test verifies detail endpoint returns progress position in JSON; media_test verifies GetMediaDetail includes progress and ResumeFrom() value. - Frontend test coverage: added web/js/tests/playback-resume.test.js validating detail JSON shape, resume position computation, and list item contract.
2026-04-30ja: implement public share landing page and improve error mappingPaul Buetow
- Add web/share.html with a minimal HTML5 video player, theme variables, centered layout, play overlay, and Back to Home link. - Update handleSharePage to return HTML for browser Accept headers (text/html or empty) and JSON for application/json. Return 410 Gone for expired shares. - Update handleShareStream to map service errors to distinct HTTP codes: ErrShareExpired -> 410, ErrShareNotFound/ErrMediaNotFound -> 404. - Improve ValidateShareToken and StreamSharedMedia to return sentinel errors (ErrShareNotFound, ErrShareExpired, ErrMediaNotFound) instead of generic string errors. - Update and add tests for share page HTML/JSON negotiation and share stream 404/410 responses.
2026-04-29feat: create web PWA frontendPaul Buetow
2026-04-29feat: implement bcrypt password hashing, session management, login/logout ↵Paul Buetow
handlers, and bootstrap flow (m9)