davinci-resolve-mcp 2.48.0 → 2.48.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 +13 -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/server.py +1 -1
- package/src/utils/media_analysis.py +33 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
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.48.1
|
|
6
|
+
|
|
7
|
+
Bug fix surfaced by the first real-cut tighten pilot.
|
|
8
|
+
|
|
9
|
+
- **Fixed** cross-root analysis reuse never landed in the current project's
|
|
10
|
+
DB: when the registry matched a reusable report from another project's
|
|
11
|
+
analysis root, `execute_plan_async` reported success but wrote no DB rows
|
|
12
|
+
and no local export — so `media_ref` lookups against the current media
|
|
13
|
+
pool (edit-engine planners, panel readers) found nothing. The reuse path
|
|
14
|
+
now re-keys the report to the current project's clip identity, ingests it
|
|
15
|
+
into the current root's DB, and writes a lockstep `analysis.json` export
|
|
16
|
+
(provenance kept in `reused_from`).
|
|
17
|
+
|
|
5
18
|
## What's New in v2.48.0
|
|
6
19
|
|
|
7
20
|
Edit-engine hardening: trustworthy execute readback ahead of the first
|
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.48.
|
|
38
|
+
VERSION = "2.48.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.48.
|
|
83
|
+
VERSION = "2.48.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/server.py
CHANGED
|
@@ -5218,15 +5218,46 @@ async def execute_plan_async(
|
|
|
5218
5218
|
"success": False,
|
|
5219
5219
|
}
|
|
5220
5220
|
if clip_plan.get("skip_execution") and existing_report.get("path"):
|
|
5221
|
+
# DB-canonical (C1): a reused report — especially one matched from
|
|
5222
|
+
# ANOTHER project's root via the registry — must still land rows
|
|
5223
|
+
# and a lockstep export in THIS root, keyed to THIS project's clip
|
|
5224
|
+
# identity. Without this, media_ref lookups against the current
|
|
5225
|
+
# media pool (edit_engine planners, panel readers) find nothing
|
|
5226
|
+
# even though the manifest reports success.
|
|
5227
|
+
local_analysis_json = existing_report["path"]
|
|
5228
|
+
try:
|
|
5229
|
+
with open(existing_report["path"], "r", encoding="utf-8") as handle:
|
|
5230
|
+
reused_report = json.load(handle)
|
|
5231
|
+
except (OSError, json.JSONDecodeError):
|
|
5232
|
+
reused_report = None
|
|
5233
|
+
if isinstance(reused_report, dict):
|
|
5234
|
+
reused_report = dict(reused_report)
|
|
5235
|
+
clip_block = dict(reused_report.get("clip") or {})
|
|
5236
|
+
for key in ("clip_id", "clip_name", "media_id", "bin_path"):
|
|
5237
|
+
if record.get(key):
|
|
5238
|
+
clip_block[key] = record[key]
|
|
5239
|
+
if record.get("file_path"):
|
|
5240
|
+
clip_block["file_path"] = record["file_path"]
|
|
5241
|
+
reused_report["clip"] = clip_block
|
|
5242
|
+
db_ingest = _ingest_report_into_db(
|
|
5243
|
+
output_root,
|
|
5244
|
+
reused_report,
|
|
5245
|
+
os.path.dirname(artifacts["analysis_json"]),
|
|
5246
|
+
)
|
|
5247
|
+
if not db_ingest.get("success"):
|
|
5248
|
+
clip_result["db_ingest_error"] = db_ingest.get("error")
|
|
5249
|
+
if os.path.normpath(artifacts["analysis_json"]) != os.path.normpath(existing_report["path"]):
|
|
5250
|
+
_write_json(artifacts["analysis_json"], reused_report)
|
|
5251
|
+
local_analysis_json = artifacts["analysis_json"]
|
|
5221
5252
|
clip_result.update({
|
|
5222
5253
|
"success": True,
|
|
5223
5254
|
"reused": True,
|
|
5224
|
-
"analysis_json":
|
|
5255
|
+
"analysis_json": local_analysis_json,
|
|
5225
5256
|
"reuse_reason": clip_plan.get("reuse_reason"),
|
|
5226
5257
|
"cache_status": clip_plan.get("cache_status"),
|
|
5227
5258
|
"cache_warnings": existing_report.get("cache_warnings", []),
|
|
5228
5259
|
"reuse_source": clip_plan.get("reuse_source"),
|
|
5229
|
-
"reused_from": clip_plan.get("reused_from"),
|
|
5260
|
+
"reused_from": clip_plan.get("reused_from") or existing_report["path"],
|
|
5230
5261
|
})
|
|
5231
5262
|
manifest["clips"].append(clip_result)
|
|
5232
5263
|
continue
|