classical-887

SKILL.md

Classical 887

Check what's playing on WRHV 88.7 FM (Classical WMHT) — the classical music station in the Hudson Valley. Queries the NPR Composer API for real-time playlist data and provides clickable links to listen on YouTube, Spotify, Apple Music, IMSLP, IDAGIO, Internet Archive, and Musopen.

When to Use

  • Checking what's playing right now on 88.7
  • Getting recent tracks with links to listen again
  • Building a Markdown playlist report
  • Finding a specific piece heard on the radio
  • Creating Spotify playlists from radio tracks
  • Renaming Spotify playlists
  • Auditing owned Spotify playlists (list, search, sort)
  • Cleaning up accumulated Spotify playlists (safe bulk removal)
  • Exporting playlist track data to JSON before cleanup
  • Reviewing playlist operation history

Prerequisites

  • requests Python package (uv pip install --system requests)
  • No API key required — uses NPR's public Composer API
  • Spotify integration (optional): spotipy package (uv pip install --system spotipy) + Spotify Developer App credentials

Usage

# What's playing right now (default)
python3 ~/.claude/skills/classical-887/scripts/classical_887.py

# Last 10 tracks
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --recent 10

# Today's full playlist (pages through all tracks for today)
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period today

# Last week as Markdown report
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period week --markdown ~/Desktop/classical-week.md

# Last month as Markdown report
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period month --markdown ~/Desktop/classical-month.md

# Specific date (Valentine's Day)
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --date 2026-02-14

# Search for a composer across a date range
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period week --search bach

# Full performer details (album, label, catalog number)
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --recent 5 --verbose

# Raw JSON output
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --now --json

# Create Spotify playlist from today's tracks
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period today --spotify-playlist

# Add yesterday's tracks to the persistent playlist
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period yesterday --spotify-playlist

# Custom playlist name from a specific date
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --date 2026-02-14 --spotify-playlist "Valentine's Classical"

# Last week's Bach on Spotify
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --period week --search bach --spotify-playlist "Bach on 88.7"

# Rename the default playlist
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-rename "Hudson Valley Classical"

# Rename a specific playlist with a new description
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-playlist "Bach on 88.7" --spotify-rename "Bach Collection" --spotify-description "Curated Bach from WRHV 88.7 FM"

# View playlist operation log as Markdown
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-log-report

# Audit all owned Spotify playlists
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-audit

# Audit with search filter and sort by track count
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-audit --search "Rediscover*" --sort tracks

# Dry run cleanup (preview only, no deletion)
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-cleanup "Rediscover*"

# Execute cleanup with safety cap
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-cleanup "Rediscover*" --confirm --max 10

# Export playlist tracks to JSON before cleanup
python3 ~/.claude/skills/classical-887/scripts/classical_887.py --spotify-export ~/Desktop/exports --search "Rediscover*"

Parameters

Flag Description Default
--now Show what's playing now On (if no other mode)
--recent N Show last N tracks (1–100) Off
--date YYYY-MM-DD Fetch all tracks from a specific date Off
--period PERIOD Fetch tracks from: today, yesterday, week, month Off
--search QUERY Filter results by composer, piece, or performer Off
--verbose Full details (album, label, catalog, all performers) Off
--json Raw JSON output Off
--markdown [FILE] Write Markdown report with clickable links classical-playlist.md
--sort FIELD Sort by: time (newest first), duration (longest), composer (A–Z) time
--spotify-playlist [NAME] Create/append to a Spotify playlist Classical 88.7 FM
--spotify-rename NEW_NAME Rename an existing Spotify playlist (defaults to renaming Classical 88.7 FM unless --spotify-playlist specifies the current name) Off
--spotify-description DESC Set new description when renaming (used with --spotify-rename) Off
--spotify-log-report View the playlist operation log as a Markdown report Off
--spotify-audit List all owned Spotify playlists (combine with --search and --sort) Off
--spotify-cleanup PATTERN Remove playlists matching glob pattern (dry run unless --confirm) Off
--spotify-export [DIR] Export matching playlist tracks to JSON files .
--confirm Execute cleanup (without this, --spotify-cleanup is preview only) Off
--max N Safety cap: max playlists to remove per invocation No limit
--spotify-client-id ID Spotify app client ID (or SPOTIFY_CLIENT_ID env var)
--spotify-client-secret SECRET Spotify app client secret (or SPOTIFY_CLIENT_SECRET env var)

Output

Default shows: composer, piece, performers, duration, and listen links (YouTube, Spotify, Apple Music, IMSLP, IDAGIO, Internet Archive, Musopen).

Markdown report includes: now-playing header, recent tracks table with 7 platform links, and a composer index.

Playlist Log

Every --spotify-playlist operation automatically appends a JSONL entry to ~/.claude/skills/classical-887/playlist-log.jsonl. Each entry records:

  • Date and action (created/appended)
  • Playlist name and Spotify URL
  • Tracks added (composer, piece, performers, duration, Spotify URI)
  • Tracks not found on Spotify
  • Total counts (matched/unmatched)

View the log as a Markdown report with --spotify-log-report. The log file is append-only and can be queried with standard jq commands:

# Count total operations
wc -l ~/.claude/skills/classical-887/playlist-log.jsonl

# Show all playlist names used
cat ~/.claude/skills/classical-887/playlist-log.jsonl | jq -r '.playlist_name' | sort -u

# Total tracks matched across all operations
cat ~/.claude/skills/classical-887/playlist-log.jsonl | jq '.matched_count' | paste -sd+ | bc

Data Source

NPR Composer API (api.composer.nprstations.org/v1/widget/), which powers the WMHT playlist widget at classicalwmht.org/playlist.

Full API documentation: references/api-reference.md

Station Info

WRHV 88.7 FM (Poughkeepsie, NY), simulcast of WMHT-FM 89.1 (Schenectady). Full station details in references/api-reference.md.

Fallback

If the NPR Composer API is unavailable:

# Check the playlist page directly
firecrawl scrape "https://classicalwmht.org/playlist" --only-main-content

Reference Documentation

File Contents
references/api-reference.md NPR Composer API: endpoints, request/response schema, field reference
references/spotify-setup.md Spotify Developer App setup, OAuth, env vars, Dev Mode notes
Weekly Installs
27
GitHub Stars
12
First Seen
Feb 21, 2026
Installed on
opencode27
gemini-cli27
claude-code27
github-copilot27
codex27
amp27