Skip to content

Commit 683d447

Browse files
committed
feat(web): Warn about potential duplicate releases on MB (by link)
Also suggest to add the MBID of the potential duplicate to the current lookup (if it was not done already).
1 parent d52bcb6 commit 683d447

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

server/routes/release.tsx

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { defineRoute } from 'fresh/server.ts';
1717
import { getLogger } from 'std/log/get_logger.ts';
1818
import { join } from 'std/url/join.ts';
1919

20-
import type { GTIN, HarmonyRelease, ProviderReleaseMap, ReleaseOptions } from '@/harmonizer/types.ts';
20+
import type { GTIN, HarmonyRelease, ProviderInfo, ProviderReleaseMap, ReleaseOptions } from '@/harmonizer/types.ts';
2121

2222
const seederTargetUrl = join(musicbrainzTargetServer, 'release/add');
2323

@@ -38,7 +38,7 @@ export default defineRoute(async (req, ctx) => {
3838
providerIds,
3939
providers,
4040
snapshotMaxTimestamp,
41-
} = extractReleaseLookupState(ctx.url, req.headers);
41+
} = extractReleaseLookupState(seederSourceUrl, req.headers);
4242
const options: ReleaseOptions = {
4343
withSeparateMedia: true,
4444
withAllTrackArtists: true,
@@ -71,6 +71,24 @@ export default defineRoute(async (req, ctx) => {
7171
type: 'info',
7272
});
7373
}
74+
75+
// Warn about potential duplicate releases on MB which already have some of the external links.
76+
for (const [mbid, providerInfo] of groupProvidersByLinkedRelease(release.info.providers)) {
77+
const mbUrl = join(musicbrainzTargetServer, 'release', mbid);
78+
const providerList = providerInfo.map((provider) => provider.name).join(' / ');
79+
let dupeWarning = `Release [${mbid}](${mbUrl}) is already linked to this ${providerList} release`;
80+
const dupeIsPartOfLookup = mbInfo?.id === mbid;
81+
if (!dupeIsPartOfLookup) {
82+
// Suggest to add the MBID of the potential duplicate to the current lookup (if it was not done already).
83+
const dupeLookupUrl = new URL(seederSourceUrl);
84+
dupeLookupUrl.searchParams.set('musicbrainz', mbid);
85+
dupeWarning += ` ([add to lookup](${dupeLookupUrl}))`;
86+
}
87+
release.info.messages.push({
88+
text: dupeWarning,
89+
type: dupeIsPartOfLookup ? 'info' : 'warning',
90+
});
91+
}
7492
}
7593
} catch (error) {
7694
if (error instanceof AggregateError) {
@@ -143,3 +161,21 @@ export default defineRoute(async (req, ctx) => {
143161
</>
144162
);
145163
});
164+
165+
function groupProvidersByLinkedRelease(providers: ProviderInfo[]): Map<string, ProviderInfo[]> {
166+
const providersByLinkedReleaseMbid = new Map<string, ProviderInfo[]>();
167+
for (const providerInfo of providers) {
168+
const { linkedReleases } = providerInfo;
169+
if (linkedReleases?.length) {
170+
for (const mbid of linkedReleases) {
171+
let list = providersByLinkedReleaseMbid.get(mbid);
172+
if (!list) {
173+
list = [];
174+
providersByLinkedReleaseMbid.set(mbid, list);
175+
}
176+
list.push(providerInfo);
177+
}
178+
}
179+
}
180+
return providersByLinkedReleaseMbid;
181+
}

0 commit comments

Comments
 (0)