« 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/things.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things.js')
-rw-r--r--src/data/things.js27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/data/things.js b/src/data/things.js
index b5d6f10..e061d58 100644
--- a/src/data/things.js
+++ b/src/data/things.js
@@ -252,6 +252,9 @@ Thing.common = {
     })
 };
 
+// Get a reference to a thing (e.g. track:showtime-piano-refrain), using its
+// constructor's [Thing.referenceType] as the prefix. This will throw an error
+// if the thing's directory isn't yet provided/computable.
 Thing.getReference = function(thing) {
     if (!thing.constructor[Thing.referenceType])
         throw TypeError(`Passed Thing is ${thing.constructor.name}, which provides no [Thing.referenceType]`);
@@ -398,7 +401,6 @@ Track.propertyDescriptors = {
 
     urls: Thing.common.urls(),
     dateFirstReleased: Thing.common.simpleDate(),
-    coverArtDate: Thing.common.simpleDate(),
 
     hasCoverArt: Thing.common.flag(true),
     hasURLs: Thing.common.flag(true),
@@ -451,9 +453,32 @@ Track.propertyDescriptors = {
         }
     },
 
+    coverArtDate: {
+        flags: {update: true, expose: true},
+
+        update: {validate: isDate},
+
+        expose: {
+            dependencies: ['albumData', 'dateFirstReleased'],
+            transform: (coverArtDate, { albumData, dateFirstReleased, [Track.instance]: track }) => (
+                coverArtDate ??
+                dateFirstReleased ??
+                albumData?.find(album => album.tracks.includes(track))?.trackArtDate ??
+                albumData?.find(album => album.tracks.includes(track))?.date ??
+                null
+            )
+        }
+    },
+
     // Previously known as: (track).artists
     artistContribs: Thing.common.dynamicContribs('artistContribsByRef'),
 
+    // Previously known as: (track).contributors
+    contributorContribs: Thing.common.dynamicContribs('contributorContribsByRef'),
+
+    // Previously known as: (track).coverArtists
+    coverArtistContribs: Thing.common.dynamicContribs('coverArtistContribsByRef'),
+
     artTags: {
         flags: {expose: true},