classical-887
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
requestsPython package (uv pip install --system requests)- No API key required — uses NPR's public Composer API
- Spotify integration (optional):
spotipypackage (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.
- Stream: wmht.org/classical
- Playlist: classicalwmht.org/playlist
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 |
More from tdimino/claude-code-minoan
academic-research
Search academic papers, build literature reviews, and synthesize research findings — combines Exa MCP (research_paper category, arxiv filtering) with arxiv-mcp-server for paper discovery, download, and deep analysis. Triggers on academic paper, literature review, research synthesis, arxiv, find papers, scholarly search.
70travel-requirements-expert
Plan a trip, create an itinerary, or research a destination through a structured 5-phase workflow---discovery questions, Exa/Firecrawl research, expert detail gathering, and a day-by-day requirements spec. This skill should be used when a user says "plan a trip," "create an itinerary," "help me visit [place]," or needs travel research with specific venues, safety protocols, and dietary accommodations.
67twilio-api
Use this skill when working with Twilio communication APIs for SMS/MMS messaging, voice calls, phone number management, TwiML, webhook integration, two-way SMS conversations, bulk sending, or production deployment of telephony features. Includes official Twilio patterns, production code examples from Twilio-Aldea (provider-agnostic webhooks, signature validation, TwiML responses), and comprehensive TypeScript examples.
65figma-mcp
Convert Figma designs into production-ready code using MCP server tools. Use this skill when users provide Figma URLs, request design-to-code conversion, ask to implement Figma mockups, or need to extract design tokens and system values from Figma files. Works with frames, components, and entire design files to generate HTML, CSS, React, or other frontend code.
61firecrawl
Scrape web pages to clean markdown using Firecrawl v2 — handles JS-heavy pages, site crawls, URL mapping, document parsing (PDF/DOCX/XLSX), LLM-powered extraction, autonomous agent scraping, and post-scrape browser interaction (Interact API). Prefer over WebFetch for quality and completeness. Triggers on scrape URL, fetch page, crawl site, extract content, parse document, web to markdown, DeepWiki, Firecrawl.
51scrapling
Scrape pages locally with anti-bot bypass, TLS impersonation, and adaptive element tracking — no API keys, no cloud. Handles Cloudflare protection, CSS/XPath element extraction, and survives site redesigns. Complements firecrawl (cloud) with 100% local execution. Triggers on Cloudflare bypass, anti-bot scraping, stealth fetch, local scraping, Scrapling.
47