« get me outta code hell

data: {Album,TrackSection}.excludingTrackURLs - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2026-05-19 16:29:21 -0300
committer(quasar) nebula <qznebula@protonmail.com>2026-05-19 16:29:21 -0300
commite9ec97e5063f1255b2f03a5dc31c1a88aa142aa0 (patch)
treeadd634a57869741f29b605a0f954e6838866528d
parent06e32433951750f7c364b9faba9f6705a414d3b0 (diff)
data: {Album,TrackSection}.excludingTrackURLs
-rw-r--r--src/data/things/Track.js20
-rw-r--r--src/data/things/album/Album.js17
-rw-r--r--src/data/things/album/TrackSection.js19
-rw-r--r--src/validators.js8
4 files changed, 49 insertions, 15 deletions
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index 9e35368b..f8eac729 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -16,6 +16,7 @@ import {
   isContentString,
   isContributionList,
   isDate,
+  isExcludingURLsReason,
   isFileExtension,
   validateReference,
 } from '#validators';
@@ -381,19 +382,14 @@ export class Track extends Thing {
       },
     ],
 
-    excludingURLs: {
-      flags: {update: true, expose: true},
+    excludingURLs: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(isExcludingURLsReason),
+      }),
 
-      update: {
-        validate:
-          is(...[
-            'quietly',
-            'generic',
-            'not clearly public',
-            'paid bonus track',
-          ]),
-      },
-    },
+      withPropertyFromObject('trackSection', V('excludingTrackURLs')),
+      exposeDependency('#trackSection.excludingTrackURLs'),
+    ],
 
     urls: [
       {
diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js
index eaf19247..e212548d 100644
--- a/src/data/things/album/Album.js
+++ b/src/data/things/album/Album.js
@@ -1,8 +1,15 @@
 import {input, V} from '#composite';
 import {empty} from '#sugar';
 import Thing from '#thing';
-import {is, isContributionList, isDate, isDirectory, isNumber}
-  from '#validators';
+
+import {
+  is,
+  isContributionList,
+  isDate,
+  isExcludingURLsReason,
+  isDirectory,
+  isNumber,
+} from '#validators';
 
 import {
   parseAdditionalFiles,
@@ -172,6 +179,11 @@ export class Album extends Thing {
 
     countTracksInArtistTotals: flag(V(true)),
 
+    excludingTrackURLs: {
+      flags: {update: true, expose: true},
+      update: {validate: isExcludingURLsReason},
+    },
+
     isListedOnHomepage: flag(V(true)),
     isListedInGalleries: flag(V(true)),
 
@@ -639,6 +651,7 @@ export class Album extends Thing {
       // General configuration
 
       'Count Tracks In Artist Totals': {property: 'countTracksInArtistTotals'},
+      'Excluding Track URLs': {property: 'excludingTrackURLs'},
 
       'Listed on Homepage': {property: 'isListedOnHomepage'},
       'Listed in Galleries': {property: 'isListedInGalleries'},
diff --git a/src/data/things/album/TrackSection.js b/src/data/things/album/TrackSection.js
index a7763184..15688735 100644
--- a/src/data/things/album/TrackSection.js
+++ b/src/data/things/album/TrackSection.js
@@ -3,9 +3,16 @@ import {inspect} from 'node:util';
 import {colors} from '#cli';
 import {input, V} from '#composite';
 import Thing from '#thing';
-import {isBoolean, isColor, isDirectory, isNumber} from '#validators';
 import {parseDate} from '#yaml';
 
+import {
+  isBoolean,
+  isColor,
+  isDirectory,
+  isExcludingURLsReason,
+  isNumber,
+} from '#validators';
+
 import {withLengthOfList, withNearbyItemFromList, withPropertyFromObject}
   from '#composite/data';
 
@@ -112,6 +119,15 @@ export class TrackSection extends Thing {
       exposeDependency('#album.countTracksInArtistTotals'),
     ],
 
+    excludingTrackURLs: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(isExcludingURLsReason),
+      }),
+
+      withPropertyFromObject('album', V('excludingTrackURLs')),
+      exposeDependency('#album.excludingTrackURLs'),
+    ],
+
     isDefaultTrackSection: flag(V(false)),
 
     description: contentString(),
@@ -196,6 +212,7 @@ export class TrackSection extends Thing {
       },
 
       'Count Tracks In Artist Totals': {property: 'countTracksInArtistTotals'},
+      'Excluding Track URLs': {property: 'excludingTrackURLs'},
 
       'Description': {property: 'description'},
     },
diff --git a/src/validators.js b/src/validators.js
index 508950d6..b702682e 100644
--- a/src/validators.js
+++ b/src/validators.js
@@ -822,6 +822,14 @@ export function isCuratedURL(string) {
   return true;
 }
 
+export const isExcludingURLsReason =
+  is(...[
+    'quietly',
+    'generic',
+    'not clearly public',
+    'paid bonus track',
+  ]);
+
 export const validateURLEntry = (isURL) =>
   validateProperties({
     url: isURL,