| Age | Commit message (Collapse) | Author |
|
|
|
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
|
|
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
|
|
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
|
|
- 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.
|
|
self-delete UX)
|
|
upload, filesize display, duration/filesize/tag filters, favorites
|
|
|
|
- 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.
|
|
- 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.
|
|
|
|
handlers, and bootstrap flow (m9)
|