Commit Graph

114 Commits

Author SHA1 Message Date
Jonathan Sykes
69704d3e1a Profile recovery: Discord webhook as a reset-code channel 2026-10-15 17:46:21 +08:00
Jonathan Sykes
ca47528581 Protected profiles: recovery email and Discord contacts with reset codes (Gmail SMTP, Discord relay) 2026-10-15 17:28:10 +08:00
Jonathan Sykes
dbcee5d5f8 Deep search: pass the database client, not the db module, so start/jobs/estimate stop returning 500 2026-10-15 16:41:25 +08:00
Jonathan Sykes
7ceefa3d6a Admin login: ignore surrounding spaces/quotes in a pasted password; show-password toggle 2026-10-15 11:52:41 +08:00
Jonathan Sykes
b6e019c352 Catalog collection reads gzipped search responses; admin lyrics jobs resume once their table exists 2026-10-15 11:46:25 +08:00
Jonathan Sykes
59871a5b88 Merge codex/admin-ops: editor redesign, deep search, admin tools and ops 2026-10-15 11:42:07 +08:00
Jonathan Sykes
5c94a7d46a Search: answer on the first YouTube page, fill the rest in background; never cache empty results; gzip search JSON 2026-10-15 10:30:20 +08:00
Jonathan Sykes
c242641b2d iPhone: stop rate-slewing the video for sync; add playback telemetry beacon 2026-10-14 08:31:38 +08:00
Jonathan Sykes
27c694901d Add upload library management and ops diagnostics 2026-10-14 03:09:12 +08:00
Jonathan Sykes
5177a4d441 Add device diagnostics and P2P access controls 2026-10-14 02:45:33 +08:00
Jonathan Sykes
e9a597c415 Add live server performance monitoring 2026-10-14 02:43:20 +08:00
Jonathan Sykes
703aef617b Add resumable bulk lyrics operations 2026-10-14 02:36:30 +08:00
Jonathan Sykes
11b10e38e2 Add searchable lyrics index 2026-10-14 02:10:02 +08:00
Jonathan Sykes
e3821621f3 Add notes backup management 2026-10-14 02:06:33 +08:00
Jonathan Sykes
efac16ddaa Add song-level report triage 2026-10-14 02:04:02 +08:00
Jonathan Sykes
34b1173ea6 Add searchable index health and repair tools 2026-10-14 02:02:07 +08:00
Jonathan Sykes
42c68609ec Add cache pinning and health controls 2026-10-14 01:59:23 +08:00
Jonathan Sykes
180a28d3e4 Add a paged lyrics quality queue 2026-10-14 01:56:53 +08:00
Jonathan Sykes
301fab335f Add searchable admin audit history 2026-10-14 01:54:08 +08:00
Jonathan Sykes
58d0e6f140 Add resumable admin deep search 2026-10-14 01:47:35 +08:00
Jonathan Sykes
ca10fe6486 Refetch missing media from catalog source 2026-10-14 01:26:25 +08:00
Jonathan Sykes
593ecaecd9 Extend video catalog source metadata 2026-10-14 01:22:32 +08:00
Jonathan Sykes
d027696d4e Merge manifest hygiene and reconcile runtime exclusions with CSP response capture 2026-10-09 15:12:39 +08:00
Jonathan Sykes
8a4144eb00 Document runtime exclusions and verify offline transfer savings 2026-10-09 14:56:31 +08:00
Jonathan Sykes
dd09f66578 Separate runtime manifest inputs from directly served files 2026-10-09 14:40:46 +08:00
Jonathan Sykes
a86fa1cebe Cache the page-owned app response before starting the worker 2026-10-08 09:04:20 +08:00
Jonathan Sykes
e7a7cdc6b9 Preload classic layout CSS before the blocking head loader 2026-10-08 08:50:51 +08:00
Jonathan Sykes
5d6a1545df Load layouts and optional features from staged asset caches 2026-10-08 01:29:50 +08:00
Jonathan Sykes
d98d444552 Embed build-local asset groups in stamped indexes 2026-10-08 00:50:18 +08:00
Jonathan Sykes
bb446c717f Keep single-tag rollback on the legacy worker path 2026-10-07 23:58:29 +08:00
Jonathan Sykes
54a07a0a2a Synchronize verified assets incrementally and guard update activation 2026-10-07 23:40:20 +08:00
Jonathan Sykes
d18d17cf29 Preserve legacy cache rules and pin service worker bytes at boot 2026-10-07 23:01:55 +08:00
Jonathan Sykes
6cb00d5073 Add per-file asset hashes and a rollback-compatible server manifest 2026-10-07 22:57:41 +08:00
Jonathan Sykes
b6dd2be40f Add server characterization tests for build tag, index stamping and cache headers 2026-10-07 03:28:45 +08:00
Jonathan Sykes
b77938ab4a Queue bounded stream prewarm requests 2026-10-07 03:13:30 +08:00
Jonathan Sykes
2042c9b6fc Recover related videos with bounded discovery and retryable fallbacks 2026-10-04 02:42:02 +08:00
Jonathan Sykes
c6074bdbc5 Load the direct-transfer protocol from public/ inside the container image 2026-10-03 22:11:24 +08:00
Jonathan Sykes
d78b06ff4b Close unconfirmed transfer paths and reject binary signalling envelopes 2026-10-03 20:45:04 +08:00
Jonathan Sykes
795a5aaed4 Prefer direct copies for playback, saves and exports within verified device groups 2026-10-03 20:38:51 +08:00
Jonathan Sykes
88e2e67eeb Authorize direct file invitations within paired rooms and parties 2026-10-03 20:26:07 +08:00
Jonathan Sykes
f341b0c76e Restart failed saves through a guarded server retry 2026-10-03 19:16:08 +08:00
Jonathan Sykes
5485a3c2f4 Try alternate YouTube clients for unavailable save sources 2026-10-03 19:12:48 +08:00
Jonathan Sykes
856ddda6a6 Backfill device song metadata and queue guarded server caching 2026-10-03 17:55:49 +08:00
Jonathan Sykes
0374e19396 Add lazy piano transcription and optional leased server worker 2026-10-03 15:47:53 +08:00
Jonathan Sykes
d4354d220e Preserve and display bilingual and phonetic lyric cues 2026-10-03 15:20:52 +08:00
Jonathan Sykes
d7721045fb Add host-approved party suggestions and live upvotes 2026-10-03 14:52:10 +08:00
Jonathan Sykes
2b38717c05 Add admin analytics, metadata collection, and grouped lyric cues
Queue reviewable Whisper drafts from the song list and lyrics editor. Preserve line breaks within one timed cue across editing, saving, reporting, and service views.

Add storage and listening analytics with a durable metadata collector, related-search depth, video limits, thumbnail storage, and a browsable metadata library.
2026-10-03 07:55:33 +08:00
Jonathan Sykes
ea9e11d054 Loudness levelling (EBU R128, -14 LUFS) measured in the browser with WebAssembly
- frontend/wasm/loudness.c → loudness-wasm.js (1.5 KB, base64-embedded; built by
  scripts/build-loudness-wasm.sh with clang or Zig's clang): K-weighting + 100 ms
  energy steps. loudness.js does the 400 ms gating (abs -70 LUFS, rel -10 LU)
  with an identical JS fallback. EBU Tech 3341 sine cases measure -23.0/-33.0
  on both engines; a real track reads -21.7 vs ffmpeg ebur128 -21.8.
- The device measures from audio it already has (saved copy or the server
  cache's m4a sidecar, songs up to 12 min, decoded natively at 22.05 kHz) and
  reports the number to /api/loudness, so each song is measured once for
  everyone; the server stores numbers only, no audio processing.
- The EQ graph gains a level stage (gain -> limiter) that eases each track
  toward -14 LUFS (-12..+9 dB). Settings -> Playback -> Level volume: on by
  default on Android/desktop, opt-in on iPhone (Web Audio stops sound when the
  screen locks there).
2026-10-03 07:44:44 +08:00
Jonathan Sykes
5154ef5f75 Collect discovered video metadata and recommend videos from listening history 2026-10-03 07:16:51 +08:00
Jonathan Sykes
54fcd12119 YouTube chapters: extracted automatically, ticks on the seek bar and Glass scrubber, [ / ] to jump
- Server: chapters come from yt-dlp's `chapters` (creator chapters and
  description timestamps) whenever a video is resolved, kept in a yt_chapters
  table; GET /api/chapters?v= serves them (resolving once if needed, 30-day
  cache) so server-cached copies get them too. Never fails the player.
- Player: a video's shared chapters win; with none, YouTube's stand in —
  listed as "Chapters from YouTube", read-only (no edit/delete; + Chapter
  copies them into an editable list). They drive the existing seek-bar ticks
  (classic and Glass Stage), the chapter badge and the chapter list, and are
  cached offline with the video's notes.
- Keys: [ previous chapter (restarts the current one when >3 s in), ] next.
2026-10-03 03:52:50 +08:00