From 92d82211fdf3d653b1a5a4d2cfdad5c684e2367d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 1 May 2026 08:06:52 -0300 Subject: content, data, validators: stub url entries --- src/data/composite/wiki-properties/simpleDate.js | 2 -- src/data/composite/wiki-properties/urls.js | 7 +++--- src/data/things/ArtTag.js | 9 ++++++-- src/data/things/Artist.js | 4 ++-- src/data/things/MusicVideo.js | 27 ++++++++++++++++-------- src/data/things/Track.js | 10 +++++++-- src/data/things/album/Album.js | 3 ++- src/data/things/flash/Flash.js | 3 ++- src/data/things/group/Group.js | 4 ++-- src/data/yaml.js | 20 ++++++++++++++++++ 10 files changed, 64 insertions(+), 25 deletions(-) (limited to 'src/data') diff --git a/src/data/composite/wiki-properties/simpleDate.js b/src/data/composite/wiki-properties/simpleDate.js index f08d8323..238b906f 100644 --- a/src/data/composite/wiki-properties/simpleDate.js +++ b/src/data/composite/wiki-properties/simpleDate.js @@ -4,8 +4,6 @@ import {isDate} from '#validators'; -// TODO: Not templateCompositeFrom. - export default function() { return { flags: {update: true, expose: true}, diff --git a/src/data/composite/wiki-properties/urls.js b/src/data/composite/wiki-properties/urls.js index 04ccf689..5525b462 100644 --- a/src/data/composite/wiki-properties/urls.js +++ b/src/data/composite/wiki-properties/urls.js @@ -1,14 +1,13 @@ // A list of URLs! This will always be present on the data object, even if set // to an empty array or null. -import {isCuratedURL, validateArrayItems} from '#validators'; - -// TODO: Not templateCompositeFrom. +import {isCuratedURLList} from '#validators'; +import {templateCompositeFrom} from '#composite'; export default function() { return { flags: {update: true, expose: true}, - update: {validate: validateArrayItems(isCuratedURL)}, + update: {validate: isCuratedURLList}, expose: {transform: value => value ?? []}, }; } diff --git a/src/data/things/ArtTag.js b/src/data/things/ArtTag.js index 9d35f54d..1da32b0a 100644 --- a/src/data/things/ArtTag.js +++ b/src/data/things/ArtTag.js @@ -2,7 +2,8 @@ import {input, V} from '#composite'; import Thing from '#thing'; import {unique} from '#sugar'; import {isName} from '#validators'; -import {parseAdditionalNames, parseAnnotatedReferences} from '#yaml'; +import {parseAdditionalNames, parseAnnotatedReferences, parseURLs} + from '#yaml'; import { exitWithoutDependency, @@ -170,7 +171,11 @@ export class ArtTag extends Thing { 'Short Name': {property: 'nameShort'}, 'Directory': {property: 'directory'}, 'Description': {property: 'description'}, - 'Extra Reading URLs': {property: 'extraReadingURLs'}, + + 'Extra Reading URLs': { + property: 'extraReadingURLs', + transform: parseURLs, + }, 'Additional Names': { property: 'additionalNames', diff --git a/src/data/things/Artist.js b/src/data/things/Artist.js index 6ce448ff..64798527 100644 --- a/src/data/things/Artist.js +++ b/src/data/things/Artist.js @@ -4,7 +4,7 @@ import CacheableObject from '#cacheable-object'; import {colors} from '#cli'; import {input, V} from '#composite'; import Thing from '#thing'; -import {parseArtistAliases, parseArtwork} from '#yaml'; +import {parseArtistAliases, parseArtwork, parseURLs} from '#yaml'; import { sortAlbumsTracksChronologically, @@ -351,7 +351,7 @@ export class Artist extends Thing { fields: { 'Artist': {property: 'name'}, 'Directory': {property: 'directory'}, - 'URLs': {property: 'urls'}, + 'URLs': {property: 'urls', transform: parseURLs}, 'Context Notes': {property: 'contextNotes'}, // note: doesn't really work as an independent field yet diff --git a/src/data/things/MusicVideo.js b/src/data/things/MusicVideo.js index 77c8c619..dbb99a7f 100644 --- a/src/data/things/MusicVideo.js +++ b/src/data/things/MusicVideo.js @@ -4,9 +4,16 @@ import {colors} from '#cli'; import {input, V} from '#composite'; import {empty} from '#sugar'; import Thing from '#thing'; -import {is, isCuratedURL, isDate, isStringNonEmpty, validateArrayItems} - from '#validators'; -import {parseContributors, parseDate} from '#yaml'; +import {parseContributors, parseDate, parseURLs} from '#yaml'; + +import { + is, + isCuratedURL, + isCuratedURLEntry, + isDate, + isStringNonEmpty, + validateArrayItems, +} from '#validators'; import {constituteFrom} from '#composite/wiki-data'; @@ -66,6 +73,7 @@ export class MusicVideo extends Thing { constituteFrom('thing', V('date')), ], + // This is a string, not a {url, annotation} entry. url: { flags: {update: true, expose: true}, @@ -77,7 +85,7 @@ export class MusicVideo extends Thing { dependencies: ['_urls'], transform: (url, {'_urls': urls}) => (url ? url - : !empty(urls) ? urls[0] + : !empty(urls) ? urls[0].url : null), }, }, @@ -86,14 +94,14 @@ export class MusicVideo extends Thing { flags: {update: true, expose: true}, update: { - validate: validateArrayItems(isCuratedURL), + validate: validateArrayItems(isCuratedURLEntry), }, expose: { dependencies: ['_url'], transform: (urls, {'_url': url}) => - (url && urls ? [url, ...urls] - : url ? [url] + (url && urls ? [{url}, ...urls] + : url ? [{url}] : urls ? urls : []), }, @@ -142,8 +150,9 @@ export class MusicVideo extends Thing { 'Label': {property: 'label'}, 'Directory': {property: 'unqualifiedDirectory'}, 'Date': {property: 'date', transform: parseDate}, - 'URL': {property: 'url'}, - 'URLs': {property: 'urls'}, + + 'URL': {property: 'url'}, // Just a string, not an object + 'URLs': {property: 'urls', transform: parseURLs}, 'Cover Art File Extension': {property: 'coverArtFileExtension'}, 'Cover Art Dimensions': {property: 'coverArtDimensions'}, diff --git a/src/data/things/Track.js b/src/data/things/Track.js index 36e3733d..cb785211 100644 --- a/src/data/things/Track.js +++ b/src/data/things/Track.js @@ -35,6 +35,7 @@ import { parseDuration, parseLyrics, parseMusicVideos, + parseURLs, } from '#yaml'; import { @@ -1004,13 +1005,18 @@ export class Track extends Thing { transform: parseDuration, }, - 'Color': {property: 'color'}, + 'Color': { + property: 'color', + }, 'Needs Lyrics': { property: 'needsLyrics', }, - 'URLs': {property: 'urls'}, + 'URLs': { + property: 'urls', + transform: parseURLs, + }, // Artworks diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js index 61420e52..1ae10ab1 100644 --- a/src/data/things/album/Album.js +++ b/src/data/things/album/Album.js @@ -17,6 +17,7 @@ import { parseDimensions, parseMusicVideos, parseWallpaperParts, + parseURLs, } from '#yaml'; import {withFlattenedList, withPropertyFromList} from '#composite/data'; @@ -651,7 +652,7 @@ export class Album extends Thing { 'Color': {property: 'color'}, - 'URLs': {property: 'urls'}, + 'URLs': {property: 'urls', transform: parseURLs}, // Artworks // (Note - this YAML section is deliberately ordered differently diff --git a/src/data/things/flash/Flash.js b/src/data/things/flash/Flash.js index b06b0452..588fbae5 100644 --- a/src/data/things/flash/Flash.js +++ b/src/data/things/flash/Flash.js @@ -12,6 +12,7 @@ import { parseCreditingSources, parseDate, parseDimensions, + parseURLs, } from '#yaml'; import {withPropertyFromObject} from '#composite/data'; @@ -216,7 +217,7 @@ export class Flash extends Thing { 'Directory': {property: 'directory'}, 'Page': {property: 'page'}, 'Color': {property: 'color'}, - 'URLs': {property: 'urls'}, + 'URLs': {property: 'urls', transform: parseURLs}, 'Date': { property: 'date', diff --git a/src/data/things/group/Group.js b/src/data/things/group/Group.js index f8dd413e..99ad633b 100644 --- a/src/data/things/group/Group.js +++ b/src/data/things/group/Group.js @@ -1,7 +1,7 @@ import {input, V} from '#composite'; import Thing from '#thing'; import {isBoolean} from '#validators'; -import {parseAnnotatedReferences, parseSerieses} from '#yaml'; +import {parseAnnotatedReferences, parseSerieses, parseURLs} from '#yaml'; import {withPropertyFromObject} from '#composite/data'; import {withUniqueReferencingThing} from '#composite/wiki-data'; @@ -176,7 +176,7 @@ export class Group extends Thing { }, 'Description': {property: 'description'}, - 'URLs': {property: 'urls'}, + 'URLs': {property: 'urls', transform: parseURLs}, 'Closely Linked Artists': { property: 'closelyLinkedArtists', diff --git a/src/data/yaml.js b/src/data/yaml.js index 58acb7c8..60017b3d 100644 --- a/src/data/yaml.js +++ b/src/data/yaml.js @@ -733,6 +733,26 @@ export function parseContributors(entries) { }); } +export function parseURLs(entries) { + return parseArrayEntries(entries, item => { + if (typeof item === 'object' && item['URL']) + return { + url: item['URL'], + annotation: item['Annotation'] ?? null, + }; + + if (typeof item !== 'string') return item; + + const match = item.match(extractAccentRegex); + if (!match) return item; + + return { + url: match.groups.main, + annotation: match.groups.accent, + }; + }); +} + export function parseAdditionalFiles(entries, {subdoc, AdditionalFile}) { return parseArrayEntries(entries, item => { if (typeof item !== 'object') return item; -- cgit 1.3.0-6-gf8a5