@@ -17,7 +17,7 @@ import { defineRoute } from 'fresh/server.ts';
1717import { getLogger } from 'std/log/get_logger.ts' ;
1818import { 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
2222const 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