把 Bernard Review 接入工作室流水线。包括 tracker 配置、带标识符的播放列表、备注回传、用脚本构建的 Version Board 以及命名规则。
本页面向流水线团队。它介绍如何从生产 tracker 把一次审阅带入播放器,以及如何取出带有正确标识符的备注。文中提到的命令在 Python API 与 IPC 中说明。
Bernard Engine(AArts Lab 的生产 tracker)以及任何自研流水线,在此版本中都通过三种机制对接:带 x_tracking 块的 .bpl 播放列表、build-matrix 命令和备注导出。从播放器直接发布到 Bernard Engine(Publish to Bernard Engine 按钮)即将推出。
.bpl 播放列表是一个 JSON 文件(schema:api/playlist.schema.json)。每个片段都可以带有一个包含 tracker 标识符的 x_tracking 块。请在您的工具中写出它,然后用 load-playlist 载入:
{
"current_idx": 0,
"playlist": [
{
"path": "//server/proj/SQ010/SH010/comp/SQ010_SH010_COMP_v003.%04d.exr",
"in_frame": 1001,
"out_frame": 1100,
"x_tracking": {
"shot_id": "shot_1001",
"shot_name": "SQ010_SH010",
"version_id": "v003",
"task": "Compositing"
}
}
]
}
x_tracking 的字段有:shot_id、shot_name、version_id、shotgrid_version_id(整数)、ftrack_id、artist、task。保存播放列表时会保留该块。
export-notes 无需任何对话框,就会把 export.json 和 export.html 写入指定的文件夹,并为每个有标注的帧生成一个 JPEG(schema:api/notes_payload.schema.json)。对每个片段,它给出:name、status(Pending、Approved 或 Not Approved)、note、frames(每个有标注的帧的编号和文件),以及(如果载入时存在)原样的 x_tracking 块。这样,脚本就可以按标识符把每条备注送回正确的版本,无需比对文件名。
client.load_playlist("D:/review/SQ010_dailies.bpl")
# ... the review takes place ...
client.export_notes("D:/review/SQ010_dailies_notes")
文件在后台写入:请等 export.json 更新完毕后再读取。
Version Board(Versions)会根据文件名自行填充。流水线也可以用 build-matrix 直接发送现成的内容,无需任何命名约定。每个序列一条命令;每个要提供的版本对应一个部门条目(同一个部门发送两次、各带一个版本,可填满它的列表):
{"cmd": "build-matrix", "sequence": "SQ010", "id": "seq_42",
"shots": [
{"name": "SH010", "id": "shot_1001", "departments": {
"ANIM": {"version": "v002", "path": "//server/proj/SQ010/SH010/anim/SQ010_SH010_ANIM_v002.mov", "version_id": "ver_77812", "id": "task_501"},
"LGT": {"version": "v001", "path": "//server/proj/SQ010/SH010/lgt/SQ010_SH010_LGT_v001.mov", "version_id": "ver_77950"}}},
{"name": "SH020", "id": "shot_1002", "departments": {
"COMP": {"version": "v003", "path": "//server/proj/SQ010/SH020/comp/SQ010_SH020_COMP_v003.mov", "version_id": "ver_78001"}}}]}
每个尚不在播放列表中的 path 都会被添加进去。get-matrix 读回该看板。在 Python 中:client.build_matrix(sequence, shots, matrix_id) 和 client.get_matrix()。
对任何 tracker,做法都相同:查询一个序列的版本,按镜头和部门(流水线环节)分组,把媒体路径放入 path,把版本标识符放入 version_id。
不使用脚本时,添加的每个片段都会按配置文件夹中 naming_rules.json 文件里的规则解析(参见安装与 IT):
{"regex": "^([A-Za-z0-9]+)_([A-Za-z0-9]+)_([A-Za-z]+)_v([0-9]+)",
"groups": {"sequence": 1, "shot": 2, "department": 3, "version": 4}}
这就是 [Sequence]_[Shot]_[Department]_v[Version].[ext] 约定,例如 SQ010_SH010_ANIM_v002.mov。请根据贵工作室的约定调整正则表达式和分组编号。不匹配的文件会归入 DefaultSeq / Base。
Tracker 窗口可直接连接这三种 tracker。部署时,可以在配置文件夹的 trackers.json 中预先配置站点;该文件从不保存机密信息(读取时,看起来像机密信息的键会被丢弃):
{"sites": [{
"id": "demo-kitsu", "kind": "kitsu",
"base_url": "https://kitsu.example.test",
"user": "reviewer@example.test",
"proxy": "", "ca_cert_file": "",
"path_map": [{"from": "/mnt/show/",
"to": {"windows": "S:\\show\\", "linux": "/mnt/show/", "macos": "/Volumes/show/"}}],
"status_map": {"approved": "done"}
}]}
kind:kitsu、ftrack 或 flow。user:Kitsu 为电子邮件,ftrack 为 API 用户,Flow 为脚本名称。base_url 必须以 https:// 开头(http:// 仅限指向 localhost)。proxy:留空表示使用环境的代理,direct 表示不使用代理。ca_cert_file:工作室证书颁发机构的 PEM 文件。path_map 为每个系统转换 tracker 的路径;status_map 把播放器的状态(pending、approved、not_approved)对应到 tracker 的状态。BERNARD_TRACKER_<ID>_SECRET,其中 <ID> 是站点的 id 大写形式,并把 A-Z 和 0-9 以外的每个字符替换为 _:对 demo-kitsu 而言,就是 BERNARD_TRACKER_DEMO_KITSU_SECRET。环境变量优先。在脚本中,tracker-sites、tracker-connect、tracker-projects、tracker-playlists、tracker-load-playlist、tracker-publish(可用 dry_run 试运行)、tracker-download-media 和 tracker-cancel 命令完成窗口所做的事;它们的结果以事件的形式到达。携带机密信息的请求会被拒绝。
从 tracker 载入的片段还会在 x_tracking 中保留 tracker 的类型、站点、任务、播放列表、媒体引用,以及(发布之后)所发送备注的指纹:未更改的备注绝不会被发布两次。
进一步了解:完整手册的第 6.4 和 6.6 部分(播放器中的 Help > User Guide),以及 api/ 文件夹中的 schema。