Jonathan Sykes
91dab289c3
Show the update banner only when the running build differs from the server and make Refresh UI land the new shell on flaky links
2026-09-13 17:42:50 +08:00
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
3e1b56610f
Let a shared playlist be sent to another user by name
2026-09-08 15:52:46 +08:00
Jonathan Sykes
06f80debc0
Prefer h264 formats for saves so cached copies play on every device
2026-09-01 07:02:57 +08:00
Jonathan Sykes
d073d20060
Retry yt-dlp against alternate player clients when YouTube demands sign-in
2026-08-27 07:22:02 +08:00
Jonathan Sykes
94fff8f862
Report live streams as unsupported instead of an empty quality list
2026-08-24 01:07:18 +08:00
Jonathan Sykes
c141959654
Serialize saves, disable idle timeout, cap savable length at 3h
2026-08-24 00:21:18 +08:00
Jonathan Sykes
04c419d151
Coalesce save downloads, kill them on disconnect, refuse live and over-long videos
2026-08-23 23:50:10 +08:00
Jonathan Sykes
ea9e372c1e
Rate-limit save downloads so they no longer starve playback
2026-08-23 23:13:45 +08:00
Jonathan Sykes
d1ba9d1e9c
Fix play proxy cancel crashing the server on client disconnect
2026-08-23 22:54:31 +08:00
Jonathan Sykes
8177f5c665
Chunk playback proxy at 10MB and merge adaptive streams for saves
2026-08-23 15:43:01 +08:00
Jonathan Sykes
c8a9755e93
Restrict playback proxy to direct https streams, prefer adaptive
...
Newer yt-dlp surfaces HLS (m3u8) and DASH-segment formats whose url is a
manifest, not media bytes; proxying those served the video element an
unplayable m3u8 and broke Range seeking (416). Keep only protocol=https
formats, and prefer adaptive video-only streams (paired with the separate
audio) over progressive muxed formats, which are more reliable.
2026-08-23 15:15:02 +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
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
Claude Worker
8c0776f97d
feat: Add support for editing video
...
Add an Edit
2026-07-18 16:43:15 +00:00
Jonathan Sykes
70b5214ce8
fix intermittent 403 on video save by letting yt-dlp fetch the stream itself
2026-07-11 00:45:37 +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
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
4a18990058
fix: inject BUILD_TAG into sw.js via regex so a fallback bump cannot freeze the SW version
2026-07-02 21:07:22 +08:00
Jonathan Sykes
6039dc80c1
fix: hash every served frontend file into the build tag so any shell change busts caches
2026-07-02 13:40:36 +08:00
Claude Worker
18ad8152bf
feat: fix repetitive update available prompt
...
Task #58 completed by ClaudeQueue
ClaudeQueue
2026-07-01 06:37:12 +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
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
Jonathan Sykes
4efa1d1182
feat: convert to PWA — OPFS storage, service worker, Bun/Hono server
...
- Move native shells (Zig/src, Tauri/src-tauri, app.zon, releases) to legacy/
- Add Bun + Hono server with yt-dlp proxy endpoints (search, channel, streams,
download), libsql (concurrent SQLite fork) for fingerprint-keyed playlist/
history sync, and static file serving for the frontend
- Add Dockerfile + docker-compose.yml (single container, volume-mounted DB)
- Add frontend/sw.js: app-shell cache-first, /api/* network-only,
thumbnails stale-while-revalidate, SW_UPDATE_AVAILABLE broadcast,
SKIP_WAITING message handler for seamless auto-update
- Add frontend/manifest.webmanifest: standalone PWA, vermilion theme,
search/history shortcuts
- Add frontend/icons/icon-{192,512}.png: generated PWA icons
- Add frontend/fingerprint.js: canvas+UA djb2 fingerprint, localStorage-cached,
exposes window.getFingerprint() for server-side playlist keying
- Add frontend/opfs.js: full OPFS video store (writeFromResponse streams
directly without full-file buffering), exposes window.OPFS
- Add scripts/make-pwa-icons.js: regenerate icons without external deps
- Patch frontend/app.js: WEB mode detection, webFetch + opfs* bridge wrappers,
API object routes to WEB helpers when no native bridge present,
Player.loadVideo handles OPFS blob URLs + revokes them on next load,
SW registration + update banner in boot()
- Patch frontend/index.html: manifest link, theme-color, Apple PWA meta,
CSP blob:/worker-src, fingerprint.js + opfs.js script tags
- Patch frontend/styles.css: .toast-update + .toast-reload-btn for update banner
- Native Tauri/Zig builds unchanged — all new code is additive via WEB flag
2026-06-30 06:43:23 +08:00