WORK-015
ID:WORK-015Status:done

Build track and playlist Runes

Priority:mediumComplexity:unknownSource:SPEC-006,SPEC-008

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"byArtist → artist, copyrightYear → year
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
artistString—NoCreator/performer name
albumString—NoParent collection
durationString—NoISO 8601 duration (formatted to 3:45 display)
yearNumber—NoRelease year
numberNumber—NoTrack/episode/chapter number
urlString—NoLink to the media
dateString—NoPublication date (ISO 8601, for episodes/series)
listItemBooleanfalseNoRender as <li> instead of <div>

Playlist Attributes

NameTypeDefaultRequiredDescription
typeString'album'Noalbum, podcast, audiobook, series, mix
artistString—NoDefault artist inherited by all child tracks
audioString—NoAudio file URL for embedded playback

Compact Track Format (Markdown-native)

Per Media Runes — Specification, 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-recording → Track, music-playlist → Playlist (with deprecation notices)
  • Duration utilities: runes/media/src/duration.ts
  • SEO tests: runes/media/test/seo.test.ts

History

  1. f262d7b
    source+SPEC-006,SPEC-008
  2. ebe0c64
    Content edited
  3. 7902f75
    statuspending→done
  4. d275b2a
    Created (pending, medium, runes, media)