multisense_df / app /frontend /src /api /client.js
vijay-2132's picture
Fix 422 error: move demo router off /analyze prefix, rebuild frontend
f7c1f80
Raw
History Blame Contribute Delete
2.49 kB
// src/api/client.js — API wrapper for MultiSense-DF backend
const API_BASE = import.meta.env.VITE_API_BASE || 'http://localhost:8000';
/**
* Mock results for demo mode
*/
export const DEMO_RESULTS = {
verdict: 'FAKE',
confidence: 0.923,
visual_score: 0.871,
audio_score: 0.956,
lipsync_score: 0.834,
contributions: { visual: 0.38, audio: 0.41, lipsync: 0.21 },
sync_profile: [
0.82, 0.79, 0.81, 0.23, 0.19, 0.21, 0.18, 0.76, 0.78, 0.72,
0.15, 0.14, 0.17, 0.13, 0.68, 0.71, 0.69, 0.22, 0.24, 0.19,
0.81, 0.83, 0.79, 0.14, 0.12, 0.16, 0.71, 0.73, 0.68, 0.21,
0.84, 0.82, 0.78, 0.17, 0.15, 0.19, 0.72, 0.74, 0.71, 0.23,
0.83, 0.81, 0.76, 0.18, 0.14, 0.21, 0.69, 0.73, 0.70, 0.25,
],
gradcam_image: null,
filename: 'demo_video.mp4',
};
/**
* Analyze a video file. Returns structured detection results.
* Throws if the request fails.
*/
export async function analyzeVideo(file, onProgress) {
const formData = new FormData();
formData.append('file', file);
// Simulate early-stage progress while uploading
onProgress && onProgress('uploading');
const response = await fetch(`${API_BASE}/analyze`, {
method: 'POST',
body: formData,
});
if (!response.ok) {
const errorText = await response.text().catch(() => 'Unknown server error');
throw new Error(`Server returned ${response.status}: ${errorText}`);
}
const data = await response.json();
return data;
}
/**
* Simulate analysis with demo data — fetches from /demo/fake if backend is up,
* otherwise falls back to the local DEMO_RESULTS mock.
*/
export async function runDemoAnalysis(onStepChange) {
const steps = [
{ key: 'frames', delay: 900 },
{ key: 'audio', delay: 900 },
{ key: 'lipsync', delay: 900 },
{ key: 'fusion', delay: 700 },
{ key: 'done', delay: 300 },
];
// Walk through visual progress steps
for (let i = 0; i < steps.length - 1; i++) {
onStepChange && onStepChange(steps[i].key);
await sleep(steps[i].delay);
}
// Try to get real demo data from backend, fall back to local mock
let result = DEMO_RESULTS;
try {
const res = await fetch(`${API_BASE}/demo/fake?filename=celeb_df_sample.mp4`);
if (res.ok) result = await res.json();
} catch (_) {
// backend not reachable — use local mock
}
onStepChange && onStepChange('done');
await sleep(300);
return result;
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}