python_替换已有草稿中的素材

import pyJianYingDraft as draft
from pyJianYingDraft import exceptions
from pyJianYingDraft import VideoMaterial
import os

def batch_replace_jianying_material(template_draft_name: str,
                                    new_draft_name: str,
                                    material_mapping_list: list,
                                    drafts_folder_path: str) -> str:
    """
    剪映草稿批量素材替换:拷贝模板草稿,并循环替换指定素材

    参数:
        template_draft_name: 模板草稿名称(原始待拷贝的草稿名)
        new_draft_name: 新草稿名称(拷贝后的副本草稿名)
        material_mapping_list: 新素材与旧素材的对应关系列表
                               结构:[[新素材路径, 轨道上旧素材名称], [...], ...]
        drafts_folder_path: 剪映草稿文件夹根路径

    返回:
        批量替换成功的提示信息
    """
    # 1. 初始化草稿文件夹并拷贝模板生成新草稿(核心步骤1)
    draft_folder = draft.DraftFolder(drafts_folder_path)
    script = draft_folder.duplicate_as_template(template_draft_name, new_draft_name)

    #  替换结果提示
    result_text = ""

    # 2. 循环遍历素材对应列表,批量替换素材(核心步骤2)
    for index, (new_mat_path, old_mat_name) in enumerate(material_mapping_list, start=1):
        # 2.1 获取文件后缀,判断素材类型并创建对应对象
        file_ext = os.path.splitext(new_mat_path)[1].lower()
        video_extensions = {'.mp4', '.mov', '.avi', '.gif', '.jpg', '.jpeg', '.png'}
        audio_extensions = {'.mp3', '.wav', '.flac', '.m4a'}

        if file_ext in video_extensions:
            new_material = draft.VideoMaterial(new_mat_path)
        elif file_ext in audio_extensions:
            new_material = draft.AudioMaterial(new_mat_path)
        else:
            raise ValueError(f"第{index}组素材格式不支持:{new_mat_path},后缀:{file_ext}")

        # 2.2 确定素材类型对应的列表和名称键
        is_video = isinstance(new_material, VideoMaterial)
        mat_list_key = "videos" if is_video else "audios"
        name_key = "material_name" if is_video else "name"
        target_material_list = script.imported_materials[mat_list_key]

        # 2.3 查找目标旧素材
        target_json_obj = None
        for mat in target_material_list:
            if mat.get(name_key) == old_mat_name:
                if target_json_obj is not None:
                    raise exceptions.AmbiguousMaterial(
                        f"第{index}组素材:找到多个名为 '{old_mat_name}' 的{mat_list_key}素材")
                target_json_obj = mat

        if target_json_obj is None:
            raise exceptions.MaterialNotFound(
                f"第{index}组素材:未找到名为 '{old_mat_name}' 的{mat_list_key}素材")

        # 2.4 构建更新字段并替换素材
        update_fields = {
            name_key: new_material.material_name,
            "path": new_material.path,
            "duration": new_material.duration,
        }

        # 视频素材特有字段更新
        if is_video:
            target_json_obj.update({
                "type": new_material.material_type,
                "has_audio": True
            })

        # 批量更新素材信息
        target_json_obj.update(update_fields)

        result_text += f"{old_mat_name} -> {new_material.material_name}\n"

    # 3. 保存所有修改(关键步骤:持久化到本地文件)
    script.save()

    return f"🎉 批量素材替换大功告成!  \n📄 草稿已保存为:{new_draft_name}\n\n📽️ 替换详情:\n{result_text}"

# -------------------------- 便捷调用示例 --------------------------
if __name__ == "__main__":
    # 配置你的输入参数
    TEMPLATE_NAME = "请勿在高版本打开-副本"  # 模板草稿名称
    NEW_DRAFT_NAME = "视频草稿33"  # 新草稿名称
    # 新素材路径与旧素材名称对应列表
    MATERIAL_MAPPING = [
        ["D:\\Desktop\\快剪\\切水果开头_柠檬.mp4", "切水果开头_草莓.mp4"],
        ["D:\\Desktop\\快剪\\君不见.mp4", "后贴视频.mp4"]
    ]
    DRAFTS_FOLDER = "D:\\download_software\\JianyingPro Drafts"  # 剪映草稿文件夹路径

    # 调用批量替换函数
    try:
        result = batch_replace_jianying_material(
            template_draft_name=TEMPLATE_NAME,
            new_draft_name=NEW_DRAFT_NAME,
            material_mapping_list=MATERIAL_MAPPING,
            drafts_folder_path=DRAFTS_FOLDER
        )
        print(result)
    except (exceptions.AmbiguousMaterial, exceptions.MaterialNotFound, ValueError) as e:
        print(f"批量替换失败:{e}")
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐