From e8964d7a9f9dc787d4d84c0554d22149bb2daa0c Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Mon, 31 Mar 2025 15:04:20 -0300 Subject: data: Artwork, constitutibleArtwork, etc Not used in content yet. --- src/data/things/album.js | 30 +++++++++++++- src/data/things/artwork.js | 97 ++++++++++++++++++++++++++++++++++++++++++++++ src/data/things/index.js | 2 + src/data/things/track.js | 24 +++++++++--- 4 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/data/things/artwork.js (limited to 'src/data/things') 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}, -- cgit 1.3.0-6-gf8a5