Skip to content

Commit becf6ca

Browse files
CuWilliamsclaude
andcommitted
Add streaming links for Disciples of Dysfunction (Apple Music, Spotify)
Introduce streamingLinks array on tracks replacing per-platform fields, add announcement linking to Apple Music, and render platform icons on the releases page tracklist. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5799fba commit becf6ca

5 files changed

Lines changed: 62 additions & 7 deletions

File tree

assets/css/components.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,6 +1871,19 @@ p.origin-placeholder {
18711871
flex-shrink: 0;
18721872
}
18731873

1874+
.release-card__streaming-link {
1875+
flex-shrink: 0;
1876+
font-size: var(--font-size-sm);
1877+
color: var(--color-text-muted);
1878+
text-decoration: none;
1879+
transition: color var(--transition-base);
1880+
}
1881+
1882+
.release-card__streaming-link:hover,
1883+
.release-card__streaming-link:focus {
1884+
color: var(--color-primary);
1885+
}
1886+
18741887

18751888
/*
18761889
STREAMING LINKS

assets/data/announcements.json

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
{
22
"announcements": [
3-
{
3+
{
4+
"id": "004",
5+
"date": "2025-02-11",
6+
"title": "From Garage to Global: dURT Goes Streaming",
7+
"category": "release",
8+
"excerpt": "We did something terrifying. We put our music on the actual internet. 'Disciples of Dysfunction' is now streaming everywhere alongside actual musicians.",
9+
"content": "<p>We did something terrifying. We put our music on the internet. Not just our internet — the internet. Spotify. Apple Music. Everywhere. 'Disciples of Dysfunction' is now streaming on every major platform alongside actual musicians who actually know what they're doing.</p><p>Most of our families don't know yet. We're not hiding it. We're just... strategically delaying that conversation.</p><p>The road to distribution wasn't without incident. Our AI-generated album art had to be pulled and re-submitted after we noticed the drummer's hand was on the wrong arm. The distribution Inspectors didn't flag it. We almost went global with a medical anomaly on the cover. Classic.</p><p>So here we are. Two grizzled rocker wannabes, one single, and every streaming platform known to mankind. If this ain't retirement, we don't know what is. Give it a listen. Put it on your playlist. Hit repeat. At our current royalty rate, we should recoup the $9.99 distribution fee by 2087.</p>",
10+
"link": {
11+
"url": "https://music.apple.com/ca/album/disciples-of-dysfunction/1876451162?i=1876451163",
12+
"text": "Stream Disciples of Dysfunction"
13+
},
14+
"featured": true
15+
}, {
416
"id": "003",
517
"date": "2025-01-19",
618
"title": "Divine Intervention: We Actually Have Music Now",
@@ -11,7 +23,7 @@
1123
"url": "/releases#release-ecclesiastical-tapes-2025",
1224
"text": "Witness the Miracle"
1325
},
14-
"featured": true
26+
"featured": false
1527
},
1628
{
1729
"id": "002",

assets/data/releases.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
{ "title": "Two Sticks", "hasAudio": true, "audioFile": "/assets/audio/ecclesiastical-tapes/two-sticks.mp3", "duration": "3:22", "featured": false, "artwork": "/assets/images/songs/two-sticks.png", "artworkAlt": "Biblical mosh pit"},
1616
{ "title": "Confession Booth Blues", "hasAudio": false },
1717
{ "title": "The Book of Regrets (Chapters 1-47)", "hasAudio": false },
18-
{ "title": "Disciples of Dysfunction", "hasAudio": true, "audioFile": "/assets/audio/ecclesiastical-tapes/disciples-of-dysfunction.mp3", "duration": "3:54", "featured": true, "artwork": "/assets/images/songs/disciples-of-dysfunction.png", "artworkAlt": "Roman rock bar"},
18+
{ "title": "Disciples of Dysfunction", "hasAudio": true, "audioFile": "/assets/audio/ecclesiastical-tapes/disciples-of-dysfunction.mp3", "duration": "3:54", "featured": true, "artwork": "/assets/images/songs/disciples-of-dysfunction.png", "artworkAlt": "Roman rock bar", "streamingLinks": [{ "platform": "apple-music", "url": "https://music.apple.com/ca/album/disciples-of-dysfunction/1876451162?i=1876451163" },{ "platform": "spotify", "url": "https://open.spotify.com/album/5fu2bfKTX2Lc5nDztcJMpb" }]},
1919
{ "title": "Confession Booth Blues", "hasAudio": false },
2020
{ "title": "Apocalypse? More Like Apoca-Nips (Of Whiskey)", "hasAudio": false },
2121
{ "title": "Amen (We Think That's How It Ends)", "hasAudio": false }

assets/js/releases.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,21 @@
2626
* Why stored in data? Ensures alt text is content-managed, not hardcoded
2727
* - description: Album description (string, supports plain text)
2828
* - tracklist: Array of track objects (or strings for backward compatibility)
29-
* Each track object contains: title, hasAudio, and optional audioFile, duration, sunoUrl, artwork, featured
29+
* Each track object contains: title, hasAudio, and optional audioFile, duration, streamingLinks, artwork, featured
3030
* - featured: Boolean flag to highlight primary/newest release
3131
* Featured releases get special styling (larger cards, prominent borders)
3232
*/
3333

34+
// =============================================================================
35+
// STREAMING PLATFORM CONFIG
36+
// =============================================================================
37+
38+
const STREAMING_PLATFORMS = {
39+
'apple-music': { label: 'Apple Music', icon: '🍎' },
40+
'spotify': { label: 'Spotify', icon: '🎧' },
41+
'suno': { label: 'Suno', icon: '🎵' }
42+
};
43+
3444
// =============================================================================
3545
// DATA FETCHING
3646
// =============================================================================
@@ -150,6 +160,12 @@ function renderReleaseCard(release) {
150160
};
151161
const dataAttr = encodeURIComponent(JSON.stringify(trackData));
152162
163+
const streamingHTML = (track.streamingLinks || []).map(link => {
164+
const config = STREAMING_PLATFORMS[link.platform];
165+
if (!config) return '';
166+
return `<a class="release-card__streaming-link" href="${link.url}" target="_blank" rel="noopener noreferrer" aria-label="Listen to ${trackTitle} on ${config.label}" title="${config.label}">${config.icon}</a>`;
167+
}).join('');
168+
153169
return `<li class="release-card__track release-card__track--playable">
154170
<button class="release-card__play-btn"
155171
type="button"
@@ -159,6 +175,7 @@ function renderReleaseCard(release) {
159175
</button>
160176
<span class="release-card__track-title">${trackTitle}</span>
161177
${track.duration ? `<span class="release-card__track-duration">${track.duration}</span>` : ''}
178+
${streamingHTML}
162179
</li>`;
163180
} else {
164181
return `<li class="release-card__track">${trackTitle}</li>`;

docs/DATA_SCHEMA.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ Releases can have animated cover art using MP4/WebM video files. The video autop
115115
}
116116
```
117117

118-
> **Note:** Streaming links (Spotify, Apple Music, etc.) are not currently supported at the release level. Audio playback is handled via individual tracks with the `audioFile` field, and external links can be added at the track level via `sunoUrl`.
118+
> **Note:** Streaming links (Spotify, Apple Music, Suno) are supported at the track level via the `streamingLinks` array. Audio playback is handled via the `audioFile` field.
119119
120120
### Track Schema
121121

@@ -128,7 +128,11 @@ Each track in the tracklist is an object with the following fields:
128128
"hasAudio": true,
129129
"audioFile": "/assets/audio/album/track.mp3",
130130
"duration": "3:42",
131-
"sunoUrl": "https://suno.com/song/abc123",
131+
"streamingLinks": [
132+
{ "platform": "apple-music", "url": "https://music.apple.com/..." },
133+
{ "platform": "spotify", "url": "https://open.spotify.com/..." },
134+
{ "platform": "suno", "url": "https://suno.com/song/abc123" }
135+
],
132136
"artwork": "/assets/images/songs/track-art.png",
133137
"artworkAlt": "Description of track artwork",
134138
"artworkVideo": "/assets/images/songs/track-art.mp4",
@@ -148,13 +152,22 @@ Each track in the tracklist is an object with the following fields:
148152
| `hasAudio` | boolean | Yes | Whether playable audio exists |
149153
| `audioFile` | string | If hasAudio | Path to MP3 file |
150154
| `duration` | string | If hasAudio | Track length (MM:SS format) |
151-
| `sunoUrl` | string | No | Link to Suno platform |
155+
| `streamingLinks` | array | No | Array of streaming platform links (see below) |
152156
| `artwork` | string | No | Track-specific artwork (falls back to album art) |
153157
| `artworkAlt` | string | No | Alt text for track artwork |
154158
| `artworkVideo` | string | No | Animated track artwork video (MP4) |
155159
| `artworkVideoPoster` | string | No | Poster image for video (defaults to artwork) |
156160
| `featured` | boolean | No | Highlight as featured song (default: false) |
157161

162+
### Streaming Links Schema
163+
164+
Each entry in `streamingLinks` is an object:
165+
166+
| Field | Type | Required | Description |
167+
|-------|------|----------|-------------|
168+
| `platform` | string | Yes | One of: `apple-music`, `spotify`, `suno` |
169+
| `url` | string | Yes | Full URL to the track on that platform |
170+
158171
> **Note:** Track artwork video fields follow the same conventions as album cover videos. If a track has `artworkVideo` specified, it will display as animated artwork. If not, the track inherits the album's video (if any) or falls back to static images.
159172
160173
---

0 commit comments

Comments
 (0)