Commit Graph

56 Commits

Author SHA1 Message Date
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
Jonathan Sykes
30a05d3ebd fix: make sidebar scroll as one unit so playlists stay reachable on short screens
The sidebar contained two .playlist-list blocks each with flex:1 and its own
overflow-y:auto, nested inside the sidebar's own scroll. On screens too short
to fit everything, those inner flex regions collapsed toward zero height and
the playlists became unreachable. Drop the inner scroll/flex-grow and let the
whole sidebar scroll as a single unit at any screen size.
2026-07-01 03:58:52 +08:00
Claude Worker
d9371fdea4 feat: fix portrait mode design in pwa — YouTube-style bottom bar
Task #46 completed by ClaudeQueue

ClaudeQueue
2026-06-30 17:02:25 +00:00
Claude Worker
fc61defba5 feat: fix portrait mode design in pwa
Task #44 completed by ClaudeQueue

ClaudeQueue
2026-06-30 15:36:12 +00:00
Claude Worker
136e21f1fa feat: Follow-up: add portrait orientation design for mobile that only triggers in portrait pwa mode
Task #43 completed by ClaudeQueue

ClaudeQueue
2026-06-30 08:01:54 +00:00
Claude Worker
02153d877d feat: add portrait orientation design for mobile that only triggers in portrait pwa mode
Task #42 completed by ClaudeQueue

ClaudeQueue
2026-06-30 06:51:31 +00:00
ClaudeQueue
05e78677b0 feat: side bar playlist and other items not present on some screensizes. make completely responsive
Task #40 completed by ClaudeQueue

ClaudeQueue
2026-06-30 01:06:54 +00:00
Jonathan Sykes
84d6487125 feat: wire up WEB-mode OPFS offline cache for PWA
The PWA conversion shipped sw.js, opfs.js, manifest and icons, but app.js
was never updated to use them — it still routed cache_* calls through the
native bridge (call('cache.list', ...)), which throws 'No native bridge
available' in a browser. That surfaced as 'Offline cache unavailable /
not available in this build' on the Saved videos and Settings pages.

- Add WEB mode detection (no Tauri/zero bridge present)
- Route cache_* through OPFS (opfsDownload/Status/List/Delete/Clear)
- Proxy downloads via /api/download so the browser never hits YouTube CDN
- Load fingerprint.js + opfs.js; add manifest link and PWA meta tags
- Relax CSP to allow blob: media/img and worker-src 'self' for the SW
2026-06-30 08:37:45 +08:00
Jonathan Sykes
fea26fd435 feat: make channel names clickable in related, up-next, and mini-bar 2026-06-21 21:13:44 +08:00
Jonathan Sykes
20cd2f29ba feat: sleep timer, A-B loop, related panel, smart playlists, history delete/search, batch ops, auto-backup 2026-06-21 18:43:26 +08:00
Jonathan Sykes
3ad2e40606 Refresh Windows release artifacts and sync build outputs 2026-06-21 16:15:30 +08:00
Jonathan Sykes
38511fa450 feat: queue, channel view, downloads/saved pages, repeat/loop, accessibility, perf, multithreading 2026-06-21 15:39:58 +08:00
Jonathan Sykes
c1855a1a91 Add persistent mini now-playing bar
Fixed bar at bottom of window when video is playing. Shows title,
channel, progress, play/pause toggle. Click to restore player view.

Files:
- frontend/index.html: mini-bar markup
- frontend/app.js: showMiniBar/hideMiniBar/updateMiniBar, wiring
- frontend/styles.css: .mini-bar, .mini-bar-inner, .mini-progress styles
2026-06-14 15:18:57 +08:00
Jonathan Sykes
4376cd9e88 Add up-next queue panel
Shows upcoming videos in the autoplay queue below now-playing meta.
Clickable to jump to any video. Hidden when queue has 1 item or empty.
Updates on playFromList, playNext, playPrev. Hidden in empty player state.

Files:
- frontend/index.html: upnext section in player pane
- frontend/app.js: renderUpNext(), wired into playFromList/playNext/playPrev
- frontend/styles.css: .upnext, .upnext-item, .upnext-list styles
2026-06-14 14:44:52 +08:00
Jonathan Sykes
0ba0f56a54 Add drag-to-reorder within playlists
Cards in playlist view are draggable. Visual feedback: opacity on
source card, accent border on drop target. Reorder persists to store.

Files:
- frontend/app.js: dragSource state, drag/drop handlers on cards,
  container-level dragover guard in wireUI
- frontend/styles.css: .card.dragging, .card.drag-over styles
2026-06-14 14:41:05 +08:00
Jonathan Sykes
a4d6b825d5 Replace single toast with stacked toast queue
Multiple toasts can appear simultaneously, capped at 3. Oldest
toast auto-evicts when cap is reached. Each toast auto-dismisses
with a fade-up exit animation.

- frontend/app.js: toast() now creates DOM elements in toastContainer
- frontend/index.html: single #toast replaced with #toastContainer
- frontend/styles.css: .toast-container flexbox row, .toast-exit animation
2026-06-14 14:36:07 +08:00
Jonathan Sykes
81aced9bc5 Add download progress bar on card thumbnails
Replaces pulse-only state with a visible progress bar animation:
- Indeterminate bar slides across the bottom of card thumbnails during download
- markCardCacheState dynamically adds/removes the bar element
- renderCard includes the bar for newly rendered downloading cards
- Now-playing button already showed '⏳ Saving…' state

Files:
- frontend/app.js: dl-progress in renderCard, markCardCacheState dynamic bar
- frontend/styles.css: .dl-progress, .dl-bar with dlSlide animation
2026-06-14 14:23:52 +08:00