From cde3475836ffedcd06cc7bfb8a6dd1a5bd64dfcc Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 23 Jan 2026 21:17:44 -0400 Subject: data: find.trackReference() - prioritize tracks from same album --- src/data/checks.js | 8 ++++---- src/data/things/track.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 6 deletions(-) (limited to 'src') 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', -- cgit 1.3.0-6-gf8a5