davinci-resolve-mcp 2.103.3 → 2.103.4
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 +35 -0
- package/README.md +1 -1
- package/README.zh-CN.md +2 -2
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
- package/src/utils/api_truth.py +38 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,41 @@
|
|
|
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 v2.103.4
|
|
6
|
+
|
|
7
|
+
**A frame-numbering trap, documented where agents will look it up.** Issue #164
|
|
8
|
+
by @jonathandahl-cmyk arrived as a detailed report that `AppendToTimeline`'s
|
|
9
|
+
`trackIndex`/`recordFrame` corrupt a timeline — every readback correct, render
|
|
10
|
+
produces a ~6KB stub. Their own same-day correction found the real cause, and it
|
|
11
|
+
is simpler and nastier: **`recordFrame` is timeline-absolute.** It counts from
|
|
12
|
+
Resolve's global frame zero, so `recordFrame=0` on a default `01:00:00:00`
|
|
13
|
+
timeline places the clip at frame 0 — an hour before the timeline's own start at
|
|
14
|
+
86400. The items genuinely exist and are internally consistent, so
|
|
15
|
+
`AppendToTimeline` returns them, every `Get*` reads back the expected values,
|
|
16
|
+
and the render engine — which only walks the timeline's own start→end range —
|
|
17
|
+
reports `JobStatus: Complete` at 100% while writing a near-empty stub.
|
|
18
|
+
|
|
19
|
+
The assumption was easy to make because Resolve uses both conventions side by
|
|
20
|
+
side: marker `frameId`s *are* timeline-relative (frame 0 == first frame), while
|
|
21
|
+
`recordFrame` and `TimelineItem.GetStart()`/`GetEnd()` are absolute.
|
|
22
|
+
|
|
23
|
+
This server's own callers were never exposed: `media_pool.append_to_timeline`
|
|
24
|
+
has defaulted to `record_frame_mode="relative"` — adding `GetStartFrame()` for
|
|
25
|
+
you — since v2.17.1, which live-validated the exact arithmetic (relative 12 →
|
|
26
|
+
86412; absolute preserved 86484). What was missing was the catalog entry: the
|
|
27
|
+
API-truth table had five `AppendToTimeline` entries (the half-open `endFrame`
|
|
28
|
+
bound, occupied-span null-ids, mixed-fps duration floors…) but never the
|
|
29
|
+
absolute origin, which fails more silently than any of them. It now records the
|
|
30
|
+
convention, the render-lies-too behavior, why the wrapper default exists, and
|
|
31
|
+
that `JobStatus: Complete` is not proof a render produced frames.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- `src/utils/api_truth.py` gains
|
|
36
|
+
`MediaPool.AppendToTimeline clipInfo recordFrame (timeline-absolute origin)`
|
|
37
|
+
(#164). Internal entry — an undocumented convention, not a Resolve defect —
|
|
38
|
+
so the Blackmagic-facing limitations report is unchanged.
|
|
39
|
+
|
|
5
40
|
## What's New in v2.103.3
|
|
6
41
|
|
|
7
42
|
**A batch transcription fix that would have failed every clip.** Issue #160 by
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
8
|
[-blue.svg)](#server-modes)
|
package/README.zh-CN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
8
|
[-blue.svg)](#服务器模式)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://www.python.org/downloads/)
|
|
13
13
|
[](https://opensource.org/licenses/MIT)
|
|
14
14
|
|
|
15
|
-
> 本翻译对应 v2.103.
|
|
15
|
+
> 本翻译对应 v2.103.4 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
package/install.py
CHANGED
|
@@ -37,7 +37,7 @@ from src.utils.update_check import (
|
|
|
37
37
|
|
|
38
38
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
39
39
|
|
|
40
|
-
VERSION = "2.103.
|
|
40
|
+
VERSION = "2.103.4"
|
|
41
41
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
42
42
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
43
43
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
package/src/granular/common.py
CHANGED
|
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
|
|
|
87
87
|
handlers=[logging.StreamHandler()],
|
|
88
88
|
)
|
|
89
89
|
|
|
90
|
-
VERSION = "2.103.
|
|
90
|
+
VERSION = "2.103.4"
|
|
91
91
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
92
92
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
93
93
|
logger.info(f"Detected platform: {get_platform()}")
|
package/src/server.py
CHANGED
package/src/utils/api_truth.py
CHANGED
|
@@ -1853,6 +1853,44 @@ API_TRUTH: List[Dict[str, Any]] = [
|
|
|
1853
1853
|
"when mirroring keep-ranges into clipInfos.",
|
|
1854
1854
|
"tags": ["timeline", "edit", "off-by-one", "readback"],
|
|
1855
1855
|
},
|
|
1856
|
+
{
|
|
1857
|
+
"symbol": "MediaPool.AppendToTimeline clipInfo recordFrame (timeline-absolute origin)",
|
|
1858
|
+
"object": "MediaPool",
|
|
1859
|
+
"signature": "([{mediaPoolItem, startFrame, endFrame, recordFrame, "
|
|
1860
|
+
"trackIndex, mediaType}]) -> [TimelineItem]",
|
|
1861
|
+
"reality": "clipInfo recordFrame is TIMELINE-ABSOLUTE: it counts from "
|
|
1862
|
+
"Resolve's global frame zero, not from the timeline's own "
|
|
1863
|
+
"GetStartFrame(). A timeline with the default 01:00:00:00 "
|
|
1864
|
+
"start begins at frame 86400, so recordFrame=0 places the "
|
|
1865
|
+
"item about an hour BEFORE the timeline starts. Nothing "
|
|
1866
|
+
"reports the mistake, because the items are real and "
|
|
1867
|
+
"self-consistent: AppendToTimeline returns them, "
|
|
1868
|
+
"GetName/GetSourceStartFrame/GetSourceEndFrame all read back "
|
|
1869
|
+
"the expected values, and the bin count is right. Only a "
|
|
1870
|
+
"render exposes it — the engine walks the timeline's own "
|
|
1871
|
+
"start->end range, so the job reports JobStatus Complete at "
|
|
1872
|
+
"100% in under 2s and writes a ~6KB stub for a 405s "
|
|
1873
|
+
"timeline. The trap is that the two frame conventions sit "
|
|
1874
|
+
"side by side: marker frameIds ARE timeline-relative "
|
|
1875
|
+
"(frame 0 == first frame), while recordFrame and "
|
|
1876
|
+
"TimelineItem.GetStart/GetEnd are absolute. Distinct from "
|
|
1877
|
+
"the null-id entry below, which is a recordFrame landing in "
|
|
1878
|
+
"an OCCUPIED span rather than before the start. Verified on "
|
|
1879
|
+
"Studio 20.3.2.9 (v2.17.1 probe: relative record_frame 12 "
|
|
1880
|
+
"landed at 86400 + 12 = 86412, absolute preserved 86484) and "
|
|
1881
|
+
"independently on Studio 21.0.4.5 (issue #164).",
|
|
1882
|
+
"recommended": "Offset every recordFrame by timeline.GetStartFrame(). "
|
|
1883
|
+
"This server already does it: "
|
|
1884
|
+
"media_pool.append_to_timeline defaults to "
|
|
1885
|
+
"record_frame_mode='relative' and adds the start frame, "
|
|
1886
|
+
"so pass record_frame_mode='absolute' only for raw "
|
|
1887
|
+
"Resolve frame numbers. When driving the API directly, "
|
|
1888
|
+
"never treat JobStatus Complete as proof a render "
|
|
1889
|
+
"worked — check the output file's duration, not just "
|
|
1890
|
+
"that the job finished.",
|
|
1891
|
+
"tags": ["timeline", "edit", "render", "silent-failure", "media-pool"],
|
|
1892
|
+
"issue": 164,
|
|
1893
|
+
},
|
|
1856
1894
|
{
|
|
1857
1895
|
"symbol": "Timeline.DeleteClips (requires the Edit page; flaky first attempt)",
|
|
1858
1896
|
"object": "Timeline",
|