Browse Source

refactor: get even more msucibrainz data when requesting recordings and such

Kristian Vos 1 ngày trước cách đây
mục cha
commit
d08b95b676
1 tập tin đã thay đổi với 116 bổ sung10 xóa
  1. 116 10
      backend/logic/musicbrainz.js

+ 116 - 10
backend/logic/musicbrainz.js

@@ -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
 				}