// MusicRoom - yt-dlp integration module // Handles fetching audio from URLs via yt-dlp export interface FetchRequest { id: string; url: string; status: "pending" | "downloading" | "processing" | "complete" | "error"; progress: number; error?: string; filename?: string; createdAt: number; completedAt?: number; userId: number; } // In-memory store of active fetch requests const fetchRequests = new Map(); // Generate unique request ID function generateId(): string { return Math.random().toString(36).substring(2, 10); } // Get all requests for a user export function getUserRequests(userId: number): FetchRequest[] { return [...fetchRequests.values()].filter(r => r.userId === userId); } // Get request by ID export function getRequest(id: string): FetchRequest | undefined { return fetchRequests.get(id); } // Create a new fetch request export function createFetchRequest(url: string, userId: number): FetchRequest { const request: FetchRequest = { id: generateId(), url, status: "pending", progress: 0, createdAt: Date.now(), userId, }; fetchRequests.set(request.id, request); return request; } // Update request status export function updateRequest(id: string, updates: Partial): void { const request = fetchRequests.get(id); if (request) { Object.assign(request, updates); } } // Remove completed/failed requests older than given age (ms) export function cleanupOldRequests(maxAge: number = 3600000): void { const now = Date.now(); for (const [id, request] of fetchRequests) { if (request.status === "complete" || request.status === "error") { if (now - request.createdAt > maxAge) { fetchRequests.delete(id); } } } } // TODO: Implement actual yt-dlp download // This will: // 1. Spawn yt-dlp process with URL // 2. Parse progress output // 3. Update request status // 4. Move completed file to music directory // 5. Trigger library rescan export async function startDownload(request: FetchRequest, musicDir: string): Promise { // Stub - to be implemented console.log(`[ytdlp] Would download: ${request.url} to ${musicDir}`); updateRequest(request.id, { status: "error", error: "Not implemented yet" }); }