|
@@ -4,6 +4,7 @@ import CoreClass from "../core";
|
|
|
import { MUSARE_VERSION } from "..";
|
|
|
|
|
|
export const MUSICBRAINZ_CAA_CACHED_RESPONSE_REDIS_TABLE = "musicbrainzCAACachedResponse";
|
|
|
+export const MUSICBRAINZ_RECORDINGS_RELEASES_RELEASE_GROUPS_REDIS_TABLE = "musicbrainzRecordingsReleasesReleaseGroups";
|
|
|
|
|
|
class RateLimitter {
|
|
|
/**
|
|
@@ -37,6 +38,7 @@ class RateLimitter {
|
|
|
let MusicBrainzModule;
|
|
|
let DBModule;
|
|
|
let CacheModule;
|
|
|
+let AppModule;
|
|
|
|
|
|
class _MusicBrainzModule extends CoreClass {
|
|
|
// eslint-disable-next-line require-jsdoc
|
|
@@ -205,7 +207,7 @@ class _MusicBrainzModule extends CoreClass {
|
|
|
const existingResponse = await CacheModule.runJob(
|
|
|
"HGET",
|
|
|
{
|
|
|
- table: "musicbrainzRecordingsReleasesReleaseGroups",
|
|
|
+ table: MUSICBRAINZ_RECORDINGS_RELEASES_RELEASE_GROUPS_REDIS_TABLE,
|
|
|
key: artistId
|
|
|
},
|
|
|
this
|
|
@@ -213,30 +215,59 @@ class _MusicBrainzModule extends CoreClass {
|
|
|
if (existingResponse) return existingResponse;
|
|
|
|
|
|
const fetchDate = new Date();
|
|
|
- let maxReleases = 0;
|
|
|
- let releases = [];
|
|
|
+
|
|
|
+ let maxArtistReleases = 0;
|
|
|
+ let artistReleases = [];
|
|
|
do {
|
|
|
- const offset = releases.length;
|
|
|
+ const offset = artistReleases.length;
|
|
|
// eslint-disable-next-line no-await-in-loop
|
|
|
const response = await MusicBrainzModule.runJob(
|
|
|
"GET_RECORDINGS_RELEASES_RELEASE_GROUPS_PAGE",
|
|
|
{ artistId, offset },
|
|
|
this
|
|
|
);
|
|
|
- maxReleases = response["release-count"];
|
|
|
- releases = [...releases, ...response.releases];
|
|
|
+ maxArtistReleases = response["release-count"];
|
|
|
+ artistReleases = [...artistReleases, ...response.releases];
|
|
|
if (response.releases.length === 0) break;
|
|
|
- } while (maxReleases >= releases.length);
|
|
|
+ } while (maxArtistReleases >= artistReleases.length);
|
|
|
+
|
|
|
+ let maxTrackArtistReleases = 0;
|
|
|
+ let trackArtistReleases = [];
|
|
|
+ do {
|
|
|
+ const offset = trackArtistReleases.length;
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ const response = await MusicBrainzModule.runJob(
|
|
|
+ "GET_RECORDINGS_RELEASES_RELEASE_GROUPS_PAGE_WITH_TRACK_ARTIST",
|
|
|
+ { artistId, offset },
|
|
|
+ this
|
|
|
+ );
|
|
|
+ maxTrackArtistReleases = response["release-count"];
|
|
|
+ trackArtistReleases = [...trackArtistReleases, ...response.releases];
|
|
|
+ if (response.releases.length === 0) break;
|
|
|
+ } while (maxTrackArtistReleases >= trackArtistReleases.length);
|
|
|
+
|
|
|
+ let maxRecordings = 0;
|
|
|
+ let recordings = [];
|
|
|
+ do {
|
|
|
+ const offset = recordings.length;
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ const response = await MusicBrainzModule.runJob("GET_RECORDINGS_PAGE", { artistId, offset }, this);
|
|
|
+ maxRecordings = response["recording-count"];
|
|
|
+ recordings = [...recordings, ...response.recordings];
|
|
|
+ if (response.recordings.length === 0) break;
|
|
|
+ } while (maxRecordings >= recordings.length);
|
|
|
|
|
|
const response = {
|
|
|
- releases,
|
|
|
+ artistReleases,
|
|
|
+ trackArtistReleases,
|
|
|
+ recordings,
|
|
|
fetchDate
|
|
|
};
|
|
|
|
|
|
await CacheModule.runJob(
|
|
|
"HSET",
|
|
|
{
|
|
|
- table: "musicbrainzRecordingsReleasesReleaseGroups",
|
|
|
+ table: MUSICBRAINZ_RECORDINGS_RELEASES_RELEASE_GROUPS_REDIS_TABLE,
|
|
|
key: artistId,
|
|
|
value: JSON.stringify(response)
|
|
|
},
|
|
@@ -263,7 +294,82 @@ class _MusicBrainzModule extends CoreClass {
|
|
|
params: {
|
|
|
fmt: "json",
|
|
|
artist: artistId,
|
|
|
- inc: "release-groups+recordings",
|
|
|
+ inc: [
|
|
|
+ "url-rels",
|
|
|
+ "release-groups",
|
|
|
+ "release-group-level-rels",
|
|
|
+ "url-rels",
|
|
|
+ "recordings",
|
|
|
+ "recording-level-rels",
|
|
|
+ "work-rels",
|
|
|
+ "url-rels"
|
|
|
+ ].join("+"),
|
|
|
+ limit: 100,
|
|
|
+ offset
|
|
|
+ }
|
|
|
+ },
|
|
|
+ this
|
|
|
+ );
|
|
|
+
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets a list of recordings, releases and release groups for a given track artist, for a given page
|
|
|
+ * @param {object} payload - object that contains the payload
|
|
|
+ * @param {string} payload.artistId - MusicBrainz artist id
|
|
|
+ * @param {string} payload.offset - offset by how much
|
|
|
+ * @returns {Promise} - returns promise (reject, resolve)
|
|
|
+ */
|
|
|
+ async GET_RECORDINGS_RELEASES_RELEASE_GROUPS_PAGE_WITH_TRACK_ARTIST(payload) {
|
|
|
+ const { artistId, offset } = payload;
|
|
|
+
|
|
|
+ const response = await MusicBrainzModule.runJob(
|
|
|
+ "API_CALL",
|
|
|
+ {
|
|
|
+ url: `https://musicbrainz.org/ws/2/release`,
|
|
|
+ params: {
|
|
|
+ fmt: "json",
|
|
|
+ track_artist: artistId,
|
|
|
+ inc: [
|
|
|
+ "url-rels",
|
|
|
+ "release-groups",
|
|
|
+ "release-group-level-rels",
|
|
|
+ "url-rels",
|
|
|
+ "recordings"
|
|
|
+ // "recording-level-rels",
|
|
|
+ // "work-rels",
|
|
|
+ // "url-rels",
|
|
|
+ // "artist-credits"
|
|
|
+ ].join("+"),
|
|
|
+ limit: 100,
|
|
|
+ offset
|
|
|
+ }
|
|
|
+ },
|
|
|
+ this
|
|
|
+ );
|
|
|
+
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets a list of recordings for an artist, for a given page
|
|
|
+ * @param {object} payload - object that contains the payload
|
|
|
+ * @param {string} payload.artistId - MusicBrainz artist id
|
|
|
+ * @param {string} payload.offset - offset by how much
|
|
|
+ * @returns {Promise} - returns promise (reject, resolve)
|
|
|
+ */
|
|
|
+ async GET_RECORDINGS_PAGE(payload) {
|
|
|
+ const { artistId, offset } = payload;
|
|
|
+
|
|
|
+ const response = await MusicBrainzModule.runJob(
|
|
|
+ "API_CALL",
|
|
|
+ {
|
|
|
+ url: `https://musicbrainz.org/ws/2/recording`,
|
|
|
+ params: {
|
|
|
+ fmt: "json",
|
|
|
+ artist: artistId,
|
|
|
+ inc: ["artist-credits", "isrcs", "work-rels", "url-rels"].join("+"),
|
|
|
limit: 100,
|
|
|
offset
|
|
|
}
|