fix(player): minor hot-cache eviction, prefetch budget, and settings live size

Small fix for hot playback cache: eviction keeps current and next only;
prefetch up to five tracks when under cap, always fetch the immediate next;
grace for the previous current until debounce; run evict immediately on
MB or folder changes; re-read cap after download; optional Track.size;
live disk usage on Audio settings.
This commit is contained in:
Maxim Isaev
2026-04-11 03:29:59 +03:00
parent 20dabbfd03
commit b4c3124168
5 changed files with 205 additions and 25 deletions
+28
View File
@@ -1,6 +1,11 @@
/** When true, hot-cache prefetch must not start new downloads (playback has priority). */
let deferHotCachePrefetch = false;
/** Last track that was «current» before a forward queue step — not evicted until debounce elapses. */
let previousTrackGraceUntilMs = 0;
let previousTrackGraceTrackId: string | null = null;
let previousTrackGraceServerId: string | null = null;
export function setDeferHotCachePrefetch(v: boolean): void {
deferHotCachePrefetch = v;
}
@@ -8,3 +13,26 @@ export function setDeferHotCachePrefetch(v: boolean): void {
export function getDeferHotCachePrefetch(): boolean {
return deferHotCachePrefetch;
}
/** Call when `queueIndex` advances; the old current track stays eviction-safe for `debounceSec` (capped at 600 s). */
export function bumpHotCachePreviousTrackGrace(
trackId: string,
serverId: string,
debounceSec: number,
): void {
const sec = Number.isFinite(debounceSec) ? Math.min(600, Math.max(0, debounceSec)) : 0;
previousTrackGraceUntilMs = Date.now() + sec * 1000;
previousTrackGraceTrackId = trackId;
previousTrackGraceServerId = serverId;
}
export function isHotCachePreviousTrackUnderGrace(trackId: string, serverId: string): boolean {
if (!previousTrackGraceTrackId || Date.now() >= previousTrackGraceUntilMs) return false;
return previousTrackGraceTrackId === trackId && previousTrackGraceServerId === serverId;
}
export function clearHotCachePreviousGrace(): void {
previousTrackGraceUntilMs = 0;
previousTrackGraceTrackId = null;
previousTrackGraceServerId = null;
}