- SearchMedia 响应字段在 item.Video 嵌套对象中,修正字段映射 - endpoint 自动补充 https:// 协议前缀 - 移除状态筛选与日期范围筛选(VOD SearchMedia Match 语法不支持)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}>
|
||||||
查询
|
查询
|
||||||
|
|||||||
Reference in New Issue
Block a user