diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2025-04-06 17:57:07 -0300 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2025-04-10 16:02:41 -0300 |
commit | 14551bb44ec3389ced8ce673e5b7a3057556bf3f (patch) | |
tree | 896a0d4f289b23044e6f4ca225b733d5373b365b /src/data | |
parent | a446ecc747e7919f6dee4bc3b073e7edb6156a91 (diff) |
data: Artwork.referencedArtworks
Diffstat (limited to 'src/data')
-rw-r--r-- | src/data/things/artwork.js | 79 | ||||
-rw-r--r-- | src/data/yaml.js | 2 |
2 files changed, 76 insertions, 5 deletions
diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js index 66a3c1ae..e4714095 100644 --- a/src/data/things/artwork.js +++ b/src/data/things/artwork.js @@ -1,13 +1,24 @@ import {inspect} from 'node:util'; import {input} from '#composite'; +import find from '#find'; import Thing from '#thing'; -import {isContributionList, isDate, isFileExtension, validateReferenceList} - from '#validators'; -import {parseContributors, parseDate} from '#yaml'; +import {parseAnnotatedReferences, parseContributors, parseDate} from '#yaml'; + +import { + isContentString, + isContributionList, + isDate, + isFileExtension, + optional, + validateArrayItems, + validateProperties, + validateReference, + validateReferenceList, +} from '#validators'; import {withPropertyFromObject} from '#composite/data'; -import {contentString, directory, simpleString, soupyFind, thing} +import {contentString, directory, simpleString, soupyFind, thing, wikiData} from '#composite/wiki-properties'; import { @@ -20,6 +31,7 @@ import { import { withRecontextualizedContributionList, + withResolvedAnnotatedReferenceList, withResolvedContribs, withResolvedReferenceList, } from '#composite/wiki-data'; @@ -157,9 +169,63 @@ export class Artwork extends Thing { }), ], + referencedArtworks: [ + { + compute: (continuation) => continuation({ + ['#find']: + find.mixed({ + track: find.trackPrimaryArtwork, + album: find.albumPrimaryArtwork, + }), + }), + }, + + withResolvedAnnotatedReferenceList({ + list: input.updateValue({ + validate: + // TODO: It's annoying to hardcode this when it's really the + // same behavior as through annotatedReferenceList and through + // referenceListUpdateDescription, the latter of which isn't + // available outside of #composite/wiki-data internals. + validateArrayItems( + validateProperties({ + reference: validateReference(['album', 'track']), + annotation: optional(isContentString), + })), + }), + + data: 'artworkData', + find: '#find', + date: input.value(null), + }), + + exposeDependencyOrContinue({ + dependency: '#resolvedAnnotatedReferenceList', + mode: input.value('empty'), + }), + + withPropertyFromObject({ + object: 'thing', + property: input.value('referencedArtworks'), + }), + + exposeDependencyOrContinue({ + dependency: '#thing.referencedArtworks', + }), + + exposeConstant({ + value: input.value([]), + }), + ], + // Update only find: soupyFind(), + + // used for referencedArtworks (mixedFind) + artworkData: wikiData({ + class: input.value(Artwork), + }), }); static [Thing.yamlDocumentSpec] = { @@ -181,6 +247,11 @@ export class Artwork extends Thing { }, 'Tags': {property: 'artTags'}, + + 'Referenced Artworks': { + property: 'referencedArtworks', + transform: parseAnnotatedReferences, + }, }, }; diff --git a/src/data/yaml.js b/src/data/yaml.js index 24f58f36..c875c34f 100644 --- a/src/data/yaml.js +++ b/src/data/yaml.js @@ -1488,7 +1488,7 @@ export function linkWikiDataArrays(wikiData, {bindFind, bindReverse}) { ['artistData', [/* find, reverse */]], - ['artworkData', [/* find */]], + ['artworkData', ['artworkData']], ['flashData', [ 'wikiInfo', |