From 0e78aa641b812ec1195490b05a9b062266506d9f Mon Sep 17 00:00:00 2001 From: William Date: Mon, 29 Jun 2026 18:05:17 +0600 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=9C=9F=E5=AE=9E=20V?= =?UTF-8?q?OD=20API=20=E8=81=94=E8=B0=83=E9=97=AE=E9=A2=98=E5=B9=B6?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=8D=E6=94=AF=E6=8C=81=E7=9A=84=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SearchMedia 响应字段在 item.Video 嵌套对象中,修正字段映射 - endpoint 自动补充 https:// 协议前缀 - 移除状态筛选与日期范围筛选(VOD SearchMedia Match 语法不支持) --- apps/server/src/services/vod.ts | 54 +++++++++++++++------------------ apps/web/src/api/videos.ts | 3 -- apps/web/src/pages/Videos.tsx | 19 ------------ 3 files changed, 25 insertions(+), 51 deletions(-) diff --git a/apps/server/src/services/vod.ts b/apps/server/src/services/vod.ts index 4ecab76..6a9712c 100644 --- a/apps/server/src/services/vod.ts +++ b/apps/server/src/services/vod.ts @@ -5,11 +5,8 @@ import { decrypt } from '../utils/crypto'; export interface SearchParams { keyword?: string; cateId?: number; - status?: string; pageNo?: number; pageSize?: number; - startTime?: string; - endTime?: string; sortBy?: string; sortOrder?: 'Asc' | 'Desc'; } @@ -22,7 +19,10 @@ export interface SearchResult { } 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({ accessKeyId: account.accessKeyId, accessKeySecret: decrypt(account.accessKeySecret), @@ -35,6 +35,10 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom const requestParams: Record = { PageNo: params.pageNo || 1, 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[] = []; @@ -44,20 +48,9 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom if (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) { - requestParams.SearchType = 'video'; - requestParams.Fields = 'Title,CoverURL,CreationTime,Status,Duration,Size,CateId,CateName,Tags'; requestParams.Match = searchParams.join(' and '); - requestParams.SortBy = params.sortBy || 'CreationTime'; - requestParams.SortOrder = params.sortOrder || 'Desc'; } const action = 'SearchMedia'; @@ -67,20 +60,23 @@ export async function searchMedia(client: RPCClient, params: SearchParams): Prom >; const mediaListRaw = (response.MediaList as Record[]) || []; - const mediaList = mediaListRaw.map((item) => ({ - videoId: (item.VideoId || item.MediaId) as string, - title: item.Title as string, - description: item.Description as string, - duration: item.Duration as number, - size: item.Size as number, - coverURL: item.CoverURL as string, - status: item.Status as string, - cateId: item.CateId as number, - cateName: item.CateName as string, - tags: item.Tags as string, - creationTime: item.CreationTime as string, - modificationTime: item.ModificationTime as string, - })); + const mediaList = mediaListRaw.map((item) => { + const video = (item.Video as Record) || {}; + return { + videoId: (video.VideoId || item.MediaId) as string, + title: video.Title as string, + description: video.Description as string, + duration: video.Duration as number, + size: video.Size as number, + coverURL: video.CoverURL as string, + status: video.Status as string, + cateId: video.CateId as number, + cateName: video.CateName as string, + tags: video.Tags as string, + creationTime: (video.CreationTime || item.CreationTime) as string, + modificationTime: video.ModificationTime as string, + }; + }); return { total: (response.Total as number) || 0, diff --git a/apps/web/src/api/videos.ts b/apps/web/src/api/videos.ts index ef1f516..d97a12d 100644 --- a/apps/web/src/api/videos.ts +++ b/apps/web/src/api/videos.ts @@ -26,11 +26,8 @@ export interface PlayInfo { export interface SearchParams { keyword?: string; cateId?: number; - status?: string; pageNo?: number; pageSize?: number; - startTime?: string; - endTime?: string; sortBy?: string; sortOrder?: 'Asc' | 'Desc'; } diff --git a/apps/web/src/pages/Videos.tsx b/apps/web/src/pages/Videos.tsx index c72a6b8..bd0cf10 100644 --- a/apps/web/src/pages/Videos.tsx +++ b/apps/web/src/pages/Videos.tsx @@ -6,7 +6,6 @@ import { Space, Form, Select, - DatePicker, message, Modal, Drawer, @@ -21,7 +20,6 @@ import { searchVideos, batchDelete, batchDownload, VideoItem, DownloadResult } f import { listCategories } from '../api/categories'; import { useAuthStore } from '../store/auth'; -const { RangePicker } = DatePicker; const { Text } = Typography; const formatDuration = (seconds?: number) => { @@ -68,11 +66,6 @@ export default function VideosPage() { if (values.keyword) query.keyword = values.keyword; 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); setVideos(result.videos); @@ -230,18 +223,6 @@ export default function VideosPage() { ))} - - - - - -