« 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/generateAbsoluteDatetimestamp.js12
-rw-r--r--src/content/dependencies/generateMusicVideo.js44
-rw-r--r--src/content/dependencies/generateMusicVideoReleaseLine.js61
-rw-r--r--src/content/dependencies/generateSingleArtworkColumn.js16
-rw-r--r--src/content/dependencies/generateTrackArtworkColumn.js2
-rw-r--r--src/content/dependencies/generateTrackInfoPage.js2
-rw-r--r--src/content/dependencies/listTracksWithExtra.js3
-rw-r--r--src/content/dependencies/listTracksWithMusicVideos.js9
8 files changed, 120 insertions, 29 deletions
diff --git a/src/content/dependencies/generateAbsoluteDatetimestamp.js b/src/content/dependencies/generateAbsoluteDatetimestamp.js
index d006374a..52b524e0 100644
--- a/src/content/dependencies/generateAbsoluteDatetimestamp.js
+++ b/src/content/dependencies/generateAbsoluteDatetimestamp.js
@@ -21,6 +21,7 @@ export default {
         'year',
         'minimal-difference',
         'year-difference',
+        'full-difference',
       ]),
       default: 'full',
     },
@@ -78,6 +79,17 @@ export default {
           label = language.formatYear(data.date);
           tooltip = language.formatDate(data.date);
         }
+
+        break;
+      }
+
+      case 'full-difference': {
+        if (data.date.toDateString() === data.contextDate?.toDateString()) {
+          return html.blank();
+        }
+
+        label = language.formatDate(data.date);
+        break;
       }
     }
 
diff --git a/src/content/dependencies/generateMusicVideo.js b/src/content/dependencies/generateMusicVideo.js
index a61cd5b7..e83fdf80 100644
--- a/src/content/dependencies/generateMusicVideo.js
+++ b/src/content/dependencies/generateMusicVideo.js
@@ -1,5 +1,5 @@
 export default {
-  relations: (relation, musicVideo) => ({
+  relations: (relation, musicVideo, thing) => ({
     image:
       relation('image', {
         path: musicVideo.path,
@@ -7,14 +7,14 @@ export default {
         dimensions: musicVideo.coverArtDimensions,
       }),
 
-    artistCredit:
-      relation('generateArtistCredit', musicVideo.artistContribs, []),
+    releaseLine:
+      relation('generateMusicVideoReleaseLine', musicVideo, thing),
 
     contributorCredit:
       relation('generateArtistCredit', musicVideo.contributorContribs, []),
   }),
 
-  data: (musicVideo) => ({
+  data: (musicVideo, _track) => ({
     label:
       musicVideo.label,
 
@@ -45,33 +45,25 @@ export default {
           {[html.joinChildren]: html.tag('br')},
 
           [
-            language.encapsulate(capsule, 'by', workingCapsule => {
-              const additionalStringOptions = {};
+            html.tag('span', {class: 'release-line'},
+              {[html.onlyIfContent]: true},
 
-              if (data.label) {
-                workingCapsule += '.customLabel';
-                additionalStringOptions.label = data.label;
-              }
+              relations.releaseLine),
 
-              return relations.artistCredit.slots({
-                normalStringKey: workingCapsule,
-                additionalStringOptions,
+            language.encapsulate(capsule, 'contributorsLine', capsule =>
+              language.$(capsule, {
+                [language.onlyIfOptions]: ['credit'],
 
-                showAnnotation: true,
-                showChronology: true,
+                credit:
+                  relations.contributorCredit.slots({
+                    normalStringKey: language.encapsulate(capsule, 'credit'),
 
-                chronologyKind: 'musicVideo',
-              });
-            }),
+                    showAnnotation: true,
+                    showChronology: true,
 
-            relations.contributorCredit.slots({
-              normalStringKey: language.encapsulate(capsule, 'contributors'),
-
-              showAnnotation: true,
-              showChronology: true,
-
-              chronologyKind: 'musicVideoContribution',
-            }),
+                    chronologyKind: 'musicVideoContribution',
+                  }),
+              })),
           ]),
       ])),
 };
diff --git a/src/content/dependencies/generateMusicVideoReleaseLine.js b/src/content/dependencies/generateMusicVideoReleaseLine.js
new file mode 100644
index 00000000..e4e196e9
--- /dev/null
+++ b/src/content/dependencies/generateMusicVideoReleaseLine.js
@@ -0,0 +1,61 @@
+export default {
+  relations: (relation, musicVideo, thing) => ({
+    datetimestamp:
+      relation('generateAbsoluteDatetimestamp', musicVideo.date, thing.date),
+
+    artistCredit:
+      relation('generateArtistCredit', musicVideo.artistContribs, []),
+  }),
+
+  data: (data) => ({
+    label:
+      (data.label !== 'Music video'
+        ? data.label
+        : null),
+  }),
+
+  generate(data, relations, {html, language}) {
+    const {artistCredit, datetimestamp} = relations;
+    const capsule = language.encapsulate('misc.musicVideo');
+
+    datetimestamp.setSlot('style', 'full-difference');
+
+    let artistsLineCapsule = language.encapsulate(capsule, 'artistsLine');
+    let artistsLineOptions = {[language.onlyIfOptions]: ['credit']};
+
+    if (data.label) {
+      artistsLineCapsule += '.customLabel';
+      artistsLineOptions.label = data.label;
+    }
+
+    if (!html.isBlank(datetimestamp)) {
+      artistsLineCapsule += '.withDate';
+      artistsLineOptions.date = datetimestamp;
+    }
+
+    artistsLineOptions.credit =
+      html.tag('span', {class: 'by'},
+        {[html.onlyIfContent]: true},
+
+        artistCredit.slots({
+          normalStringKey: language.encapsulate(capsule, 'artistsLine.credit'),
+
+          showAnnotation: true,
+          showChronology: true,
+
+          chronologyKind: 'musicVideo',
+        }));
+
+    const artistsLine = language.$(artistsLineCapsule, artistsLineOptions);
+
+    if (!html.isBlank(artistsLine)) {
+      return artistsLine;
+    }
+
+    if (!html.isBlank(datetimestamp)) {
+      return language.$(capsule, 'date', {date: datetimestamp});
+    }
+
+    return html.blank();
+  },
+}
diff --git a/src/content/dependencies/generateSingleArtworkColumn.js b/src/content/dependencies/generateSingleArtworkColumn.js
new file mode 100644
index 00000000..32c448ad
--- /dev/null
+++ b/src/content/dependencies/generateSingleArtworkColumn.js
@@ -0,0 +1,16 @@
+export default {
+  relations: (relation, track) => ({
+    albumArtworkColumn:
+      relation('generateAlbumArtworkColumn', track.album),
+
+    trackMusicVideos:
+      track.musicVideos.map(musicVideo =>
+        relation('generateMusicVideo', musicVideo, track)),
+  }),
+
+  generate: (relations, {html}) =>
+    html.tags([
+      relations.albumArtworkColumn,
+      relations.trackMusicVideos,
+    ]),
+};
diff --git a/src/content/dependencies/generateTrackArtworkColumn.js b/src/content/dependencies/generateTrackArtworkColumn.js
index dde37376..feaed604 100644
--- a/src/content/dependencies/generateTrackArtworkColumn.js
+++ b/src/content/dependencies/generateTrackArtworkColumn.js
@@ -13,7 +13,7 @@ export default {
 
     trackMusicVideos:
       track.musicVideos.map(musicVideo =>
-        relation('generateMusicVideo', musicVideo)),
+        relation('generateMusicVideo', musicVideo, track)),
   }),
 
   generate: (relations, {html}) =>
diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js
index 0937c42c..77adff02 100644
--- a/src/content/dependencies/generateTrackInfoPage.js
+++ b/src/content/dependencies/generateTrackInfoPage.js
@@ -65,7 +65,7 @@ export default {
 
     artworkColumn:
       (query.firstTrackInSingle
-        ? relation('generateAlbumArtworkColumn', track.album)
+        ? relation('generateSingleArtworkColumn', track)
         : relation('generateTrackArtworkColumn', track)),
 
     contentHeading:
diff --git a/src/content/dependencies/listTracksWithExtra.js b/src/content/dependencies/listTracksWithExtra.js
index 09d8ee21..27f03ee9 100644
--- a/src/content/dependencies/listTracksWithExtra.js
+++ b/src/content/dependencies/listTracksWithExtra.js
@@ -52,6 +52,7 @@ export default {
 
   slots: {
     hash: {type: 'string'},
+    showAlbumDates: {type: 'boolean', default: true},
   },
 
   generate(data, relations, slots, {language}) {
@@ -63,7 +64,7 @@ export default {
           albumLink: relations.albumLinks,
           date: data.dates,
         }).map(({albumLink, date}) =>
-            (date
+            (slots.showAlbumDates && date
               ? {
                   stringsKey: 'withDate',
                   album: albumLink,
diff --git a/src/content/dependencies/listTracksWithMusicVideos.js b/src/content/dependencies/listTracksWithMusicVideos.js
new file mode 100644
index 00000000..e7aa1f5e
--- /dev/null
+++ b/src/content/dependencies/listTracksWithMusicVideos.js
@@ -0,0 +1,9 @@
+export default {
+  relations: (relation, spec) =>
+    ({page: relation('listTracksWithExtra', spec, 'musicVideos', 'array')}),
+
+  generate: (relations) =>
+    relations.page.slots({
+      showAlbumDates: false,
+    }),
+};