t-aep
一个 大赦国际重写 令人惊叹的
爱 -爱 软件包,在效果之后
.aep 阅读器/写作机,在平庸的TypeScript中. 表现得一模一样
上游承诺 2cef9f4 (见 UPSTREAM_COMMIT: 数值相同,相同
错误, 字节相同的保存 .
这是一个概念证明项目——谨慎使用.
API在骆驼Case中使用了After Effect 的自有脚本名称(comp.frameRate, (中文(简体) ),
layer.transform.anchorPoint, (中文(简体) ), layer.threeDLayer, (中文(简体) ), group.property("ADBE Position")和联署材料公约:设置为地图形状(get编号 :set编号 :has编号 :
size),各团体有 length, (中文(简体) ), console.log(layer) 打印可读摘要.
文件保留着双胞胎的路径, 所以在 TS 文件的上游变化图
它触动。 Python语义 行为取决于(圆形,地板分出,
struct, (中文(简体) ), surrogateescape,(...) 居住于 src/pyrt/规则: RULEBOOK.md。 。 。 .
状态
逆上游被钉住(CI运行这一切,包括Py-aep) 差别,每推一推:
- 测试套件:所有15 431项上游测试翻译为
bun:test;15,369通过, 62 跳过缺失的系统字体 / OCIO配置 / AE 偏好—— 与 CPython 3.12 (英语). (运行时间跳过报告作为包子计数的通过) - 对所有644个上游抽样项目进行差别检查
(单位:千美元)
tools/diff/:被解析的项目的每一个公共属性都是一样的,以及 25,427个确定性编辑通过公共设置提供相同的结果和 字节相同的保存文件 . - 在节点、 Bun、浏览器和 工人们.
tsc报告0出错strict在任何地方(图书馆、测试、工具)。 图书馆藏有16个any和54种说法,其中多数 在py -aep本身使用不受限制cast(); 如果任意一个数增长, 闸门会失效 。 第26条TODO(port)标记名称 (fontkit/harfbuzzjs vs 字体Tools/uharfbuzz文本衡量标准, argparse 帮助 CLIs 中的文本,整数超过 2^53,没有 LZMA 解码器.
安装
bun add @bevyl-ai/ts-aep
import { parse } from "@bevyl-ai/ts-aep";
const app = parse("project.aep");
for (const comp of app.project.compositions) console.log(comp.name, comp.duration);
app.project.save("copy.aep");
使用
该库在Node 22.3+, Bun,浏览器和Cloudflare Workers中运行不变.
节点和 Bun 装入字体kit 和 yaml(文本参数、 OCIO 配置);
捆绑者和工人解决 browser 编号 : workerd 出口,进口它们
上前边.
parse 选择路径或文件的字节; project.save(path) 走一条路。 全体
主机访问通过 src/pyrt/host.ts: 节点和邦使用自己的
node:fs, (中文(简体) ), node:path 财务报告和审定财务报表 node:os (通过) process.getBuiltinModule; 主机
没有它们,它们就能得到内存文件系统和POSIX路径.
项目解码为: comp.layers 将每一层从自己的层中建起
设置,层的属性(变形、效果、面具、文本、.)是
第一次读时解码。 只读取层属性的脚本
(名称,时间,标签,开关,来源)从不构建属性. 读取a
属性层没有(source 在摄像机上 把它放在它的
属性,用于构建它们;测试层的类型取而代之.
超越 py -aep 的 API : @bevyl-ai/ts-aep/svg 出口py-aep的公众 svg
模块(readSvg, (中文(简体) ), buildShapeLayerContents, (中文(简体) ), parseTransform(三);
project.addEffectDefinitions(efdg) 进口效果定义
保存在另一个工程中, 所以 addProperty 可以增加这些影响;
FontObject.technology 财务报告和审定财务报表 designVector 可写( CFF 字体需要)
CT_TYPE1_FONT和 TextDocument.fonts 列出文档中的每个字体
登记册; TextLayer.continuouslyRasterize 设置崩溃切换 AE
脚本拒绝文本( 对未编辑文本的影响 )
录像); Property.arbitraryData 读取和写入数据所保持的效果
除了一个参数(Hue/饱和的主人住在那里,而不是在他们的
滑动; FeatherPoint.of 建立面具羽毛点; Shape.bounds 这是
框中存储形状的分数.
COS真实的 {:.10g} 写作时,必写出固定的分数,
后影响需要.
类型
儿童按匹配名称排列: group.property("ADBE Position") 是一个
Property<number[]> 财务报告和审定财务报表 layer.property("ADBE Transform Group") 一个团体。 这个
内置组的儿童(变形、文本、相机/光/材料)
选项、口罩、形状填充、中风和变换)也按其
属性名称, 如 py- aep :
const layer = comp.layers[0];
const position: number[] = layer.transform.position.value;
const text = comp.textLayers[0].text?.sourceText.value.text;
其属性名称取决于地层的儿童(anchorPoint 驾驶AV
层是相机的 pointOfInterest· ; rotation 变成 zRotation 在三维上
层)是用匹配名称到达的。 其他内在儿童
运行时属性名称, 未类型; 达到了第三方效果参数
与 group.property("Display Name")。 。 。 .
节点/ Bun
import * as aep from "@bevyl-ai/ts-aep";
const app = aep.parse("project.aep");
app.project.save("copy.aep");
错误
抛出的一切 AepError,作为四种类型之一:
| 类 | 掷出时 |
|---|---|
InvalidValueError | 效果后值将拒绝, 或未解码的字节 |
NotFoundError | 没有项目、财产、密钥或索引 |
UnsupportedError | 文件、 层或属性类型不支持操作 |
FileSystemError | 无法读取或写入文件 |
import { AepError, FileSystemError, parse } from "@bevyl-ai/ts-aep";
try {
parse("missing.aep");
} catch (e) {
if (e instanceof FileSystemError) console.log("cannot read it");
else if (e instanceof AepError) console.log(e.name, e.message);
else throw e;
}
糟糕的争论让JS自己的 TypeError。 。 。 .
浏览器和工人
构建捆绑,然后移动字节入出 memfs 通常的电话:
bun build src/py_aep/index.ts --target=browser --outdir=dist/browser
import * as py_aep from "./dist/browser/index.js";
py_aep.memfs.write("/in.aep", new Uint8Array(await (await fetch(url)).arrayBuffer()));
py_aep.parse("/in.aep").project.save("/out.aep");
const saved: Uint8Array = py_aep.memfs.read("/out.aep");
memfs 还有 exists, (中文(简体) ), list, (中文(简体) ), remove 财务报告和审定财务报表 clear。脚印、字体、电算中心
配置文件或 OCIO 配置项目仅在您写入时被找到
输入 memfs 在工程预期的路径上. useMemoryFs() 强迫
记忆后端中 node:fs 也存在; fsBackend() 报告
已激活.
主机提示 :
-
节点必须是22.3+(或20.16+):更老的节点没有
process.getBuiltinModule, (中文(简体) ), 所以图书馆悄悄地 回到了记忆中 真正的路径是 未发现. -
文本重构形状与 harfbuzz (wasm). 在浏览器中服务
node_modules/harfbuzzjs/hb.wasm在捆绑的旁边index.js. 在何处 无法装入, 库仍然装入, 只塑造升起( 控制台) 显示一次终止命令. -
Cloudflare工人拒绝编译取自字节的相片,所以塑造是 那里没有,其他东西都行 与
nodejs_compat旗帜,process.getBuiltinModule("node:fs")返回工人自己的虚拟 fs(只有)/tmp可写, 每一份请求); 呼叫useMemoryFs()用于memfs换句话说 解析并保存为同步和 CPU 绑定:大型工程可以被击中 工人CPU时间限制. -
没有宿主,
platform实值"browser",所以一个新项目的默认值 平台为macOS(如同任何非窗口主机),tmpdir()实值/tmp, (中文(简体) ),homedir()实值/环境是空的.
烟雾检查: bun tools/browser-smoke/run.ts [N] 运行捆绑与
process 在 N 样本上隐藏( 记忆fs, POSIX 路径) 和检查保存
字节相同; tools/browser-smoke/index.html 在真实中做同样的
浏览器(文件中的指示); tools/browser-smoke/workers-run.ts 运行
同样的检查通过微型工地进行(见标题).
发展
bun install
tools/fetch-samples.sh # upstream checkout + LFS samples (~240 MB)
bun test
许可证
麻省理工学院. 来源于 py-aep,版权(c)2023 Fortiche出品;参见: LICENSE。 。 。 .
释放
从 GitHub 动作中发布 npm 信任的出版版本( OIDC), 所以没有 npm 令牌存储在任何地方 :
- 一次性, 在 npmjs.com 上: 包
@bevyl-ai/ts-aep* 设置 * 可信出版 * GitHub 动作, 拥有者bevyl-ai,仓库ts-aep工作流程release.yml。 。 。 . 如果 npm 需要软件包先存在, 请首先手动发布 (单位:千美元)npm login,则bun publish --access public并添加可信赖的 之后出版商. - 弹出
version内package.json,然后承诺git tag v<version> && git push --tags。 。 。 ..github/workflows/release.yml运行测试 和包装的tar-ball烟雾 (单位:千美元)tools/pack_smoke.sh,则npm publish与出处.