gitextract_66uhurkx/ ├── .github/ │ └── workflows/ │ ├── desktop-client-dev.yml │ └── dev.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── README.zh.md ├── config/ │ ├── huazi.json │ └── sticker.json ├── config.py ├── desktop-client/ │ ├── .gitignore │ ├── .npmrc │ ├── LICENSE │ ├── assets/ │ │ ├── entitlements.mac.plist │ │ └── icons/ │ │ └── logo.icns │ ├── main.js │ ├── nodeapi/ │ │ ├── download.js │ │ ├── draftPathDetect.js │ │ ├── ipcHandlers.js │ │ └── logger.js │ ├── package.json │ ├── preload.js │ ├── scripts/ │ │ ├── electron-builder-green.config.js │ │ ├── electron-builder.config.js │ │ └── update-version.js │ └── web/ │ ├── .gitignore │ ├── index.html │ ├── package.json │ ├── public/ │ │ └── index.html │ ├── src/ │ │ ├── App.jsx │ │ ├── components/ │ │ │ ├── DownloadButton.jsx │ │ │ ├── DownloadControls.jsx │ │ │ ├── ExternalWebpage.jsx │ │ │ ├── Header/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ ├── LogModule.jsx │ │ │ ├── Tabs.jsx │ │ │ └── Textarea.jsx │ │ ├── index.jsx │ │ ├── pages/ │ │ │ ├── ConfigCenter/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ ├── Download/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ └── History/ │ │ │ ├── index.jsx │ │ │ └── index.less │ │ ├── services/ │ │ │ └── electronService.js │ │ ├── styles/ │ │ │ ├── index.less │ │ │ └── root.less │ │ └── utils/ │ │ ├── const.tsx │ │ └── date.ts │ └── vite.config.js ├── docker-compose.example.yaml ├── docker-compose.yaml ├── docs/ │ ├── add_audios.md │ ├── add_audios.zh.md │ ├── add_captions.md │ ├── add_captions.zh.md │ ├── add_effects.md │ ├── add_effects.zh.md │ ├── add_filters.md │ ├── add_filters.zh.md │ ├── add_images.md │ ├── add_images.zh.md │ ├── add_keyframes.md │ ├── add_keyframes.zh.md │ ├── add_masks.md │ ├── add_masks.zh.md │ ├── add_sticker.md │ ├── add_sticker.zh.md │ ├── add_text_style.md │ ├── add_text_style.zh.md │ ├── add_videos.md │ ├── add_videos.zh.md │ ├── audio_infos.md │ ├── audio_infos.zh.md │ ├── audio_timelines.md │ ├── audio_timelines.zh.md │ ├── caption_infos.md │ ├── caption_infos.zh.md │ ├── create_draft.md │ ├── create_draft.zh.md │ ├── easy_create_material.md │ ├── easy_create_material.zh.md │ ├── effect_infos.md │ ├── effect_infos.zh.md │ ├── filter_infos.md │ ├── filter_infos.zh.md │ ├── gen_video.md │ ├── gen_video.zh.md │ ├── gen_video_status.md │ ├── gen_video_status.zh.md │ ├── get_audio_duration.md │ ├── get_audio_duration.zh.md │ ├── get_draft.md │ ├── get_draft.zh.md │ ├── get_image_animations.md │ ├── get_image_animations.zh.md │ ├── get_text_animations.md │ ├── get_text_animations.zh.md │ ├── get_text_effects.md │ ├── get_url.md │ ├── get_url.zh.md │ ├── imgs_infos.md │ ├── imgs_infos.zh.md │ ├── keyframes_infos.md │ ├── keyframes_infos.zh.md │ ├── objs_to_str_list.md │ ├── objs_to_str_list.zh.md │ ├── save_draft.md │ ├── save_draft.zh.md │ ├── search_sticker.md │ ├── search_sticker.zh.md │ ├── str_list_to_objs.md │ ├── str_list_to_objs.zh.md │ ├── str_to_list.md │ ├── str_to_list.zh.md │ ├── timelines.md │ ├── timelines.zh.md │ ├── video_infos.md │ └── video_infos.zh.md ├── exceptions.py ├── main.py ├── openapi.yaml ├── pyproject.toml ├── src/ │ ├── __init__.py │ ├── middlewares/ │ │ ├── __init__.py │ │ ├── prepare.py │ │ ├── response.py │ │ └── trace_context.py │ ├── pyJianYingDraft/ │ │ ├── __init__.py │ │ ├── animation.py │ │ ├── assets/ │ │ │ ├── __init__.py │ │ │ ├── draft_content_template.json │ │ │ └── draft_meta_info.json │ │ ├── audio_segment.py │ │ ├── draft_folder.py │ │ ├── effect_segment.py │ │ ├── exceptions.py │ │ ├── jianying_controller.py │ │ ├── keyframe.py │ │ ├── local_materials.py │ │ ├── metadata/ │ │ │ ├── __init__.py │ │ │ ├── audio_scene_effect.py │ │ │ ├── effect_meta.py │ │ │ ├── filter_meta.py │ │ │ ├── font_meta.py │ │ │ ├── mask_meta.py │ │ │ ├── mix_mode_meta.py │ │ │ ├── speech_to_song.py │ │ │ ├── text_intro.py │ │ │ ├── text_loop.py │ │ │ ├── text_outro.py │ │ │ ├── tone_effect.py │ │ │ ├── transition_meta.py │ │ │ ├── video_character_effect.py │ │ │ ├── video_group_animation.py │ │ │ ├── video_intro.py │ │ │ ├── video_outro.py │ │ │ └── video_scene_effect.py │ │ ├── script_file.py │ │ ├── segment.py │ │ ├── template_mode.py │ │ ├── text_segment.py │ │ ├── time_util.py │ │ ├── track.py │ │ ├── util.py │ │ └── video_segment.py │ ├── router/ │ │ ├── __init__.py │ │ └── v1.py │ ├── schemas/ │ │ ├── __init__.py │ │ ├── add_audios.py │ │ ├── add_captions.py │ │ ├── add_effects.py │ │ ├── add_filters.py │ │ ├── add_images.py │ │ ├── add_keyframes.py │ │ ├── add_masks.py │ │ ├── add_sticker.py │ │ ├── add_text_style.py │ │ ├── add_videos.py │ │ ├── audio_infos.py │ │ ├── audio_timelines.py │ │ ├── caption_infos.py │ │ ├── create_draft.py │ │ ├── easy_create_material.py │ │ ├── effect_infos.py │ │ ├── filter_infos.py │ │ ├── gen_video.py │ │ ├── gen_video_active_count.py │ │ ├── gen_video_status.py │ │ ├── get_audio_duration.py │ │ ├── get_draft.py │ │ ├── get_effects.py │ │ ├── get_filters.py │ │ ├── get_image_animations.py │ │ ├── get_text_animations.py │ │ ├── get_text_effects.py │ │ ├── get_url.py │ │ ├── imgs_infos.py │ │ ├── keyframes_infos.py │ │ ├── objs_to_str_list.py │ │ ├── save_draft.py │ │ ├── search_sticker.py │ │ ├── str_list_to_objs.py │ │ ├── str_to_list.py │ │ ├── timelines.py │ │ └── video_infos.py │ ├── service/ │ │ ├── __init__.py │ │ ├── add_audios.py │ │ ├── add_captions.py │ │ ├── add_effects.py │ │ ├── add_filters.py │ │ ├── add_images.py │ │ ├── add_keyframes.py │ │ ├── add_masks.py │ │ ├── add_sticker.py │ │ ├── add_text_style.py │ │ ├── add_videos.py │ │ ├── audio_infos.py │ │ ├── audio_timelines.py │ │ ├── caption_infos.py │ │ ├── create_draft.py │ │ ├── easy_create_material.py │ │ ├── effect_infos.py │ │ ├── filter_infos.py │ │ ├── gen_video.py │ │ ├── get_audio_duration.py │ │ ├── get_draft.py │ │ ├── get_effects.py │ │ ├── get_filters.py │ │ ├── get_image_animations.py │ │ ├── get_text_animations.py │ │ ├── get_text_effects.py │ │ ├── get_url.py │ │ ├── imgs_infos.py │ │ ├── keyframes_infos.py │ │ ├── objs_to_str_list.py │ │ ├── save_draft.py │ │ ├── search_sticker.py │ │ ├── str_list_to_objs.py │ │ ├── str_to_list.py │ │ ├── text_effect_map_generated.py │ │ ├── timelines.py │ │ └── video_infos.py │ └── utils/ │ ├── __init__.py │ ├── cos.py │ ├── download.py │ ├── draft_cache.py │ ├── draft_cleanup.py │ ├── draft_downloader.py │ ├── draft_lock_manager.py │ ├── helper.py │ ├── keyframe_value.py │ ├── logger.py │ ├── media.py │ ├── oss.py │ ├── points.py │ ├── storage_upload_retry.py │ ├── trace_context.py │ ├── upload_file.py │ ├── video_task_manager.py │ └── video_task_store.py ├── template/ │ ├── default/ │ │ ├── draft_agency_config.json │ │ ├── draft_info.json │ │ ├── draft_info.json.bak │ │ ├── draft_meta_info.json │ │ ├── draft_settings │ │ └── template.tmp │ ├── default2/ │ │ ├── attachment_pc_common.json │ │ ├── draft_agency_config.json │ │ ├── draft_content.json │ │ ├── draft_info.json │ │ ├── draft_meta_info.json │ │ └── template.tmp │ └── readme.md ├── tests/ │ ├── __init__.py │ ├── manual_test_audio_infos.py │ ├── manual_test_caption_infos.py │ ├── manual_test_effect_infos.py │ ├── manual_test_imgs_infos.py │ ├── manual_test_keyframes_infos.py │ ├── manual_test_video_infos.py │ ├── test_add_audios.py │ ├── test_add_captions_text_effect.py │ ├── test_add_images.py │ ├── test_add_keyframes_normalize.py │ ├── test_add_keyframes_refactor.py │ ├── test_add_masks.py │ ├── test_add_videos_concurrent.py │ ├── test_add_videos_concurrent_demo.py │ ├── test_add_videos_duration.py │ ├── test_add_videos_refactor.py │ ├── test_all_text_effects.py │ ├── test_api_version.py │ ├── test_audio_infos.py │ ├── test_audio_infos_simple.py │ ├── test_audio_timelines.py │ ├── test_caption_keywords.py │ ├── test_caption_transform.py │ ├── test_caption_transform_fix.py │ ├── test_chinese_encoding_fix.py │ ├── test_ci_dependencies.py │ ├── test_cross_platform.py │ ├── test_draft_cleanup.py │ ├── test_draft_downloader_remote_materials.py │ ├── test_draft_lock_all_apis.py │ ├── test_draft_lock_manager.py │ ├── test_draft_service.py │ ├── test_export_error_handling.py │ ├── test_file_operations.py │ ├── test_float_transform.py │ ├── test_font_alias_resolution.py │ ├── test_font_size.py │ ├── test_font_size_debug.py │ ├── test_font_size_logic.py │ ├── test_font_size_not_set.py │ ├── test_get_audio_duration_api.py │ ├── test_get_text_effects.py │ ├── test_imgs_infos_multiple_animations.py │ ├── test_keyframe_value.py │ ├── test_keyword_font_size.py │ ├── test_latest_commit_features.py │ ├── test_logic_validation.py │ ├── test_media_utils.py │ ├── test_middleware.py │ ├── test_param_pass.py │ ├── test_parse_video_data.py │ ├── test_search_sticker.py │ ├── test_search_sticker_basic.py │ ├── test_search_sticker_simple.py │ ├── test_storage_upload_retry.py │ ├── test_text_segment_add_animation.py │ ├── test_transform_coordinate_fix.py │ ├── test_upload_file.py │ ├── test_video_duration_extension.py │ ├── test_video_task_draft_duration.py │ ├── test_video_transform.py │ ├── test_video_transform_fix.py │ └── verify_get_text_effects_api.py └── tools/ ├── extract_text_effects.py ├── ffprobe └── query_sticker.py