diff options
| author | (quasar) nebula <qznebula@protonmail.com> | 2026-01-23 21:17:44 -0400 |
|---|---|---|
| committer | (quasar) nebula <qznebula@protonmail.com> | 2026-01-23 21:25:58 -0400 |
| commit | cde3475836ffedcd06cc7bfb8a6dd1a5bd64dfcc (patch) | |
| tree | 07494be8bf7bf8dec1eff4d4abac07b1bd3c5050 /src/data/things | |
| parent | 7ae13014089ef91067bafd4cec0247dc25a03496 (diff) | |
data: find.trackReference() - prioritize tracks from same album preview
Diffstat (limited to 'src/data/things')
| -rw-r--r-- | src/data/things/track.js | 48 |
1 files changed, 46 insertions, 2 deletions
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', |