80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
// 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<string, FetchRequest>();
|
|
|
|
// 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<FetchRequest>): 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<void> {
|
|
// Stub - to be implemented
|
|
console.log(`[ytdlp] Would download: ${request.url} to ${musicDir}`);
|
|
updateRequest(request.id, { status: "error", error: "Not implemented yet" });
|
|
}
|