diff --git a/apps/web/src/pages/workspace/ProjectAssets.tsx b/apps/web/src/pages/workspace/ProjectAssets.tsx
index 0ba9dcb4f..a33a6ad3d 100644
--- a/apps/web/src/pages/workspace/ProjectAssets.tsx
+++ b/apps/web/src/pages/workspace/ProjectAssets.tsx
@@ -476,31 +476,31 @@ const ProjectAssets: React.FC = () => {
};
const assetPill = (asset: AssetItem) => {
- if (asset.mime_type?.startsWith('audio')) return { text: '??', cls: 'audio' };
- if (asset.mime_type?.startsWith('image')) return { text: '??', cls: 'video' };
- if (String(asset.metadata?.review_status || '') === 'pending_review') return { text: '???', cls: 'warn' };
- if (String(asset.metadata?.review_status || '') === 'rejected') return { text: '???', cls: 'bad' };
- return { text: asset.status === 'ready' ? '??' : '??', cls: asset.status === 'ready' ? 'ok' : 'video' };
+ if (asset.mime_type?.startsWith('audio')) return { text: '音频', cls: 'audio' };
+ if (asset.mime_type?.startsWith('image')) return { text: '图片', cls: 'video' };
+ if (String(asset.metadata?.review_status || '') === 'pending_review') return { text: '待复核', cls: 'warn' };
+ if (String(asset.metadata?.review_status || '') === 'rejected') return { text: '已驳回', cls: 'bad' };
+ return { text: asset.status === 'ready' ? '就绪' : '导入中', cls: asset.status === 'ready' ? 'ok' : 'video' };
};
const assetMeta = (asset: AssetItem) => {
const duration = Number(asset.metadata?.duration_seconds || asset.metadata?.duration || 0);
- const durationText = duration ? `${Math.round(duration)}s` : asset.mime_type?.startsWith('audio') ? '????' : '9:16';
- const classification = String(asset.metadata?.classification || '???');
- const review = String(asset.metadata?.review_status || asset.status || '???');
- return `${durationText} ? ${classification} ? ${review}`;
+ const durationText = duration ? `${Math.round(duration)}s` : asset.mime_type?.startsWith('audio') ? '音频素材' : '9:16';
+ const classification = String(asset.metadata?.classification || '未分类');
+ const review = String(asset.metadata?.review_status || asset.status || '未复核');
+ return `${durationText} · ${classification} · ${review}`;
};
return (
-
???
-
?????? 9:16 ??????????????????
+
素材库
+
上传和管理 9:16 视频、图片、配音素材,系统会自动分类并给出剪辑可用度。
- } onClick={() => setCreateLibraryOpen(true)}>?????
-
+ } onClick={() => setCreateLibraryOpen(true)}>新建素材库
+
@@ -511,48 +511,48 @@ const ProjectAssets: React.FC = () => {
style={{ width: 160 }}
value={smartViewFilter}
options={[
- { label: '????', value: 'all' },
- { label: '????', value: 'recommended' },
- { label: '????', value: 'needs_attention' },
- { label: '?????', value: 'high_risk' },
- { label: '?????', value: 'unclassified' },
- { label: '????', value: 'recent' },
- { label: '?????', value: 'unused' },
- { label: '?????', value: 'used' },
- { label: '?????', value: 'pending_review' },
- { label: '????', value: 'voice' },
+ { label: '全部素材', value: 'all' },
+ { label: '推荐可用', value: 'recommended' },
+ { label: '需要处理', value: 'needs_attention' },
+ { label: '高风险素材', value: 'high_risk' },
+ { label: '未分类素材', value: 'unclassified' },
+ { label: '最近上传', value: 'recent' },
+ { label: '未使用素材', value: 'unused' },
+ { label: '已使用素材', value: 'used' },
+ { label: '待复核素材', value: 'pending_review' },
+ { label: '配音素材', value: 'voice' },
]}
onChange={setSmartViewFilter}
/>
- {!workspaceId && setSelectedRowKeys((keys) => selected ? keys.filter((key) => key !== asset.id) : [...keys, asset.id])}>
-
+
{asset.name}{pill.text}
{assetMeta(asset)}
{renderClassification(asset)}
event.stopPropagation()}>
- } loading={isCurrentClassifying && classificationMutation.isPending} disabled={isAutoClassifying || (!!classifyingAssetId && classifyingAssetId !== asset.id) || batchProgress.running} onClick={() => { setClassifyingAssetId(asset.id); classificationMutation.mutate({ workspace_id: asset.workspace_id, project_id: asset.project_id, asset_id: asset.id }); }}>{isAutoClassifying ? '???' : hasClassification ? '???' : '??'}
-
-
+ } loading={isCurrentClassifying && classificationMutation.isPending} disabled={isAutoClassifying || (!!classifyingAssetId && classifyingAssetId !== asset.id) || batchProgress.running} onClick={() => { setClassifyingAssetId(asset.id); classificationMutation.mutate({ workspace_id: asset.workspace_id, project_id: asset.project_id, asset_id: asset.id }); }}>{isAutoClassifying ? '排队中' : hasClassification ? '重分类' : '分类'}
+
+
);
})}
- ) :