« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/data')
-rw-r--r--src/data/checks.js8
-rw-r--r--src/data/things/track.js48
2 files changed, 50 insertions, 6 deletions
diff --git a/src/data/checks.js b/src/data/checks.js
index 2b660421..0a0e7f52 100644
--- a/src/data/checks.js
+++ b/src/data/checks.js
@@ -308,8 +308,8 @@ export function filterReferenceErrors(wikiData, {
       artistContribs: '_contrib',
       contributorContribs: '_contrib',
       coverArtistContribs: '_contrib',
-      referencedTracks: '_trackMainReleasesOnly',
-      sampledTracks: '_trackMainReleasesOnly',
+      referencedTracks: '_trackReference',
+      sampledTracks: '_trackReference',
       artTags: '_artTag',
       referencedArtworks: '_artwork',
       mainRelease: '_mainRelease',
@@ -515,9 +515,9 @@ export function filterReferenceErrors(wikiData, {
                 findFn = ref => boundFind.track(ref.reference);
                 break;
 
-              case '_trackMainReleasesOnly':
+              case '_trackReference':
                 findFn = trackRef => {
-                  let track = boundFind.trackMainReleasesOnly(trackRef, {mode: 'quiet'});
+                  let track = boundFind.trackReference(trackRef, {mode: 'quiet', from: thing});
                   if (track) {
                     return track;
                   }
diff --git a/src/data/things/track.js b/src/data/things/track.js
index e65830c7..b4e56d82 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -3,6 +3,7 @@ import {inspect} from 'node:util';
 import CacheableObject from '#cacheable-object';
 import {colors} from '#cli';
 import {input, V} from '#composite';
+import find, {keyRefRegex} from '#find';
 import {onlyItem} from '#sugar';
 import {sortByDate} from '#sort';
 import Thing from '#thing';
@@ -477,7 +478,7 @@ export class Track extends Thing {
 
       referenceList({
         class: input.value(Track),
-        find: soupyFind.input('trackMainReleasesOnly'),
+        find: soupyFind.input('trackReference'),
       }),
     ],
 
@@ -486,7 +487,7 @@ export class Track extends Thing {
 
       referenceList({
         class: input.value(Track),
-        find: soupyFind.input('trackMainReleasesOnly'),
+        find: soupyFind.input('trackReference'),
       }),
     ],
 
@@ -1121,6 +1122,49 @@ export class Track extends Thing {
           : [track.name]),
     },
 
+    trackReference: {
+      referenceTypes: ['track'],
+      bindTo: 'trackData',
+
+      byob(fullRef, data, opts) {
+        const {from} = opts;
+
+        const acontextual = () =>
+          find.trackMainReleasesOnly(fullRef, data, opts);
+
+        const regexMatch = fullRef.match(keyRefRegex);
+        if (!regexMatch || regexMatch?.keyPart) {
+          // It's a reference by directory or it's malformed.
+          // Either way, we can't handle it here!
+          return acontextual();
+        }
+
+        if (!from?.isTrack) {
+          throw new Error(
+            `Expected to find starting from a track, got: ` +
+            inspect(from, {compact: true}));
+        }
+
+        const referencingTrack = from;
+        const referencedName = fullRef;
+
+        for (const track of referencingTrack.album.tracks) {
+          // Totally ignore alwaysReferenceByDirectory here.
+          // void track.alwaysReferenceByDirectory;
+
+          if (track.name === referencedName) {
+            if (track.isSecondaryRelease) {
+              return track.mainReleaseTrack;
+            } else {
+              return track;
+            }
+          }
+        }
+
+        return acontextual();
+      },
+    },
+
     trackWithArtwork: {
       referenceTypes: [
         'track',