gitextract_vm6sptpc/ ├── .dockerignore ├── .gitignore ├── DOCKER_HOST_ACCESS.md ├── Dockerfile ├── LICENSE ├── MIGRATE_README.md ├── README-CN.md ├── README-JA.md ├── README.md ├── api/ │ ├── handlers/ │ │ ├── ai_config.go │ │ ├── asset.go │ │ ├── audio_extraction.go │ │ ├── character_batch.go │ │ ├── character_library.go │ │ ├── character_library_gen.go │ │ ├── drama.go │ │ ├── frame_prompt.go │ │ ├── frame_prompt_query.go │ │ ├── image_generation.go │ │ ├── prop.go │ │ ├── scene.go │ │ ├── script_generation.go │ │ ├── settings.go │ │ ├── storyboard.go │ │ ├── task.go │ │ ├── upload.go │ │ ├── video_generation.go │ │ └── video_merge.go │ ├── middlewares/ │ │ ├── cors.go │ │ ├── logger.go │ │ └── ratelimit.go │ └── routes/ │ └── routes.go ├── application/ │ └── services/ │ ├── ai_service.go │ ├── asset_duration_update.go │ ├── asset_service.go │ ├── audio_extraction_service.go │ ├── character_library_service.go │ ├── data_migration_service.go │ ├── drama_service.go │ ├── frame_prompt_helper.go │ ├── frame_prompt_service.go │ ├── image_generation_service.go │ ├── prompt_i18n.go │ ├── prop_service.go │ ├── resource_transfer_service.go │ ├── script_generation_service.go │ ├── storyboard_composition_service.go │ ├── storyboard_service.go │ ├── storyboard_update_full.go │ ├── task_service.go │ ├── upload_service.go │ ├── video_generation_service.go │ └── video_merge_service.go ├── cmd/ │ └── migrate/ │ └── main.go ├── configs/ │ └── config.example.yaml ├── docker-compose.yml ├── docs/ │ └── DATA_MIGRATION.md ├── domain/ │ └── models/ │ ├── ai_config.go │ ├── asset.go │ ├── character_library.go │ ├── drama.go │ ├── frame_prompt.go │ ├── image_generation.go │ ├── task.go │ ├── timeline.go │ ├── video_generation.go │ └── video_merge.go ├── go.mod ├── go.sum ├── infrastructure/ │ ├── database/ │ │ ├── custom_logger.go │ │ └── database.go │ ├── external/ │ │ └── ffmpeg/ │ │ └── ffmpeg.go │ ├── scheduler/ │ │ └── resource_transfer_scheduler.go │ └── storage/ │ └── local_storage.go ├── main.go ├── migrations/ │ ├── 20260126_add_local_path.sql │ └── init.sql ├── pkg/ │ ├── ai/ │ │ ├── client.go │ │ ├── gemini_client.go │ │ └── openai_client.go │ ├── config/ │ │ └── config.go │ ├── image/ │ │ ├── gemini_image_client.go │ │ ├── image_client.go │ │ ├── openai_image_client.go │ │ └── volcengine_image_client.go │ ├── logger/ │ │ └── logger.go │ ├── response/ │ │ └── response.go │ ├── utils/ │ │ ├── image_utils.go │ │ ├── json_parser.go │ │ └── json_parser_test.go │ └── video/ │ ├── chatfire_client.go │ ├── minimax_client.go │ ├── openai_sora_client.go │ ├── video_client.go │ └── volces_ark_client.go └── web/ ├── .gitignore ├── index.html ├── nginx.conf ├── package.json ├── public/ │ └── ffmpeg/ │ ├── ffmpeg-core.js │ └── ffmpeg-core.wasm ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── ai.ts │ │ ├── asset.ts │ │ ├── audio.ts │ │ ├── character-library.ts │ │ ├── drama.ts │ │ ├── frame.ts │ │ ├── generation.ts │ │ ├── image.ts │ │ ├── prop.ts │ │ ├── settings.ts │ │ ├── task.ts │ │ ├── video.ts │ │ └── videoMerge.ts │ ├── assets/ │ │ └── styles/ │ │ ├── element/ │ │ │ └── index.scss │ │ └── main.css │ ├── components/ │ │ ├── LanguageSwitcher.vue │ │ ├── common/ │ │ │ ├── AIConfigDialog.vue │ │ │ ├── ActionButton.vue │ │ │ ├── AppHeader.vue │ │ │ ├── AppLayout.vue │ │ │ ├── BaseCard.vue │ │ │ ├── CreateDramaDialog.vue │ │ │ ├── EmptyState.vue │ │ │ ├── ImageCropDialog.vue │ │ │ ├── ImagePreview.vue │ │ │ ├── PageHeader.vue │ │ │ ├── ProjectCard.vue │ │ │ ├── StatCard.vue │ │ │ ├── ThemeToggle.vue │ │ │ └── index.ts │ │ └── editor/ │ │ ├── GridImageEditor.vue │ │ ├── StoryboardEditor.vue │ │ └── VideoTimelineEditor.vue │ ├── locales/ │ │ ├── en-US.ts │ │ ├── index.ts │ │ └── zh-CN.ts │ ├── main.ts │ ├── router/ │ │ └── index.ts │ ├── stores/ │ │ └── episode.ts │ ├── types/ │ │ ├── ai.ts │ │ ├── asset.ts │ │ ├── drama.ts │ │ ├── generation.ts │ │ ├── image.ts │ │ ├── prop.ts │ │ ├── timeline.ts │ │ ├── user.ts │ │ └── video.ts │ ├── utils/ │ │ ├── ffmpeg.ts │ │ ├── image.ts │ │ ├── request.ts │ │ └── videoMerger.ts │ └── views/ │ ├── dashboard/ │ │ └── Dashboard.vue │ ├── drama/ │ │ ├── DramaCreate.vue │ │ ├── DramaList.vue │ │ ├── DramaManagement.vue │ │ ├── DramaWorkflow.vue │ │ ├── EpisodeWorkflow.vue │ │ ├── ProfessionalEditor.vue │ │ └── components/ │ │ └── UploadScriptDialog.vue │ ├── editor/ │ │ └── TimelineEditor.vue │ ├── generation/ │ │ ├── ImageGeneration.vue │ │ ├── VideoGeneration.vue │ │ └── components/ │ │ ├── GenerateImageDialog.vue │ │ ├── GenerateVideoDialog.vue │ │ ├── ImageDetailDialog.vue │ │ └── VideoDetailDialog.vue │ ├── script/ │ │ └── ScriptEdit.vue │ ├── settings/ │ │ ├── AIConfig.vue │ │ ├── SystemSettings.vue │ │ └── components/ │ │ └── ConfigList.vue │ ├── storyboard/ │ │ └── StoryboardEdit.vue │ └── workflow/ │ ├── CharacterExtraction.vue │ ├── CharacterImages.vue │ ├── DramaSettings.vue │ ├── SceneImages.vue │ └── StoryboardGeneration.vue ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts