/** * Smart preloading service for upcoming tracks * Automatically queues downloads for the next few tracks in the queue * * TRACES: UR-004, UR-011 | DR-006, DR-015 */ import { commands } from '$lib/api/bindings'; import type { CacheConfig } from '$lib/api/bindings'; import { auth } from '$lib/stores/auth'; interface PreloadOptions { /** Enable debug logging */ debug?: boolean; /** Override user ID (defaults to current session user) */ userId?: string; } /** * Trigger preloading for upcoming tracks in the queue * This should be called after playback starts or advances to the next track */ export async function preloadUpcomingTracks(options: PreloadOptions = {}): Promise { const { debug = false, userId: overrideUserId } = options; try { // Get current user ID const userId = overrideUserId || auth.getUserId(); if (!userId) { if (debug) console.log('[Preload] No active user session, skipping preload'); return; } if (debug) console.log('[Preload] Triggering preload for user:', userId); // downloadBasePath is currently unused in the backend const result = await commands.playerPreloadUpcoming(userId, '/downloads'); if (debug) { console.log('[Preload] Result:', { queued: result.queuedCount, alreadyDownloaded: result.alreadyDownloaded, skipped: result.skipped }); } // Log meaningful results if (result.queuedCount > 0) { console.log(`[Preload] Queued ${result.queuedCount} track(s) for background download`); } } catch (error) { // Fail silently - preloading is a background optimization // Don't interrupt the user's playback experience console.warn('[Preload] Failed to preload upcoming tracks:', error); } } /** * Update smart cache configuration */ export async function updateCacheConfig(config: CacheConfig): Promise { await commands.playerSetCacheConfig(config); } /** * Get current cache configuration */ export async function getCacheConfig(): Promise { return await commands.playerGetCacheConfig(); }