fix: 修复真实 VOD API 联调问题并移除不支持的筛选条件
CI / lint-and-build (push) Has been cancelled

- SearchMedia 响应字段在 item.Video 嵌套对象中,修正字段映射

- endpoint 自动补充 https:// 协议前缀

- 移除状态筛选与日期范围筛选(VOD SearchMedia Match 语法不支持)
This commit is contained in:
2026-06-29 18:05:17 +06:00
parent 6cb319a215
commit 0e78aa641b
3 changed files with 25 additions and 51 deletions
+25 -29
View File
@@ -5,11 +5,8 @@ import { decrypt } from '../utils/crypto';
export interface SearchParams { export interface SearchParams {
keyword?: string; keyword?: string;
cateId?: number; cateId?: number;
status?: string;
pageNo?: number; pageNo?: number;
pageSize?: number; pageSize?: number;
startTime?: string;
endTime?: string;
sortBy?: string; sortBy?: string;
sortOrder?: 'Asc' | 'Desc'; sortOrder?: 'Asc' | 'Desc';
} }
@@ -22,7 +19,10 @@ export interface SearchResult {
} }
export function createVodClient(account: Account): RPCClient { export function createVodClient(account: Account): RPCClient {
const endpoint = account.endpoint || `vod.${account.region}.aliyuncs.com`; let endpoint = account.endpoint || `vod.${account.region}.aliyuncs.com`;
if (!endpoint.startsWith('http://') && !endpoint.startsWith('https://')) {
endpoint = `https://${endpoint}`;
}
return new RPCClient({ return new RPCClient({
accessKeyId: account.accessKeyId, accessKeyId: account.accessKeyId,
accessKeySecret: decrypt(account.accessKeySecret), accessKeySecret: decrypt(account.accessKeySecret),
@@ -35,6 +35,10 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom
const requestParams: Record<string, unknown> = { const requestParams: Record<string, unknown> = {
PageNo: params.pageNo || 1, PageNo: params.pageNo || 1,
PageSize: Math.min(params.pageSize || 20, 100), PageSize: Math.min(params.pageSize || 20, 100),
SearchType: 'video',
Fields: 'Title,CoverURL,CreationTime,Status,Duration,Size,CateId,CateName,Tags',
SortBy: params.sortBy || 'CreationTime',
SortOrder: params.sortOrder || 'Desc',
}; };
const searchParams: string[] = []; const searchParams: string[] = [];
@@ -44,20 +48,9 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom
if (params.cateId) { if (params.cateId) {
searchParams.push(`CateId=${params.cateId}`); searchParams.push(`CateId=${params.cateId}`);
} }
if (params.status) {
searchParams.push(`Status='${params.status}'`);
}
if (params.startTime && params.endTime) {
searchParams.push(`CreationTime>${params.startTime}`);
searchParams.push(`CreationTime<${params.endTime}`);
}
if (searchParams.length > 0) { if (searchParams.length > 0) {
requestParams.SearchType = 'video';
requestParams.Fields = 'Title,CoverURL,CreationTime,Status,Duration,Size,CateId,CateName,Tags';
requestParams.Match = searchParams.join(' and '); requestParams.Match = searchParams.join(' and ');
requestParams.SortBy = params.sortBy || 'CreationTime';
requestParams.SortOrder = params.sortOrder || 'Desc';
} }
const action = 'SearchMedia'; const action = 'SearchMedia';
@@ -67,20 +60,23 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom
>; >;
const mediaListRaw = (response.MediaList as Record<string, unknown>[]) || []; const mediaListRaw = (response.MediaList as Record<string, unknown>[]) || [];
const mediaList = mediaListRaw.map((item) => ({ const mediaList = mediaListRaw.map((item) => {
videoId: (item.VideoId || item.MediaId) as string, const video = (item.Video as Record<string, unknown>) || {};
title: item.Title as string, return {
description: item.Description as string, videoId: (video.VideoId || item.MediaId) as string,
duration: item.Duration as number, title: video.Title as string,
size: item.Size as number, description: video.Description as string,
coverURL: item.CoverURL as string, duration: video.Duration as number,
status: item.Status as string, size: video.Size as number,
cateId: item.CateId as number, coverURL: video.CoverURL as string,
cateName: item.CateName as string, status: video.Status as string,
tags: item.Tags as string, cateId: video.CateId as number,
creationTime: item.CreationTime as string, cateName: video.CateName as string,
modificationTime: item.ModificationTime as string, tags: video.Tags as string,
})); creationTime: (video.CreationTime || item.CreationTime) as string,
modificationTime: video.ModificationTime as string,
};
});
return { return {
total: (response.Total as number) || 0, total: (response.Total as number) || 0,
-3
View File
@@ -26,11 +26,8 @@ export interface PlayInfo {
export interface SearchParams { export interface SearchParams {
keyword?: string; keyword?: string;
cateId?: number; cateId?: number;
status?: string;
pageNo?: number; pageNo?: number;
pageSize?: number; pageSize?: number;
startTime?: string;
endTime?: string;
sortBy?: string; sortBy?: string;
sortOrder?: 'Asc' | 'Desc'; sortOrder?: 'Asc' | 'Desc';
} }
-19
View File
@@ -6,7 +6,6 @@ import {
Space, Space,
Form, Form,
Select, Select,
DatePicker,
message, message,
Modal, Modal,
Drawer, Drawer,
@@ -21,7 +20,6 @@ import { searchVideos, batchDelete, batchDownload, VideoItem, DownloadResult } f
import { listCategories } from '../api/categories'; import { listCategories } from '../api/categories';
import { useAuthStore } from '../store/auth'; import { useAuthStore } from '../store/auth';
const { RangePicker } = DatePicker;
const { Text } = Typography; const { Text } = Typography;
const formatDuration = (seconds?: number) => { const formatDuration = (seconds?: number) => {
@@ -68,11 +66,6 @@ export default function VideosPage() {
if (values.keyword) query.keyword = values.keyword; if (values.keyword) query.keyword = values.keyword;
if (values.cateId) query.cateId = values.cateId; if (values.cateId) query.cateId = values.cateId;
if (values.status) query.status = values.status;
if (values.dateRange?.[0] && values.dateRange?.[1]) {
query.startTime = values.dateRange[0].toISOString();
query.endTime = values.dateRange[1].toISOString();
}
const result = await searchVideos(query); const result = await searchVideos(query);
setVideos(result.videos); setVideos(result.videos);
@@ -230,18 +223,6 @@ export default function VideosPage() {
))} ))}
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item name="status">
<Select placeholder="状态" allowClear style={{ width: 120 }}>
<Select.Option value="Normal"></Select.Option>
<Select.Option value="Uploading"></Select.Option>
<Select.Option value="Transcoding"></Select.Option>
<Select.Option value="Checking"></Select.Option>
<Select.Option value="Blocked"></Select.Option>
</Select>
</Form.Item>
<Form.Item name="dateRange">
<RangePicker showTime />
</Form.Item>
<Form.Item> <Form.Item>
<Button type="primary" onClick={handleSearch}> <Button type="primary" onClick={handleSearch}>