!isDragging && onSketchSelect(index)}
+ ${(currentSketchIndex === index && !disabled) ? 'ring-2 ring-blue-500 z-10' : 'hover:ring-2 hover:ring-blue-500/50'}`}
+ onClick={() => !isDragging && !disabled && onSketchSelect(index)}
>
{/* 视频层 */}
@@ -202,11 +211,28 @@ export function ThumbnailGrid({
// loop
// muted
// />
-

+
handleMouseEnter(index)}
+ onMouseLeave={() => handleMouseLeave(index)}
+ >
+

+ {hoveredIndex === index && (
+
+ )}
+
) : (
@@ -316,6 +342,7 @@ export function ThumbnailGrid({
>
{taskObject.currentStage === 'video' && renderVideoThumbnails()}
{(taskObject.currentStage === 'scene' || taskObject.currentStage === 'character') && renderSketchThumbnails(getCurrentData())}
+ {taskObject.currentStage === 'final_video' && renderVideoThumbnails(true)}
);
}
diff --git a/components/pages/work-flow/use-workflow-data.tsx b/components/pages/work-flow/use-workflow-data.tsx
index 11971b5..ab3f6d2 100644
--- a/components/pages/work-flow/use-workflow-data.tsx
+++ b/components/pages/work-flow/use-workflow-data.tsx
@@ -716,7 +716,6 @@ export function useWorkflowData({ onEditPlanGenerated }: UseWorkflowDataProps =
applyScript,
fallbackToStep,
originalText: state.originalText,
- // showGotoCutButton: from && currentLoadingText.includes('Post-production') ? true : false,
showGotoCutButton: (canGoToCut && (isGenerateEditPlan || taskObject.currentStage === 'final_video') || isShowError) ? true : false,
generateEditPlan: openEditPlan,
handleRetryVideo
diff --git a/utils/tools.ts b/utils/tools.ts
index 7a79fd3..8bc2f84 100644
--- a/utils/tools.ts
+++ b/utils/tools.ts
@@ -93,4 +93,14 @@ export const downloadVideo = async (url: string) => {
} catch (error) {
console.error('下载视频失败:', error);
}
+};
+
+/**
+ * 下载所有视频
+ * @param urls 视频URL列表
+ */
+export const downloadAllVideos = async (urls: string[]) => {
+ for (const url of urls) {
+ await downloadVideo(url);
+ }
};
\ No newline at end of file