« get me outta code hell

generateAlbumReleaseInfo.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateAlbumReleaseInfo.js
blob: 38cd1c0593df4a728ef7fccc1af10f0e5bc0bf32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import {accumulateSum, empty} from '#sugar';

export default {
  relations: (relation, album) => ({
    block:
      relation('generateReleaseInfoBlock'),

    artistContributionsLine:
      relation('generateReleaseInfoContributionsLine', album.artistContribs),

    listenLineOrList:
      relation('generateListenLineOrList', album),
  }),

  data(album) {
    const data = {};

    if (album.date) {
      data.date = album.date;
    }

    if (album.coverArtDate && +album.coverArtDate !== +album.date) {
      data.coverArtDate = album.coverArtDate;
    }

    const durationTerms =
      album.tracks
        .map(track => track.duration)
        .filter(value => value > 0);

    if (empty(durationTerms) || album.hideDuration) {
      data.duration = null;
      data.durationApproximate = null;
    } else {
      data.duration = accumulateSum(durationTerms);
      data.durationApproximate = album.tracks.length > 1;
    }

    data.numTracks = album.tracks.length;

    return data;
  },

  generate: (data, relations, {html, language}) =>
    language.encapsulate('releaseInfo', capsule =>
      html.tags([
        relations.block.slot('items', [
          relations.artistContributionsLine.slots({
            stringKey: capsule + '.by',
            featuringStringKey: capsule + '.by.featuring',
            chronologyKind: 'album',
          }),

          language.$(capsule, 'released', {
            [language.onlyIfOptions]: ['date'],
            date: language.formatDate(data.date),
          }),

          language.$(capsule, 'duration', {
            [language.onlyIfOptions]: ['duration'],
            duration:
              language.formatDuration(data.duration, {
                approximate: data.durationApproximate,
              }),
          }),
        ]),

        relations.listenLineOrList.slots({
          context: [
            'album',

            (data.numTracks === 0
              ? 'albumNoTracks'
           : data.numTracks === 1
              ? 'albumOneTrack'
              : 'albumMultipleTracks'),
          ],
        }),
      ])),
};