davinci-resolve-mcp 2.28.0 → 2.28.1
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 +24 -0
- package/README.md +1 -1
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/granular/folder.py +15 -6
- package/src/granular/media_pool_item.py +14 -5
- package/src/server.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
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.28.1
|
|
6
|
+
|
|
7
|
+
Bug-fix release.
|
|
8
|
+
|
|
9
|
+
**Audio transcription no longer passes an invalid `language` argument.** The
|
|
10
|
+
`transcribe_audio` (clip) and `transcribe_folder_audio` tools in the full
|
|
11
|
+
(`--full`) server were calling `TranscribeAudio(language)` with a language
|
|
12
|
+
string, but the Resolve scripting API has never accepted a language positional —
|
|
13
|
+
its signature is `TranscribeAudio(useSpeakerDetection=None)`. The string was
|
|
14
|
+
silently coerced to a truthy boolean and misread as a speaker-detection flag,
|
|
15
|
+
and the success message falsely claimed a transcription language. The language
|
|
16
|
+
is controlled by the project's Speech Recognition setting, not per call.
|
|
17
|
+
|
|
18
|
+
- `transcribe_audio(clip_name, use_speaker_detection=None)` — the `language`
|
|
19
|
+
parameter is replaced with an optional `use_speaker_detection` boolean
|
|
20
|
+
(Resolve 21+). Omit it to use the project's setting.
|
|
21
|
+
- `transcribe_folder_audio(folder_name, use_speaker_detection=None)` — same
|
|
22
|
+
change for the folder-level tool.
|
|
23
|
+
- Both pass the boolean through only when supplied, so older Resolve builds
|
|
24
|
+
(which take no argument) keep working.
|
|
25
|
+
|
|
26
|
+
The consolidated 32-tool server was unaffected — its `folder`/`media_pool_item`
|
|
27
|
+
`transcribe_audio` actions already called `TranscribeAudio()` correctly.
|
|
28
|
+
|
|
5
29
|
## What's New in v2.28.0
|
|
6
30
|
|
|
7
31
|
This release adds a structural timeline-diff engine, a declarative project spec
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DaVinci Resolve MCP Server
|
|
2
2
|
|
|
3
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
6
|
[-blue.svg)](#server-modes)
|
package/install.py
CHANGED
|
@@ -35,7 +35,7 @@ from src.utils.update_check import (
|
|
|
35
35
|
|
|
36
36
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
37
37
|
|
|
38
|
-
VERSION = "2.28.
|
|
38
|
+
VERSION = "2.28.1"
|
|
39
39
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
40
40
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
41
41
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
package/src/granular/common.py
CHANGED
|
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
|
|
|
80
80
|
handlers=[logging.StreamHandler()],
|
|
81
81
|
)
|
|
82
82
|
|
|
83
|
-
VERSION = "2.28.
|
|
83
|
+
VERSION = "2.28.1"
|
|
84
84
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
85
85
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
86
86
|
logger.info(f"Detected platform: {get_platform()}")
|
package/src/granular/folder.py
CHANGED
|
@@ -58,12 +58,16 @@ def export_folder(folder_name: str, export_path: str, export_type: str = "DRB")
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
@mcp.tool()
|
|
61
|
-
def transcribe_folder_audio(folder_name: str,
|
|
61
|
+
def transcribe_folder_audio(folder_name: str, use_speaker_detection: Optional[bool] = None) -> str:
|
|
62
62
|
"""Transcribe audio for all clips in a folder.
|
|
63
|
-
|
|
63
|
+
|
|
64
|
+
The transcription language follows the project's Speech Recognition setting
|
|
65
|
+
(Project Settings > Subtitles), not a per-call argument.
|
|
66
|
+
|
|
64
67
|
Args:
|
|
65
68
|
folder_name: Name of the folder containing clips to transcribe
|
|
66
|
-
|
|
69
|
+
use_speaker_detection: Optional (Resolve 21+). Enable speaker detection.
|
|
70
|
+
If omitted, the project's setting is used.
|
|
67
71
|
"""
|
|
68
72
|
pm, current_project = get_current_project()
|
|
69
73
|
if not current_project:
|
|
@@ -90,11 +94,16 @@ def transcribe_folder_audio(folder_name: str, language: str = "en-US") -> str:
|
|
|
90
94
|
if not target_folder:
|
|
91
95
|
return f"Error: Folder '{folder_name}' not found in Media Pool"
|
|
92
96
|
|
|
93
|
-
# Transcribe audio in the folder
|
|
97
|
+
# Transcribe audio in the folder.
|
|
98
|
+
# Resolve 21's signature is TranscribeAudio(useSpeakerDetection=None); pass the
|
|
99
|
+
# bool only when supplied so older Resolve builds (no arg) keep working.
|
|
94
100
|
try:
|
|
95
|
-
|
|
101
|
+
if use_speaker_detection is None:
|
|
102
|
+
result = target_folder.TranscribeAudio()
|
|
103
|
+
else:
|
|
104
|
+
result = target_folder.TranscribeAudio(use_speaker_detection)
|
|
96
105
|
if result:
|
|
97
|
-
return f"Successfully started audio transcription for folder '{folder_name}'
|
|
106
|
+
return f"Successfully started audio transcription for folder '{folder_name}'"
|
|
98
107
|
else:
|
|
99
108
|
return f"Failed to start audio transcription for folder '{folder_name}'"
|
|
100
109
|
except Exception as e:
|
|
@@ -162,12 +162,16 @@ def replace_clip(clip_name: str, replacement_path: str) -> str:
|
|
|
162
162
|
|
|
163
163
|
|
|
164
164
|
@mcp.tool()
|
|
165
|
-
def transcribe_audio(clip_name: str,
|
|
165
|
+
def transcribe_audio(clip_name: str, use_speaker_detection: Optional[bool] = None) -> str:
|
|
166
166
|
"""Transcribe audio for a clip.
|
|
167
|
-
|
|
167
|
+
|
|
168
|
+
The transcription language follows the project's Speech Recognition setting
|
|
169
|
+
(Project Settings > Subtitles), not a per-call argument.
|
|
170
|
+
|
|
168
171
|
Args:
|
|
169
172
|
clip_name: Name of the clip to transcribe
|
|
170
|
-
|
|
173
|
+
use_speaker_detection: Optional (Resolve 21+). Enable speaker detection.
|
|
174
|
+
If omitted, the project's setting is used.
|
|
171
175
|
"""
|
|
172
176
|
pm, current_project = get_current_project()
|
|
173
177
|
if not current_project:
|
|
@@ -189,10 +193,15 @@ def transcribe_audio(clip_name: str, language: str = "en-US") -> str:
|
|
|
189
193
|
if not target_clip:
|
|
190
194
|
return f"Error: Clip '{clip_name}' not found in Media Pool"
|
|
191
195
|
|
|
196
|
+
# Resolve 21's signature is TranscribeAudio(useSpeakerDetection=None); pass the
|
|
197
|
+
# bool only when supplied so older Resolve builds (no arg) keep working.
|
|
192
198
|
try:
|
|
193
|
-
|
|
199
|
+
if use_speaker_detection is None:
|
|
200
|
+
result = target_clip.TranscribeAudio()
|
|
201
|
+
else:
|
|
202
|
+
result = target_clip.TranscribeAudio(use_speaker_detection)
|
|
194
203
|
if result:
|
|
195
|
-
return f"Successfully started audio transcription for clip '{clip_name}'
|
|
204
|
+
return f"Successfully started audio transcription for clip '{clip_name}'"
|
|
196
205
|
else:
|
|
197
206
|
return f"Failed to start audio transcription for clip '{clip_name}'"
|
|
198
207
|
except Exception as e:
|