Files
mediaproc/ui/timeline/src/api.ts
2026-02-06 09:06:10 -03:00

87 lines
1.8 KiB
TypeScript

/**
* API client for FastAPI backend
*/
import type {
MediaAsset,
TranscodePreset,
TranscodeJob,
CreateJobRequest,
SystemStatus,
WorkerStatus,
} from "./types";
const API_BASE = "/api";
async function request<T>(path: string, options?: RequestInit): Promise<T> {
const response = await fetch(`${API_BASE}${path}`, {
headers: {
"Content-Type": "application/json",
},
...options,
});
if (!response.ok) {
const error = await response.text();
throw new Error(`API error: ${response.status} - ${error}`);
}
return response.json();
}
// Assets
export async function getAssets(): Promise<MediaAsset[]> {
return request("/assets/");
}
export async function getAsset(id: string): Promise<MediaAsset> {
return request(`/assets/${id}`);
}
export async function scanMediaFolder(): Promise<{
found: number;
registered: number;
skipped: number;
files: string[];
}> {
return request("/assets/scan", {
method: "POST",
});
}
// Presets
export async function getPresets(): Promise<TranscodePreset[]> {
return request("/presets/");
}
// Jobs
export async function getJobs(): Promise<TranscodeJob[]> {
return request("/jobs/");
}
export async function getJob(id: string): Promise<TranscodeJob> {
return request(`/jobs/${id}`);
}
export async function createJob(data: CreateJobRequest): Promise<TranscodeJob> {
return request("/jobs/", {
method: "POST",
body: JSON.stringify(data),
});
}
export async function cancelJob(id: string): Promise<TranscodeJob> {
return request(`/jobs/${id}/cancel`, {
method: "POST",
});
}
// System
export async function getSystemStatus(): Promise<SystemStatus> {
return request("/system/status");
}
export async function getWorkerStatus(): Promise<WorkerStatus> {
return request("/system/worker");
}