
这是什么
剪映专业版的一个工程就是磁盘上的一个文件夹:draft_info.json 装时间轴,draft_meta_info.json 装工程信息,而它导入的每个素材都会被复制进这个目录。这个仓库是套在那层目录外面的 Python 封装,按 skill 的形式给 agent 加载。JyProject 新建或打开草稿,往命名轨道上追加片段,用同义词表把特效、滤镜、转场、动画的名字解析成枚举,把一段文案逐句变成配音、再按每句音频的实际时长压上一条字幕,并写入缩放运镜用的关键帧。data/ 下十二份 CSV 把剪映自己的云端音乐、音效、视频素材、滤镜和转场按 id 编成索引,于是 agent 能按中文名从剪映的库里挑东西。录屏走 ffmpeg 加一个记录点击的 Tk 窗口;网页动画由 Playwright 录成片段。只有导出这一步离开了文件系统,也是唯一分平台的一步。
谁做的一个 2016 年注册的 GitHub 账号,148 个公开仓库、60 个关注者。仓库 3,858 星、492 个 fork、16 个 watcher。贡献者表上除作者外还有三个人:@twodogegg 做 macOS 适配,@shaozheliu 修 5.9 的素材丢失,@Maxinsomnia 支持 macOS 上的草稿。main 上 117 次提交里有 114 次是作者本人的。
它是怎么搭起来的
组成 · 6草稿目录是接口,剪映是渲染器。剪映的一个工程就是一份带 JSON、也带自己那份素材拷贝的目录,所以写出这份目录的程序,等于做完了剪映时间轴会做的全部事情,而且一个控件都没碰。这个 skill 把这条路走到它走不通为止;走不通的地方它换方法,而不是假装还通:渲染本身、跑在 GPU 上的实时特效、剪映内置的一键功能,要么用 UI Automation 和浏览器去驱动界面,要么留给人。agent 与草稿格式之间还夹着两层查表:data/ 下的 CSV 把音乐、特效、滤镜、转场、文字动画的中文名对应到格式要的 id,同义词表则把 agent 写下的任何叫法解析到内嵌库里真正存在的那个枚举。
- SKILL.md 与 rules/
- agent 最先读的契约:哪类请求该跑哪个脚本、必须照抄的 skill 根目录探测代码,以及十一份规则文件,覆盖环境、素材、文字、关键帧、特效、录屏、命令行、网页特效、生成式剪辑和配音。
- scripts/jy_wrapper.py 与 scripts/core/
- 由四个 mixin 拼出来的
JyProject,底下是负责创建、加载、修复草稿,清洗工程名,看守路径,以及释放剪映工程占用的基类。 - scripts/vendor/pyJianYingDraft/
- 管奕轩的草稿格式库,Apache-2.0,连自己的 LICENSE 和一份本地改动清单一起放进仓库。把片段、轨道、素材与关键帧变成剪映读的那份 JSON 的,就是这一层。
- data/
- 十二份 CSV,把剪映自己的素材库变成可以按名字检索的东西:云端音乐、音效、云端视频、滤镜、转场、画面特效、文字动画、入场与出场动画、TTS 音色和本地音频缓存。
- tools/recording/ 与几个录制脚本
- 负责生产素材而不是读取素材的那一半:一个架在 ffmpeg 上的 Tk 录制器,会记录点击;由点击生成的关键帧;以及把 HTML 动画录成片段的 Playwright 录制器。
- tests/ 与 .github/workflows/ci.yml
- 一份 19 个用例的测试文件,对一批点名脚本跑的 lint 与格式化检查,仓库卫生检查和数据 schema 检查,全部跑在
windows-latest与 Python 3.12 上。
取舍,以及另一种做法
写草稿,让剪映去渲染 替代 自己渲染视频的程序
README 用作者自己的话划了这条线:这不是剪映的替代品,渲染和预览回放都留在剪映里,工具负责的是把时间轴搭好并点击导出。
把 pyJianYingDraft 放进仓库里带着走 替代 当成依赖装进来
scripts/vendor/README.md记下了就地打的补丁:5.9+ 的draft_info.json结构、稳定的local_material_id、ffprobe兜底与画面尺寸规整。这些补丁本身就是产品的一部分,所以库跟着仓库走。把导入的素材复制进草稿目录 替代 指向用户自己存放文件的位置
v1.7.0 把这条写成修复:为空的
local_material_id加上剪映清理自己的临时文件,两件事合起来就是 5.9+ 上的「检测到媒体丢失」;草稿自带一份拷贝之后,两者都不再要紧。agent 的剪辑脚本放在用户工程里跑 替代 写进 skill 目录
SKILL.md 把这列为第一条规则并附上理由:skill 目录装的是工具,
git pull更新的是它,业务代码混进去,这件事就做不到了。
依据luoluoluo22/jianying-editor-skill 的 README.md、SKILL.md、docs/api.md、docs/agent-playbook.md、rules/、scripts/vendor/README.md、CHANGELOG.md、VERSION、requirements.txt,以及 scripts/ 与 tools/ 下的代码,2026-10-10 读取。
制作过程
5 个阶段- 01
仓库是一个给 agent 读的文件夹,而且大半是数据
这个 skill 一共 184 个文件,其中 47 个在
assets/下:三组剪映自己的特效素材,里面有effect.prefab、main.scene、材质、贴图和 GLSL 着色器,外加一套 8 个文件的演示素材,打头的是 3 MB 的测试视频。剩下 137 个文件合起来约 2.6 MB,其中体积最大的一份根本不是脚本,而是 262 KB 的data/cloud_music_library.csv,一份剪映云端已有音乐的 id 索引。SKILL.md有 10 KB,是 agent 最先读的东西;rules/另有十一份文件。GitHub 把仓库的语言统计成 Python 第一、HTML 第二、GLSL 第三,而 GLSL 全在特效素材里。仓库创建于 2026-01-24,main上 117 次提交,时间从 2026-01-27 到 2026-09-11,其中 114 次来自作者本人的账号。VERSION写的是 1.7.0,CHANGELOG.md最新一条的日期是 2026-09-11。仓库从来没发过 release,也没打过 tag。 - 02
整个接口就是一个 JSON 文件,而映射是别人写的
改工程的方式,是在剪映打开它之前把
draft_info.json拼出来。从这份 JSON 到 Python 对象的那层映射不是这里写的:scripts/vendor/pyJianYingDraft/是管奕轩的 pyJianYingDraft 的副本,Apache-2.0,Copyright 2024,自带一份 LICENSE,scripts/vendor/README.md按这条许可的要求列出了本地改动。这些改动正是它被内嵌而不是当依赖装的原因:草稿格式换成了 5.9 与 6.x 用的draft_info.json,local_material_id由文件名生成,素材不再动不动丢失,pymediainfo缺失时改用ffprobe探测。requirements.txt里没有它的条目,所以从一份 clone 就能跑。在这层库之上,scripts/jy_wrapper.py只有 70 行,用四个 mixin 拼出JyProject。它的save()不只是写文件,还会给草稿引用到的云端素材补上 material id,并强制激活调节节点——一份引用了云端素材却没有这些字段的草稿,打开时那个素材是缺的。 - 03
剪映会锁住自己的草稿,于是封装去请它松手
分辨率在第一次调用
JyProject(...)时就定下来,默认 1920x1080,而规则文档两次提醒:用默认值建竖屏工程会出黑边。在 Windows 上,只要那份草稿还开在剪辑页,剪映就占着工程目录,创建会抛PermissionError。封装会重试三次,两次之间通过uiautomation伸手进正在运行的剪映,读它停在首页还是剪辑页,如果停在剪辑页就先把它切回首页再试。草稿目录里少了 JSON 会被当成损坏,overwrite=True时直接删掉重建。工程名会被清洗,每一条路径在删除之前都要和草稿根目录比对一次——v1.5.0 的日志里说的「阻止路径穿越」指的就是这一步。 - 04
配音用的是剪映自己的服务,密钥从这台机器上读出来
scripts/universal_tts.py不用自己的云端账号。它从剪映本地的 TTNet 配置里读出一个 device id,从用户目录下最新的几个日志文件里读出一个iid,然后带着源码里写死的app_id3704 和应用密钥,用自称JianyingPro/5.9.0.11632的 User-Agent,连上sami.bytedance.com的 WebSocket。有个环境变量可以关掉 TLS 校验,关掉时脚本会打印警告;默认是校验的,v1.5.0 的日志把这一条列为修复。这条链路失败时,退路是edge-tts和微软的音色。add_narrated_subtitles按中文标点把一段话切开,逐句生成一个音频文件,再在它上面压一条时长等于该音频时长的文字片段,字幕因此不可能和声音走散。第一个应答成功的后端会被锁定给整段话用:后半段若失败,它会直接报错,而不是把视频用第二个音色配完。 - 05
凡是不靠写文件完成的部分,不是点击就是浏览器
tools/recording/recorder.py是一个 Tk 窗口,在 Windows 上驱动 ffmpeg 的gdigrab与dshow,在 macOS 上用avfoundation,同时用pynput把鼠标和键盘事件写进录像旁边的 JSON 文件。scripts/smart_zoomer.py再把那些点击读成关键帧:推近、停留、还原。碰到剪映本身没有的特效,scripts/web_recorder.py起一个 Playwright 浏览器,把网页录成视频,等动画把window.animationFinished置位,上限 30 秒。导出这一步,工具彻底离开了文件系统:scripts/auto_exporter.py用 Windows 的 UI Automation 去点剪映的导出对话框。在 macOS 上调用它,返回的是退出码 2,以及一句「请在剪映里手动导出」。
他会告诉你什么
- 自动导出只支持 Windows,README 点名说剪映 5.9 或更低版本最稳。在 macOS 上调
scripts/auto_exporter.py,它返回退出码 2,并告诉调用者手动导出。 - README 在安装之前就先划掉三件事:CapCut 国际版完全不支持,手机端也不支持,而跑在剪映 GPU 上的功能——智能抠图、美颜、语音识别字幕——都无法从代码调用。
- 剪映会自动更新,而且阻止不了,这就是开着的第 24 号 issue。新版本会挪动导出自动化所点的那些控件,所以一次剪映更新就能弄坏最后一步,而这个仓库里什么都没改。
- 六个 issue 开着。其中 2026-09-16 提的那个列了七处「失败之后照样产出一支成片,只是成片是错的」;2026-09-22 提的那个要求:缺
ffprobe时素材探测应当降级,而不是中断导入。 - 录制器的「自动生成智能草稿」按钮执行的是
scripts/jy_wrapper.py apply-zoom,后面跟着--name、--video、--json。jy_wrapper.py根本没有参数解析,它的__main__只会建一个叫Refactor_Test_Project的工程,那几个参数从头到尾没人读。真正会应用缩放关键帧的apply_smart_zoom在scripts/smart_zoomer.py里,没有任何文件 import 它,而它开头是一句相对导入,单独运行这个文件必然失败。scripts/smart_rough_cut.py则 import 了属于另一个 skill 的api_client,失败被一个 warning 吞掉,模块里两个名字从此都是None。
相关档案
全部档案 →第 114 号
Wake
一个原生桌面应用,把各家编码 agent 私有目录里的会话读进同一个窗口:浏览、全文搜索(中文与代码子串一视同仁)、在原项目目录里一键恢复,同一个索引还开着 MCP 服务与一条输出逐字节相同的命令行,让 agent 自己把历史读回去,另外可以把别的机器上的会话用 SSH 镜像过来。
第 089 号
Zeron
一个 Rust 桌面程序,把你在用的编码 agent(Claude Code、Codex、Cursor、Devin、Grok、Hermes、Pi、Antigravity)装进同一个控制台,默认只在本机跑、不需要账号;只有你主动登录,它才会把这些会话同步到你其它的设备上。
第 133 号
AI Employees
八个开源 AI 员工,每个都是一份排班例程文件夹,独立覆盖一整个业务岗位。它们跑在你自己的机器上、用你已经在用的那个 agent:像你本人一样操作你已经登录的浏览器,把活儿起草好、填好、摆到最后一击之前,每跑一次都更懂你的生意,而它们碰过的每一份文件都归你。