Commit Graph

72 Commits

Author SHA1 Message Date
Jonathan Sykes
65f5325a8e Search from service mode no longer strands the user on the home screen
In service mode's Video view the overlay lives inside the player pane, which
the home-over rule hid, while service mode kept the bottom bar and mini bar
hidden. Going home now leaves service mode first, and the rule spares the
service overlay.
2026-10-03 01:15:44 +08:00
Jonathan Sykes
caf0199c11 Fast lyric fitting for long videos; Search tab returns to the home screen while playing
- fitLyricLines measures text on a canvas with the line's own font and writes
  every --fit after measuring (it used an in-list DOM probe and wrote inside
  the loop, re-laying-out the whole list per line). 1200 lines: 600 ms -> 28 ms;
  sizes match the old method within 1 px. Service mode on long sermons with
  hundreds of transcribed lines opened slowly enough on phones to look broken.
- Bottom-nav Search while something plays shows the home screen (playlist
  board / hero) over the player pane; the media keeps playing unseen and the
  mini bar brings the player back (its close button too, so there is always a
  way back). Starting another video restores the player.
2026-10-03 01:10:15 +08:00
Jonathan Sykes
56b3f4e449 Resumable saves: ranged downloads that survive dropped connections, reloads and app kills
Server
- /api/download/:id answers Range with a strong ETag ("<id>.<gen>") and honours
  If-Range; a stale partial gets the whole current file (streamed, so Bun does
  not re-apply the Range itself). Uploads get the same treatment.
- GET /api/download/:id/prepare never blocks: ready {gen,size,sha256,etag,ext},
  working (server still fetching), legacy (HEVC / too long / cache offline),
  failed. Recently refused prepares are remembered for 10 minutes.

Browser
- The OPFS worker saves in 8 MiB ranges, writes at the byte offset, flushes
  each chunk, retries each chunk 6 times with backoff (30 s idle timeout) and
  keeps the .part plus a .part.json sidecar naming the server copy it belongs
  to. A changed copy restarts cleanly; the finished file is hashed once and
  checked against the server's SHA-256.
- SaveQueue remembers unfinished saves and resumes them on start, online,
  return to the foreground and every 2 minutes while visible; one at a time.
- Downloads shows live MB progress, 'Preparing on server', 'Verifying', and
  paused saves with Resume and Cancel (confirmed).
- listVideos ignores the sidecars; new listPartials/discardPartial helpers.

Verified in Chromium through a connection-dropping proxy: paused at 8 MiB,
auto-resumed after a reload from byte 8388608, final SHA-256 matched.
2026-10-03 00:46:52 +08:00
Claude
04a74ab45d Redesign service-mode controls and add per-profile wrong-lyric-line reports 2026-09-30 15:15:07 +00:00
Claude
c8837befed Download a verified file from another device over WebRTC 2026-09-30 07:54:34 +00:00
Claude
61d0274896 Show peer availability with stale markers and add Sharing settings 2026-09-30 07:45:13 +00:00
Jonathan Sykes
74777ef87f show a lightning icon on recent searches that will load instantly 2026-09-30 00:18:22 +08:00
Jonathan Sykes
6480b314d5 remember recent searches on-device and show them under the search box 2026-09-29 22:08:16 +08:00
Jonathan Sykes
b6fdff2438 drop the boxed background on the saved-offline card badge 2026-09-28 20:30:13 +08:00
Jonathan Sykes
ba697e5d11 floor service-mode lyric font size and space out verses 2026-09-26 02:11:07 +08:00
Jonathan Sykes
05e85a0a3f Give untimed lyrics one uniform line size in service mode 2026-09-24 08:34:09 +08:00
Jonathan Sykes
d64c5f2613 Lift the section rail clear of the floating mini player 2026-09-22 14:58:31 +08:00
Jonathan Sykes
f411e49e4c Floor the party panel and rail above the bottom nav in CSS so a bad measurement cannot hide their controls 2026-09-22 14:44:30 +08:00
Jonathan Sykes
c9e021a045 Keep the watch party panel above the bottom bars so its leave button is reachable 2026-09-22 14:23:39 +08:00
Jonathan Sykes
6c4571cb33 Measure the bottom bars so the section rail is never hidden behind the mini player 2026-09-22 14:09:03 +08:00
Jonathan Sykes
530d07d920 Add a mobile section rail that follows the scroll, jumps between cards and folds the one you are on 2026-09-22 13:47:26 +08:00
Jonathan Sykes
987697e759 Paint saved playlists before the launch sync and swap a background-downloaded update instantly 2026-09-22 13:27:12 +08:00
Jonathan Sykes
2a4526578f Show lyrics in place of the video for watch parties and sing-alongs 2026-09-21 21:03:46 +08:00
Jonathan Sykes
808306ffce Keep the five transport buttons grouped on one line at every screen width 2026-09-21 10:33:06 +08:00
Jonathan Sykes
2987f46037 Add a scrubbable timed lyric editor to the admin page, LRCLIB regeneration tooling with lyrics skills, and keep the five playback buttons on one row on phones 2026-09-20 17:55:49 +08:00
Jonathan Sykes
b983c6ca3c Fetch lyrics from LRCLIB (synced when available) and serve an admin media library of uploaded video and audio with cover art and embedded lyrics 2026-09-20 05:59:50 +08:00
Jonathan Sykes
9c1ec4ac51 Add presenter view, stats, lyrics worker, watch party with voice chat, timestamp sharing, soundbites, notes, transcript search, PiP, EQ, sleep fade, gestures and external players; fix the crossfade end-of-song race 2026-09-20 00:07:12 +08:00
Jonathan Sykes
ca07e1fdf1 Add gapless and crossfade playlist transitions with a mode toggle, and a waveform seek bar for audio-only playback 2026-09-19 16:12:33 +08:00
Jonathan Sykes
71fc51fb50 Add a lyrics-only service mode view with the sung line centred and auto-sized, and a free local faster-whisper script to transcribe saved songs 2026-09-19 08:33:00 +08:00
Jonathan Sykes
b82f17cd46 Add phone remote control: pair a phone with a 6-digit code or QR to drive a desktop instance's playback, queue, volume, sleep timer and service mode 2026-09-18 20:19:00 +08:00
Jonathan Sykes
524db986d2 Add shared synced lyrics, chapters and personal bookmarks with revision history, API tokens and an admin page 2026-09-18 18:10:10 +08:00
Jonathan Sykes
292a0c7e29 Show the video inline in service mode and keep audio alive in the background 2026-09-08 17:36:55 +08:00
Jonathan Sykes
a3089dde74 Add a service mode shortcut to the now-playing bar and a video panel toggle 2026-09-08 16:59:43 +08:00
Jonathan Sykes
3e1b56610f Let a shared playlist be sent to another user by name 2026-09-08 15:52:46 +08:00
Jonathan Sykes
9366b1749c Keep service mode full-bleed on iOS and hide the player chrome behind it 2026-09-08 11:55:15 +08:00
Jonathan Sykes
e91fe83cc7 Fill the phone screen in service mode and open it on the playing song 2026-09-08 06:51:03 +08:00
Jonathan Sykes
ee78c8561b fix playlist name overflow with 2-line clamp 2026-08-17 02:13:51 +00:00
Jonathan Sykes
c08558cfb4 Enhance 5 layout themes with structural CSS — topbar, nav accents, mini-bar, ambient layers 2026-08-17 00:29:52 +00:00
Jonathan Sykes
9c2146aef8 Fix layout theme grid overrides breaking mobile — wrap in min-width:861px 2026-08-17 00:21:50 +00:00
Jonathan Sykes
eb6ed215fe Add 6 selectable layout themes to Settings (Appearance) 2026-08-16 16:33:26 +00:00
Jonathan Sykes
8ef16a8b38 Add per-song notes on playlist entries 2026-08-16 13:58:22 +00:00
Jonathan Sykes
14e1d8e3dd Add service mode set-list view with screen wake lock 2026-08-16 13:51:27 +00:00
Jonathan Sykes
c5f47514ad Show per-playlist offline status and add a keep-offline pin 2026-08-16 13:45:19 +00:00
Jonathan Sykes
5a9304780a Give the empty-home playlist grid the full pane height instead of a clipped 16:9 box 2026-08-16 08:52:18 +00:00
Jonathan Sykes
fa9ef000b9 Show playlists instead of the branding hero on the empty home 2026-08-15 07:19:46 +00:00
Jonathan Sykes
b2154bd9c4 Add shareable profile link to settings and sidebar 2026-08-15 06:58:43 +00:00
Claude Worker
70460232f0 feat: Add scrubber with A/B markers for video editing/downloading 2026-07-18 17:59:20 +00:00
Claude Worker
046aa67108 feat: Add visual scrubber to video editor
Task #69 completed by ClaudeQueue

ClaudeQueue
2026-07-18 17:50:27 +00:00
Claude Worker
8c0776f97d feat: Add support for editing video
Add an Edit
2026-07-18 16:43:15 +00:00
Jonathan Sykes
88c89d66af fix portrait PWA nav dead while playing by making body the scroll container 2026-07-10 13:55:31 +08:00
Jonathan Sykes
b8c7ad4ad1 fix: let list pane shrink in stacked layout so settings can scroll in mid-width windows 2026-07-03 06:05:16 +08:00
Jonathan Sykes
ed9f93b0b7 fix: stop playback stutter and save failures via async yt-dlp, per-download OPFS workers, lazy playback blobs, GPU composite trims, and landscape pane scrolling 2026-07-02 23:40:49 +08:00
Jonathan Sykes
2af2eebacc feat: redesign portrait PWA as mobile app UI with thumb-zone transport, bottom-sheet modals, and floating mini-player 2026-07-02 22:38:14 +08:00
Claude Worker
2b195d3b6b feat: add topbar adjustments for notch devices on pwa
Task #47 completed by ClaudeQueue

ClaudeQueue
2026-06-30 20:45:00 +00:00
Jonathan Sykes
79359dba44 feat: show app version and server build tag in settings
Adds an About section at the bottom of Settings displaying the app
version. In WEB mode it fetches /api/version and appends the live
server build tag so you can confirm which deploy is running.
2026-07-01 04:04:15 +08:00