diff --git a/src/service/easy_create_material.py b/src/service/easy_create_material.py index 1932146..ec7241d 100644 --- a/src/service/easy_create_material.py +++ b/src/service/easy_create_material.py @@ -61,17 +61,17 @@ def easy_create_material( try: # 4. 添加音频(必须的) - audio_added = add_audio_material(script, audio_url) + audio_added = add_audio_material(script, draft_id, audio_url) logger.info(f"Audio material added: {audio_added}") # 5. 添加视频(如果提供) if video_url and video_url.strip() and video_url.lower() != "null": - video_added = add_video_material(script, video_url) + video_added = add_video_material(script, draft_id, video_url) logger.info(f"Video material added: {video_added}") # 6. 添加图片(如果提供) if img_url and img_url.strip() and img_url.lower() != "null": - image_added = add_image_material(script, img_url) + image_added = add_image_material(script, draft_id, img_url) logger.info(f"Image material added: {image_added}") # 7. 添加文字(如果提供) @@ -91,12 +91,18 @@ def easy_create_material( raise CustomException(CustomError.MATERIAL_CREATE_FAILED) -def add_video_material(script: ScriptFile, video_url: str) -> bool: +def add_video_material(script: ScriptFile, draft_id: str, video_url: str) -> bool: """ 添加视频素材到草稿(固定5秒时长) + 与add_videos接口保持一致的处理方式: + 1. 创建规范的视频资源目录 + 2. 使用parse_video_data解析视频信息 + 3. 调用add_video_to_draft添加视频 + Args: script: 草稿文件对象 + draft_id: 草稿ID video_url: 视频文件URL Returns: @@ -105,7 +111,13 @@ def add_video_material(script: ScriptFile, video_url: str) -> bool: try: logger.info(f"Adding video material: {video_url}") - # 构造视频信息JSON(固定5秒时长) + # 1. 创建视频资源目录(与add_videos保持一致) + draft_dir = os.path.join(config.DRAFT_DIR, draft_id) + draft_video_dir = os.path.join(draft_dir, "assets", "videos") + os.makedirs(name=draft_video_dir, exist_ok=True) + logger.info(f"Created video directory: {draft_video_dir}") + + # 2. 构造视频信息JSON(固定5秒时长) video_infos = json.dumps([{ "video_url": video_url, "width": 1920, @@ -116,14 +128,20 @@ def add_video_material(script: ScriptFile, video_url: str) -> bool: "volume": 1.0 }]) - # 直接使用草稿对象添加视频轨道和片段 + # 3. 解析视频信息 from src.service.add_videos import parse_video_data, add_video_to_draft video_items = parse_video_data(video_infos) - if video_items: - track_name = f"video_track_{helper.gen_unique_id()}" - # 设置 relative_index=10 确保视频轨道在主视频轨道之上,避免与主轨道冲突 - script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10) - add_video_to_draft(script, track_name, "", video_items[0]) + if not video_items: + logger.error("No video items parsed") + return False + + # 4. 添加视频轨道 + track_name = f"video_track_{helper.gen_unique_id()}" + script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10) + logger.info(f"Added video track: {track_name}") + + # 5. 添加视频到轨道(传递正确的视频资源目录) + add_video_to_draft(script, track_name, draft_video_dir, video_items[0]) return True except Exception as e: @@ -131,12 +149,18 @@ def add_video_material(script: ScriptFile, video_url: str) -> bool: return False -def add_image_material(script: ScriptFile, img_url: str) -> bool: +def add_image_material(script: ScriptFile, draft_id: str, img_url: str) -> bool: """ 添加图片素材到草稿 + 与add_images接口保持一致的处理方式: + 1. 创建规范的图片资源目录 + 2. 使用parse_image_data解析图片信息 + 3. 调用add_image_to_draft添加图片 + Args: script: 草稿文件对象 + draft_id: 草稿ID img_url: 图片文件URL Returns: @@ -145,7 +169,13 @@ def add_image_material(script: ScriptFile, img_url: str) -> bool: try: logger.info(f"Adding image material: {img_url}") - # 构造图片信息JSON(默认尺寸和3秒显示时长) + # 1. 创建图片资源目录(与add_images保持一致) + draft_dir = os.path.join(config.DRAFT_DIR, draft_id) + draft_image_dir = os.path.join(draft_dir, "assets", "images") + os.makedirs(name=draft_image_dir, exist_ok=True) + logger.info(f"Created image directory: {draft_image_dir}") + + # 2. 构造图片信息JSON(默认尺寸和3秒显示时长) image_infos = json.dumps([{ "image_url": img_url, "width": 1024, @@ -154,14 +184,20 @@ def add_image_material(script: ScriptFile, img_url: str) -> bool: "end": 3000000, # 3秒(3 * 1000000微秒) }]) - # 直接使用草稿对象添加图片轨道和片段 + # 3. 解析图片信息 from src.service.add_images import parse_image_data, add_image_to_draft image_items = parse_image_data(image_infos) - if image_items: - track_name = f"video_track_{helper.gen_unique_id()}" - # 设置 relative_index=10 确保图片轨道在主视频轨道之上,避免与主轨道冲突 - script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10) - add_image_to_draft(script, track_name, "", image_items[0]) + if not image_items: + logger.error("No image items parsed") + return False + + # 4. 添加图片轨道 + track_name = f"image_track_{helper.gen_unique_id()}" + script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10) + logger.info(f"Added image track: {track_name}") + + # 5. 添加图片到轨道(传递正确的图片资源目录) + add_image_to_draft(script, track_name, draft_image_dir, image_items[0]) return True except Exception as e: @@ -169,12 +205,18 @@ def add_image_material(script: ScriptFile, img_url: str) -> bool: return False -def add_audio_material(script: ScriptFile, audio_url: str) -> bool: +def add_audio_material(script: ScriptFile, draft_id: str, audio_url: str) -> bool: """ 添加音频素材到草稿(固定5秒时长) + 与add_audios接口保持一致的处理方式: + 1. 创建规范的音频资源目录 + 2. 使用parse_audio_data解析音频信息 + 3. 调用add_audio_to_draft添加音频 + Args: script: 草稿文件对象 + draft_id: 草稿ID audio_url: 音频文件URL Returns: @@ -183,7 +225,13 @@ def add_audio_material(script: ScriptFile, audio_url: str) -> bool: try: logger.info(f"Adding audio material: {audio_url}") - # 构造音频信息JSON(固定5秒时长) + # 1. 创建音频资源目录(与add_audios保持一致) + draft_dir = os.path.join(config.DRAFT_DIR, draft_id) + draft_audio_dir = os.path.join(draft_dir, "assets", "audios") + os.makedirs(name=draft_audio_dir, exist_ok=True) + logger.info(f"Created audio directory: {draft_audio_dir}") + + # 2. 构造音频信息JSON(固定5秒时长) audio_infos = json.dumps([{ "audio_url": audio_url, "start": 0, @@ -191,14 +239,20 @@ def add_audio_material(script: ScriptFile, audio_url: str) -> bool: "volume": 1.0 }]) - # 直接使用草稿对象添加音频轨道和片段 + # 3. 解析音频信息 from src.service.add_audios import parse_audio_data, add_audio_to_draft audio_items = parse_audio_data(audio_infos) - if audio_items: - track_name = f"audio_track_{helper.gen_unique_id()}" - # 设置 relative_index=10 确保音频轨道在主音频轨道之上,避免与主轨道冲突 - script.add_track(track_type=TrackType.audio, track_name=track_name, relative_index=10) - add_audio_to_draft(script, track_name, "", audio_items[0]) + if not audio_items: + logger.error("No audio items parsed") + return False + + # 4. 添加音频轨道 + track_name = f"audio_track_{helper.gen_unique_id()}" + script.add_track(track_type=TrackType.audio, track_name=track_name, relative_index=10) + logger.info(f"Added audio track: {track_name}") + + # 5. 添加音频到轨道(传递正确的音频资源目录) + add_audio_to_draft(script, track_name, draft_audio_dir, audio_items[0]) return True except Exception as e: