« get me outta code hell

data: Track: withHasUniqueCoverArt: process direct links only - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-04-06 15:44:16 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-04-10 16:02:39 -0300
commite8670dd43d70ef91df6dc1164d11397de639e3b8 (patch)
tree052d3297e549a2368fb9300688d8f4042796e255 /src/data
parentf02db61b1da6b6a79a16550d9217cb3e1473ef98 (diff)
data: Track: withHasUniqueCoverArt: process direct links only
No soupyFind/soupyReverse.

This commit introduces a notion of difference between
an artwork which is 'declared to exist' via, say, having
cover artists, versus one which... is 'usable', because it
has resolved cover artists. No other code addressing this
yet, so it's in a tense state where existence is in every
case according to declared cover artists, whether or not
those cover artist references resolve.
Diffstat (limited to 'src/data')
-rw-r--r--src/data/composite/things/track/withHasUniqueCoverArt.js57
-rw-r--r--src/data/composite/things/track/withPropertyFromAlbum.js12
2 files changed, 45 insertions, 24 deletions
diff --git a/src/data/composite/things/track/withHasUniqueCoverArt.js b/src/data/composite/things/track/withHasUniqueCoverArt.js
index e0a435fe..af68073e 100644
--- a/src/data/composite/things/track/withHasUniqueCoverArt.js
+++ b/src/data/composite/things/track/withHasUniqueCoverArt.js
@@ -5,13 +5,17 @@
 // or a placeholder. (This property is named hasUniqueCoverArt instead of
 // the usual hasCoverArt to emphasize that it does not inherit from the
 // album.)
+//
+// withHasUniqueCoverArt is based only around the presence of *specified*
+// cover artist contributions, not whether the references to artists on those
+// contributions actually resolve to anything. It completely evades interacting
+// with find/replace.
 
 import {input, templateCompositeFrom} from '#composite';
-import {empty} from '#sugar';
 
-import {raiseOutputWithoutDependency} from '#composite/control-flow';
+import {raiseOutputWithoutDependency, withResultOfAvailabilityCheck}
+  from '#composite/control-flow';
 import {withFlattenedList, withPropertyFromList} from '#composite/data';
-import {withResolvedContribs} from '#composite/wiki-data';
 
 import withPropertyFromAlbum from './withPropertyFromAlbum.js';
 
@@ -31,38 +35,43 @@ export default templateCompositeFrom({
           : continuation()),
     },
 
-    withResolvedContribs({
+    withResultOfAvailabilityCheck({
       from: 'coverArtistContribs',
-      date: input.value(null),
+      mode: input.value('empty'),
     }),
 
     {
-      dependencies: ['#resolvedContribs'],
+      dependencies: ['#availability'],
       compute: (continuation, {
-        ['#resolvedContribs']: contribsFromTrack,
+        ['#availability']: availability,
       }) =>
-        (empty(contribsFromTrack)
-          ? continuation()
-          : continuation.raiseOutput({
+        (availability
+          ? continuation.raiseOutput({
               ['#hasUniqueCoverArt']: true,
-            })),
+            })
+          : continuation()),
     },
 
     withPropertyFromAlbum({
       property: input.value('trackCoverArtistContribs'),
+      internal: input.value(true),
+    }),
+
+    withResultOfAvailabilityCheck({
+      from: '#album.trackCoverArtistContribs',
+      mode: input.value('empty'),
     }),
 
     {
-      dependencies: ['#album.trackCoverArtistContribs'],
+      dependencies: ['#availability'],
       compute: (continuation, {
-        ['#album.trackCoverArtistContribs']: contribsFromAlbum,
+        ['#availability']: availability,
       }) =>
-        (empty(contribsFromAlbum)
-          ? continuation()
-          : continuation.raiseOutput({
-              ['#hasUniqueCoverArt']:
-                !empty(contribsFromAlbum),
-            })),
+        (availability
+          ? continuation.raiseOutput({
+              ['#hasUniqueCoverArt']: true,
+            })
+          : continuation()),
     },
 
     raiseOutputWithoutDependency({
@@ -81,19 +90,19 @@ export default templateCompositeFrom({
       list: '#trackArtworks.artistContribs',
     }),
 
-    withResolvedContribs({
+    withResultOfAvailabilityCheck({
       from: '#flattenedList',
-      date: input.value(null),
+      mode: input.value('empty'),
     }),
 
     {
-      dependencies: ['#resolvedContribs'],
+      dependencies: ['#availability'],
       compute: (continuation, {
-        ['#resolvedContribs']: contribsFromArtwork,
+        ['#availability']: availability,
       }) =>
         continuation({
           ['#hasUniqueCoverArt']:
-            !empty(contribsFromArtwork),
+            availability,
         }),
     },
   ],
diff --git a/src/data/composite/things/track/withPropertyFromAlbum.js b/src/data/composite/things/track/withPropertyFromAlbum.js
index 311a3448..a203c2e7 100644
--- a/src/data/composite/things/track/withPropertyFromAlbum.js
+++ b/src/data/composite/things/track/withPropertyFromAlbum.js
@@ -10,6 +10,7 @@ export default templateCompositeFrom({
 
   inputs: {
     property: input.staticValue({type: 'string'}),
+    internal: input({type: 'boolean', defaultValue: false}),
   },
 
   outputs: ({
@@ -17,10 +18,21 @@ export default templateCompositeFrom({
   }) => ['#album.' + property],
 
   steps: () => [
+    // XXX: This is a ridiculous hack considering `defaultValue` above.
+    // If we were certain what was up, we'd just get around to fixing it LOL
+    {
+      dependencies: [input('internal')],
+      compute: (continuation, {
+        [input('internal')]: internal,
+      }) => continuation({
+        ['#internal']: internal ?? false,
+      }),
+    },
 
     withPropertyFromObject({
       object: 'album',
       property: input('property'),
+      internal: '#internal',
     }),
 
     {