Plan
ID:WORK-015Status:donePriority:mediumComplexity:unknown

Build track and playlist Runes

Summary

track is a single media item (song, podcast episode, audiobook chapter, talk, or video). playlist is an ordered collection of tracks (album tracklist, podcast feed, video series, audiobook TOC). These replace the existing music-recording and music-playlist runes with a type-polymorphic design.

These two runes are tightly coupled — playlist defines a compact Markdown-native format that parses into tracks — so they're built together.

Migration from Existing Runes

ExistingNewAttribute changes
music-recordingtrack with type="song"byArtistartist, copyrightYearyear
music-playlistplaylist with type="album"Remove trackFields, split, mirror. Add artist.

Existing runes continue as aliases during transition.

Track Attributes

NameTypeDefaultRequiredDescription
typeString'song'Nosong, episode, chapter, talk, video
artistStringNoCreator/performer name
albumStringNoParent collection
durationStringNoISO 8601 duration (formatted to 3:45 display)
yearNumberNoRelease year
numberNumberNoTrack/episode/chapter number
urlStringNoLink to the media
dateStringNoPublication date (ISO 8601, for episodes/series)
listItemBooleanfalseNoRender as <li> instead of <div>

Playlist Attributes

NameTypeDefaultRequiredDescription
typeString'album'Noalbum, podcast, audiobook, series, mix
artistStringNoDefault artist inherited by all child tracks
audioStringNoAudio file URL for embedded playback

Compact Track Format (Markdown-native)

Per SPEC-006, track metadata uses Markdown formatting constructs instead of pipe-delimited strings:

Markdown constructTrack fieldExample
Bold textTrack name**Bohemian Rhapsody**
Link wrapping the nameAudio source (src)[**Breathe**](/audio/breathe.mp3)
Italic textArtist*Queen*
(duration)Duration(5:55)
Text after em-dashDate or context— 2024-01-15

When artist is set on the playlist, parsed list-item tracks inherit it as their default artist.

Transform Output

Track:

  • typeof: Track
  • Tag: <div> or <li>
  • Properties: name (h-element), artist (span), album (span), duration (span, formatted), year (span), number (span), url (a), date (span), type

Playlist:

  • typeof: Playlist
  • Tag: <section>
  • Properties: eyebrow, headline, image, blurb, type, artist (span)
  • Refs: tracks (ol of track items)

Status

Already implemented. Both runes have full schemas, configs, CSS, tests, and legacy aliases:

  • Track schema: runes/media/src/tags/track.ts (129 lines)
  • Playlist schema: runes/media/src/tags/playlist.ts (323 lines)
  • Config: runes/media/src/config.ts (Track, Playlist, MusicRecording, MusicPlaylist)
  • CSS: packages/lumina/styles/runes/track.css + playlist.css
  • Tests: runes/media/test/track.test.ts, playlist.test.ts, music-playlist.test.ts
  • Legacy aliases: music-recordingTrack, music-playlistPlaylist (with deprecation notices)
  • Duration utilities: runes/media/src/duration.ts
  • SEO tests: runes/media/test/seo.test.ts

Relationships