Jonathan Sykes
5fb863ba25
Cache every played or saved video on the server via background jobs with a validation gate and a Broken re-download button
2026-09-13 09:45:01 +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
defc8a7f1a
Proxy YouTube playback through server to fix intermittent 403s
...
Direct googlevideo URLs are bound to the extractor's IP and expire, so the
browser fetching them from a different IP got intermittent 403s on playback.
Route playback through a same-origin /api/play proxy that fetches the stream
server-side (matching the extractor IP) with yt-dlp's own http_headers and
forwards Range headers for seeking; fall back to piping yt-dlp for SABR/itag-18
formats a plain GET can't fetch. Prefer adaptive streams over progressive in
the playback fallback order.
2026-08-23 15:04:18 +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
b868dabe27
Add bulk import of a YouTube playlist URL
2026-08-16 13:39:02 +00:00
Jonathan Sykes
27b28f767b
Add shareable single-playlist links with additive import
2026-08-16 13:32:18 +00:00
Jonathan Sykes
57413a07a1
Hide the list pane on the home view until the first search
2026-08-16 12:58:05 +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
49198ff239
Cache video thumbnails for offline use
2026-08-15 07:26:56 +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
6fff68884b
add per-song remember-position flag and playlist play-in-full mode
2026-07-14 15:15:11 +08: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
b72c079fb4
respect repeat settings when a-b loop reaches point b
2026-07-04 18:11:21 +08:00
Jonathan Sykes
327a67004d
Show build time in GMT+8 with 'built N ago' in Settings About
2026-07-04 12:49:41 +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
94140a5433
feat: add passkey-style online profiles for cross-device sync and show build time in About
2026-07-03 05:16:05 +08:00
Jonathan Sykes
048817bcf4
fix: fall back to copy when OPFS move() throws on WebKit and retry failed worker downloads on the main thread
2026-07-03 05:16:05 +08:00
Jonathan Sykes
76f8ec525d
feat: add opt-in save-before-playing setting backed by server-compiled single-file downloads
2026-07-03 00:07:50 +08:00
Jonathan Sykes
ba05f0dafe
fix: make audio the playback clock in dual mode so video rebuffering never pauses or seeks live audio; harden viewport anchor guard and add modal backdrop dismiss
2026-07-02 23:58:42 +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
Jonathan Sykes
722457312c
fix: re-anchor stray iOS layout-viewport scroll that broke nav taps
2026-07-02 21:48:31 +08:00
Jonathan Sykes
e6f032a6f2
feat: add shuffle toggle for upcoming tracks with S shortcut
2026-07-02 21:01:28 +08:00
Jonathan Sykes
dd71f6b2ab
fix: fetch and activate the new service worker on Refresh UI when none is waiting yet
2026-07-02 13:40:36 +08:00
Jonathan Sykes
f36f6aeee1
fix: only treat a waiting service worker as an update when a controller exists
2026-07-02 13:40:36 +08:00
Claude Worker
8018060d26
feat: update ready keeps showing even after updating
...
Task #61 completed by ClaudeQueue
ClaudeQueue
2026-07-01 17:40:50 +00:00
Claude Worker
42ff13b135
feat: audio playback issue
...
Task #60 completed by ClaudeQueue
ClaudeQueue
2026-07-01 07:26:33 +00:00
Claude Worker
395af38246
feat: update ready reloade stuck
...
Task #55 completed by ClaudeQueue
ClaudeQueue
2026-07-01 02:38:45 +00:00
Claude Worker
50cf655b71
feat: fullscreen video button not working in pwa mode
...
Task #52 completed by ClaudeQueue
ClaudeQueue
2026-07-01 02:18:50 +00:00
Claude Worker
ffeef5d520
feat: audio playback intermittent issue
...
Task #50 completed by ClaudeQueue
ClaudeQueue
2026-07-01 01:53:09 +00:00
Claude Worker
7cf3517dd3
feat: ensure ui automatically updates regardless of version number
...
Task #53 completed by ClaudeQueue
ClaudeQueue
2026-06-30 21:14:06 +00: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
d01f51a7d0
fix: send SKIP_WAITING to waiting SW, not active controller, to break reload loop
2026-07-01 04:43:33 +08:00
Jonathan Sykes
ebe60a7be2
fix: start next track at beginning (or A point) instead of resuming, and store A-B per playlist
...
When auto-advancing through a queue or playlist — or stepping with
next/prev — the next video previously jumped to its saved resume
timestamp. A freshly selected track now starts at the beginning, or at
the A marker when an A-B loop is set for it. Resuming still applies when
you reopen a single video directly.
A-B markers set while playing from a playlist are now stored on that
playlist's own copy of the video (entry.ab), so each playlist keeps its
own loop and the markers sync to the database alongside the playlist.
Non-playlist playback keeps using the global per-video marker map.
Bumps service worker to v1.0.3 to bust the client cache.
2026-07-01 04:29:00 +08: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