davinci-resolve-mcp 2.23.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/AGENTS.md +85 -0
- package/CHANGELOG.md +802 -0
- package/CLAUDE.md +15 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/SECURITY.md +53 -0
- package/bin/davinci-resolve-mcp.mjs +376 -0
- package/docs/README.md +56 -0
- package/docs/SKILL.md +1145 -0
- package/docs/authoring/fuse-dctl-authoring.md +242 -0
- package/docs/authoring/script-plugin-authoring.md +195 -0
- package/docs/contributing.md +82 -0
- package/docs/guides/color-decision-guide.md +387 -0
- package/docs/guides/editorial-decision-guide.md +136 -0
- package/docs/guides/media-analysis-guide.md +615 -0
- package/docs/guides/multicam-setup-guide.md +138 -0
- package/docs/install.md +198 -0
- package/docs/integrations/workflow-integrations.md +120 -0
- package/docs/kernels/README.md +28 -0
- package/docs/kernels/audio-fairlight-kernel.md +86 -0
- package/docs/kernels/color-grade-kernel.md +103 -0
- package/docs/kernels/extension-authoring-kernel.md +101 -0
- package/docs/kernels/fusion-composition-kernel.md +91 -0
- package/docs/kernels/media-pool-ingest-kernel.md +147 -0
- package/docs/kernels/project-lifecycle-kernel.md +120 -0
- package/docs/kernels/render-deliver-kernel.md +92 -0
- package/docs/kernels/review-annotation-kernel.md +110 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
- package/docs/kernels/timeline-edit-kernel.md +189 -0
- package/docs/notes/codec-plugin-notes.md +136 -0
- package/docs/notes/dctl-notes.md +234 -0
- package/docs/notes/fusion-template-notes.md +136 -0
- package/docs/notes/lut-notes.md +136 -0
- package/docs/notes/openfx-notes.md +120 -0
- package/docs/process/release-process.md +152 -0
- package/docs/reference/api-coverage.md +488 -0
- package/docs/reference/resolve_scripting_api.txt +1012 -0
- package/examples/README.md +53 -0
- package/examples/markers/README.md +81 -0
- package/examples/media/README.md +94 -0
- package/examples/timeline/README.md +98 -0
- package/install.py +1196 -0
- package/package.json +52 -0
- package/scripts/audit_api_parity.py +275 -0
- package/scripts/live_media_analysis_polish_probe.py +65 -0
- package/src/__init__.py +3 -0
- package/src/analysis_dashboard.py +4936 -0
- package/src/control_panel.py +13 -0
- package/src/granular/__init__.py +17 -0
- package/src/granular/common.py +727 -0
- package/src/granular/folder.py +287 -0
- package/src/granular/gallery.py +306 -0
- package/src/granular/graph.py +309 -0
- package/src/granular/media_pool.py +679 -0
- package/src/granular/media_pool_item.py +852 -0
- package/src/granular/media_storage.py +179 -0
- package/src/granular/project.py +1594 -0
- package/src/granular/resolve_control.py +521 -0
- package/src/granular/timeline.py +1074 -0
- package/src/granular/timeline_item.py +2251 -0
- package/src/resolve_mcp_server.py +43 -0
- package/src/server.py +15691 -0
- package/src/utils/__init__.py +3 -0
- package/src/utils/app_control.py +319 -0
- package/src/utils/audio_fairlight_live_probe.py +263 -0
- package/src/utils/cdl.py +20 -0
- package/src/utils/cloud_operations.py +192 -0
- package/src/utils/color_grade_live_probe.py +444 -0
- package/src/utils/dctl_templates.py +368 -0
- package/src/utils/extension_authoring_live_probe.py +292 -0
- package/src/utils/fuse_templates.py +1968 -0
- package/src/utils/fusion_composition_live_probe.py +284 -0
- package/src/utils/layout_presets.py +333 -0
- package/src/utils/mcp_stdio.py +32 -0
- package/src/utils/media_analysis.py +3618 -0
- package/src/utils/media_analysis_jobs.py +796 -0
- package/src/utils/media_pool_ingest_live_probe.py +592 -0
- package/src/utils/multicam.py +393 -0
- package/src/utils/object_inspection.py +287 -0
- package/src/utils/platform.py +157 -0
- package/src/utils/project_lifecycle_live_probe.py +376 -0
- package/src/utils/project_properties.py +601 -0
- package/src/utils/render_deliver_live_probe.py +384 -0
- package/src/utils/resolve_connection.py +77 -0
- package/src/utils/review_annotation_live_probe.py +352 -0
- package/src/utils/script_templates.py +1193 -0
- package/src/utils/sync_detection.py +887 -0
- package/src/utils/timeline_conform_live_probe.py +280 -0
- package/src/utils/timeline_kernel_live_probe.py +1091 -0
- package/src/utils/timeline_kernel_probe.py +185 -0
- package/src/utils/timeline_title_text.py +87 -0
- package/src/utils/update_check.py +610 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
# API Coverage and Test Results
|
|
2
|
+
|
|
3
|
+
Complete Resolve scripting API coverage, live-test status, and method-by-method reference.
|
|
4
|
+
|
|
5
|
+
## Key Stats
|
|
6
|
+
|
|
7
|
+
| Metric | Value |
|
|
8
|
+
|--------|-------|
|
|
9
|
+
| MCP Tools | **32** compound (default) / **329** granular |
|
|
10
|
+
| Kernel Actions | **136** guarded MCP workflow actions across 9 compound tools |
|
|
11
|
+
| API Methods Covered | **336/336** (100%) |
|
|
12
|
+
| Methods Live Tested | **331/336** (98.5%) |
|
|
13
|
+
| Live Test Pass Rate | **331/331** (100%) |
|
|
14
|
+
| API Object Classes | 13 |
|
|
15
|
+
| Tested Against | DaVinci Resolve 19.1.3 Studio + Resolve 20.3.2 Studio |
|
|
16
|
+
| Compatibility Note | Resolve 19.1.3 remains the compatibility baseline; Resolve 20.x scripting calls are additive, version-guarded, and live-tested on 20.3.2; Resolve 21 beta APIs are intentionally deferred until stable |
|
|
17
|
+
|
|
18
|
+
## API Coverage
|
|
19
|
+
|
|
20
|
+
Every non-deprecated method in the DaVinci Resolve Scripting API is covered. The default compound server exposes **32 tools** that group related operations by action parameter, keeping LLM context windows lean. The full granular server provides **329 individual tools** for power users. Both modes cover all 13 API object classes. MCP-level kernel actions are tracked separately in [Kernel Action Coverage](../kernels/README.md).
|
|
21
|
+
|
|
22
|
+
Workflow helpers can go beyond one-to-one API method coverage while still using
|
|
23
|
+
only public Resolve calls. For example, `media_pool.setup_multicam_timeline`
|
|
24
|
+
prepares a stacked timeline for Resolve's multicam UI, but native multicam clip
|
|
25
|
+
creation itself is not exposed by the scripting API. Similarly,
|
|
26
|
+
`media_analysis.detect_sync_events` is a source-safe FFmpeg/FFprobe helper for
|
|
27
|
+
advisory 2-pop and slate-clap sync points; it is not a Resolve API method.
|
|
28
|
+
`media_analysis.add_sync_event_markers` is a guarded marker-write helper and
|
|
29
|
+
requires explicit confirmation. `media_analysis.publish_clip_metadata` bridges
|
|
30
|
+
source-safe analysis reports back into Resolve clip metadata with dry-run
|
|
31
|
+
previews, field-specific merge policies, and confirmed writes.
|
|
32
|
+
|
|
33
|
+
| Class | Methods | Tools | Description |
|
|
34
|
+
|-------|---------|-------|-------------|
|
|
35
|
+
| Resolve | 22 | 22 | App control, pages, layout presets, render/burn-in presets, keyframe mode |
|
|
36
|
+
| ProjectManager | 25 | 25 | Project CRUD, folders, databases, cloud projects, archive/restore |
|
|
37
|
+
| Project | 43 | 43 | Timelines, render pipeline, settings, LUTs, color groups |
|
|
38
|
+
| MediaStorage | 9 | 9 | Volumes, file browsing, media import, mattes |
|
|
39
|
+
| MediaPool | 27 | 27 | Folders, clips, timelines, metadata, stereo, sync |
|
|
40
|
+
| Folder | 8 | 8 | Clip listing, export, transcription |
|
|
41
|
+
| MediaPoolItem | 36 | 36 | Metadata, markers, flags, properties, proxy, transcription |
|
|
42
|
+
| Timeline | 58 | 58 | Tracks, markers, items, export, generators, titles, stills, stereo |
|
|
43
|
+
| TimelineItem | 80 | 80 | Properties, markers, Fusion comps, versions, takes, CDL, AI tools |
|
|
44
|
+
| Gallery | 8 | 8 | Albums, stills, power grades |
|
|
45
|
+
| GalleryStillAlbum | 6 | 6 | Stills management, import/export, labels |
|
|
46
|
+
| Graph | 11 | 22 | Node operations, LUTs, cache, grades (timeline + clip graph variants) |
|
|
47
|
+
| ColorGroup | 5 | 10 | Group management, pre/post clip node graphs |
|
|
48
|
+
|
|
49
|
+
## Test Results
|
|
50
|
+
|
|
51
|
+
Baseline testing was performed against **DaVinci Resolve 19.1.3 Studio** on macOS with live API calls (no mocks). Resolve 20 additions were revalidated live against **DaVinci Resolve 20.3.2 Studio**.
|
|
52
|
+
|
|
53
|
+
| Phase | Tests | Pass Rate | Scope |
|
|
54
|
+
|-------|-------|-----------|-------|
|
|
55
|
+
| Phase 1 | 204/204 | 100% | Safe read-only operations across all classes |
|
|
56
|
+
| Phase 2 | 79/79 | 100% | Destructive operations with create-test-cleanup patterns |
|
|
57
|
+
| Phase 3 | 20/20 | 100% | Real media import, sync, transcription, database switching, Resolve.Quit |
|
|
58
|
+
| Phase 4 | 10/10 | 100% | AI/ML methods, Fusion clips, stereo, gallery stills |
|
|
59
|
+
| Phase 5 | 6/6 | 100% | Scene cuts, subtitles from audio, graph node cache/tools/enable |
|
|
60
|
+
| Resolve 20 delta | 12/12 | 100% | Resolve 20.0-20.2.2 scripting additions live-tested on 20.3.2 |
|
|
61
|
+
| **Total** | **331/331** | **100%** | **98.5% of current API methods tested live** |
|
|
62
|
+
|
|
63
|
+
### Untested Methods (5 of 336)
|
|
64
|
+
|
|
65
|
+
| Method | Reason | Help Wanted |
|
|
66
|
+
|--------|--------|-------------|
|
|
67
|
+
| `PM.CreateCloudProject` | Requires DaVinci Resolve cloud infrastructure | Yes |
|
|
68
|
+
| `PM.LoadCloudProject` | Requires DaVinci Resolve cloud infrastructure | Yes |
|
|
69
|
+
| `PM.ImportCloudProject` | Requires DaVinci Resolve cloud infrastructure | Yes |
|
|
70
|
+
| `PM.RestoreCloudProject` | Requires DaVinci Resolve cloud infrastructure | Yes |
|
|
71
|
+
| `TL.AnalyzeDolbyVision` | Requires HDR/Dolby Vision content | Yes |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Complete API Reference
|
|
76
|
+
|
|
77
|
+
Every method in the DaVinci Resolve Scripting API and its test status. Methods are listed by object class.
|
|
78
|
+
|
|
79
|
+
**Status Key:**
|
|
80
|
+
- ✅ = Tested live, returned expected result
|
|
81
|
+
- ⚠️ = Tested live, API accepted call (returned `False` — needs specific context to fully execute)
|
|
82
|
+
- ☁️ = Requires cloud infrastructure (untested)
|
|
83
|
+
- 🔬 = Requires specific content/hardware (untested — PRs welcome)
|
|
84
|
+
|
|
85
|
+
### Resolve
|
|
86
|
+
|
|
87
|
+
| # | Method | Status | Test Result / Notes |
|
|
88
|
+
|---|--------|--------|---------------------|
|
|
89
|
+
| 1 | `Fusion()` | ✅ | Returns Fusion object |
|
|
90
|
+
| 2 | `GetMediaStorage()` | ✅ | Returns MediaStorage object |
|
|
91
|
+
| 3 | `GetProjectManager()` | ✅ | Returns ProjectManager object |
|
|
92
|
+
| 4 | `OpenPage(pageName)` | ✅ | Switches Resolve page |
|
|
93
|
+
| 5 | `GetCurrentPage()` | ✅ | Returns current page name (e.g. `"edit"`) |
|
|
94
|
+
| 6 | `GetProductName()` | ✅ | Returns `"DaVinci Resolve Studio"` |
|
|
95
|
+
| 7 | `GetVersion()` | ✅ | Returns `[19, 1, 3, 7, '']` |
|
|
96
|
+
| 8 | `GetVersionString()` | ✅ | Returns `"19.1.3.7"` |
|
|
97
|
+
| 9 | `LoadLayoutPreset(presetName)` | ✅ | Loads saved layout |
|
|
98
|
+
| 10 | `UpdateLayoutPreset(presetName)` | ✅ | Updates existing preset |
|
|
99
|
+
| 11 | `ExportLayoutPreset(presetName, presetFilePath)` | ✅ | Exports preset to file |
|
|
100
|
+
| 12 | `DeleteLayoutPreset(presetName)` | ✅ | Deletes preset |
|
|
101
|
+
| 13 | `SaveLayoutPreset(presetName)` | ⚠️ | API accepts; returns `False` when preset name conflicts |
|
|
102
|
+
| 14 | `ImportLayoutPreset(presetFilePath, presetName)` | ✅ | Imports preset from file |
|
|
103
|
+
| 15 | `Quit()` | ✅ | Quits DaVinci Resolve |
|
|
104
|
+
| 16 | `ImportRenderPreset(presetPath)` | ⚠️ | API accepts; needs valid preset file |
|
|
105
|
+
| 17 | `ExportRenderPreset(presetName, exportPath)` | ⚠️ | API accepts; needs valid preset name |
|
|
106
|
+
| 18 | `ImportBurnInPreset(presetPath)` | ⚠️ | API accepts; needs valid preset file |
|
|
107
|
+
| 19 | `ExportBurnInPreset(presetName, exportPath)` | ⚠️ | API accepts; needs valid preset name |
|
|
108
|
+
| 20 | `GetKeyframeMode()` | ✅ | Returns keyframe mode |
|
|
109
|
+
| 21 | `SetKeyframeMode(keyframeMode)` | ⚠️ | API accepts; mode must match valid enum |
|
|
110
|
+
| 22 | `GetFairlightPresets()` | ✅ | Resolve 20.3.2 live test returns preset map |
|
|
111
|
+
|
|
112
|
+
### ProjectManager
|
|
113
|
+
|
|
114
|
+
| # | Method | Status | Test Result / Notes |
|
|
115
|
+
|---|--------|--------|---------------------|
|
|
116
|
+
| 1 | `ArchiveProject(projectName, filePath, ...)` | ⚠️ | API accepts; archiving is slow |
|
|
117
|
+
| 2 | `CreateProject(projectName, mediaLocationPath)` | ✅ | Creates new project; optional media location added in Resolve 20.2.2 |
|
|
118
|
+
| 3 | `DeleteProject(projectName)` | ⚠️ | Returns `False` if project is open |
|
|
119
|
+
| 4 | `LoadProject(projectName)` | ✅ | Returns Project object |
|
|
120
|
+
| 5 | `GetCurrentProject()` | ✅ | Returns current Project |
|
|
121
|
+
| 6 | `SaveProject()` | ✅ | Saves current project |
|
|
122
|
+
| 7 | `CloseProject(project)` | ✅ | Closes project |
|
|
123
|
+
| 8 | `CreateFolder(folderName)` | ✅ | Creates project folder |
|
|
124
|
+
| 9 | `DeleteFolder(folderName)` | ✅ | Deletes project folder |
|
|
125
|
+
| 10 | `GetProjectListInCurrentFolder()` | ✅ | Returns project name list |
|
|
126
|
+
| 11 | `GetFolderListInCurrentFolder()` | ✅ | Returns folder name list |
|
|
127
|
+
| 12 | `GotoRootFolder()` | ✅ | Navigates to root |
|
|
128
|
+
| 13 | `GotoParentFolder()` | ✅ | Returns `False` at root (expected) |
|
|
129
|
+
| 14 | `GetCurrentFolder()` | ✅ | Returns current folder name |
|
|
130
|
+
| 15 | `OpenFolder(folderName)` | ✅ | Opens folder |
|
|
131
|
+
| 16 | `ImportProject(filePath, projectName)` | ✅ | Imports .drp file |
|
|
132
|
+
| 17 | `ExportProject(projectName, filePath, ...)` | ✅ | Exports .drp file |
|
|
133
|
+
| 18 | `RestoreProject(filePath, projectName)` | ⚠️ | API accepts; needs backup archive |
|
|
134
|
+
| 19 | `GetCurrentDatabase()` | ✅ | Returns `{DbType, DbName}` |
|
|
135
|
+
| 20 | `GetDatabaseList()` | ✅ | Returns list of databases |
|
|
136
|
+
| 21 | `SetCurrentDatabase({dbInfo})` | ✅ | Switches database |
|
|
137
|
+
| 22 | `CreateCloudProject({cloudSettings})` | ☁️ | Requires cloud infrastructure |
|
|
138
|
+
| 23 | `LoadCloudProject({cloudSettings})` | ☁️ | Requires cloud infrastructure |
|
|
139
|
+
| 24 | `ImportCloudProject(filePath, {cloudSettings})` | ☁️ | Requires cloud infrastructure |
|
|
140
|
+
| 25 | `RestoreCloudProject(folderPath, {cloudSettings})` | ☁️ | Requires cloud infrastructure |
|
|
141
|
+
|
|
142
|
+
### Project
|
|
143
|
+
|
|
144
|
+
| # | Method | Status | Test Result / Notes |
|
|
145
|
+
|---|--------|--------|---------------------|
|
|
146
|
+
| 1 | `GetMediaPool()` | ✅ | Returns MediaPool object |
|
|
147
|
+
| 2 | `GetTimelineCount()` | ✅ | Returns integer count |
|
|
148
|
+
| 3 | `GetTimelineByIndex(idx)` | ✅ | Returns Timeline object |
|
|
149
|
+
| 4 | `GetCurrentTimeline()` | ✅ | Returns current Timeline |
|
|
150
|
+
| 5 | `SetCurrentTimeline(timeline)` | ✅ | Sets active timeline |
|
|
151
|
+
| 6 | `GetGallery()` | ✅ | Returns Gallery object |
|
|
152
|
+
| 7 | `GetName()` | ✅ | Returns project name |
|
|
153
|
+
| 8 | `SetName(projectName)` | ⚠️ | Returns `False` on open project |
|
|
154
|
+
| 9 | `GetPresetList()` | ✅ | Returns preset list with dimensions |
|
|
155
|
+
| 10 | `SetPreset(presetName)` | ⚠️ | API accepts; preset must exist |
|
|
156
|
+
| 11 | `AddRenderJob()` | ✅ | Returns job ID string |
|
|
157
|
+
| 12 | `DeleteRenderJob(jobId)` | ✅ | Deletes render job |
|
|
158
|
+
| 13 | `DeleteAllRenderJobs()` | ✅ | Clears render queue |
|
|
159
|
+
| 14 | `GetRenderJobList()` | ✅ | Returns job list |
|
|
160
|
+
| 15 | `GetRenderPresetList()` | ✅ | Returns preset names |
|
|
161
|
+
| 16 | `StartRendering(...)` | ✅ | Starts render |
|
|
162
|
+
| 17 | `StopRendering()` | ✅ | Stops render |
|
|
163
|
+
| 18 | `IsRenderingInProgress()` | ✅ | Returns `False` when idle |
|
|
164
|
+
| 19 | `LoadRenderPreset(presetName)` | ✅ | Loads render preset |
|
|
165
|
+
| 20 | `SaveAsNewRenderPreset(presetName)` | ✅ | Creates render preset |
|
|
166
|
+
| 21 | `DeleteRenderPreset(presetName)` | ✅ | Deletes render preset |
|
|
167
|
+
| 22 | `SetRenderSettings({settings})` | ✅ | Applies render settings; Resolve 20.2 adds `ExportSubtitle` and `SubtitleFormat` keys |
|
|
168
|
+
| 23 | `GetRenderJobStatus(jobId)` | ✅ | Returns `{JobStatus, CompletionPercentage}` |
|
|
169
|
+
| 24 | `GetQuickExportRenderPresets()` | ✅ | Returns preset names |
|
|
170
|
+
| 25 | `RenderWithQuickExport(preset, {params})` | ✅ | Initiates quick export |
|
|
171
|
+
| 26 | `GetSetting(settingName)` | ✅ | Returns project settings dict |
|
|
172
|
+
| 27 | `SetSetting(settingName, settingValue)` | ✅ | Sets project setting |
|
|
173
|
+
| 28 | `GetRenderFormats()` | ✅ | Returns format map |
|
|
174
|
+
| 29 | `GetRenderCodecs(renderFormat)` | ✅ | Returns codec map |
|
|
175
|
+
| 30 | `GetCurrentRenderFormatAndCodec()` | ✅ | Returns `{format, codec}` |
|
|
176
|
+
| 31 | `SetCurrentRenderFormatAndCodec(format, codec)` | ✅ | Sets format and codec |
|
|
177
|
+
| 32 | `GetCurrentRenderMode()` | ✅ | Returns mode integer |
|
|
178
|
+
| 33 | `SetCurrentRenderMode(renderMode)` | ✅ | Sets render mode |
|
|
179
|
+
| 34 | `GetRenderResolutions(format, codec)` | ✅ | Returns resolution list |
|
|
180
|
+
| 35 | `RefreshLUTList()` | ✅ | Refreshes LUT list |
|
|
181
|
+
| 36 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
182
|
+
| 37 | `InsertAudioToCurrentTrackAtPlayhead(...)` | ⚠️ | Tested; needs Fairlight page context |
|
|
183
|
+
| 38 | `LoadBurnInPreset(presetName)` | ⚠️ | API accepts; preset must exist |
|
|
184
|
+
| 39 | `ExportCurrentFrameAsStill(filePath)` | ⚠️ | API accepts; needs valid playhead position |
|
|
185
|
+
| 40 | `GetColorGroupsList()` | ✅ | Returns color group list |
|
|
186
|
+
| 41 | `AddColorGroup(groupName)` | ✅ | Returns ColorGroup object |
|
|
187
|
+
| 42 | `DeleteColorGroup(colorGroup)` | ✅ | Deletes color group |
|
|
188
|
+
| 43 | `ApplyFairlightPresetToCurrentTimeline(presetName)` | ⚠️ | Resolve 20.3.2 live test accepts call; returns `False` without a named preset |
|
|
189
|
+
|
|
190
|
+
### MediaStorage
|
|
191
|
+
|
|
192
|
+
| # | Method | Status | Test Result / Notes |
|
|
193
|
+
|---|--------|--------|---------------------|
|
|
194
|
+
| 1 | `GetMountedVolumeList()` | ✅ | Returns mounted volume paths |
|
|
195
|
+
| 2 | `GetSubFolderList(folderPath)` | ✅ | Returns subfolder paths |
|
|
196
|
+
| 3 | `GetFileList(folderPath)` | ✅ | Returns file paths |
|
|
197
|
+
| 4 | `RevealInStorage(path)` | ✅ | Reveals path in Media Storage |
|
|
198
|
+
| 5 | `AddItemListToMediaPool(...)` | ✅ | Imports media, returns clips |
|
|
199
|
+
| 6 | `AddClipMattesToMediaPool(item, [paths], eye)` | ✅ | Adds clip mattes |
|
|
200
|
+
| 7 | `AddTimelineMattesToMediaPool([paths])` | ✅ | Returns MediaPoolItem list |
|
|
201
|
+
|
|
202
|
+
### MediaPool
|
|
203
|
+
|
|
204
|
+
| # | Method | Status | Test Result / Notes |
|
|
205
|
+
|---|--------|--------|---------------------|
|
|
206
|
+
| 1 | `GetRootFolder()` | ✅ | Returns root Folder |
|
|
207
|
+
| 2 | `AddSubFolder(folder, name)` | ✅ | Creates subfolder |
|
|
208
|
+
| 3 | `RefreshFolders()` | ✅ | Refreshes folder list |
|
|
209
|
+
| 4 | `CreateEmptyTimeline(name)` | ✅ | Creates timeline |
|
|
210
|
+
| 5 | `AppendToTimeline(...)` | ✅ | Appends clips, returns TimelineItems |
|
|
211
|
+
| 6 | `CreateTimelineFromClips(name, ...)` | ✅ | Creates timeline from clips |
|
|
212
|
+
| 7 | `ImportTimelineFromFile(filePath, {options})` | ✅ | Imports AAF/EDL/XML |
|
|
213
|
+
| 8 | `DeleteTimelines([timeline])` | ✅ | Deletes timelines |
|
|
214
|
+
| 9 | `GetCurrentFolder()` | ✅ | Returns current Folder |
|
|
215
|
+
| 10 | `SetCurrentFolder(folder)` | ✅ | Sets current folder |
|
|
216
|
+
| 11 | `DeleteClips([clips])` | ✅ | Deletes clips |
|
|
217
|
+
| 12 | `ImportFolderFromFile(filePath)` | ✅ | Imports DRB folder |
|
|
218
|
+
| 13 | `DeleteFolders([subfolders])` | ✅ | Deletes folders |
|
|
219
|
+
| 14 | `MoveClips([clips], targetFolder)` | ✅ | Moves clips |
|
|
220
|
+
| 15 | `MoveFolders([folders], targetFolder)` | ✅ | Moves folders |
|
|
221
|
+
| 16 | `GetClipMatteList(item)` | ✅ | Returns matte paths |
|
|
222
|
+
| 17 | `GetTimelineMatteList(folder)` | ✅ | Returns matte items |
|
|
223
|
+
| 18 | `DeleteClipMattes(item, [paths])` | ✅ | Deletes clip mattes |
|
|
224
|
+
| 19 | `RelinkClips([items], folderPath)` | ⚠️ | API accepts; needs offline clips |
|
|
225
|
+
| 20 | `UnlinkClips([items])` | ✅ | Unlinks clips |
|
|
226
|
+
| 21 | `ImportMedia([items])` | ✅ | Imports media files |
|
|
227
|
+
| 22 | `ExportMetadata(fileName, [clips])` | ✅ | Exports metadata CSV |
|
|
228
|
+
| 23 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
229
|
+
| 24 | `CreateStereoClip(left, right)` | ✅ | Creates stereo pair |
|
|
230
|
+
| 25 | `AutoSyncAudio([items], {settings})` | ⚠️ | Tested; needs matching A/V clips |
|
|
231
|
+
| 26 | `GetSelectedClips()` | ✅ | Returns selected clips |
|
|
232
|
+
| 27 | `SetSelectedClip(item)` | ✅ | Selects clip |
|
|
233
|
+
|
|
234
|
+
### Folder
|
|
235
|
+
|
|
236
|
+
| # | Method | Status | Test Result / Notes |
|
|
237
|
+
|---|--------|--------|---------------------|
|
|
238
|
+
| 1 | `GetClipList()` | ✅ | Returns clip list |
|
|
239
|
+
| 2 | `GetName()` | ✅ | Returns folder name |
|
|
240
|
+
| 3 | `GetSubFolderList()` | ✅ | Returns subfolder list |
|
|
241
|
+
| 4 | `GetIsFolderStale()` | ✅ | Returns `False` |
|
|
242
|
+
| 5 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
243
|
+
| 6 | `Export(filePath)` | ✅ | Exports DRB file |
|
|
244
|
+
| 7 | `TranscribeAudio()` | ✅ | Starts audio transcription |
|
|
245
|
+
| 8 | `ClearTranscription()` | ✅ | Clears transcription |
|
|
246
|
+
|
|
247
|
+
### MediaPoolItem
|
|
248
|
+
|
|
249
|
+
| # | Method | Status | Test Result / Notes |
|
|
250
|
+
|---|--------|--------|---------------------|
|
|
251
|
+
| 1 | `GetName()` | ✅ | Returns clip name |
|
|
252
|
+
| 2 | `GetMetadata(metadataType)` | ✅ | Returns metadata dict |
|
|
253
|
+
| 3 | `SetMetadata(type, value)` | ✅ | Sets metadata |
|
|
254
|
+
| 4 | `GetThirdPartyMetadata(type)` | ✅ | Returns third-party metadata |
|
|
255
|
+
| 5 | `SetThirdPartyMetadata(type, value)` | ✅ | Sets third-party metadata |
|
|
256
|
+
| 6 | `GetMediaId()` | ✅ | Returns media UUID |
|
|
257
|
+
| 7 | `AddMarker(frameId, color, name, note, duration, customData)` | ✅ | Adds marker |
|
|
258
|
+
| 8 | `GetMarkers()` | ✅ | Returns marker dict |
|
|
259
|
+
| 9 | `GetMarkerByCustomData(customData)` | ✅ | Finds marker by data |
|
|
260
|
+
| 10 | `UpdateMarkerCustomData(frameId, customData)` | ✅ | Updates marker data |
|
|
261
|
+
| 11 | `GetMarkerCustomData(frameId)` | ✅ | Returns custom data string |
|
|
262
|
+
| 12 | `DeleteMarkersByColor(color)` | ✅ | Deletes markers by color |
|
|
263
|
+
| 13 | `DeleteMarkerAtFrame(frameNum)` | ⚠️ | Returns `False` if no marker at frame |
|
|
264
|
+
| 14 | `DeleteMarkerByCustomData(customData)` | ⚠️ | Returns `False` if no match |
|
|
265
|
+
| 15 | `AddFlag(color)` | ✅ | Adds flag |
|
|
266
|
+
| 16 | `GetFlagList()` | ✅ | Returns flag colors |
|
|
267
|
+
| 17 | `ClearFlags(color)` | ✅ | Clears flags |
|
|
268
|
+
| 18 | `GetClipColor()` | ✅ | Returns clip color |
|
|
269
|
+
| 19 | `SetClipColor(colorName)` | ✅ | Sets clip color |
|
|
270
|
+
| 20 | `ClearClipColor()` | ✅ | Clears clip color |
|
|
271
|
+
| 21 | `GetClipProperty(propertyName)` | ✅ | Returns property dict |
|
|
272
|
+
| 22 | `SetClipProperty(propertyName, value)` | ⚠️ | API accepts; some properties read-only |
|
|
273
|
+
| 23 | `LinkProxyMedia(proxyMediaFilePath)` | ✅ | Links proxy media |
|
|
274
|
+
| 24 | `UnlinkProxyMedia()` | ✅ | Unlinks proxy media |
|
|
275
|
+
| 25 | `ReplaceClip(filePath)` | ✅ | Replaces clip source |
|
|
276
|
+
| 26 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
277
|
+
| 27 | `TranscribeAudio()` | ✅ | Starts audio transcription |
|
|
278
|
+
| 28 | `ClearTranscription()` | ✅ | Clears transcription |
|
|
279
|
+
| 29 | `GetAudioMapping()` | ✅ | Returns JSON audio mapping |
|
|
280
|
+
| 30 | `GetMarkInOut()` | ✅ | Returns mark in/out dict |
|
|
281
|
+
| 31 | `SetMarkInOut(in, out, type)` | ✅ | Sets mark in/out |
|
|
282
|
+
| 32 | `ClearMarkInOut(type)` | ✅ | Clears mark in/out |
|
|
283
|
+
| 33 | `SetName(clipName)` | ✅ | Resolve 20.3.2 live test renames clip |
|
|
284
|
+
| 34 | `LinkFullResolutionMedia(filePath)` | ⚠️ | Resolve 20.3.2 live test accepts call; full-res relink returns `False` without a matching proxy/full-res fixture |
|
|
285
|
+
| 35 | `ReplaceClipPreserveSubClip(filePath)` | ✅ | Resolve 20.3.2 live test replaces clip while preserving subclip metadata |
|
|
286
|
+
| 36 | `MonitorGrowingFile()` | ✅ | Resolve 20.3.2 live test enables growing-file monitoring |
|
|
287
|
+
|
|
288
|
+
### Timeline
|
|
289
|
+
|
|
290
|
+
| # | Method | Status | Test Result / Notes |
|
|
291
|
+
|---|--------|--------|---------------------|
|
|
292
|
+
| 1 | `GetName()` | ✅ | Returns timeline name |
|
|
293
|
+
| 2 | `SetName(timelineName)` | ⚠️ | Returns `False` on active timeline |
|
|
294
|
+
| 3 | `GetStartFrame()` | ✅ | Returns start frame |
|
|
295
|
+
| 4 | `GetEndFrame()` | ✅ | Returns end frame |
|
|
296
|
+
| 5 | `SetStartTimecode(timecode)` | ✅ | Sets start timecode |
|
|
297
|
+
| 6 | `GetStartTimecode()` | ✅ | Returns `"01:00:00:00"` |
|
|
298
|
+
| 7 | `GetTrackCount(trackType)` | ✅ | Returns track count |
|
|
299
|
+
| 8 | `AddTrack(trackType, subTrackType)` | ✅ | Adds track |
|
|
300
|
+
| 9 | `DeleteTrack(trackType, trackIndex)` | ✅ | Deletes track |
|
|
301
|
+
| 10 | `GetTrackSubType(trackType, trackIndex)` | ✅ | Returns sub-type (e.g. `"stereo"`) |
|
|
302
|
+
| 11 | `SetTrackEnable(trackType, trackIndex, enabled)` | ✅ | Enables/disables track |
|
|
303
|
+
| 12 | `GetIsTrackEnabled(trackType, trackIndex)` | ✅ | Returns enabled state |
|
|
304
|
+
| 13 | `SetTrackLock(trackType, trackIndex, locked)` | ✅ | Locks/unlocks track |
|
|
305
|
+
| 14 | `GetIsTrackLocked(trackType, trackIndex)` | ✅ | Returns lock state |
|
|
306
|
+
| 15 | `DeleteClips([timelineItems], ripple)` | ✅ | Deletes clips from timeline |
|
|
307
|
+
| 16 | `SetClipsLinked([timelineItems], linked)` | ✅ | Links/unlinks clips |
|
|
308
|
+
| 17 | `GetItemListInTrack(trackType, index)` | ✅ | Returns items on track |
|
|
309
|
+
| 18 | `AddMarker(frameId, color, name, note, duration, customData)` | ✅ | Adds timeline marker |
|
|
310
|
+
| 19 | `GetMarkers()` | ✅ | Returns marker dict |
|
|
311
|
+
| 20 | `GetMarkerByCustomData(customData)` | ✅ | Finds marker by data |
|
|
312
|
+
| 21 | `UpdateMarkerCustomData(frameId, customData)` | ✅ | Updates marker data |
|
|
313
|
+
| 22 | `GetMarkerCustomData(frameId)` | ✅ | Returns custom data |
|
|
314
|
+
| 23 | `DeleteMarkersByColor(color)` | ✅ | Deletes markers by color |
|
|
315
|
+
| 24 | `DeleteMarkerAtFrame(frameNum)` | ⚠️ | Returns `False` if no marker at frame |
|
|
316
|
+
| 25 | `DeleteMarkerByCustomData(customData)` | ⚠️ | Returns `False` if no match |
|
|
317
|
+
| 26 | `GetCurrentTimecode()` | ✅ | Returns timecode string |
|
|
318
|
+
| 27 | `SetCurrentTimecode(timecode)` | ⚠️ | Returns `False` if playback not active |
|
|
319
|
+
| 28 | `GetCurrentVideoItem()` | ✅ | Returns item at playhead |
|
|
320
|
+
| 29 | `GetCurrentClipThumbnailImage()` | ✅ | Returns thumbnail data |
|
|
321
|
+
| 30 | `GetTrackName(trackType, trackIndex)` | ✅ | Returns track name |
|
|
322
|
+
| 31 | `SetTrackName(trackType, trackIndex, name)` | ✅ | Sets track name |
|
|
323
|
+
| 32 | `DuplicateTimeline(timelineName)` | ✅ | Duplicates timeline |
|
|
324
|
+
| 33 | `CreateCompoundClip([items], {clipInfo})` | ✅ | Returns compound clip item |
|
|
325
|
+
| 34 | `CreateFusionClip([timelineItems])` | ✅ | Returns Fusion clip item |
|
|
326
|
+
| 35 | `ImportIntoTimeline(filePath, {options})` | ⚠️ | Tested; result depends on file format |
|
|
327
|
+
| 36 | `Export(fileName, exportType, exportSubtype)` | ✅ | Exports EDL/XML/AAF |
|
|
328
|
+
| 37 | `GetSetting(settingName)` | ✅ | Returns settings dict |
|
|
329
|
+
| 38 | `SetSetting(settingName, settingValue)` | ⚠️ | API accepts; some settings read-only |
|
|
330
|
+
| 39 | `InsertGeneratorIntoTimeline(name)` | ✅ | Inserts generator |
|
|
331
|
+
| 40 | `InsertFusionGeneratorIntoTimeline(name)` | ✅ | Inserts Fusion generator |
|
|
332
|
+
| 41 | `InsertFusionCompositionIntoTimeline()` | ✅ | Inserts Fusion composition |
|
|
333
|
+
| 42 | `InsertOFXGeneratorIntoTimeline(name)` | ⚠️ | API accepts; needs valid OFX plugin |
|
|
334
|
+
| 43 | `InsertTitleIntoTimeline(name)` | ✅ | Inserts title |
|
|
335
|
+
| 44 | `InsertFusionTitleIntoTimeline(name)` | ✅ | Inserts Fusion title |
|
|
336
|
+
| 45 | `GrabStill()` | ✅ | Returns GalleryStill object |
|
|
337
|
+
| 46 | `GrabAllStills(stillFrameSource)` | ✅ | Returns list of GalleryStill objects |
|
|
338
|
+
| 47 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
339
|
+
| 48 | `CreateSubtitlesFromAudio({settings})` | ✅ | Returns `True` — creates subtitles from audio |
|
|
340
|
+
| 49 | `DetectSceneCuts()` | ✅ | Returns `True` — detects scene cuts in timeline |
|
|
341
|
+
| 50 | `ConvertTimelineToStereo()` | ✅ | Converts timeline to stereo 3D |
|
|
342
|
+
| 51 | `GetNodeGraph()` | ✅ | Returns Graph object |
|
|
343
|
+
| 52 | `AnalyzeDolbyVision([items], analysisType)` | 🔬 | Requires HDR/Dolby Vision content |
|
|
344
|
+
| 53 | `GetMediaPoolItem()` | ✅ | Returns MediaPoolItem for timeline |
|
|
345
|
+
| 54 | `GetMarkInOut()` | ✅ | Returns mark in/out dict |
|
|
346
|
+
| 55 | `SetMarkInOut(in, out, type)` | ✅ | Sets mark in/out |
|
|
347
|
+
| 56 | `ClearMarkInOut(type)` | ✅ | Clears mark in/out |
|
|
348
|
+
| 57 | `GetVoiceIsolationState(trackIndex)` | ✅ | Resolve 20.3.2 live test returns voice isolation state |
|
|
349
|
+
| 58 | `SetVoiceIsolationState(trackIndex, {state})` | ✅ | Resolve 20.3.2 live test sets voice isolation state |
|
|
350
|
+
|
|
351
|
+
### TimelineItem
|
|
352
|
+
|
|
353
|
+
| # | Method | Status | Test Result / Notes |
|
|
354
|
+
|---|--------|--------|---------------------|
|
|
355
|
+
| 1 | `GetName()` | ✅ | Returns item name |
|
|
356
|
+
| 2 | `GetDuration(subframe_precision)` | ✅ | Returns duration |
|
|
357
|
+
| 3 | `GetEnd(subframe_precision)` | ✅ | Returns end frame |
|
|
358
|
+
| 4 | `GetSourceEndFrame()` | ✅ | Returns source end frame |
|
|
359
|
+
| 5 | `GetSourceEndTime()` | ✅ | Returns source end time |
|
|
360
|
+
| 6 | `GetFusionCompCount()` | ✅ | Returns comp count |
|
|
361
|
+
| 7 | `GetFusionCompByIndex(compIndex)` | ✅ | Returns Fusion composition |
|
|
362
|
+
| 8 | `GetFusionCompNameList()` | ✅ | Returns comp names |
|
|
363
|
+
| 9 | `GetFusionCompByName(compName)` | ✅ | Returns Fusion composition |
|
|
364
|
+
| 10 | `GetLeftOffset(subframe_precision)` | ✅ | Returns left offset |
|
|
365
|
+
| 11 | `GetRightOffset(subframe_precision)` | ✅ | Returns right offset |
|
|
366
|
+
| 12 | `GetStart(subframe_precision)` | ✅ | Returns start frame |
|
|
367
|
+
| 13 | `GetSourceStartFrame()` | ✅ | Returns source start |
|
|
368
|
+
| 14 | `GetSourceStartTime()` | ✅ | Returns source start time |
|
|
369
|
+
| 15 | `SetProperty(propertyKey, propertyValue)` | ✅ | Sets item property |
|
|
370
|
+
| 16 | `GetProperty(propertyKey)` | ✅ | Returns property dict |
|
|
371
|
+
| 17 | `AddMarker(frameId, color, name, note, duration, customData)` | ✅ | Adds marker to item |
|
|
372
|
+
| 18 | `GetMarkers()` | ✅ | Returns marker dict |
|
|
373
|
+
| 19 | `GetMarkerByCustomData(customData)` | ✅ | Finds marker by data |
|
|
374
|
+
| 20 | `UpdateMarkerCustomData(frameId, customData)` | ✅ | Updates marker data |
|
|
375
|
+
| 21 | `GetMarkerCustomData(frameId)` | ✅ | Returns custom data |
|
|
376
|
+
| 22 | `DeleteMarkersByColor(color)` | ✅ | Deletes markers by color |
|
|
377
|
+
| 23 | `DeleteMarkerAtFrame(frameNum)` | ⚠️ | Returns `False` if no marker at frame |
|
|
378
|
+
| 24 | `DeleteMarkerByCustomData(customData)` | ⚠️ | Returns `False` if no match |
|
|
379
|
+
| 25 | `AddFlag(color)` | ✅ | Adds flag |
|
|
380
|
+
| 26 | `GetFlagList()` | ✅ | Returns flag colors |
|
|
381
|
+
| 27 | `ClearFlags(color)` | ✅ | Clears flags |
|
|
382
|
+
| 28 | `GetClipColor()` | ✅ | Returns clip color |
|
|
383
|
+
| 29 | `SetClipColor(colorName)` | ✅ | Sets clip color |
|
|
384
|
+
| 30 | `ClearClipColor()` | ✅ | Clears clip color |
|
|
385
|
+
| 31 | `AddFusionComp()` | ✅ | Creates Fusion composition |
|
|
386
|
+
| 32 | `ImportFusionComp(path)` | ✅ | Imports .comp file |
|
|
387
|
+
| 33 | `ExportFusionComp(path, compIndex)` | ✅ | Exports .comp file |
|
|
388
|
+
| 34 | `DeleteFusionCompByName(compName)` | ⚠️ | Returns `False` if comp not found |
|
|
389
|
+
| 35 | `LoadFusionCompByName(compName)` | ✅ | Loads composition |
|
|
390
|
+
| 36 | `RenameFusionCompByName(oldName, newName)` | ✅ | Renames composition |
|
|
391
|
+
| 37 | `AddVersion(versionName, versionType)` | ✅ | Adds grade version |
|
|
392
|
+
| 38 | `GetCurrentVersion()` | ✅ | Returns version info |
|
|
393
|
+
| 39 | `DeleteVersionByName(versionName, versionType)` | ⚠️ | Returns `False` if version not found |
|
|
394
|
+
| 40 | `LoadVersionByName(versionName, versionType)` | ✅ | Loads grade version |
|
|
395
|
+
| 41 | `RenameVersionByName(oldName, newName, type)` | ✅ | Renames version |
|
|
396
|
+
| 42 | `GetVersionNameList(versionType)` | ✅ | Returns version names |
|
|
397
|
+
| 43 | `GetMediaPoolItem()` | ✅ | Returns source MediaPoolItem |
|
|
398
|
+
| 44 | `GetStereoConvergenceValues()` | ✅ | Returns stereo keyframes |
|
|
399
|
+
| 45 | `GetStereoLeftFloatingWindowParams()` | ✅ | Returns stereo params |
|
|
400
|
+
| 46 | `GetStereoRightFloatingWindowParams()` | ✅ | Returns stereo params |
|
|
401
|
+
| 47 | `SetCDL([CDL map])` | ✅ | Sets CDL values |
|
|
402
|
+
| 48 | `AddTake(mediaPoolItem, startFrame, endFrame)` | ✅ | Adds take |
|
|
403
|
+
| 49 | `GetSelectedTakeIndex()` | ✅ | Returns selected take index |
|
|
404
|
+
| 50 | `GetTakesCount()` | ✅ | Returns take count |
|
|
405
|
+
| 51 | `GetTakeByIndex(idx)` | ✅ | Returns take info |
|
|
406
|
+
| 52 | `DeleteTakeByIndex(idx)` | ✅ | Deletes take |
|
|
407
|
+
| 53 | `SelectTakeByIndex(idx)` | ✅ | Selects take |
|
|
408
|
+
| 54 | `FinalizeTake()` | ⚠️ | Returns `False` when no take selected |
|
|
409
|
+
| 55 | `CopyGrades([tgtTimelineItems])` | ⚠️ | API accepts; needs matching items |
|
|
410
|
+
| 56 | `SetClipEnabled(enabled)` | ✅ | Enables/disables clip |
|
|
411
|
+
| 57 | `GetClipEnabled()` | ✅ | Returns enabled state |
|
|
412
|
+
| 58 | `UpdateSidecar()` | ⚠️ | Returns `False` for non-BRAW clips |
|
|
413
|
+
| 59 | `GetUniqueId()` | ✅ | Returns UUID string |
|
|
414
|
+
| 60 | `LoadBurnInPreset(presetName)` | ⚠️ | API accepts; preset must exist |
|
|
415
|
+
| 61 | `CreateMagicMask(mode)` | ⚠️ | Tested; needs DaVinci Neural Engine + Color page context |
|
|
416
|
+
| 62 | `RegenerateMagicMask()` | ⚠️ | Tested; needs existing mask |
|
|
417
|
+
| 63 | `Stabilize()` | ✅ | Returns `True` on supported clips |
|
|
418
|
+
| 64 | `SmartReframe()` | ⚠️ | Tested; needs specific aspect ratio setup |
|
|
419
|
+
| 65 | `GetNodeGraph(layerIdx)` | ✅ | Returns Graph object |
|
|
420
|
+
| 66 | `GetColorGroup()` | ✅ | Returns ColorGroup |
|
|
421
|
+
| 67 | `AssignToColorGroup(colorGroup)` | ✅ | Assigns to group |
|
|
422
|
+
| 68 | `RemoveFromColorGroup()` | ⚠️ | Returns `False` if not in group |
|
|
423
|
+
| 69 | `ExportLUT(exportType, path)` | ✅ | Exports LUT file |
|
|
424
|
+
| 70 | `GetLinkedItems()` | ✅ | Returns linked items |
|
|
425
|
+
| 71 | `GetTrackTypeAndIndex()` | ✅ | Returns `[trackType, trackIndex]` |
|
|
426
|
+
| 72 | `GetSourceAudioChannelMapping()` | ✅ | Returns audio mapping |
|
|
427
|
+
| 73 | `GetIsColorOutputCacheEnabled()` | ✅ | Returns cache state |
|
|
428
|
+
| 74 | `GetIsFusionOutputCacheEnabled()` | ✅ | Returns cache state |
|
|
429
|
+
| 75 | `SetColorOutputCache(cache_value)` | ⚠️ | Tested; needs active color pipeline |
|
|
430
|
+
| 76 | `SetFusionOutputCache(cache_value)` | ⚠️ | Tested; needs active Fusion pipeline |
|
|
431
|
+
| 77 | `SetName(clipName)` | ✅ | Resolve 20.3.2 live test renames timeline item |
|
|
432
|
+
| 78 | `GetVoiceIsolationState()` | ✅ | Resolve 20.3.2 live test returns voice isolation state |
|
|
433
|
+
| 79 | `SetVoiceIsolationState({state})` | ✅ | Resolve 20.3.2 live test sets voice isolation state |
|
|
434
|
+
| 80 | `ResetAllNodeColors()` | ✅ | Resolve 20.3.2 live test resets node colors |
|
|
435
|
+
|
|
436
|
+
### Gallery
|
|
437
|
+
|
|
438
|
+
| # | Method | Status | Test Result / Notes |
|
|
439
|
+
|---|--------|--------|---------------------|
|
|
440
|
+
| 1 | `GetAlbumName(galleryStillAlbum)` | ✅ | Returns album name |
|
|
441
|
+
| 2 | `SetAlbumName(galleryStillAlbum, albumName)` | ✅ | Sets album name |
|
|
442
|
+
| 3 | `GetCurrentStillAlbum()` | ✅ | Returns GalleryStillAlbum |
|
|
443
|
+
| 4 | `SetCurrentStillAlbum(galleryStillAlbum)` | ✅ | Sets current album |
|
|
444
|
+
| 5 | `GetGalleryStillAlbums()` | ✅ | Returns album list |
|
|
445
|
+
| 6 | `GetGalleryPowerGradeAlbums()` | ✅ | Returns power grade albums |
|
|
446
|
+
| 7 | `CreateGalleryStillAlbum()` | ✅ | Creates still album |
|
|
447
|
+
| 8 | `CreateGalleryPowerGradeAlbum()` | ✅ | Creates power grade album |
|
|
448
|
+
|
|
449
|
+
### GalleryStillAlbum
|
|
450
|
+
|
|
451
|
+
| # | Method | Status | Test Result / Notes |
|
|
452
|
+
|---|--------|--------|---------------------|
|
|
453
|
+
| 1 | `GetStills()` | ✅ | Returns list of GalleryStill objects |
|
|
454
|
+
| 2 | `GetLabel(galleryStill)` | ✅ | Returns label string |
|
|
455
|
+
| 3 | `SetLabel(galleryStill, label)` | ⚠️ | API accepts; may not persist in all versions |
|
|
456
|
+
| 4 | `ImportStills([filePaths])` | ✅ | Imports DRX still files (requires Color page) |
|
|
457
|
+
| 5 | `ExportStills([stills], folderPath, prefix, format)` | ✅ | Exports stills as image + companion .drx grade file. Requires Color page with Gallery panel visible. Supported formats: dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx. |
|
|
458
|
+
| 6 | `DeleteStills([galleryStill])` | ✅ | Deletes stills from album |
|
|
459
|
+
|
|
460
|
+
> **Note (v2.0.8+):** The compound server's `gallery_stills` tool includes a `grab_and_export` action that combines `GrabStill()` + `ExportStills()` in a single call — more reliable than calling them separately since it keeps the live GalleryStill reference. Returns the list of exported files (image + .drx grade data). Requires the Color page with the Gallery panel open.
|
|
461
|
+
|
|
462
|
+
### Graph
|
|
463
|
+
|
|
464
|
+
| # | Method | Status | Test Result / Notes |
|
|
465
|
+
|---|--------|--------|---------------------|
|
|
466
|
+
| 1 | `GetNumNodes()` | ✅ | Returns node count (via ColorGroup pre/post graphs) |
|
|
467
|
+
| 2 | `SetLUT(nodeIndex, lutPath)` | ✅ | Sets LUT on node |
|
|
468
|
+
| 3 | `GetLUT(nodeIndex)` | ✅ | Returns LUT path |
|
|
469
|
+
| 4 | `SetNodeCacheMode(nodeIndex, cache_value)` | ✅ | Returns `True` |
|
|
470
|
+
| 5 | `GetNodeCacheMode(nodeIndex)` | ✅ | Returns `-1` (no cache mode set) |
|
|
471
|
+
| 6 | `GetNodeLabel(nodeIndex)` | ✅ | Returns node label string |
|
|
472
|
+
| 7 | `GetToolsInNode(nodeIndex)` | ✅ | Returns `None` (no OFX tools in node) |
|
|
473
|
+
| 8 | `SetNodeEnabled(nodeIndex, isEnabled)` | ✅ | Returns `True` |
|
|
474
|
+
| 9 | `ApplyGradeFromDRX(path, gradeMode)` | ✅ | Applies grade from DRX file |
|
|
475
|
+
| 10 | `ApplyArriCdlLut()` | ✅ | Applies ARRI CDL LUT |
|
|
476
|
+
| 11 | `ResetAllGrades()` | ✅ | Resets all grades |
|
|
477
|
+
|
|
478
|
+
### ColorGroup
|
|
479
|
+
|
|
480
|
+
| # | Method | Status | Test Result / Notes |
|
|
481
|
+
|---|--------|--------|---------------------|
|
|
482
|
+
| 1 | `GetName()` | ✅ | Returns group name |
|
|
483
|
+
| 2 | `SetName(groupName)` | ✅ | Sets group name |
|
|
484
|
+
| 3 | `GetClipsInTimeline(timeline)` | ✅ | Returns clips in group |
|
|
485
|
+
| 4 | `GetPreClipNodeGraph()` | ✅ | Returns Graph object |
|
|
486
|
+
| 5 | `GetPostClipNodeGraph()` | ✅ | Returns Graph object |
|
|
487
|
+
|
|
488
|
+
---
|