music-metadata 8.1.3 → 8.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +9 -9
- package/README.md +450 -450
- package/lib/apev2/APEv2TagMapper.js +1 -0
- package/lib/apev2/APEv2Token.js +1 -1
- package/lib/asf/AsfObject.js +1 -1
- package/lib/asf/GUID.js +2 -1
- package/lib/common/GenericTagTypes.d.ts +1 -1
- package/lib/common/GenericTagTypes.js +1 -0
- package/lib/dsf/DsfChunk.js +1 -1
- package/lib/id3v2/ID3v24TagMapper.js +1 -1
- package/lib/id3v2/ID3v2Token.js +1 -1
- package/lib/matroska/MatroskaTagMapper.js +1 -0
- package/lib/matroska/types.js +3 -3
- package/lib/mp4/MP4Parser.js +12 -3
- package/lib/mp4/MP4TagMapper.js +1 -0
- package/lib/ogg/vorbis/VorbisTagMapper.js +1 -0
- package/lib/riff/RiffInfoTagMap.js +1 -0
- package/lib/type.d.ts +6 -2
- package/lib/wav/WaveChunk.js +1 -1
- package/package.json +140 -140
package/lib/apev2/APEv2Token.js
CHANGED
|
@@ -6,7 +6,7 @@ export var DataType;
|
|
|
6
6
|
DataType[DataType["binary"] = 1] = "binary";
|
|
7
7
|
DataType[DataType["external_info"] = 2] = "external_info";
|
|
8
8
|
DataType[DataType["reserved"] = 3] = "reserved";
|
|
9
|
-
})(DataType
|
|
9
|
+
})(DataType || (DataType = {}));
|
|
10
10
|
/**
|
|
11
11
|
* APE_DESCRIPTOR: defines the sizes (and offsets) of all the pieces, as well as the MD5 checksum
|
|
12
12
|
*/
|
package/lib/asf/AsfObject.js
CHANGED
|
@@ -34,7 +34,7 @@ export var DataType;
|
|
|
34
34
|
* WORD. The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer.
|
|
35
35
|
*/
|
|
36
36
|
DataType[DataType["Word"] = 5] = "Word";
|
|
37
|
-
})(DataType
|
|
37
|
+
})(DataType || (DataType = {}));
|
|
38
38
|
/**
|
|
39
39
|
* Token for: 3. ASF top-level Header Object
|
|
40
40
|
* Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3
|
package/lib/asf/GUID.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html
|
|
13
13
|
* - https://github.com/dji-sdk/FFmpeg/blob/master/libavformat/asf.c
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
class GUID {
|
|
16
16
|
static fromBin(bin, offset = 0) {
|
|
17
17
|
return new GUID(this.decode(bin, offset));
|
|
18
18
|
}
|
|
@@ -116,3 +116,4 @@ GUID.Degradable_JPEG_Media = new GUID("35907DE0-E415-11CF-A917-00805F5C442B");
|
|
|
116
116
|
GUID.FileTransferMedia = new GUID("91BD222C-F21C-497A-8B6D-5AA86BFC0185");
|
|
117
117
|
GUID.BinaryMedia = new GUID("3AFB65E2-47EF-40F2-AC2C-70A90D71D343");
|
|
118
118
|
GUID.ASF_Index_Placeholder_Object = new GUID("D9AADE20-7C17-4F9C-BC28-8555DD98E2A2");
|
|
119
|
+
export default GUID;
|
|
@@ -3,7 +3,7 @@ export interface IGenericTag {
|
|
|
3
3
|
id: GenericTagId;
|
|
4
4
|
value: any;
|
|
5
5
|
}
|
|
6
|
-
export type GenericTagId = 'track' | 'disk' | 'year' | 'title' | 'artist' | 'artists' | 'albumartist' | 'album' | 'date' | 'originaldate' | 'originalyear' | 'comment' | 'genre' | 'picture' | 'composer' | 'lyrics' | 'albumsort' | 'titlesort' | 'work' | 'artistsort' | 'albumartistsort' | 'composersort' | 'lyricist' | 'writer' | 'conductor' | 'remixer' | 'arranger' | 'engineer' | 'technician' | 'producer' | 'djmixer' | 'mixer' | 'publisher' | 'label' | 'grouping' | 'subtitle' | 'discsubtitle' | 'totaltracks' | 'totaldiscs' | 'compilation' | 'rating' | 'bpm' | 'mood' | 'media' | 'catalognumber' | 'tvShow' | 'tvShowSort' | 'tvEpisode' | 'tvEpisodeId' | 'tvNetwork' | 'tvSeason' | 'podcast' | 'podcasturl' | 'releasestatus' | 'releasetype' | 'releasecountry' | 'script' | 'language' | 'copyright' | 'license' | 'encodedby' | 'encodersettings' | 'gapless' | 'barcode' | 'isrc' | 'asin' | 'musicbrainz_recordingid' | 'musicbrainz_trackid' | 'musicbrainz_albumid' | 'musicbrainz_artistid' | 'musicbrainz_albumartistid' | 'musicbrainz_releasegroupid' | 'musicbrainz_workid' | 'musicbrainz_trmid' | 'musicbrainz_discid' | 'acoustid_id' | 'acoustid_fingerprint' | 'musicip_puid' | 'musicip_fingerprint' | 'website' | 'performer:instrument' | 'peakLevel' | 'averageLevel' | 'notes' | 'key' | 'originalalbum' | 'originalartist' | 'discogs_artist_id' | 'discogs_label_id' | 'discogs_master_release_id' | 'discogs_rating' | 'discogs_release_id' | 'discogs_votes' | 'replaygain_track_gain' | 'replaygain_track_peak' | 'replaygain_album_gain' | 'replaygain_album_peak' | 'replaygain_track_minmax' | 'replaygain_album_minmax' | 'replaygain_undo' | 'description' | 'longDescription' | 'category' | 'hdVideo' | 'keywords' | 'movement' | 'movementIndex' | 'movementTotal' | 'podcastId' | 'showMovement' | 'stik';
|
|
6
|
+
export type GenericTagId = 'track' | 'disk' | 'year' | 'title' | 'artist' | 'artists' | 'albumartist' | 'album' | 'date' | 'originaldate' | 'originalyear' | 'releasedate' | 'comment' | 'genre' | 'picture' | 'composer' | 'lyrics' | 'albumsort' | 'titlesort' | 'work' | 'artistsort' | 'albumartistsort' | 'composersort' | 'lyricist' | 'writer' | 'conductor' | 'remixer' | 'arranger' | 'engineer' | 'technician' | 'producer' | 'djmixer' | 'mixer' | 'publisher' | 'label' | 'grouping' | 'subtitle' | 'discsubtitle' | 'totaltracks' | 'totaldiscs' | 'compilation' | 'rating' | 'bpm' | 'mood' | 'media' | 'catalognumber' | 'tvShow' | 'tvShowSort' | 'tvEpisode' | 'tvEpisodeId' | 'tvNetwork' | 'tvSeason' | 'podcast' | 'podcasturl' | 'releasestatus' | 'releasetype' | 'releasecountry' | 'script' | 'language' | 'copyright' | 'license' | 'encodedby' | 'encodersettings' | 'gapless' | 'barcode' | 'isrc' | 'asin' | 'musicbrainz_recordingid' | 'musicbrainz_trackid' | 'musicbrainz_albumid' | 'musicbrainz_artistid' | 'musicbrainz_albumartistid' | 'musicbrainz_releasegroupid' | 'musicbrainz_workid' | 'musicbrainz_trmid' | 'musicbrainz_discid' | 'acoustid_id' | 'acoustid_fingerprint' | 'musicip_puid' | 'musicip_fingerprint' | 'website' | 'performer:instrument' | 'peakLevel' | 'averageLevel' | 'notes' | 'key' | 'originalalbum' | 'originalartist' | 'discogs_artist_id' | 'discogs_label_id' | 'discogs_master_release_id' | 'discogs_rating' | 'discogs_release_id' | 'discogs_votes' | 'replaygain_track_gain' | 'replaygain_track_peak' | 'replaygain_album_gain' | 'replaygain_album_peak' | 'replaygain_track_minmax' | 'replaygain_album_minmax' | 'replaygain_undo' | 'description' | 'longDescription' | 'category' | 'hdVideo' | 'keywords' | 'movement' | 'movementIndex' | 'movementTotal' | 'podcastId' | 'showMovement' | 'stik';
|
|
7
7
|
export interface INativeTagMap {
|
|
8
8
|
[index: string]: GenericTagId;
|
|
9
9
|
}
|
|
@@ -10,6 +10,7 @@ export const commonTags = {
|
|
|
10
10
|
date: { multiple: false },
|
|
11
11
|
originaldate: { multiple: false },
|
|
12
12
|
originalyear: { multiple: false },
|
|
13
|
+
releasedate: { multiple: false },
|
|
13
14
|
comment: { multiple: true, unique: false },
|
|
14
15
|
genre: { multiple: true, unique: true },
|
|
15
16
|
picture: { multiple: true, unique: true },
|
package/lib/dsf/DsfChunk.js
CHANGED
|
@@ -30,7 +30,7 @@ export var ChannelType;
|
|
|
30
30
|
ChannelType[ChannelType["4 channels"] = 5] = "4 channels";
|
|
31
31
|
ChannelType[ChannelType["5 channels"] = 6] = "5 channels";
|
|
32
32
|
ChannelType[ChannelType["5.1 channels"] = 7] = "5.1 channels";
|
|
33
|
-
})(ChannelType
|
|
33
|
+
})(ChannelType || (ChannelType = {}));
|
|
34
34
|
/**
|
|
35
35
|
* Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size
|
|
36
36
|
*/
|
package/lib/id3v2/ID3v2Token.js
CHANGED
|
@@ -27,7 +27,7 @@ export var AttachedPictureType;
|
|
|
27
27
|
AttachedPictureType[AttachedPictureType["Illustration"] = 18] = "Illustration";
|
|
28
28
|
AttachedPictureType[AttachedPictureType["Band/artist logotype"] = 19] = "Band/artist logotype";
|
|
29
29
|
AttachedPictureType[AttachedPictureType["Publisher/Studio logotype"] = 20] = "Publisher/Studio logotype";
|
|
30
|
-
})(AttachedPictureType
|
|
30
|
+
})(AttachedPictureType || (AttachedPictureType = {}));
|
|
31
31
|
/**
|
|
32
32
|
* 28 bits (representing up to 256MB) integer, the msb is 0 to avoid 'false syncsignals'.
|
|
33
33
|
* 4 * %0xxxxxxx
|
|
@@ -8,6 +8,7 @@ const ebmlTagMap = {
|
|
|
8
8
|
'album:ARTISTSORT': 'albumartistsort',
|
|
9
9
|
'album:TITLE': 'album',
|
|
10
10
|
'album:DATE_RECORDED': 'originaldate',
|
|
11
|
+
'album:DATE_RELEASED': 'releasedate',
|
|
11
12
|
'album:PART_NUMBER': 'disk',
|
|
12
13
|
'album:TOTAL_PARTS': 'totaltracks',
|
|
13
14
|
'track:ARTIST': 'artist',
|
package/lib/matroska/types.js
CHANGED
|
@@ -6,7 +6,7 @@ export var DataType;
|
|
|
6
6
|
DataType[DataType["bool"] = 3] = "bool";
|
|
7
7
|
DataType[DataType["binary"] = 4] = "binary";
|
|
8
8
|
DataType[DataType["float"] = 5] = "float";
|
|
9
|
-
})(DataType
|
|
9
|
+
})(DataType || (DataType = {}));
|
|
10
10
|
export var TargetType;
|
|
11
11
|
(function (TargetType) {
|
|
12
12
|
TargetType[TargetType["shot"] = 10] = "shot";
|
|
@@ -16,7 +16,7 @@ export var TargetType;
|
|
|
16
16
|
TargetType[TargetType["album"] = 50] = "album";
|
|
17
17
|
TargetType[TargetType["edition"] = 60] = "edition";
|
|
18
18
|
TargetType[TargetType["collection"] = 70] = "collection";
|
|
19
|
-
})(TargetType
|
|
19
|
+
})(TargetType || (TargetType = {}));
|
|
20
20
|
export var TrackType;
|
|
21
21
|
(function (TrackType) {
|
|
22
22
|
TrackType[TrackType["video"] = 1] = "video";
|
|
@@ -26,5 +26,5 @@ export var TrackType;
|
|
|
26
26
|
TrackType[TrackType["subtitle"] = 17] = "subtitle";
|
|
27
27
|
TrackType[TrackType["button"] = 18] = "button";
|
|
28
28
|
TrackType[TrackType["control"] = 32] = "control";
|
|
29
|
-
})(TrackType
|
|
29
|
+
})(TrackType || (TrackType = {}));
|
|
30
30
|
//# sourceMappingURL=types.js.map
|
package/lib/mp4/MP4Parser.js
CHANGED
|
@@ -175,7 +175,7 @@ export class MP4Parser extends BasicParser {
|
|
|
175
175
|
this.getTrackDescription().sampleToChunkTable = stsc.entries;
|
|
176
176
|
},
|
|
177
177
|
/**
|
|
178
|
-
* time
|
|
178
|
+
* time-to-sample table
|
|
179
179
|
*/
|
|
180
180
|
stts: async (len) => {
|
|
181
181
|
const stts = await this.tokenizer.readToken(new AtomToken.SttsAtom(len));
|
|
@@ -272,13 +272,22 @@ export class MP4Parser extends BasicParser {
|
|
|
272
272
|
});
|
|
273
273
|
if (audioTracks.length >= 1) {
|
|
274
274
|
const audioTrack = audioTracks[0];
|
|
275
|
-
|
|
276
|
-
|
|
275
|
+
if (audioTrack.timeScale > 0) {
|
|
276
|
+
const duration = audioTrack.duration / audioTrack.timeScale; // calculate duration in seconds
|
|
277
|
+
this.metadata.setFormat('duration', duration);
|
|
278
|
+
}
|
|
277
279
|
const ssd = audioTrack.soundSampleDescription[0];
|
|
278
280
|
if (ssd.description) {
|
|
279
281
|
this.metadata.setFormat('sampleRate', ssd.description.sampleRate);
|
|
280
282
|
this.metadata.setFormat('bitsPerSample', ssd.description.sampleSize);
|
|
281
283
|
this.metadata.setFormat('numberOfChannels', ssd.description.numAudioChannels);
|
|
284
|
+
if (audioTrack.timeScale === 0 && audioTrack.timeToSampleTable.length > 0) {
|
|
285
|
+
const totalSampleSize = audioTrack.timeToSampleTable
|
|
286
|
+
.map(ttstEntry => ttstEntry.count * ttstEntry.duration)
|
|
287
|
+
.reduce((total, sampleSize) => total + sampleSize);
|
|
288
|
+
const duration = totalSampleSize / ssd.description.sampleRate;
|
|
289
|
+
this.metadata.setFormat('duration', duration);
|
|
290
|
+
}
|
|
282
291
|
}
|
|
283
292
|
const encoderInfo = encoderDict[ssd.dataFormat];
|
|
284
293
|
if (encoderInfo) {
|
package/lib/mp4/MP4TagMapper.js
CHANGED
|
@@ -89,6 +89,7 @@ const mp4TagMap = {
|
|
|
89
89
|
'----:com.apple.iTunes:ARTISTS': 'artists',
|
|
90
90
|
'----:com.apple.iTunes:ORIGINALDATE': 'originaldate',
|
|
91
91
|
'----:com.apple.iTunes:ORIGINALYEAR': 'originalyear',
|
|
92
|
+
'----:com.apple.iTunes:RELEASEDATE': 'releasedate',
|
|
92
93
|
// '----:com.apple.iTunes:PERFORMER': 'performer'
|
|
93
94
|
desc: 'description',
|
|
94
95
|
ldes: 'longDescription',
|
package/lib/type.d.ts
CHANGED
|
@@ -76,7 +76,7 @@ export interface ICommonTagsResult {
|
|
|
76
76
|
*/
|
|
77
77
|
album?: string;
|
|
78
78
|
/**
|
|
79
|
-
*
|
|
79
|
+
* Date
|
|
80
80
|
*/
|
|
81
81
|
date?: string;
|
|
82
82
|
/**
|
|
@@ -84,9 +84,13 @@ export interface ICommonTagsResult {
|
|
|
84
84
|
*/
|
|
85
85
|
originaldate?: string;
|
|
86
86
|
/**
|
|
87
|
-
* Original release
|
|
87
|
+
* Original release year
|
|
88
88
|
*/
|
|
89
89
|
originalyear?: number;
|
|
90
|
+
/**
|
|
91
|
+
* Release date
|
|
92
|
+
*/
|
|
93
|
+
releasedate?: string;
|
|
90
94
|
/**
|
|
91
95
|
* List of comments
|
|
92
96
|
*/
|
package/lib/wav/WaveChunk.js
CHANGED
|
@@ -18,7 +18,7 @@ export var WaveFormat;
|
|
|
18
18
|
WaveFormat[WaveFormat["DRM"] = 9] = "DRM";
|
|
19
19
|
WaveFormat[WaveFormat["DTS2"] = 8193] = "DTS2";
|
|
20
20
|
WaveFormat[WaveFormat["MPEG"] = 80] = "MPEG";
|
|
21
|
-
})(WaveFormat
|
|
21
|
+
})(WaveFormat || (WaveFormat = {}));
|
|
22
22
|
/**
|
|
23
23
|
* format chunk; chunk-id is "fmt "
|
|
24
24
|
* http://soundfile.sapp.org/doc/WaveFormat/
|
package/package.json
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "music-metadata",
|
|
3
|
-
"description": "Music metadata parser for Node.js, supporting virtual any audio and tag format.",
|
|
4
|
-
"version": "8.1.
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Borewit",
|
|
7
|
-
"url": "https://github.com/Borewit"
|
|
8
|
-
},
|
|
9
|
-
"funding": {
|
|
10
|
-
"type": "github",
|
|
11
|
-
"url": "https://github.com/sponsors/Borewit"
|
|
12
|
-
},
|
|
13
|
-
"type": "module",
|
|
14
|
-
"exports": {
|
|
15
|
-
".": {
|
|
16
|
-
"node": "./lib/index.js",
|
|
17
|
-
"default": "./lib/core.js"
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
"types": "lib/index.d.ts",
|
|
21
|
-
"files": [
|
|
22
|
-
"lib/**/*.js",
|
|
23
|
-
"lib/**/*.d.ts"
|
|
24
|
-
],
|
|
25
|
-
"keywords": [
|
|
26
|
-
"music",
|
|
27
|
-
"metadata",
|
|
28
|
-
"meta",
|
|
29
|
-
"audio",
|
|
30
|
-
"tag",
|
|
31
|
-
"tags",
|
|
32
|
-
"duration",
|
|
33
|
-
"MusicBrainz",
|
|
34
|
-
"Discogs",
|
|
35
|
-
"Picard",
|
|
36
|
-
"ID3",
|
|
37
|
-
"ID3v1",
|
|
38
|
-
"ID3v2",
|
|
39
|
-
"m4a",
|
|
40
|
-
"m4b",
|
|
41
|
-
"mp3",
|
|
42
|
-
"mp4",
|
|
43
|
-
"Vorbis",
|
|
44
|
-
"ogg",
|
|
45
|
-
"flac",
|
|
46
|
-
"Matroska",
|
|
47
|
-
"WebM",
|
|
48
|
-
"EBML",
|
|
49
|
-
"asf",
|
|
50
|
-
"wma",
|
|
51
|
-
"wmv",
|
|
52
|
-
"ape",
|
|
53
|
-
"MonkeyAudio",
|
|
54
|
-
"aiff",
|
|
55
|
-
"wav",
|
|
56
|
-
"WavPack",
|
|
57
|
-
"Opus",
|
|
58
|
-
"speex",
|
|
59
|
-
"musepack",
|
|
60
|
-
"mpc",
|
|
61
|
-
"dsd",
|
|
62
|
-
"dsf",
|
|
63
|
-
"mpc",
|
|
64
|
-
"dff",
|
|
65
|
-
"dsdiff",
|
|
66
|
-
"aac",
|
|
67
|
-
"adts",
|
|
68
|
-
"length",
|
|
69
|
-
"chapter",
|
|
70
|
-
"info",
|
|
71
|
-
"parse",
|
|
72
|
-
"parser",
|
|
73
|
-
"bwf"
|
|
74
|
-
],
|
|
75
|
-
"scripts": {
|
|
76
|
-
"clean": "del-cli lib/**/*.js lib/**/*.js.map lib/**/*.d.ts src/**/*.d.ts test/**/*.js test/**/*.js.map test/**/*.js test/**/*.js.map doc-gen/**/*.js doc-gen/**/*.js.map",
|
|
77
|
-
"compile-src": "tsc -p lib",
|
|
78
|
-
"compile-test": "tsc -p test",
|
|
79
|
-
"compile-doc": "tsc -p doc-gen",
|
|
80
|
-
"compile": "npm run compile-src && npm run compile-test && npm run compile-doc",
|
|
81
|
-
"eslint": "eslint lib/**/*.ts --ignore-pattern lib/**/*.d.ts example/typescript/**/*.ts test/**/*.ts doc-gen/**/*.ts",
|
|
82
|
-
"lint-md": "remark -u preset-lint-recommended .",
|
|
83
|
-
"lint": "npm run lint-md && npm run eslint",
|
|
84
|
-
"test": "mocha",
|
|
85
|
-
"build": "npm run clean && npm run compile && npm run doc-gen",
|
|
86
|
-
"start": "npm-run-all compile lint cover-test",
|
|
87
|
-
"test-coverage": "c8 npm run test",
|
|
88
|
-
"send-codacy": "c8 report --reporter=text-lcov | codacy-coverage",
|
|
89
|
-
"doc-gen": "node doc-gen/gen.js"
|
|
90
|
-
},
|
|
91
|
-
"dependencies": {
|
|
92
|
-
"@tokenizer/token": "^0.3.0",
|
|
93
|
-
"content-type": "^1.0.
|
|
94
|
-
"debug": "^4.3.4",
|
|
95
|
-
"file-type": "^18.
|
|
96
|
-
"media-typer": "^1.1.0",
|
|
97
|
-
"strtok3": "^7.0.0",
|
|
98
|
-
"token-types": "^5.0.1"
|
|
99
|
-
},
|
|
100
|
-
"devDependencies": {
|
|
101
|
-
"@types/chai": "^4.3.
|
|
102
|
-
"@types/chai-as-promised": "^7.1.
|
|
103
|
-
"@types/debug": "^4.1.
|
|
104
|
-
"@types/file-type": "^10.9.1",
|
|
105
|
-
"@types/mocha": "^10.0.
|
|
106
|
-
"@types/node": "^
|
|
107
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
108
|
-
"@typescript-eslint/parser": "^5.
|
|
109
|
-
"c8": "^
|
|
110
|
-
"chai": "^4.3.
|
|
111
|
-
"chai-as-promised": "^7.1.1",
|
|
112
|
-
"del-cli": "5.
|
|
113
|
-
"eslint": "^8.
|
|
114
|
-
"eslint-config-prettier": "^
|
|
115
|
-
"eslint-import-resolver-typescript": "^3.
|
|
116
|
-
"eslint-plugin-import": "^2.
|
|
117
|
-
"eslint-plugin-jsdoc": "^
|
|
118
|
-
"eslint-plugin-node": "^11.1.0",
|
|
119
|
-
"eslint-plugin-unicorn": "^
|
|
120
|
-
"mime": "^3.0.0",
|
|
121
|
-
"mocha": "^10.
|
|
122
|
-
"npm-run-all": "^4.1.5",
|
|
123
|
-
"prettier": "^
|
|
124
|
-
"remark-cli": "^
|
|
125
|
-
"remark-preset-lint-recommended": "^6.1.
|
|
126
|
-
"ts-node": "^10.9.1",
|
|
127
|
-
"typescript": "^
|
|
128
|
-
},
|
|
129
|
-
"engines": {
|
|
130
|
-
"node": "^14.13.1 || >=16.0.0"
|
|
131
|
-
},
|
|
132
|
-
"repository": {
|
|
133
|
-
"type": "git",
|
|
134
|
-
"url": "git+https://github.com/borewit/music-metadata.git"
|
|
135
|
-
},
|
|
136
|
-
"license": "MIT",
|
|
137
|
-
"bugs": {
|
|
138
|
-
"url": "https://github.com/Borewit/music-metadata/issues"
|
|
139
|
-
}
|
|
140
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "music-metadata",
|
|
3
|
+
"description": "Music metadata parser for Node.js, supporting virtual any audio and tag format.",
|
|
4
|
+
"version": "8.1.5",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Borewit",
|
|
7
|
+
"url": "https://github.com/Borewit"
|
|
8
|
+
},
|
|
9
|
+
"funding": {
|
|
10
|
+
"type": "github",
|
|
11
|
+
"url": "https://github.com/sponsors/Borewit"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"node": "./lib/index.js",
|
|
17
|
+
"default": "./lib/core.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"types": "lib/index.d.ts",
|
|
21
|
+
"files": [
|
|
22
|
+
"lib/**/*.js",
|
|
23
|
+
"lib/**/*.d.ts"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"music",
|
|
27
|
+
"metadata",
|
|
28
|
+
"meta",
|
|
29
|
+
"audio",
|
|
30
|
+
"tag",
|
|
31
|
+
"tags",
|
|
32
|
+
"duration",
|
|
33
|
+
"MusicBrainz",
|
|
34
|
+
"Discogs",
|
|
35
|
+
"Picard",
|
|
36
|
+
"ID3",
|
|
37
|
+
"ID3v1",
|
|
38
|
+
"ID3v2",
|
|
39
|
+
"m4a",
|
|
40
|
+
"m4b",
|
|
41
|
+
"mp3",
|
|
42
|
+
"mp4",
|
|
43
|
+
"Vorbis",
|
|
44
|
+
"ogg",
|
|
45
|
+
"flac",
|
|
46
|
+
"Matroska",
|
|
47
|
+
"WebM",
|
|
48
|
+
"EBML",
|
|
49
|
+
"asf",
|
|
50
|
+
"wma",
|
|
51
|
+
"wmv",
|
|
52
|
+
"ape",
|
|
53
|
+
"MonkeyAudio",
|
|
54
|
+
"aiff",
|
|
55
|
+
"wav",
|
|
56
|
+
"WavPack",
|
|
57
|
+
"Opus",
|
|
58
|
+
"speex",
|
|
59
|
+
"musepack",
|
|
60
|
+
"mpc",
|
|
61
|
+
"dsd",
|
|
62
|
+
"dsf",
|
|
63
|
+
"mpc",
|
|
64
|
+
"dff",
|
|
65
|
+
"dsdiff",
|
|
66
|
+
"aac",
|
|
67
|
+
"adts",
|
|
68
|
+
"length",
|
|
69
|
+
"chapter",
|
|
70
|
+
"info",
|
|
71
|
+
"parse",
|
|
72
|
+
"parser",
|
|
73
|
+
"bwf"
|
|
74
|
+
],
|
|
75
|
+
"scripts": {
|
|
76
|
+
"clean": "del-cli lib/**/*.js lib/**/*.js.map lib/**/*.d.ts src/**/*.d.ts test/**/*.js test/**/*.js.map test/**/*.js test/**/*.js.map doc-gen/**/*.js doc-gen/**/*.js.map",
|
|
77
|
+
"compile-src": "tsc -p lib",
|
|
78
|
+
"compile-test": "tsc -p test",
|
|
79
|
+
"compile-doc": "tsc -p doc-gen",
|
|
80
|
+
"compile": "npm run compile-src && npm run compile-test && npm run compile-doc",
|
|
81
|
+
"eslint": "eslint lib/**/*.ts --ignore-pattern lib/**/*.d.ts example/typescript/**/*.ts test/**/*.ts doc-gen/**/*.ts",
|
|
82
|
+
"lint-md": "remark -u preset-lint-recommended .",
|
|
83
|
+
"lint": "npm run lint-md && npm run eslint",
|
|
84
|
+
"test": "mocha",
|
|
85
|
+
"build": "npm run clean && npm run compile && npm run doc-gen",
|
|
86
|
+
"start": "npm-run-all compile lint cover-test",
|
|
87
|
+
"test-coverage": "c8 npm run test",
|
|
88
|
+
"send-codacy": "c8 report --reporter=text-lcov | codacy-coverage",
|
|
89
|
+
"doc-gen": "node doc-gen/gen.js"
|
|
90
|
+
},
|
|
91
|
+
"dependencies": {
|
|
92
|
+
"@tokenizer/token": "^0.3.0",
|
|
93
|
+
"content-type": "^1.0.5",
|
|
94
|
+
"debug": "^4.3.4",
|
|
95
|
+
"file-type": "^18.5.0",
|
|
96
|
+
"media-typer": "^1.1.0",
|
|
97
|
+
"strtok3": "^7.0.0",
|
|
98
|
+
"token-types": "^5.0.1"
|
|
99
|
+
},
|
|
100
|
+
"devDependencies": {
|
|
101
|
+
"@types/chai": "^4.3.9",
|
|
102
|
+
"@types/chai-as-promised": "^7.1.7",
|
|
103
|
+
"@types/debug": "^4.1.10",
|
|
104
|
+
"@types/file-type": "^10.9.1",
|
|
105
|
+
"@types/mocha": "^10.0.3",
|
|
106
|
+
"@types/node": "^20.8.10",
|
|
107
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
108
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
109
|
+
"c8": "^8.0.1",
|
|
110
|
+
"chai": "^4.3.10",
|
|
111
|
+
"chai-as-promised": "^7.1.1",
|
|
112
|
+
"del-cli": "5.1.0",
|
|
113
|
+
"eslint": "^8.52.0",
|
|
114
|
+
"eslint-config-prettier": "^9.0.0",
|
|
115
|
+
"eslint-import-resolver-typescript": "^3.6.1",
|
|
116
|
+
"eslint-plugin-import": "^2.29.0",
|
|
117
|
+
"eslint-plugin-jsdoc": "^46.8.2",
|
|
118
|
+
"eslint-plugin-node": "^11.1.0",
|
|
119
|
+
"eslint-plugin-unicorn": "^46.0.1",
|
|
120
|
+
"mime": "^3.0.0",
|
|
121
|
+
"mocha": "^10.2.0",
|
|
122
|
+
"npm-run-all": "^4.1.5",
|
|
123
|
+
"prettier": "^3.0.3",
|
|
124
|
+
"remark-cli": "^12.0.0",
|
|
125
|
+
"remark-preset-lint-recommended": "^6.1.3",
|
|
126
|
+
"ts-node": "^10.9.1",
|
|
127
|
+
"typescript": "^5.2.2"
|
|
128
|
+
},
|
|
129
|
+
"engines": {
|
|
130
|
+
"node": "^14.13.1 || >=16.0.0"
|
|
131
|
+
},
|
|
132
|
+
"repository": {
|
|
133
|
+
"type": "git",
|
|
134
|
+
"url": "git+https://github.com/borewit/music-metadata.git"
|
|
135
|
+
},
|
|
136
|
+
"license": "MIT",
|
|
137
|
+
"bugs": {
|
|
138
|
+
"url": "https://github.com/Borewit/music-metadata/issues"
|
|
139
|
+
}
|
|
140
|
+
}
|