musicbrainz-api 0.14.0 → 0.15.0

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/README.md CHANGED
@@ -98,7 +98,7 @@ const artist = await mbApi.lookup('artist', 'ab2528d9-719f-4261-8098-21849222a0f
98
98
  ### Browse artist
99
99
 
100
100
  ```js
101
- const artists = await browse('artist', query);
101
+ const artists = await mbApi.browse('artist', query);
102
102
  ````
103
103
 
104
104
  | Query argument | Query value |
@@ -112,7 +112,7 @@ const artists = await browse('artist', query);
112
112
 
113
113
  ### Browse collection
114
114
  ```js
115
- const collections = await browse('collection', query);
115
+ const collections = await mbApi.browse('collection', query);
116
116
  ````
117
117
 
118
118
  | Query argument | Query value |
@@ -130,7 +130,7 @@ const collections = await browse('collection', query);
130
130
 
131
131
  ### Browse events
132
132
  ```js
133
- const events = await browse('event', query);
133
+ const events = await mbApi.browse('event', query);
134
134
  ````
135
135
 
136
136
  | Query argument | Query value |
@@ -142,7 +142,7 @@ const events = await browse('event', query);
142
142
 
143
143
  ### Browse instruments
144
144
  ```js
145
- const instruments = await browse('event', query);
145
+ const instruments = await mbApi.browse('event', query);
146
146
  ````
147
147
 
148
148
  | Query argument | Query value |
@@ -151,7 +151,7 @@ const instruments = await browse('event', query);
151
151
 
152
152
  ### Browse labels
153
153
  ```js
154
- const labels = await browse('label', query);
154
+ const labels = await mbApi.browse('label', query);
155
155
  ````
156
156
 
157
157
  | Query argument | Query value |
@@ -162,7 +162,7 @@ const labels = await browse('label', query);
162
162
 
163
163
  ### Browse places
164
164
  ```js
165
- const places = await browse('place', query);
165
+ const places = await mbApi.browse('place', query);
166
166
  ````
167
167
 
168
168
  | Query argument | Query value |
@@ -172,7 +172,7 @@ const places = await browse('place', query);
172
172
 
173
173
  ### Browse recordings
174
174
  ```js
175
- const recordings = await browse('recording', query);
175
+ const recordings = await mbApi.browse('recording', query);
176
176
  ````
177
177
 
178
178
  | Query argument | Query value |
@@ -184,7 +184,7 @@ const recordings = await browse('recording', query);
184
184
 
185
185
  ### Browse releases
186
186
  ```js
187
- const releases = await browse('release', query);
187
+ const releases = await mbApi.browse('release', query);
188
188
  ````
189
189
 
190
190
  | Query argument | Query value |
@@ -202,7 +202,7 @@ const releases = await browse('release', query);
202
202
 
203
203
  ### Browse release-groups
204
204
  ```js
205
- const releaseGroups = await browse('release-group',query);
205
+ const releaseGroups = await mbApi.browse('release-group',query);
206
206
  ```
207
207
 
208
208
  | Query argument | Query value |
@@ -213,7 +213,7 @@ const releaseGroups = await browse('release-group',query);
213
213
 
214
214
  ### Browse series
215
215
  ```js
216
- const series = await browse('series');
216
+ const series = await mbApi.browse('series');
217
217
  ````
218
218
 
219
219
  | Query argument | Query value |
@@ -231,7 +231,7 @@ const series = await browse('series');
231
231
 
232
232
  ### Browse works
233
233
  ```js
234
- const works = await browse('work');
234
+ const works = await mbApi.browse('work');
235
235
  ````
236
236
 
237
237
  | Query argument | Query value |
@@ -241,7 +241,7 @@ const works = await browse('work');
241
241
 
242
242
  ### Browse urls
243
243
  ```js
244
- const urls = await browse('url');
244
+ const urls = await mbApi.browse('url');
245
245
  ````
246
246
 
247
247
  | Query argument | Query value |
@@ -277,7 +277,7 @@ Arguments:
277
277
  For example, to find any recordings of _'We Will Rock You'_ by Queen:
278
278
  ```js
279
279
  const query = 'query="We Will Rock You" AND arid:0383dadf-2a4e-4d10-a46a-e9e041da8eb3';
280
- const result = await mbApi.query<mb.IReleaseGroupList>('release-group', {query});
280
+ const result = await mbApi.search('release-group', {query});
281
281
  ```
282
282
 
283
283
  ##### Example: search Île-de-France
@@ -24,8 +24,25 @@ export declare class CoverArtArchiveApi {
24
24
  private host;
25
25
  private getJson;
26
26
  /**
27
- *
27
+ * Fetch release
28
+ * @releaseId Release MBID
28
29
  * @param releaseId MusicBrainz Release MBID
30
+ * @param coverType Cover type
29
31
  */
30
32
  getReleaseCovers(releaseId: string, coverType?: 'front' | 'back'): Promise<ICoverInfo>;
33
+ /**
34
+ * Fetch release-group
35
+ * @releaseGroupId Release-group MBID
36
+ * @param releaseGroupId MusicBrainz Release Group MBID
37
+ * @param coverType Cover type
38
+ */
39
+ getReleaseGroupCovers(releaseGroupId: string, coverType?: 'front' | 'back'): Promise<ICoverInfo>;
40
+ /**
41
+ * Fetch covers
42
+ * @releaseId MBID
43
+ * @param releaseId MusicBrainz Release Group MBID
44
+ * @param releaseType Fetch covers for specific release or release-group
45
+ * @param coverType Cover type
46
+ */
47
+ private getCovers;
31
48
  }
@@ -14,11 +14,32 @@ export class CoverArtArchiveApi {
14
14
  return response.body;
15
15
  }
16
16
  /**
17
- *
17
+ * Fetch release
18
+ * @releaseId Release MBID
18
19
  * @param releaseId MusicBrainz Release MBID
20
+ * @param coverType Cover type
19
21
  */
20
- async getReleaseCovers(releaseId, coverType) {
21
- const path = ['release', releaseId];
22
+ getReleaseCovers(releaseId, coverType) {
23
+ return this.getCovers(releaseId, 'release', coverType);
24
+ }
25
+ /**
26
+ * Fetch release-group
27
+ * @releaseGroupId Release-group MBID
28
+ * @param releaseGroupId MusicBrainz Release Group MBID
29
+ * @param coverType Cover type
30
+ */
31
+ getReleaseGroupCovers(releaseGroupId, coverType) {
32
+ return this.getCovers(releaseGroupId, 'release-group', coverType);
33
+ }
34
+ /**
35
+ * Fetch covers
36
+ * @releaseId MBID
37
+ * @param releaseId MusicBrainz Release Group MBID
38
+ * @param releaseType Fetch covers for specific release or release-group
39
+ * @param coverType Cover type
40
+ */
41
+ async getCovers(releaseId, releaseType = 'release', coverType) {
42
+ const path = [releaseType, releaseId];
22
43
  if (coverType) {
23
44
  path.push(coverType);
24
45
  }
@@ -46,7 +46,7 @@ export type IFormData = {
46
46
  [key: string]: string | number;
47
47
  };
48
48
  export interface IMusicBrainzConfig {
49
- botAccount: {
49
+ botAccount?: {
50
50
  username?: string;
51
51
  password?: string;
52
52
  };
@@ -71,7 +71,6 @@ export interface ISessionInformation {
71
71
  loggedIn?: boolean;
72
72
  }
73
73
  export declare class MusicBrainzApi {
74
- private static escapeText;
75
74
  readonly config: IMusicBrainzConfig;
76
75
  private rateLimiter;
77
76
  private options;
@@ -82,7 +81,7 @@ export declare class MusicBrainzApi {
82
81
  constructor(_config?: IMusicBrainzConfig);
83
82
  restGet<T>(relUrl: string, query?: {
84
83
  [key: string]: any;
85
- }, attempt?: number): Promise<T>;
84
+ }): Promise<T>;
86
85
  /**
87
86
  * Lookup entity
88
87
  * @param entity 'area', 'artist', collection', 'instrument', 'label', 'place', 'release', 'release-group', 'recording', 'series', 'work', 'url' or 'event'
@@ -164,9 +163,8 @@ export declare class MusicBrainzApi {
164
163
  * Add ISRC to recording
165
164
  * @param recording Recording to update
166
165
  * @param isrc ISRC code to add
167
- * @param editNote Edit note
168
166
  */
169
- addIsrc(recording: mb.IRecording, isrc: string, editNote?: string): Promise<void>;
167
+ addIsrc(recording: mb.IRecording, isrc: string): Promise<void>;
170
168
  /**
171
169
  * Add Spotify-ID to MusicBrainz recording.
172
170
  * This function will automatically lookup the recording title, which is required to submit the recording URL
@@ -14,35 +14,6 @@ export * from './musicbrainz.types.js';
14
14
  import { promisify } from 'util';
15
15
  const debug = Debug('musicbrainz-api');
16
16
  export class MusicBrainzApi {
17
- static escapeText(text) {
18
- let str = '';
19
- for (const chr of text) {
20
- // Escaping Special Characters: + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
21
- // ToDo: && ||
22
- switch (chr) {
23
- case '+':
24
- case '-':
25
- case '!':
26
- case '(':
27
- case ')':
28
- case '{':
29
- case '}':
30
- case '[':
31
- case ']':
32
- case '^':
33
- case '"':
34
- case '~':
35
- case '*':
36
- case '?':
37
- case ':':
38
- case '\\':
39
- case '/':
40
- str += '\\';
41
- }
42
- str += chr;
43
- }
44
- return str;
45
- }
46
17
  static fetchCsrf(html) {
47
18
  return {
48
19
  sessionKey: MusicBrainzApi.fetchValue(html, 'csrf_session_key'),
@@ -56,15 +27,13 @@ export class MusicBrainzApi {
56
27
  if (pos >= 0) {
57
28
  pos += 7;
58
29
  const endValuePos = html.indexOf('"', pos);
59
- const value = html.substring(pos, endValuePos);
60
- return value;
30
+ return html.substring(pos, endValuePos);
61
31
  }
62
32
  }
63
33
  }
64
34
  constructor(_config) {
65
35
  this.config = {
66
- baseUrl: 'https://musicbrainz.org',
67
- botAccount: {}
36
+ baseUrl: 'https://musicbrainz.org'
68
37
  };
69
38
  Object.assign(this.config, _config);
70
39
  const cookieJar = new CookieJar();
@@ -82,7 +51,7 @@ export class MusicBrainzApi {
82
51
  };
83
52
  this.rateLimiter = new RateLimitThreshold(15, 18);
84
53
  }
85
- async restGet(relUrl, query = {}, attempt = 1) {
54
+ async restGet(relUrl, query = {}) {
86
55
  query.fmt = 'json';
87
56
  const delay = await this.rateLimiter.limit();
88
57
  debug(`Client side rate limiter activated: cool down for ${Math.round(delay / 100) / 10} s...`);
@@ -151,8 +120,9 @@ export class MusicBrainzApi {
151
120
  } while (n++ < 5);
152
121
  }
153
122
  async login() {
154
- assert.ok(this.config.botAccount.username, 'bot username should be set');
155
- assert.ok(this.config.botAccount.password, 'bot password should be set');
123
+ var _a, _b;
124
+ assert.ok((_a = this.config.botAccount) === null || _a === void 0 ? void 0 : _a.username, 'bot username should be set');
125
+ assert.ok((_b = this.config.botAccount) === null || _b === void 0 ? void 0 : _b.password, 'bot password should be set');
156
126
  if (this.session && this.session.loggedIn) {
157
127
  for (const cookie of await this.getCookies(this.options.prefixUrl)) {
158
128
  if (cookie.key === 'remember_login') {
@@ -208,12 +178,13 @@ export class MusicBrainzApi {
208
178
  * @param formData
209
179
  */
210
180
  async editEntity(entity, mbid, formData) {
181
+ var _a, _b;
211
182
  await this.rateLimiter.limit();
212
183
  this.session = await this.getSession();
213
184
  formData.csrf_session_key = this.session.csrf.sessionKey;
214
185
  formData.csrf_token = this.session.csrf.token;
215
- formData.username = this.config.botAccount.username;
216
- formData.password = this.config.botAccount.password;
186
+ formData.username = (_a = this.config.botAccount) === null || _a === void 0 ? void 0 : _a.username;
187
+ formData.password = (_b = this.config.botAccount) === null || _b === void 0 ? void 0 : _b.password;
217
188
  formData.remember_me = 1;
218
189
  const response = await got.post(`${entity}/${mbid}/edit`, {
219
190
  ...this.options,
@@ -250,9 +221,8 @@ export class MusicBrainzApi {
250
221
  * Add ISRC to recording
251
222
  * @param recording Recording to update
252
223
  * @param isrc ISRC code to add
253
- * @param editNote Edit note
254
224
  */
255
- async addIsrc(recording, isrc, editNote = '') {
225
+ async addIsrc(recording, isrc) {
256
226
  const formData = {};
257
227
  formData[`edit-recording.name`] = recording.title; // Required
258
228
  if (!recording.isrcs) {
@@ -286,7 +256,7 @@ export class MusicBrainzApi {
286
256
  async getSession() {
287
257
  const response = await got.get('login', {
288
258
  ...this.options,
289
- followRedirect: false,
259
+ followRedirect: false, // Disable redirects
290
260
  responseType: 'text'
291
261
  });
292
262
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musicbrainz-api",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "MusicBrainz API client for reading and submitting metadata",
5
5
  "exports": "./lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -34,7 +34,6 @@
34
34
  "download covers"
35
35
  ],
36
36
  "license": "MIT",
37
- "private": false,
38
37
  "engines": {
39
38
  "node": "^14.13.1 || >=16.0.0"
40
39
  },
@@ -51,7 +50,7 @@
51
50
  "@types/uuid": "^9.0.0",
52
51
  "caseless": "^0.12.0",
53
52
  "debug": "^4.3.4",
54
- "got": "^13.0.0",
53
+ "got": "^14.2.1",
55
54
  "http-status-codes": "^2.1.4",
56
55
  "json-stringify-safe": "^5.0.1",
57
56
  "jsontoxml": "^1.0.1",
@@ -67,14 +66,14 @@
67
66
  "@types/node": "^20.8.10",
68
67
  "@typescript-eslint/eslint-plugin": "^5.13.0",
69
68
  "@typescript-eslint/parser": "^5.13.0",
70
- "c8": "^8.0.1",
71
- "chai": "^4.2.0",
69
+ "c8": "^9.1.0",
70
+ "chai": "^5.1.0",
72
71
  "del-cli": "^5.0.0",
73
72
  "eslint": "^8.10.0",
74
73
  "eslint-config-prettier": "^9.0.0",
75
74
  "eslint-import-resolver-typescript": "^3.3.0",
76
75
  "eslint-plugin-import": "^2.25.4",
77
- "eslint-plugin-jsdoc": "^46.8.2",
76
+ "eslint-plugin-jsdoc": "^48.2.2",
78
77
  "eslint-plugin-node": "^11.1.0",
79
78
  "eslint-plugin-unicorn": "^49.0.0",
80
79
  "mocha": "^10.1.0",
@@ -111,5 +110,6 @@
111
110
  "text"
112
111
  ],
113
112
  "report-dir": "coverage"
114
- }
113
+ },
114
+ "packageManager": "yarn@4.1.1"
115
115
  }