source_utils_nodeHelpers.bs
' Node utility functions for creating and copying SGNodes
namespace nodeHelpers
' createQueueItem: Create a queue-compatible item from any source node
'
' Extracts only the essential fields needed for playback queue items,
' avoiding issues with cloning complex UI components like SearchData, GridData, etc.
'
' @param sourceNode - The source node (any type) to extract data from
' @returns Associative array with essential fields, or invalid if sourceNode is invalid
'
' Essential fields copied:
' - id: Item identifier (required)
' - type: Media type (required)
' - json: Full Jellyfin metadata (required)
' - title: Display title (optional)
' - mediaSourceId: Media source ID (optional)
' - RunTimeTicks: Runtime duration (optional)
'
' Additional fields can be set later by quickplay (selectedAudioStreamIndex, startingPoint)
'
function createQueueItem(sourceNode as object) as object
if not isValid(sourceNode)
print "[nodeHelpers.createQueueItem] ERROR: sourceNode is invalid"
return invalid
end if
' Create a simple associative array for queue storage
' The queue accepts both SGNodes and associative arrays (see QueueManager.getItemType)
' Using an AA avoids issues with cloning complex UI component nodes
queueItem = {}
' Copy essential fields that queue items need
' Required fields
if isValidAndNotEmpty(sourceNode.id)
queueItem.id = sourceNode.id
end if
if isValidAndNotEmpty(sourceNode.type)
queueItem.type = sourceNode.type
end if
if isValid(sourceNode.json)
queueItem.json = sourceNode.json
end if
' Optional fields (if they exist on source)
if isValidAndNotEmpty(sourceNode.title)
queueItem.title = sourceNode.title
end if
if isValidAndNotEmpty(sourceNode.mediaSourceId)
queueItem.mediaSourceId = sourceNode.mediaSourceId
end if
if isValid(sourceNode.RunTimeTicks)
queueItem.RunTimeTicks = sourceNode.RunTimeTicks
end if
return queueItem
end function
end namespace