« get me outta code hell

generateScopedTrackChronologyLinks.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/generateScopedTrackChronologyLinks.js
blob: 87a7c0fda2f79f1d94a1af26d6e9458a9d3ffbb5 (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
81
82
83
84
85
86
87
88
89
import {sortAlbumsTracksChronologically} from '#sort';

import getChronologyRelations from '../util/getChronologyRelations.js';

export default {
  contentDependencies: [
    'generateChronologyLinks',
    'linkAlbum',
    'linkArtist',
    'linkTrack',
  ],

  relations(relation, album, track) {
    const albumFilter =
      (album
        ? track => track.album === album
        : () => true);

    return {
      chronologyLinks:
        relation('generateChronologyLinks'),

      artistChronologyContributions:
        getChronologyRelations(track, {
          contributions: [
            ...track.artistContribs ?? [],
            ...track.contributorContribs ?? [],
          ],

          linkArtist: artist => relation('linkArtist', artist),
          linkThing: track => relation('linkTrack', track),

          getThings(artist) {
            const getDate = thing => thing.date;

            const things =
              ([
                ...artist.tracksAsArtist,
                ...artist.tracksAsContributor,
              ]).filter(getDate)
                .filter(albumFilter);

            return sortAlbumsTracksChronologically(things, {getDate});
          },
        }),

      coverArtistChronologyContributions:
        getChronologyRelations(track, {
          contributions: track.coverArtistContribs ?? [],

          linkArtist: artist => relation('linkArtist', artist),

          linkThing: trackOrAlbum =>
            (trackOrAlbum.album
              ? relation('linkTrack', trackOrAlbum)
              : relation('linkAlbum', trackOrAlbum)),

          getThings(artist) {
            const getDate = thing => thing.coverArtDate ?? thing.date;

            const things =
              ([
                ...artist.albumsAsCoverArtist,
                ...artist.tracksAsCoverArtist,
              ]).filter(getDate)
                .filter(albumFilter);

            return sortAlbumsTracksChronologically(things, {getDate});
          },
        }),
    };
  },

  generate: (relations) =>
    relations.chronologyLinks.slots({
      showOnly: true,

      chronologyInfoSets: [
        {
          headingString: 'misc.chronology.heading.track',
          contributions: relations.artistChronologyContributions,
        },
        {
          headingString: 'misc.chronology.heading.coverArt',
          contributions: relations.coverArtistChronologyContributions,
        },
      ],
    }),
};