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 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
- [![Version](https://img.shields.io/badge/version-2.103.3-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.103.4-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(353%20full)-blue.svg)](#server-modes)
package/README.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | 简体中文
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.103.3-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.103.4-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(353%20full)-blue.svg)](#服务器模式)
@@ -12,7 +12,7 @@
12
12
  [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
13
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
14
14
 
15
- > 本翻译对应 v2.103.3 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
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.3"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.103.3",
3
+ "version": "2.103.4",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.103.3"
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
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 353-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.103.3"
14
+ VERSION = "2.103.4"
15
15
 
16
16
  import base64
17
17
  import os
@@ -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",