# YT Player — Improvement Backlog The `/loop` works through this top-to-bottom, **one item per iteration**. Tick an item (`[x]`) only after it builds, verifies, and is committed + pushed. Add new ideas to the bottom as they come up. ## Build & verify protocol (every iteration) 1. Edit the **canonical source** in WSL (`~/development/personal/ytplayer`). 2. Sync changed files **individually** into `C:\ytbuild\ytplayer` — never `Copy-Item -Recurse` onto an existing dir (it nests as `frontend\frontend`). 3. `npx tauri build` in `C:\ytbuild\ytplayer`. 4. Launch with `--remote-debugging-port=922x` and verify via CDP/screenshot (retry the launch a few times — Smart App Control is intermittent). 5. **Only if it builds and verifies:** refresh `releases/`, commit (no AI attribution), `git push origin main`, then tick the item here. ## UX / polish - [x] Empty-state designs for empty playlists and empty history (match the new hero). - [x] Loading skeletons for search results instead of a bare "Searching…". - [x] Keyboard-shortcut help overlay (press `?`), listing space / arrows / f / m. - [x] Download/preload progress indicator on cards (percent or a bar, not just a pulse). - [x] Remember and restore the last playback position per video. - [x] Toast queue (stack multiple toasts instead of replacing). ## Features - [x] Drag-to-reorder videos within a playlist. - [x] "Up next" queue panel showing the autoplay queue. - [x] Persistent mini now-playing bar when browsing other views. - [x] Cache size cap in Settings (auto-evict oldest past a limit). - [x] Export / import playlists as JSON. - [x] More / trending quick-search chips on the hero, rotated. - [x] Share a single playlist by link, imported additively (never replaces). - [x] Bulk-import a YouTube playlist URL into a new playlist. - [x] Per-playlist "available offline" status + a keep-offline pin. - [x] Service mode: set-list view with a screen wake lock. - [x] Per-song notes (key / capo / arrangement cues) on playlist entries. ## Robustness - [ ] **Cookies jar for the YouTube bot gate (deferred 2026-08-27 — not being tackled yet).** `runYtdlpResilient()` already recovers from "Sign in to confirm you're not a bot" by retrying against `YTDLP_FALLBACK_CLIENTS`, so saves no longer fail. The residual cost: while the gate is active, `tv_simply`/`android_vr`/`mweb` typically expose only progressive itag 18, so those saves land at **360p instead of 720p** (`web_embedded` keeps the full adaptive ladder when it works). Fix would be to supply a Netscape cookies jar so the default client stays available: the server already honours `YTDLP_COOKIES=` when the file exists — what's missing is mounting the jar into the container (compose volume + env) and a refresh story for when the cookies expire. Only worth doing if 360p saves become noticeable in practice. - [x] Sanitize `video_id` in `cache_download` (reject path separators). - [x] Gate the embedded yt-dlp behind a build flag so debug builds compile faster. - [x] Surface yt-dlp extraction failures with a retry button. ## Done - [x] Empty-state designs for empty playlists and empty history (match the new hero). `460aaae` - [x] Loading skeletons for search results instead of a bare "Searching…". `da2ad27` - [x] Keyboard-shortcut help overlay (press `?`), listing space / arrows / f / m. `c676786` - [x] Download/preload progress indicator on cards (percent or a bar, not just a pulse). `81aced9` - [x] Remember and restore the last playback position per video. `ddfa149` - [x] Toast queue (stack multiple toasts instead of replacing). `a4d6b82` - [x] Drag-to-reorder videos within a playlist. `0ba0f56` - [x] "Up next" queue panel showing the autoplay queue. `4376cd9` - [x] Persistent mini now-playing bar when browsing other views. `c1855a1` - [x] Cache size cap in Settings (auto-evict oldest past a limit). `d15d902` - [x] Export / import playlists as JSON. `d15d902` - [x] More / trending quick-search chips on the hero, rotated. `c6b8dfc` - [x] Sanitize `video_id` in `cache_download` (reject path separators). `c6b8dfc` - [x] Gate the embedded yt-dlp behind a build flag so debug builds compile faster. `d15d902` - [x] Surface yt-dlp extraction failures with a retry button. `c6b8dfc` - [x] Share a single playlist by link, imported additively. `27b28f7` - [x] Bulk-import a YouTube playlist URL. `b868dab` - [x] Per-playlist offline status + keep-offline pin. `c5f4751` - [x] Service mode set-list view with screen wake lock. `14e1d8e` - [x] Per-song notes on playlist entries. `8ef16a8`