python_替换已有草稿中的素材
python_替换已有草稿中的素材
·
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}")
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)