Playing an undownloaded episode "did nothing": while the background warmup cache
is active (≈always), shouldDeferToOfflineCacheUI suppressed every
"Downloading…/not downloaded" banner — so the offline "not downloaded" message
and the stream-mode on-demand download both ran invisibly, looking frozen.
- ensureLocalCopies now always sets actionMessage for the on-demand playback
fetch (it's the user's own play action, not the warmup) instead of deferring.
- LibraryView no longer filters those messages (it has no separate download UI;
PlayerView keeps its suppression since it has a dedicated dock strip).
- awaitDownload reports live progress via onStatus, so a stream-mode fetch that
routes through the priority lane (behind the warmup) shows a moving
"Downloading <ep> to play… N%" banner instead of going silent after "Prioritized".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On-demand downloads (e.g. goon clips picked in the Adult collection list) now
take priority over the background warmup plan instead of waiting behind it or
starting a competing rsync:
- new priority lane (priorityEpisodes/priorityCount/enqueuePriority) drained
before each plan item and immediately when the cache is idle
- fetchFile routes through the lane when a warmup is already running (was: a
second concurrent rsync that also stomped the queue UI), and awaits completion
- per-episode fetch extracted to fetchOne(), shared by plan + priority drains
- status line shows '⤴︎N prioritized'; prioritizeFetch()/awaitDownload() expose
it for callers
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Surface the existing pin (keep-from-cull) and per-file delete actions as
visible inline buttons on each offline cache row instead of context-menu-only:
a star toggles protection from auto-cull (and restore-if-missing), a trash
culls that file early. Aligns wording/icons to the star metaphor.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>