diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js | 16 | ||||
| -rw-r--r-- | src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js | 41 | ||||
| -rw-r--r-- | src/content/dependencies/generateArtistInfoPageTracksChunkItem.js | 19 | ||||
| -rw-r--r-- | src/content/dependencies/image.js | 9 | ||||
| -rw-r--r-- | src/content/dependencies/linkTrackAsRelease.js | 20 | ||||
| -rw-r--r-- | src/static/css/site.css | 4 | ||||
| -rw-r--r-- | src/static/js/client-util.js | 12 | ||||
| -rw-r--r-- | src/strings-default.yaml | 3 |
8 files changed, 97 insertions, 27 deletions
diff --git a/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js b/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js index eb32cebf..1d498b9f 100644 --- a/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js +++ b/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js @@ -2,10 +2,18 @@ import {sortAlbumsTracksChronologically} from '#sort'; import {stitchArrays} from '#sugar'; export default { - query: (track) => ({ - rereleases: - sortAlbumsTracksChronologically(track.allReleases).slice(1), - }), +query: (track, artist) => ({ + rereleases: + sortAlbumsTracksChronologically( + track.otherReleases.filter(track => { + const contribs = [ + ...track.artistContribs, + ...track.contributorContribs, + ]; + + return contribs.some(contrib => contrib.artist === artist); + })), +}), relations: (relation, query, track, artist) => ({ tooltip: diff --git a/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js b/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js index 70bada19..bf5fe616 100644 --- a/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js +++ b/src/content/dependencies/generateArtistInfoPageRereleaseTooltip.js @@ -1,10 +1,22 @@ import {sortAlbumsTracksChronologically} from '#sort'; export default { - query: (track) => ({ - firstRelease: - sortAlbumsTracksChronologically(track.allReleases)[0], - }), + query(track, artist) { + const query = {}; + + query.firstRelease = + sortAlbumsTracksChronologically(track.allReleases)[0]; + + const contribs = [ + ...query.firstRelease.artistContribs, + ...query.firstRelease.contributorContribs, + ]; + + query.creditedOnFirstRelease = + contribs.some(contrib => contrib.artist === artist); + + return query; + }, relations: (relation, query, track, artist) => ({ tooltip: @@ -14,10 +26,15 @@ export default { relation('generateColorStyleAttribute', track.color), firstReleaseLink: - relation('linkOtherReleaseOnArtistInfoPage', query.firstRelease, artist), + (query.creditedOnFirstRelease + ? relation('linkOtherReleaseOnArtistInfoPage', query.firstRelease, artist) + : relation('linkTrackAsRelease', query.firstRelease)), }), - data: (query, track) => ({ + data: (query, track, artist) => ({ + artistName: + artist.name, + rereleaseDate: track.dateFirstReleased ?? track.album.date, @@ -25,6 +42,9 @@ export default { firstReleaseDate: query.firstRelease.dateFirstReleased ?? query.firstRelease.album.date, + + creditedOnFirstRelease: + query.creditedOnFirstRelease, }), generate: (data, relations, {html, language}) => @@ -48,6 +68,15 @@ export default { approximate: true, absolute: true, }), + + !data.creditedOnFirstRelease && [ + html.tag('hr', {class: 'cute'}), + + html.tag('span', {class: 'not-credited-on-first-release'}, + language.$(capsule, 'notCreditedOnFirstRelease', { + artist: data.artistName, + })), + ], ], })), }; diff --git a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js index 895cc0d8..e976c57f 100644 --- a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js +++ b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js @@ -2,7 +2,7 @@ import {sortAlbumsTracksChronologically} from '#sort'; import {empty} from '#sugar'; export default { - query(_artist, contribs) { + query(artist, contribs) { const query = {}; // TODO: Very mysterious what to do if the set of contributions is, @@ -68,11 +68,18 @@ export default { query.isFirstRelease = allReleasesChronologically[0] === query.track; - query.isRerelease = + query.isLaterRelease = allReleasesChronologically[0] !== query.track; - query.hasOtherReleases = - !empty(query.track.otherReleases); + query.hasOtherCreditedReleases = + query.track.otherReleases.some(track => { + const contribs = [ + ...track.artistContribs, + ...track.contributorContribs, + ]; + + return contribs.some(contrib => contrib.artist === artist); + }); return query; }, @@ -88,12 +95,12 @@ export default { relation('generateArtistInfoPageOtherArtistLinks', contribs), rereleaseTooltip: - (query.isRerelease + (query.isLaterRelease ? relation('generateArtistInfoPageRereleaseTooltip', query.track, artist) : null), firstReleaseTooltip: - (query.isFirstRelease && query.hasOtherReleases + (query.isFirstRelease && query.hasOtherCreditedReleases ? relation('generateArtistInfoPageFirstReleaseTooltip', query.track, artist) : null), }), diff --git a/src/content/dependencies/image.js b/src/content/dependencies/image.js index d979b0bc..aacf2fed 100644 --- a/src/content/dependencies/image.js +++ b/src/content/dependencies/image.js @@ -108,12 +108,11 @@ export default { // src string directly when a parts-formed path *is* available seems wrong. // It should be possible to do urls.from(slots.path[0]).to(...slots.path), // for example, but will require reworking the control flow here a little. - let mediaSrc = null; + let mediaSrc = decodeURIComponent(originalSrc); if (originalSrc.startsWith(to('media.root'))) { - mediaSrc = - originalSrc - .slice(to('media.root').length) - .replace(/^\//, ''); + mediaSrc = mediaSrc + .slice(to('media.root').length) + .replace(/^\//, ''); } const isMissingImageFile = diff --git a/src/content/dependencies/linkTrackAsRelease.js b/src/content/dependencies/linkTrackAsRelease.js new file mode 100644 index 00000000..7a114ad9 --- /dev/null +++ b/src/content/dependencies/linkTrackAsRelease.js @@ -0,0 +1,20 @@ +export default { + relations: (relation, track) => ({ + trackLink: + relation('linkTrack', track), + }), + + data: (track) => ({ + albumName: + track.album.name, + + albumColor: + track.album.color, + }), + + generate: (data, relations, {language}) => + relations.trackLink.slots({ + content: language.sanitize(data.albumName), + color: data.albumColor, + }), +}; diff --git a/src/static/css/site.css b/src/static/css/site.css index 347881a2..a78a31fb 100644 --- a/src/static/css/site.css +++ b/src/static/css/site.css @@ -1488,6 +1488,10 @@ li:not(:first-child:last-child) .tooltip:where(:not(.cover-artwork .tooltip)), font-size: 0.9em; } +.rerelease-tooltip .not-credited-on-first-release { + opacity: 0.9; +} + .content-tooltip-guy .hoverable a { text-decoration-color: transparent; text-decoration-style: dotted; diff --git a/src/static/js/client-util.js b/src/static/js/client-util.js index 764c1480..74d63ad6 100644 --- a/src/static/js/client-util.js +++ b/src/static/js/client-util.js @@ -97,12 +97,12 @@ export function getVisuallyContainingElement(child) { const getLinkHref = (type, directory) => rebase(`${type}/${directory}`); */ -export const openAlbum = d => rebase(`album/${d}`); -export const openArtTag = d => rebase(`tag/${d}`); -export const openArtist = d => rebase(`artist/${d}`); -export const openFlash = d => rebase(`flash/${d}`); -export const openGroup = d => rebase(`group/${d}`); -export const openTrack = d => rebase(`track/${d}`); +export const openAlbum = d => rebase(`album/${d}/`); +export const openArtTag = d => rebase(`tag/${d}/`); +export const openArtist = d => rebase(`artist/${d}/`); +export const openFlash = d => rebase(`flash/${d}/`); +export const openGroup = d => rebase(`group/${d}/`); +export const openTrack = d => rebase(`track/${d}/`); // TODO: This should also use urlSpec. diff --git a/src/strings-default.yaml b/src/strings-default.yaml index 85d849db..233a7ed3 100644 --- a/src/strings-default.yaml +++ b/src/strings-default.yaml @@ -1332,6 +1332,9 @@ artistPage: firstRelease: >- First released on {ALBUM} + notCreditedOnFirstRelease: >- + Note that {ARTIST} is not credited on this track's first release. + firstRelease: _: "{ENTRY} ({FIRST_RELEASE})" term: "first release" |