musicbrainz-api 0.7.0 → 0.8.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.
@@ -0,0 +1,20 @@
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
+
@@ -0,0 +1,4 @@
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>
@@ -1,7 +1,9 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <project version="4">
3
3
  <component name="ChangeListManager">
4
- <list default="true" id="bc752352-fc46-4cc2-af27-783fac62b05e" name="Default Changelist" comment="" />
4
+ <list default="true" id="bc752352-fc46-4cc2-af27-783fac62b05e" name="Default Changelist" comment="">
5
+ <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
6
+ </list>
5
7
  <option name="SHOW_DIALOG" value="false" />
6
8
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
7
9
  <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -24,6 +26,12 @@
24
26
  </map>
25
27
  </branch-storage>
26
28
  </favorite-branches>
29
+ <option name="PUSH_TAGS">
30
+ <GitPushTagMode>
31
+ <option name="argument" value="--tags" />
32
+ <option name="title" value="All" />
33
+ </GitPushTagMode>
34
+ </option>
27
35
  <option name="RECENT_BRANCH_BY_REPOSITORY">
28
36
  <map>
29
37
  <entry key="$PROJECT_DIR$" value="master" />
@@ -33,6 +41,9 @@
33
41
  <option name="UPDATE_TYPE" value="REBASE" />
34
42
  </component>
35
43
  <component name="JupyterTrust" id="9bb8ce62-a4a0-4418-b2be-679942ed59c5" />
44
+ <component name="MarkdownSettingsMigration">
45
+ <option name="stateVersion" value="1" />
46
+ </component>
36
47
  <component name="ProjectId" id="1Tuo5gwYLU8jgA6z1VbpK9fw38m" />
37
48
  <component name="ProjectViewState">
38
49
  <option name="hideEmptyMiddlePackages" value="true" />
@@ -41,7 +52,7 @@
41
52
  <component name="PropertiesComponent">
42
53
  <property name="Git.Branch.Popup.ShowAllRemotes" value="true" />
43
54
  <property name="WebServerToolWindowFactoryState" value="false" />
44
- <property name="last_opened_file_path" value="$PROJECT_DIR$" />
55
+ <property name="last_opened_file_path" value="$PROJECT_DIR$/test" />
45
56
  <property name="node.js.detected.package.tslint" value="true" />
46
57
  <property name="node.js.path.for.package.tslint" value="project" />
47
58
  <property name="node.js.selected.package.tslint" value="(autodetect)" />
@@ -55,10 +66,11 @@
55
66
  </component>
56
67
  <component name="RecentsManager">
57
68
  <key name="CopyFile.RECENT_KEYS">
69
+ <recent name="C:\Users\Maarten\code\github\musicbrainz-api\test" />
58
70
  <recent name="C:\Users\Maarten\code\github\musicbrainz-api" />
59
71
  </key>
60
72
  </component>
61
- <component name="RunManager" selected="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API">
73
+ <component name="RunManager" selected="Mocha.MusicBrainz-api.Read metadata.Lookup.url">
62
74
  <configuration name="MusicBrainz-api" type="mocha-javascript-test-runner" nameIsGenerated="true">
63
75
  <node-interpreter>project</node-interpreter>
64
76
  <node-options />
@@ -78,7 +90,7 @@
78
90
  </test-names>
79
91
  <method v="2" />
80
92
  </configuration>
81
- <configuration name="MusicBrainz-api.Read metadata.Search.searchArtist.find artist: Stromae" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
93
+ <configuration name="MusicBrainz-api.Read metadata.Browse" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
82
94
  <node-interpreter>project</node-interpreter>
83
95
  <node-options />
84
96
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -86,18 +98,16 @@
86
98
  <pass-parent-env>true</pass-parent-env>
87
99
  <ui>bdd</ui>
88
100
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
89
- <test-kind>TEST</test-kind>
101
+ <test-kind>SUITE</test-kind>
90
102
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
91
103
  <test-names>
92
104
  <name value="MusicBrainz-api" />
93
105
  <name value="Read metadata" />
94
- <name value="Search" />
95
- <name value="searchArtist" />
96
- <name value="find artist: Stromae" />
106
+ <name value="Browse" />
97
107
  </test-names>
98
108
  <method v="2" />
99
109
  </configuration>
100
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRecord" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
110
+ <configuration name="MusicBrainz-api.Read metadata.Browse.series" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
101
111
  <node-interpreter>project</node-interpreter>
102
112
  <node-options />
103
113
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -110,12 +120,12 @@
110
120
  <test-names>
111
121
  <name value="MusicBrainz-api" />
112
122
  <name value="Read metadata" />
113
- <name value="Search" />
114
- <name value="searchRecord" />
123
+ <name value="Browse" />
124
+ <name value="series" />
115
125
  </test-names>
116
126
  <method v="2" />
117
127
  </configuration>
118
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
128
+ <configuration name="MusicBrainz-api.Read metadata.Browse.url.by resources" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
119
129
  <node-interpreter>project</node-interpreter>
120
130
  <node-options />
121
131
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -128,13 +138,13 @@
128
138
  <test-names>
129
139
  <name value="MusicBrainz-api" />
130
140
  <name value="Read metadata" />
131
- <name value="Search" />
132
- <name value="searchRelease" />
133
- <name value="find releases by artist use query API" />
141
+ <name value="Browse" />
142
+ <name value="url" />
143
+ <name value="by resources" />
134
144
  </test-names>
135
145
  <method v="2" />
136
146
  </configuration>
137
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
147
+ <configuration name="MusicBrainz-api.Read metadata.Browse.work" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
138
148
  <node-interpreter>project</node-interpreter>
139
149
  <node-options />
140
150
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -142,39 +152,35 @@
142
152
  <pass-parent-env>true</pass-parent-env>
143
153
  <ui>bdd</ui>
144
154
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
145
- <test-kind>TEST</test-kind>
155
+ <test-kind>SUITE</test-kind>
146
156
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
147
157
  <test-names>
148
158
  <name value="MusicBrainz-api" />
149
159
  <name value="Read metadata" />
150
- <name value="Search" />
151
- <name value="searchRelease" />
152
- <name value="find releases by artist" />
160
+ <name value="Browse" />
161
+ <name value="work" />
153
162
  </test-names>
154
163
  <method v="2" />
155
164
  </configuration>
156
- <configuration name="MusicBrainz-api.User (bot) post form-data API.Recording" type="mocha-javascript-test-runner" nameIsGenerated="true">
165
+ <configuration name="MusicBrainz-api.Read metadata.Lookup.url" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
157
166
  <node-interpreter>project</node-interpreter>
158
167
  <node-options />
159
168
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
160
169
  <working-directory>$PROJECT_DIR$</working-directory>
161
170
  <pass-parent-env>true</pass-parent-env>
162
- <envs>
163
- <env name="MBUSER" value="Borewit_bot" />
164
- <env name="MBPWD" value="7aSZQu2m3REqrRtjVirU" />
165
- </envs>
166
171
  <ui>bdd</ui>
167
172
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
168
- <test-kind>SUITE</test-kind>
173
+ <test-kind>TEST</test-kind>
169
174
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
170
175
  <test-names>
171
176
  <name value="MusicBrainz-api" />
172
- <name value="User (bot) post form-data API" />
173
- <name value="Recording" />
177
+ <name value="Read metadata" />
178
+ <name value="Lookup" />
179
+ <name value="url" />
174
180
  </test-names>
175
181
  <method v="2" />
176
182
  </configuration>
177
- <configuration name="MusicBrainz-api.User (bot) post form-data API.login" type="mocha-javascript-test-runner" nameIsGenerated="true">
183
+ <configuration name="MusicBrainz-api.User (bot) post form-data API.Recording" type="mocha-javascript-test-runner" nameIsGenerated="true">
178
184
  <node-interpreter>project</node-interpreter>
179
185
  <node-options />
180
186
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -186,28 +192,33 @@
186
192
  </envs>
187
193
  <ui>bdd</ui>
188
194
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
189
- <test-kind>TEST</test-kind>
195
+ <test-kind>SUITE</test-kind>
190
196
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
191
197
  <test-names>
192
198
  <name value="MusicBrainz-api" />
193
199
  <name value="User (bot) post form-data API" />
194
- <name value="login" />
200
+ <name value="Recording" />
195
201
  </test-names>
196
202
  <method v="2" />
197
203
  </configuration>
198
- <configuration name="MusicBrainz-api.try something" type="mocha-javascript-test-runner" temporary="true" nameIsGenerated="true">
204
+ <configuration name="MusicBrainz-api.User (bot) post form-data API.login" type="mocha-javascript-test-runner" nameIsGenerated="true">
199
205
  <node-interpreter>project</node-interpreter>
200
206
  <node-options />
201
207
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
202
208
  <working-directory>$PROJECT_DIR$</working-directory>
203
209
  <pass-parent-env>true</pass-parent-env>
210
+ <envs>
211
+ <env name="MBUSER" value="Borewit_bot" />
212
+ <env name="MBPWD" value="7aSZQu2m3REqrRtjVirU" />
213
+ </envs>
204
214
  <ui>bdd</ui>
205
215
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
206
216
  <test-kind>TEST</test-kind>
207
217
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
208
218
  <test-names>
209
219
  <name value="MusicBrainz-api" />
210
- <name value="try something" />
220
+ <name value="User (bot) post form-data API" />
221
+ <name value="login" />
211
222
  </test-names>
212
223
  <method v="2" />
213
224
  </configuration>
@@ -215,19 +226,19 @@
215
226
  <item itemvalue="Mocha.MusicBrainz-api.User (bot) post form-data API.Recording" />
216
227
  <item itemvalue="Mocha.MusicBrainz-api" />
217
228
  <item itemvalue="Mocha.MusicBrainz-api.User (bot) post form-data API.login" />
218
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchArtist.find artist: Stromae" />
219
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRecord" />
220
- <item itemvalue="Mocha.MusicBrainz-api.try something" />
221
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" />
222
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" />
229
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.series" />
230
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.work" />
231
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.url.by resources" />
232
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse" />
233
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Lookup.url" />
223
234
  </list>
224
235
  <recent_temporary>
225
236
  <list>
226
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" />
227
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" />
228
- <item itemvalue="Mocha.MusicBrainz-api.try something" />
229
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRecord" />
230
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchArtist.find artist: Stromae" />
237
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Lookup.url" />
238
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.url.by resources" />
239
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.series" />
240
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse" />
241
+ <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Browse.work" />
231
242
  </list>
232
243
  </recent_temporary>
233
244
  </component>
@@ -251,91 +262,14 @@
251
262
  <workItem from="1632582904488" duration="1466000" />
252
263
  <workItem from="1641416063831" duration="1322000" />
253
264
  <workItem from="1641417549676" duration="3002000" />
254
- <workItem from="1641463522932" duration="8661000" />
255
- </task>
256
- <task id="LOCAL-00002" summary="Automatically update coveralls">
257
- <created>1574877178218</created>
258
- <option name="number" value="00002" />
259
- <option name="presentableId" value="LOCAL-00002" />
260
- <option name="project" value="LOCAL" />
261
- <updated>1574877178218</updated>
262
- </task>
263
- <task id="LOCAL-00003" summary="Automatically update source-map-support">
264
- <created>1596711693157</created>
265
- <option name="number" value="00003" />
266
- <option name="presentableId" value="LOCAL-00003" />
267
- <option name="project" value="LOCAL" />
268
- <updated>1596711693157</updated>
269
- </task>
270
- <task id="LOCAL-00004" summary="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login.">
271
- <created>1613934905284</created>
272
- <option name="number" value="00004" />
273
- <option name="presentableId" value="LOCAL-00004" />
274
- <option name="project" value="LOCAL" />
275
- <updated>1613934905284</updated>
276
- </task>
277
- <task id="LOCAL-00005" summary="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login.">
278
- <created>1613935032361</created>
279
- <option name="number" value="00005" />
280
- <option name="presentableId" value="LOCAL-00005" />
281
- <option name="project" value="LOCAL" />
282
- <updated>1613935032361</updated>
283
- </task>
284
- <task id="LOCAL-00006" summary="Update rate-limiter">
285
- <created>1613935537544</created>
286
- <option name="number" value="00006" />
287
- <option name="presentableId" value="LOCAL-00006" />
288
- <option name="project" value="LOCAL" />
289
- <updated>1613935537544</updated>
290
- </task>
291
- <task id="LOCAL-00007" summary="Switch http-client to Needle">
292
- <created>1616254964257</created>
293
- <option name="number" value="00007" />
294
- <option name="presentableId" value="LOCAL-00007" />
295
- <option name="project" value="LOCAL" />
296
- <updated>1616254964258</updated>
297
- </task>
298
- <task id="LOCAL-00008" summary="Fix TypeScript array declaration">
299
- <created>1616255313930</created>
300
- <option name="number" value="00008" />
301
- <option name="presentableId" value="LOCAL-00008" />
302
- <option name="project" value="LOCAL" />
303
- <updated>1616255313930</updated>
304
- </task>
305
- <task id="LOCAL-00009" summary="Fix TypeScript array declaration">
306
- <created>1616256002544</created>
307
- <option name="number" value="00009" />
308
- <option name="presentableId" value="LOCAL-00009" />
309
- <option name="project" value="LOCAL" />
310
- <updated>1616256002544</updated>
311
- </task>
312
- <task id="LOCAL-00010" summary="Fix TypeScript array declaration">
313
- <created>1616256083701</created>
314
- <option name="number" value="00010" />
315
- <option name="presentableId" value="LOCAL-00010" />
316
- <option name="project" value="LOCAL" />
317
- <updated>1616256083701</updated>
318
- </task>
319
- <task id="LOCAL-00011" summary="Switch to GitHub workflow">
320
- <created>1616256286066</created>
321
- <option name="number" value="00011" />
322
- <option name="presentableId" value="LOCAL-00011" />
323
- <option name="project" value="LOCAL" />
324
- <updated>1616256286066</updated>
325
- </task>
326
- <task id="LOCAL-00012" summary="Switch to GitHub workflow">
327
- <created>1616257270267</created>
328
- <option name="number" value="00012" />
329
- <option name="presentableId" value="LOCAL-00012" />
330
- <option name="project" value="LOCAL" />
331
- <updated>1616257270267</updated>
332
- </task>
333
- <task id="LOCAL-00013" summary="Switch http-client to Needle">
334
- <created>1616259833224</created>
335
- <option name="number" value="00013" />
336
- <option name="presentableId" value="LOCAL-00013" />
337
- <option name="project" value="LOCAL" />
338
- <updated>1616259833224</updated>
265
+ <workItem from="1641463522932" duration="9493000" />
266
+ <workItem from="1641482890152" duration="47000" />
267
+ <workItem from="1641559515334" duration="3047000" />
268
+ <workItem from="1644940615981" duration="1171000" />
269
+ <workItem from="1646082067318" duration="4372000" />
270
+ <workItem from="1646163499796" duration="5970000" />
271
+ <workItem from="1646243607542" duration="8976000" />
272
+ <workItem from="1646331188387" duration="4635000" />
339
273
  </task>
340
274
  <task id="LOCAL-00014" summary="Fix login with CSRF token">
341
275
  <created>1616263362074</created>
@@ -596,7 +530,91 @@
596
530
  <option name="project" value="LOCAL" />
597
531
  <updated>1641471925166</updated>
598
532
  </task>
599
- <option name="localTasksCounter" value="51" />
533
+ <task id="LOCAL-00051" summary="Convert subquery array in `inc` to space delimited list&#10;&#10;Resolves #390">
534
+ <created>1641560976564</created>
535
+ <option name="number" value="00051" />
536
+ <option name="presentableId" value="LOCAL-00051" />
537
+ <option name="project" value="LOCAL" />
538
+ <updated>1641560976564</updated>
539
+ </task>
540
+ <task id="LOCAL-00052" summary="Fix artist credit">
541
+ <created>1646082153804</created>
542
+ <option name="number" value="00052" />
543
+ <option name="presentableId" value="LOCAL-00052" />
544
+ <option name="project" value="LOCAL" />
545
+ <updated>1646082153804</updated>
546
+ </task>
547
+ <task id="LOCAL-00053" summary="Add support for browse API">
548
+ <created>1646085603042</created>
549
+ <option name="number" value="00053" />
550
+ <option name="presentableId" value="LOCAL-00053" />
551
+ <option name="project" value="LOCAL" />
552
+ <updated>1646085603042</updated>
553
+ </task>
554
+ <task id="LOCAL-00054" summary="Add support for browse API">
555
+ <created>1646086431586</created>
556
+ <option name="number" value="00054" />
557
+ <option name="presentableId" value="LOCAL-00054" />
558
+ <option name="project" value="LOCAL" />
559
+ <updated>1646086431586</updated>
560
+ </task>
561
+ <task id="LOCAL-00055" summary="Add support for browse API">
562
+ <created>1646171215485</created>
563
+ <option name="number" value="00055" />
564
+ <option name="presentableId" value="LOCAL-00055" />
565
+ <option name="project" value="LOCAL" />
566
+ <updated>1646171215485</updated>
567
+ </task>
568
+ <task id="LOCAL-00056" summary="Add support for browse API">
569
+ <created>1646253529801</created>
570
+ <option name="number" value="00056" />
571
+ <option name="presentableId" value="LOCAL-00056" />
572
+ <option name="project" value="LOCAL" />
573
+ <updated>1646253529802</updated>
574
+ </task>
575
+ <task id="LOCAL-00057" summary="Add support for browse API">
576
+ <created>1646253675028</created>
577
+ <option name="number" value="00057" />
578
+ <option name="presentableId" value="LOCAL-00057" />
579
+ <option name="project" value="LOCAL" />
580
+ <updated>1646253675029</updated>
581
+ </task>
582
+ <task id="LOCAL-00058" summary="Add support for browse API">
583
+ <created>1646253928115</created>
584
+ <option name="number" value="00058" />
585
+ <option name="presentableId" value="LOCAL-00058" />
586
+ <option name="project" value="LOCAL" />
587
+ <updated>1646253928115</updated>
588
+ </task>
589
+ <task id="LOCAL-00059" summary="Replace ts-lint with eslint">
590
+ <created>1646333724781</created>
591
+ <option name="number" value="00059" />
592
+ <option name="presentableId" value="LOCAL-00059" />
593
+ <option name="project" value="LOCAL" />
594
+ <updated>1646333724781</updated>
595
+ </task>
596
+ <task id="LOCAL-00060" summary="Replace ts-lint with eslint">
597
+ <created>1646334004723</created>
598
+ <option name="number" value="00060" />
599
+ <option name="presentableId" value="LOCAL-00060" />
600
+ <option name="project" value="LOCAL" />
601
+ <updated>1646334004723</updated>
602
+ </task>
603
+ <task id="LOCAL-00061" summary="Rename lookup function&#10;Add lookup function for: instrument, label, place">
604
+ <created>1646335359260</created>
605
+ <option name="number" value="00061" />
606
+ <option name="presentableId" value="LOCAL-00061" />
607
+ <option name="project" value="LOCAL" />
608
+ <updated>1646335359260</updated>
609
+ </task>
610
+ <task id="LOCAL-00062" summary="Rename lookup function&#10;Add lookup function for: instrument, label, place">
611
+ <created>1646336363092</created>
612
+ <option name="number" value="00062" />
613
+ <option name="presentableId" value="LOCAL-00062" />
614
+ <option name="project" value="LOCAL" />
615
+ <updated>1646336363092</updated>
616
+ </task>
617
+ <option name="localTasksCounter" value="63" />
600
618
  <servers />
601
619
  </component>
602
620
  <component name="TypeScriptGeneratedFilesManager">
@@ -639,6 +657,24 @@
639
657
  <option value="$PROJECT_DIR$/src/xml/xml-isrc.js" />
640
658
  <option value="$PROJECT_DIR$/src/xml/xml-isrc.js.map" />
641
659
  <option value="$PROJECT_DIR$/src/xml/xml-isrc-list.js" />
660
+ <option value="$PROJECT_DIR$/src/musicbrainz-api.js" />
661
+ <option value="$PROJECT_DIR$/src/rate-limiter.js" />
662
+ <option value="$PROJECT_DIR$/src/musicbrainz-api.js.map" />
663
+ <option value="$PROJECT_DIR$/src/digest-auth.js.map" />
664
+ <option value="$PROJECT_DIR$/src/musicbrainz.types.js" />
665
+ <option value="$PROJECT_DIR$/src/digest-auth.js" />
666
+ <option value="$PROJECT_DIR$/src/musicbrainz.types.js.map" />
667
+ <option value="$PROJECT_DIR$/src/rate-limiter.js.map" />
668
+ <option value="$PROJECT_DIR$/test/test-musicbrainz-api.js" />
669
+ <option value="$PROJECT_DIR$/test/test-musicbrainz-api.js.map" />
670
+ <option value="$PROJECT_DIR$/src/xml/xml-isrc-list.js.map" />
671
+ <option value="$PROJECT_DIR$/src/xml/xml-recording.js" />
672
+ <option value="$PROJECT_DIR$/src/xml/xml-isrc.js.map" />
673
+ <option value="$PROJECT_DIR$/src/xml/xml-isrc.js" />
674
+ <option value="$PROJECT_DIR$/src/xml/xml-isrc-list.js" />
675
+ <option value="$PROJECT_DIR$/src/xml/xml-metadata.js.map" />
676
+ <option value="$PROJECT_DIR$/src/xml/xml-recording.js.map" />
677
+ <option value="$PROJECT_DIR$/src/xml/xml-metadata.js" />
642
678
  </list>
643
679
  </option>
644
680
  </component>
@@ -652,11 +688,9 @@
652
688
  </entry>
653
689
  </map>
654
690
  </option>
655
- <option name="oldMeFiltersMigrated" value="true" />
656
691
  </component>
657
692
  <component name="VcsManagerConfiguration">
658
693
  <option name="RELOAD_CONTEXT" value="false" />
659
- <MESSAGE value="Automatically merge updates" />
660
694
  <MESSAGE value="Automatically update coveralls" />
661
695
  <MESSAGE value="Automatically update source-map-support" />
662
696
  <MESSAGE value="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login." />
@@ -677,22 +711,20 @@
677
711
  <MESSAGE value="Remove david-dm.org dependency badge" />
678
712
  <MESSAGE value="Update to UUID ES6 module syntax" />
679
713
  <MESSAGE value="Be able to choose between query &amp; browse API" />
680
- <option name="LAST_COMMIT_MESSAGE" value="Be able to choose between query &amp; browse API" />
714
+ <MESSAGE value="Convert subquery array in `inc` to space delimited list&#10;&#10;Resolves #390" />
715
+ <MESSAGE value="Fix artist credit" />
716
+ <MESSAGE value="Add support for browse API" />
717
+ <MESSAGE value="Replace ts-lint with eslint" />
718
+ <MESSAGE value="Rename lookup function&#10;Add lookup function for: instrument, label, place" />
719
+ <option name="LAST_COMMIT_MESSAGE" value="Rename lookup function&#10;Add lookup function for: instrument, label, place" />
681
720
  </component>
682
721
  <component name="XDebuggerManager">
683
722
  <breakpoint-manager>
684
723
  <breakpoints>
685
- <line-breakpoint enabled="true" type="javascript">
686
- <url>file://$PROJECT_DIR$/src/musicbrainz-api.ts</url>
687
- <line>482</line>
688
- <properties lambdaOrdinal="-1" />
689
- <option name="timeStamp" value="18" />
690
- </line-breakpoint>
691
- <line-breakpoint enabled="true" type="javascript">
724
+ <line-breakpoint type="javascript">
692
725
  <url>file://$PROJECT_DIR$/src/musicbrainz-api.ts</url>
693
- <line>177</line>
694
- <properties lambdaOrdinal="-1" />
695
- <option name="timeStamp" value="19" />
726
+ <line>545</line>
727
+ <option name="timeStamp" value="20" />
696
728
  </line-breakpoint>
697
729
  </breakpoints>
698
730
  </breakpoint-manager>