UNPKG

musicbrainz-api

Version:

MusicBrainz API client for reading and submitting metadata

110 lines 3.9 kB
/* 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