« 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
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things')
-rw-r--r--src/data/things/album.js30
-rw-r--r--src/data/things/artwork.js97
-rw-r--r--src/data/things/index.js2
-rw-r--r--src/data/things/track.js24
4 files changed, 146 insertions, 7 deletions
diff --git a/src/data/things/album.js b/src/data/things/album.js
index e7ab9def..1c13ef16 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -15,6 +15,7 @@ import {
   parseAdditionalFiles,
   parseAdditionalNames,
   parseAnnotatedReferences,
+  parseArtwork,
   parseContributors,
   parseDate,
   parseDimensions,
@@ -34,6 +35,7 @@ import {
   commentary,
   color,
   commentatorArtists,
+  constitutibleArtwork,
   contentString,
   contribsPresent,
   contributionList,
@@ -157,6 +159,12 @@ export class Album extends Thing {
       dimensions(),
     ],
 
+    coverArtwork: constitutibleArtwork({
+      contribs: 'coverArtistContribs',
+      date: 'coverArtDate',
+      artistProperty: input.value('albumCoverArtistContributions'),
+    }),
+
     hasTrackNumbers: flag(true),
     isListedOnHomepage: flag(true),
     isListedInGalleries: flag(true),
@@ -459,6 +467,16 @@ export class Album extends Thing {
       'Listed on Homepage': {property: 'isListedOnHomepage'},
       'Listed in Galleries': {property: 'isListedInGalleries'},
 
+      'Cover Artwork': {
+        property: 'coverArtwork',
+        transform:
+          parseArtwork({
+            dateFromThingProperty: 'coverArtDate',
+            artistContribsFromThingProperty: 'coverArtistContribs',
+            artistContribsArtistProperty: 'albumCoverArtistContributions',
+          }),
+      },
+
       'Cover Art Date': {
         property: 'coverArtDate',
         transform: parseDate,
@@ -585,6 +603,7 @@ export class Album extends Thing {
       const albumData = [];
       const trackSectionData = [];
       const trackData = [];
+      const artworkData = [];
 
       for (const {header: album, entries} of results) {
         const trackSections = [];
@@ -625,6 +644,10 @@ export class Album extends Thing {
           currentTrackSectionTracks.push(entry);
           trackData.push(entry);
 
+          if (entry.trackArtwork) {
+            artworkData.push(entry.trackArtwork);
+          }
+
           entry.dataSourceAlbum = albumRef;
         }
 
@@ -635,7 +658,12 @@ export class Album extends Thing {
         album.trackSections = trackSections;
       }
 
-      return {albumData, trackSectionData, trackData};
+      return {
+        albumData,
+        trackSectionData,
+        trackData,
+        artworkData,
+      };
     },
 
     sort({albumData, trackData}) {
diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js
new file mode 100644
index 00000000..86cf6c8a
--- /dev/null
+++ b/src/data/things/artwork.js
@@ -0,0 +1,97 @@
+import {input} from '#composite';
+import Thing from '#thing';
+import {isContributionList, isDate} from '#validators';
+import {parseContributors} from '#yaml';
+
+import {withRecontextualizedContributionList, withResolvedContribs}
+  from '#composite/wiki-data';
+import {referenceList, simpleString, soupyFind, thing}
+  from '#composite/wiki-properties';
+
+import {
+  exposeDependency,
+  exposeDependencyOrContinue,
+  exposeUpdateValueOrContinue,
+} from '#composite/control-flow';
+
+import {withDate} from '#composite/things/artwork';
+
+export class Artwork extends Thing {
+  static [Thing.referenceType] = 'artwork';
+
+  static [Thing.getPropertyDescriptors] = ({
+    ArtTag,
+    Contribution,
+  }) => ({
+    // Update & expose
+
+    thing: thing(),
+
+    artTags: referenceList({
+      class: input.value(ArtTag),
+      find: soupyFind.input('artTag'),
+    }),
+
+    artistContribsFromThingProperty: simpleString(),
+    artistContribsArtistProperty: simpleString(),
+
+    artistContribs: [
+      withDate(),
+
+      withResolvedContribs({
+        from: input.updateValue({validate: isContributionList}),
+        date: '#date',
+        artistProperty: 'artistContribsArtistProperty',
+      }),
+
+      exposeDependencyOrContinue({
+        dependency: '#resolvedContribs',
+        mode: input.value('empty'),
+      }),
+
+      {
+        dependencies: ['thing', 'artistContribsFromThingProperty'],
+        compute: (continuation, {thing, artistContribsFromThingProperty}) =>
+          (artistContribsFromThingProperty
+            ? continuation({
+                '#artistContribs':
+                  thing[artistContribsFromThingProperty],
+              })
+            : continuation.exit(null)),
+      },
+
+      withRecontextualizedContributionList({
+        list: '#artistContribs',
+      }),
+
+      exposeDependency({
+        dependency: '#artistContribs',
+      }),
+    ],
+
+    dateFromThingProperty: simpleString(),
+
+    date: [
+      withDate({
+        from: input.updateValue({validate: isDate}),
+      }),
+
+      exposeDependency({dependency: '#date'}),
+    ],
+
+    // Update only
+
+    find: soupyFind(),
+  });
+
+  static [Thing.yamlDocumentSpec] = {
+    fields: {
+      'Artists': {
+        property: 'artistContribs',
+        transform: parseContributors,
+      },
+
+      'Art Tags': {property: 'artTags'},
+    },
+  };
+}
diff --git a/src/data/things/index.js b/src/data/things/index.js
index 17471f31..96cec88e 100644
--- a/src/data/things/index.js
+++ b/src/data/things/index.js
@@ -12,6 +12,7 @@ import Thing from '#thing';
 import * as albumClasses from './album.js';
 import * as artTagClasses from './art-tag.js';
 import * as artistClasses from './artist.js';
+import * as artworkClasses from './artwork.js';
 import * as contributionClasses from './contribution.js';
 import * as flashClasses from './flash.js';
 import * as groupClasses from './group.js';
@@ -27,6 +28,7 @@ const allClassLists = {
   'album.js': albumClasses,
   'art-tag.js': artTagClasses,
   'artist.js': artistClasses,
+  'artwork.js': artworkClasses,
   'contribution.js': contributionClasses,
   'flash.js': flashClasses,
   'group.js': groupClasses,
diff --git a/src/data/things/track.js b/src/data/things/track.js
index afb2197d..84e36d95 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -11,6 +11,7 @@ import {
   parseAdditionalFiles,
   parseAdditionalNames,
   parseAnnotatedReferences,
+  parseArtwork,
   parseContributors,
   parseDate,
   parseDimensions,
@@ -38,6 +39,7 @@ import {
   additionalNameList,
   commentary,
   commentatorArtists,
+  constitutibleArtwork,
   contentString,
   contributionList,
   dimensions,
@@ -83,6 +85,7 @@ export class Track extends Thing {
   static [Thing.getPropertyDescriptors] = ({
     Album,
     ArtTag,
+    Artwork,
     Flash,
     TrackSection,
     WikiInfo,
@@ -338,12 +341,11 @@ export class Track extends Thing {
       }),
     ],
 
-    trackArtwork: [
-      constitutibleArtwork({
-        contribs: 'coverArtistContribs',
-        date: 'coverArtDate',
-      }),
-    ],
+    trackArtwork: constitutibleArtwork({
+      contribs: 'coverArtistContribs',
+      date: 'coverArtDate',
+      artistProperty: input.value('trackCoverArtistContributions'),
+    }),
 
     artTags: [
       exitWithoutUniqueCoverArt({
@@ -570,6 +572,16 @@ export class Track extends Thing {
         transform: parseContributors,
       },
 
+      'Track Artwork': {
+        property: 'trackArtwork',
+        transform:
+          parseArtwork({
+            dateFromThingProperty: 'coverArtDate',
+            artistContribsFromThingProperty: 'coverArtistContribs',
+            artistContribsArtistProperty: 'trackCoverArtistContributions',
+          }),
+      },
+
       'Art Tags': {property: 'artTags'},
 
       'Review Points': {ignore: true},