Claude
04a74ab45d
Redesign service-mode controls and add per-profile wrong-lyric-line reports
2026-09-30 15:15:07 +00:00
Claude
84cd00368d
Add a P2P panel to the admin page
2026-09-30 08:02:52 +00:00
Claude
60a28fc593
Restore an evicted server copy from an online holder
2026-09-30 07:58:42 +00:00
Claude
8d57a654c1
Let a device hand a file to the server for hashing and validation
2026-09-30 07:50:38 +00:00
Claude
6fa930ad62
Add the /ws/p2p presence and signalling hub and the holders endpoint
2026-09-30 07:42:35 +00:00
Claude
c629ff5836
Register devices and report verified holdings to the server
2026-09-30 07:38:47 +00:00
Claude
eb3fe45761
Count views and evict server copies by retention criteria before LRU
2026-09-30 07:25:56 +00:00
Claude
ea56d286b3
Hash every validated server copy and register it as verified content
2026-09-30 07:18:52 +00:00
Claude
167df35a97
Add P2P tables, config flags and db helpers
2026-09-30 07:11:55 +00:00
Claude
9cac21afce
Keep one long-lived yt-dlp worker process instead of spawning per call
2026-09-30 07:04:53 +00:00
Claude
556436da34
Answer searches from YouTube InnerTube directly with yt-dlp fallback
2026-09-30 06:58:05 +00:00
Claude
b24366d6c0
Warm the stream cache for likely next plays
2026-09-30 06:53:48 +00:00
Claude
e2a60792b9
Coalesce concurrent resolveStreams calls for the same video
2026-09-30 06:50:31 +00:00
Claude
794410916a
Serve the app shell gzip/brotli-compressed with ETags
2026-09-30 06:45:11 +00:00
Claude
7781e0a116
Add startup, search and play timing marks plus yt-dlp duration logs
2026-09-30 06:41:50 +00:00
Claude
c17bd4c9ac
Queue executable speed and peer-to-peer sharing plans with tested patches and harnesses
2026-09-29 19:03:12 +00:00
Jonathan Sykes
6ff9f86bd8
cache /api/search results for 3 minutes to skip repeat yt-dlp spawns
2026-09-30 00:17:44 +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
e4ac04cb5c
Sample two short windows before re-encoding a cached video and skip the full encode when HEVC will not save 15 percent
2026-09-14 00:51:14 +08:00
Jonathan Sykes
8b0060d42a
Re-encode cached videos to HEVC when it saves at least 15 percent and serve them only to devices that can decode HEVC
2026-09-13 21:09:15 +08:00
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