Merge pull request #23 from Hommy-master/dev

Dev
This commit is contained in:
Hommy
2025-12-28 21:01:34 +08:00
committed by GitHub
10 changed files with 129 additions and 21 deletions
+3 -2
View File
@@ -2,11 +2,11 @@ name: Docker Image CI Dev
on:
push:
branches: [ "main" ]
branches: [ "main", "dev" ]
tags:
- 'v*' # 当推送v开头的tag时触发
pull_request:
branches: [ "main" ]
branches: [ "main", "dev" ]
jobs:
build:
@@ -40,6 +40,7 @@ jobs:
# 复制源代码
cp -rf src dist/
cp -rf config dist/
cp -rf template dist/
# 复制依赖配置文件
cp pyproject.toml dist/
cp *.py dist/
Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

+21 -5
View File
@@ -6,9 +6,14 @@ const logger = require('./nodeapi/logger');
const { setupIpcHandlers } = require('./nodeapi/ipcHandlers');
let mainWindow;
let ipcHandlersInitialized = false;
function createWindow() {
mainWindow = null;
// 避免重复创建窗口
if (mainWindow) {
mainWindow.show();
return mainWindow;
}
mainWindow = new BrowserWindow({
width: 1366,
@@ -49,12 +54,17 @@ function createWindow() {
mainWindow.show();
});
// 调用IPC处理程序,传递mainWindow参数
setupIpcHandlers(mainWindow);
// 只初始化一次IPC处理程序
if (!ipcHandlersInitialized) {
setupIpcHandlers(mainWindow);
ipcHandlersInitialized = true;
}
mainWindow.on('closed', function () {
mainWindow = null;
});
return mainWindow;
}
// 当Electron完成初始化并准备创建浏览器窗口时调用此方法
@@ -71,9 +81,15 @@ app.on('window-all-closed', () => {
});
app.on('activate', () => {
// 在macOS上,当单击dock图标并且没有其他窗口打开时
// 通常在应用程序中重新创建一个窗口
// 在macOS上,当单击dock图标时,如果没有任何窗口打开则创建一个
// 否则显示已存在的窗口
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
} else {
// 如果已有窗口,确保它被显示和聚焦
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
}
});
+99 -14
View File
@@ -5,6 +5,93 @@ from src.utils.draft_cache import update_cache
from exceptions import CustomException, CustomError
import datetime
import uuid
import os
import shutil
def generate_unique_draft_id():
"""生成唯一的草稿ID"""
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8]
return f"{timestamp}{unique_id}"
def create_draft_from_template(draft_id: str, width: int, height: int):
"""基于模板创建新草稿,使用duplicate_as_template方法"""
# 使用绝对路径构建模板源路径
current_file_dir = os.path.dirname(os.path.abspath(__file__)) # src/service
src_dir = os.path.dirname(current_file_dir) # src
project_root = os.path.dirname(src_dir) # 项目根目录
template_source_path = os.path.join(project_root, "template", "default")
# 创建临时模板目录
temp_template_name = "temp_template_for_creation"
temp_template_path = os.path.join(config.DRAFT_DIR, temp_template_name)
# 如果临时模板路径已存在,先删除
import shutil
if os.path.exists(temp_template_path):
shutil.rmtree(temp_template_path)
# 临时复制模板到草稿目录
shutil.copytree(template_source_path, temp_template_path)
try:
# 先加载模板内容并修复轨道名称
import json
template_content_path = os.path.join(temp_template_path, "draft_content.json")
with open(template_content_path, 'r', encoding="utf-8") as f:
template_data = json.load(f)
# 确保所有轨道都有name字段
for track in template_data.get("tracks", []):
if not isinstance(track, dict) or "name" not in track:
# 使用type作为名称,如果type存在的话
track_type = track.get("type", "unknown") if isinstance(track, dict) else "unknown"
track_name = f"{track_type}_track"
if isinstance(track, dict):
track["name"] = track_name
else:
# 如果track不是字典,跳过
continue
# 保存修复后的模板内容
with open(template_content_path, 'w', encoding="utf-8") as f:
json.dump(template_data, f, ensure_ascii=False, indent=4)
# 使用DraftFolder的duplicate_as_template方法
draft_folder = draft.Draft_folder(config.DRAFT_DIR)
script = draft_folder.duplicate_as_template(temp_template_name, draft_id, allow_replace=True)
# 确保草稿中的ID与文件夹ID一致
script.content["id"] = draft_id
# 更新草稿的画布尺寸以匹配请求的尺寸
script.width = width
script.height = height
script.content["canvas_config"]["width"] = width
script.content["canvas_config"]["height"] = height
return script
finally:
# 清理临时模板目录
if os.path.exists(temp_template_path):
shutil.rmtree(temp_template_path)
def check_main_track_exists(script):
"""检查是否已存在主轨道"""
main_track_name = "main_track"
main_track_exists = main_track_name in script.tracks
if not main_track_exists:
for track in script.imported_tracks:
try:
if hasattr(track, 'name') and getattr(track, 'name', None) == main_track_name:
main_track_exists = True
break
except AttributeError:
# 如果track没有name属性,跳过
continue
return main_track_exists
def create_draft(width: int, height: int) -> str:
@@ -21,24 +108,22 @@ def create_draft(width: int, height: int) -> str:
Raises:
CustomException: 草稿创建失败
"""
# 生成一个草稿ID
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8]
draft_id = f"{timestamp}{unique_id}"
logger.info(f"draft_id: {draft_id}, width: {width}, height: {height}")
draft_folder = draft.Draft_folder(config.DRAFT_DIR)
# 创建剪映草稿
# 使用默认模板创建剪映草稿
try:
script = draft_folder.create_draft(draft_id, width, height, allow_replace=True)
# 生成唯一的草稿ID
draft_id = generate_unique_draft_id()
logger.info(f"draft_id: {draft_id}, width: {width}, height: {height}")
# 基于模板创建新草稿,不将模板复制到草稿目录
script = create_draft_from_template(draft_id, width, height)
# 添加空的主轨道(仅当没有主轨道时添加)
main_track_name = "main_track"
script.add_track(track_type=draft.TrackType.video, track_name=main_track_name, relative_index=0)
logger.info(f"Added empty main track: {main_track_name}")
main_track_exists = check_main_track_exists(script)
if not main_track_exists:
script.add_track(track_type=draft.TrackType.video, track_name="main_track", relative_index=0)
logger.info(f"Added empty main track: main_track")
# 保存草稿以确保主轨道被创建
# 保存草稿以确保更改被保存
script.save()
except Exception as e:
@@ -0,0 +1 @@
{"pc_feature_flag":0,"template_item_infos":[],"unlock_template_ids":[]}
@@ -0,0 +1 @@
{"marterials":null,"use_converter":false,"video_resolution":720}
+1
View File
@@ -0,0 +1 @@
{"canvas_config":{"height":1080,"ratio":"original","width":1920},"color_space":-1,"config":{"adjust_max_index":1,"attachment_info":[],"combination_max_index":1,"export_range":null,"extract_audio_last_index":1,"lyrics_recognition_id":"","lyrics_sync":true,"lyrics_taskinfo":[],"maintrack_adsorb":false,"material_save_mode":0,"multi_language_current":"none","multi_language_list":[],"multi_language_main":"none","multi_language_mode":"none","original_sound_last_index":1,"record_audio_last_index":1,"sticker_max_index":1,"subtitle_keywords_config":null,"subtitle_recognition_id":"","subtitle_sync":true,"subtitle_taskinfo":[],"system_font_list":[],"video_mute":false,"zoom_info_params":null},"cover":null,"create_time":0,"duration":0,"extra_info":null,"fps":30,"free_render_index_mode_on":false,"group_container":null,"id":"4a1269df-f1a4-44ca-90a9-6c94511fe78e","is_drop_frame_timecode":false,"keyframe_graph_list":[],"keyframes":{"adjusts":[],"audios":[],"effects":[],"filters":[],"handwrites":[],"stickers":[],"texts":[],"videos":[]},"lyrics_effects":[],"materials":{"ai_translates":[],"audio_balances":[],"audio_effects":[],"audio_fades":[],"audio_track_indexes":[],"audios":[],"beats":[],"canvases":[],"chromas":[],"color_curves":[],"masks":[],"digital_humans":[],"drafts":[],"effects":[],"flowers":[],"green_screens":[],"handwrites":[],"hsl":[],"huazi":[],"images":[],"log_color_wheels":[],"loudnesses":[],"manual_deformations":[],"material_animations":[],"material_colors":[],"multi_language_refs":[],"placeholder_infos":[],"placeholders":[],"plugin_effects":[],"primary_color_wheels":[],"realtime_denoises":[],"shapes":[],"smart_crops":[],"smart_relights":[],"sound_channel_mappings":[],"speeds":[],"stickers":[],"tail_leaders":[],"text_templates":[],"texts":[],"time_marks":[],"transitions":[],"video_effects":[],"video_trackings":[],"videos":[],"vocal_beautifys":[],"vocal_separations":[]},"mutable_config":null,"name":"","new_version":"110.0.0","path":"","relationships":[],"render_index_track_mode_on":true,"retouch_cover":null,"source":"default","static_cover_image_path":"","time_marks":null,"tracks":[{"attribute":0,"flag":0,"id":"2D0629D7-BC55-4A90-867A-C078CFEEE0D2","segments":[],"type":"video"}],"update_time":0,"version":360000,"platform":{"app_id":3704,"app_source":"lv","app_version":"5.9.0","device_id":"9d624d7e23dc4e43a0ed4020b8e3e90e","hard_disk_id":"f242a67014ec01ecdc2a9280da37adb1","mac_address":"0c233adaa327abd93e3d6b5dae6d75e2","os":"mac","os_version":"14.5"},"last_modified_platform":{"app_id":3704,"app_source":"cc","app_version":"5.9.0","device_id":"9d624d7e23dc4e43a0ed4020b8e3e90e","hard_disk_id":"f242a67014ec01ecdc2a9280da37adb1","mac_address":"0c233adaa327abd93e3d6b5dae6d75e2","os":"mac","os_version":"14.5"}}
+1
View File
@@ -0,0 +1 @@
{"canvas_config":{"height":1080,"ratio":"original","width":1920},"color_space":-1,"config":{"adjust_max_index":1,"attachment_info":[],"combination_max_index":1,"export_range":null,"extract_audio_last_index":1,"lyrics_recognition_id":"","lyrics_sync":true,"lyrics_taskinfo":[],"maintrack_adsorb":false,"material_save_mode":0,"multi_language_current":"none","multi_language_list":[],"multi_language_main":"none","multi_language_mode":"none","original_sound_last_index":1,"record_audio_last_index":1,"sticker_max_index":1,"subtitle_keywords_config":null,"subtitle_recognition_id":"","subtitle_sync":true,"subtitle_taskinfo":[],"system_font_list":[],"video_mute":false,"zoom_info_params":null},"cover":null,"create_time":0,"duration":0,"extra_info":null,"fps":30,"free_render_index_mode_on":false,"group_container":null,"id":"4a1269df-f1a4-44ca-90a9-6c94511fe78e","is_drop_frame_timecode":false,"keyframe_graph_list":[],"keyframes":{"adjusts":[],"audios":[],"effects":[],"filters":[],"handwrites":[],"stickers":[],"texts":[],"videos":[]},"lyrics_effects":[],"materials":{"ai_translates":[],"audio_balances":[],"audio_effects":[],"audio_fades":[],"audio_track_indexes":[],"audios":[],"beats":[],"canvases":[],"chromas":[],"color_curves":[],"masks":[],"digital_humans":[],"drafts":[],"effects":[],"flowers":[],"green_screens":[],"handwrites":[],"hsl":[],"huazi":[],"images":[],"log_color_wheels":[],"loudnesses":[],"manual_deformations":[],"material_animations":[],"material_colors":[],"multi_language_refs":[],"placeholder_infos":[],"placeholders":[],"plugin_effects":[],"primary_color_wheels":[],"realtime_denoises":[],"shapes":[],"smart_crops":[],"smart_relights":[],"sound_channel_mappings":[],"speeds":[],"stickers":[],"tail_leaders":[],"text_templates":[],"texts":[],"time_marks":[],"transitions":[],"video_effects":[],"video_trackings":[],"videos":[],"vocal_beautifys":[],"vocal_separations":[]},"mutable_config":null,"name":"","new_version":"110.0.0","path":"","relationships":[],"render_index_track_mode_on":true,"retouch_cover":null,"source":"default","static_cover_image_path":"","time_marks":null,"tracks":[{"attribute":0,"flag":0,"id":"2D0629D7-BC55-4A90-867A-C078CFEEE0D2","segments":[],"type":"video"}],"update_time":0,"version":360000,"platform":{"app_id":3704,"app_source":"lv","app_version":"5.9.0","device_id":"9d624d7e23dc4e43a0ed4020b8e3e90e","hard_disk_id":"f242a67014ec01ecdc2a9280da37adb1","mac_address":"0c233adaa327abd93e3d6b5dae6d75e2","os":"mac","os_version":"14.5"},"last_modified_platform":{"app_id":3704,"app_source":"cc","app_version":"5.9.0","device_id":"9d624d7e23dc4e43a0ed4020b8e3e90e","hard_disk_id":"f242a67014ec01ecdc2a9280da37adb1","mac_address":"0c233adaa327abd93e3d6b5dae6d75e2","os":"mac","os_version":"14.5"}}
+1
View File
@@ -0,0 +1 @@
{"cloud_draft_cover":false,"cloud_draft_sync":false,"cloud_package_completed_time":"","draft_cloud_capcut_purchase_info":"","draft_cloud_last_action_download":false,"draft_cloud_package_type":"","draft_cloud_purchase_info":"","draft_cloud_template_id":"","draft_cloud_tutorial_info":"","draft_cloud_videocut_purchase_info":"","draft_cover":"draft_cover.jpg","draft_deeplink_url":"","draft_enterprise_info":{"draft_enterprise_extra":"","draft_enterprise_id":"","draft_enterprise_name":"","enterprise_material":[]},"draft_fold_path":"C:/Users/1/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft/dabdab61-e6f0-4d81-81ba-fc2517b742c2","draft_id":"340B14D0-4F91-43f3-B34E-730807160194","draft_is_ae_produce":false,"draft_is_ai_packaging_used":false,"draft_is_ai_shorts":false,"draft_is_ai_translate":false,"draft_is_article_video_draft":false,"draft_is_cloud_temp_draft":false,"draft_is_from_deeplink":"false","draft_is_invisible":false,"draft_is_web_article_video":false,"draft_materials":[{"type":0,"value":[]},{"type":1,"value":[]},{"type":2,"value":[]},{"type":3,"value":[]},{"type":6,"value":[]},{"type":7,"value":[]},{"type":8,"value":[]}],"draft_materials_copied_info":[],"draft_name":"dabdab61-e6f0-4d81-81ba-fc2517b742c2","draft_need_rename_folder":false,"draft_new_version":"","draft_removable_storage_device":"","draft_root_path":"C:\\Users\\1\\AppData\\Local\\JianyingPro\\User Data\\Projects\\com.lveditor.draft","draft_segment_extra_info":[],"draft_timeline_materials_size_":2075,"draft_type":"","draft_web_article_video_enter_from":"","tm_draft_cloud_completed":"","tm_draft_cloud_entry_id":-1,"tm_draft_cloud_modified":0,"tm_draft_cloud_parent_entry_id":-1,"tm_draft_cloud_space_id":-1,"tm_draft_cloud_user_id":-1,"tm_draft_create":1686707414251596,"tm_draft_modified":2686707417166183,"tm_draft_removed":0,"tm_duration":0}
+1
View File
@@ -0,0 +1 @@
{"canvas_config":{"height":0,"ratio":"original","width":0},"color_space":-1,"config":{"adjust_max_index":1,"attachment_info":[],"combination_max_index":1,"export_range":null,"extract_audio_last_index":1,"lyrics_recognition_id":"","lyrics_sync":true,"lyrics_taskinfo":[],"maintrack_adsorb":true,"material_save_mode":0,"original_sound_last_index":1,"record_audio_last_index":1,"sticker_max_index":1,"subtitle_recognition_id":"","subtitle_sync":true,"subtitle_taskinfo":[],"video_mute":false,"zoom_info_params":null},"cover":null,"create_time":0,"duration":0,"extra_info":null,"fps":30,"free_render_index_mode_on":false,"group_container":null,"id":"47095d03-6a91-4482-bbea-5800a23436f7","keyframes":{"adjusts":[],"audios":[],"effects":[],"filters":[],"handwrites":[],"stickers":[],"texts":[],"videos":[]},"last_modified_platform":{"app_id":3704,"app_source":"lv","app_version":"3.9.0","device_id":"ece93fefa6d73d0879f6cf6251e212fd","hard_disk_id":"da04071d52c1f66c291bc2f5b1f0e87f","mac_address":"864b94efa06c9456b10992695eba19c4","os":"mac","os_version":"12.5.1"},"materials":{"audio_balances":[],"audio_effects":[],"audio_fades":[],"audios":[],"beats":[],"canvases":[],"chromas":[],"color_curves":[],"drafts":[],"effects":[],"handwrites":[],"hsl":[],"images":[],"log_color_wheels":[],"manual_deformations":[],"masks":[],"material_animations":[],"placeholders":[],"plugin_effects":[],"primary_color_wheels":[],"realtime_denoises":[],"sound_channel_mappings":[],"speeds":[],"stickers":[],"tail_leaders":[],"text_templates":[],"texts":[],"transitions":[],"video_effects":[],"video_trackings":[],"videos":[]},"mutable_config":null,"name":"","new_version":"69.0.0","platform":{"app_id":3704,"app_source":"lv","app_version":"3.9.0","device_id":"ece93fefa6d73d0879f6cf6251e212fd","hard_disk_id":"da04071d52c1f66c291bc2f5b1f0e87f","mac_address":"864b94efa06c9456b10992695eba19c4","os":"mac","os_version":"12.5.1"},"relationships":[],"render_index_track_mode_on":false,"retouch_cover":null,"source":"default","static_cover_image_path":"","tracks":[],"update_time":0,"version":360000}