From ff2509df4860b427362eed23d7c5cb30474708fe Mon Sep 17 00:00:00 2001 From: Anatole Sot <47571181+ano0002@users.noreply.github.com> Date: Sun, 18 Feb 2024 01:00:09 +0100 Subject: [PATCH] Add multiple methods to MusicBrainz class and caching to the poster request methods --- server/api/musicbrainz/index.ts | 91 ++++++++++++++++++++++++++++++++ server/api/musicbrainz/poster.ts | 18 ++++++- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/server/api/musicbrainz/index.ts b/server/api/musicbrainz/index.ts index adda6159b..fc08ebc5f 100644 --- a/server/api/musicbrainz/index.ts +++ b/server/api/musicbrainz/index.ts @@ -485,6 +485,39 @@ class MusicBrainz extends BaseNodeBrainz { } }; + public getFullArtist = (artistId: string): Promise => { + try { + return new Promise((resolve, reject) => { + this.artist( + artistId, + { + inc: 'tags', + }, + async (error, data) => { + if (error) { + reject(error); + } else { + const results = convertArtist(data as Artist); + results.releaseGroups = await this.getReleaseGroups(artistId); + /* + results.releases = await this.getReleases(artistId); + results.recordings = await this.getRecordings(artistId); + results.works = await this.getWorks(artistId); + */ + resolve(results); + } + } + ); + }); + } catch (e) { + logger.error('Failed to get full artist', { + label: 'MusicBrainz', + message: e.message, + }); + return new Promise((resolve) => resolve({} as mbArtist)); + } + }; + public getRecording = (recordingId: string): Promise => { try { return new Promise((resolve, reject) => { @@ -512,6 +545,64 @@ class MusicBrainz extends BaseNodeBrainz { } }; + public getReleaseGroups = (artistId: string): Promise => { + try { + return new Promise((resolve, reject) => { + this.browse( + 'release-group', + { artist: artistId }, + async (error, data) => { + if (error) { + reject(error); + } else { + const results = await new Promise( + (resolve2, reject2) => { + this.browse( + 'release-group', + { + artist: artistId, + limit: + ( + data as { + 'release-group-count': number; + 'release-group-offset': number; + 'release-groups': Group[]; + } + )['release-group-count'] ?? 25, + }, + (error, data) => { + if (error) { + reject2(error); + } else { + const results = ( + ( + data as { + 'release-group-count': number; + 'release-group-offset': number; + 'release-groups': Group[]; + } + )['release-groups'] ?? [] + ).map(convertReleaseGroup); + resolve2(results); + } + } + ); + } + ); + resolve(results); + } + } + ); + }); + } catch (e) { + logger.error('Failed to get release-groups by artist', { + label: 'MusicBrainz', + message: e.message, + }); + return new Promise((resolve) => resolve([])); + } + }; + public getReleaseGroup = ( releaseGroupId: string ): Promise => { diff --git a/server/api/musicbrainz/poster.ts b/server/api/musicbrainz/poster.ts index f3985cc1b..0a8aa1341 100644 --- a/server/api/musicbrainz/poster.ts +++ b/server/api/musicbrainz/poster.ts @@ -50,5 +50,19 @@ async function getFanartFromMB(element: mbArtist): Promise { } } -export default getPosterFromMB; -export { getFanartFromMB }; +const memoize = (fn: (...val: T[]) => unknown) => { + const cache = new Map(); + const cached = function (this: unknown, val: T) { + return cache.has(val) + ? cache.get(val) + : cache.set(val, fn.call(this, val) as ReturnType) && + cache.get(val); + }; + cached.cache = cache; + return cached; +}; + +const cachedFanartFromMB = memoize(getFanartFromMB); + +export default memoize(getPosterFromMB); +export { cachedFanartFromMB };