« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateTrackReleaseInfo.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/generateTrackReleaseInfo.js')
-rw-r--r--src/content/dependencies/generateTrackReleaseInfo.js70
1 files changed, 39 insertions, 31 deletions
diff --git a/src/content/dependencies/generateTrackReleaseInfo.js b/src/content/dependencies/generateTrackReleaseInfo.js
index 54e462c7..0207e574 100644
--- a/src/content/dependencies/generateTrackReleaseInfo.js
+++ b/src/content/dependencies/generateTrackReleaseInfo.js
@@ -1,24 +1,19 @@
-import {empty} from '#sugar';
+import {compareArrays} from '#sugar';
 
 export default {
-  contentDependencies: [
-    'generateReleaseInfoContributionsLine',
-    'linkExternal',
-  ],
-
-  extraDependencies: ['html', 'language'],
-
   relations(relation, track) {
     const relations = {};
 
-    relations.artistContributionLinks =
-      relation('generateReleaseInfoContributionsLine', track.artistContribs);
+    relations.artistContributionsLine =
+      relation('generateReleaseInfoContributionsLine',
+        track.artistContribs,
+        track.artistText);
 
-    if (!empty(track.urls)) {
-      relations.externalLinks =
-        track.urls.map(url =>
-          relation('linkExternal', url));
-    }
+    relations.listenLine =
+      relation('generateReleaseInfoListenLine', track);
+
+    relations.albumLink =
+      relation('linkAlbum', track.album);
 
     return relations;
   },
@@ -30,6 +25,16 @@ export default {
     data.date = track.date;
     data.duration = track.duration;
 
+    const {album} = track;
+
+    data.showAlbum =
+      album.showAlbumInTracksWithoutArtists &&
+      track.artistContribs.every(({annotation}) => !annotation) &&
+      compareArrays(
+        track.artistContribs.map(({artist}) => artist),
+        album.artistContribs.map(({artist}) => artist),
+        {checkOrder: true});
+
     if (
       track.hasUniqueCoverArt &&
       +track.coverArtDate !== +track.date
@@ -48,10 +53,21 @@ export default {
           {[html.joinChildren]: html.tag('br')},
 
           [
-            relations.artistContributionLinks.slots({
-              stringKey: capsule + '.by',
-              featuringStringKey: capsule + '.by.featuring',
-              chronologyKind: 'track',
+            language.encapsulate(capsule, 'by', capsule => {
+              const withAlbum =
+                (data.showAlbum ? '.withAlbum' : '');
+
+              const albumOptions =
+                (data.showAlbum ? {album: relations.albumLink} : {});
+
+              return relations.artistContributionsLine.slots({
+                stringKey: capsule + withAlbum,
+                featuringStringKey: capsule + '.featuring' + withAlbum,
+
+                additionalStringOptions: albumOptions,
+
+                chronologyKind: 'track',
+              });
             }),
 
             language.$(capsule, 'released', {
@@ -66,17 +82,9 @@ export default {
           ]),
 
         html.tag('p',
-          language.encapsulate(capsule, 'listenOn', capsule =>
-            (relations.externalLinks
-              ? language.$(capsule, {
-                  links:
-                    language.formatDisjunctionList(
-                      relations.externalLinks
-                        .map(link => link.slot('context', 'track'))),
-                })
-              : language.$(capsule, 'noLinks', {
-                  name:
-                    html.tag('i', data.name),
-                })))),
+          relations.listenLine.slots({
+            visibleWithoutLinks: true,
+            context: ['track'],
+          })),
       ])),
 };