fireworks-radio
Use this skill when the user wants music or long-form audio while coding and the normal media stack is unreliable.
Why This Exists
In practice, terminal music automation fails for boring real-world reasons:
ncm-cli can search tracks but still fail at playback because the song has no playable source.
- Spotify CLI can fail on OAuth callbacks, stale auth state, or Premium-only API restrictions.
- Background player processes can stack and cause double playback.
- The user does not care about audio-stack purity. The user cares about hearing music now.
This skill treats yt-dlp + mpv as the reliable fallback path.
Default Strategy
- Check whether a current player is already running.
- If the requested stack is
ncm-cli or Spotify CLI, try it briefly only when there is a good reason.
- If playback fails because of source availability, auth, Premium, callback, or rights restrictions, stop wasting time.
- Switch to
yt-dlp + mpv.
- Build a short, concrete playlist from artist/title queries.
- Decide whether the user needs
stream mode or cache mode.
- Use listening-preference memory when choosing a preset or fallback style.
- Start playback in a real Terminal session or a stable background process.
- Avoid duplicate processes. If there is already a test track and a playlist track, kill the test track.
- Before switching sources, clear all existing
mpv --no-video processes owned by this workflow, not just the last saved PID.
Source Policy For All Audio Playback
This rule applies to all audio playback in this skill, not only AI news.
Hard Constraints
- Use only publicly accessible, already-published, directly playable sources.
- Do not synthesize a local spoken track unless the user explicitly asks for generation.
- Do not open a webpage if direct terminal playback is possible.
- Play inside the current terminal audio path only, typically
mpv --no-video.
- Prefer one concrete source that already exists over stitched or invented content.
- After one source works, identify at least one alternative source class as backup.
Allowed Source Types
- public YouTube videos where only audio is played
- public podcast RSS feeds with direct
enclosure audio URLs
- public direct MP3 episode links from a podcast host
- free and public music catalogs where the track is already published and directly accessible
Disallowed by Default
- local TTS generated from a web summary
- opening a browser page just so the user can press play there
- stitching unrelated articles into a fake “podcast episode”
- silently drifting from playback into article reading, newsletter summarization, or other non-playback forms
Music Source Guidance
When the user wants music, prefer free and public source classes first, such as:
- Creative Commons catalogs like
ccMixter
- open-licensed catalogs like
Free Music Archive
- public-domain or royalty-free classical catalogs like
Musopen
- public-domain recording archives like
Open Music Archive
Per-track rights still matter. “Free” or “public” at the catalog level is not a blanket license claim for every downstream use.
AI News Mode
When the user asks for AI news, apply the global source policy above and narrow it further.
Preferred Order
- public YouTube AI news video playable through
mpv --no-video
- public podcast RSS / MP3 enclosure playable directly in terminal
- only if both fail, explain the failure clearly and ask before switching formats
Commands
Build a playlist
./scripts/build_playlist.sh /private/tmp/fireworks-radio.m3u \
"萧亚轩 爱的主打歌 official" \
"Ed Sheeran Shape of You official lyric video" \
"Lady Gaga Bad Romance official"
Play a playlist
./scripts/play_mix.sh /private/tmp/fireworks-radio.m3u
Play in cache mode
./scripts/play_mix.sh --mode cache /private/tmp/fireworks-radio.m3u
Stop the current mix
./scripts/stop_mix.sh
One-shot preset
./scripts/play_mix.sh --preset three-artists
./scripts/play_mix.sh --auto
Preference memory
python3 ./scripts/radio_memory.py reinforce --preset three-artists --feedback like
python3 ./scripts/radio_memory.py reinforce --artist "Lady Gaga" --feedback like
python3 ./scripts/radio_memory.py show
Common User Requests
用 fireworks-radio 播一个适合编码的混播
别折腾 ncm-cli 了,直接走 YouTube + mpv
给我做一条 萧亚轩 / Ed Sheeran / Lady Gaga 的混播
直接播今天的 AI 新闻,不要自己合成
不要打开页面,直接在当前窗口播现成的 AI 新闻
按我的历史偏好自动挑一个 preset
停止当前混播
如果 Spotify CLI 失败就自动降级
Operational Rules
- Prefer short playlists first: 9-15 tracks.
- Prefer official audio, lyric video, or official MV queries.
- For all audio playback, prefer an existing public source over any locally generated narration.
- For all audio playback, keep playback format narrow: direct terminal playback only, no browser detour.
- For all audio playback, always leave behind at least one backup source class after the first successful source.
- On source switches, assume the saved PID may be stale; clean residual
mpv --no-video processes before starting the next source.
- In AI news mode, prefer one finished public news source instead of assembling a synthetic recap.
- Do not promise
ncm-cli or Spotify will work if the root problem is rights or Premium.
- Do not leave a foreground test track running after validating playback.
- Always tell the user why the fallback happened.
- Explain clearly that
stream and cache are workflow modes, not media-rights permissions.
1---2name: fireworks-radio3description: Reliable coding-session audio fallback skill. Use when the user wants music or long-form audio during coding, when ncm-cli or Spotify CLI fails because of rights, auth, Premium, callback, or source availability issues, or when the user wants a quick YouTube + mpv mix with minimal friction.4---56# fireworks-radio78Use this skill when the user wants music or long-form audio while coding and the normal media stack is unreliable.910## Why This Exists1112In practice, terminal music automation fails for boring real-world reasons:13141. `ncm-cli` can search tracks but still fail at playback because the song has no playable source.152. Spotify CLI can fail on OAuth callbacks, stale auth state, or Premium-only API restrictions.163. Background player processes can stack and cause double playback.174. The user does not care about audio-stack purity. The user cares about hearing music now.1819This skill treats `yt-dlp + mpv` as the reliable fallback path.2021## Default Strategy22231. Check whether a current player is already running.242. If the requested stack is `ncm-cli` or Spotify CLI, try it briefly only when there is a good reason.253. If playback fails because of source availability, auth, Premium, callback, or rights restrictions, stop wasting time.264. Switch to `yt-dlp + mpv`.275. Build a short, concrete playlist from artist/title queries.286. Decide whether the user needs `stream` mode or `cache` mode.297. Use listening-preference memory when choosing a preset or fallback style.308. Start playback in a real Terminal session or a stable background process.319. Avoid duplicate processes. If there is already a test track and a playlist track, kill the test track.3210. Before switching sources, clear all existing `mpv --no-video` processes owned by this workflow, not just the last saved PID.3334## Source Policy For All Audio Playback3536This rule applies to all audio playback in this skill, not only AI news.3738### Hard Constraints39401. Use only publicly accessible, already-published, directly playable sources.412. Do not synthesize a local spoken track unless the user explicitly asks for generation.423. Do not open a webpage if direct terminal playback is possible.434. Play inside the current terminal audio path only, typically `mpv --no-video`.445. Prefer one concrete source that already exists over stitched or invented content.456. After one source works, identify at least one alternative source class as backup.4647### Allowed Source Types4849- public YouTube videos where only audio is played50- public podcast RSS feeds with direct `enclosure` audio URLs51- public direct MP3 episode links from a podcast host52- free and public music catalogs where the track is already published and directly accessible5354### Disallowed by Default5556- local TTS generated from a web summary57- opening a browser page just so the user can press play there58- stitching unrelated articles into a fake “podcast episode”59- silently drifting from playback into article reading, newsletter summarization, or other non-playback forms6061### Music Source Guidance6263When the user wants music, prefer free and public source classes first, such as:6465- Creative Commons catalogs like `ccMixter`66- open-licensed catalogs like `Free Music Archive`67- public-domain or royalty-free classical catalogs like `Musopen`68- public-domain recording archives like `Open Music Archive`6970Per-track rights still matter. “Free” or “public” at the catalog level is not a blanket license claim for every downstream use.7172## AI News Mode7374When the user asks for AI news, apply the global source policy above and narrow it further.7576### Preferred Order77781. public YouTube AI news video playable through `mpv --no-video`792. public podcast RSS / MP3 enclosure playable directly in terminal803. only if both fail, explain the failure clearly and ask before switching formats8182## Commands8384### Build a playlist8586```bash87./scripts/build_playlist.sh /private/tmp/fireworks-radio.m3u \88 "萧亚轩 爱的主打歌 official" \89 "Ed Sheeran Shape of You official lyric video" \90 "Lady Gaga Bad Romance official"91```9293### Play a playlist9495```bash96./scripts/play_mix.sh /private/tmp/fireworks-radio.m3u97```9899### Play in cache mode100101```bash102./scripts/play_mix.sh --mode cache /private/tmp/fireworks-radio.m3u103```104105### Stop the current mix106107```bash108./scripts/stop_mix.sh109```110111### One-shot preset112113```bash114./scripts/play_mix.sh --preset three-artists115./scripts/play_mix.sh --auto116```117118### Preference memory119120```bash121python3 ./scripts/radio_memory.py reinforce --preset three-artists --feedback like122python3 ./scripts/radio_memory.py reinforce --artist "Lady Gaga" --feedback like123python3 ./scripts/radio_memory.py show124```125126## Common User Requests127128- `用 fireworks-radio 播一个适合编码的混播`129- `别折腾 ncm-cli 了,直接走 YouTube + mpv`130- `给我做一条 萧亚轩 / Ed Sheeran / Lady Gaga 的混播`131- `直接播今天的 AI 新闻,不要自己合成`132- `不要打开页面,直接在当前窗口播现成的 AI 新闻`133- `按我的历史偏好自动挑一个 preset`134- `停止当前混播`135- `如果 Spotify CLI 失败就自动降级`136137## Operational Rules138139- Prefer short playlists first: 9-15 tracks.140- Prefer official audio, lyric video, or official MV queries.141- For all audio playback, prefer an existing public source over any locally generated narration.142- For all audio playback, keep playback format narrow: direct terminal playback only, no browser detour.143- For all audio playback, always leave behind at least one backup source class after the first successful source.144- On source switches, assume the saved PID may be stale; clean residual `mpv --no-video` processes before starting the next source.145- In AI news mode, prefer one finished public news source instead of assembling a synthetic recap.146- Do not promise `ncm-cli` or Spotify will work if the root problem is rights or Premium.147- Do not leave a foreground test track running after validating playback.148- Always tell the user why the fallback happened.149- Explain clearly that `stream` and `cache` are workflow modes, not media-rights permissions.