blastoise-archive/ytdlp.ts

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" });
}