From c32d860358d2dfd3370a0973418c11186e5ce7c1 Mon Sep 17 00:00:00 2001 From: Florrie Date: Sat, 16 Nov 2019 17:23:20 -0400 Subject: misc updates; track references from NSND --- upd8.js | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 81 insertions(+), 22 deletions(-) (limited to 'upd8.js') diff --git a/upd8.js b/upd8.js index 03999896..8890a5cb 100644 --- a/upd8.js +++ b/upd8.js @@ -85,7 +85,7 @@ const SITE_TITLE = 'Homestuck Music Wiki'; const SITE_INTRO = fixWS`

Welcome to my fan-made Homestuck music wiki! Select any album below to begin browsing.

This site was mostly made as a remake of Homestuck's official Bandcamp, which saw its content reduced on 10/25/19. This site aims to be a more reliable resource and reference: track art (conspicuously missing from the Bandcamp) is archived here, solo albums are all indexed in the one place, and URLs will always stay consistent. Also included are tracks for listening on Bandcamp and other services.

-

This site was mostly made by Florrie. Listings were fetched primarily from the Homestuck Bandcamp. Track art is primarily from the Web Archive. Much of this is made based on and with use of the Homestuck and MSPA Music Wiki on Fandom - thanks a bunch to all who've worked on that!

+

This site was mostly made by Florrie (@florriestuck, /u/towerofnix - feel free to send suggestions and feedback!!). Listings were fetched primarily from the Homestuck Bandcamp. Track art is primarily from the Web Archive. Leitmotif and track-reference info is gathered from the fantastic NSND. Much of this is made based on and with use of the Homestuck and MSPA Music Wiki on Fandom - thanks a bunch to all who've worked on that!

`; // The folder you stick your random downloads in is called "Downloads", yeah? @@ -327,6 +327,7 @@ async function processAlbumDataFile(file) { const trackName = getBasicField(section, 'Track'); const originalDate = getBasicField(section, 'Original Date'); + const references = getListField(section, 'References') || []; let trackArtists = getListField(section, 'Artists') || getListField(section, 'Artist'); let trackCoverArtists = getContributionField(section, 'Track Art'); let trackContributors = getContributionField(section, 'Contributors') || []; @@ -352,7 +353,7 @@ async function processAlbumDataFile(file) { } if (!trackCoverArtists) { - if (albumHasTrackArt) { + if (getBasicField(section, 'Track Art') !== 'none' && albumHasTrackArt) { if (albumTrackCoverArtists) { trackCoverArtists = albumTrackCoverArtists; } else { @@ -391,6 +392,7 @@ async function processAlbumDataFile(file) { artists: trackArtists, coverArtists: trackCoverArtists, contributors: trackContributors, + references, date, directory: trackDirectory, urls: trackURLs, @@ -514,7 +516,7 @@ async function writeAlbumPage(album, albumData) {
  • ${track.name} ${track.artists !== album.artists && fixWS` - by ${getArtistString(track.artists)} + by ${getArtistString(track.artists)} `}
  • `).join('\n')} @@ -529,6 +531,8 @@ async function writeTrackPage(track, albumData) { const artistNames = getArtistNames(albumData); const allTracks = getAllTracks(albumData); const trackDirectory = path.join(TRACK_DIRECTORY, track.directory); + const tracksThatReference = getTracksThatReference(track, allTracks); + const tracksReferenced = getTracksReferencedBy(track, allTracks); await mkdirp(trackDirectory); await writeFile(path.join(trackDirectory, 'index.html'), fixWS` @@ -553,6 +557,14 @@ async function writeTrackPage(track, albumData) { `))}.
    `} Released ${getDateString(track)}.

    +

    Listen on ${joinNoOxford(track.urls.map(url => fixWS` + ${ + url.includes('bandcamp.com') ? 'Bandcamp' : + url.includes('youtu') ? 'YouTube' : + url.includes('soundcloud') ? 'SoundCloud' : + '(External)' + } + `), 'or')}.

    ${track.contributors.length && fixWS`

    Contributors:

    `} -

    Listen on ${joinNoOxford(track.urls.map(url => fixWS` - ${ - url.includes('bandcamp.com') ? 'Bandcamp' : - url.includes('youtu') ? 'YouTube' : - url.includes('soundcloud') ? 'SoundCloud' : - '(External)' - } - `), 'or')}.

    - + ${tracksReferenced.length && fixWS` +

    Tracks that ${track.name} references:

    + + `} + ${tracksThatReference.length && fixWS` +

    Tracks that reference ${track.name}:

    + + `} @@ -585,7 +610,12 @@ async function writeArtistPages(albumData) { async function writeArtistPage(artistName, albumData) { const allTracks = getAllTracks(albumData); - const tracks = sortByDate(allTracks.filter(track => track.artists.includes(artistName) || track.contributors.some(({ who }) => who === artistName))); + const tracks = sortByDate(allTracks.filter(track => ( + track.artists.includes(artistName) || + track.contributors.some(({ who }) => who === artistName) || + getTracksReferencedBy(track, allTracks).some(track => track.artists.includes(artistName)) + ) + )); const artThings = sortByDate(albumData.concat(allTracks).filter(thing => (thing.coverArtists || []).some(({ who }) => who === artistName))); // Shish! @@ -610,15 +640,29 @@ async function writeArtistPage(artistName, albumData) {

    ${artistName}

    ${tracks.length && fixWS`

    Tracks

    +

    Dim tracks are tracks that this artist contributed only a based-upon song to.

      - ${tracks.map(track => fixWS` -
    1. - ${track.name} - ${track.artists.includes(artistName) && track.artists.length > 1 && `(with ${getArtistString(track.artists.filter(a => a !== artistName))})`} - ${!track.artists.includes(artistName) && `(${track.contributors.filter(({ who }) => who === artistName).map(contrib => getContributionString(contrib, tracks)).join(', ') || 'contributed'})`} - from ${track.album.name} -
    2. - `).join('\n')} + ${tracks.map(track => { + const contrib = { + who: artistName, + what: [ + ...track.contributors.filter(({ who }) => who === artistName).map(({ what }) => what), + ...getTracksReferencedBy(track, allTracks).filter(track => track.artists.includes(artistName)).map(track => `[${track.name}]`) + ].filter(Boolean).join(', ') + }; + if (contrib.length && track.artists.includes(artistName)) { + const nonTracks = contrib.what.split(',').map(what => what.trim()).filter(what => !(what.startsWith('[') && what.endsWith(']'))); + contrib.what = nonTracks.join(', '); + } + return fixWS` +
    3. + ${track.name} + ${track.artists.includes(artistName) && track.artists.length > 1 && `(with ${getArtistString(track.artists.filter(a => a !== artistName))})`} + ${contrib.what && `(${getContributionString(contrib, tracks) || 'contributed'})`} + from ${track.album.name} +
    4. + `; + }).join('\n')}
    `} ${artThings.length && fixWS` @@ -632,7 +676,7 @@ async function writeArtistPage(artistName, albumData) { ${contrib.what && `(${getContributionString(contrib, tracks)})`} ${thing.album ? `from ${thing.album.name}` : `(cover art)`} - ` + `; }).join('\n')} `} @@ -652,6 +696,21 @@ function getContributionString({ what }, allTracks) { : ''; } +function getTracksThatReference(track, allTracks) { + return allTracks.filter(t => getTracksReferencedBy(t, allTracks).includes(track)); +} + +function getTracksReferencedBy(track, allTracks) { + return track.references.map(ref => { + if (ref.includes(':')) { + const dir = ref.split(':')[1]; + return allTracks.find(track => track.directory === dir); + } else { + return allTracks.find(track => track.name === ref); + } + }).filter(Boolean); +} + function getArtistString(artists) { return joinNoOxford(artists.map(artist => fixWS` ${artist} -- cgit 1.3.0-6-gf8a5