davinci-resolve-mcp 2.148.0 → 2.149.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 CHANGED
@@ -2,6 +2,25 @@
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.149.0 — subtitle render truth: ExportSubtitle lies on 19.x
6
+
7
+ ### Measured (new Resolve bug, filed in api-limitations)
8
+
9
+ - **`SetRenderSettings` subtitle keys are accepted-and-inert on 19.x**: with
10
+ authored subtitle cues readback-verified and the track enabled,
11
+ `ExportSubtitle: true` + every `SubtitleFormat` mode (`BurnIn`,
12
+ `SeparateFile`, `EmbeddedCaptions`) returns True — and the renders carry no
13
+ burned-in pixels, no sidecar file, and no caption stream. The keys are
14
+ documented in the Resolve 21 API reference. Quirk: `ExportSubtitle` alone
15
+ returns False; the pair returns True.
16
+
17
+ ### Added
18
+
19
+ - **`render.set_settings` warns on pre-21 hosts** when the subtitle-delivery
20
+ keys are set, naming the measured inertness and the verification steps —
21
+ the accepted-then-ignored warning pattern that already covers
22
+ `AddFrameHandles` under `UseFullExtents`.
23
+
5
24
  ## What's New in v2.148.0 — the audio ceiling doubles: A1–A16
6
25
 
7
26
  ### Changed
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.148.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.149.0-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.148.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.149.0-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.148.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v2.149.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
16
16
 
17
17
  一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
18
18
 
@@ -12,7 +12,7 @@ that none exists).
12
12
 
13
13
  **Verified on:** DaVinci Resolve Studio 21.0.2
14
14
 
15
- **Totals:** 35 missing capabilities, 48 bugs / unreliable behaviors.
15
+ **Totals:** 35 missing capabilities, 49 bugs / unreliable behaviors.
16
16
 
17
17
  The authoritative source is the runtime-queryable `api_truth` ledger
18
18
  (`resolve_control api_truth "<query>"`); this document is generated from
@@ -687,3 +687,11 @@ values, or automation-hostile modal prompts.
687
687
  - **Behavior:** Timeline markers present and readable through the marker API do not appear in the exported .otio at all — the OTIO Marker schema exists and Resolve's importer reads it, but the exporter writes none (measured on Studio 19.1.3.7: two markers read back at frames 12/72; the export carried zero). Any marker-fidelity QC built on an OTIO re-export silently sees an unmarked timeline.
688
688
  - **Workaround / current handling:** Do not use EXPORT_OTIO to carry or verify markers. editorial.verify_roundtrip reports this case as `markersNotInExport` (honesty flag, not a failure); read markers through the marker API for fidelity checks, and author them offline via drt.assemble spec.markers when a .drt must carry them.
689
689
  - **Tags:** timeline, export, otio, markers, silent-failure
690
+
691
+ ### Project.SetRenderSettings ExportSubtitle/SubtitleFormat (inert on 19.x)
692
+
693
+ - **Object:** `Project`
694
+ - **Signature:** `({'ExportSubtitle': bool, 'SubtitleFormat': str}) -> bool`
695
+ - **Behavior:** On Studio 19.1.3.7 the subtitle-delivery keys documented in the Resolve 21 API reference are accepted and fully inert: SetRenderSettings returns True for all three SubtitleFormat modes ('BurnIn', 'SeparateFile', 'EmbeddedCaptions'), and the renders carry no burned-in pixels (frame-extract verified), no sidecar subtitle file, and no embedded caption track (stream-probe verified) — with the subtitle cues readback-verified on the timeline and the subtitle track enabled. Quirk: ExportSubtitle alone returns False; the pair returns True. All three outputs are stream-identical to a no-subtitle render.
696
+ - **Workaround / current handling:** Do not trust a True return for subtitle delivery on a pre-21 host — verify the output (extract a frame for burn-in, list the target directory for a sidecar, ffprobe streams for embedded captions). On 19.x subtitle export requires the UI render page. render.set_settings warns when these keys are set on a pre-21 host.
697
+ - **Tags:** render, subtitle, burn-in, silent-failure, version-gated
package/install.py CHANGED
@@ -37,7 +37,7 @@ from src.utils.update_check import (
37
37
 
38
38
  # ─── Version ──────────────────────────────────────────────────────────────────
39
39
 
40
- VERSION = "2.148.0"
40
+ VERSION = "2.149.0"
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.148.0",
3
+ "version": "2.149.0",
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.148.0"
90
+ VERSION = "2.149.0"
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.148.0"
14
+ VERSION = "2.149.0"
15
15
 
16
16
  import base64
17
17
  import os
@@ -18730,7 +18730,7 @@ def _render_preset_pin(proj, preset_name: str):
18730
18730
  return {"preset": preset_name, "loaded": True}, None
18731
18731
 
18732
18732
 
18733
- def _render_settings_warnings(settings: Dict[str, Any]):
18733
+ def _render_settings_warnings(settings: Dict[str, Any], version_major: Optional[int] = None):
18734
18734
  """Inter-key combinations Resolve accepts and then silently ignores.
18735
18735
 
18736
18736
  SetRenderSettings returns True for these, so nothing downstream would ever
@@ -18745,6 +18745,17 @@ def _render_settings_warnings(settings: Dict[str, Any]):
18745
18745
  "AddFrameHandles is ignored while UseFullExtents is true: Resolve renders the "
18746
18746
  "clip's full extents and the handle count silently does nothing. Drop one of the two."
18747
18747
  )
18748
+ if ("ExportSubtitle" in settings or "SubtitleFormat" in settings) and (
18749
+ version_major is not None and version_major < 21
18750
+ ):
18751
+ warnings.append(
18752
+ "ExportSubtitle/SubtitleFormat are INERT on this Resolve generation: measured on "
18753
+ "Studio 19.1.3.7, SetRenderSettings returns True for all three SubtitleFormat modes "
18754
+ "and the render carries no burn-in, no sidecar file, and no embedded caption track "
18755
+ "(cues readback-verified, subtitle track enabled). The keys are documented in the "
18756
+ "Resolve 21 API reference. Verify the output (frame extract / sidecar check) before "
18757
+ "claiming caption delivery; on 19.x burn-in requires the UI render page."
18758
+ )
18748
18759
  return warnings
18749
18760
 
18750
18761
 
@@ -19283,6 +19294,12 @@ def render(action: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, An
19283
19294
  "Same as project", or "None"). AddFrameHandles is ignored while
19284
19295
  UseFullExtents is true — the call still succeeds, so that pairing
19285
19296
  comes back in warnings rather than silently doing nothing.
19297
+ ExportSubtitle (bool) + SubtitleFormat ("BurnIn" | "SeparateFile" |
19298
+ "EmbeddedCaptions") are documented for Resolve 21 but measured INERT
19299
+ on 19.x — SetRenderSettings returns True and the render carries no
19300
+ burn-in, sidecar, or caption track — so setting them on a pre-21
19301
+ host comes back in warnings; verify the output before claiming
19302
+ caption delivery.
19286
19303
  list_presets() -> {presets}
19287
19304
  load_preset(name) -> {success}
19288
19305
  save_preset(name) -> {success}
@@ -19577,8 +19594,12 @@ def render(action: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, An
19577
19594
  if ignored_settings:
19578
19595
  result["ignored_settings"] = ignored_settings
19579
19596
  # Accepted-then-ignored key combinations (21.0.4 AddFrameHandles under
19580
- # UseFullExtents) read as a clean success without this.
19581
- warnings = _render_settings_warnings(settings)
19597
+ # UseFullExtents; 19.x ExportSubtitle) read as a clean success without this.
19598
+ try:
19599
+ _ver_major = int((get_resolve().GetVersion() or [0])[0])
19600
+ except Exception:
19601
+ _ver_major = None
19602
+ warnings = _render_settings_warnings(settings, version_major=_ver_major)
19582
19603
  if warnings:
19583
19604
  result["warnings"] = warnings
19584
19605
  return result
@@ -2737,6 +2737,33 @@ API_TRUTH: List[Dict[str, Any]] = [
2737
2737
  "submit": "bug",
2738
2738
  "mitigation": ["editorial.verify_roundtrip markersNotInExport"],
2739
2739
  },
2740
+ {
2741
+ "symbol": "Project.SetRenderSettings ExportSubtitle/SubtitleFormat (inert on 19.x)",
2742
+ "object": "Project",
2743
+ "signature": "({'ExportSubtitle': bool, 'SubtitleFormat': str}) -> bool",
2744
+ "reality": "On Studio 19.1.3.7 the subtitle-delivery keys documented "
2745
+ "in the Resolve 21 API reference are accepted and fully "
2746
+ "inert: SetRenderSettings returns True for all three "
2747
+ "SubtitleFormat modes ('BurnIn', 'SeparateFile', "
2748
+ "'EmbeddedCaptions'), and the renders carry no burned-in "
2749
+ "pixels (frame-extract verified), no sidecar subtitle "
2750
+ "file, and no embedded caption track (stream-probe "
2751
+ "verified) — with the subtitle cues readback-verified on "
2752
+ "the timeline and the subtitle track enabled. Quirk: "
2753
+ "ExportSubtitle alone returns False; the pair returns "
2754
+ "True. All three outputs are stream-identical to a "
2755
+ "no-subtitle render.",
2756
+ "recommended": "Do not trust a True return for subtitle delivery on "
2757
+ "a pre-21 host — verify the output (extract a frame "
2758
+ "for burn-in, list the target directory for a "
2759
+ "sidecar, ffprobe streams for embedded captions). On "
2760
+ "19.x subtitle export requires the UI render page. "
2761
+ "render.set_settings warns when these keys are set on "
2762
+ "a pre-21 host.",
2763
+ "tags": ["render", "subtitle", "burn-in", "silent-failure", "version-gated"],
2764
+ "submit": "bug",
2765
+ "mitigation": ["render.set_settings warnings"],
2766
+ },
2740
2767
  ]
2741
2768
 
2742
2769