/** * 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'; import { createLogger } from '$lib/utils/logger'; const log = createLogger('Preload'); 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) log.debug('No active user session, skipping preload'); return; } if (debug) log.debug('Triggering preload for user:', userId); // downloadBasePath is currently unused in the backend const result = await commands.playerPreloadUpcoming(userId, '/downloads'); if (debug) { log.debug('Result:', { queued: result.queuedCount, alreadyDownloaded: result.alreadyDownloaded, skipped: result.skipped }); } // Log meaningful results if (result.queuedCount > 0) { log.debug(`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 log.warn('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(); }