80 lines
2.3 KiB
TypeScript
80 lines
2.3 KiB
TypeScript
import axiosClient from '../axios/axios';
|
|
import { Video, PaginationParams } from '@/types';
|
|
|
|
/**
|
|
* Video Service
|
|
*/
|
|
export const videoService = {
|
|
/**
|
|
* Fetch all videos and transform them to match the Video interface
|
|
*/
|
|
getVideos: async (params?: PaginationParams): Promise<Video[]> => {
|
|
const skip = params?.skip ?? 0;
|
|
const limit = params?.limit ?? 100;
|
|
|
|
const response = await axiosClient.get<{
|
|
videos: Array<{
|
|
video_id: string;
|
|
status: string;
|
|
progress: number;
|
|
summary?: {
|
|
unique_defected_sign_board?: number;
|
|
unique_pothole?: number;
|
|
unique_road_crack?: number;
|
|
unique_damaged_road_marking?: number;
|
|
unique_good_sign_board?: number;
|
|
total_road_damage?: number;
|
|
total_detections?: number;
|
|
};
|
|
}>;
|
|
}>(`/videos`, {
|
|
params: { skip, limit },
|
|
});
|
|
|
|
// Transform the response to match our Video interface
|
|
return response.data.videos.map((v) => ({
|
|
id: v.video_id,
|
|
filename: v.video_id,
|
|
detection_type: 'pot-sign-detection' as const,
|
|
status: v.status as Video['status'],
|
|
unique_defected_sign_board: v.summary?.unique_defected_sign_board,
|
|
unique_pothole: v.summary?.unique_pothole,
|
|
unique_road_crack: v.summary?.unique_road_crack,
|
|
unique_damaged_road_marking: v.summary?.unique_damaged_road_marking,
|
|
unique_good_sign_board: v.summary?.unique_good_sign_board,
|
|
total_road_damage: v.summary?.total_road_damage,
|
|
total_detections: v.summary?.total_detections,
|
|
created_at: new Date().toISOString(),
|
|
updated_at: new Date().toISOString(),
|
|
}));
|
|
},
|
|
|
|
/**
|
|
* Upload a video for processing
|
|
*/
|
|
uploadVideo: async (formData: FormData): Promise<any> => {
|
|
const response = await axiosClient.post('/upload', formData, {
|
|
headers: {
|
|
'Content-Type': 'multipart/form-data',
|
|
},
|
|
});
|
|
return response.data;
|
|
},
|
|
|
|
/**
|
|
* Get processing status of a video
|
|
*/
|
|
getVideoStatus: async (videoId: string): Promise<any> => {
|
|
const response = await axiosClient.get(`/status/${videoId}`);
|
|
return response.data;
|
|
},
|
|
|
|
/**
|
|
* Get analysis results for a video
|
|
*/
|
|
getVideoResults: async (videoId: string): Promise<any> => {
|
|
const response = await axiosClient.get(`/results/${videoId}`);
|
|
return response.data;
|
|
},
|
|
};
|