From dc873feb1cf1c1a442e17e15766276d9ae1e7443 Mon Sep 17 00:00:00 2001
From: Florrie Official
The original discography: a replica of the Homestuck Bandcamp prior to the enmergening.
@@ -828,7 +926,7 @@ function writeMiscellaneousPages() {
Albums organized by What Pumpkin. 2009–2019.Changelog
- ${SITE_CHANGELOG}
+ ${transformMultiline(SITE_CHANGELOG, true)}
Listen on ${joinNoOxford(album.urls.map(url => fancifyURL(url, {album: true})), 'or')}.
` || ``} - <${listTag}> - ${album.tracks.map(track => fixWS` -This album listing is divided into groups:
+Artist commentary:
@@ -922,7 +1038,7 @@ async function writeTrackPage(track) { const tracksReferenced = getTracksReferencedBy(track); const flashesThatFeature = getFlashesThatFeature(track); await writePage([C.TRACK_DIRECTORY, track.directory], track.name, fixWS` - +${generateHeaderForAlbum(track.album, track)}@@ -940,6 +1056,7 @@ async function writeTrackPage(track) { `))}.` || ``} ${track.album.directory !== C.UNRELEASED_TRACKS_DIRECTORY && `
Released ${getDateString(track)}.` || ``} ${+track.artDate !== +track.date && `
Art released ${getDateString({date: track.artDate})}.` || ``} + ${track.duration && `
Duration: ${getDurationString(track.duration)}.` || ``} ${track.urls.length ? fixWS`Listen on ${joinNoOxford(track.urls.map(fancifyURL), 'or')}.
@@ -965,7 +1082,7 @@ async function writeTrackPage(track) {${tracksReferenced.map(track => fixWS`
- - ${track.name} + ${track.name} by ${getArtistString(track.artists)}
`).join('\n')} @@ -979,7 +1096,7 @@ async function writeTrackPage(track) {${ttrOfficial.map(track => fixWS`
- - ${track.name} + ${track.name} by ${getArtistString(track.artists)}
`).join('\n')} @@ -990,7 +1107,7 @@ async function writeTrackPage(track) {${ttrFanon.map(track => fixWS`
- - ${track.name} + ${track.name} by ${getArtistString(track.artists)}
`).join('\n')} @@ -1026,15 +1143,19 @@ async function writeArtistPages() { await progressPromiseAll('Writing artist pages.', queue(artistNames.map(artistName => () => writeArtistPage(artistName)))); } +function getTracksByArtist(artistName) { + return allTracks.filter(track => ( + track.artists.includes(artistName) || + track.contributors.some(({ who }) => who === artistName) + )); +} + async function writeArtistPage(artistName) { const { urls = [] } = artistData.find(({ name }) => name === artistName) || {}; - const tracks = allTracks.filter(track => ( - track.artists.includes(artistName) || - track.contributors.some(({ who }) => who === artistName) - )); + const tracks = getTracksByArtist(artistName); const artThings = justEverythingMan.filter(thing => (thing.coverArtists || []).some(({ who }) => who === artistName)); const flashes = flashData.filter(flash => (flash.contributors || []).some(({ who }) => who === artistName)); const commentaryThings = justEverythingMan.filter(thing => thing.commentary && thing.commentary.replace(/<\/?b>/g, '').includes('' + artistName + ':')); @@ -1050,7 +1171,8 @@ async function writeArtistPage(artistName) { const flashes = getFlashesThatFeature(track); return fixWS`- - ${track.name} + ${track.duration && `(${getDurationString(track.duration)})` || ``} + ${track.name} ${track.artists.includes(artistName) && track.artists.length > 1 && `(with ${getArtistString(track.artists.filter(a => a !== artistName))})` || ``} ${contrib.what && `(${getContributionString(contrib) || 'contributed'})` || ``} ${flashes.length && `
(Featured in ${joinNoOxford(flashes.map(getFlashLinkHTML))})` || ``} @@ -1078,8 +1200,13 @@ async function writeArtistPage(artistName) { flashes.length && `Flashes & Games`, commentaryThings.length && `Commentary` ].filter(Boolean).join(', ')}. - ${tracks.length && `Tracks
`} - ${releasedTracks.length && generateTrackList(releasedTracks)} + ${tracks.length && fixWS` +Tracks
+ `} + ${releasedTracks.length && fixWS` +${artistName} has released ~${getDurationString(getTotalDuration(releasedTracks))} ${getTotalDuration(releasedTracks) > 3600 ? 'hours' : 'minutes'} of music collected on this wiki.
+ ${generateTrackList(releasedTracks)} + `} ${unreleasedTracks.length && fixWS`Unreleased Tracks
${generateTrackList(unreleasedTracks)} @@ -1091,7 +1218,7 @@ async function writeArtistPage(artistName) { return fixWS`- ${thing.album ? fixWS` - ${thing.name} + ${thing.name} ` : '(cover art)'} ${thing.coverArtists.length > 1 && `(with ${getArtistString(thing.coverArtists.map(({ who }) => who).filter(a => a !== artistName))})`} ${contrib.what && `(${getContributionString(contrib)})`} @@ -1119,7 +1246,7 @@ async function writeArtistPage(artistName) { return fixWS`
- ${thing.album ? fixWS` - ${thing.name} + ${thing.name} ` : '(album commentary)'} ${flashes.length && `
@@ -1136,7 +1263,7 @@ function albumChunkedList(tracks, getLI, showDate = true, dateProperty = 'date') const getAlbum = thing => thing.album ? thing.album : thing; return fixWS`
(Featured in ${joinNoOxford(flashes.map(getFlashLinkHTML))})`}- ${tracks.slice().sort((a, b) => a[dateProperty] - b[dateProperty]).map((thing, i, sorted) => { + ${tracks.slice().sort((a, b) => dateProperty ? a[dateProperty] - b[dateProperty] : 0).map((thing, i, sorted) => { const li = getLI(thing, i); const album = getAlbum(thing); const previous = sorted[i - 1]; @@ -1208,12 +1335,12 @@ async function writeFlashPage(flash) { const previous = flashes[index - 1]; const next = flashes[index + 1]; const parts = [ - previous && `Previous`, - next && `Next` + previous && `Previous`, + next && `Next` ].filter(Boolean); await writePage([C.FLASH_DIRECTORY, kebab], flash.name, fixWS` - +
Home @@ -1302,7 +1429,7 @@ async function writeFlashPage(flash) { const neeeighm = neighm[1].replace('$$$$', ':'); return fixWS`
- - ${neeeighm} + ${neeeighm} by ${getArtistString(track.artists)}
`; @@ -1353,6 +1480,10 @@ function writeListingPages() { .map(album => getAlbumLI(album, `(${album.tracks.length} tracks)`))], [['albums', 'by-date'], `Albums - by Date`, C.sortByDate(albumData.slice()) .map(album => getAlbumLI(album, `(${getDateString(album)})`))], + [['albums', 'by-duration'], `Albums - by Duration`, albumData.slice() + .map(album => ({album, duration: getTotalDuration(album.tracks)})) + .sort((a, b) => b.duration - a.duration) + .map(({ album, duration }) => getAlbumLI(album, `(${getDurationString(duration)})`))], [['albums', 'by-tracks'], `Albums - by Tracks`, albumData.slice() .sort((a, b) => b.tracks.length - a.tracks.length) .map(album => getAlbumLI(album, `(${s(album.tracks.length, 'track')})`))], @@ -1376,10 +1507,22 @@ function writeListingPages() { .sort((a, b) => b.contribs - a.contribs) .map(({ name }) => name) .map(getArtistLI)], + [['artists', 'by-duration'], `Artists - by Duration`, allArtists + .map(name => ({name, duration: getTotalDuration( + getTracksByArtist(name).filter(track => track.album.directory !== C.UNRELEASED_TRACKS_DIRECTORY)) + })) + .filter(({ duration }) => duration > 0) + .sort((a, b) => b.duration - a.duration) + .map(({ name, duration }) => fixWS` +- + ${name} + (~${getDurationString(duration)}) +
+ `)], [['tracks', 'by-name'], `Tracks - by Name`, allTracks.slice() .sort(sortByName) .map(track => fixWS` -- ${track.name}
+- ${track.name}
`)], [['tracks', 'by-album'], `Tracks - by Album`, fixWS`@@ -1387,7 +1530,7 @@ function writeListingPages() {
- ${album.name}
- `).join('\n')} @@ -1396,29 +1539,52 @@ function writeListingPages() { [['tracks', 'by-date'], `Tracks - by Date`, albumChunkedList( C.sortByDate(allTracks.slice()), track => fixWS` -
${album.tracks.map(track => fixWS` -
- ${track.name}
+- ${track.name}
`).join('\n')}- ${track.name}
+- ${track.name}
`)], + [['tracks', 'by-duration'], `Tracks - by Duration`, C.sortByDate(allTracks.slice()) + .filter(track => track.duration > 0) + .sort((a, b) => b.duration - a.duration) + .map(track => fixWS` +- + ${track.name} + (${getDurationString(track.duration)}) +
+ `)], + [['tracks', 'by-duration-in-album'], `Tracks - by Duration (in Album)`, albumChunkedList(albumData.flatMap(album => album.tracks) + .filter(track => track.duration > 0) + .sort((a, b) => ( + b.album !== a.album ? 0 : + b.duration - a.duration + )), + track => fixWS` +- + ${track.name} + (${getDurationString(track.duration)}) +
+ `, + false, + null)], [['tracks', 'by-times-referenced'], `Tracks - by Times Referenced`, C.sortByDate(allTracks.slice()) .filter(track => getTracksThatReference(track).length > 0) .sort((a, b) => getTracksThatReference(b).length - getTracksThatReference(a).length) .map(track => fixWS`- - ${track.name} + ${track.name} (${s(getTracksThatReference(track).length, 'time')} referenced)
`)], [['tracks', 'in-flashes', 'by-album'], `Tracks - in Flashes & Games (by Album)`, albumChunkedList( C.sortByDate(allTracks.slice()).filter(track => getFlashesThatFeature(track).length > 0), - track => `- ${track.name}
`)], + track => `- ${track.name}
`)], [['tracks', 'in-flashes', 'by-flash'], `Tracks - in Flashes & Games (by First Feature)`, Array.from(new Set(flashData.filter(flash => !flash.act8r8k).flatMap(flash => getTracksFeaturedByFlash(flash)))) .filter(Boolean) - .map(track => `- ${track.name}
`)], + .map(track => `- ${track.name}
`)], [['tracks', 'with-lyrics'], `Tracks - with Lyrics`, albumChunkedList( C.sortByDate(allTracks.slice()) .filter(track => track.lyrics), track => fixWS` -- ${track.name}
+- ${track.name}
`)] ]; @@ -1655,6 +1821,28 @@ function getLinkedTrack(ref) { } } +function getLinkedAlbum(ref) { + ref = ref.replace('album:', ''); + let album + album = albumData.find(album => album.directory === ref); + if (!album) album = albumData.find(album => album.name === ref); + if (!album) { + album = albumData.find(album => album.name.toLowerCase() === ref.toLowerCase()); + if (album) { + console.warn(`\x1b[33mBad capitalization:\x1b[0m`); + console.warn(`\x1b[31m- ${ref}\x1b[0m`); + console.warn(`\x1b[32m+ ${album.name}\x1b[0m`); + return album; + } + } + return album; +} + +function getLinkedFlash(ref) { + ref = ref.replace('flash:', ''); + return flashData.find(flash => flash.directory === ref); +} + function getFlashesThatFeature(track) { return flashData.filter(flash => (getTracksFeaturedByFlash(flash) || []).includes(track)); } @@ -1775,9 +1963,9 @@ function generateHeaderForAlbum(album, currentTrack = null) { ${currentTrack && `/ ${currentTrack.name}` || ` `} ${album.tracks.length > 1 && fixWS` (${[ - previous && `Previous`, - next && `Next`, - `${currentTrack ? 'Random' : 'Random Track'}` + previous && `Previous`, + next && `Next`, + `${currentTrack ? 'Random' : 'Random Track'}` ].filter(Boolean).join(', ')}) ` || ``} @@ -1811,12 +1999,27 @@ function generateHeaderForAlbum(album, currentTrack = null) { } function generateSidebarForAlbum(album, currentTrack = null) { + const trackToListItem = track => `- ${track.name}
`; const listTag = getAlbumListTag(album); return fixWS`${album.name}
- <${listTag}> - ${album.tracks.map(track => `- ${track.name}
`).join('\n')} - ${listTag}> + ${album.usesGroups ? fixWS` ++ ${album.tracks.flatMap((track, i, arr) => [ + (i > 0 && track.group !== arr[i - 1].group) && `${listTag}>`, + (i === 0 || track.group !== arr[i - 1].group) && fixWS` +
+ ` : fixWS` + <${listTag}> + ${album.tracks.map(trackToListItem).join('\n')} + ${listTag}> + `} ` } @@ -2092,9 +2295,9 @@ async function main() { } await writeMiscellaneousPages(); + await writeListingPages(); await progressPromiseAll(`Writing album & track pages.`, queue(albumData.map(album => writeIndexAndTrackPagesForAlbum(album)).reduce((a, b) => a.concat(b)))); await writeArtistPages(); - await writeListingPages(); await writeFlashPages(); decorateTime.displayTime(); -- cgit 1.3.0-6-gf8a5- ${track.group}
+- <${listTag}> + `, + (currentTrack && track.group === currentTrack.group) && trackToListItem(track), + i === arr.length && `${listTag}>
` + ].filter(Boolean)).join('\n')} +