davinci-resolve-mcp 2.123.0 → 2.124.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.
|
@@ -54,8 +54,9 @@ window. `render.verify_output` covers the container-level checks.
|
|
|
54
54
|
| Fusion titles | `elements: [{type:'title', text}]` — **21-gen hosts only** | v2.108 |
|
|
55
55
|
|
|
56
56
|
`assemble_from_interchange` drives the same engine from an EDL / OTIO /
|
|
57
|
-
FCP7-XML / AAF
|
|
58
|
-
|
|
57
|
+
FCP7-XML / AAF / **.prproj** (Premiere, read offline — no Premiere needed)
|
|
58
|
+
plus a `sourceMap` — all five formats are route-proven end-to-end
|
|
59
|
+
(parse → assemble → import → measured frames and RMS) — and
|
|
59
60
|
returns an honesty ledger
|
|
60
61
|
(`authoredTransitions`, `droppedTransitions` with reasons, `authoredRetimes`,
|
|
61
62
|
`flattenedRetimes`, `authoredAudioEvents`, `upperTrackCutsVideoOnly`).
|
package/install.py
CHANGED
|
@@ -37,7 +37,7 @@ from src.utils.update_check import (
|
|
|
37
37
|
|
|
38
38
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
39
39
|
|
|
40
|
-
VERSION = "2.
|
|
40
|
+
VERSION = "2.124.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
|
@@ -30,7 +30,7 @@ const authorSchema = z.object({
|
|
|
30
30
|
});
|
|
31
31
|
const validateSchema = z.object({ drtPath: z.string().describe('Absolute path to a .drt file') });
|
|
32
32
|
const assembleFromInterchangeSchema = z.object({
|
|
33
|
-
format: z.enum(['edl', 'otio', 'xml', 'aaf']).describe('Interchange format of the input'),
|
|
33
|
+
format: z.enum(['edl', 'otio', 'xml', 'aaf', 'prproj']).describe('Interchange format of the input'),
|
|
34
34
|
path: z.string().optional().describe('Path to the interchange file (aaf REQUIRES a path)'),
|
|
35
35
|
content: z.string().optional().describe('Inline interchange text (edl/otio/xml)'),
|
|
36
36
|
fps: z.number().optional().describe('Event frame rate for parsing (default 24; use e.g. 29.97 for NTSC EDLs)'),
|
|
@@ -211,14 +211,23 @@ export const drtTool = {
|
|
|
211
211
|
const { parseInterchange } = await import('../editorial.mjs');
|
|
212
212
|
const { eventsToAssembleSpec } = await import('../author-interchange.mjs');
|
|
213
213
|
let content = p.content;
|
|
214
|
+
let events;
|
|
214
215
|
if (p.format === 'aaf') {
|
|
215
216
|
if (!p.path) return { error: 'aaf input requires path' };
|
|
216
217
|
content = p.path;
|
|
218
|
+
} else if (p.format === 'prproj') {
|
|
219
|
+
// Premiere: offline gunzip+graph read (no Premiere, no Resolve import
|
|
220
|
+
// path). parsePrproj flattens EVERY sequence's events; a multi-sequence
|
|
221
|
+
// .prproj with overlapping record ranges refuses naturally in the
|
|
222
|
+
// overlap check — pre-split via editorial.list_sequences if needed.
|
|
223
|
+
if (!p.path) return { error: 'prproj input requires path' };
|
|
224
|
+
const { parsePrproj } = await import('../prproj.mjs');
|
|
225
|
+
events = parsePrproj(p.path);
|
|
217
226
|
} else if (!content) {
|
|
218
227
|
if (!p.path) return { error: 'provide content or path' };
|
|
219
228
|
content = await fs.readFile(p.path, 'utf8');
|
|
220
229
|
}
|
|
221
|
-
|
|
230
|
+
if (!events) events = parseInterchange(p.format, content, { fps: p.fps ?? 24 });
|
|
222
231
|
if (!events || !events.length) return { error: 'no events parsed from the interchange input' };
|
|
223
232
|
const { spec, report } = eventsToAssembleSpec(events, {
|
|
224
233
|
sourceMap: p.sourceMap, timelineName: p.timelineName,
|
|
@@ -248,7 +257,7 @@ export const drtTool = {
|
|
|
248
257
|
stamped,
|
|
249
258
|
conform: report,
|
|
250
259
|
note:
|
|
251
|
-
'Import with timeline.import_timeline_checked (timeline is named after the FILE). ' +
|
|
260
|
+
'Import with timeline.import_timeline_checked (timeline is named after the FILE). Dissolves/cross-fades, forward+reverse retimes, multi-track video, audio events and markers are AUTHORED when geometry allows; everything else drops WITH a reason — see `conform` for the ledger.' +
|
|
252
261
|
'Retimes are flattened and transitions become cuts — see `conform` for the ledger.',
|
|
253
262
|
};
|
|
254
263
|
}
|
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.
|
|
90
|
+
VERSION = "2.124.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()}")
|