davinci-resolve-mcp 2.44.0 → 2.46.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 +67 -0
- package/README.md +3 -3
- package/docs/SKILL.md +35 -0
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/granular/timeline.py +2 -1
- package/src/server.py +1264 -18
- package/src/utils/analysis_store.py +20 -2
- package/src/utils/destructive_hook.py +5 -0
- package/src/utils/edit_engine.py +646 -0
- package/src/utils/project_lint.py +10 -1
- package/src/utils/project_spec.py +31 -0
|
@@ -473,7 +473,25 @@ def ingest_report(
|
|
|
473
473
|
),
|
|
474
474
|
)
|
|
475
475
|
|
|
476
|
-
# Sampled frames.
|
|
476
|
+
# Sampled frames. Shot mapping uses frame_indices_used when present,
|
|
477
|
+
# with a time-containment fallback (some commit paths don't record
|
|
478
|
+
# which frame indices fed which shot).
|
|
479
|
+
shot_intervals: List[Tuple[float, float, str]] = []
|
|
480
|
+
for entry in shot_entries:
|
|
481
|
+
if not isinstance(entry, dict):
|
|
482
|
+
continue
|
|
483
|
+
s, e = entry.get("time_seconds_start"), entry.get("time_seconds_end")
|
|
484
|
+
if isinstance(s, (int, float)) and isinstance(e, (int, float)):
|
|
485
|
+
shot_intervals.append((float(s), float(e), shot_uuid_for(clip_uuid, s, e)))
|
|
486
|
+
|
|
487
|
+
def _shot_for_time(t: Any) -> Optional[str]:
|
|
488
|
+
if not isinstance(t, (int, float)):
|
|
489
|
+
return None
|
|
490
|
+
for s, e, uuid_ in shot_intervals:
|
|
491
|
+
if s <= float(t) < e:
|
|
492
|
+
return uuid_
|
|
493
|
+
return None
|
|
494
|
+
|
|
477
495
|
conn.execute("DELETE FROM frames WHERE clip_uuid = ?", (clip_uuid,))
|
|
478
496
|
keyframes = motion.get("analysis_keyframes") if isinstance(motion.get("analysis_keyframes"), list) else []
|
|
479
497
|
for kf in keyframes:
|
|
@@ -492,7 +510,7 @@ def ingest_report(
|
|
|
492
510
|
""",
|
|
493
511
|
(
|
|
494
512
|
clip_uuid,
|
|
495
|
-
frame_to_shot.get(frame_index),
|
|
513
|
+
frame_to_shot.get(frame_index) or _shot_for_time(kf.get("time_seconds")),
|
|
496
514
|
frame_index,
|
|
497
515
|
kf.get("time_seconds") if isinstance(kf.get("time_seconds"), (int, float)) else None,
|
|
498
516
|
kf.get("frame_path") or kf.get("path"),
|
|
@@ -56,6 +56,11 @@ DESTRUCTIVE_ACTIONS_BY_TOOL: Dict[str, FrozenSet[str]] = {
|
|
|
56
56
|
"delete_clip_mattes",
|
|
57
57
|
"delete_timelines",
|
|
58
58
|
}),
|
|
59
|
+
"edit_engine": frozenset({
|
|
60
|
+
"execute_selects",
|
|
61
|
+
"execute_tighten",
|
|
62
|
+
"execute_swap",
|
|
63
|
+
}),
|
|
59
64
|
"timeline": frozenset({
|
|
60
65
|
"create_timeline",
|
|
61
66
|
"create_timeline_from_clips",
|