Importing a Media file with adjacent XML file aka "Sidecar" file.
Overview
When Myriad imports an audio file into the MediaWall, it checks to see if there is a matching "xml" file next to the file that contains enhanced metadata. If this file exists, then Myriad will import the media file then add in the metadata from the xml file, allowing you to set all of the available information for the Media Item during import.
The XML file must have the same filename as the media item and in the same folder - for example, when importing "ThisSong.wav" Myriad will check for an xml file called "ThisSong.xml" in the same folder.
The MediaItem
XML file is an XML document that describes a media item and populates the MediaItem object with the provided data. This document describes the complete XML structure that can be used within the xml file.
Several fields are ignored or should be omitted during import, but are included to provide context for exported xml files. These are detailed within each applicable section.
The majority of this file format stems from an older AutoTrack v4 format, but has been extended to support additional Myriad v6 features and functionality.
There is a sample xml file attached to this article, but you can also easily create an example XML file of your own with your own data by exporting a Myriad Media item to a Transport file, then open the resulting zip file and you will see the xml file in the zip file. You can then alter your media item and by re-exporting see the resulting changes in that xml file in the transport file.
Root Element
The XML document must have a root element named mediaItem
(case-insensitive).
<mediaItem contentType="AudioFile" type="song">
<!-- content elements here -->
</mediaItem>
Root Element Attributes
contentType
- Type: String (Enum)
- Purpose: Defines the type of media content
- Required: Optional (defaults to "AudioFile")
- Valid Values:
AudioFile
- Standard audio files (wav, mp3, etc.)MediaListAll
- Sequential playlist that plays all items in orderMediaListRandom
- Random playlist that selects items randomlyMediaListRotate
- Rotating playlist that cycles through itemsCommand
- Command execution itemAudioStream
- Live audio stream
type
- Type: String (Enum)
- Purpose: Defines the item type category
- Required: Optional
- Valid Values:
BasicMediaItem
(ID: 2) - Basic media itemLink
(ID: 3) - Link/jingleAdvert
(ID: 4) - AdvertisementSong
(ID: 7) - Music trackVoiceLink
(ID: 9) - Voice link/announcementNewsMedia
(ID: 42) - News content
Core Identity Elements
mediaId
<mediaId>12345</mediaId>
- Type: Integer
- Purpose: Unique identifier for the media item
guid
<guid>550e8400-e29b-41d4-a716-446655440000</guid>
- Type: GUID
- Purpose: Globally unique identifier
externalReference
<externalReference><![CDATA[EXT123]]></externalReference>
- Type: String
- Purpose: External system reference identifier
- Note: CDATA wrapping is supported for special characters
cutID
<cutID><![CDATA[CUT001]]></cutID>
- Type: String
- Purpose: Cut/segment identifier
musicBrainzId
<musicBrainzId><![CDATA[mbid-12345]]></musicBrainzId>
- Type: String
- Purpose: MusicBrainz database identifier
Media Location Elements
mediaLocation
<mediaLocation>C:\Music\song.mp3</mediaLocation>
- Type: String
- Purpose: Primary file path to the media
- Import Notes: This field should be omitted when importing files, but will be populated when exporting xml.
originalMediaLocation
<originalMediaLocation><![CDATA[Original\Path\song.wav]]></originalMediaLocation>
- Type: String
- Purpose: Original source file path.
- Import Notes: This field should be omitted when importing files, but will be populated when exporting xml.
Audio Levels
levels
<levels><![CDATA[{"PeakLevel": -3.2, "RMSLevel": -12.5}]]></levels>
- Type: JSON String
- Purpose: Audio level information stored as JSON-serialized MediaItemLevels object.
- Import Notes: This field should be omitted when importing files, but will be populated when exporting xml.
Metadata Elements
isSweeper
<isSweeper>true</isSweeper>
- Type: Boolean
- Purpose: Indicates if item is a sweeper/jingle
revision
<revision>5</revision>
- Type: Integer
- Purpose: Version/revision number
Title Information
title (Complex Element)
<title>
<title><![CDATA[Song Title]]></title>
<id>67890</id>
</title>
- Properties:
<title>
- The item title text<id>
- Database ID for the title.- Import Notes: This id field should be omitted when importing files, Myriad will automatically locate any existing matching Item Title or create a new ID if nescessary.
- Purpose: Main title and its database ID
itemDescription
<itemDescription><![CDATA[Song description]]></itemDescription>
- Type: String
- Purpose: Detailed description of the item
Display Overrides
displayAs
<displayAs><![CDATA[Display Title]]></displayAs>
- Type: String
- Purpose: Override display title
displayBy
<displayBy><![CDATA[Display Artist]]></displayBy>
- Type: String
- Purpose: Override display artist/performer
Album Information
album (Complex Element)
<album>
<title><![CDATA[Album Name]]></title>
<id>54321</id>
</album>
Properties:
<title>
- Album title text<id>
- Database ID for the album- Import Notes: This id field should be omitted when importing files, Myriad will automatically locate any existing matching Item Title or create a new ID if nescessary.
Purpose: Album information and database ID
Artists (Collection)
artists
<artists>
<artist index="1">
<name><![CDATA[Artist Name]]></name>
<id>11111</id>
</artist>
<artist index="2">
<name><![CDATA[Featured Artist]]></name>
<id>22222</id>
</artist>
</artists>
- Structure: Collection of
<artist>
elements - Requirements: Each artist must have either a name or an ID to be added
- Attributes:
index
- Numeric index for the artist
- Child Elements:
<name>
- Artist name (string)<id>
- Database ID for the artist (integer)
Visual Appearance
backColor
<backColor>#FF0000FF</backColor>
- Type: Color (hex format ARGB)
- Purpose: Background color for display
textColor
<textColor>#FFFFFFFF</textColor>
- Type: Color (hex format ARGB)
- Purpose: Text color for display
Categorization
categoryName
<categoryName><![CDATA[Rock]]></categoryName>
- Type: String
- Purpose: Content category classification
Item Attributes
itemAttributes
<itemAttributes>
<attribute stationId="1" type="Category" index="1" number="5" level="100" />
<attribute stationId="1" type="Tempo" index="1" number="3" />
</itemAttributes>
- Structure: Collection of
<attribute>
elements - Purpose: Defines various categorization and descriptive attributes for media items, used for scheduling, rotation, and content management
- Attributes:
stationId
- Station ID (integer) - Associates the attribute with a specific radio stationtype
- Attribute type (string, enum) - Defines the category of attributeindex
- Attribute index (integer) - Position/priority within the attribute typenumber
- Attribute number (integer) - The specific value/ID of the attributelevel
- Attribute level (integer, optional) - Weighting or priority level (0-100)
Attribute Type Enumeration
The type
attribute supports the following enumeration values:
Category
- Primary content categorization- Purpose: Main category classification for content (e.g., Rock, Pop, News, Jingles)
- Usage: Used for content filtering, scheduling rules, and rotation management
- Example:
type="Category" number="5"
where 5 might represent "Rock" category
Type
- Secondary type classification- Purpose: Sub-categorization within main categories (e.g., Ballad, Up-tempo, Fast)
- Usage: Provides additional granular classification for scheduling
- Example:
type="Type" number="2"
where 2 might represent "Ballad"
Gender
- Artist/vocalist gender classification- Purpose: Categorizes content by performer gender (Male, Female, Group, Mixed)
- Usage: Used for gender-based rotation rules and scheduling diversity
- Example:
type="Gender" number="1"
where 1 might represent "Male"
Era
- Time period/decade classification- Purpose: Categorizes music by era or decade (60s, 70s, 80s, 90s, 2000s, Current)
- Usage: Used for era-based scheduling and nostalgic programming
- Example:
type="Era" number="4"
where 4 might represent "80s"
Energy
- Energy level classification- Purpose: Describes the energy/intensity level of the content (Low, Medium, High)
- Usage: Used for programming flow and mood-based scheduling
- Level Support: Often uses the
level
attribute for precise energy scoring - Example:
type="Energy" number="3" level="75"
where 3 is "High" energy with 75% intensity
Tempo
- Musical tempo classification- Purpose: Categorizes content by tempo/speed (Slow, Medium, Fast, Very Fast)
- Usage: Used for programming pace and show flow management
- Example:
type="Tempo" number="3"
where 3 might represent "Fast"
Texture
- Musical texture/style classification- Purpose: Describes the musical texture or style characteristics
- Usage: Used for sophisticated music scheduling and complementary track selection
- Example:
type="Texture" number="2"
where 2 might represent "Acoustic"
Mood
- Emotional mood classification- Purpose: Categorizes content by emotional mood (Happy, Sad, Energetic, Relaxed)
- Usage: Used for mood-based programming and emotional flow management
- Example:
type="Mood" number="1"
where 1 might represent "Happy"
Burnout
- Burnout/overplay protection- Purpose: Defines burnout rules and overplay protection levels
- Usage: Prevents tracks from being played too frequently
- Level Support: Uses
level
attribute to define burnout sensitivity - Example:
type="Burnout" number="2" level="50"
where 2 is burnout category with 50% protection
Tags
- Custom tagging system- Purpose: Flexible tagging system for custom categorization and metadata
- Usage: Allows custom attributes that don't fit into standard categories
- Example:
type="Tags" number="15"
where 15 might represent a custom tag like "Christmas"
Multiple Attributes
Media items can have two Category
attributes (using different index
values) but all other attribute types only allow a single item. The combination of attributes provides comprehensive metadata for sophisticated scheduling and content management.
Database Dependency
Important Note: All attribute numbers must correspond to existing attribute definitions in the Myriad database. The attribute names and number mappings are configured within Myriad's database settings and must exist prior to import. Using non-existent attribute numbers will result in the attributes being ignored during import.
Date/Time Information
startDateTime
<startDateTime>2024-01-15T00:00:00Z</startDateTime>
- Type: DateTime (UTC XML format)
- Purpose: Item validity start date
endDateTime
<endDateTime>2024-12-31T23:59:59Z</endDateTime>
- Type: DateTime (UTC XML format)
- Purpose: Item validity end date
deleteDateTime
<deleteDateTime>2025-01-31T23:59:59Z</deleteDateTime>
- Type: DateTime (UTC XML format)
- Purpose: Automatic deletion date
firstReleaseYear
<firstReleaseYear>2023</firstReleaseYear>
- Type: Short integer
- Purpose: Year of first release
created
<created>2024-01-15T10:30:00Z</created>
- Type: DateTime
- Purpose: Creation timestamp
- Import Notes: This field will be ignored when importing files and should be omitted, but it will be populated when exporting xml.
lastModified
<lastModified>2024-01-16T14:22:00Z</lastModified>
- Type: DateTime
- Purpose: Last modification timestamp
- Import Notes: This field will be ignored when importing files and should be omitted, but it will be populated when exporting xml.
Timing Information
timings (Complex Container)
<timings>
<totalLength>00:03:45.123</totalLength>
<mediaLength>
<start>00:00:01.000</start>
<end>00:03:44.000</end>
</mediaLength>
<intro>
<start>00:00:01.000</start>
<middle>00:00:08.000</middle>
<end>00:00:15.000</end>
</intro>
<hook>
<start>00:01:30.000</start>
<end>00:01:45.000</end>
</hook>
<extro>
<start>00:03:30.000</start>
</extro>
<loops>
<loopInfo caption="Chorus" enabled="true">
<start>00:01:00.000</start>
<end>00:01:20.000</end>
</loopInfo>
</loops>
<referenceLength>00:03:45.000</referenceLength>
</timings>
totalLength
- Type: TimeSpan (format: "c" - constant format)
- Purpose: Total duration of the media
mediaLength
- Structure: MediaTiming object
- Child Elements:
<start>
- Start time (TimeSpan)<end>
- End time (TimeSpan)
- Purpose: Playable portion timing
intro
- Structure: MediaTiming object
- Child Elements:
<start>
- Intro start time (TimeSpan)<end>
- Intro end time (TimeSpan)<middle>
- Intro middle point (TimeSpan)
- Purpose: Introduction section timing
hook
- Structure: MediaTiming object
- Child Elements:
<start>
- Hook start time (TimeSpan)<end>
- Hook end time (TimeSpan)
- Purpose: Hook/catchiest part timing
extro
- Structure: MediaTiming object
- Child Elements:
<start>
- Extro start time (TimeSpan)
- Purpose: Outro/fade timing
- Default: If not present, sets to (MediaLength.End, MediaLength.End)
loops
- Structure: Collection of
<loopInfo>
elements - Child Elements:
- Each
<loopInfo>
contains:caption
attribute - Description of the loopenabled
attribute - Whether loop is enabled (boolean)<start>
- Loop start time (TimeSpan)<end>
- Loop end time (TimeSpan)
- Each
- Purpose: Loop/repeat sections
- Notes: Currently Myriad only supports a single loop, so this collection will only contain one item.
referenceLength
- Type: TimeSpan
- Purpose: Reference timing for scheduling
- Notes: Not currently used by Myriad, but included for future compatibility.
timeStretchOption
<timeStretchOption>1</timeStretchOption>
- Type: Integer
- Purpose: Time stretching configuration
Command and Media Lists
commandText
<commandText><![CDATA[EXECUTE MyCommand]]></commandText>
- Type: String
- Purpose: Command to execute (for Command content type)
relatedMediaItems
<relatedMediaItems>
<item index="1">
<mediaId>101</mediaId>
</item>
<item index="2">
<mediaId>102</mediaId>
</item>
</relatedMediaItems>
- Structure: Collection of
<item>
elements - Purpose: Related items for playlists/groups
- Each item contains:
index
attribute - Item index<mediaId>
- Media ID of related item
nowPlayingItems
<nowPlayingItems>
<item index="1">
<start>00:01:30.000</start>
<length>00:00:15.000</length>
<title><![CDATA[Now Playing Text]]></title>
</item>
</nowPlayingItems>
- Structure: Collection of
<item>
elements using MediaNowPlayingItem.SetXml() - Purpose: Now playing display information
- Each item contains:
index
attribute - Item index<start>
- Start time (TimeSpan)<length>
- Duration (TimeSpan)<title>
- Display title
Copyright Information
copyright (Complex Element)
<copyright>
<title><![CDATA[Copyright Title]]></title>
<composer><![CDATA[Composer Name]]></composer>
<performer><![CDATA[Performer Name]]></performer>
<publisher><![CDATA[Publisher Name]]></publisher>
<isrc>US1234567890</isrc>
<recordLabel><![CDATA[Record Label]]></recordLabel>
<lyricist><![CDATA[Lyricist Name]]></lyricist>
<promoter><![CDATA[Promoter Name]]></promoter>
<recordingNumber><![CDATA[Recording Number]]></recordingNumber>
<license><![CDATA[License Info]]></license>
<custom1><![CDATA[Custom Field 1]]></custom1>
<custom2><![CDATA[Custom Field 2]]></custom2>
<custom3><![CDATA[Custom Field 3]]></custom3>
<custom4><![CDATA[Custom Field 4]]></custom4>
<musicDuration>00:03:30.000</musicDuration>
<totalDuration>00:03:45.000</totalDuration>
</copyright>
- Structure: MediaCopyright object populated via SetXml()
- Purpose: Complete copyright and licensing information
- All text elements support CDATA
Custom Fields
customFields
<customFields>
<item index="1">
<value><![CDATA[Custom Value 1]]></value>
</item>
<item index="5">
<value><![CDATA[URL or other data]]></value>
</item>
</customFields>
- Structure: Dictionary
- Each item contains:
index
attribute - Integer key<value>
- String value
Media Ending Information
outCue
<outCue><![CDATA[...and that's the news]]></outCue>
- Type: String
- Purpose: Last words/ending cue text
ending
<ending>fades</ending>
- Type: String (Enum)
- Purpose: How the media ends
- Valid Values:
nonSpecific
- No specific ending typeend
- Item ends abruptlyfades
- Item fades outsustain
- Item sustains/holdsslowFade
- Item has a slow fade out
Temporary References
temporaryReference
<temporaryReference><![CDATA[TEMP_REF_123]]></temporaryReference>
- Type: String
- Purpose: Temporary reference for internal processing
- Note: This field is only used internally within Myriad and is not stored in the database
Notes
notes
<notes>
<note type="Presenter" startDate="2024-01-01" endDate="2024-12-31">
<text><![CDATA[Important presenter note]]></text>
</note>
<note type="Technical">
<text><![CDATA[Technical information]]></text>
</note>
<note type="DigitalRadio">
<text><![CDATA[DAB/Digital radio information]]></text>
</note>
<note type="Web">
<text><![CDATA[Web/online information]]></text>
</note>
</notes>
- Structure: Collection of
<note>
elements using MediaNote.SetXml() - Purpose: Various types of notes and annotations
- Each note contains:
type
attribute - Note type (Presenter, Technical, DigitalRadio, Web)startDate
attribute - Optional start date for note validityendDate
attribute - Optional end date for note validity<text>
- Note content (supports CDATA)
Images
images
<images>
<image type="AlbumArt" primary="true">
<location><![CDATA[C:\Images\albumart.jpg]]></location>
<description><![CDATA[Album artwork]]></description>
</image>
<image type="Logo">
<location><![CDATA[C:\Images\logo.png]]></location>
<description><![CDATA[Station logo]]></description>
</image>
</images>
- Structure: Collection of
<image>
elements using MediaImage.SetXml() - Purpose: Associated images and artwork
- Each image contains:
type
attribute - Image type (e.g., "AlbumArt", "Logo")primary
attribute - Whether this is the primary image (boolean)<location>
- File path to image<description>
- Description of the image
- Import Notes: This field will be ignored when importing files and should be omitted, but it will be populated when exporting xml.
Scheduling Information
scheduling
<scheduling>
<station id="1">
<schedulingInhibited>false</schedulingInhibited>
<hourRestrictions>
<day number="1">
<hour index="0" restricted="false" />
<hour index="1" restricted="true" />
<hour index="6" restricted="false" />
</day>
<day number="2">
<hour index="0" restricted="true" />
<hour index="12" restricted="false" />
</day>
</hourRestrictions>
</station>
<station id="2">
<schedulingInhibited>true</schedulingInhibited>
</station>
</scheduling>
- Structure: Dictionary where key is StationId
- Purpose: Per-station scheduling restrictions and settings
- Each station contains:
id
attribute - Station ID (integer)<schedulingInhibited>
- Whether scheduling is completely disabled (boolean)<hourRestrictions>
- Hour-by-hour restrictions<day number="X">
- Day of week (1=Monday, 7=Sunday)<hour index="X" restricted="true/false" />
- Hour restrictions (0-23)
Example Complete XML
<mediaItem contentType="AudioFile" type="Song">
<mediaId>12345</mediaId>
<guid>550e8400-e29b-41d4-a716-446655440000</guid>
<externalReference><![CDATA[MUS12345]]></externalReference>
<cutID><![CDATA[CUT001]]></cutID>
<mediaLocation>C:\Music\song.mp3</mediaLocation>
<originalMediaLocation><![CDATA[D:\Source\original.wav]]></originalMediaLocation>
<isSweeper>false</isSweeper>
<revision>1</revision>
<title>
<title><![CDATA[Example Song]]></title>
<id>67890</id>
</title>
<artists>
<artist index="1">
<name><![CDATA[Main Artist]]></name>
<id>11111</id>
</artist>
</artists>
<album>
<title><![CDATA[Example Album]]></title>
<id>54321</id>
</album>
<categoryName><![CDATA[Rock]]></categoryName>
<startDateTime>2024-01-01T00:00:00Z</startDateTime>
<endDateTime>2024-12-31T23:59:59Z</endDateTime>
<firstReleaseYear>2023</firstReleaseYear>
<timings>
<totalLength>00:03:45.123</totalLength>
<mediaLength>
<start>00:00:01.000</start>
<end>00:03:44.000</end>
</mediaLength>
<intro>
<start>00:00:01.000</start>
<end>00:00:15.000</end>
</intro>
<extro>
<start>00:03:30.000</start>
</extro>
</timings>
<copyright>
<title><![CDATA[Example Song]]></title>
<composer><![CDATA[Song Writer]]></composer>
<performer><![CDATA[Main Artist]]></performer>
<isrc>US1234567890</isrc>
</copyright>
<ending>fades</ending>
<notes>
<note type="Presenter">
<text><![CDATA[Great song for morning shows]]></text>
</note>
</notes>
</mediaItem>
Processing Notes
- Error Handling: Individual element parsing is wrapped in try-catch blocks to handle malformed data gracefully, however caution should be exercised if using more complex fields as it could still result in unexpected behaviour.
- CDATA Support: Most text elements support CDATA sections for special characters
- Case Sensitivity: Root element name comparison is case-insensitive
- Default Values: Missing optional elements retain their current values
- Collection Clearing: Some collections (like loops) are cleared before repopulating
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article