src/Resources/Metadata/id3-field-map.json

{
  "schemaVersion": "1.0",
  "artifactType": "Id3MetadataMap",
  "profile": "ID3",
  "standard": "ID3 Tagging Standard",
  "standardVersion": "2.4.0",
  "sourceUrl": "https://id3.org/id3v2.4.0-frames",
  "adapterSettings": {
    "ExifTool": {
      "groups": ["ID3v2_4", "ID3v2_3", "ID3v2_2", "ID3v1", "Lyrics3"]
    }
  },
  "writeCapability": {
    "status": "Available",
    "adapter": "TagLibSharp",
    "reason": "The bundled TagLibSharp writer updates ID3v2 frames on an atomic file copy and preserves unrelated frames."
  },
  "writeFields": [
    { "field": "Album", "target": "Album", "valueType": "String" },
    { "field": "AlbumArtist", "target": "AlbumArtists", "valueType": "StringList" },
    { "field": "AlbumSort", "target": "AlbumSort", "valueType": "String" },
    { "field": "Arranger", "target": "TIPL:Arranger", "valueType": "Role" },
    { "field": "Artist", "target": "Performers", "valueType": "StringList" },
    { "field": "ArtistSort", "target": "PerformersSort", "valueType": "StringList" },
    { "field": "ArtistUrl", "target": "WOAR", "valueType": "Url" },
    { "field": "AttachedPictures", "target": "Pictures", "valueType": "PictureList" },
    { "field": "AudioChapters", "target": "Chapters", "valueType": "ChapterList" },
    { "field": "AudioDiscNumber", "target": "Disc", "valueType": "UInt32" },
    { "field": "AudioDiscTotal", "target": "DiscCount", "valueType": "UInt32" },
    { "field": "AudioFileUrl", "target": "WOAF", "valueType": "Url" },
    { "field": "AudioTitle", "target": "Title", "valueType": "String" },
    { "field": "AudioTrackNumber", "target": "Track", "valueType": "UInt32" },
    { "field": "AudioTrackTotal", "target": "TrackCount", "valueType": "UInt32" },
    { "field": "BandOrOrchestra", "target": "AlbumArtists", "valueType": "StringList" },
    { "field": "Barcode", "target": "TXXX:BARCODE", "valueType": "UserText" },
    { "field": "Bpm", "target": "TBPM", "valueType": "TextFrame" },
    { "field": "CatalogNumber", "target": "TXXX:CATALOGNUMBER", "valueType": "UserText" },
    { "field": "Category", "target": "TCAT", "valueType": "TextFrame" },
    { "field": "Chapters", "target": "Chapters", "valueType": "ChapterList" },
    { "field": "CommercialUrl", "target": "WCOM", "valueType": "Url" },
    { "field": "Composer", "target": "Composers", "valueType": "StringList" },
    { "field": "ComposerSort", "target": "ComposersSort", "valueType": "StringList" },
    { "field": "Conductor", "target": "Conductor", "valueType": "String" },
    { "field": "ContentGroup", "target": "Grouping", "valueType": "String" },
    { "field": "CopyrightNotice", "target": "Copyright", "valueType": "String" },
    { "field": "CopyrightUrl", "target": "WCOP", "valueType": "Url" },
    { "field": "CoverArtDescription", "target": "PictureDescription", "valueType": "PicturePart" },
    { "field": "CoverArtMimeType", "target": "PictureMimeType", "valueType": "PicturePart" },
    { "field": "CoverArtPath", "target": "PicturePath", "valueType": "PicturePart" },
    { "field": "Creator", "target": "Performers", "valueType": "StringList" },
    { "field": "Description", "target": "TDES", "valueType": "TextFrame" },
    { "field": "EncodedBy", "target": "TENC", "valueType": "TextFrame" },
    { "field": "EncodingDate", "target": "TDEN", "valueType": "DateText" },
    { "field": "Genre", "target": "Genres", "valueType": "StringList" },
    { "field": "InitialKey", "target": "InitialKey", "valueType": "String" },
    { "field": "Isrc", "target": "ISRC", "valueType": "String" },
    { "field": "Label", "target": "Publisher", "valueType": "String" },
    { "field": "Language", "target": "TLAN", "valueType": "TextFrame" },
    { "field": "Lyricist", "target": "TEXT", "valueType": "TextFrame" },
    { "field": "Lyrics", "target": "Lyrics", "valueType": "String" },
    { "field": "LyricsLanguage", "target": "LyricsLanguage", "valueType": "Language" },
    { "field": "Mood", "target": "TMOO", "valueType": "TextFrameList" },
    { "field": "MusicalKey", "target": "InitialKey", "valueType": "String" },
    { "field": "OriginalReleaseDate", "target": "TDOR", "valueType": "DateText" },
    { "field": "Performer", "target": "Performers", "valueType": "StringList" },
    { "field": "PodcastShow", "target": "TXXX:PODCASTSHOW", "valueType": "UserText" },
    { "field": "Publisher", "target": "Publisher", "valueType": "String" },
    { "field": "PublisherUrl", "target": "WPUB", "valueType": "Url" },
    { "field": "RecordingDate", "target": "TDRC", "valueType": "DateText" },
    { "field": "ReleaseDate", "target": "TDRL", "valueType": "DateText" },
    { "field": "Subtitle", "target": "Subtitle", "valueType": "String" },
    { "field": "SynchronizedLyrics", "target": "SYLT", "valueType": "SynchronizedLyrics" },
    { "field": "Title", "target": "Title", "valueType": "String" },
    { "field": "TitleSort", "target": "TitleSort", "valueType": "String" },
    { "field": "UserComment", "target": "Comment", "valueType": "String" }
  ],
  "fields": [
    {
      "field": "Album",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Album"] } }
    },
    {
      "field": "AlbumArtist",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Band"] } },
      "semanticNote": "TPE2/TP2 is interpreted as album artist by the de-facto application convention used by common encoders."
    },
    {
      "field": "AlbumSort",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["AlbumSortOrder"] } }
    },
    {
      "field": "Artist",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Artist"] } }
    },
    {
      "field": "ArtistSort",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PerformerSortOrder"] } }
    },
    {
      "field": "ArtistUrl",
      "fieldType": "URI",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["ArtistURL"] } }
    },
    {
      "field": "AudioDiscNumber",
      "fieldType": "Integer",
      "converter": "FractionNumerator",
      "read": { "ExifTool": { "paths": ["PartOfSet"] } }
    },
    {
      "field": "AudioDiscTotal",
      "fieldType": "Integer",
      "converter": "FractionDenominator",
      "read": { "ExifTool": { "paths": ["PartOfSet"] } }
    },
    {
      "field": "AudioFileUrl",
      "fieldType": "URI",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["FileURL"] } }
    },
    {
      "field": "AudioTitle",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Title"] } }
    },
    {
      "field": "AudioTrackNumber",
      "fieldType": "Integer",
      "converter": "FractionNumerator",
      "read": { "ExifTool": { "paths": ["Track"] } }
    },
    {
      "field": "AudioTrackTotal",
      "fieldType": "Integer",
      "converter": "FractionDenominator",
      "read": { "ExifTool": { "paths": ["Track"] } }
    },
    {
      "field": "BandOrOrchestra",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Band"] } }
    },
    {
      "field": "Bpm",
      "fieldType": "Float",
      "converter": "Float",
      "read": { "ExifTool": { "paths": ["BeatsPerMinute"] } }
    },
    {
      "field": "Category",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PodcastCategory"] } }
    },
    {
      "field": "CommercialUrl",
      "fieldType": "URI",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["CommercialURL"] } }
    },
    {
      "field": "Composer",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Composer"] } }
    },
    {
      "field": "ComposerSort",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["ComposerSortOrder"] } }
    },
    {
      "field": "Conductor",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Conductor"] } }
    },
    {
      "field": "ContentGroup",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Grouping"] } }
    },
    {
      "field": "CopyrightNotice",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Copyright"] } }
    },
    {
      "field": "CopyrightUrl",
      "fieldType": "URI",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["CopyrightURL"] } }
    },
    {
      "field": "CoverArtDescription",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PictureDescription"] } }
    },
    {
      "field": "CoverArtMimeType",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PictureMIMEType", "PictureFormat"] } }
    },
    {
      "field": "Creator",
      "fieldType": "List<String>",
      "converter": "ListString",
      "read": { "ExifTool": { "paths": ["Artist"] } }
    },
    {
      "field": "Description",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PodcastDescription"] } }
    },
    {
      "field": "EncodedBy",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["EncodedBy"] } }
    },
    {
      "field": "EncodingDate",
      "fieldType": "DateTime",
      "converter": "Date",
      "read": { "ExifTool": { "paths": ["EncodingTime"] } }
    },
    {
      "field": "Genre",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Genre"] } }
    },
    {
      "field": "InitialKey",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["InitialKey"] } }
    },
    {
      "field": "Isrc",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["ISRC"] } }
    },
    {
      "field": "Label",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Publisher"] } }
    },
    {
      "field": "Language",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Language"] } }
    },
    {
      "field": "Lyricist",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Lyricist"] } }
    },
    {
      "field": "Lyrics",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Lyrics"] } }
    },
    {
      "field": "Mood",
      "fieldType": "List<String>",
      "converter": "ListString",
      "read": { "ExifTool": { "paths": ["Mood"] } }
    },
    {
      "field": "MusicalKey",
      "fieldType": "Enum",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["InitialKey"] } }
    },
    {
      "field": "OriginalReleaseDate",
      "fieldType": "DateTime",
      "converter": "Date",
      "read": { "ExifTool": { "paths": ["OriginalReleaseTime", "OriginalReleaseYear"] } }
    },
    {
      "field": "Performer",
      "fieldType": "List<String>",
      "converter": "ListString",
      "read": { "ExifTool": { "paths": ["Artist", "InterpretedBy"] } }
    },
    {
      "field": "Publisher",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Publisher"] } }
    },
    {
      "field": "PublisherUrl",
      "fieldType": "URI",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["PublisherURL"] } }
    },
    {
      "field": "RecordingDate",
      "fieldType": "DateTime",
      "converter": "Date",
      "read": { "ExifTool": { "paths": ["RecordingTime", "RecordingDates", "Year"] } }
    },
    {
      "field": "ReleaseDate",
      "fieldType": "DateTime",
      "converter": "Date",
      "read": { "ExifTool": { "paths": ["ReleaseTime"] } }
    },
    {
      "field": "Subtitle",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Subtitle"] } }
    },
    {
      "field": "SynchronizedLyrics",
      "fieldType": "List<Object>",
      "converter": "ListObject",
      "read": { "ExifTool": { "paths": ["SynchronizedLyricsText"] } }
    },
    {
      "field": "Title",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Title"] } }
    },
    {
      "field": "TitleSort",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["TitleSortOrder"] } }
    },
    {
      "field": "UserComment",
      "fieldType": "String",
      "converter": "String",
      "read": { "ExifTool": { "paths": ["Comment"] } }
    }
  ],
  "unmappedFields": [
    {
      "field": "Arranger",
      "reason": "Arranger is role-qualified data inside TIPL/IPLS; it must not be guessed from an unparsed people list."
    },
    {
      "field": "AttachedPictures",
      "reason": "The current ExifTool read does not extract APIC/PIC payloads into RenderKit picture objects."
    },
    {
      "field": "AudioChapters",
      "reason": "ExifTool does not expose ID3 CHAP/CTOC frames as a complete chapter graph."
    },
    {
      "field": "Author",
      "reason": "ID3 has no general author frame whose semantics match the canonical field."
    },
    {
      "field": "Barcode",
      "reason": "Barcode is commonly stored in TXXX and requires descriptor-aware parsing."
    },
    {
      "field": "CatalogNumber",
      "reason": "Catalog number is commonly stored in TXXX and requires descriptor-aware parsing."
    },
    {
      "field": "Chapters",
      "reason": "ExifTool does not expose ID3 CHAP/CTOC frames as a complete chapter graph."
    },
    {
      "field": "CoverArtPath",
      "reason": "Embedded APIC/PIC data has no filesystem path unless it is explicitly extracted."
    },
    {
      "field": "LyricsLanguage",
      "reason": "ExifTool does not expose the USLT/SYLT language as an independent unambiguous value."
    },
    {
      "field": "PodcastShow",
      "reason": "The podcast flag, feed URL and podcast ID do not identify a show title."
    }
  ]
}