Index: src/services/ap-core.js
===================================================================
--- src/services/ap-core.js	(revision 8455dac40de53d0edba192fe5314007b8ac8dc0c)
+++ src/services/ap-core.js	(revision f50a84b2ccb39b0646c595ef6a2c3ca4b494df4a)
@@ -50,4 +50,11 @@
     // schema.org, dus we hoeven geen vreemd vocabulaire binnen te halen.
     license: { '@id': 'schema:license', '@type': '@id' },
+    // "Dit ding is ook bekend onder die URI" -- voor de MusicBrainz-koppeling
+    // van een artiest (shaer-mbz). Bewust NIET alsoKnownAs: dat is in AS2
+    // gereserveerd voor vroegere IDENTITEITEN van dezelfde actor, en een
+    // verhuizing leunt erop (FEP-7628). Een verwijzing naar een register is
+    // iets anders dan een oud account van jezelf, en die twee door elkaar halen
+    // zou een verhuizing kunnen laten mislukken.
+    sameAs: { '@id': 'schema:sameAs', '@type': '@id' },
     position: 'schema:position',
     bitrate: 'schema:bitrate',
@@ -268,2 +275,12 @@
   };
 }
+
+/** Is dit een MBID? Een UUID, en niets anders. */
+export function isMbid(s) {
+  return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(String(s || '').trim());
+}
+
+/** De publieke pagina van een artiest, of null als het geen MBID is. */
+export function artiestUrl(mbid) {
+  return isMbid(mbid) ? `https://musicbrainz.org/artist/${String(mbid).trim().toLowerCase()}` : null;
+}
