Accessing Resolve Media Pool Metadata in the Fusion Page
This weekend I was asked by a friend in the immersive sector to explain how a Resolve Fusion page user could access Resolve Media Pool based metadata records. Their goal was to create custom burnin titles using Fusion page Text+ nodes, then to reformat the "flat" titles into a 360VR image projection. This would make it possible to quickly overlay important data over the footage when exporting intermediate files for the rest of their team's post-production staff to use.
My initial commentary before showing one approach to do this, is to say that life in the Fusion page would be so much more fulfilling, and a more rewarding experience overall if Resolve Tokens worked in a Text+ node's expression field. Also, I think intool scripts and simple expressions having read-only (thread-safe) access to Resolve API zones like Media Pool Items would be super-powerful, too.
In fuses, for example, we can access the following values without needing to make a new connection to Fusion() / fusion.CurrentComp:
- self.Comp
- self.Comp:MapPath()
- self.Comp:Execute()
- self.Comp.Filename
- self.Comp.Name
- self.Comp.RenderStart
- self.Comp.RenderEnd
- self.Comp.GlobalStart
- self.Comp.GlobalEnd
Conceptually, if there was a "self.MediaPool:" approach that was accessible in fuses, intool scripts, and simple expressions, life would be better for Resolve based TDs.
If this was possible, one would be able to more easily check the MediaPool with Lua Patterns to look for assets by name. Then a MediaIn node MediaID tag could be relinked to use these revised assets in Title Templates, Effects Templates, etc.
This way you could make title templates that use movie files with a MediaIn node, vs going over to PathMapped image sequences in Loader nodes... just to avoid issues that happen when importing a pre-existing .setting file (that holds a MediaIn node) into a new Resolve project database where the MediaID tag for the MediaPool item won't lineup with the asset inside the Macro.
Connecting to the Media Pool
In the mean time let's explore one approach to pass Media Pool item metadata to a Title+ node. We are going to use a DIY Lua script technique that places a copy of the current Media Pool metadata Lua table info into the "Comments" record of a MediaIn node in the Fusion page.
Then we use a UserControls entry added to the Text+ node to receive the connection information from the MediaIn node, done wirelessly, via the magic of a
INPID_InputControl = "ImageControl",. This is how the MediaIn node's Comments records will be accessible in the Text+ node's StyledText field expression.
The super-lazy way to access the MediaIn node comments in a Text+ node StyledText expression would be:
MediaIn1.Comments
If you want to add the MediaIn node comments content to a Text+ node reliably you can use a StyledText expression of:
Text(self:GetSourceTool("MetadataSource").Comments.Value)
or you can use the following StyledText expression to access a specific record directly from the Lua table data and print it in the text+ node using:
:local tbl = bmd.readstring(self:GetSourceTool("MetadataSource").Comments.Value); return Text(tbl.Property["Clip Name"])
The simple expression above pulls the data from a WirelessLink "Drag and Drop" like UserControls entry added to the Text+ node in a text editor using:
Code: Select all
UserControls = ordered() {
MetadataSource = {
LINKID_DataType = "Image",
LINKS_Name = "MetadataSource",
IC_ControlPage = 1,
INPID_InputControl = "ImageControl",
INP_Default = 0,
}
}
Copy/Paste-able Example Node Setup
Here is a macro .settings snippet that has a MediaIn node with a pre-filled Comments entry, along with a Text+ node that has the UserControls field appended:
"MediaIn node with comments and Text+ node.setting"
Code: Select all
{
Tools = ordered() {
Text = TextPlus {
CtrlWZoom = false,
NameSet = true,
CustomData = {
Path = {
Map = {
["Setting:"] = "Previews:/KartaVR/"
}
},
},
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Center = Input { Value = { 0.5, 0.0977223427331887 }, },
StyledText = Input {
Value = "",
Expression = ":local tbl = bmd.readstring(self:GetSourceTool(\"MetadataSource\").Comments.Value); return Text(tbl.Property[\"Clip Name\"])",
},
Font = Input { Value = "Open Sans", },
Style = Input { Value = "Bold", },
Size = Input { Value = 0.0398550724637681, },
VerticalJustificationNew = Input { Value = 3, },
HorizontalJustificationNew = Input { Value = 3, },
MetadataSource = Input {
SourceOp = "MediaIn1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 484.333, 150.924 } },
UserControls = ordered() {
MetadataSource = {
LINKID_DataType = "Image",
LINKS_Name = "MetadataSource",
IC_ControlPage = 1,
INPID_InputControl = "ImageControl",
INP_Default = 0,
}
}
},
MediaIn1 = MediaIn {
CustomData = {
MediaProps = {
MEDIA_FORMAT_TYPE = "JPEG",
MEDIA_HEIGHT = 2048,
MEDIA_IS_SOURCE_RES = true,
MEDIA_LAYER_DESC = {
},
MEDIA_MARK_IN = 0,
MEDIA_MARK_OUT = 0,
MEDIA_NAME = "angular360degree.jpg",
MEDIA_NUM_FRAMES = 1,
MEDIA_NUM_LAYERS = 0,
MEDIA_PAR = 1,
MEDIA_PATH = "/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/angular360degree.jpg",
MEDIA_SRC_FRAME_RATE = 24,
MEDIA_START_FRAME = 0,
MEDIA_WIDTH = 2048
},
},
Inputs = {
GlobalOut = Input { Value = 119, },
MediaID = Input { Value = "66eb91ea-0b56-40b5-a7d1-39e3764530a1", },
AudioTrack = Input { Value = FuID { "Timeline Audio" }, },
Layer = Input {
Value = Text {
},
},
ClipTimeEnd = Input { Value = 0, },
HoldLastFrame = Input { Value = 119, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Comments = Input { Value = "{\n MediaProps = {\n MEDIA_PAR = 1,\n MEDIA_PATH = \"/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/angular360degree.jpg\",\n MEDIA_SRC_FRAME_RATE = 24,\n MEDIA_START_FRAME = 0,\n MEDIA_WIDTH = 2048,\n MEDIA_FORMAT_TYPE = \"JPEG\",\n MEDIA_HEIGHT = 2048,\n MEDIA_IS_SOURCE_RES = true,\n MEDIA_LAYER_DESC = {\n },\n MEDIA_MARK_IN = 0,\n MEDIA_MARK_OUT = 0,\n MEDIA_NAME = \"angular360degree.jpg\",\n MEDIA_NUM_FRAMES = 1,\n MEDIA_NUM_LAYERS = 0\n },\n NodeName = \"MediaIn1\",\n MediaID = \"66eb91ea-0b56-40b5-a7d1-39e3764530a1\",\n Property = {\n [\"Good Take\"] = \"\",\n [\"H-FLIP\"] = \"Off\",\n IDT = \"\",\n [\"Input Color Space\"] = \"Project\",\n [\"Input LUT\"] = \"\",\n [\"Input Sizing Preset\"] = \"None\",\n End = \"360\",\n [\"Offline Reference\"] = \"\",\n [\"Online Status\"] = \"Online\",\n Out = \"\",\n PAR = \"Square\",\n [\"Proxy Media Path\"] = \"\",\n [\"Reel Name\"] = \"\",\n Resolution = \"2048x2048\",\n [\"Roll/Card\"] = \"\",\n [\"S3D Sync\"] = \"\",\n [\"Sample Rate\"] = \"\",\n Scene = \"\",\n Shot = \"\",\n In = \"\",\n [\"Start KeyKode\"] = \"\",\n [\"Start TC\"] = \"00:00:00:00\",\n Proxy = \"None\",\n [\"Synced Audio\"] = \"\",\n Take = \"\",\n Usage = \"0\",\n [\"V-FLIP\"] = \"Off\",\n [\"Video Codec\"] = \"JPEG\",\n [\"Alpha mode\"] = \"None\",\n [\"Super Scale\"] = 1,\n Comments = \"\",\n Type = \"Still\",\n Start = \"360\",\n [\"Drop frame\"] = \"0\",\n [\"Slate TC\"] = \"00:00:00:00\",\n [\"Enable Deinterlacing\"] = \"0\",\n Sharpness = \"\",\n [\"Audio Bit Depth\"] = \"\",\n [\"Audio Ch\"] = \"0\",\n [\"Audio Codec\"] = \"\",\n [\"Audio Offset\"] = \"\",\n [\"Bit Depth\"] = \"8\",\n [\"Camera #\"] = \"\",\n [\"Clip Color\"] = \"\",\n [\"Clip Name\"] = \"angular360degree.jpg\",\n Angle = \"\",\n [\"Data Level\"] = \"Auto\",\n [\"Date Added\"] = \"Sat Oct 1 2022 23:18:29\",\n [\"Date Created\"] = \"Tue Aug 23 2022 00:23:35\",\n [\"Date Modified\"] = \"Tue Aug 23 00:23:35 2022\",\n Description = \"\",\n Duration = \"00:00:00:01\",\n [\"Noise Reduction\"] = \"\",\n [\"End TC\"] = \"00:00:00:01\",\n FPS = 24,\n [\"Field Dominance\"] = \"Auto\",\n [\"File Name\"] = \"angular360degree.jpg\",\n [\"File Path\"] = \"/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/angular360degree.jpg\",\n Flags = \"\",\n Format = \"JPEG\",\n Frames = \"1\",\n Keyword = \"\"\n }\n}", },
FrameRenderScriptNest = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 328, 150.394 } },
}
}
}
WIP Example Lua Comp Script
This comp script takes the currently selected (and active) MediaIn node from a Resolve Studio based Fusion page composite and looks for its metadata records in the active Resolve Media Pool bin "folder".
"Find Selected MediaID in Media Pool.lua" Comp Script:
Code: Select all
--[[--
Find Selected MediaID in Media Pool.lua - 2022-10-02 02.00 AM
By Andrew Hazelden <andrew@andrewhazelden.com>
Overview:
This comp script takes the currently selected (and active) MediaIn node from a Resolve Studio based Fusion page composite and looks for its metadata records in the active Resolve Media Pool bin "folder". The metadata records are then used as the contents in the MediaIn node's Comments field.
The resulting output in the Comments field on a MediaIn node looks like this:
{
NodeName = "MediaIn5",
MediaID = "9769be21-8a07-4786-a280-06bb78943d91",
Property = {
IDT = "",
["Input Color Space"] = "Project",
["Input LUT"] = "",
["Input Sizing Preset"] = "None",
Keyword = "",
In = "",
["Online Status"] = "Online",
Out = "",
PAR = "Square",
["Proxy Media Path"] = "",
["Reel Name"] = "",
Resolution = "2048x2048",
["Roll/Card"] = "",
["S3D Sync"] = "",
["Sample Rate"] = "",
Scene = "",
Shot = "",
["Slate TC"] = "00:00:00:00",
["Start KeyKode"] = "",
["Start TC"] = "00:00:00:00",
Angle = "",
["Synced Audio"] = "",
Take = "",
Usage = "0",
["V-FLIP"] = "Off",
["Video Codec"] = "JPEG",
["Alpha mode"] = "None",
["Noise Reduction"] = "",
Type = "Still",
Start = "2",
Sharpness = "",
["Drop frame"] = "0",
Proxy = "None",
["Enable Deinterlacing"] = "0",
["Offline Reference"] = "",
["Audio Bit Depth"] = "",
["Audio Ch"] = "0",
["Audio Codec"] = "",
["Audio Offset"] = "",
["Bit Depth"] = "8",
["Camera #"] = "",
["Clip Color"] = "",
["Clip Name"] = "fulldome_2K.jpg",
["Super Scale"] = 1,
["Data Level"] = "Auto",
Comments = "",
["Date Created"] = "Tue Aug 23 2022 00:23:45",
["Date Modified"] = "Tue Aug 23 00:23:45 2022",
Description = "",
Duration = "00:00:00:01",
End = "2",
["End TC"] = "00:00:00:01",
FPS = 24,
["Field Dominance"] = "Auto",
["File Name"] = "fulldome_2K.jpg",
["File Path"] = "/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/fulldome_2K.jpg",
Flags = "",
Format = "JPEG",
Frames = "1",
["Date Added"] = "Sat Oct 1 2022 23:18:29",
["Good Take"] = "",
["H-FLIP"] = "Off"
},
MediaProps = { MEDIA_NUM_LAYERS = 0, MEDIA_FORMAT_TYPE = "JPEG", MEDIA_PATH = "/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/fulldome_2K.jpg", MEDIA_LAYER_DESC = {
}, MEDIA_NAME = "fulldome_2K.jpg", MEDIA_HEIGHT = 2048, MEDIA_START_FRAME = 0, MEDIA_IS_SOURCE_RES = true, MEDIA_SRC_FRAME_RATE = 24, MEDIA_MARK_OUT = 0, MEDIA_WIDTH = 2048, MEDIA_NUM_FRAMES = 1, MEDIA_MARK_IN = 0, MEDIA_PAR = 1 }
}
* * *
Tip: You could store the output from running this type of comp script in a CustomData record in the "comp" or "tool" scope if you didn't want to use the comment field on the MediaIn node.
Note: If one wanted to revise this script, it would be possible to expand the searching scope of the Media Pool, to start at the root folder and then recursively look in all-subfolders using "folder:GetSubFolderList()".
* * *
The super-lazy way to access the MediaIn node comments in a Text+ node StyledText expression would be:
MediaIn1.Comments
If you want to add the MediaIn node comments content to a Text+ node reliably you can use a StyledText expression of:
Text(self:GetSourceTool("MetadataSource").Comments.Value)
or you can use the following StyledText expression to access a specific record directly from the Lua table data and print it in the text+ node using:
:local tbl = bmd.readstring(self:GetSourceTool("MetadataSource").Comments.Value); return Text(tbl.Property["Clip Name"])
This simple expression above pulls the data from a WirelessLink "Drag and Drop" like UserControls entry added to the Text+ node in a text editor using:
UserControls = ordered() {
MetadataSource = {
LINKID_DataType = "Image",
LINKS_Name = "MetadataSource",
IC_ControlPage = 1,
INPID_InputControl = "ImageControl",
INP_Default = 0,
}
}
For further reading about this idea check out:
WSL | Rendering Text From Metadata Tags
https://www.steakunderwater.com/wesuckless/viewtopic.php?p=10922#p10922
--]]--
function GetMediaID()
-- Grab the selected MediaIn node's MediaID tag
local id
local tool = comp.ActiveTool
local name
if tool and tool:GetAttrs() and tool:GetAttrs().TOOLS_RegID == "MediaIn" then
-- Node Name
name = tool.Name
-- Node MediaID
id = tool["MediaID"][fu.TIME_UNDEFINED]
-- dump(nodeID)
else
print("[Error] Select a MediaIn node.")
end
return id, name, tool
end
function BrowseMediaPool(id)
-- Look inside the current MediaPool folder for a matching MediaID tag
local res = Resolve("localhost", 0, bmd.getappuuid())
if res ~= nil then
pm = res:GetProjectManager()
project = pm:GetCurrentProject()
mp = project:GetMediaPool()
folder = mp:GetCurrentFolder()
clips = folder:GetClips()
for clipIndex, clipValue in ipairs(clips) do
prop = clipValue:GetClipProperty()
-- Type: "Still", "Video", "Audio", "Video + Audio", "Geometry", "Generator", "Timeline"
clipType = prop["Type"]
-- dump(clipType)
if clipType == "Still" or clipType == "Video" or clipType == "Video + Audio" then
clipID = clipValue:GetMediaId()
-- fileName = prop["File Name"]
-- dump(fileName)
-- Check for a mediaID match from the selected MediaIn node in the Fusion page and the MediaPool clip
if id and clipID and id == clipID then
return clipValue
end
end
end
else
print("[Error] Could not connect to Resolve session.")
end
end
function Main()
-- Grab the selected MediaIn node's MediaID tag
local nodeID, nodeName, nodeTool = GetMediaID()
if nodeID then
-- Look inside the current MediaPool folder for a matching MediaID tag
local mpClip = BrowseMediaPool(nodeID)
if mpClip then
local mpTable = {}
mpTable.NodeName = (nodeName or "")
mpTable.MediaID = nodeID
mpTable.MediaProps = nodeTool:GetData("MediaProps")
mpTable.Property = mpClip:GetClipProperty()
-- print("[" .. mpTable.NodeName .. "]")
-- print(" [MediaID]")
-- print(mpTable.MediaID)
-- print(" [Resolve Metadata]")
-- dump(mpTable.Property)
-- Write the metadata to the MediaIn node's Comment field:
nodeTool["Comments"][fu.TIME_UNDEFINED] = bmd.writestring(mpTable)
-- Auto-switch to the Common control page to display the Comments input content
nodeTool:ShowControlPage("Common")
else
print("[Error] MediaIn Node footage not found in current Media Pool folder.")
end
end
print("[Done]")
end
Main()
Yeah... But Can You Vonk-ify This Workflow For Me?
If you are a fan of the Vonk Data Nodes in Fusion, it is technically possible to use the "vTextExecute" node to dynamically update the Comments fields on MediaIn nodes by running an inline Lua code chunk in the fuse.
This results in the MediaIn Comments data updating in an asynchronous fashion since the fuse uses the "self.Comp:Execute()" function under-the-hood.
I pasted the following Lua script in a Vonk vTextExecute node. When the node is rendered, or displayed in the Viewer window, all of the MediaIn node Comments are automatically refreshed in the comp. For performance tuning, the vTextExcute node could be set to a PassThrough state after you have refreshed the MediaIn nodes.
"Find All MediaID in Media Pool.lua" Comp Script:
Code: Select all
--[[--
Find All MediaID in Media Pool.lua - 2022-10-02 02.00 AM
By Andrew Hazelden <andrew@andrewhazelden.com>
Overview:
This comp script takes all MediaIn nodes from a Resolve Studio based Fusion page composite and looks for their metadata records in the active Resolve Media Pool bin "folder". The metadata records are then used as the contents in the MediaIn node's Comments field.
The resulting output in the Comments field on a MediaIn node looks like this:
{
NodeName = "MediaIn5",
MediaID = "9769be21-8a07-4786-a280-06bb78943d91",
Property = {
IDT = "",
["Input Color Space"] = "Project",
["Input LUT"] = "",
["Input Sizing Preset"] = "None",
Keyword = "",
In = "",
["Online Status"] = "Online",
Out = "",
PAR = "Square",
["Proxy Media Path"] = "",
["Reel Name"] = "",
Resolution = "2048x2048",
["Roll/Card"] = "",
["S3D Sync"] = "",
["Sample Rate"] = "",
Scene = "",
Shot = "",
["Slate TC"] = "00:00:00:00",
["Start KeyKode"] = "",
["Start TC"] = "00:00:00:00",
Angle = "",
["Synced Audio"] = "",
Take = "",
Usage = "0",
["V-FLIP"] = "Off",
["Video Codec"] = "JPEG",
["Alpha mode"] = "None",
["Noise Reduction"] = "",
Type = "Still",
Start = "2",
Sharpness = "",
["Drop frame"] = "0",
Proxy = "None",
["Enable Deinterlacing"] = "0",
["Offline Reference"] = "",
["Audio Bit Depth"] = "",
["Audio Ch"] = "0",
["Audio Codec"] = "",
["Audio Offset"] = "",
["Bit Depth"] = "8",
["Camera #"] = "",
["Clip Color"] = "",
["Clip Name"] = "fulldome_2K.jpg",
["Super Scale"] = 1,
["Data Level"] = "Auto",
Comments = "",
["Date Created"] = "Tue Aug 23 2022 00:23:45",
["Date Modified"] = "Tue Aug 23 00:23:45 2022",
Description = "",
Duration = "00:00:00:01",
End = "2",
["End TC"] = "00:00:00:01",
FPS = 24,
["Field Dominance"] = "Auto",
["File Name"] = "fulldome_2K.jpg",
["File Path"] = "/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/fulldome_2K.jpg",
Flags = "",
Format = "JPEG",
Frames = "1",
["Date Added"] = "Sat Oct 1 2022 23:18:29",
["Good Take"] = "",
["H-FLIP"] = "Off"
},
MediaProps = { MEDIA_NUM_LAYERS = 0, MEDIA_FORMAT_TYPE = "JPEG", MEDIA_PATH = "/Users/vfx/Reactor/Deploy/Macros/KartaVR/Images/fulldome_2K.jpg", MEDIA_LAYER_DESC = {
}, MEDIA_NAME = "fulldome_2K.jpg", MEDIA_HEIGHT = 2048, MEDIA_START_FRAME = 0, MEDIA_IS_SOURCE_RES = true, MEDIA_SRC_FRAME_RATE = 24, MEDIA_MARK_OUT = 0, MEDIA_WIDTH = 2048, MEDIA_NUM_FRAMES = 1, MEDIA_MARK_IN = 0, MEDIA_PAR = 1 }
}
* * *
Tip: You could store the output from running this type of comp script in a CustomData record in the "comp" or "tool" scope if you didn't want to use the comment field on the MediaIn node.
Note: If one wanted to revise this script, it would be possible to expand the searching scope of the Media Pool, to start at the root folder and then recursively look in all-subfolders using "folder:GetSubFolderList()".
* * *
The super-lazy way to access the MediaIn node comments in a Text+ node StyledText expression would be:
MediaIn1.Comments
If you want to add the MediaIn node comments content to a Text+ node reliably you can use a StyledText expression of:
Text(self:GetSourceTool("MetadataSource").Comments.Value)
or you can use the following StyledText expression to access a specific record directly from the Lua table data and print it in the text+ node using:
:local tbl = bmd.readstring(self:GetSourceTool("MetadataSource").Comments.Value); return Text(tbl.Property["Clip Name"])
This simple expression above pulls the data from a WirelessLink "Drag and Drop" like UserControls entry added to the Text+ node in a text editor using:
UserControls = ordered() {
MetadataSource = {
LINKID_DataType = "Image",
LINKS_Name = "MetadataSource",
IC_ControlPage = 1,
INPID_InputControl = "ImageControl",
INP_Default = 0,
}
}
For further reading about this idea check out:
WSL | Rendering Text From Metadata Tags
https://www.steakunderwater.com/wesuckless/viewtopic.php?p=10922#p10922
--]]--
function GetMediaID(tool)
-- Grab the MediaIn node's MediaID tag
local id
local name
if tool and tool:GetAttrs() and tool:GetAttrs().TOOLS_RegID == "MediaIn" then
-- Node Name
name = tool.Name
-- Node MediaID
id = tool["MediaID"][fu.TIME_UNDEFINED]
-- dump(nodeID)
else
print("[Error] Select a MediaIn node.")
end
return id, name, tool
end
function BrowseMediaPool(id)
-- Look inside the current MediaPool folder for a matching MediaID tag
local res = Resolve("localhost", 0, bmd.getappuuid())
if res ~= nil then
pm = res:GetProjectManager()
project = pm:GetCurrentProject()
mp = project:GetMediaPool()
folder = mp:GetCurrentFolder()
clips = folder:GetClips()
for clipIndex, clipValue in ipairs(clips) do
prop = clipValue:GetClipProperty()
-- Type: "Still", "Video", "Audio", "Video + Audio", "Geometry", "Generator", "Timeline"
clipType = prop["Type"]
-- dump(clipType)
if clipType == "Still" or clipType == "Video" or clipType == "Video + Audio" then
clipID = clipValue:GetMediaId()
-- fileName = prop["File Name"]
-- dump(fileName)
-- Check for a mediaID match from the selected MediaIn node in the Fusion page and the MediaPool clip
if id and clipID and id == clipID then
return clipValue
end
end
end
else
print("[Error] Could not connect to Resolve session.")
end
end
function Main()
selectedMediaIn = comp:GetToolList(false, "MediaIn")
for i, v in ipairs(selectedMediaIn) do
-- Grab the selected MediaIn node's MediaID tag
local nodeID, nodeName, nodeTool = GetMediaID(v)
if nodeID then
-- Look inside the current MediaPool folder for a matching MediaID tag
local mpClip = BrowseMediaPool(nodeID)
if mpClip then
local mpTable = {}
mpTable.NodeName = (nodeName or "")
mpTable.MediaID = nodeID
mpTable.MediaProps = nodeTool:GetData("MediaProps")
mpTable.Property = mpClip:GetClipProperty()
print("[" .. mpTable.NodeName .. "]")
-- print(" [MediaID]")
-- print(mpTable.MediaID)
-- print(" [Resolve Metadata]")
-- dump(mpTable.Property)
-- Write the metadata to the MediaIn node's Comment field:
nodeTool["Comments"][fu.TIME_UNDEFINED] = bmd.writestring(mpTable)
-- Auto-switch to the Common control page to display the Comments input content
nodeTool:ShowControlPage("Common")
else
print("[" .. tostring(v.Name) .. "] [Error] MediaIn Node footage not found in current Media Pool folder.")
end
end
end
print("[Done]")
end
Main()