musicbrainz-api
Version:
MusicBrainz API client for reading and submitting metadata
110 lines • 3.9 kB
JavaScript
/* eslint-disable-next-line */
import { HttpClient } from "./http-client.js";
export class CoverArtArchiveApi {
constructor() {
this.httpClient = new HttpClient({ baseUrl: 'https://coverartarchive.org', userAgent: 'Node.js musicbrains-api', timeout: 2000, followRedirects: false });
}
async getJson(path) {
const response = await this.httpClient.get(path, {
headers: {
Accept: "application/json"
}
});
const contentType = response.headers.get("Content-Type");
if (response.status === 404 && contentType?.toLowerCase() !== "application/json") {
return {
"error": "Not Found",
"help": "For usage, please see: https://musicbrainz.org/development/mmd"
};
}
return response.json();
}
async getCoverRedirect(path) {
const response = await this.httpClient.get(path, {
followRedirects: false
});
switch (response.status) {
case 307:
return response.headers.get('LOCATION');
case 400:
throw new Error('Invalid UUID');
case 404:
// No release with this MBID
return null;
case 405:
throw new Error('Invalid HTTP method');
case 503:
return null;
default:
throw new Error(`Unexpected HTTP-status response: ${response.status}`);
}
}
/**
* Fetch release
* @releaseId Release MBID
* @param releaseId MusicBrainz Release MBID
*/
getReleaseCovers(releaseId) {
return this.getCovers(releaseId, 'release');
}
/**
* Fetch release-group
* @releaseGroupId Release-group MBID
* @param releaseGroupId MusicBrainz Release Group MBID
*/
getReleaseGroupCovers(releaseGroupId) {
return this.getCovers(releaseGroupId, 'release-group');
}
/**
* Fetch release cover
* @releaseId Release MBID
* @param releaseId MusicBrainz Release MBID
* @param coverType Front or back cover
*/
getReleaseCover(releaseId, coverType) {
return this.getCover(releaseId, 'release', coverType);
}
/**
* Fetch release-group cover
* @releaseId Release-group MBID
* @param releaseGroupId MusicBrainz Release-group MBID
* @param coverType Front or back cover
*/
getReleaseGroupCover(releaseGroupId, coverType) {
return this.getCover(releaseGroupId, 'release-group', coverType);
}
static makePath(releaseId, releaseType = 'release', coverType) {
const path = [releaseType, releaseId];
if (coverType) {
path.push(coverType);
}
return `/${path.join('/')}`;
}
/**
* Fetch covers
* @releaseId MBID
* @param releaseId MusicBrainz Release Group MBID
* @param releaseType Fetch covers for specific release or release-group
* @param coverType Cover type
*/
async getCovers(releaseId, releaseType = 'release') {
const info = await this.getJson(CoverArtArchiveApi.makePath(releaseId, releaseType));
// Hack to correct http addresses into https
if (info.release?.startsWith('http:')) {
info.release = `https${info.release.substring(4)}`;
}
return info;
}
/**
* Fetch covers
* @releaseId MBID
* @param releaseId MusicBrainz Release Group MBID
* @param releaseType Fetch covers for specific release or release-group
* @param coverType Cover type
*/
async getCover(releaseId, releaseType = 'release', coverType) {
const url = await this.getCoverRedirect(CoverArtArchiveApi.makePath(releaseId, releaseType, coverType));
return { url: url };
}
}
//# sourceMappingURL=coverartarchive-api.js.map