music-metadata
Version:
Music metadata parser for Node.js, supporting virtual any audio and tag format.
134 lines (133 loc) • 4.54 kB
JavaScript
import { CommonTagMapper } from '../../common/GenericTagMapper.js';
/**
* Vorbis tag mappings
*
* Mapping from native header format to one or possibly more 'common' entries
* The common entries aim to read the same information from different media files
* independent of the underlying format
*/
const vorbisTagMap = {
TITLE: 'title',
ARTIST: 'artist',
ARTISTS: 'artists',
ALBUMARTIST: 'albumartist',
'ALBUM ARTIST': 'albumartist',
ALBUM: 'album',
DATE: 'date',
ORIGINALDATE: 'originaldate',
ORIGINALYEAR: 'originalyear',
RELEASEDATE: 'releasedate',
COMMENT: 'comment',
TRACKNUMBER: 'track',
DISCNUMBER: 'disk',
GENRE: 'genre',
METADATA_BLOCK_PICTURE: 'picture',
COMPOSER: 'composer',
LYRICS: 'lyrics',
ALBUMSORT: 'albumsort',
TITLESORT: 'titlesort',
WORK: 'work',
ARTISTSORT: 'artistsort',
ALBUMARTISTSORT: 'albumartistsort',
COMPOSERSORT: 'composersort',
LYRICIST: 'lyricist',
WRITER: 'writer',
CONDUCTOR: 'conductor',
// 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo
REMIXER: 'remixer',
ARRANGER: 'arranger',
ENGINEER: 'engineer',
PRODUCER: 'producer',
DJMIXER: 'djmixer',
MIXER: 'mixer',
LABEL: 'label',
GROUPING: 'grouping',
SUBTITLE: 'subtitle',
DISCSUBTITLE: 'discsubtitle',
TRACKTOTAL: 'totaltracks',
DISCTOTAL: 'totaldiscs',
COMPILATION: 'compilation',
RATING: 'rating',
BPM: 'bpm',
KEY: 'key',
MOOD: 'mood',
MEDIA: 'media',
CATALOGNUMBER: 'catalognumber',
RELEASESTATUS: 'releasestatus',
RELEASETYPE: 'releasetype',
RELEASECOUNTRY: 'releasecountry',
SCRIPT: 'script',
LANGUAGE: 'language',
COPYRIGHT: 'copyright',
LICENSE: 'license',
ENCODEDBY: 'encodedby',
ENCODERSETTINGS: 'encodersettings',
BARCODE: 'barcode',
ISRC: 'isrc',
ASIN: 'asin',
MUSICBRAINZ_TRACKID: 'musicbrainz_recordingid',
MUSICBRAINZ_RELEASETRACKID: 'musicbrainz_trackid',
MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',
MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',
MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',
MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',
MUSICBRAINZ_WORKID: 'musicbrainz_workid',
MUSICBRAINZ_TRMID: 'musicbrainz_trmid',
MUSICBRAINZ_DISCID: 'musicbrainz_discid',
ACOUSTID_ID: 'acoustid_id',
ACOUSTID_ID_FINGERPRINT: 'acoustid_fingerprint',
MUSICIP_PUID: 'musicip_puid',
// 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo
WEBSITE: 'website',
NOTES: 'notes',
TOTALTRACKS: 'totaltracks',
TOTALDISCS: 'totaldiscs',
// Discogs
DISCOGS_ARTIST_ID: 'discogs_artist_id',
DISCOGS_ARTISTS: 'artists',
DISCOGS_ARTIST_NAME: 'artists',
DISCOGS_ALBUM_ARTISTS: 'albumartist',
DISCOGS_CATALOG: 'catalognumber',
DISCOGS_COUNTRY: 'releasecountry',
DISCOGS_DATE: 'originaldate',
DISCOGS_LABEL: 'label',
DISCOGS_LABEL_ID: 'discogs_label_id',
DISCOGS_MASTER_RELEASE_ID: 'discogs_master_release_id',
DISCOGS_RATING: 'discogs_rating',
DISCOGS_RELEASED: 'date',
DISCOGS_RELEASE_ID: 'discogs_release_id',
DISCOGS_VOTES: 'discogs_votes',
CATALOGID: 'catalognumber',
STYLE: 'genre',
//
REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',
REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',
REPLAYGAIN_ALBUM_GAIN: 'replaygain_album_gain',
REPLAYGAIN_ALBUM_PEAK: 'replaygain_album_peak',
// To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis:
REPLAYGAIN_MINMAX: 'replaygain_track_minmax',
REPLAYGAIN_ALBUM_MINMAX: 'replaygain_album_minmax',
REPLAYGAIN_UNDO: 'replaygain_undo'
};
export class VorbisTagMapper extends CommonTagMapper {
static toRating(email, rating, maxScore) {
return {
source: email ? email.toLowerCase() : undefined,
rating: (Number.parseFloat(rating) / maxScore) * CommonTagMapper.maxRatingScore
};
}
constructor() {
super(['vorbis'], vorbisTagMap);
}
postMap(tag) {
if (tag.id === 'RATING') {
// The way Winamp 5.666 assigns rating
tag.value = VorbisTagMapper.toRating(undefined, tag.value, 100);
}
else if (tag.id.indexOf('RATING:') === 0) {
const keys = tag.id.split(':');
tag.value = VorbisTagMapper.toRating(keys[1], tag.value, 1);
tag.id = keys[0];
}
}
}