« 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/album.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things/album.js')
-rw-r--r--src/data/things/album.js406
1 files changed, 220 insertions, 186 deletions
diff --git a/src/data/things/album.js b/src/data/things/album.js
index ca25b7e2..45cadc12 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -75,7 +75,13 @@ export class Album extends Thing {
     TrackSection,
     WikiInfo,
   }) => ({
-    // Update & expose
+    // > Update & expose - Internal relationships
+
+    trackSections: thingList({
+      class: input.value(TrackSection),
+    }),
+
+    // > Update & expose - Identifying metadata
 
     name: name('Unnamed Album'),
     directory: directory(),
@@ -96,109 +102,129 @@ export class Album extends Thing {
     alwaysReferenceTracksByDirectory: flag(false),
     suffixTrackDirectories: flag(false),
 
-    countTracksInArtistTotals: flag(true),
-
-    color: color(),
-    urls: urls(),
+    bandcampAlbumIdentifier: simpleString(),
+    bandcampArtworkIdentifier: simpleString(),
 
     additionalNames: thingList({
       class: input.value(AdditionalName),
     }),
 
-    bandcampAlbumIdentifier: simpleString(),
-    bandcampArtworkIdentifier: simpleString(),
-
     date: simpleDate(),
-    trackArtDate: simpleDate(),
     dateAddedToWiki: simpleDate(),
 
-    coverArtDate: [
-      withCoverArtDate({
-        from: input.updateValue({
-          validate: isDate,
-        }),
-      }),
+    // > Update & expose - Credits and contributors
 
-      exposeDependency({dependency: '#coverArtDate'}),
-    ],
+    artistContribs: contributionList({
+      date: 'date',
+      artistProperty: input.value('albumArtistContributions'),
+    }),
 
-    coverArtFileExtension: [
+    // > Update & expose - General configuration
+
+    countTracksInArtistTotals: flag(true),
+
+    hasTrackNumbers: flag(true),
+    isListedOnHomepage: flag(true),
+    isListedInGalleries: flag(true),
+
+    // > Update & expose - General metadata
+
+    color: color(),
+
+    urls: urls(),
+
+    // > Update & expose - Artworks
+
+    coverArtworks: [
+      // This works, lol, because this array describes `expose.transform` for
+      // the coverArtworks property, and compositions generally access the
+      // update value, not what's exposed by property access out in the open.
+      // There's no recursion going on here.
       exitWithoutArtwork({
         contribs: 'coverArtistContribs',
         artworks: 'coverArtworks',
+        value: input.value([]),
       }),
 
-      fileExtension('jpg'),
+      constitutibleArtworkList.fromYAMLFieldSpec
+        .call(this, 'Cover Artwork'),
     ],
 
-    trackCoverArtFileExtension: fileExtension('jpg'),
+    coverArtistContribs: [
+      withCoverArtDate(),
 
-    wallpaperFileExtension: [
-      exitWithoutArtwork({
-        contribs: 'wallpaperArtistContribs',
-        artwork: 'wallpaperArtwork',
+      contributionList({
+        date: '#coverArtDate',
+        artistProperty: input.value('albumCoverArtistContributions'),
       }),
-
-      fileExtension('jpg'),
     ],
 
-    bannerFileExtension: [
-      exitWithoutArtwork({
-        contribs: 'bannerArtistContribs',
-        artwork: 'bannerArtwork',
+    coverArtDate: [
+      withCoverArtDate({
+        from: input.updateValue({
+          validate: isDate,
+        }),
       }),
 
-      fileExtension('jpg'),
+      exposeDependency({dependency: '#coverArtDate'}),
     ],
 
-    wallpaperStyle: [
+    coverArtFileExtension: [
       exitWithoutArtwork({
-        contribs: 'wallpaperArtistContribs',
-        artwork: 'wallpaperArtwork',
+        contribs: 'coverArtistContribs',
+        artworks: 'coverArtworks',
       }),
 
-      simpleString(),
+      fileExtension('jpg'),
     ],
 
-    wallpaperParts: [
-      // kinda nonsensical or at least unlikely lol, but y'know
+    coverArtDimensions: [
       exitWithoutArtwork({
-        contribs: 'wallpaperArtistContribs',
-        artwork: 'wallpaperArtwork',
-        value: input.value([]),
+        contribs: 'coverArtistContribs',
+        artworks: 'coverArtworks',
       }),
 
-      wallpaperParts(),
+      dimensions(),
     ],
 
-    bannerStyle: [
+    artTags: [
       exitWithoutArtwork({
-        contribs: 'bannerArtistContribs',
-        artwork: 'bannerArtwork',
+        contribs: 'coverArtistContribs',
+        artworks: 'coverArtworks',
+        value: input.value([]),
       }),
 
-      simpleString(),
+      referenceList({
+        class: input.value(ArtTag),
+        find: soupyFind.input('artTag'),
+      }),
     ],
 
-    coverArtDimensions: [
+    referencedArtworks: [
       exitWithoutArtwork({
         contribs: 'coverArtistContribs',
         artworks: 'coverArtworks',
+        value: input.value([]),
       }),
 
-      dimensions(),
+      referencedArtworkList(),
     ],
 
-    trackDimensions: dimensions(),
+    trackCoverArtistContribs: contributionList({
+      // May be null, indicating cover art was added for tracks on the date
+      // each track specifies, or else the track's own release date.
+      date: 'trackArtDate',
 
-    bannerDimensions: [
-      exitWithoutArtwork({
-        contribs: 'bannerArtistContribs',
-        artwork: 'bannerArtwork',
-      }),
+      // This is the "correct" value, but it gets overwritten - with the same
+      // value - regardless.
+      artistProperty: input.value('trackCoverArtistContributions'),
+    }),
 
-      dimensions(),
-    ],
+    trackArtDate: simpleDate(),
+
+    trackCoverArtFileExtension: fileExtension('jpg'),
+
+    trackDimensions: dimensions(),
 
     wallpaperArtwork: [
       exitWithoutDependency({
@@ -211,121 +237,113 @@ export class Album extends Thing {
         .call(this, 'Wallpaper Artwork'),
     ],
 
-    bannerArtwork: [
-      exitWithoutDependency({
-        dependency: 'bannerArtistContribs',
-        mode: input.value('empty'),
-        value: input.value(null),
-      }),
+    wallpaperArtistContribs: [
+      withCoverArtDate(),
 
-      constitutibleArtwork.fromYAMLFieldSpec
-        .call(this, 'Banner Artwork'),
+      contributionList({
+        date: '#coverArtDate',
+        artistProperty: input.value('albumWallpaperArtistContributions'),
+      }),
     ],
 
-    coverArtworks: [
-      // This works, lol, because this array describes `expose.transform` for
-      // the coverArtworks property, and compositions generally access the
-      // update value, not what's exposed by property access out in the open.
-      // There's no recursion going on here.
+    wallpaperFileExtension: [
       exitWithoutArtwork({
-        contribs: 'coverArtistContribs',
-        artworks: 'coverArtworks',
-        value: input.value([]),
+        contribs: 'wallpaperArtistContribs',
+        artwork: 'wallpaperArtwork',
       }),
 
-      constitutibleArtworkList.fromYAMLFieldSpec
-        .call(this, 'Cover Artwork'),
+      fileExtension('jpg'),
     ],
 
-    hasTrackNumbers: flag(true),
-    isListedOnHomepage: flag(true),
-    isListedInGalleries: flag(true),
+    wallpaperStyle: [
+      exitWithoutArtwork({
+        contribs: 'wallpaperArtistContribs',
+        artwork: 'wallpaperArtwork',
+      }),
 
-    commentary: thingList({
-      class: input.value(CommentaryEntry),
-    }),
+      simpleString(),
+    ],
 
-    creditingSources: thingList({
-      class: input.value(CreditingSourcesEntry),
-    }),
+    wallpaperParts: [
+      // kinda nonsensical or at least unlikely lol, but y'know
+      exitWithoutArtwork({
+        contribs: 'wallpaperArtistContribs',
+        artwork: 'wallpaperArtwork',
+        value: input.value([]),
+      }),
 
-    additionalFiles: thingList({
-      class: input.value(AdditionalFile),
-    }),
+      wallpaperParts(),
+    ],
 
-    trackSections: thingList({
-      class: input.value(TrackSection),
-    }),
+    bannerArtwork: [
+      exitWithoutDependency({
+        dependency: 'bannerArtistContribs',
+        mode: input.value('empty'),
+        value: input.value(null),
+      }),
 
-    artistContribs: contributionList({
-      date: 'date',
-      artistProperty: input.value('albumArtistContributions'),
-    }),
+      constitutibleArtwork.fromYAMLFieldSpec
+        .call(this, 'Banner Artwork'),
+    ],
 
-    coverArtistContribs: [
+    bannerArtistContribs: [
       withCoverArtDate(),
 
       contributionList({
         date: '#coverArtDate',
-        artistProperty: input.value('albumCoverArtistContributions'),
+        artistProperty: input.value('albumBannerArtistContributions'),
       }),
     ],
 
-    trackCoverArtistContribs: contributionList({
-      // May be null, indicating cover art was added for tracks on the date
-      // each track specifies, or else the track's own release date.
-      date: 'trackArtDate',
-
-      // This is the "correct" value, but it gets overwritten - with the same
-      // value - regardless.
-      artistProperty: input.value('trackCoverArtistContributions'),
-    }),
+    bannerFileExtension: [
+      exitWithoutArtwork({
+        contribs: 'bannerArtistContribs',
+        artwork: 'bannerArtwork',
+      }),
 
-    wallpaperArtistContribs: [
-      withCoverArtDate(),
+      fileExtension('jpg'),
+    ],
 
-      contributionList({
-        date: '#coverArtDate',
-        artistProperty: input.value('albumWallpaperArtistContributions'),
+    bannerDimensions: [
+      exitWithoutArtwork({
+        contribs: 'bannerArtistContribs',
+        artwork: 'bannerArtwork',
       }),
-    ],
 
-    bannerArtistContribs: [
-      withCoverArtDate(),
+      dimensions(),
+    ],
 
-      contributionList({
-        date: '#coverArtDate',
-        artistProperty: input.value('albumBannerArtistContributions'),
+    bannerStyle: [
+      exitWithoutArtwork({
+        contribs: 'bannerArtistContribs',
+        artwork: 'bannerArtwork',
       }),
+
+      simpleString(),
     ],
 
+    // > Update & expose - Groups
+
     groups: referenceList({
       class: input.value(Group),
       find: soupyFind.input('group'),
     }),
 
-    artTags: [
-      exitWithoutArtwork({
-        contribs: 'coverArtistContribs',
-        artworks: 'coverArtworks',
-        value: input.value([]),
-      }),
+    // > Update & expose - Content entries
 
-      referenceList({
-        class: input.value(ArtTag),
-        find: soupyFind.input('artTag'),
-      }),
-    ],
+    commentary: thingList({
+      class: input.value(CommentaryEntry),
+    }),
 
-    referencedArtworks: [
-      exitWithoutArtwork({
-        contribs: 'coverArtistContribs',
-        artworks: 'coverArtworks',
-        value: input.value([]),
-      }),
+    creditingSources: thingList({
+      class: input.value(CreditingSourcesEntry),
+    }),
 
-      referencedArtworkList(),
-    ],
+    // Additional files
+
+    additionalFiles: thingList({
+      class: input.value(AdditionalFile),
+    }),
 
     // Update only
 
@@ -515,21 +533,14 @@ export class Album extends Thing {
 
   static [Thing.yamlDocumentSpec] = {
     fields: {
-      'Album': {property: 'name'},
+      // Identifying metadata
 
+      'Album': {property: 'name'},
       'Directory': {property: 'directory'},
       'Directory Suffix': {property: 'directorySuffix'},
       'Suffix Track Directories': {property: 'suffixTrackDirectories'},
-
       'Always Reference By Directory': {property: 'alwaysReferenceByDirectory'},
-      'Always Reference Tracks By Directory': {
-        property: 'alwaysReferenceTracksByDirectory',
-      },
-
-      'Additional Names': {
-        property: 'additionalNames',
-        transform: parseAdditionalNames,
-      },
+      'Always Reference Tracks By Directory': {property: 'alwaysReferenceTracksByDirectory'},
 
       'Bandcamp Album ID': {
         property: 'bandcampAlbumIdentifier',
@@ -541,20 +552,46 @@ export class Album extends Thing {
         transform: String,
       },
 
-      'Count Tracks In Artist Totals': {property: 'countInArtistTotals'},
+      'Additional Names': {
+        property: 'additionalNames',
+        transform: parseAdditionalNames,
+      },
 
       'Date': {
         property: 'date',
         transform: parseDate,
       },
 
-      'Color': {property: 'color'},
-      'URLs': {property: 'urls'},
+      'Date Added': {
+        property: 'dateAddedToWiki',
+        transform: parseDate,
+      },
+
+      // Credits and contributors
+
+      'Artists': {
+        property: 'artistContribs',
+        transform: parseContributors,
+      },
+
+      // General configuration
+
+      'Count Tracks In Artist Totals': {property: 'countInArtistTotals'},
 
       'Has Track Numbers': {property: 'hasTrackNumbers'},
       'Listed on Homepage': {property: 'isListedOnHomepage'},
       'Listed in Galleries': {property: 'isListedInGalleries'},
 
+      // General metadata
+
+      'Color': {property: 'color'},
+
+      'URLs': {property: 'urls'},
+
+      // Artworks
+      //  (Note - this YAML section is deliberately ordered differently
+      //   than the corresponding property descriptors.)
+
       'Cover Artwork': {
         property: 'coverArtworks',
         transform:
@@ -598,27 +635,29 @@ export class Album extends Thing {
           }),
       },
 
+      'Cover Artists': {
+        property: 'coverArtistContribs',
+        transform: parseContributors,
+      },
+
       'Cover Art Date': {
         property: 'coverArtDate',
         transform: parseDate,
       },
 
-      'Default Track Cover Art Date': {
-        property: 'trackArtDate',
-        transform: parseDate,
+      'Cover Art Dimensions': {
+        property: 'coverArtDimensions',
+        transform: parseDimensions,
       },
 
-      'Date Added': {
-        property: 'dateAddedToWiki',
-        transform: parseDate,
+      'Default Track Cover Artists': {
+        property: 'trackCoverArtistContribs',
+        transform: parseContributors,
       },
 
-      'Cover Art File Extension': {property: 'coverArtFileExtension'},
-      'Track Art File Extension': {property: 'trackCoverArtFileExtension'},
-
-      'Cover Art Dimensions': {
-        property: 'coverArtDimensions',
-        transform: parseDimensions,
+      'Default Track Cover Art Date': {
+        property: 'trackArtDate',
+        transform: parseDate,
       },
 
       'Default Track Dimensions': {
@@ -631,8 +670,6 @@ export class Album extends Thing {
         transform: parseContributors,
       },
 
-      'Wallpaper File Extension': {property: 'wallpaperFileExtension'},
-
       'Wallpaper Style': {property: 'wallpaperStyle'},
 
       'Wallpaper Parts': {
@@ -645,14 +682,31 @@ export class Album extends Thing {
         transform: parseContributors,
       },
 
-      'Banner Style': {property: 'bannerStyle'},
-      'Banner File Extension': {property: 'bannerFileExtension'},
-
       'Banner Dimensions': {
         property: 'bannerDimensions',
         transform: parseDimensions,
       },
 
+      'Banner Style': {property: 'bannerStyle'},
+
+      'Cover Art File Extension': {property: 'coverArtFileExtension'},
+      'Track Art File Extension': {property: 'trackCoverArtFileExtension'},
+      'Wallpaper File Extension': {property: 'wallpaperFileExtension'},
+      'Banner File Extension': {property: 'bannerFileExtension'},
+
+      'Art Tags': {property: 'artTags'},
+
+      'Referenced Artworks': {
+        property: 'referencedArtworks',
+        transform: parseAnnotatedReferences,
+      },
+
+      // Groups
+
+      'Groups': {property: 'groups'},
+
+      // Content entries
+
       'Commentary': {
         property: 'commentary',
         transform: parseCommentary,
@@ -663,36 +717,16 @@ export class Album extends Thing {
         transform: parseCreditingSources,
       },
 
+      // Additional files
+
       'Additional Files': {
         property: 'additionalFiles',
         transform: parseAdditionalFiles,
       },
 
-      'Referenced Artworks': {
-        property: 'referencedArtworks',
-        transform: parseAnnotatedReferences,
-      },
+      // Shenanigans
 
       'Franchises': {ignore: true},
-
-      'Artists': {
-        property: 'artistContribs',
-        transform: parseContributors,
-      },
-
-      'Cover Artists': {
-        property: 'coverArtistContribs',
-        transform: parseContributors,
-      },
-
-      'Default Track Cover Artists': {
-        property: 'trackCoverArtistContribs',
-        transform: parseContributors,
-      },
-
-      'Groups': {property: 'groups'},
-      'Art Tags': {property: 'artTags'},
-
       'Review Points': {ignore: true},
     },