« get me outta code hell

yaml, data: store document specs statically on Thing subclasses - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/things/track.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2024-01-20 16:13:36 -0400
committer(quasar) nebula <qznebula@protonmail.com>2024-01-30 07:59:34 -0400
commit296a4961a951e44ea53509391ad225d1491197f9 (patch)
tree4bdedf0f85b7af8d3039bb46ccfd2f1f600db5ce /src/data/things/track.js
parentac277f23abe0d8432a94f72913f4421b0eebaa62 (diff)
yaml, data: store document specs statically on Thing subclasses
Diffstat (limited to 'src/data/things/track.js')
-rw-r--r--src/data/things/track.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 375dd81..3621510 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -55,6 +55,13 @@ import {
   withPropertyFromAlbum,
 } from '#composite/things/track';
 
+import {
+  parseAdditionalFiles,
+  parseAdditionalNames,
+  parseContributors,
+  parseDuration,
+} from '#yaml';
+
 import CacheableObject from './cacheable-object.js';
 import Thing from './thing.js';
 
@@ -332,6 +339,94 @@ export class Track extends Thing {
     }),
   });
 
+  static [Thing.yamlDocumentSpec] = {
+    fieldTransformations: {
+      'Additional Names': parseAdditionalNames,
+      'Duration': parseDuration,
+
+      'Date First Released': (value) => new Date(value),
+      'Cover Art Date': (value) => new Date(value),
+      'Has Cover Art': (value) =>
+        (value === true ? false :
+         value === false ? true :
+         value),
+
+      'Artists': parseContributors,
+      'Contributors': parseContributors,
+      'Cover Artists': parseContributors,
+
+      'Additional Files': parseAdditionalFiles,
+      'Sheet Music Files': parseAdditionalFiles,
+      'MIDI Project Files': parseAdditionalFiles,
+    },
+
+    propertyFieldMapping: {
+      name: 'Track',
+      directory: 'Directory',
+      additionalNames: 'Additional Names',
+      duration: 'Duration',
+      color: 'Color',
+      urls: 'URLs',
+
+      dateFirstReleased: 'Date First Released',
+      coverArtDate: 'Cover Art Date',
+      coverArtFileExtension: 'Cover Art File Extension',
+      disableUniqueCoverArt: 'Has Cover Art', // This gets transformed to flip true/false.
+
+      alwaysReferenceByDirectory: 'Always Reference By Directory',
+
+      lyrics: 'Lyrics',
+      commentary: 'Commentary',
+      additionalFiles: 'Additional Files',
+      sheetMusicFiles: 'Sheet Music Files',
+      midiProjectFiles: 'MIDI Project Files',
+
+      originalReleaseTrack: 'Originally Released As',
+      referencedTracks: 'Referenced Tracks',
+      sampledTracks: 'Sampled Tracks',
+      artistContribs: 'Artists',
+      contributorContribs: 'Contributors',
+      coverArtistContribs: 'Cover Artists',
+      artTags: 'Art Tags',
+    },
+
+    ignoredFields: ['Review Points'],
+
+    invalidFieldCombinations: [
+      {message: `Re-releases inherit references from the original`, fields: [
+        'Originally Released As',
+        'Referenced Tracks',
+      ]},
+
+      {message: `Re-releases inherit samples from the original`, fields: [
+        'Originally Released As',
+        'Sampled Tracks',
+      ]},
+
+      {message: `Re-releases inherit artists from the original`, fields: [
+        'Originally Released As',
+        'Artists',
+      ]},
+
+      {message: `Re-releases inherit contributors from the original`, fields: [
+        'Originally Released As',
+        'Contributors',
+      ]},
+
+      {
+        message: ({'Has Cover Art': hasCoverArt}) =>
+          (hasCoverArt
+            ? `"Has Cover Art: true" is inferred from cover artist credits`
+            : `Tracks without cover art must not have cover artist credits`),
+
+        fields: [
+          'Has Cover Art',
+          'Cover Artists',
+        ],
+      },
+    ],
+  };
+
   [inspect.custom](depth) {
     const parts = [];