davinci-resolve-mcp 4.11.1 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/README.md +4 -4
- package/README.zh-CN.md +5 -5
- package/docs/SKILL.md +23 -2
- package/docs/guides/subtitle-track-editing.md +118 -3
- package/docs/guides/title-library-automation.md +109 -0
- package/docs/install.md +2 -2
- package/docs/kernels/audio-fairlight-kernel.md +4 -2
- package/docs/kernels/fusion-composition-kernel.md +9 -0
- package/docs/notes/subtitle-live-automation-audit.md +82 -0
- package/docs/notes/title-library-acceptance.md +76 -0
- package/docs/reference/api-coverage.md +1 -1
- package/docs/reference/api-limitations.md +26 -7
- package/docs/reference/readwrite-symmetry.md +3 -2
- package/install.py +2 -2
- package/package.json +3 -1
- package/resolve-advanced/README.md +5 -1
- package/resolve-advanced/assets/lollipop-track.xml +59 -0
- package/resolve-advanced/assets/word-highlight-track.xml +61 -0
- package/resolve-advanced/package.json +1 -0
- package/resolve-advanced/server/subtitle-db.mjs +1 -0
- package/resolve-advanced/server/subtitle-timeline.mjs +81 -0
- package/resolve-advanced/vendor/drp-format/subtitle-preset.js +27 -9
- package/scripts/edit_subtitle_timeline.mjs +12 -0
- package/scripts/title_frame_metrics.py +13 -0
- package/scripts/title_library_report.py +95 -0
- package/src/granular/common.py +1 -1
- package/src/granular/project.py +18 -1
- package/src/granular/resolve_control.py +23 -0
- package/src/granular/timeline_item.py +2 -1
- package/src/resolve_mcp_server.py +1 -1
- package/src/server.py +148 -23
- package/src/utils/api_truth.py +124 -10
- package/src/utils/app_control.py +92 -0
- package/src/utils/bool_params.py +23 -0
- package/src/utils/destructive_hook.py +9 -3
- package/src/utils/execution_lifecycle.py +7 -0
- package/src/utils/qa_privacy.py +27 -0
- package/src/utils/subtitle_live.py +197 -0
- package/src/utils/title_controls.py +97 -0
- package/src/utils/title_library.py +44 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,116 @@
|
|
|
2
2
|
|
|
3
3
|
Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
|
|
4
4
|
|
|
5
|
+
## What's New in v4.13.0 — Resolve 21.1 render-setting parity, `SetHighPriority(bool)`, and a project-destroying preset order
|
|
6
|
+
|
|
7
|
+
Lands the three items queued for @legionsound in #207. The 21.1 behaviour
|
|
8
|
+
below is **their measurement on Studio 21.1.0.14 / macOS**, recorded as
|
|
9
|
+
*reported*; this machine runs 19.1.3.7 and did not reproduce it.
|
|
10
|
+
|
|
11
|
+
### New
|
|
12
|
+
|
|
13
|
+
- **`resolve_control set_high_priority` takes `high`** (alias
|
|
14
|
+
`high_priority`, default `true`), and there is a new granular
|
|
15
|
+
**`set_high_priority(high)`** tool. On 21.1+ it calls
|
|
16
|
+
`SetHighPriority(bool)`, which 21.1 types as script execution priority and
|
|
17
|
+
which is reversible there: `high=false` restores normal. The no-argument call
|
|
18
|
+
this server used to make returns `False` on 21.1 and does nothing. Builds
|
|
19
|
+
before 21.1 keep the no-argument call, and `high=false` is refused on them,
|
|
20
|
+
because they cannot lower priority without a restart. `high` is coerced
|
|
21
|
+
(`"false"` is false); anything that doesn't name a boolean is refused before
|
|
22
|
+
any call. No build has a getter, so results carry `readback: null` and claim
|
|
23
|
+
no readback. Registered as a write in both the destructive registry and the
|
|
24
|
+
lifecycle risk sets (MEDIUM).
|
|
25
|
+
- **Compound render settings accept `AudioFormat` and `UseUniqueFilenames`.**
|
|
26
|
+
The compound whitelist held 31 of the 33 typed `RenderSettings` fields and
|
|
27
|
+
reported these two as ignored; granular already forwarded them. A test now
|
|
28
|
+
checks the whitelist against every field of the bundled 21.1 stub's
|
|
29
|
+
`RenderSettings`. `UseUniqueFilenames` is coerced on every path (compound
|
|
30
|
+
`set_settings`, `safe_set_render_settings`, `prepare_render_job`, granular
|
|
31
|
+
`set_render_settings`), and an unrecognised value is refused with
|
|
32
|
+
`INVALID_RENDER_SETTING`. `AudioFormat` with `ExportVideo: true` warns,
|
|
33
|
+
since the stub documents it for audio-only renders.
|
|
34
|
+
|
|
35
|
+
### API truth ledger
|
|
36
|
+
|
|
37
|
+
- **`Project.StartRendering` is state-dependent** (reported, 21.1.0.14):
|
|
38
|
+
freshly configured jobs sometimes return `False` and stay Ready, while an
|
|
39
|
+
identical later job completes. Direct official calls reproduced both
|
|
40
|
+
outcomes. Mapped to `render start`, so the fact rides on its results. Verify
|
|
41
|
+
job status and output; nothing retries automatically.
|
|
42
|
+
- **Project-settings presets mutated before a project's first `SaveProject`
|
|
43
|
+
destroy the project** (reported, 21.1.0.14, reproduced twice): saving a
|
|
44
|
+
preset, changing resolution, then updating, applying or deleting the preset,
|
|
45
|
+
then saving and closing. Every call returned `True` and SQLite
|
|
46
|
+
`integrity_check` said `ok`, but `LoadProject` then failed with "DaVinci
|
|
47
|
+
Resolve failed to open project". Save the project once before any preset
|
|
48
|
+
write, and prove it survived only by reloading it. No preset-write wrappers
|
|
49
|
+
ship yet; this entry lands first on purpose.
|
|
50
|
+
- The `Resolve.SetHighPriority` entry is now version-scoped: irreversible with
|
|
51
|
+
no argument before 21.1 (measured on 19.1.3.7), and a reversible boolean on
|
|
52
|
+
21.1 (reported).
|
|
53
|
+
|
|
54
|
+
### Counts
|
|
55
|
+
|
|
56
|
+
- Granular tools 389 → 390; compound stays at 37. Docs and generated agent
|
|
57
|
+
rules updated.
|
|
58
|
+
|
|
59
|
+
## What's New in v4.12.0 — Live subtitle presets and title text across Fusion title tools
|
|
60
|
+
|
|
61
|
+
Contributed by @sidevconcept (#281). The live behaviour below rests on their
|
|
62
|
+
synthetic runs on **Resolve Studio 21.1.0.17 / Windows**; this release was not
|
|
63
|
+
re-measured live here (the maintainer's machine runs 19.1.3.7).
|
|
64
|
+
|
|
65
|
+
### New
|
|
66
|
+
|
|
67
|
+
- **`timeline_ai(action="list_title_presets")`** inventories the installed
|
|
68
|
+
factory Fusion titles and subtitle presets: local archive, category and full
|
|
69
|
+
template ID. `templates_archive` points it at a custom installation. It is an
|
|
70
|
+
inventory, not a claim that each preset works live.
|
|
71
|
+
- **`timeline_ai(action="set_subtitle_preset")`** applies an installed subtitle
|
|
72
|
+
preset and common literal style inputs (font, size, position and so on) to a
|
|
73
|
+
subtitle track while Resolve stays open. It writes a **new timeline
|
|
74
|
+
revision** and keeps the original, compares the edit inventory, and re-exports
|
|
75
|
+
through Resolve to confirm the preset and controls were kept. It restores the
|
|
76
|
+
original timeline on failure.
|
|
77
|
+
- `dry_run` / `dryRun` are coerced at the dispatcher, so `"true"` previews
|
|
78
|
+
and never imports. A preview that would need a live capture is refused.
|
|
79
|
+
- The result lists `verified_components` (track counts, item names and
|
|
80
|
+
bounds, media IDs, preset controls) and `unverified_components` (markers,
|
|
81
|
+
grades, other Fusion comps, audio). Native readback is not render
|
|
82
|
+
verification, and the revision is not certified as a full copy.
|
|
83
|
+
- Staging exports are removed on success and kept for diagnosis on failure
|
|
84
|
+
(`staging_retained`, `staging_directory`).
|
|
85
|
+
- **`timeline.set_title_text` / `get_title_text` reach more than TextPlus.** The
|
|
86
|
+
Fusion-comp fallback now finds literal text on TextPlus, sText, Text3D and
|
|
87
|
+
MultiText (`TextN.StyledText` in native `TextOrder`). It follows
|
|
88
|
+
`StyledTextFollower` and `PublishText` without disconnecting animation, and it
|
|
89
|
+
skips connected, expression-driven, locked and disabled inputs rather than
|
|
90
|
+
flattening them. MultiText editing was validated only on Studio 21.1.0.17 /
|
|
91
|
+
Windows.
|
|
92
|
+
- **`scripts/edit_subtitle_timeline.mjs`** (backed by
|
|
93
|
+
`resolve-advanced/server/subtitle-timeline.mjs`) inspects an exported
|
|
94
|
+
subtitle track, or writes a new file with a bundled preset reference
|
|
95
|
+
(`Word Highlight`, `Lollipop`) or a native subtitle-template reference applied.
|
|
96
|
+
- Synthetic title-library validation scripts write private QA reports with
|
|
97
|
+
relative image links; `src/utils/qa_privacy.py` replaces host paths and
|
|
98
|
+
project/timeline names in saved records.
|
|
99
|
+
|
|
100
|
+
### Docs
|
|
101
|
+
|
|
102
|
+
- New guides: `docs/guides/title-library-automation.md` and
|
|
103
|
+
`docs/guides/subtitle-track-editing.md`.
|
|
104
|
+
|
|
105
|
+
### Verification
|
|
106
|
+
|
|
107
|
+
- Contributor (Studio 21.1.0.17 / Windows, synthetic media): all 134 installed
|
|
108
|
+
factory Fusion presets passed native application, literal text/property
|
|
109
|
+
readback and sampled rendered-frame checks; all 23 subtitle presets applied
|
|
110
|
+
without a restart.
|
|
111
|
+
- Here: Python offline suite and Node advanced suite (fresh `npm ci`) green;
|
|
112
|
+
API parity, api-limitations, read/write symmetry, agent-rule drift and
|
|
113
|
+
`npm pack` clean.
|
|
114
|
+
|
|
5
115
|
## What's New in v4.11.1 — `.cube` input ranges, `"false"` import flags and the caption character cap
|
|
6
116
|
|
|
7
117
|
Three fixes from @Dev-next-gen (#286, #287, #288), each with a reproduction and a
|
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
English | [简体中文](README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
|
-
[-blue.svg)](#server-modes)
|
|
9
9
|
[-18%20tools-blueviolet.svg)](#server-modes)
|
|
10
10
|
[](docs/reference/api-coverage.md#test-results)
|
|
11
11
|
[](https://www.blackmagicdesign.com/products/davinciresolve)
|
|
@@ -133,7 +133,7 @@ The command starts a loopback-only server and opens the control panel in your br
|
|
|
133
133
|
| Mode | Entry point | Tools | Best for |
|
|
134
134
|
|------|-------------|-------|----------|
|
|
135
135
|
| Compound | `src/server.py` | 37 | Default mode for most assistants. Related Resolve operations are grouped behind action parameters to keep context usage low. |
|
|
136
|
-
| Full / granular | `src/server.py --full` or `src/resolve_mcp_server.py` |
|
|
136
|
+
| Full / granular | `src/server.py --full` or `src/resolve_mcp_server.py` | 390 | Power users who want one MCP tool per Resolve API method. |
|
|
137
137
|
|
|
138
138
|
The compound server is recommended unless you specifically need the granular one-tool-per-method surface.
|
|
139
139
|
|
|
@@ -410,7 +410,7 @@ The default server is a local stdio process launched by your MCP client; it does
|
|
|
410
410
|
|
|
411
411
|
| Metric | Value |
|
|
412
412
|
|--------|-------|
|
|
413
|
-
| MCP Tools | **37** compound / **
|
|
413
|
+
| MCP Tools | **37** compound / **390** granular (live server) |
|
|
414
414
|
| Advanced (offline) tools | **18** — .drp/.drt/.drx + DB authoring, no Resolve running |
|
|
415
415
|
| Kernel Actions | **136** guarded workflow actions across 9 compound tools |
|
|
416
416
|
| API Methods Covered | **361/361** (100%) |
|
package/README.zh-CN.md
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | 简体中文
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
|
-
[-blue.svg)](#服务器模式)
|
|
9
9
|
[-18%20tools-blueviolet.svg)](#服务器模式)
|
|
10
10
|
[](docs/reference/api-coverage.md#test-results)
|
|
11
11
|
[](https://www.blackmagicdesign.com/products/davinciresolve)
|
|
12
12
|
[](https://www.python.org/downloads/)
|
|
13
13
|
[](https://opensource.org/licenses/MIT)
|
|
14
14
|
|
|
15
|
-
> 本翻译对应 v4.
|
|
15
|
+
> 本翻译对应 v4.13.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
|
@@ -88,7 +88,7 @@ venv/bin/python -m src.control_panel
|
|
|
88
88
|
| 模式 | 入口 | 工具数 | 适合谁 |
|
|
89
89
|
|------|------|--------|--------|
|
|
90
90
|
| Compound(复合) | `src/server.py` | 37 | 大多数助手的默认模式。相关的 Resolve 操作按 action 参数分组,压低上下文占用。 |
|
|
91
|
-
| Full / granular(细粒度) | `src/server.py --full` 或 `src/resolve_mcp_server.py` |
|
|
91
|
+
| Full / granular(细粒度) | `src/server.py --full` 或 `src/resolve_mcp_server.py` | 390 | 想要"一个 Resolve API 方法 = 一个 MCP 工具"的重度用户。 |
|
|
92
92
|
|
|
93
93
|
除非你明确需要一方法一工具的细粒度界面,否则推荐复合模式。
|
|
94
94
|
|
|
@@ -226,7 +226,7 @@ DRX 调色写入**针对 Resolve Studio 做过实机校准**:调色参数默
|
|
|
226
226
|
|
|
227
227
|
| 指标 | 数值 |
|
|
228
228
|
|------|------|
|
|
229
|
-
| MCP 工具 | **37** 复合 / **
|
|
229
|
+
| MCP 工具 | **37** 复合 / **390** 细粒度(实时服务器) |
|
|
230
230
|
| Advanced(离线)工具 | **18**——.drp/.drt/.drx + 数据库创作,无需 Resolve 运行 |
|
|
231
231
|
| 内核 action | 9 个复合工具下 **136** 个带护栏的工作流 action |
|
|
232
232
|
| API 方法覆盖 | **361/361**(100%) |
|
package/docs/SKILL.md
CHANGED
|
@@ -353,7 +353,7 @@ to the user as verified.
|
|
|
353
353
|
| Mode | Entry point | Tool count | Use when |
|
|
354
354
|
|---|---|---|---|
|
|
355
355
|
| Compound (default) | `src/server.py` | 37 tools | Most workflows — keeps context lean |
|
|
356
|
-
| Granular (full) | `src/server.py --full` |
|
|
356
|
+
| Granular (full) | `src/server.py --full` | 390 tools | Power users needing one tool per API method |
|
|
357
357
|
|
|
358
358
|
Resolve 21.1 adds [twelve read-only discovery controls](reference/resolve211-read-controls.md)
|
|
359
359
|
for edition, presets, audio formats/codecs, normalization modes, speed, fades
|
|
@@ -418,7 +418,22 @@ Operating rules an agent must know:
|
|
|
418
418
|
`iConfirmProjectClosed:true`; every write auto-backs-up and read-back
|
|
419
419
|
verifies. Resolve caches open projects in memory: after patching, fully QUIT
|
|
420
420
|
and relaunch Resolve or the patch will not be visible.
|
|
421
|
-
- **
|
|
421
|
+
- **Live subtitle effects**: use `timeline_ai.set_subtitle_preset` with Resolve
|
|
422
|
+
open. `timeline_ai.list_title_presets` discovers installed title/subtitle names
|
|
423
|
+
and full IDs. `preset` accepts a bundled or installed subtitle preset; omit it
|
|
424
|
+
to adjust the existing effect. `inputs` accepts common literal font/style,
|
|
425
|
+
size/position and text RGBA; highlight/outline controls are Word Highlight-specific.
|
|
426
|
+
Native DRT export/edit/import creates and selects a recoverable revision,
|
|
427
|
+
preserving the original. Do not ask the user to quit or relaunch for effects.
|
|
428
|
+
Render frames to verify appearance; inventory/readback alone is insufficient.
|
|
429
|
+
Installed presets are captured through the native title API in a temporary
|
|
430
|
+
timeline, then applied to the subtitle track. Common controls also work for
|
|
431
|
+
Lollipop. Never guess unmapped effect controls. `preset_reference` accepts a
|
|
432
|
+
native subtitle DRT; unbundled dry runs require such a reference.
|
|
433
|
+
Ordinary title presets use `timeline.insert_fusion_title` with the full ID,
|
|
434
|
+
then scoped `fusion_comp` probes and input writes. See
|
|
435
|
+
[title library automation](guides/title-library-automation.md) for acceptance.
|
|
436
|
+
- **Offline subtitle DB edits**: `project_db` `list_captions` / `write_captions` /
|
|
422
437
|
`check_captions` cover text, bounds, explicit per-word timing, add and delete.
|
|
423
438
|
`list_subtitle_presets` / `copy_subtitle_preset` / `set_subtitle_preset` handle
|
|
424
439
|
animated Fusion holders separately from basic `list_subtitle_styles`.
|
|
@@ -781,6 +796,12 @@ Key actions:
|
|
|
781
796
|
is fine. No connection needed, and it never launches Resolve
|
|
782
797
|
- `get_page` / `open_page(page)` — read or switch the active page
|
|
783
798
|
- `get_keyframe_mode` / `set_keyframe_mode(mode)`
|
|
799
|
+
- `set_high_priority(high?)` — script execution priority (granular:
|
|
800
|
+
`set_high_priority`). `high` defaults to true; on Resolve 21.1+ it calls
|
|
801
|
+
`SetHighPriority(bool)` and `high=false` restores normal. Older builds take no
|
|
802
|
+
argument and cannot lower it again this session, so `high=false` is refused
|
|
803
|
+
there. No build has a getter — report the native return, never a confirmed
|
|
804
|
+
state. Only call when the user asked for it
|
|
784
805
|
- `get_fairlight_presets` — Resolve 20.2.2+; returns available Fairlight
|
|
785
806
|
preset names
|
|
786
807
|
- `list/save/load/delete/import/export_user_preferences_preset` — Resolve
|
|
@@ -1,5 +1,88 @@
|
|
|
1
1
|
# Subtitle tracks: captions and animated presets
|
|
2
2
|
|
|
3
|
+
## Live effects: keep Resolve open
|
|
4
|
+
|
|
5
|
+
For routine video changes, use the live server's
|
|
6
|
+
`timeline_ai(action="set_subtitle_preset", params={...})`. Do not route subtitle
|
|
7
|
+
effect changes to `project_db` or ask the user to quit/relaunch Resolve.
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"action":"set_subtitle_preset",
|
|
12
|
+
"params":{
|
|
13
|
+
"track":1, "preset":"Word Highlight",
|
|
14
|
+
"inputs":{
|
|
15
|
+
"font":"Segoe UI", "fontStyle":"Black", "size":0.065,
|
|
16
|
+
"position":[0.5,0.4], "textRed":1, "textGreen":1, "textBlue":1,
|
|
17
|
+
"highlightRed":1, "highlightGreen":1, "highlightBlue":0,
|
|
18
|
+
"outlineEnabled":1, "outlineRed":0, "outlineGreen":0,
|
|
19
|
+
"outlineBlue":0, "thickness":0.1
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This exports the current native DRT, edits only its subtitle Fusion holder,
|
|
26
|
+
then imports and selects a new timeline revision. The original timeline remains
|
|
27
|
+
recoverable. Successful operations, including dry runs, delete their staging
|
|
28
|
+
exports. Failures keep the staging folder for diagnosis and return
|
|
29
|
+
`staging_retained:true` and `staging_directory`; remove that folder when diagnosis
|
|
30
|
+
is complete because it contains full timeline exports. Cleanup failures also
|
|
31
|
+
report the retained folder with a warning. It never edits the open database, changes source
|
|
32
|
+
media or requires an application restart. `dry_run:true` prepares the exported
|
|
33
|
+
revision without importing it. Omit `preset` to incrementally adjust the
|
|
34
|
+
current Word Highlight instead of replacing it. `preset_reference` can name
|
|
35
|
+
another native DRT, with `reference_track` selecting its subtitle track.
|
|
36
|
+
`revision_name` is optional and must be unique in the current project.
|
|
37
|
+
|
|
38
|
+
`preset:"Word Highlight"` applies a bundled native holder exported from the
|
|
39
|
+
synthetic Studio 21.1.0.17 acceptance project. Its reference settings are Segoe
|
|
40
|
+
UI Black, size 0.055, centred position, white text, yellow highlight, black
|
|
41
|
+
outline and thickness 0.1; these are reference settings, not claims about UI
|
|
42
|
+
defaults. Explicit `inputs` override them. No reference footage is bundled.
|
|
43
|
+
`preset:"Lollipop"` applies the bundled native Lollipop. Other installed subtitle
|
|
44
|
+
presets are discovered from the local `Templates.drfx`, captured by the running
|
|
45
|
+
Resolve as a native title in an isolated temporary timeline, then applied to the
|
|
46
|
+
subtitle track through native interchange. The temporary capture is removed
|
|
47
|
+
after restoring the original timeline; the original edit remains recoverable.
|
|
48
|
+
No additional vendor template files are redistributed. Use
|
|
49
|
+
`timeline_ai(action="list_title_presets")` to discover names, full template IDs
|
|
50
|
+
and categories. Supply `templates_archive` for a nonstandard installation.
|
|
51
|
+
Full IDs disambiguate names such as the ordinary and animated `Statement`.
|
|
52
|
+
|
|
53
|
+
All subtitle templates with the inspected `Template = TextPlus` layout accept
|
|
54
|
+
the common literal `font`, `fontStyle`, `size`, `position`, `textRed`, `textGreen`,
|
|
55
|
+
`textBlue`, and `textAlpha` controls. Highlight and outline mappings remain
|
|
56
|
+
specific to Word Highlight. Connected/animated controls, different layouts and
|
|
57
|
+
unmapped effect controls are refused. Do not guess their meanings. The live
|
|
58
|
+
matrix is documented in [title library automation](title-library-automation.md).
|
|
59
|
+
An alternate `preset_reference` can copy another decodable native holder.
|
|
60
|
+
For an unbundled installed preset, a mutation-free dry run needs an existing
|
|
61
|
+
`preset_reference`: discovering its native definition otherwise needs a temporary
|
|
62
|
+
live title. `dry_run` never creates that temporary timeline.
|
|
63
|
+
|
|
64
|
+
For gradient/image text fills (observed in Grey with Shadow), solid RGB inputs
|
|
65
|
+
are dormant. The writer refuses a colour edit that would only change those
|
|
66
|
+
invisible values. Pass `inputs.textFillMode:"solid"` explicitly to replace the
|
|
67
|
+
fill mode, then supply the desired text RGBA. The stored gradient is retained,
|
|
68
|
+
and the original timeline/reference remains recoverable. Font, size and position
|
|
69
|
+
edits can preserve the gradient by omitting text colour inputs. Readback reports
|
|
70
|
+
the effective `textFillMode`; absent Type1 uses the observed TextPlus solid default.
|
|
71
|
+
|
|
72
|
+
The handler checks live track counts, item names/bounds and Media Pool media IDs
|
|
73
|
+
against the original, then re-exports the imported timeline through Resolve and
|
|
74
|
+
verifies that it retained the preset controls before selecting the revision.
|
|
75
|
+
`verified_components` lists these checks. Markers, grades, other items' Fusion
|
|
76
|
+
compositions and audio content are **not** compared; they are listed in
|
|
77
|
+
`unverified_components`. This is not verification of a complete timeline copy.
|
|
78
|
+
A failed import/check
|
|
79
|
+
restores the previous active timeline and reports the retained failed revision.
|
|
80
|
+
Resolve re-export readback plus edit inventory is not render verification: inspect rendered
|
|
81
|
+
frames at word boundaries and across caption gaps. Native DRT import was tested
|
|
82
|
+
on Studio 21.1.0.17/Windows without quitting Resolve. Changing sequence IDs in
|
|
83
|
+
only the sequence XML loses subtitle tracks; cross-entry references must remain
|
|
84
|
+
intact. Resolve remaps timeline IDs itself on import.
|
|
85
|
+
|
|
3
86
|
The advanced server's `project_db` tool edits saved local SQLite projects.
|
|
4
87
|
The live server can generate subtitles with `timeline_ai.create_subtitles`,
|
|
5
88
|
enumerate their items, read names/bounds and delete items. It cannot edit caption
|
|
@@ -15,7 +98,13 @@ There are two independent kinds of subtitle styling:
|
|
|
15
98
|
holder and composition. `set_subtitle_preset` edits named Word Highlight
|
|
16
99
|
controls inside its nested compressed tool section.
|
|
17
100
|
|
|
18
|
-
##
|
|
101
|
+
## Offline database workflow (explicit maintenance only)
|
|
102
|
+
|
|
103
|
+
The following full-quit requirement belongs to direct database writes, not
|
|
104
|
+
live effect automation. Keep the guard: bypassing it can lose edits. Caption
|
|
105
|
+
text/word-timing DB writes still use this offline workflow; for restart-free
|
|
106
|
+
caption corrections use the live Resolve UI. A generic `SetProperty` refusal
|
|
107
|
+
does not establish that all subtitle workflows require a restart.
|
|
19
108
|
|
|
20
109
|
1. Generate captions in Resolve and save the project. Inspect it with
|
|
21
110
|
`list_captions`, `list_subtitle_presets` and `check_captions`.
|
|
@@ -152,8 +241,9 @@ use `set_subtitle_preset` with target selectors and `inputs`.
|
|
|
152
241
|
Colour channels are 0–1, `outlineEnabled` is 0 or 1, `size` is Fusion's
|
|
153
242
|
normalised text size (not points), `position` is Fusion Center `[x,y]`, and
|
|
154
243
|
`thickness` is the template's HOutlineThickness value. Parameter editing is
|
|
155
|
-
|
|
156
|
-
|
|
244
|
+
based on common literal Template TextPlus inputs for subtitle templates;
|
|
245
|
+
highlight and outline controls are specific to Word Highlight.
|
|
246
|
+
Connected/animated inputs and unsupported layouts are refused.
|
|
157
247
|
Missing input values in the listing mean Resolve/template defaults, not zero.
|
|
158
248
|
Other supported composition envelopes can be cloned unchanged, but cannot have
|
|
159
249
|
their parameter meanings guessed. Preset holder Duration is preserved from the
|
|
@@ -225,3 +315,28 @@ whether/when UI edits are retimed on save, and SRT import preserving word
|
|
|
225
315
|
timings on 21.1. A previously reported ImportMedia(SRT)+AppendToTimeline route
|
|
226
316
|
on 21.0.4.5 is not evidence that SRT carries word timings on another build.
|
|
227
317
|
Repeat the probe and render test after Resolve updates.
|
|
318
|
+
|
|
319
|
+
## Restart-free acceptance (2026-10-08)
|
|
320
|
+
|
|
321
|
+
`tests/live_subtitle_preset_validation.py` exercised the actual Python
|
|
322
|
+
`timeline_ai.set_subtitle_preset` dispatcher on Studio 21.1.0.17/Windows in the
|
|
323
|
+
disposable synthetic QA project, without launching, quitting or reopening
|
|
324
|
+
Resolve. It removed the animation holder from an exported synthetic timeline,
|
|
325
|
+
imported that bare-caption timeline, then applied the bundled Word Highlight.
|
|
326
|
+
The live action verified seven captions and the video/audio bounds/media IDs,
|
|
327
|
+
and native re-export retained the requested white text and magenta highlight.
|
|
328
|
+
|
|
329
|
+
Three full-resolution 1080x1920 Resolve-rendered frames were visually inspected:
|
|
330
|
+
at 108200 the first word was magenta and the second white; at 108220 those
|
|
331
|
+
colours swapped; frame 108180 in the caption gap was black. This proves those
|
|
332
|
+
sampled frames, not every frame or other templates/builds. The harness restores
|
|
333
|
+
the previous timeline, playhead and page. Earlier live runs also demonstrated
|
|
334
|
+
incremental colour, size and position edits, followed by a random-colour change
|
|
335
|
+
requested as a demonstration. Random colours are not the bundled defaults.
|
|
336
|
+
|
|
337
|
+
A subsequent Lollipop test on the same running Studio session applied the
|
|
338
|
+
effect through the native UI, then through the updated MCP action using the
|
|
339
|
+
bundled reference. Resolve's re-export confirmed
|
|
340
|
+
`Templates/Edit/Titles/Subtitles/Animated/Lollipop`; a rendered frame showed its
|
|
341
|
+
native yellow text and orange outline. No application restart was needed.
|
|
342
|
+
This Windows acceptance does not establish Mac compatibility; repeat it there.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Native title and subtitle library automation
|
|
2
|
+
|
|
3
|
+
Keep Resolve Studio open. Discover the installed factory Fusion presets with
|
|
4
|
+
`timeline_ai(action="list_title_presets", params={})`. The inventory names the
|
|
5
|
+
local archive, category and full template ID; it does not imply live acceptance.
|
|
6
|
+
Use `templates_archive` when automatic discovery cannot find a custom installation.
|
|
7
|
+
Factory inventory does not enumerate third-party packs or the basic non-template
|
|
8
|
+
Text/Scroll generators. Installed fonts and tool availability remain host-specific.
|
|
9
|
+
|
|
10
|
+
## Ordinary Fusion titles
|
|
11
|
+
|
|
12
|
+
Insert with `timeline(action="insert_fusion_title", params={"name":
|
|
13
|
+
"Templates/Edit/Titles/Candy"})`, then identify the inserted clip and use
|
|
14
|
+
`fusion_comp.probe_fusion_comp` / `probe_fusion_tool` with `clip_id` or an explicit
|
|
15
|
+
timeline-item selector. Read the actual graph and controls before editing.
|
|
16
|
+
`safe_set_inputs` can set literal inputs on the inspected tool, including text,
|
|
17
|
+
font, size and colour. Many presets use TextPlus; others use sText or Text3D.
|
|
18
|
+
Do not assume every template has a tool called `Template`, flatten connected
|
|
19
|
+
animation controls, or overwrite text instances linked to another tool.
|
|
20
|
+
|
|
21
|
+
`timeline.set_title_text` also supports literal TextPlus, sText, Text3D and
|
|
22
|
+
MultiText inputs. For a connected StyledTextFollower it edits the modifier's
|
|
23
|
+
literal `Text` input; for PublishText it uses `Value`. MultiText uses the native
|
|
24
|
+
`TextN.StyledText` controls in native `TextOrder`; `TextValueN` changes list
|
|
25
|
+
labels without changing rendered text. Expressions and
|
|
26
|
+
unknown modifier chains are refused rather than flattened. The default text
|
|
27
|
+
action edits the first supported text target; use explicit Fusion tools when
|
|
28
|
+
changing multiple independent title lines. Render to verify the resulting text.
|
|
29
|
+
MultiText editing was validated only on Studio 21.1.0.17 / Windows.
|
|
30
|
+
|
|
31
|
+
Use the full template ID rather than a leaf name: `Statement` exists both as an
|
|
32
|
+
ordinary title and an animated subtitle. Probe `comp.GetData("TEMPLATE_ID")`
|
|
33
|
+
to confirm which template native insertion selected.
|
|
34
|
+
|
|
35
|
+
## Subtitle-track presets
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{"action":"set_subtitle_preset","params":{
|
|
39
|
+
"preset":"Templates/Edit/Titles/Subtitles/Animated/Rotate",
|
|
40
|
+
"inputs":{"size":0.06,"position":[0.5,0.25],
|
|
41
|
+
"textRed":0.15,"textGreen":0.85,"textBlue":1}
|
|
42
|
+
}}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The live helper captures the installed template in its own temporary timeline,
|
|
46
|
+
exports its native composition, restores the working timeline and removes only
|
|
47
|
+
that temporary capture. It swaps the exported subtitle holder composition,
|
|
48
|
+
imports a recoverable revision, checks edit/media inventory and re-exports the
|
|
49
|
+
revision to confirm native preset/control retention. The original timeline
|
|
50
|
+
remains intact. The inventory compares track counts, item names/bounds and media
|
|
51
|
+
IDs; it does not compare markers, grades, other Fusion compositions or audio
|
|
52
|
+
content. Results list both verified and unverified components. Inspect the
|
|
53
|
+
revision before relying on it as a complete copy.
|
|
54
|
+
Successful operations, including previews, remove staging exports; failures
|
|
55
|
+
retain them for diagnosis and report `staging_retained` and `staging_directory`.
|
|
56
|
+
Cleanup failures warn and report the retained folder. These files contain full
|
|
57
|
+
timeline exports and should be removed after diagnosis. It never writes an open
|
|
58
|
+
Project.db or changes source files.
|
|
59
|
+
|
|
60
|
+
Common mapped literal controls are `font`, `fontStyle`, `size`, `position`,
|
|
61
|
+
`textRed`, `textGreen`, `textBlue` and `textAlpha`. Highlight/outline mappings are
|
|
62
|
+
specific to Word Highlight. Unsupported controls/layouts and animated or
|
|
63
|
+
connected input replacements are refused. An imported preset readback is not a
|
|
64
|
+
rendered check. Inspect caption word phases, gaps and safe margins.
|
|
65
|
+
|
|
66
|
+
Gradient/image fills do not render their dormant solid RGB values. A subtitle
|
|
67
|
+
colour edit refuses that case unless `textFillMode:"solid"` explicitly requests
|
|
68
|
+
replacement of the fill mode. Grey with Shadow uses a native gradient; preserve
|
|
69
|
+
it when editing only font/size/position, or explicitly select solid fill when
|
|
70
|
+
requesting a uniform colour. The gradient data/reference stays recoverable.
|
|
71
|
+
For ordinary Fusion titles, inspect the active shading mode/gradient controls;
|
|
72
|
+
a raw RGB readback alone does not establish the rendered fill colour.
|
|
73
|
+
|
|
74
|
+
Word Highlight and Lollipop have bundled native references. Other factory
|
|
75
|
+
subtitle presets require the local installation or an explicit native subtitle
|
|
76
|
+
`preset_reference`. Unbundled dry runs require a pre-existing reference so no
|
|
77
|
+
live temporary title is created during preview.
|
|
78
|
+
|
|
79
|
+
## Repeatable acceptance
|
|
80
|
+
|
|
81
|
+
The [Windows acceptance record](../notes/title-library-acceptance.md) documents
|
|
82
|
+
134 final passing cases and an interrupted ordinary-title retest that required
|
|
83
|
+
automatic Studio crash recovery. It does not establish universal restart-free
|
|
84
|
+
reliability or Mac compatibility.
|
|
85
|
+
|
|
86
|
+
`tests/live_title_library_validation.py` requires an already-open disposable
|
|
87
|
+
`MCP_QA_*` project with the synthetic caption fixture. It refuses to launch
|
|
88
|
+
Resolve, renders representative native frames, records property readback and
|
|
89
|
+
pixel differences, persists every case, retains test timelines and restores the
|
|
90
|
+
original timeline/page/playhead. Only synthetic project contents may be used.
|
|
91
|
+
|
|
92
|
+
```powershell
|
|
93
|
+
venv/Scripts/python.exe tests/live_title_library_validation.py --output-dir logs/title-library-full
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The image metrics require Pillow and NumPy; `--image-python` can use an independent
|
|
97
|
+
Python installation with those packages. It runs in isolated mode, avoiding
|
|
98
|
+
Resolve's Python environment. `--only` selects exact names/IDs for a focused
|
|
99
|
+
retest. `scripts/title_library_report.py` builds a local HTML matrix and contact
|
|
100
|
+
sheets from one or more reports; a later retest replaces the same template's case.
|
|
101
|
+
The HTML uses relative links to copied QA renders under its `frames/` folder;
|
|
102
|
+
move the entire output folder to view it on another machine. Saved QA records
|
|
103
|
+
replace host workspace/home paths with anonymous markers; they do not retain
|
|
104
|
+
the local account name or workspace folder identity.
|
|
105
|
+
|
|
106
|
+
Acceptance distinguishes native application, literal property readback and
|
|
107
|
+
sampled rendered appearance. It does not certify all controls, every animation
|
|
108
|
+
frame, third-party packs, or Mac compatibility. Test Mac separately before
|
|
109
|
+
claiming cross-platform live acceptance.
|
package/docs/install.md
CHANGED
|
@@ -144,7 +144,7 @@ The MCP server comes in two modes:
|
|
|
144
144
|
| Mode | File | Tools | Best For |
|
|
145
145
|
|------|------|-------|----------|
|
|
146
146
|
| **Compound** (default) | `src/server.py` | 37 | Most users — fast, clean, low context usage |
|
|
147
|
-
| **Full** | `src/resolve_mcp_server.py` |
|
|
147
|
+
| **Full** | `src/resolve_mcp_server.py` | 390 | Power users who want one tool per API method |
|
|
148
148
|
|
|
149
149
|
The compound server's `timeline_item` tool includes dedicated actions for common workflows:
|
|
150
150
|
|
|
@@ -159,7 +159,7 @@ The compound server's `timeline_item` tool includes dedicated actions for common
|
|
|
159
159
|
|
|
160
160
|
The installer uses the compound server by default. To use the full server:
|
|
161
161
|
```bash
|
|
162
|
-
python src/server.py --full # Launch full
|
|
162
|
+
python src/server.py --full # Launch full 390-tool server
|
|
163
163
|
# Or point your MCP config directly at src/resolve_mcp_server.py
|
|
164
164
|
```
|
|
165
165
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Audio / Fairlight Kernel
|
|
2
2
|
|
|
3
|
-
For
|
|
4
|
-
|
|
3
|
+
For animated subtitle effects use live `timeline_ai.set_subtitle_preset` with
|
|
4
|
+
Resolve open. It applies/adjusts Word Highlight through native DRT interchange
|
|
5
|
+
and selects a recoverable revision. For caption text/word timing use the live
|
|
6
|
+
UI, or explicit offline advanced `project_db` maintenance after fully quitting.
|
|
5
7
|
See [subtitle-track editing](../guides/subtitle-track-editing.md). The basic
|
|
6
8
|
`set_subtitle_style` action does not edit animated Fusion presets.
|
|
7
9
|
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Fusion Composition Kernel
|
|
2
2
|
|
|
3
|
+
Subtitle-track animation holders do not enumerate as caption Fusion comps.
|
|
4
|
+
For installed subtitle presets and common font, colour, size and position edits,
|
|
5
|
+
use live `timeline_ai.set_subtitle_preset`; Word Highlight also has mapped
|
|
6
|
+
highlight/outline controls. Discover presets with `timeline_ai.list_title_presets`.
|
|
7
|
+
See [subtitle-track editing](../guides/subtitle-track-editing.md) and
|
|
8
|
+
[title library automation](../guides/title-library-automation.md).
|
|
9
|
+
Keep Resolve open. Generic caption `SetProperty`/`GetFusionCompByIndex` is not
|
|
10
|
+
the route, and direct Project.db patching is reserved for explicit offline work.
|
|
11
|
+
|
|
3
12
|
The Fusion Composition kernel expands `fusion_comp` into a safer graph
|
|
4
13
|
inspection, tool creation, input write, connection, and boundary-report layer
|
|
5
14
|
for timeline item Fusion comps and active Fusion page comps.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Live subtitle automation audit — 2026-10-08
|
|
2
|
+
|
|
3
|
+
The `feat/subtitle-track-support` branch added useful caption/preset codecs but
|
|
4
|
+
routed effect edits only through Project.db. The subsequent full-quit guard was
|
|
5
|
+
correct for that database route; it did not establish that a running Resolve
|
|
6
|
+
could not apply the same effect through native interchange or its own UI.
|
|
7
|
+
|
|
8
|
+
## Corrected paths
|
|
9
|
+
|
|
10
|
+
| Finding | Correction |
|
|
11
|
+
|---|---|
|
|
12
|
+
| Word Highlight edits exposed only as offline DB actions | Live `timeline_ai.set_subtitle_preset` exports native DRT, changes the exported holder, imports/selects a new revision; original retained |
|
|
13
|
+
| Applying an effect required a reference in another user project | Bundle a native holder from synthetic QA with explicit reference settings and no media |
|
|
14
|
+
| Subtitle `SetProperty` refusal sent every request to full-quit DB patching | Error now routes effects to the live action; text/timing to live UI or explicit offline maintenance |
|
|
15
|
+
| Skills and kernels directed animation work to the offline server | Updated audio/Fusion portable skills, kernels, operating reference, advanced README and subtitle guide |
|
|
16
|
+
| Codec readback could report success before Resolve parsed the composition | Re-export the imported timeline and compare its retained controls; also compare live edit inventory |
|
|
17
|
+
|
|
18
|
+
Direct DB-write safety guards remain intact. Never patch the database of an
|
|
19
|
+
open project, including a project loaded earlier in the same Resolve session.
|
|
20
|
+
Native interchange avoids that cache hazard by asking Resolve itself to import
|
|
21
|
+
the changed content.
|
|
22
|
+
|
|
23
|
+
## Evidence and limits
|
|
24
|
+
|
|
25
|
+
Live validation on Studio 21.1.0.17/Windows exercised the public dispatcher,
|
|
26
|
+
applied Word Highlight to a bare subtitle track and verified the imported
|
|
27
|
+
controls through native re-export. Seven caption bounds, video/audio bounds and
|
|
28
|
+
media IDs matched. Rendered frames showed the requested white/magenta word
|
|
29
|
+
phases and a blank caption gap. Incremental colour, size and position edits also
|
|
30
|
+
worked, including the user's random-colour demonstration, without a restart.
|
|
31
|
+
See [subtitle-track editing](../guides/subtitle-track-editing.md) and the
|
|
32
|
+
synthetic-only live acceptance script.
|
|
33
|
+
|
|
34
|
+
That original acceptance certified Word Highlight and unchanged Lollipop
|
|
35
|
+
application, not universal video automation. The subsequent installed-library
|
|
36
|
+
expansion discovers presets, captures their native definitions without UI drags,
|
|
37
|
+
and maps common literal subtitle font, size, position and text RGBA controls.
|
|
38
|
+
Ordinary title text now includes shape/3D/MultiText and supported text modifiers
|
|
39
|
+
without flattening their animation. See
|
|
40
|
+
[title library automation](../guides/title-library-automation.md) for the test
|
|
41
|
+
harness and its measured limits, and the subsequent
|
|
42
|
+
[134-preset acceptance record](title-library-acceptance.md), including its
|
|
43
|
+
ordinary-title crash/recovery. Unmapped subtitle effect controls and caption
|
|
44
|
+
text/timing changes still need observed live UI automation unless another supported
|
|
45
|
+
route is available. Current granular-only clients do not expose the new compound
|
|
46
|
+
action; use the compound server or the shared Python helper. Installed fonts,
|
|
47
|
+
templates, speech models and Resolve build differences remain capabilities to
|
|
48
|
+
probe, not assumptions.
|
|
49
|
+
|
|
50
|
+
Remaining full-quit references under extension-authoring, offline DB maintenance
|
|
51
|
+
and crash recovery describe distinct operations. Newly installed Fuses and
|
|
52
|
+
some extension categories genuinely have restart requirements. Routine video
|
|
53
|
+
edits should use already available tools or native imported compositions rather
|
|
54
|
+
than turn extension installation into a repeated step. Do not erase those
|
|
55
|
+
constraints to promise "100% automated".
|
|
56
|
+
|
|
57
|
+
Code already loaded in an MCP process does not automatically change after a
|
|
58
|
+
Git update. Follow the installer/update instructions for the component being
|
|
59
|
+
updated. Bridge-script installation may require Resolve to restart. This
|
|
60
|
+
feature does not change the general launcher or installer lifecycle.
|
|
61
|
+
|
|
62
|
+
## Validation record
|
|
63
|
+
|
|
64
|
+
- 169 Python tests in the relevant subtitle, safety, connection, lifecycle,
|
|
65
|
+
dashboard and documentation suites: passed, one skipped. A subsequent focused
|
|
66
|
+
run of 53 tests included the added imported-control-loss regression and passed.
|
|
67
|
+
- 28 Node subtitle codec/DB/native-timeline tests passed. The two new native
|
|
68
|
+
timeline tests also passed independently after the readback helper was added.
|
|
69
|
+
- Native API parity audit passed (existing undocumented-method advisories only).
|
|
70
|
+
- Generated API-limitations, read/write-symmetry and portable-agent assets checked.
|
|
71
|
+
- NPM dry-run package inspection confirmed the live bridge, codec helper and
|
|
72
|
+
native reference asset are included.
|
|
73
|
+
- Windows test-fixture corrections are split into a separate change: ps fixtures
|
|
74
|
+
select their intended platform, macOS path assertions normalize separators,
|
|
75
|
+
and dashboard temporary SQLite connections close before directory removal.
|
|
76
|
+
|
|
77
|
+
The automation is reviewed separately from subtitle database editing. Studio
|
|
78
|
+
stayed open during the original subtitle acceptance;
|
|
79
|
+
the later full-library title test has the interruption documented above.
|
|
80
|
+
Existing MCP processes still need to load the
|
|
81
|
+
updated Python code to expose the new action; that is separate from restarting
|
|
82
|
+
Resolve.
|