« 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
diff options
context:
space:
mode:
Diffstat (limited to 'src/content')
-rw-r--r--src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js16
-rw-r--r--src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js41
-rw-r--r--src/content/dependencies/generateArtistInfoPageTracksChunkItem.js19
-rw-r--r--src/content/dependencies/image.js9
-rw-r--r--src/content/dependencies/linkTrackAsRelease.js20
5 files changed, 84 insertions, 21 deletions
diff --git a/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js b/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js
index eb32cebf..1d498b9f 100644
--- a/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js
+++ b/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js
@@ -2,10 +2,18 @@ import {sortAlbumsTracksChronologically} from '#sort';
 import {stitchArrays} from '#sugar';
 
 export default {
-  query: (track) => ({
-    rereleases:
-      sortAlbumsTracksChronologically(track.allReleases).slice(1),
-  }),
+query: (track, artist) => ({
+  rereleases:
+    sortAlbumsTracksChronologically(
+      track.otherReleases.filter(track => {
+        const contribs = [
+          ...track.artistContribs,
+          ...track.contributorContribs,
+        ];
+
+        return contribs.some(contrib => contrib.artist === artist);
+      })),
+}),
 
   relations: (relation, query, track, artist) => ({
     tooltip:
diff --git a/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js b/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js
index 70bada19..bf5fe616 100644
--- a/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js
+++ b/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js
@@ -1,10 +1,22 @@
 import {sortAlbumsTracksChronologically} from '#sort';
 
 export default {
-  query: (track) => ({
-    firstRelease:
-      sortAlbumsTracksChronologically(track.allReleases)[0],
-  }),
+  query(track, artist) {
+    const query = {};
+
+    query.firstRelease =
+      sortAlbumsTracksChronologically(track.allReleases)[0];
+
+    const contribs = [
+      ...query.firstRelease.artistContribs,
+      ...query.firstRelease.contributorContribs,
+    ];
+
+    query.creditedOnFirstRelease =
+      contribs.some(contrib => contrib.artist === artist);
+
+    return query;
+  },
 
   relations: (relation, query, track, artist) => ({
     tooltip:
@@ -14,10 +26,15 @@ export default {
       relation('generateColorStyleAttribute', track.color),
 
     firstReleaseLink:
-      relation('linkOtherReleaseOnArtistInfoPage', query.firstRelease, artist),
+      (query.creditedOnFirstRelease
+        ? relation('linkOtherReleaseOnArtistInfoPage', query.firstRelease, artist)
+        : relation('linkTrackAsRelease', query.firstRelease)),
   }),
 
-  data: (query, track) => ({
+  data: (query, track, artist) => ({
+    artistName:
+      artist.name,
+
     rereleaseDate:
       track.dateFirstReleased ??
       track.album.date,
@@ -25,6 +42,9 @@ export default {
     firstReleaseDate:
       query.firstRelease.dateFirstReleased ??
       query.firstRelease.album.date,
+
+    creditedOnFirstRelease:
+      query.creditedOnFirstRelease,
   }),
 
   generate: (data, relations, {html, language}) =>
@@ -48,6 +68,15 @@ export default {
             approximate: true,
             absolute: true,
           }),
+
+          !data.creditedOnFirstRelease && [
+            html.tag('hr', {class: 'cute'}),
+
+            html.tag('span', {class: 'not-credited-on-first-release'},
+              language.$(capsule, 'notCreditedOnFirstRelease', {
+                artist: data.artistName,
+              })),
+          ],
         ],
       })),
 };
diff --git a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js
index 895cc0d8..e976c57f 100644
--- a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js
+++ b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js
@@ -2,7 +2,7 @@ import {sortAlbumsTracksChronologically} from '#sort';
 import {empty} from '#sugar';
 
 export default {
-  query(_artist, contribs) {
+  query(artist, contribs) {
     const query = {};
 
     // TODO: Very mysterious what to do if the set of contributions is,
@@ -68,11 +68,18 @@ export default {
     query.isFirstRelease =
       allReleasesChronologically[0] === query.track;
 
-    query.isRerelease =
+    query.isLaterRelease =
       allReleasesChronologically[0] !== query.track;
 
-    query.hasOtherReleases =
-      !empty(query.track.otherReleases);
+    query.hasOtherCreditedReleases =
+      query.track.otherReleases.some(track => {
+        const contribs = [
+          ...track.artistContribs,
+          ...track.contributorContribs,
+        ];
+
+        return contribs.some(contrib => contrib.artist === artist);
+      });
 
     return query;
   },
@@ -88,12 +95,12 @@ export default {
       relation('generateArtistInfoPageOtherArtistLinks', contribs),
 
     rereleaseTooltip:
-      (query.isRerelease
+      (query.isLaterRelease
         ? relation('generateArtistInfoPageRereleaseTooltip', query.track, artist)
         : null),
 
     firstReleaseTooltip:
-      (query.isFirstRelease && query.hasOtherReleases
+      (query.isFirstRelease && query.hasOtherCreditedReleases
         ? relation('generateArtistInfoPageFirstReleaseTooltip', query.track, artist)
         : null),
   }),
diff --git a/src/content/dependencies/image.js b/src/content/dependencies/image.js
index d979b0bc..aacf2fed 100644
--- a/src/content/dependencies/image.js
+++ b/src/content/dependencies/image.js
@@ -108,12 +108,11 @@ export default {
     // src string directly when a parts-formed path *is* available seems wrong.
     // It should be possible to do urls.from(slots.path[0]).to(...slots.path),
     // for example, but will require reworking the control flow here a little.
-    let mediaSrc = null;
+    let mediaSrc = decodeURIComponent(originalSrc);
     if (originalSrc.startsWith(to('media.root'))) {
-      mediaSrc =
-        originalSrc
-          .slice(to('media.root').length)
-          .replace(/^\//, '');
+      mediaSrc = mediaSrc
+        .slice(to('media.root').length)
+        .replace(/^\//, '');
     }
 
     const isMissingImageFile =
diff --git a/src/content/dependencies/linkTrackAsRelease.js b/src/content/dependencies/linkTrackAsRelease.js
new file mode 100644
index 00000000..7a114ad9
--- /dev/null
+++ b/src/content/dependencies/linkTrackAsRelease.js
@@ -0,0 +1,20 @@
+export default {
+  relations: (relation, track) => ({
+    trackLink:
+      relation('linkTrack', track),
+  }),
+
+  data: (track) => ({
+    albumName:
+      track.album.name,
+
+    albumColor:
+      track.album.color,
+  }),
+
+  generate: (data, relations, {language}) =>
+    relations.trackLink.slots({
+      content: language.sanitize(data.albumName),
+      color: data.albumColor,
+    }),
+};