summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-05-07Fix podcast browser workflows for k1Paul Buetow
2026-05-07i1 omit empty share thumbnail URLPaul Buetow
2026-05-07Fix missing share thumbnails for i1Paul Buetow
2026-05-07j1 fix admin media lifecycle QA defectsPaul Buetow
2026-05-07h1: remove stale toolbar shortcut tipPaul Buetow
2026-05-07h1 fix browser auth theme shortcuts QAPaul Buetow
2026-05-07Fix PWA static routes for browser smoke test g1Paul Buetow
2026-05-07Review DownloadEpisode helper split for f1Paul Buetow
2026-05-07Review scanner refactor task e1Paul Buetow
2026-05-07Fix upload multipart memory budget for t0Paul Buetow
2026-05-07Fix static file read seeker guard for s0Paul Buetow
2026-05-07fix(repository): record media query debug print removal for r0Paul Buetow
2026-05-07Fix scan cancellation progress error for q0Paul Buetow
2026-05-07Fix podcast episode pagination arguments (p0)Paul Buetow
2026-05-07Fix remux error propagation for task o0Paul Buetow
2026-05-07b1 split player modulePaul Buetow
2026-05-07Task 61 extract frontend utilitiesPaul Buetow
2026-05-07Task 51: add API error helpersPaul Buetow
2026-05-07task 31: introduce media streamer servicePaul Buetow
2026-05-07Task 21: move thumbnail regeneration to write servicePaul Buetow
2026-05-07Refactor API server dependencies for task 11Paul Buetow
2026-05-07Handle share page marshal errors (a1)Paul Buetow
2026-05-07task 81: replace test sleeps with deterministic syncPaul Buetow
2026-05-06Split app.js into view modules for task 71Paul Buetow
2026-05-06internal/service: inject http.Client into podcastService constructor (task 41)Paul Buetow
2026-05-06internal/service: log and concurrently process podcast feeds (task 91)Paul Buetow
- Add *slog.Logger to podcastService with NewPodcastServiceWithLogger. - Wire logger from cmd/player main.go. - Run CheckFeeds concurrently: one goroutine per feed with WaitGroup. - Add structured logging for start/finish per feed and overall count. - Log feed failures at Warn level so they are visible but not fatal. - Ensure nil logger safety with slog.Default fallback. - Add tests: empty list, concurrent OK, list error, single feed error, all feeds error.
2026-05-06split DownloadEpisode into smaller helpers (x0)Paul Buetow
Refactor ~112-line DownloadEpisode into four focused helpers: - resolveEpisodeAndSet: permission + path building - buildEpisodePath: filename logic - downloadEnclosure: HTTP fetch to disk - persistDownloadedEpisode: DB + probe + cleanup Also: pass ctx through to HTTP request via NewRequestWithContext. Added tests for happy path, 404, and missing episode/feed/set.
2026-05-06Split scanSet into smaller helpers and fix mockFS SkipDir (task y0)Paul Buetow
2026-05-06w0: Split SubscribeFeed into smaller helpersPaul Buetow
SubscribeFeed was ~100 lines and did too much: admin check, feed parsing, filesystem setup, DB set creation, permission grant, feed creation, cover download, episode insertion, and marking checked. Refactored into focused helpers: - verifyAdmin – admin gate - resolveSetPath – sanitize name and build disk path - createPodcastSet – mkdir, create set row, grant owner perm - rollbackSet – delete set row + remove directory - createPodcastFeed – insert feed row - insertPodcastEpisodes – bulk insert parsed episodes Injected dependency fields (parseFeed, parseFeedReader, downloadCover) into podcastService so unit tests can replace them with fakes instead of hitting real HTTP or disk. Added internal/service/podcast_test.go with coverage for: - happy path SubscribeFeed - non-admin rejection - user lookup error - feed parse error - set creation error (directory cleaned up) - grant permission error (rollback) - feed creation error (rollback) - resolveSetPath / sanitize helpers - DownloadEpisode permission check - upsertFeedEpisodes (new + skip existing) - updateFeedFromParsed - insertPodcastEpisodes
2026-05-06Move background goroutine start out of wireDeps into startBackgroundWorkers ↵Paul Buetow
(task z0)
2026-05-06Enable -race and -count=1 in mage Test targetPaul Buetow
Adds the Go race detector to the default Test target in Magefile.go and includes -count=1 to avoid stale cached results. This improves reliability for concurrent code paths and CI runs. Refs: v0
2026-05-06Add unit tests for internal/podcast package (task 01)Paul Buetow
- Covers ParseFeed, ParseFeedReader, parsedFeedFromGoFeed, extractImageURL, parseDuration, DownloadCoverImage. - Positive and negative tests (invalid XML, HTTP errors, network errors, bad enclosure length, zero duration, nil pubDate, empty file size, file write/read body errors, missing cover URL). - Achieves 100% statement coverage for the package.
2026-05-06remove debug fmt.Printf leak from ListMedia query builder\n\nFixes: u0Paul Buetow
2026-05-06Add q hotkey to stop playback and close playerPaul Buetow
2026-05-06Add T hotkey to regenerate thumbnail of selected itemPaul Buetow
2026-05-06Add crop position/anchor control hotkeysPaul Buetow
2026-05-06Add PgUp/PgDn 10% seek in fullscreen modePaul Buetow
2026-05-06Add search syntax help tooltip (? key in search box)Paul Buetow
2026-05-06Make file indexing concurrent with worker pool in scannerPaul Buetow
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(scanner, browse): fallback to original image when thumbnail generation ↵Paul Buetow
fails for cover.jpg When scanning image files (e.g. cover.jpg in audiobook folders), thumbnailForImage can fail or produce a missing .thumbnails/cover.jpg. This caused broken thumbnails in the grid. - scanner.go buildThumbnailPath: after generating an image thumbnail, verify the output file exists via fs.Stat. If it does not exist, fall back to using the original image path as the thumbnail_path. - browse.go GetThumbnail: if os.Stat(ThumbnailPath) fails and the media type is image, fall back to serving the original AbsPath. All tests pass.
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-06Add podcast E2E integration testsPaul 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-05Expand README and split documentation into docs/ directoryPaul 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-05Update AGENTS.md with podcast support documentationPaul Buetow