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
|
import {sortAlbumsTracksChronologically, sortContributionsChronologically}
from '#sort';
import {stitchArrays} from '#sugar';
import {chunkArtistTrackContributions} from '#wiki-data';
export default {
contentDependencies: [
'generateArtistInfoPageChunkedList',
'generateArtistInfoPageTracksChunk',
],
query(artist) {
const query = {};
const allContributions = [
...artist.trackArtistContributions,
...artist.trackContributorContributions,
];
sortContributionsChronologically(
allContributions,
sortAlbumsTracksChronologically);
query.contribs =
chunkArtistTrackContributions(allContributions);
query.albums =
query.contribs
.map(contribs =>
contribs[0][0].thing.album);
return query;
},
relations: (relation, query, artist) => ({
chunkedList:
relation('generateArtistInfoPageChunkedList'),
chunks:
stitchArrays({
album: query.albums,
contribs: query.contribs,
}).map(({album, contribs}) =>
relation('generateArtistInfoPageTracksChunk',
artist,
album,
contribs)),
}),
data: (query, _artist) => ({
albumDirectories:
query.albums
.map(album => album.directory),
albumChunkIndices:
query.albums
.reduce(([indices, map], album) => {
if (map.has(album)) {
const n = map.get(album);
indices.push(n);
map.set(album, n + 1);
} else {
indices.push(0);
map.set(album, 1);
}
return [indices, map];
}, [[], new Map()])
[0],
}),
generate: (data, relations) =>
relations.chunkedList.slots({
chunks:
stitchArrays({
chunk: relations.chunks,
albumDirectory: data.albumDirectories,
albumChunkIndex: data.albumChunkIndices,
}).map(({chunk, albumDirectory, albumChunkIndex}) =>
chunk.slot('id', `tracks-${albumDirectory}-${albumChunkIndex}`)),
}),
};
|