« get me outta code hell

content, data: Album.showAlbumInTracksWithoutArtists - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-09-11 08:26:25 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-09-11 08:26:25 -0300
commitc191171847198a911c63a8342746ff884dd3ed4a (patch)
treeb95043f33a5e7339f1380f6d033b186648cc1447
parent2f7f2264c54aef4da050dc438cba8a408293235f (diff)
content, data: Album.showAlbumInTracksWithoutArtists preview
-rw-r--r--src/content/dependencies/generateReleaseInfoContributionsLine.js3
-rw-r--r--src/content/dependencies/generateTrackReleaseInfo.js35
-rw-r--r--src/data/things/album.js6
-rw-r--r--src/strings-default.yaml11
4 files changed, 48 insertions, 7 deletions
diff --git a/src/content/dependencies/generateReleaseInfoContributionsLine.js b/src/content/dependencies/generateReleaseInfoContributionsLine.js
index f93403d9..a597b68a 100644
--- a/src/content/dependencies/generateReleaseInfoContributionsLine.js
+++ b/src/content/dependencies/generateReleaseInfoContributionsLine.js
@@ -11,6 +11,8 @@ export default {
     stringKey: {type: 'string'},
     featuringStringKey: {type: 'string'},
 
+    additionalStringOptions: {validate: v => v.isObject},
+
     chronologyKind: {type: 'string'},
   },
 
@@ -27,5 +29,6 @@ export default {
 
       normalStringKey: slots.stringKey,
       normalFeaturingStringKey: slots.featuringStringKey,
+      additionalStringOptions: slots.additionalStringOptions,
     }),
 };
diff --git a/src/content/dependencies/generateTrackReleaseInfo.js b/src/content/dependencies/generateTrackReleaseInfo.js
index fa64ac22..45d47ecc 100644
--- a/src/content/dependencies/generateTrackReleaseInfo.js
+++ b/src/content/dependencies/generateTrackReleaseInfo.js
@@ -1,7 +1,10 @@
+import {compareArrays} from '#sugar';
+
 export default {
   contentDependencies: [
     'generateReleaseInfoContributionsLine',
     'generateReleaseInfoListenLine',
+    'linkAlbum',
   ],
 
   extraDependencies: ['html', 'language'],
@@ -17,6 +20,9 @@ export default {
     relations.listenLine =
       relation('generateReleaseInfoListenLine', track);
 
+    relations.albumLink =
+      relation('linkAlbum', track.album);
+
     return relations;
   },
 
@@ -27,6 +33,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
@@ -45,10 +61,21 @@ export default {
           {[html.joinChildren]: html.tag('br')},
 
           [
-            relations.artistContributionsLine.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', {
diff --git a/src/data/things/album.js b/src/data/things/album.js
index 777df882..ac947cfa 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -185,6 +185,8 @@ export class Album extends Thing {
 
     countTracksInArtistTotals: flag(true),
 
+    showAlbumInTracksWithoutArtists: flag(false),
+
     hasTrackNumbers: flag(true),
     isListedOnHomepage: flag(true),
     isListedInGalleries: flag(true),
@@ -661,6 +663,10 @@ export class Album extends Thing {
 
       'Count Tracks In Artist Totals': {property: 'countTracksInArtistTotals'},
 
+      'Show Album In Tracks Without Artists': {
+        property: 'showAlbumInTracksWithoutArtists',
+      },
+
       'Has Track Numbers': {property: 'hasTrackNumbers'},
       'Listed on Homepage': {property: 'isListedOnHomepage'},
       'Listed in Galleries': {property: 'isListedInGalleries'},
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index a8dbc28c..108aec2b 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -269,9 +269,14 @@ releaseInfo:
 
   # Descriptions
 
-  by:
-    _: "By {ARTISTS}."
-    featuring: "By {ARTISTS}, featuring {FEATURING}."
+  by: >-
+    By {ARTISTS}.
+  by.featuring: >-
+    By {ARTISTS}, featuring {FEATURING}.
+  by.withAlbum: >-
+    From {ALBUM}, by {ARTISTS}.
+  by.featuring.withAlbum: >-
+    From {ALBUM}, by {ARTISTS} feat. {FEATURING}.
 
   from: "From {ALBUM}."