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.
@@ -11,6 +11,7 @@ const apev2TagMap = {
11
11
  Year: 'date',
12
12
  Originalyear: 'originalyear',
13
13
  Originaldate: 'originaldate',
14
+ Releasedate: 'releasedate',
14
15
  Comment: 'comment',
15
16
  Track: 'track',
16
17
  Disc: 'disk',
@@ -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 = DataType || (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
  */
@@ -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 = DataType || (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
- export default class GUID {
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 },
@@ -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 = ChannelType || (ChannelType = {}));
33
+ })(ChannelType || (ChannelType = {}));
34
34
  /**
35
35
  * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size
36
36
  */
@@ -132,7 +132,7 @@ const id3v24TagMap = {
132
132
  PCST: 'podcast',
133
133
  TCAT: 'category',
134
134
  TDES: 'description',
135
- TDRL: 'date',
135
+ TDRL: 'releasedate',
136
136
  TGID: 'podcastId',
137
137
  TKWD: 'keywords',
138
138
  WFED: 'podcasturl'
@@ -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 = AttachedPictureType || (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',
@@ -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 = DataType || (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 = TargetType || (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 = TrackType || (TrackType = {}));
29
+ })(TrackType || (TrackType = {}));
30
30
  //# sourceMappingURL=types.js.map
@@ -175,7 +175,7 @@ export class MP4Parser extends BasicParser {
175
175
  this.getTrackDescription().sampleToChunkTable = stsc.entries;
176
176
  },
177
177
  /**
178
- * time to sample
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
- const duration = audioTrack.duration / audioTrack.timeScale;
276
- this.metadata.setFormat('duration', duration); // calculate duration in seconds
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) {
@@ -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',
@@ -16,6 +16,7 @@ const vorbisTagMap = {
16
16
  DATE: 'date',
17
17
  ORIGINALDATE: 'originaldate',
18
18
  ORIGINALYEAR: 'originalyear',
19
+ RELEASEDATE: 'releasedate',
19
20
  COMMENT: 'comment',
20
21
  TRACKNUMBER: 'track',
21
22
  DISCNUMBER: 'disk',
@@ -10,6 +10,7 @@ export const riffInfoTagMap = {
10
10
  TITL: 'title',
11
11
  IPRD: 'album',
12
12
  ITRK: 'track',
13
+ IPRT: 'track',
13
14
  COMM: 'comment',
14
15
  ICMT: 'comment',
15
16
  ICNT: 'releasecountry',
package/lib/type.d.ts CHANGED
@@ -76,7 +76,7 @@ export interface ICommonTagsResult {
76
76
  */
77
77
  album?: string;
78
78
  /**
79
- * Release data
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 yeat
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
  */
@@ -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 = WaveFormat || (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.3",
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.4",
94
- "debug": "^4.3.4",
95
- "file-type": "^18.0.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.4",
102
- "@types/chai-as-promised": "^7.1.5",
103
- "@types/debug": "^4.1.7",
104
- "@types/file-type": "^10.9.1",
105
- "@types/mocha": "^10.0.0",
106
- "@types/node": "^18.11.18",
107
- "@typescript-eslint/eslint-plugin": "^5.48.0",
108
- "@typescript-eslint/parser": "^5.48.1",
109
- "c8": "^7.12.0",
110
- "chai": "^4.3.7",
111
- "chai-as-promised": "^7.1.1",
112
- "del-cli": "5.0.0",
113
- "eslint": "^8.31.0",
114
- "eslint-config-prettier": "^8.6.0",
115
- "eslint-import-resolver-typescript": "^3.5.2",
116
- "eslint-plugin-import": "^2.26.0",
117
- "eslint-plugin-jsdoc": "^39.6.4",
118
- "eslint-plugin-node": "^11.1.0",
119
- "eslint-plugin-unicorn": "^45.0.2",
120
- "mime": "^3.0.0",
121
- "mocha": "^10.1.0",
122
- "npm-run-all": "^4.1.5",
123
- "prettier": "^2.8.2",
124
- "remark-cli": "^11.0.0",
125
- "remark-preset-lint-recommended": "^6.1.2",
126
- "ts-node": "^10.9.1",
127
- "typescript": "^4.9.4"
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
+ }