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/things/track.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'src/data/things') 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