Handle media pool clip markers

Yanru MuLess than 1 minute

Handle media pool clip markers

Python
#!/usr/bin/env python

"""
Sample script to demonstrate following operations to first MediaPool clip in DaVinci Resolve Studio:
1. Add markers
2. Get markers
3. Set customData
4. Delete markers

NOTE: Add one clip (recommended clip duration >= 80 frames) in the MediaPool root bin before running this script.

Example usage: 10_media_pool_marker_operations.py
"""

import os
import sys
from python_get_resolve import GetResolve

resolve = GetResolve()
project = resolve.GetProjectManager().GetCurrentProject()

if not project:
    print("No project is loaded")
    sys.exit()

# Open Media page
resolve.OpenPage("media")

# Get supporting objects
projectManager = resolve.GetProjectManager()
mediaPool = project.GetMediaPool()
rootBin = mediaPool.GetRootFolder()

# Go to root bin
mediaPool.SetCurrentFolder(rootBin)

# Gets clips
clips = rootBin.GetClipList()
if not clips or not clips[0]:
    print("Error: MediaPool root bin doesn't contain any clips, add one clip (recommended clip duration >= 80 frames) and try again!")
    sys.exit()

# Choose first clip in the list
clip = clips[0]

# Get clip frames
framesProperty = clip.GetClipProperty("Frames")
if not framesProperty:
    print("Error: Failed to get clip 'Frames' property !")
    sys.exit()

numFrames = int(framesProperty)

# Add Markers
if (numFrames >= 1):
    isSuccess = clip.AddMarker(1, "Red", "Marker1", "Marker1 at frame 1", 1)
    if isSuccess:
        print("Added marker at FrameId:1")

if (numFrames >= 20):
    isSuccess = clip.AddMarker(20, "Blue", "Marker2", "Marker2 at frame 20", 1, "My Custom Data") # marker with custom data
    if isSuccess:
        print("Added marker at FrameId:20")

if (numFrames >= (50 + 20)):
    isSuccess = clip.AddMarker(50, "Green", "Marker3", "Marker3 at frame 50 (duration 20)", 20) # marker with duration 20 frames
    if isSuccess:
        print("Added marker at FrameId:50")

print("")

# Get all markers for the clip
markers = clip.GetMarkers()
for key, value in markers.items():
    print("Marker at FrameId:%d" % key)
    print(value)

print("")

# Get marker using custom data
markerWithCustomData = clip.GetMarkerByCustomData("My Custom Data")
print("Marker with customData:")
print(markerWithCustomData)

print("")

# Set marker custom data
updatedCustomData = "Updated Custom Data"
isSuccess = clip.UpdateMarkerCustomData(20, updatedCustomData)
if isSuccess:
    print("Updated marker customData at FrameId:20")

print("")

# Get marker custom data
customData = clip.GetMarkerCustomData(20)
print("Marker CustomData at FrameId:20 is:'%s'" % customData)

print("")

# Delete marker using color
isSuccess = clip.DeleteMarkersByColor("Red")
if isSuccess:
    print("Deleted marker with color:'Red'")

# Delete marker using frame number
isSuccess = clip.DeleteMarkerAtFrame(50)
if isSuccess:
    print("Deleted marker at frameNum:50")

# Delete marker using custom data
isSuccess = clip.DeleteMarkerByCustomData(updatedCustomData)
if isSuccess:
    print("Deleted marker with Customdata:'%s'" % updatedCustomData)
Lua
--[[
Sample script to demonstrate following operations to first MediaPool clip in DaVinci Resolve Studio:
1. Add markers
2. Get markers
3. Set customData
4. Delete markers

NOTE: Add one clip (recommended clip duration >= 80 frames) in the MediaPool root bin before running this script.
--]]

local function GetFirstClipInMediaPool()
    -- Get supporting objects
    resolve = Resolve()
    projectManager = resolve:GetProjectManager()
    mediaPool = project:GetMediaPool()
    rootBin = mediaPool:GetRootFolder()

    -- Go to root bin
    mediaPool:SetCurrentFolder(rootBin)

    -- Get clips
    clips = rootBin:GetClipList()
    if not clips or (next(clips) == nil) then
        print("Error: MediaPool root bin doesn't contain any clips, add one clip (recommended clip duration >= 80 frames) and try again!")
        os.exit()
    end

    return clips[1]
end

local function GetClipFrameCount( clip )
    framesProperty = clip:GetClipProperty("Frames")
    if not framesProperty then
        print("Error: Failed to get clip 'Frames' property !")
        os.exit()
    end

    return tonumber(framesProperty)
end

local function AddMarkers( clip, numFrames )
    if (numFrames >= 1) then
        isSuccess = clip:AddMarker(1, "Red", "Marker1", "Marker1 at frame 1", 1)
        if isSuccess then
            print("Added marker at FrameId:1")
        end
    end

    if (numFrames >= 20) then
        isSuccess = clip:AddMarker(20, "Blue", "Marker2", "Marker2 at frame 20", 1, "My Custom Data") -- marker with custom data
        if isSuccess then
            print("Added marker at FrameId:20")
        end
    end

    if (numFrames >= (50 + 20)) then
        isSuccess = clip:AddMarker(50, "Green", "Marker3", "Marker3 at frame 50 (duration 20)", 20) -- marker with duration 20 frames
        if isSuccess then
            print("Added marker at FrameId:50")
        end
    end
end

local function PrintMarkerInfo( markerInfo )
    print("color:'" .. markerInfo["color"] .. "'  duration:" .. markerInfo["duration"] .. "  note:'" .. markerInfo["note"] .. "'  name:'" .. markerInfo["name"] .. "'  customData:'" .. markerInfo["customData"] .. "'")
end

local function PrintAllClipMarkers( clip )
    markers = clip:GetMarkers()
    for key, value in pairs(markers) do
        print("Marker at FrameId:" .. key)
        PrintMarkerInfo(value)
    end
end


resolve = Resolve()
project = resolve:GetProjectManager():GetCurrentProject()

if not project then
    print("No project is loaded")
    os.exit()
end

-- Open Media page
resolve:OpenPage("media")

-- Get first media pool clip
clip = GetFirstClipInMediaPool()

-- Get clip frames
numFrames = GetClipFrameCount(clip)

-- Add Markers
AddMarkers(clip, numFrames)

print("")

-- Get all markers for the clip
PrintAllClipMarkers(clip)

print("")

-- Get marker using custom data
markerWithCustomData = clip:GetMarkerByCustomData("My Custom Data")
print("Marker with customData:")
PrintMarkerInfo(markerWithCustomData)

print("")

-- Set marker custom data
updatedCustomData = "Updated Custom Data"
isSuccess = clip:UpdateMarkerCustomData(20, updatedCustomData)
if isSuccess then
    print("Updated marker customData at FrameId:20")
end

print("")

-- Get marker custom data
customData = clip:GetMarkerCustomData(20)
print("Marker CustomData at FrameId:20 is:'" .. customData .. "'")

print("")

-- Delete marker using color
isSuccess = clip:DeleteMarkersByColor("Red")
if isSuccess then
    print("Deleted marker with color:'Red'")
end

-- Delete marker using frame number
isSuccess = clip:DeleteMarkerAtFrame(50)
if isSuccess then
    print("Deleted marker at frameNum:50")
end

-- Delete marker using custom data
isSuccess = clip:DeleteMarkerByCustomData(updatedCustomData)
if isSuccess then
    print("Deleted marker with Customdata:'" .. updatedCustomData .. "'")
end
JavaScript
/**
 * Sample script to demonstrate following operations to first MediaPool clip in DaVinci Resolve Studio:
 * 1. Add markers
 * 2. Get markers
 * 3. Set customData
 * 4. Delete markers
 *
 * NOTE: Add one clip (recommended clip duration >= 80 frames) in the MediaPool root bin before running this script.
 */

const WorkflowIntegration = require('./WorkflowIntegration.node');

// Configurable variables
PLUGIN_ID = "com.blackmagicdesign.resolve.sampleplugin"; // update it to your unique plugin Id as mentioned in the manifest.xml file

// Main function to perform all actions
function main(pluginId) {
    // Check pluginId
    if (!pluginId) {
        alert("Error: 'pluginId' is empty, update it to some valid value and try again!");
        return false;
    }

    // Initialize
    isInitialized = WorkflowIntegration.Initialize(pluginId);
    if (!isInitialized) {
        alert("Error: Failed to initialize!");
        return;
    }

    // Get resolve object
    resolve = WorkflowIntegration.GetResolve();
    if (!resolve) {
        alert("Error: Failed to get resolve object!");
        return;
    }

    // Open Media page
    resolve.OpenPage("media");

    // Get supporting objects
    projectManager = resolve.GetProjectManager();
    project = projectManager.GetCurrentProject();
    mediaPool = project.GetMediaPool();
    rootBin = mediaPool.GetRootFolder();

    // Go to root bin
    mediaPool.SetCurrentFolder(rootBin);

    // Gets clips
    clips = rootBin.GetClipList();
    if (!clips || !clips[0]) {
        alert("Error: MediaPool root bin doesn't contain any clips, add one clip (recommended clip duration >= 80 frames) and try again!");
        return;
    }

    // Choose first clip in the list
    clip = clips[0];

    // Get clip frames
    framesProperty = clip.GetClipProperty("Frames");
    if (!framesProperty) {
        alert("Error: Failed to get clip 'Frames' property !");
        return;
    }
    numFrames = parseInt(framesProperty);

    // Add Markers
    if (numFrames >= 1) {
        isSuccess = clip.AddMarker(/*markerPos*/ 1, /*color*/ "Red", /*markerName*/ "Marker1", /*note*/ "Marker1 at frame 1", /*duration*/ 1);
        if (isSuccess) {
            console.log("Added marker at FrameId:1");
        }
    }

    if (numFrames >= 20) {
        isSuccess = clip.AddMarker(/*markerPos*/ 20, /*color*/ "Blue", /*markerName*/ "Marker2", /*note*/ "Marker2 at frame 20", /*duration*/ 1, /*customData*/ "My Custom Data"); // marker with custom data
        if (isSuccess) {
            console.log("Added marker at FrameId:20");
        }
    }

    if (numFrames >= (50 + 20)) {
        isSuccess = clip.AddMarker(/*markerPos*/ 50, /*color*/ "Green", /*markerName*/ "Marker3", /*note*/ "Marker3 at frame 50 (duration 20)", /*duration*/ 20); // marker with duration 20 frames
        if (isSuccess) {
            console.log("Added marker at FrameId:50");
        }
    }

    // Get all markers for the clip
    markers = clip.GetMarkers();
    for (let [frameId, markerInfo] of Object.entries(markers)) {
        console.log("Marker at FrameId:" + frameId);
        console.log(markerInfo);
    }

    // Get marker using custom data
    markerWithCustomData = clip.GetMarkerByCustomData("My Custom Data");
    console.log("Marker with customData:");
    console.log(markerWithCustomData);

    // Set marker custom data
    updatedCustomData = "Updated Custom Data";
    isSuccess = clip.UpdateMarkerCustomData(20, updatedCustomData);
    if (isSuccess) {
        console.log("Updated marker customData at FrameId:20");
    }

    // Get marker custom data
    customData = clip.GetMarkerCustomData(20);
    console.log(`Marker CustomData at FrameId:20 is:'${customData}'`);

    // Delete marker using color
    isSuccess = clip.DeleteMarkersByColor("Red");
    if (isSuccess) {
        console.log("Deleted marker with color:'Red'");
    }

    // Delete marker using frame number
    isSuccess = clip.DeleteMarkerAtFrame(50)
    if (isSuccess) {
        console.log("Deleted marker at frameNum:50");
    }

    // Delete marker using custom data
    isSuccess = clip.DeleteMarkerByCustomData(updatedCustomData)
    if (isSuccess) {
        console.log(`Deleted marker with customData:'${updatedCustomData}'`);
    }

    // Done
    // WorkflowIntegration.CleanUp(); // Call CleanUp() during plugin app quit only
}

// Run main function
main(PLUGIN_ID);
Last update:
Contributors: muyanru