From 296a4961a951e44ea53509391ad225d1491197f9 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sat, 20 Jan 2024 16:13:36 -0400 Subject: yaml, data: store document specs statically on Thing subclasses --- src/data/things/track.js | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'src/data/things/track.js') diff --git a/src/data/things/track.js b/src/data/things/track.js index 375dd81d..3621510b 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 = []; -- cgit 1.3.0-6-gf8a5