musicbrainz-api 0.8.0 → 0.9.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.
Files changed (36) hide show
  1. package/.idea/$PRODUCT_WORKSPACE_FILE$ +1 -1
  2. package/.idea/misc.xml +6 -0
  3. package/.idea/modules.xml +7 -7
  4. package/.idea/vcs.xml +5 -5
  5. package/README.md +484 -311
  6. package/lib/digest-auth.d.ts +21 -21
  7. package/lib/digest-auth.js +82 -82
  8. package/lib/musicbrainz-api.d.ts +266 -174
  9. package/lib/musicbrainz-api.js +533 -418
  10. package/lib/musicbrainz.types.d.ts +584 -392
  11. package/lib/musicbrainz.types.js +16 -16
  12. package/lib/rate-limiter.d.ts +8 -8
  13. package/lib/rate-limiter.js +31 -31
  14. package/lib/xml/xml-isrc-list.d.ts +17 -17
  15. package/lib/xml/xml-isrc-list.js +22 -22
  16. package/lib/xml/xml-isrc.d.ts +10 -10
  17. package/lib/xml/xml-isrc.js +17 -17
  18. package/lib/xml/xml-metadata.d.ts +6 -6
  19. package/lib/xml/xml-metadata.js +29 -29
  20. package/lib/xml/xml-recording.d.ts +24 -24
  21. package/lib/xml/xml-recording.js +20 -20
  22. package/package.json +104 -106
  23. package/.idea/checkstyle-idea.xml +0 -16
  24. package/.idea/codeStyles/Project.xml +0 -38
  25. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  26. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  27. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_28-2-2022_22_59_[Default_Changelist]/shelved.patch +0 -453
  28. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_28-2-2022_22_59__Default_Changelist_.xml +0 -4
  29. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_3-3-2022_20_28_[Default_Changelist]/shelved.patch +0 -20
  30. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_3-3-2022_20_28__Default_Changelist_.xml +0 -4
  31. package/.idea/shelf/Uncommitted_changes_before_rebase_[Default_Changelist]/shelved.patch +0 -738
  32. package/.idea/shelf/Uncommitted_changes_before_rebase_[Default_Changelist]1/shelved.patch +0 -0
  33. package/.idea/shelf/Uncommitted_changes_before_rebase__Default_Changelist_.xml +0 -4
  34. package/.idea/workspace.xml +0 -732
  35. package/etc/config.js +0 -32
  36. package/yarn-error.log +0 -3608
@@ -1,20 +0,0 @@
1
- Index: test/test-musicbrainz-api.ts
2
- IDEA additional info:
3
- Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
4
- <+>import {\r\n IBrowseArtistsResult, IBrowseCollectionsResult, IBrowseEventsResult, IBrowseInstrumentsResult, IBrowseLabelsResult, IBrowsePlacesResult,\r\n IBrowseRecordingsResult,\r\n IBrowseReleaseGroupsResult,\r\n IBrowseReleasesResult, IBrowseSeriesResult,\r\n IBrowseWorksResult,\r\n IMusicBrainzConfig,\r\n LinkType,\r\n MusicBrainzApi\r\n} from '../src/musicbrainz-api';\r\nimport { assert } from 'chai';\r\nimport { XmlMetadata } from '../src/xml/xml-metadata';\r\nimport * as mb from '../src/musicbrainz.types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nconst packageInfo = require('../package.json');\r\n\r\nconst appUrl = 'https://github.com/Borewit/musicbrainz-api';\r\n\r\nconst testBotAccount = {\r\n username: process.env.MBUSER,\r\n password: process.env.MBPWD\r\n};\r\n\r\nconst testApiConfig: IMusicBrainzConfig = {\r\n botAccount: testBotAccount,\r\n baseUrl: 'https://test.musicbrainz.org',\r\n\r\n /**\r\n * Enable proxy, like Fiddler\r\n */\r\n proxy: process.env.MBPROXY,\r\n\r\n appName: packageInfo.name,\r\n appVersion: packageInfo.version,\r\n appContactInfo: appUrl\r\n};\r\n\r\nconst searchApiConfig: IMusicBrainzConfig = {\r\n\r\n baseUrl: 'https://musicbrainz.org',\r\n\r\n /**\r\n * Enable proxy, like Fiddler\r\n */\r\n proxy: process.env.MBPROXY,\r\n\r\n appName: packageInfo.name,\r\n appVersion: packageInfo.version,\r\n appContactInfo: appUrl\r\n};\r\n\r\nconst mbTestApi = new MusicBrainzApi(testApiConfig);\r\nconst mbApi = new MusicBrainzApi(searchApiConfig);\r\n\r\n// Hack shared rate-limiter\r\n(mbApi as any).rateLimiter = (mbTestApi as any).rateLimiter;\r\n\r\ndescribe('MusicBrainz-api', function() {\r\n\r\n this.timeout(40000); // MusicBrainz has a rate limiter\r\n\r\n const mbid = {\r\n area: {\r\n Belgium: '5b8a5ee5-0bb3-34cf-9a75-c27c44e341fc',\r\n IleDeFrance: 'd79e4501-8cba-431b-96e7-bb9976f0ae76',\r\n Lisbon: '9aee8c1a-c7d5-4713-af71-c022bccf50b4'\r\n },\r\n artist: {\r\n Stromae: 'ab2528d9-719f-4261-8098-21849222a0f2',\r\n DeadCombo: '092ae9e2-60bf-4b66-aa33-9e31754d1924'\r\n },\r\n collection: {\r\n Ringtone: 'de4fdfc4-53aa-458a-b463-8761cc7f5af8'\r\n },\r\n event: {\r\n DireStraitsAlchemyLoveOverGold: '6d32c658-151e-45ec-88c4-fb8787524d61'\r\n },\r\n instrument: {\r\n spanishAcousticGuitar: '117dacfc-0ad0-4e90-81a4-a28b4c03929b'\r\n },\r\n label: {\r\n Mosaert: '0550200c-22c1-4c62-b761-ef0b3665262b'\r\n },\r\n place: {\r\n Paradiso: '4efe54e1-41f6-490a-85f5-e1c19b04649c'\r\n },\r\n recording: {\r\n Formidable: '16afa384-174e-435e-bfa3-5591accda31c',\r\n Montilla: '2faab3ff-1b3a-4378-bfa2-0513446644ed'\r\n },\r\n release: {\r\n Formidable: '976e0677-a480-4a5e-a177-6a86c1900bbf',\r\n Anomalie: '478aaba4-9425-4a67-8951-a77739462df4',\r\n RacineCarree: [\r\n '348662a8-54ce-4d14-adf5-3ce2cefd57bb',\r\n 'c22bdb3a-69c0-449a-9ef5-99796bb0f2d7',\r\n 'de57c1d9-5e65-420f-a896-1332e87d4c09'\r\n ]\r\n },\r\n releaseGroup: {\r\n Formidable: '19099ea5-3600-4154-b482-2ec68815883e',\r\n RacineCarree: 'd079dc50-fa9b-4a88-90f4-5e8723accd75'\r\n },\r\n work: {\r\n Formidable: 'b2aa02f4-6c95-43be-a426-aedb9f9a3805'\r\n }\r\n };\r\n\r\n const spotify = {\r\n album: {\r\n RacineCarree: {\r\n id: '6uyslsVGFsHKzdGUosFwBM'\r\n }\r\n },\r\n track: {\r\n Formidable: {\r\n id: '2AMysGXOe0zzZJMtH3Nizb'\r\n }\r\n }\r\n };\r\n\r\n it('Required environment variable', () => {\r\n assert.isDefined(process.env.MBUSER, 'process.env.MBUSER');\r\n assert.isDefined(process.env.MBPWD, 'process.env.MBPWD');\r\n });\r\n\r\n it('Extract CSRF', () => {\r\n const html = fs.readFileSync(path.join(__dirname, 'csrf.html'), 'utf8');\r\n const csrf = MusicBrainzApi.fetchCsrf(html);\r\n assert.deepStrictEqual(csrf, {\r\n sessionKey: 'csrf_token:x0VIlHob5nPcWKqJIwNPwE5Y3kE+nGQ9fccgTSYbuMU=',\r\n token: '6G9f/xJ6Y4fLVvfYGHrzBUM34j6hy4CJrBi3VkVwO9I='\r\n }, 'CSRF data');\r\n });\r\n\r\n describe('Read metadata', () => {\r\n\r\n describe('Lookup', () => {\r\n\r\n it('area', async () => {\r\n const area = await mbApi.lookupArea(mbid.area.Belgium);\r\n assert.strictEqual(area.id, mbid.area.Belgium);\r\n assert.strictEqual(area.name, 'Belgium');\r\n });\r\n\r\n it('artist', async () => {\r\n const artist = await mbApi.lookupArtist(mbid.artist.Stromae);\r\n assert.strictEqual(artist.id, mbid.artist.Stromae);\r\n assert.strictEqual(artist.name, 'Stromae');\r\n });\r\n\r\n it('instrument', async () => {\r\n const instrument = await mbApi.lookupInstrument(mbid.instrument.spanishAcousticGuitar);\r\n assert.strictEqual(instrument.id, mbid.instrument.spanishAcousticGuitar);\r\n assert.strictEqual(instrument.type, 'String instrument');\r\n });\r\n\r\n it('label', async () => {\r\n const label = await mbApi.lookupLabel(mbid.label.Mosaert);\r\n assert.strictEqual(label.id, mbid.label.Mosaert);\r\n assert.strictEqual(label.name, 'Mosaert');\r\n });\r\n\r\n describe('Release', () => {\r\n\r\n it('release Formidable', async () => {\r\n const release = await mbApi.lookupRelease(mbid.release.Formidable);\r\n assert.strictEqual(release.id, mbid.release.Formidable);\r\n assert.strictEqual(release.title, 'Formidable');\r\n });\r\n\r\n it('check release Anomalie', async () => {\r\n const release = await mbApi.lookupRelease(mbid.release.Anomalie);\r\n assert.strictEqual(release.id, mbid.release.Anomalie);\r\n assert.strictEqual(release.title, 'Anomalie');\r\n });\r\n\r\n [\r\n {inc: 'artist-credits', key: 'artist-credit'},\r\n {inc: 'artists', key: 'artist-credit'},\r\n {inc: 'collections', key: 'collections'},\r\n {inc: 'labels', key: 'release-events'},\r\n {inc: 'media', key: 'media'},\r\n // {inc: 'recordings', key: 'recordings'},\r\n {inc: 'release-groups', key: 'release-group'}\r\n ].forEach(inc => {\r\n\r\n it(`get release, include: '${inc.inc}'`, async () => {\r\n const release = await mbApi.lookupRelease(mbid.release.Formidable, [inc.inc as any]);\r\n assert.strictEqual(release.id, mbid.release.Formidable);\r\n assert.strictEqual(release.title, 'Formidable');\r\n assert.isDefined(release[inc.key], `Should include '${inc.key}'`);\r\n });\r\n });\r\n\r\n });\r\n\r\n describe('Release-group', () => {\r\n\r\n it('release-group', async () => {\r\n const releaseGroup = await mbApi.lookupReleaseGroup(mbid.releaseGroup.Formidable);\r\n assert.strictEqual(releaseGroup.id, mbid.releaseGroup.Formidable);\r\n assert.strictEqual(releaseGroup.title, 'Formidable');\r\n });\r\n\r\n [\r\n {inc: 'artist-credits', key: 'artist-credit'}\r\n ].forEach(inc => {\r\n\r\n it(`get release-group, include: '${inc.inc}'`, async () => {\r\n const group = await mbApi.lookupReleaseGroup(mbid.releaseGroup.Formidable, [inc.inc as any]);\r\n assert.strictEqual(group.id, mbid.releaseGroup.Formidable);\r\n assert.strictEqual(group.title, 'Formidable');\r\n assert.isDefined(group[inc.key], `Should include '${inc.key}'`);\r\n });\r\n });\r\n\r\n });\r\n\r\n it('work', async () => {\r\n const work = await mbApi.lookupWork(mbid.work.Formidable);\r\n assert.strictEqual(work.id, mbid.work.Formidable);\r\n assert.strictEqual(work.title, 'Formidable');\r\n });\r\n\r\n describe('Recording', () => {\r\n\r\n it('recording', async () => {\r\n const recording = await mbApi.lookupRecording(mbid.recording.Formidable);\r\n assert.strictEqual(recording.id, mbid.recording.Formidable);\r\n assert.strictEqual(recording.title, 'Formidable');\r\n assert.isUndefined(recording.isrcs);\r\n assert.isUndefined(recording['artist-credit']);\r\n assert.isUndefined(recording.releases);\r\n });\r\n\r\n [\r\n {inc: 'isrcs', key: 'isrcs'},\r\n {inc: 'artist-credits', key: 'artist-credit'},\r\n {inc: 'artists', key: 'artist-credit'},\r\n {inc: 'releases', key: 'releases'}\r\n ].forEach(inc => {\r\n\r\n it(`recording, include: '${inc.inc}'`, async () => {\r\n const recording = await mbApi.lookupRecording(mbid.recording.Formidable, [inc.inc as any]);\r\n assert.strictEqual(recording.id, mbid.recording.Formidable);\r\n assert.strictEqual(recording.title, 'Formidable');\r\n assert.isDefined(recording[inc.key], `Should include '${inc.key}'`);\r\n });\r\n });\r\n\r\n it('extended recording', async () => {\r\n const recording = await mbApi.lookupRecording(mbid.recording.Formidable, ['isrcs', 'artists', 'releases', 'url-rels']);\r\n assert.strictEqual(recording.id, mbid.recording.Formidable);\r\n assert.strictEqual(recording.title, 'Formidable');\r\n assert.isDefined(recording.isrcs);\r\n assert.isDefined(recording['artist-credit']);\r\n // assert.isDefined(recording.releases);\r\n });\r\n });\r\n\r\n });\r\n\r\n describe('Browse', () => {\r\n\r\n function areBunchOf(entity: string, bunch) {\r\n assert.isObject(bunch);\r\n assert.isNumber(bunch[entity + '-count']);\r\n assert.isNumber(bunch[entity + '-offset']);\r\n assert.isArray(bunch[entity.endsWith('s') ? entity : (entity + 's')]);\r\n }\r\n\r\n describe('area', async () => {\r\n function areBunchOfAreas(artists) {\r\n areBunchOf('area', artists);\r\n }\r\n\r\n it('by collection', async () => {\r\n const areas = await mbApi.browseAreas({collection: 'de4fdfc4-53aa-458a-b463-8761cc7f5af8', limit: 3});\r\n areBunchOfAreas(areas);\r\n });\r\n\r\n });\r\n\r\n describe('artist', async () => {\r\n\r\n function areBunchOfArtists(artists: IBrowseArtistsResult) {\r\n areBunchOf('artist', artists);\r\n }\r\n\r\n it('by area', async () => {\r\n const artists = await mbApi.browseArtists({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfArtists(artists);\r\n });\r\n\r\n it('by collection', async () => {\r\n const artists = await mbApi.browseArtists({collection: 'de4fdfc4-53aa-458a-b463-8761cc7f5af8', limit: 3});\r\n areBunchOfArtists(artists);\r\n });\r\n\r\n it('by recording', async () => {\r\n const artists = await mbApi.browseArtists({recording: 'a6c9e941-58ab-4f2e-9684-3b1b230f915f', limit: 3});\r\n areBunchOfArtists(artists);\r\n assert.strictEqual(artists.artists[0].name, 'Dead Combo');\r\n });\r\n\r\n it('by release', async () => {\r\n const artists = await mbApi.browseArtists({release: 'd9e00093-7a4b-44f1-830d-611e88ec694a', limit: 3});\r\n areBunchOfArtists(artists);\r\n assert.strictEqual(artists.artists[0].name, 'Dead Combo');\r\n });\r\n\r\n it('by release-group', async () => {\r\n const artists = await mbApi.browseArtists({'release-group': 'f9726e3b-833a-4997-b16a-b1baf22ff87e', limit: 3});\r\n areBunchOfArtists(artists);\r\n assert.strictEqual(artists.artists[0].name, 'Dead Combo');\r\n });\r\n\r\n it('by work', async () => {\r\n const artists = await mbApi.browseArtists({work: '6d7fbf07-3795-4ee1-8c69-4cc5c08e8f09', limit: 3});\r\n areBunchOfArtists(artists);\r\n assert.strictEqual(artists.artists[0].name, 'Dead Combo');\r\n });\r\n\r\n });\r\n\r\n describe('collection', () => {\r\n\r\n function areBunchOfCollections(collections: IBrowseCollectionsResult) {\r\n areBunchOf('collection', collections);\r\n }\r\n\r\n it('by area', async () => {\r\n const collections = await mbApi.browseCollections({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfCollections(collections);\r\n });\r\n\r\n it('by artist', async () => {\r\n const collections = await mbApi.browseCollections({artist: mbid.artist.Stromae, limit: 3});\r\n areBunchOfCollections(collections);\r\n });\r\n\r\n it('by editor', async () => {\r\n const collections = await mbApi.browseCollections({editor: 'Borewit', limit: 3});\r\n areBunchOfCollections(collections);\r\n });\r\n\r\n it('by event', async () => {\r\n const collections = await mbApi.browseCollections({event: mbid.event.DireStraitsAlchemyLoveOverGold, limit: 3});\r\n areBunchOfCollections(collections);\r\n });\r\n\r\n });\r\n\r\n describe('event', () => {\r\n\r\n function areBunchOfEvents(events: IBrowseEventsResult) {\r\n areBunchOf('event', events);\r\n }\r\n\r\n it('by area', async () => {\r\n const events = await mbApi.browseEvents({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfEvents(events);\r\n });\r\n\r\n it('by artist', async () => {\r\n const events = await mbApi.browseEvents({artist: mbid.artist.DeadCombo, limit: 3});\r\n areBunchOfEvents(events);\r\n });\r\n\r\n it('by collection', async () => {\r\n const events = await mbApi.browseEvents({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfEvents(events);\r\n });\r\n\r\n it('by place', async () => {\r\n const events = await mbApi.browseEvents({place: mbid.place.Paradiso, limit: 3});\r\n areBunchOfEvents(events);\r\n });\r\n\r\n });\r\n\r\n describe('instrument', () => {\r\n\r\n function areBunchOfInstruments(instruments: IBrowseInstrumentsResult) {\r\n areBunchOf('instrument', instruments);\r\n }\r\n\r\n it('by collection', async () => {\r\n const instruments = await mbApi.browseInstruments({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfInstruments(instruments);\r\n });\r\n\r\n });\r\n\r\n describe('label', () => {\r\n\r\n function areBunchOfLabels(labels: IBrowseLabelsResult) {\r\n areBunchOf('label', labels);\r\n }\r\n\r\n it('by area', async () => {\r\n const labels = await mbApi.browseLabels({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfLabels(labels);\r\n });\r\n\r\n it('by collection', async () => {\r\n const labels = await mbApi.browseLabels({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfLabels(labels);\r\n });\r\n\r\n it('by release', async () => {\r\n const labels = await mbApi.browseLabels({release: mbid.release.Formidable, limit: 3});\r\n areBunchOfLabels(labels);\r\n });\r\n });\r\n\r\n describe('place', () => {\r\n\r\n function areBunchOfPlaces(places: IBrowsePlacesResult) {\r\n areBunchOf('place', places);\r\n }\r\n\r\n it('by area', async () => {\r\n const places = await mbApi.browsePlaces({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfPlaces(places);\r\n });\r\n\r\n it('by collection', async () => {\r\n const places = await mbApi.browsePlaces({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfPlaces(places);\r\n });\r\n\r\n });\r\n\r\n describe('recording', () => {\r\n\r\n function areBunchOfRecordings(recordings: IBrowseRecordingsResult) {\r\n areBunchOf('recording', recordings);\r\n }\r\n\r\n it('by artist', async () => {\r\n const recordings = await mbApi.browseRecordings({artist: mbid.artist.DeadCombo, limit: 3});\r\n areBunchOfRecordings(recordings);\r\n });\r\n\r\n it('by collection', async () => {\r\n const recordings = await mbApi.browseRecordings({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfRecordings(recordings);\r\n });\r\n\r\n it('by release', async () => {\r\n const recordings = await mbApi.browseRecordings({release: mbid.release.Formidable, limit: 3});\r\n areBunchOfRecordings(recordings);\r\n });\r\n\r\n it('by work', async () => {\r\n const recordings = await mbApi.browseRecordings({work: mbid.work.Formidable, limit: 3});\r\n areBunchOfRecordings(recordings);\r\n });\r\n\r\n });\r\n\r\n describe('release', () => {\r\n\r\n function areBunchOfReleases(releases: IBrowseReleasesResult) {\r\n areBunchOf('release', releases);\r\n }\r\n\r\n it('by area', async () => {\r\n const releases = await mbApi.browseReleases({area: mbid.area.Lisbon, limit: 3});\r\n areBunchOfReleases(releases);\r\n });\r\n\r\n it('by artist', async () => {\r\n const releases = await mbApi.browseReleases({artist: mbid.artist.DeadCombo, limit: 3});\r\n areBunchOfReleases(releases);\r\n });\r\n\r\n it('by labels', async () => {\r\n const releases = await mbApi.browseReleases({label: mbid.label.Mosaert, limit: 3});\r\n areBunchOfReleases(releases);\r\n });\r\n\r\n it('by recording', async () => {\r\n const releases = await mbApi.browseReleases({recording: mbid.recording.Montilla, limit: 3});\r\n areBunchOfReleases(releases);\r\n });\r\n\r\n it('by release-group', async () => {\r\n const releases = await mbApi.browseReleases({'release-group': mbid.releaseGroup.Formidable, limit: 3});\r\n areBunchOfReleases(releases);\r\n });\r\n });\r\n\r\n describe('release-group', () => {\r\n\r\n function areBunchOfReleaseGroups(releaseGroups: IBrowseReleaseGroupsResult) {\r\n areBunchOf('release-group', releaseGroups);\r\n }\r\n\r\n it('by artist', async () => {\r\n const releaseGroups = await mbApi.browseReleaseGroups({artist: mbid.artist.DeadCombo, limit: 3});\r\n areBunchOfReleaseGroups(releaseGroups);\r\n });\r\n\r\n it('by collection', async () => {\r\n const releaseGroups = await mbApi.browseReleaseGroups({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfReleaseGroups(releaseGroups);\r\n });\r\n\r\n it('by release', async () => {\r\n const releaseGroups = await mbApi.browseReleaseGroups({release: mbid.release.Formidable, limit: 3});\r\n areBunchOfReleaseGroups(releaseGroups);\r\n });\r\n\r\n });\r\n\r\n describe('series', () => {\r\n\r\n function areBunchOfSeries(series: IBrowseSeriesResult) {\r\n areBunchOf('series', series);\r\n }\r\n\r\n it('by collection', async () => {\r\n const series = await mbApi.browseSeries({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfSeries(series);\r\n });\r\n });\r\n\r\n describe('work', async () => {\r\n\r\n function areBunchOfWorks(works: IBrowseWorksResult) {\r\n areBunchOf('work', works);\r\n }\r\n\r\n it('by collection', async () => {\r\n const works = await mbApi.browseWorks({collection: mbid.collection.Ringtone, limit: 3});\r\n areBunchOfWorks(works);\r\n });\r\n });\r\n\r\n describe('url', async () => {\r\n\r\n it('by resources', async () => {\r\n const url = await mbApi.browseUrls({resource: 'https://open.spotify.com/album/5PCfptvsmuFcxsMt86L6wn', limit: 3});\r\n assert.isString(url.id);\r\n });\r\n });\r\n\r\n });\r\n\r\n describe('Query', () => {\r\n\r\n it('query: Queen - We Will Rock You', async () => {\r\n const query = 'query=\"We Will Rock You\" AND arid:0383dadf-2a4e-4d10-a46a-e9e041da8eb3';\r\n const result = await mbApi.search<mb.IReleaseGroupList>('release-group', {query});\r\n assert.isAtLeast(result.count, 1);\r\n });\r\n\r\n });\r\n\r\n describe('Search', () => {\r\n\r\n describe('generic search', () => {\r\n\r\n it('find artist: Stromae', async () => {\r\n const result = await mbApi.search('artist', {query: 'Stromae'});\r\n assert.isAtLeast(result.count, 1);\r\n });\r\n\r\n });\r\n\r\n describe('searchArtist', () => {\r\n\r\n it('find artist: Stromae', async () => {\r\n const result = await mbApi.searchArtist({query: 'Stromae'});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.artists.length, 1);\r\n assert.strictEqual(result.artists[0].id, mbid.artist.Stromae);\r\n });\r\n\r\n });\r\n\r\n describe('searchReleaseGroup', () => {\r\n\r\n it('find release-group: Racine carrée', async () => {\r\n const result = await mbApi.searchReleaseGroup({query: 'Racine carrée'});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result['release-groups'].length, 1);\r\n assert.strictEqual(result['release-groups'][0].id, mbid.releaseGroup.RacineCarree);\r\n });\r\n\r\n it('find release-group: Racine carrée, by artist and group name', async () => {\r\n const result = await mbApi.searchReleaseGroup({query: {release: 'Racine carrée', artist: 'Stromae'}});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result['release-groups'].length, 1);\r\n assert.strictEqual(result['release-groups'][0].id, mbid.releaseGroup.RacineCarree);\r\n });\r\n });\r\n\r\n describe('searchRelease', () => {\r\n\r\n it('find release-group: Racine carrée', async () => {\r\n const result = await mbApi.searchRelease({query: {release: 'Racine carrée'}});\r\n assert.isAtLeast(result.count, 2);\r\n assert.isAtLeast(result.releases.length, 2);\r\n assert.includeMembers(result.releases.map(release => release.id), mbid.release.RacineCarree);\r\n });\r\n\r\n it('find release by barcode', async () => {\r\n const result = await mbApi.searchRelease({query: {barcode: 602537479870}});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.releases.length, 1);\r\n assert.equal(result.releases[0].id, mbid.release.RacineCarree[2]);\r\n });\r\n\r\n it('find release by barcode', async () => {\r\n const result = await mbApi.searchRelease({query: {barcode: 602537479870}});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.releases.length, 1);\r\n assert.equal(result.releases[0].id, mbid.release.RacineCarree[2]);\r\n });\r\n\r\n it('find releases by artist use query API', async () => {\r\n const artist_mbid = 'eeb41a1e-4326-4d04-8c47-0f564ceecd68';\r\n const result = await mbApi.searchRelease({query: {arid: artist_mbid} });\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.releases.length, 1);\r\n });\r\n\r\n it('find releases by artist use browse API', async () => {\r\n const artist_mbid = 'eeb41a1e-4326-4d04-8c47-0f564ceecd68';\r\n const result = await mbApi.searchRelease({artist: artist_mbid});\r\n assert.isAtLeast(result['release-count'], 1);\r\n assert.isAtLeast(result.releases.length, 1);\r\n });\r\n\r\n it('find releases with inc', async () => {\r\n const artist_mbid = '024a7074-dcef-4851-8f9c-090a9746a75a';\r\n const result = await mbApi.searchRelease({\r\n query: `arid:${artist_mbid}`,\r\n inc: ['release-groups', 'media', 'label-rels'],\r\n offset: 0,\r\n limit: 25\r\n });\r\n assert.isAtLeast(result.count, 1);\r\n });\r\n\r\n });\r\n\r\n describe('searchArea', () => {\r\n\r\n it('find area by name', async () => {\r\n const result = await mbApi.searchArea({query: 'Île-de-France'});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.areas.length, 1);\r\n assert.strictEqual(result.areas[0].id, mbid.area.IleDeFrance);\r\n });\r\n });\r\n\r\n describe('searchUrl', () => {\r\n\r\n const spotifyUrl = 'https://open.spotify.com/album/' + spotify.album.RacineCarree.id;\r\n\r\n it('find url by url', async () => {\r\n const result = await mbApi.searchUrl({query: {url: spotifyUrl}});\r\n assert.isAtLeast(result.count, 1);\r\n assert.isAtLeast(result.urls.length, 1);\r\n assert.strictEqual(result.urls[0].resource, spotifyUrl);\r\n });\r\n });\r\n });\r\n\r\n });\r\n\r\n describe('Submit API', () => {\r\n\r\n it('Post ISRC Formidable', async () => {\r\n const isrc_Formidable = 'BET671300161';\r\n const xmlMetadata = new XmlMetadata();\r\n const xmlRecording = xmlMetadata.pushRecording(mbid.recording.Formidable);\r\n xmlRecording.isrcList.pushIsrc(isrc_Formidable);\r\n\r\n await mbTestApi.post('recording', xmlMetadata);\r\n });\r\n\r\n });\r\n\r\n /**\r\n * https://wiki.musicbrainz.org/Development/Release_Editor_Seeding\r\n */\r\n describe.skip('User (bot) post form-data API', () => {\r\n\r\n it('login & logout', async () => {\r\n for (let n = 1; n <= 2; ++n) {\r\n assert.isTrue(await mbTestApi.login(), `Login ${n}`);\r\n assert.isTrue(await mbTestApi.logout(), `Logout ${n}`);\r\n }\r\n });\r\n\r\n describe('Recording', () => {\r\n\r\n it('add link', async () => {\r\n const recording = await mbTestApi.lookupRecording(mbid.recording.Formidable);\r\n assert.strictEqual(recording.id, mbid.recording.Formidable);\r\n assert.strictEqual(recording.title, 'Formidable');\r\n\r\n await mbTestApi.addUrlToRecording(recording, {\r\n linkTypeId: LinkType.stream_for_free,\r\n text: 'https://open.spotify.com/track/' + spotify.track.Formidable.id\r\n });\r\n });\r\n\r\n it('add Spotify-ID', async () => {\r\n const recording = await mbTestApi.lookupRecording(mbid.recording.Formidable);\r\n\r\n const editNote = `Unit-test musicbrainz-api (${appUrl}), test augment recording with Spotify URL & ISRC`;\r\n await mbTestApi.addSpotifyIdToRecording(recording, spotify.track.Formidable.id, editNote);\r\n });\r\n\r\n it('add Spotify-ID to recording with ISRC', async () => {\r\n // https://test.musicbrainz.org/recording/a75b85bf-63dd-4fe1-8008-d15541b93bac\r\n const recording_id = 'a75b85bf-63dd-4fe1-8008-d15541b93bac';\r\n\r\n const recording = await mbTestApi.lookupRecording(recording_id);\r\n const editNote = `Unit-test musicbrainz-api (${appUrl}), test augment recording with Spotify URL & ISRC`;\r\n await mbTestApi.addSpotifyIdToRecording(recording, '3ZDO5YINwfoifRQ3ElshPM', editNote);\r\n });\r\n\r\n });\r\n\r\n describe('ISRC', () => {\r\n\r\n it('add ISRC', async () => {\r\n const recording = await mbTestApi.lookupRecording(mbid.recording.Formidable, ['isrcs']);\r\n assert.strictEqual(recording.id, mbid.recording.Formidable);\r\n assert.strictEqual(recording.title, 'Formidable');\r\n\r\n await mbTestApi.addIsrc(recording, 'BET671300161');\r\n });\r\n\r\n });\r\n\r\n /**\r\n * https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2#ISRC_submission\r\n */\r\n describe('ISRC submission', () => {\r\n\r\n it('add ISRC', async () => {\r\n const xmlMedata = new XmlMetadata();\r\n const xmlRec = xmlMedata.pushRecording('94fb868b-9233-4f9e-966b-e8036bf7461e');\r\n xmlRec.isrcList.pushIsrc('GB5EM1801762');\r\n await mbTestApi.post('recording', xmlMedata);\r\n });\r\n\r\n });\r\n\r\n });\r\n\r\n});\r\n
5
- Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
6
- <+>UTF-8
7
- ===================================================================
8
- diff --git a/test/test-musicbrainz-api.ts b/test/test-musicbrainz-api.ts
9
- --- a/test/test-musicbrainz-api.ts (revision 8d2fc47a89f2f187f70ed80d8c39654375cdc365)
10
- +++ b/test/test-musicbrainz-api.ts (date 1646335725614)
11
- @@ -105,6 +105,9 @@
12
- },
13
- work: {
14
- Formidable: 'b2aa02f4-6c95-43be-a426-aedb9f9a3805'
15
- + },
16
- + url: {
17
- + SpotifyLisboaMulata: 'c69556a6-7ded-4c54-809c-afb45a1abe7d'
18
- }
19
- };
20
-
@@ -1,4 +0,0 @@
1
- <changelist name="Uncommitted_changes_before_Checkout_at_3-3-2022_20_28_[Default_Changelist]" date="1646335850507" recycled="true" deleted="true">
2
- <option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Checkout_at_3-3-2022_20_28_[Default_Changelist]/shelved.patch" />
3
- <option name="DESCRIPTION" value="Uncommitted changes before Checkout at 3-3-2022 20:28 [Default Changelist]" />
4
- </changelist>