Add File
This commit is contained in:
117
src/elderly/services/mediaService.ts
Normal file
117
src/elderly/services/mediaService.ts
Normal file
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* 老人端媒体服务
|
||||
* 负责获取推荐媒体、记录播放、提交反馈
|
||||
*/
|
||||
|
||||
const API_BASE_URL = 'http://localhost:8000/api';
|
||||
|
||||
export interface RecommendedMedia {
|
||||
id: number;
|
||||
family_id: string;
|
||||
media_type: 'photo' | 'video';
|
||||
title: string;
|
||||
description?: string;
|
||||
file_path: string;
|
||||
thumbnail_path?: string;
|
||||
tags: string[];
|
||||
time_windows: string[];
|
||||
moods: string[];
|
||||
occasions: string[];
|
||||
cooldown: number;
|
||||
priority: number;
|
||||
play_count: number;
|
||||
last_played_at?: string;
|
||||
}
|
||||
|
||||
export interface PlayRecordParams {
|
||||
elderly_id: number;
|
||||
duration_watched?: number;
|
||||
completed?: number;
|
||||
triggered_by?: 'auto' | 'manual' | 'mood';
|
||||
mood_before?: string;
|
||||
mood_after?: string;
|
||||
}
|
||||
|
||||
export interface FeedbackParams {
|
||||
elderly_id: number;
|
||||
feedback_type: 'like' | 'dislike';
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取推荐媒体
|
||||
*/
|
||||
export async function getRecommendedMedia(
|
||||
familyId: string,
|
||||
elderlyId: number,
|
||||
mood?: string,
|
||||
occasion?: string
|
||||
): Promise<RecommendedMedia[]> {
|
||||
const params = new URLSearchParams({
|
||||
family_id: familyId,
|
||||
elderly_id: elderlyId.toString(),
|
||||
});
|
||||
|
||||
if (mood) params.append('mood', mood);
|
||||
if (occasion) params.append('occasion', occasion);
|
||||
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/media/recommended?${params}`);
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
throw new Error(error.error || '获取推荐媒体失败');
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return data.media;
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录媒体播放
|
||||
*/
|
||||
export async function recordMediaPlay(mediaId: number, params: PlayRecordParams): Promise<void> {
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/media/${mediaId}/play`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(params),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
throw new Error(error.error || '记录播放失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交媒体反馈
|
||||
*/
|
||||
export async function submitFeedback(mediaId: number, params: FeedbackParams): Promise<void> {
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/media/${mediaId}/feedback`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(params),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
throw new Error(error.error || '提交反馈失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件URL(用于前端显示)
|
||||
*/
|
||||
export function getMediaUrl(filePath: string): string {
|
||||
// 将服务器文件路径转换为可访问的URL
|
||||
return `http://localhost:8000/uploads/${filePath.split(/[/\\]/).pop()}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缩略图URL
|
||||
*/
|
||||
export function getThumbnailUrl(thumbnailPath: string): string {
|
||||
return `http://localhost:8000/uploads/thumbnails/${thumbnailPath.split(/[/\\]/).pop()}`;
|
||||
}
|
||||
Reference in New Issue
Block a user