{"id":17968424,"url":"https://github.com/borewit/musicbrainz-api","last_synced_at":"2025-04-05T11:08:57.662Z","repository":{"id":34062880,"uuid":"167720731","full_name":"Borewit/musicbrainz-api","owner":"Borewit","description":"Node MusicBrainz API client for reading and submitting metadata","archived":false,"fork":false,"pushed_at":"2024-04-08T18:33:55.000Z","size":2963,"stargazers_count":136,"open_issues_count":11,"forks_count":42,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-04-14T12:58:57.395Z","etag":null,"topics":["api","meta","metadata","musicbrainz","picard","tags"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Borewit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-01-26T17:59:31.000Z","updated_at":"2024-04-22T19:26:34.538Z","dependencies_parsed_at":"2023-11-22T19:25:19.979Z","dependency_job_id":"3a58d40a-dbcc-452c-adca-eed908c8860d","html_url":"https://github.com/Borewit/musicbrainz-api","commit_stats":{"total_commits":382,"total_committers":20,"mean_commits":19.1,"dds":0.5890052356020943,"last_synced_commit":"56481ea76f688579b36f2e4e33a40b233db7aa6e"},"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Borewit%2Fmusicbrainz-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Borewit%2Fmusicbrainz-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Borewit%2Fmusicbrainz-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Borewit%2Fmusicbrainz-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Borewit","download_url":"https://codeload.github.com/Borewit/musicbrainz-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247325693,"owners_count":20920714,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","meta","metadata","musicbrainz","picard","tags"],"created_at":"2024-10-29T14:21:19.373Z","updated_at":"2025-04-05T11:08:57.646Z","avatar_url":"https://github.com/Borewit.png","language":"TypeScript","funding_links":["https://github.com/sponsors/Borewit","https://www.buymeacoffee.com/borewit"],"categories":[],"sub_categories":[],"readme":"[![Node.js CI](https://github.com/Borewit/musicbrainz-api/actions/workflows/nodejs-ci.yml/badge.svg)](https://github.com/Borewit/musicbrainz-api/actions/workflows/nodejs-ci.yml)\n[![CodeQL](https://github.com/Borewit/musicbrainz-api/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/Borewit/musicbrainz-api/actions/workflows/github-code-scanning/codeql)\n[![NPM version](https://img.shields.io/npm/v/musicbrainz-api.svg)](https://npmjs.org/package/musicbrainz-api)\n[![npm downloads](http://img.shields.io/npm/dm/musicbrainz-api.svg)](https://npmcharts.com/compare/musicbrainz-api?interval=30\u0026start=365)\n[![Coverage Status](https://coveralls.io/repos/github/Borewit/musicbrainz-api/badge.svg?branch=master)](https://coveralls.io/github/Borewit/musicbrainz-api?branch=master)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/2bc47b2006454bae8c737991f152e518)](https://app.codacy.com/gh/Borewit/musicbrainz-api/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![Known Vulnerabilities](https://snyk.io/test/github/Borewit/musicbrainz-api/badge.svg?targetFile=package.json)](https://snyk.io/test/github/Borewit/musicbrainz-api?targetFile=package.json)\n[![DeepScan grade](https://deepscan.io/api/teams/5165/projects/6991/branches/63373/badge/grade.svg)](https://deepscan.io/dashboard#view=project\u0026tid=5165\u0026pid=6991\u0026bid=63373)\n[![Discord](https://img.shields.io/discord/460524735235883049.svg)](https://discord.gg/958xT5X)\n[![bundlejs.com badge](https://deno.bundlejs.com/?q=musicbrainz-api\u0026badge)](https://bundlejs.com/?q=musicbrainz-api)\n\n# musicbrainz-api\n\nA MusicBrainz-API-client for reading and submitting metadata.\n\n\u003cimg src=\"doc/musicbrainz-api-logo.png\" width=\"40%\" style=\"center\"\u003e\u003c/img\u003e\n\n## Features\n- **Access Metadata**: Retrieve detailed metadata from the [MusicBrainz database](https://musicbrainz.org/).\n- **Submit metadata**: Easily submit new metadata to [MusicBrainz](https://musicbrainz.org/). \n- **Smart throttling**: Implements intelligent throttling, allowing bursts of requests while adhering to [MusicBrainz rate limits](https://musicbrainz.org/doc/MusicBrainz_API/Rate_Limiting).\n- **TypeScript Definitions**: Fully typed with built-in [TypeScript](https://www.typescriptlang.org/) definitions for a seamless development experience.\n\n## Compatibility\n\nModule: version 8 migrated from [CommonJS](https://en.wikipedia.org/wiki/CommonJS) to [pure ECMAScript Module (ESM)](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c).\nThe distributed JavaScript codebase is compliant with the [ECMAScript 2020 (11th Edition)](https://en.wikipedia.org/wiki/ECMAScript_version_history#11th_Edition_%E2%80%93_ECMAScript_2020) standard.\n\n\u003e [!NOTE]\n\u003e See also [CommonJS backward compatibility](#commonjs-backward-compatibility)\n\n### Requirements\n- Node.js: Requires [Node.js version 16](https://nodejs.org/en/about/previous-releases) or higher.\n- Browser: Can be used in browser environments when bundled with a module bundler (not actively tested).\n\n\u003e [!NOTE]\n\u003e We are looking into making this package usable in the browser as well.\n\n## Support the Project\nIf you find this project useful and would like to support its development, consider sponsoring or contributing:\n \n- [Become a sponsor to Borewit](https://github.com/sponsors/Borewit)\n \n- Buy me a coffee:\n  \n  \u003ca href=\"https://www.buymeacoffee.com/borewit\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/default-orange.png\" alt=\"Buy me A coffee\" height=\"41\" width=\"174\"\u003e\u003c/a\u003e\n\n## Getting Started\n\n### Identifying Your Application\n\nMusicBrainz requires all API clients to [identify their application](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2#User%20Data).\nEnsure you set the User-Agent header by providing `appName`, `appVersion`, and `appContactInfo` when configuring the client.\nThis library will automatically handle this for you.\n\n### Submitting metadata\n\nIf you plan to use this module for submitting metadata, please ensure you comply with [the MusicBrainz Code of conduct/Bots](https://wiki.musicbrainz.org/Code_of_Conduct/Bots).\n\n## Example Usage\n\n### Importing the Library\n\n```js\nimport { MusicBrainzApi } from 'musicbrainz-api';\n\nconst mbApi = new MusicBrainzApi({\n    appName: 'my-app',\n    appVersion: '0.1.0',\n    appContactInfo: 'user@mail.org',\n});\n```\n\n\u003e [!NOTE]\n\u003e See also [CommonJS backward compatibility](#commonjs-backward-compatibility)\n\n### Configuration Options\n\n```js\nconst config = {\n    // Optional: MusicBrainz bot account credentials\n    botAccount: {\n        username: 'myUserName_bot',\n        password: 'myPassword',\n    },\n\n    // Optional: API base URL (default: 'https://musicbrainz.org')\n    baseUrl: 'https://musicbrainz.org',\n\n    // Required: Application details\n    appName: 'my-app',\n    appVersion: '0.1.0',\n    appMail: 'user@mail.org',\n\n    // Optional: Proxy settings (default: no proxy server)\n    proxy: {\n        host: 'localhost',\n        port: 8888,\n    },\n\n    // Optional: Disable rate limiting (default: false)\n    disableRateLimiting: false,\n};\n\nconst mbApi = new MusicBrainzApi(config);\n```\n\n## Accessing MusicBrainz Data\n\nThe MusicBrainz API allows you to look up various entities. Here’s how to use the lookup function:\n\n## Lookup MusicBrainz Entities\n\nMusicBrainz API documentation: [XML Web Service/Version 2 Lookups](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2#Lookups)\n\n### Lookup Function\n\n```js\nconst artist = await mbApi.lookup('artist', 'ab2528d9-719f-4261-8098-21849222a0f2');\n```\n\nArguments:\n- entity: `'area'` | `'artist'` | `'collection'` | `'instrument'` | `'label'` | `'place'` | `'release'` | `'release-group'` | `'recording'` | `'series'` | `'work'` | `'url'` | `'event'`\n- MBID [(MusicBrainz identifier)](https://wiki.musicbrainz.org/MusicBrainz_Identifier)\n- query\n\n\n| Query argument        | Query value     | \n|-----------------------|-----------------|  \n| `query.collection`    | Collection MBID |\n\n### Browse artist\n\n```js\nconst artists = await mbApi.browse('artist', query);\n````\n\n| Query argument        | Query value        | \n|-----------------------|--------------------|  \n| `query.area`          | Area MBID          |\n| `query.collection`    | Collection MBID    |\n| `query.recording`     | Recording MBID     |\n| `query.release`       | Release MBID       |\n| `query.release-group` | Release-group MBID |\n| `query.work`          | Work MBID          |\n\n### Browse collection\n```js\nconst collections = await mbApi.browse('collection', query);\n````\n\n| Query argument        | Query value        | \n|-----------------------|--------------------|  \n| `query.area`          | Area MBID          |\n| `query.artist`        | Artist MBID        |\n| `query.editor`        | Editor MBID        |\n| `query.event`         | Event MBID         |\n| `query.label`         | Label MBID         |\n| `query.place`         | Place MBID         |\n| `query.recording`     | Recording MBID     |\n| `query.release`       | Release MBID       |\n| `query.release-group` | Release-group MBID |\n| `query.work`          | Work MBID          |\n\n### Browse events\n```js\nconst events = await mbApi.browse('event', query);\n````\n\n| Query argument        | Query value     | \n|-----------------------|-----------------|  \n| `query.area`          | Area MBID       |\n| `query.artist`        | Artist MBID     |\n| `query.collection`    | Collection MBID |\n| `query.place`         | Place MBID      |\n\n### Browse instruments\n```js\nconst instruments = await mbApi.browse('event', query);\n````\n\n| Query argument        | Query value        | \n|-----------------------|--------------------|  \n| `query.collection`    | Collection MBID    |\n\n### Browse labels\n```js\nconst labels = await mbApi.browse('label', query);\n````\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.area`       | Area MBID       |\n| `query.collection` | Collection MBID |\n| `query.release`    | Release MBID    |\n\n### Browse places\n```js\nconst places = await mbApi.browse('place', query);\n````\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.area`       | Area MBID       |\n| `query.collection` | Collection MBID |\n\n### Browse recordings\n```js\nconst recordings = await mbApi.browse('recording', query);\n````\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.artist`     | Area MBID       |\n| `query.collection` | Collection MBID |\n| `query.release`    | Release MBID    |\n| `query.work`       | Work MBID       |\n\n### Browse releases\n```js\nconst releases = await mbApi.browse('release', query);\n````\n\n| Query argument        | Query value        | \n|-----------------------|--------------------|  \n| `query.area`          | Area MBID          |\n| `query.artist`        | Artist MBID        |\n| `query.editor`        | Editor MBID        |\n| `query.event`         | Event MBID         |\n| `query.label`         | Label MBID         |\n| `query.place`         | Place MBID         |\n| `query.recording`     | Recording MBID     |\n| `query.release`       | Release MBID       |\n| `query.release-group` | Release-group MBID |\n| `query.work`          | Work MBID          |\n\n### Browse release-groups\n```js\nconst releaseGroups = await mbApi.browse('release-group',query);\n```\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.artist`     | Artist MBID     |\n| `query.collection` | Collection MBID |\n| `query.release`    | Release MBID    |\n\n### Browse series\n```js\nconst series = await mbApi.browse('series');\n````\n\n| Query argument        | Query value        | \n|-----------------------|--------------------|  \n| `query.area`          | Area MBID          |\n| `query.artist`        | Artist MBID        |\n| `query.editor`        | Editor MBID        |\n| `query.event`         | Event MBID         |\n| `query.label`         | Label MBID         |\n| `query.place`         | Place MBID         |\n| `query.recording`     | Recording MBID     |\n| `query.release`       | Release MBID       |\n| `query.release-group` | Release-group MBID |\n| `query.work`          | Work MBID          |\n\n### Browse works\n```js\nconst works = await mbApi.browse('work');\n````\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.artist`     | Artist MBID     |\n| `query.xollection` | Collection MBID |\n\n### Browse urls\n```js\nconst urls = await mbApi.browse('url');\n````\n\n| Query argument     | Query value     | \n|--------------------|-----------------|  \n| `query.artist`     | Artist MBID     |\n| `query.xollection` | Collection MBID |\n\n## Search (query)\n\nImplements [XML Web Service/Version 2/Search](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search).\n\nThere are different search fields depending on the entity.\n\n### Search function\n\nSearches can be performed using the generic search function: `query(entity: mb.EntityType, query: string | IFormData, offset?: number, limit?: number): Promise\u003centity\u003e`\n\nArguments:\n- Entity type, which can be one of:\n  - `artist`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Artist)\n  - `label`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Label)\n  - `recording`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Recording)\n  - `release`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Release)\n  - `release-group`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Release_Group)\n  - `work`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Work)\n  - `area`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#Area)\n  - `url`: [search fields](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2/Search#URL)\n- `query {query: string, offset: number, limit: number}`\n  - `query.query`: supports the full Lucene Search syntax; you can find a detailed guide at [Lucene Search Syntax](https://lucene.apache.org/core/4_3_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description). For example, you can set conditions while searching for a name with the AND operator.\n  - `query.offset`: optional, return search results starting at a given offset. Used for paging through more than one page of results.\n  - `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.\n\nFor example, to search for _release-group_: _\"We Will Rock You\"_ by _Queen_:\n```js\nconst query = 'query=artist:\"Queen\" AND release:\"We Will Rock You\"';\nconst result = await mbApi.search('release-group', {query});\n```\n\n##### Example: search Île-de-France\n\n```js\n mbApi.search('area', 'Île-de-France');\n````\n\n##### Example: search release by barcode\n\nSearch a release with the barcode 602537479870:\n```js\n mbApi.search('release', {query: {barcode: 602537479870}});\n````\n\n##### Example: search by object\n\nSame as previous example, but automatically serialize parameters to search query\n```js\n mbApi.search('release', 'barcode: 602537479870');\n````\n\n##### Example: search artist by artist name\n\nSearch artist:\n```js\nconst result = await mbApi.search('artist', {query: 'Stromae'});\n```\n\n##### Example: search release-group by artist name\n\nSearch release-group:\n```js\nconst result = await mbApi.search('release-group', {query: 'Racine carrée'});\n```\n\n##### Example: search release-group by release-group and an artist\n\nSearch a combination of a release-group and an artist.\n```js\nconst result = await mbApi.search('release-group', {artist: 'Racine carrée', releasegroup: 'Stromae'});\n```\n\n# Submitting data via XML POST\n\n[Submitting data via XML POST](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2#Submitting_data) may be done using personal MusicBrainz credentials. \n\n## Submit ISRC code using XML POST\n\nUsing the [XML ISRC submission](https://wiki.musicbrainz.org/Development/XML_Web_Service/Version_2#ISRC_submission) API.\n\n```js\nconst mbid_Formidable = '16afa384-174e-435e-bfa3-5591accda31c';\nconst isrc_Formidable = 'BET671300161';\n\nconst xmlMetadata = new XmlMetadata();\nconst xmlRecording = xmlMetadata.pushRecording(mbid_Formidable);\nxmlRecording.isrcList.pushIsrc(isrc_Formidable);\nawait mbApi.post('recording', xmlMetadata);\n```    \n    \n# Submitting data via user form-data\n\nFor all of the following function you need to use a dedicated bot account. \n\n## Submitting ISRC via post user form-data\n\nUse with caution, and only on a test server, it may clear existing metadata has side effect.\n      \n```js\n\nconst mbid_Formidable = '16afa384-174e-435e-bfa3-5591accda31c';\nconst isrc_Formidable = 'BET671300161';\n\n    \nconst recording = await mbApi.lookup('recording', mbid_Formidable);\n\n// Authentication the http-session against MusicBrainz (as defined in config.baseUrl)\nconst succeed = await mbApi.login();\nassert.isTrue(succeed, 'Login successful');\n\n// To submit the ISRC, the `recording.id` and `recording.title` are required\nawait mbApi.addIsrc(recording, isrc_Formidable);\n```\n\n### Submit recording URL\n\n```js\nconst recording = await mbApi.lookup('recording', '16afa384-174e-435e-bfa3-5591accda31c');\n\nconst succeed = await mbApi.login();\nassert.isTrue(succeed, 'Login successful');\n\nawait mbApi.addUrlToRecording(recording, {\n  linkTypeId: LinkType.stream_for_free,\n  text: 'https://open.spotify.com/track/2AMysGXOe0zzZJMtH3Nizb'\n});\n```\n\nActually a Spotify-track-ID can be submitted easier: \n```js\nconst recording = await mbApi.lookup('recording', '16afa384-174e-435e-bfa3-5591accda31c');\n\nconst succeed = await mbApi.login();\nassert.isTrue(succeed, 'Login successful');\nawait mbApi.addSpotifyIdToRecording(recording, '2AMysGXOe0zzZJMtH3Nizb');\n```\n\n## Cover Art Archive API\n\nThis library also supports the [Cover Art Archive API](https://musicbrainz.org/doc/Cover_Art_Archive/API).\n\n### Fetch Release Cover Art\n\n#### Fetch available cover art information\n\n```js\nimport { CoverArtArchiveApi } from 'musicbrainz-api';\n\nconst coverArtArchiveApiClient = new CoverArtArchiveApi();\n\nasync function fetchCoverArt(releaseMbid, coverType = '') {\n    const coverInfo = await coverArtArchiveApiClient.getReleaseCovers(releaseMbid);\n    for(const image of coverInfo.images) {\n        console.log(`Cover art front=${image.front} back=${image.back} url=${image.image}`);\n    }\n}\n\nfetchCoverArt('976e0677-a480-4a5e-a177-6a86c1900bbf').catch(error =\u003e {\n    console.error(`Failed to fetch cover art: ${error.message}`);\n})\n```\n\n#### Fetch front or back cover for a release\n```js\nimport { CoverArtArchiveApi } from 'musicbrainz-api';\n\nconst coverArtArchiveApiClient = new CoverArtArchiveApi();\n\nasync function fetchCoverArt(releaseMbid, coverType = '') {\n    const coverInfo = await coverArtArchiveApiClient.getReleaseCover(releaseMbid, 'front');\n    console.log(`Cover art url=${coverInfo.url}`);\n}\n\nfetchCoverArt('976e0677-a480-4a5e-a177-6a86c1900bbf').catch(error =\u003e {\n    console.error(`Failed to fetch cover art: ${error.message}`);\n})\n```\n\n### Release Group Cover Art\n```js\nimport { CoverArtArchiveApi } from 'musicbrainz-api';\n\nconst coverArtArchiveApiClient = new CoverArtArchiveApi();\n\nasync function fetchCoverArt(releaseMbid, coverType = '') {\n    const coverInfo = await coverArtArchiveApiClient.getReleaseGroupCovers(releaseMbid);\n    for(const image of coverInfo.images) {\n        console.log(`Cover art front=${image.front} back=${image.back} url=${image.image}`);\n    }\n}\n\nfetchCoverArt('976e0677-a480-4a5e-a177-6a86c1900bbf').catch(error =\u003e {\n    console.error(`Failed to fetch cover art: ${error.message}`);\n})\n```\n\n#### Fetch front or back cover for a release-group\n```js\nimport { CoverArtArchiveApi } from 'musicbrainz-api';\n\nconst coverArtArchiveApiClient = new CoverArtArchiveApi();\n\nasync function fetchCoverArt(releaseMbid, coverType = '') {\n    const coverInfo = await coverArtArchiveApiClient.getReleaseGroupCover(releaseMbid, 'front');\n    console.log(`Cover art url=${coverInfo.url}`);\n}\n\nfetchCoverArt('976e0677-a480-4a5e-a177-6a86c1900bbf').catch(error =\u003e {\n    console.error(`Failed to fetch cover art: ${error.message}`);\n})\n```\n\n## CommonJS backward compatibility\n\nI recommend CommonJS projects to consider upgrading their project to ECMAScript Module (ESM).\nPlease continue reading how to use **musicbrainz-api** in a CommonJS project.\n\nUsing Node.js ≥ 22, which is support loading ESM module via require, you can use:\n```js\nconst { MusicBrainzApi } = require('musicbrainz-api');\n```\n\nOther CommonJS projects have to use [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/import) to load the **musicbrainz-api** pure ESM module:\n```js\nasync function run() {\n  // Dynamically loads the ESM module in a CommonJS project  \n  const { MusicBrainzApi } = await import('musicbrainz-api');\n};\n\nrun();\n```\n\nThis is known not to work in TypeScript CommonJS projects, as the TypeScript compiler, in my opinion,\nincorrectly converts the [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/import) \nto `require()`. To perform the dynamic import in TypeScript, you can use [load-esm](https://github.com/Borewit/load-esm):\n\n```js\nimport {loadEsm} from 'load-esm';\n\nasync function run() {\n    // Dynamically loads the ESM module in a TypeScript CommonJS project  \n  const { MusicBrainzApi } = await loadEsm\u003ctypeof import('musicbrainz-api')\u003e('musicbrainz-api');\n};\n\nrun();\n```\n\n## Licence\n\nThis project is licensed under the [MIT License](LICENSE.txt). Feel free to use, modify, and distribute as needed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborewit%2Fmusicbrainz-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fborewit%2Fmusicbrainz-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborewit%2Fmusicbrainz-api/lists"}