Commit Graph

169 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
041fc6a974 feat: add Reset UI section in settings (force refresh + full reset app) 2026-07-01 01:18:45 +08:00
Jonathan Sykes
6738644d4b feat: poll /api/version buildTag to detect new deploys and prompt reload
Server stamps a BUILD_TAG (stable per process, changes on restart/deploy)
into GET /api/version alongside the existing version string. Cache-Control
is set to no-store so the response is never cached by the SW or browser.

Client (WEB mode only) baselines the tag on first fetch after boot, then
rechecks every 5 minutes. On mismatch it calls the existing showUpdateBanner()
so the user sees the 'Update ready — Reload now' toast and can reload at will.

This mirrors the build-id polling pattern used across the BukidBountyApp
derivatives to avoid stale UI after deploys.
2026-07-01 01:13:37 +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
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