diff --git a/src/service/gen_video.py b/src/service/gen_video.py index 42e5a25..bf1cb27 100644 --- a/src/service/gen_video.py +++ b/src/service/gen_video.py @@ -5,6 +5,7 @@ import src.pyJianYingDraft as draft from src.pyJianYingDraft import ExportResolution, ExportFramerate import config import os +from uiautomation import UIAutomationInitializerInThread def gen_video(draft_url: str) -> (str, str): @@ -21,15 +22,27 @@ def gen_video(draft_url: str) -> (str, str): # 从URL中提取草稿ID draft_id = helper.get_url_param(draft_url, "draft_id") - if (not draft_id) or (draft_id not in DRAFT_CACHE): + if not draft_id: return "", "无效的草稿URL" - # 此前需要将剪映打开,并位于目录页 - ctrl = draft.JianyingController() + # 生成输出文件路径 + outfile = os.path.join(config.DRAFT_DIR, f"{helper.gen_unique_id()}.mp4") - # 然后即可导出指定名称的草稿, 注意导出结束后视频才会被剪切(重命名)至指定位置 - ctrl.export_draft("draft_id", "C:\\workspace\\test.mp4") + try: + with UIAutomationInitializerInThread(): + logger.info("begin to export draft: %s -> %s", draft_id, outfile) - logger.info(f"gen video success: %s", os.path.join(config.DRAFT_DIR, draft_id)) - return draft_url, "视频生成成功" + # 此前需要将剪映打开,并位于目录页 + ctrl = draft.JianyingController() + # 然后即可导出指定名称的草稿, 注意导出结束后视频才会被剪切(重命名)至指定位置 + ctrl.export_draft(draft_id, outfile) + if not os.path.exists(outfile): + # 个别版本剪映不会抛异常,但文件未生成 + raise RuntimeError("剪映导出结束但目标文件未生成,请检查磁盘空间或剪映版本") + except Exception as exc: # 捕获 COM/剪映/磁盘等所有异常 + logger.exception("export draft failed: draft_id=%s, error=%s", draft_id, exc) + return "", f"导出草稿失败: {exc}" + + logger.info(f"export draft success: %s", outfile) + return outfile, "视频生成成功" diff --git a/src/utils/helper.py b/src/utils/helper.py index d8c3a19..c68dc3e 100644 --- a/src/utils/helper.py +++ b/src/utils/helper.py @@ -2,6 +2,8 @@ from urllib.parse import urlparse, parse_qs import os import requests import mimetypes +import datetime +import uuid def get_url_param(url: str, key: str, default=None): @@ -84,4 +86,13 @@ def download(url, save_dir, filename, limit=30*1024*1024, timeout=300) -> str: # 清理可能已部分下载的文件 if os.path.exists(save_path): os.remove(save_path) - raise e \ No newline at end of file + raise e + +def gen_unique_id() -> str: + """ + 生成唯一ID + """ + timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + unique_id = uuid.uuid4().hex[:8] + + return f"{timestamp}{unique_id}" \ No newline at end of file