musicbrainz-api 0.7.2 → 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" />
@@ -39,6 +41,9 @@
39
41
  <option name="UPDATE_TYPE" value="REBASE" />
40
42
  </component>
41
43
  <component name="JupyterTrust" id="9bb8ce62-a4a0-4418-b2be-679942ed59c5" />
44
+ <component name="MarkdownSettingsMigration">
45
+ <option name="stateVersion" value="1" />
46
+ </component>
42
47
  <component name="ProjectId" id="1Tuo5gwYLU8jgA6z1VbpK9fw38m" />
43
48
  <component name="ProjectViewState">
44
49
  <option name="hideEmptyMiddlePackages" value="true" />
@@ -47,7 +52,7 @@
47
52
  <component name="PropertiesComponent">
48
53
  <property name="Git.Branch.Popup.ShowAllRemotes" value="true" />
49
54
  <property name="WebServerToolWindowFactoryState" value="false" />
50
- <property name="last_opened_file_path" value="$PROJECT_DIR$" />
55
+ <property name="last_opened_file_path" value="$PROJECT_DIR$/test" />
51
56
  <property name="node.js.detected.package.tslint" value="true" />
52
57
  <property name="node.js.path.for.package.tslint" value="project" />
53
58
  <property name="node.js.selected.package.tslint" value="(autodetect)" />
@@ -61,10 +66,11 @@
61
66
  </component>
62
67
  <component name="RecentsManager">
63
68
  <key name="CopyFile.RECENT_KEYS">
69
+ <recent name="C:\Users\Maarten\code\github\musicbrainz-api\test" />
64
70
  <recent name="C:\Users\Maarten\code\github\musicbrainz-api" />
65
71
  </key>
66
72
  </component>
67
- <component name="RunManager" selected="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases with inc">
73
+ <component name="RunManager" selected="Mocha.MusicBrainz-api.Read metadata.Lookup.url">
68
74
  <configuration name="MusicBrainz-api" type="mocha-javascript-test-runner" nameIsGenerated="true">
69
75
  <node-interpreter>project</node-interpreter>
70
76
  <node-options />
@@ -84,7 +90,7 @@
84
90
  </test-names>
85
91
  <method v="2" />
86
92
  </configuration>
87
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" 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">
88
94
  <node-interpreter>project</node-interpreter>
89
95
  <node-options />
90
96
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -92,18 +98,16 @@
92
98
  <pass-parent-env>true</pass-parent-env>
93
99
  <ui>bdd</ui>
94
100
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
95
- <test-kind>TEST</test-kind>
101
+ <test-kind>SUITE</test-kind>
96
102
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
97
103
  <test-names>
98
104
  <name value="MusicBrainz-api" />
99
105
  <name value="Read metadata" />
100
- <name value="Search" />
101
- <name value="searchRelease" />
102
- <name value="find releases by artist use query API" />
106
+ <name value="Browse" />
103
107
  </test-names>
104
108
  <method v="2" />
105
109
  </configuration>
106
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" 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">
107
111
  <node-interpreter>project</node-interpreter>
108
112
  <node-options />
109
113
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -111,18 +115,17 @@
111
115
  <pass-parent-env>true</pass-parent-env>
112
116
  <ui>bdd</ui>
113
117
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
114
- <test-kind>TEST</test-kind>
118
+ <test-kind>SUITE</test-kind>
115
119
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
116
120
  <test-names>
117
121
  <name value="MusicBrainz-api" />
118
122
  <name value="Read metadata" />
119
- <name value="Search" />
120
- <name value="searchRelease" />
121
- <name value="find releases by artist" />
123
+ <name value="Browse" />
124
+ <name value="series" />
122
125
  </test-names>
123
126
  <method v="2" />
124
127
  </configuration>
125
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.find releases with inc" 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">
126
129
  <node-interpreter>project</node-interpreter>
127
130
  <node-options />
128
131
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -135,13 +138,13 @@
135
138
  <test-names>
136
139
  <name value="MusicBrainz-api" />
137
140
  <name value="Read metadata" />
138
- <name value="Search" />
139
- <name value="searchRelease" />
140
- <name value="find releases with inc" />
141
+ <name value="Browse" />
142
+ <name value="url" />
143
+ <name value="by resources" />
141
144
  </test-names>
142
145
  <method v="2" />
143
146
  </configuration>
144
- <configuration name="MusicBrainz-api.Read metadata.Search.searchRelease.test" 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">
145
148
  <node-interpreter>project</node-interpreter>
146
149
  <node-options />
147
150
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -149,39 +152,35 @@
149
152
  <pass-parent-env>true</pass-parent-env>
150
153
  <ui>bdd</ui>
151
154
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
152
- <test-kind>TEST</test-kind>
155
+ <test-kind>SUITE</test-kind>
153
156
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
154
157
  <test-names>
155
158
  <name value="MusicBrainz-api" />
156
159
  <name value="Read metadata" />
157
- <name value="Search" />
158
- <name value="searchRelease" />
159
- <name value="test" />
160
+ <name value="Browse" />
161
+ <name value="work" />
160
162
  </test-names>
161
163
  <method v="2" />
162
164
  </configuration>
163
- <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">
164
166
  <node-interpreter>project</node-interpreter>
165
167
  <node-options />
166
168
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
167
169
  <working-directory>$PROJECT_DIR$</working-directory>
168
170
  <pass-parent-env>true</pass-parent-env>
169
- <envs>
170
- <env name="MBUSER" value="Borewit_bot" />
171
- <env name="MBPWD" value="7aSZQu2m3REqrRtjVirU" />
172
- </envs>
173
171
  <ui>bdd</ui>
174
172
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
175
- <test-kind>SUITE</test-kind>
173
+ <test-kind>TEST</test-kind>
176
174
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
177
175
  <test-names>
178
176
  <name value="MusicBrainz-api" />
179
- <name value="User (bot) post form-data API" />
180
- <name value="Recording" />
177
+ <name value="Read metadata" />
178
+ <name value="Lookup" />
179
+ <name value="url" />
181
180
  </test-names>
182
181
  <method v="2" />
183
182
  </configuration>
184
- <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">
185
184
  <node-interpreter>project</node-interpreter>
186
185
  <node-options />
187
186
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
@@ -193,28 +192,33 @@
193
192
  </envs>
194
193
  <ui>bdd</ui>
195
194
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
196
- <test-kind>TEST</test-kind>
195
+ <test-kind>SUITE</test-kind>
197
196
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
198
197
  <test-names>
199
198
  <name value="MusicBrainz-api" />
200
199
  <name value="User (bot) post form-data API" />
201
- <name value="login" />
200
+ <name value="Recording" />
202
201
  </test-names>
203
202
  <method v="2" />
204
203
  </configuration>
205
- <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">
206
205
  <node-interpreter>project</node-interpreter>
207
206
  <node-options />
208
207
  <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package>
209
208
  <working-directory>$PROJECT_DIR$</working-directory>
210
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>
211
214
  <ui>bdd</ui>
212
215
  <extra-mocha-options>--require ts-node/register</extra-mocha-options>
213
216
  <test-kind>TEST</test-kind>
214
217
  <test-file>$PROJECT_DIR$/test/test-musicbrainz-api.ts</test-file>
215
218
  <test-names>
216
219
  <name value="MusicBrainz-api" />
217
- <name value="try something" />
220
+ <name value="User (bot) post form-data API" />
221
+ <name value="login" />
218
222
  </test-names>
219
223
  <method v="2" />
220
224
  </configuration>
@@ -222,19 +226,19 @@
222
226
  <item itemvalue="Mocha.MusicBrainz-api.User (bot) post form-data API.Recording" />
223
227
  <item itemvalue="Mocha.MusicBrainz-api" />
224
228
  <item itemvalue="Mocha.MusicBrainz-api.User (bot) post form-data API.login" />
225
- <item itemvalue="Mocha.MusicBrainz-api.try something" />
226
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" />
227
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" />
228
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.test" />
229
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases with inc" />
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" />
230
234
  </list>
231
235
  <recent_temporary>
232
236
  <list>
233
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases with inc" />
234
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.test" />
235
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist use query API" />
236
- <item itemvalue="Mocha.MusicBrainz-api.Read metadata.Search.searchRelease.find releases by artist" />
237
- <item itemvalue="Mocha.MusicBrainz-api.try something" />
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" />
238
242
  </list>
239
243
  </recent_temporary>
240
244
  </component>
@@ -260,84 +264,12 @@
260
264
  <workItem from="1641417549676" duration="3002000" />
261
265
  <workItem from="1641463522932" duration="9493000" />
262
266
  <workItem from="1641482890152" duration="47000" />
263
- <workItem from="1641559515334" duration="2261000" />
264
- </task>
265
- <task id="LOCAL-00003" summary="Automatically update source-map-support">
266
- <created>1596711693157</created>
267
- <option name="number" value="00003" />
268
- <option name="presentableId" value="LOCAL-00003" />
269
- <option name="project" value="LOCAL" />
270
- <updated>1596711693157</updated>
271
- </task>
272
- <task id="LOCAL-00004" summary="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login.">
273
- <created>1613934905284</created>
274
- <option name="number" value="00004" />
275
- <option name="presentableId" value="LOCAL-00004" />
276
- <option name="project" value="LOCAL" />
277
- <updated>1613934905284</updated>
278
- </task>
279
- <task id="LOCAL-00005" summary="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login.">
280
- <created>1613935032361</created>
281
- <option name="number" value="00005" />
282
- <option name="presentableId" value="LOCAL-00005" />
283
- <option name="project" value="LOCAL" />
284
- <updated>1613935032361</updated>
285
- </task>
286
- <task id="LOCAL-00006" summary="Update rate-limiter">
287
- <created>1613935537544</created>
288
- <option name="number" value="00006" />
289
- <option name="presentableId" value="LOCAL-00006" />
290
- <option name="project" value="LOCAL" />
291
- <updated>1613935537544</updated>
292
- </task>
293
- <task id="LOCAL-00007" summary="Switch http-client to Needle">
294
- <created>1616254964257</created>
295
- <option name="number" value="00007" />
296
- <option name="presentableId" value="LOCAL-00007" />
297
- <option name="project" value="LOCAL" />
298
- <updated>1616254964258</updated>
299
- </task>
300
- <task id="LOCAL-00008" summary="Fix TypeScript array declaration">
301
- <created>1616255313930</created>
302
- <option name="number" value="00008" />
303
- <option name="presentableId" value="LOCAL-00008" />
304
- <option name="project" value="LOCAL" />
305
- <updated>1616255313930</updated>
306
- </task>
307
- <task id="LOCAL-00009" summary="Fix TypeScript array declaration">
308
- <created>1616256002544</created>
309
- <option name="number" value="00009" />
310
- <option name="presentableId" value="LOCAL-00009" />
311
- <option name="project" value="LOCAL" />
312
- <updated>1616256002544</updated>
313
- </task>
314
- <task id="LOCAL-00010" summary="Fix TypeScript array declaration">
315
- <created>1616256083701</created>
316
- <option name="number" value="00010" />
317
- <option name="presentableId" value="LOCAL-00010" />
318
- <option name="project" value="LOCAL" />
319
- <updated>1616256083701</updated>
320
- </task>
321
- <task id="LOCAL-00011" summary="Switch to GitHub workflow">
322
- <created>1616256286066</created>
323
- <option name="number" value="00011" />
324
- <option name="presentableId" value="LOCAL-00011" />
325
- <option name="project" value="LOCAL" />
326
- <updated>1616256286066</updated>
327
- </task>
328
- <task id="LOCAL-00012" summary="Switch to GitHub workflow">
329
- <created>1616257270267</created>
330
- <option name="number" value="00012" />
331
- <option name="presentableId" value="LOCAL-00012" />
332
- <option name="project" value="LOCAL" />
333
- <updated>1616257270267</updated>
334
- </task>
335
- <task id="LOCAL-00013" summary="Switch http-client to Needle">
336
- <created>1616259833224</created>
337
- <option name="number" value="00013" />
338
- <option name="presentableId" value="LOCAL-00013" />
339
- <option name="project" value="LOCAL" />
340
- <updated>1616259833224</updated>
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" />
341
273
  </task>
342
274
  <task id="LOCAL-00014" summary="Fix login with CSRF token">
343
275
  <created>1616263362074</created>
@@ -605,7 +537,84 @@
605
537
  <option name="project" value="LOCAL" />
606
538
  <updated>1641560976564</updated>
607
539
  </task>
608
- <option name="localTasksCounter" value="52" />
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" />
609
618
  <servers />
610
619
  </component>
611
620
  <component name="TypeScriptGeneratedFilesManager">
@@ -679,11 +688,9 @@
679
688
  </entry>
680
689
  </map>
681
690
  </option>
682
- <option name="oldMeFiltersMigrated" value="true" />
683
691
  </component>
684
692
  <component name="VcsManagerConfiguration">
685
693
  <option name="RELOAD_CONTEXT" value="false" />
686
- <MESSAGE value="Automatically merge updates" />
687
694
  <MESSAGE value="Automatically update coveralls" />
688
695
  <MESSAGE value="Automatically update source-map-support" />
689
696
  <MESSAGE value="Borewit/musicbrainz-api#256 Add CSRF token to login for form based login." />
@@ -705,15 +712,18 @@
705
712
  <MESSAGE value="Update to UUID ES6 module syntax" />
706
713
  <MESSAGE value="Be able to choose between query &amp; browse API" />
707
714
  <MESSAGE value="Convert subquery array in `inc` to space delimited list&#10;&#10;Resolves #390" />
708
- <option name="LAST_COMMIT_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" />
709
720
  </component>
710
721
  <component name="XDebuggerManager">
711
722
  <breakpoint-manager>
712
723
  <breakpoints>
713
- <line-breakpoint enabled="true" type="javascript">
724
+ <line-breakpoint type="javascript">
714
725
  <url>file://$PROJECT_DIR$/src/musicbrainz-api.ts</url>
715
- <line>518</line>
716
- <properties lambdaOrdinal="-1" />
726
+ <line>545</line>
717
727
  <option name="timeStamp" value="20" />
718
728
  </line-breakpoint>
719
729
  </breakpoints>