Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

musicbrainz-api

Package Overview
Dependencies
Maintainers
0
Versions
37
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

musicbrainz-api

MusicBrainz API client for reading and submitting metadata

  • 0.18.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
419
decreased by-31.2%
Maintainers
0
Weekly downloads
 
Created
Source

Node.js CI CodeQL NPM version npm downloads Coverage Status Codacy Badge Known Vulnerabilities DeepScan grade Discord bundlejs.com badge

musicbrainz-api

A MusicBrainz-API-client for reading and submitting metadata

Features

  • Access metadata from MusicBrainz
  • Submit metadata
  • Smart and adjustable throttling, like MusicBrainz, it allows a bursts of requests
  • Build in TypeScript definitions

Compatibility

Module: Pure ECMAScript Module (ESM). The distributed JavaScript codebase is compliant with the ECMAScript 2020 (11th Edition) standard.

This module requires a Node.js ≥ 20 engine.

[!NOTE] We are looking into making this package usable in the browser as well.

Sponsor

If you appreciate my work and want to support the development of open-source projects like musicbrainz-api, music-metadata, file-type, listFix(), lizzy, strtok3, or tokenizer-s3, please consider becoming a sponsor or making a small contribution. Your support helps sustain ongoing development and improvements. Become a sponsor to Borewit

This package is currently only developed for the use in a node.js environment. We are looking into making this package usable in the browser as well.

Before using this library

MusicBrainz asks that you to identify your application by filling in the 'User-Agent' Header. By passing appName, appVersion, appMail musicbrainz-api takes care of that.

Submitting metadata

If you plan to use this module for submitting metadata, please ensure you comply with the MusicBrainz Code of conduct/Bots.

Example

Example, how to import 'musicbrainz-api:

import {MusicBrainzApi} from 'musicbrainz-api';

const mbApi = new MusicBrainzApi({
  appName: 'my-app',
  appVersion: '0.1.0',
  appContactInfo: 'user@mail.org'
});

The following configuration settings can be passed

import {MusicBrainzApi} from 'musicbrainz-api';

const config = {
  // MusicBrainz bot account username & password (optional)
  botAccount: { 
    username: 'myUserName_bot',
    password: 'myPassword' 
  },
  
  // API base URL, default: 'https://musicbrainz.org' (optional)
  baseUrl: 'https://musicbrainz.org',

  appName: 'my-app',
  appVersion: '0.1.0',

  // Optional, default: no proxy server
  proxy: {
    host: 'localhost',
    port: 8888
   },

  // Your e-mail address, required for submitting ISRCs
  appMail: string,

  // Helpful if you have your own MusicBrainz server, default: false (optional)
  disableRateLimiting: false,
}

const mbApi = new MusicbrainzApi(config);

Lookup MusicBrainz Entities

MusicBrainz API documentation: XML Web Service/Version 2 Lookups

Generic lookup function

Arguments:

  • entity: 'area' | 'artist' | 'collection' | 'instrument' | 'label' | 'place' | 'release' | 'release-group' | 'recording' | 'series' | 'work' | 'url' | 'event'
  • MBID (MusicBrainz identifier)
  • query
const artist = await mbApi.lookup('artist', 'ab2528d9-719f-4261-8098-21849222a0f2');
Query argumentQuery value
query.collectionCollection MBID

Browse artist

const artists = await mbApi.browse('artist', query);
Query argumentQuery value
query.areaArea MBID
query.collectionCollection MBID
query.recordingRecording MBID
query.releaseRelease MBID
query.release-groupRelease-group MBID
query.workWork MBID

Browse collection

const collections = await mbApi.browse('collection', query);
Query argumentQuery value
query.areaArea MBID
query.artistArtist MBID
query.editorEditor MBID
query.eventEvent MBID
query.labelLabel MBID
query.placePlace MBID
query.recordingRecording MBID
query.releaseRelease MBID
query.release-groupRelease-group MBID
query.workWork MBID

Browse events

const events = await mbApi.browse('event', query);
Query argumentQuery value
query.areaArea MBID
query.artistArtist MBID
query.collectionCollection MBID
query.placePlace MBID

Browse instruments

const instruments = await mbApi.browse('event', query);
Query argumentQuery value
query.collectionCollection MBID

Browse labels

const labels = await mbApi.browse('label', query);
Query argumentQuery value
query.areaArea MBID
query.collectionCollection MBID
query.releaseRelease MBID

Browse places

const places = await mbApi.browse('place', query);
Query argumentQuery value
query.areaArea MBID
query.collectionCollection MBID

Browse recordings

const recordings = await mbApi.browse('recording', query);
Query argumentQuery value
query.artistArea MBID
query.collectionCollection MBID
query.releaseRelease MBID
query.workWork MBID

Browse releases

const releases = await mbApi.browse('release', query);
Query argumentQuery value
query.areaArea MBID
query.artistArtist MBID
query.editorEditor MBID
query.eventEvent MBID
query.labelLabel MBID
query.placePlace MBID
query.recordingRecording MBID
query.releaseRelease MBID
query.release-groupRelease-group MBID
query.workWork MBID

Browse release-groups

const releaseGroups = await mbApi.browse('release-group',query);
Query argumentQuery value
query.artistArtist MBID
query.collectionCollection MBID
query.releaseRelease MBID

Browse series

const series = await mbApi.browse('series');
Query argumentQuery value
query.areaArea MBID
query.artistArtist MBID
query.editorEditor MBID
query.eventEvent MBID
query.labelLabel MBID
query.placePlace MBID
query.recordingRecording MBID
query.releaseRelease MBID
query.release-groupRelease-group MBID
query.workWork MBID

Browse works

const works = await mbApi.browse('work');
Query argumentQuery value
query.artistArtist MBID
query.xollectionCollection MBID

Browse urls

const urls = await mbApi.browse('url');
Query argumentQuery value
query.artistArtist MBID
query.xollectionCollection MBID

Search (query)

Implements XML Web Service/Version 2/Search.

There are different search fields depending on the entity.

Search function

Searches can be performed using the generic search function: query(entity: mb.EntityType, query: string | IFormData, offset?: number, limit?: number): Promise<entity>

Arguments:

  • Entity type, which can be one of:
  • query {query: string, offset: number, limit: number}
    • query.query: supports the full Lucene Search syntax; you can find a detailed guide at Lucene Search Syntax. For example, you can set conditions while searching for a name with the AND operator.
    • query.offset: optional, return search results starting at a given offset. Used for paging through more than one page of results.
    • limit.query: optional, an integer value defining how many entries should be returned. Only values between 1 and 100 (both inclusive) are allowed. If not given, this defaults to 25.

For example, to find any recordings of 'We Will Rock You' by Queen:

const query = 'query="We Will Rock You" AND arid:0383dadf-2a4e-4d10-a46a-e9e041da8eb3';
const result = await mbApi.search('release-group', {query});
Example: search Île-de-France
 mbApi.search('area', 'Île-de-France');
Example: search release by barcode

Search a release with the barcode 602537479870:

 mbApi.search('release', {query: {barcode: 602537479870}});
Example: search by object

Same as previous example, but automatically serialize parameters to search query

 mbApi.search('release', 'barcode: 602537479870');
Example: search artist by artist name

Search artist:

const result = await mbApi.search('artist', {query: 'Stromae'});
Example: search release-group by artist name

Search release-group:

const result = await mbApi.search('release-group', {query: 'Racine carrée'});
Example: search release-group by release-group and an artist

Search a combination of a release-group and an artist.

const result = await mbApi.search('release-group', {artist: 'Racine carrée', releasegroup: 'Stromae'});

Submitting data via XML POST

Submitting data via XML POST may be done using personal MusicBrainz credentials.

Submit ISRC code using XML POST

Using the XML ISRC submission API.

const mbid_Formidable = '16afa384-174e-435e-bfa3-5591accda31c';
const isrc_Formidable = 'BET671300161';

const xmlMetadata = new XmlMetadata();
const xmlRecording = xmlMetadata.pushRecording(mbid_Formidable);
xmlRecording.isrcList.pushIsrc(isrc_Formidable);
await mbApi.post('recording', xmlMetadata);

Submitting data via user form-data

For all of the following function you need to use a dedicated bot account.

Submitting ISRC via post user form-data

Use with caution, and only on a test server, it may clear existing metadata has side effect.


const mbid_Formidable = '16afa384-174e-435e-bfa3-5591accda31c';
const isrc_Formidable = 'BET671300161';

    
const recording = await mbApi.lookup('recording', mbid_Formidable);

// Authentication the http-session against MusicBrainz (as defined in config.baseUrl)
const succeed = await mbApi.login();
assert.isTrue(succeed, 'Login successful');

// To submit the ISRC, the `recording.id` and `recording.title` are required
await mbApi.addIsrc(recording, isrc_Formidable);

Submit recording URL

const recording = await mbApi.lookup('recording', '16afa384-174e-435e-bfa3-5591accda31c');

const succeed = await mbApi.login();
assert.isTrue(succeed, 'Login successful');

await mbApi.addUrlToRecording(recording, {
  linkTypeId: LinkType.stream_for_free,
  text: 'https://open.spotify.com/track/2AMysGXOe0zzZJMtH3Nizb'
});

Actually a Spotify-track-ID can be submitted easier:

const recording = await mbApi.lookup('recording', '16afa384-174e-435e-bfa3-5591accda31c');

const succeed = await mbApi.login();
assert.isTrue(succeed, 'Login successful');
await mbApi.addSpotifyIdToRecording(recording, '2AMysGXOe0zzZJMtH3Nizb');

Cover Art Archive API

Implementation of the Cover Art Archive API.

Release Cover Art

import { CoverArtArchiveApi } from 'musicbrainz-api';

const coverArtArchiveApiClient = new CoverArtArchiveApi();

async function getReleaseCoverArt(releaseMbid, coverType = '') {
    try {
        const coverInfo = await coverArtArchiveApiClient.getReleaseCovers(releaseMbid, coverType);
        console.log(`Cover info for ${coverType || 'all covers'}`, coverInfo);
    } catch (error) {
        console.error(`Failed to fetch ${coverType || 'all covers'}:`, error);
    }
}

(async () => {
    const releaseMbid = 'your-release-mbid-here';  // Replace with actual MBID
    await getReleaseCoverArt(releaseMbid); // Get all covers
    await getReleaseCoverArt(releaseMbid, 'front'); // Get best front cover
    await getReleaseCoverArt(releaseMbid, 'back'); // Get best back cover
})();

Release Group Cover Art

import { CoverArtArchiveApi } from 'musicbrainz-api';

const coverArtArchiveApiClient = new CoverArtArchiveApi();

async function getCoverArt(releaseGroupMbid, coverType = '') {
    try {
        const coverInfo = await coverArtArchiveApiClient.getReleaseGroupCovers(releaseGroupMbid, coverType);
        console.log(`Cover info for ${coverType || 'all covers'}`, coverInfo);
    } catch (error) {
        console.error(`Failed to fetch ${coverType || 'all covers'}:`, error);
    }
}

(async () => {
    const releaseGroupMbid = 'your-release-group-mbid-here';  // Replace with actual MBID
    await getCoverArt(releaseGroupMbid); // Get all covers
    await getCoverArt(releaseGroupMbid, 'front'); // Get best front cover
    await getCoverArt(releaseGroupMbid, 'back'); // Get best back cover
})();

Compatibility

The JavaScript in runtime is compliant with ECMAScript 2017 (ES8). Requires Node.js® version 6 or higher.

Keywords

FAQs

Package last updated on 26 Aug 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc