diff --git a/app/service/adapter/oldErrAdapter.ts b/app/service/adapter/oldErrAdapter.ts
index d4a1791..d576d82 100644
--- a/app/service/adapter/oldErrAdapter.ts
+++ b/app/service/adapter/oldErrAdapter.ts
@@ -37,6 +37,10 @@ export class VideoSegmentEntityAdapter {
task_status: string = "";
/** 任务结果 */
task_result: Array<{
+ /** 任务ID */
+ video_id: string;
+ /** 任务状态 */
+ video_status: number|null;
/** 叙事目标 */
narrative_goal: string;
/** 镜头1描述 */
@@ -175,6 +179,8 @@ export class VideoSegmentEntityAdapter {
*/
static fromVideoSegmentEntity(entities: VideoSegmentEntity[]): VideoSegmentEntityAdapter {
const taskResults: Array<{
+ video_id: string;
+ video_status: number|null;
narrative_goal: string;
shot_1: string;
shot_2: string;
@@ -235,6 +241,8 @@ export class VideoSegmentEntityAdapter {
taskResults.push({
narrative_goal: narrative_goal,
+ video_id: entity.id,
+ video_status: entity.status,
shot_1: shots.shot_1 || "",
shot_2: shots.shot_2 || "",
shot_3: shots.shot_3 || "",
diff --git a/app/service/adapter/textToShot.ts b/app/service/adapter/textToShot.ts
index 3465975..5dd57ca 100644
--- a/app/service/adapter/textToShot.ts
+++ b/app/service/adapter/textToShot.ts
@@ -60,7 +60,15 @@ export class TextToShotAdapter {
let currentText = text;
// 按角色名称长度降序排序,避免短名称匹配到长名称的一部分
- const sortedRoles = [...roles].sort((a, b) => b.name.length - a.name.length);
+ // 既要兼容 首字母大写 其余小写、还要兼容 全部大写
+ const sortedRoles = [...roles].sort((a, b) => b.name.length - a.name.length).map(role => ({
+ ...role,
+ name: role.name.charAt(0).toUpperCase() + role.name.slice(1).toLowerCase()
+ })).concat([...roles].map(role => ({
+ ...role,
+ name: role.name.toUpperCase()
+ })));
+
while (currentText.length > 0) {
let matchFound = false;
diff --git a/components/pages/work-flow/media-viewer.tsx b/components/pages/work-flow/media-viewer.tsx
index f3630d4..93b7278 100644
--- a/components/pages/work-flow/media-viewer.tsx
+++ b/components/pages/work-flow/media-viewer.tsx
@@ -432,10 +432,9 @@ export const MediaViewer = React.memo(function MediaViewer({
- {/* 只在生成过程中或没有视频时使用ProgressiveReveal */}
-
- {/* 背景模糊的图片 */}
-
+ {/* 背景模糊的图片 */}
+ {taskObject.videos.data[currentSketchIndex].video_status !== 1 && (
+
{/* 生成中 */}
{taskObject.videos.data[currentSketchIndex].video_status === 0 && (
@@ -455,39 +454,39 @@ export const MediaViewer = React.memo(function MediaViewer({
)}
+ )}
+
- {/* 视频 多个 取第一个 */}
- { taskObject.videos.data[currentSketchIndex].urls && (
-
-
- )}
-
-
+ {/* 视频 多个 取第一个 */}
+ { taskObject.videos.data[currentSketchIndex].urls && (
+
+
+ )}
{/* 操作按钮组 */}
{/* 底部控制区域 */}
- { taskObject.videos.data[currentSketchIndex] && (
+ { taskObject.videos.data[currentSketchIndex].video_status === 1 && (
{
- const defaultBgColors = ['RGB(45, 50, 70)', 'RGB(75, 80, 100)', 'RGB(105, 110, 130)'];
- const bgColors = defaultBgColors;
return (
{roles.map((role) => {
- const isSelected = role.name === name;
+ const isSelected = role.name.toLowerCase() === name.toLowerCase();
return (
(function ShotsEdito
))}
- {/*
*/}
+ Add
+
{/* 分镜内容 */}
diff --git a/components/ui/shot-tab-content.tsx b/components/ui/shot-tab-content.tsx
index 9a6b88a..bf381ca 100644
--- a/components/ui/shot-tab-content.tsx
+++ b/components/ui/shot-tab-content.tsx
@@ -18,10 +18,8 @@ interface ShotTabContentProps {
roles?: any[];
}
-export function ShotTabContent({
- currentSketchIndex = 0,
- roles = []
-}: ShotTabContentProps) {
+export const ShotTabContent = (props: ShotTabContentProps) => {
+ const { currentSketchIndex = 0, roles = [] } = props;
const {
loading,
shotData,
@@ -48,7 +46,7 @@ export function ShotTabContent({
const [selectedLibaryRole, setSelectedLibaryRole] = useState
(null);
const [isLoadingShots, setIsLoadingShots] = useState(false);
const shotsEditorRef = useRef(null);
- const videoRef = useRef(null);
+ const [isRegenerate, setIsRegenerate] = useState(false);
useEffect(() => {
console.log('shotTabContent-----roles', roles);
@@ -163,15 +161,17 @@ export function ShotTabContent({
};
// 点击按钮重新生成
- const handleRegenerate = () => {
+ const handleRegenerate = async () => {
console.log('regenerate');
+ setIsRegenerate(true);
const shotInfo = shotsEditorRef.current.getShotInfo();
console.log('shotTabContent-----shotInfo', shotInfo);
setSelectedSegment({
...shotData[selectedIndex],
lens: shotInfo
});
- regenerateVideoSegment();
+ await regenerateVideoSegment();
+ setIsRegenerate(false);
};
// 新增分镜
@@ -394,8 +394,8 @@ export function ShotTabContent({
/>
{/* 重新生成按钮、新增分镜按钮 */}
-
-
+ {/* handleAddShot()}
className="flex items-center justify-center gap-2 px-4 py-3 bg-pink-500/10 hover:bg-pink-500/20
text-pink-500 rounded-lg transition-colors"
@@ -404,16 +404,17 @@ export function ShotTabContent({
>
Add Shot
-
+ */}
handleRegenerate()}
className="flex items-center justify-center gap-2 px-4 py-3 bg-blue-500/10 hover:bg-blue-500/20
text-blue-500 rounded-lg transition-colors"
- whileHover={{ scale: 1.02 }}
- whileTap={{ scale: 0.98 }}
- >
-
- Regenerate
+ whileHover={{ scale: 1.02 }}
+ whileTap={{ scale: 0.98 }}
+ disabled={isRegenerate}
+ >
+
+ {isRegenerate ? 'Regenerating...' : 'Regenerate'}