music-metadata
Version:
Music metadata parser for Node.js, supporting virtual any audio and tag format.
124 lines • 4.92 kB
JavaScript
import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';
/**
* Ref: https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata
*/
const mp4TagMap = {
'©nam': 'title',
'©ART': 'artist',
aART: 'albumartist',
/**
* ToDo: Album artist seems to be stored here while Picard documentation says: aART
*/
'----:com.apple.iTunes:Band': 'albumartist',
'©alb': 'album',
'©day': 'date',
'©cmt': 'comment',
'©com': 'comment',
trkn: 'track',
disk: 'disk',
'©gen': 'genre',
covr: 'picture',
'©wrt': 'composer',
'©lyr': 'lyrics',
soal: 'albumsort',
sonm: 'titlesort',
soar: 'artistsort',
soaa: 'albumartistsort',
soco: 'composersort',
'----:com.apple.iTunes:LYRICIST': 'lyricist',
'----:com.apple.iTunes:CONDUCTOR': 'conductor',
'----:com.apple.iTunes:REMIXER': 'remixer',
'----:com.apple.iTunes:ENGINEER': 'engineer',
'----:com.apple.iTunes:PRODUCER': 'producer',
'----:com.apple.iTunes:DJMIXER': 'djmixer',
'----:com.apple.iTunes:MIXER': 'mixer',
'----:com.apple.iTunes:LABEL': 'label',
'©grp': 'grouping',
'----:com.apple.iTunes:SUBTITLE': 'subtitle',
'----:com.apple.iTunes:DISCSUBTITLE': 'discsubtitle',
cpil: 'compilation',
tmpo: 'bpm',
'----:com.apple.iTunes:MOOD': 'mood',
'----:com.apple.iTunes:MEDIA': 'media',
'----:com.apple.iTunes:CATALOGNUMBER': 'catalognumber',
tvsh: 'tvShow',
tvsn: 'tvSeason',
tves: 'tvEpisode',
sosn: 'tvShowSort',
tven: 'tvEpisodeId',
tvnn: 'tvNetwork',
pcst: 'podcast',
purl: 'podcasturl',
'----:com.apple.iTunes:MusicBrainz Album Status': 'releasestatus',
'----:com.apple.iTunes:MusicBrainz Album Type': 'releasetype',
'----:com.apple.iTunes:MusicBrainz Album Release Country': 'releasecountry',
'----:com.apple.iTunes:SCRIPT': 'script',
'----:com.apple.iTunes:LANGUAGE': 'language',
cprt: 'copyright',
'©cpy': 'copyright',
'----:com.apple.iTunes:LICENSE': 'license',
'©too': 'encodedby',
pgap: 'gapless',
'----:com.apple.iTunes:BARCODE': 'barcode',
'----:com.apple.iTunes:ISRC': 'isrc',
'----:com.apple.iTunes:ASIN': 'asin',
'----:com.apple.iTunes:NOTES': 'comment',
'----:com.apple.iTunes:MusicBrainz Track Id': 'musicbrainz_recordingid',
'----:com.apple.iTunes:MusicBrainz Release Track Id': 'musicbrainz_trackid',
'----:com.apple.iTunes:MusicBrainz Album Id': 'musicbrainz_albumid',
'----:com.apple.iTunes:MusicBrainz Artist Id': 'musicbrainz_artistid',
'----:com.apple.iTunes:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',
'----:com.apple.iTunes:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',
'----:com.apple.iTunes:MusicBrainz Work Id': 'musicbrainz_workid',
'----:com.apple.iTunes:MusicBrainz TRM Id': 'musicbrainz_trmid',
'----:com.apple.iTunes:MusicBrainz Disc Id': 'musicbrainz_discid',
'----:com.apple.iTunes:Acoustid Id': 'acoustid_id',
'----:com.apple.iTunes:Acoustid Fingerprint': 'acoustid_fingerprint',
'----:com.apple.iTunes:MusicIP PUID': 'musicip_puid',
'----:com.apple.iTunes:fingerprint': 'musicip_fingerprint',
'----:com.apple.iTunes:replaygain_track_gain': 'replaygain_track_gain',
'----:com.apple.iTunes:replaygain_track_peak': 'replaygain_track_peak',
'----:com.apple.iTunes:replaygain_album_gain': 'replaygain_album_gain',
'----:com.apple.iTunes:replaygain_album_peak': 'replaygain_album_peak',
'----:com.apple.iTunes:replaygain_track_minmax': 'replaygain_track_minmax',
'----:com.apple.iTunes:replaygain_album_minmax': 'replaygain_album_minmax',
'----:com.apple.iTunes:replaygain_undo': 'replaygain_undo',
// Additional mappings:
gnre: 'genre', // ToDo: check mapping
'----:com.apple.iTunes:ALBUMARTISTSORT': 'albumartistsort',
'----:com.apple.iTunes:ARTISTS': 'artists',
'----:com.apple.iTunes:ORIGINALDATE': 'originaldate',
'----:com.apple.iTunes:ORIGINALYEAR': 'originalyear',
'----:com.apple.iTunes:RELEASEDATE': 'releasedate',
// '----:com.apple.iTunes:PERFORMER': 'performer'
desc: 'description',
ldes: 'longDescription',
'©mvn': 'movement',
'©mvi': 'movementIndex',
'©mvc': 'movementTotal',
'©wrk': 'work',
catg: 'category',
egid: 'podcastId',
hdvd: 'hdVideo',
keyw: 'keywords',
shwm: 'showMovement',
stik: 'stik',
rate: 'rating'
};
export const tagType = 'iTunes';
export class MP4TagMapper extends CaseInsensitiveTagMap {
constructor() {
super([tagType], mp4TagMap);
}
postMap(tag, warnings) {
switch (tag.id) {
case 'rate':
tag.value = {
source: undefined,
rating: Number.parseFloat(tag.value) / 100
};
break;
}
}
}
//# sourceMappingURL=MP4TagMapper.js.map