Skills podcast-discovery
Podcast discovery for Wherever.Audio -- find shows and episodes, generate wherever.audio links.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aegrumet/podcast-discovery" ~/.claude/skills/openclaw-skills-podcast-discovery && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/aegrumet/podcast-discovery" ~/.openclaw/skills/openclaw-skills-podcast-discovery && rm -rf "$T"
skills/aegrumet/podcast-discovery/SKILL.mdpodcast-discovery
Podcast discovery skill for Wherever.Audio. Given a natural-language query, find the right podcast show or episode and return a playable wherever.audio link.
Do NOT use this skill for non-podcast queries (general web search, music, etc.).
Trigger phrases
Use this skill immediately when the user message includes podcast lookup language such as:
- "find podcast", "find the podcast", "look up podcast", "search podcasts"
- "find episode", "podcast episode about", "interview episode", "latest episodes"
- "give me a wherever link", "wherever link", "wherever.audio link", "listen link", "show link"
- named show/host requests like "Radiolab", "Lex Fridman", "Hard Fork", or "Joe Rogan"
When triggered, prioritize link construction over metadata reporting.
Primary Objective (Highest Priority)
Your job is to produce a working Wherever link (
/show or /listen) as soon as enough information is available.
Success condition:
- Resolve a valid RSS URL from Clawsica.
- If
, immediately return a show link.contentScope = podcast-show - If
and a matching item is found, immediately return an episode link.contentScope = podcast-episode
Do not stop at metadata, search summaries, or candidate lists if a valid link can be constructed.
Link Templates
Episode (contentScope = podcast-episode):
https://wherever.audio/listen?rssUrl={rss_url}&itemGuid={guid}&fallbackLink={fallback}
Show (contentScope = podcast-show):
https://wherever.audio/show?rssUrl={rss_url}
All
{placeholder} values must be URL-encoded.
Action Policy: Link-First, Ask-Last
Default behavior is to execute and return a link in the same response.
Only ask a follow-up question when one of these is true:
- You cannot determine whether the user wants a show vs episode.
- Clawsica returns no plausible show/RSS result after retries.
- Multiple episode candidates are similarly strong and no clear best match exists.
If none of the above apply, do not ask for confirmation. Return the link.
Token Budget Policy
- Run local tooling first and send only compact result fields to the model.
- Never send raw RSS XML, full feed dumps, or large metadata blobs to the model.
- For episode matching, pass only top-ranked candidate rows needed for decision-making and link construction.
Workflow
Step 1 — Classify the query
Before searching, classify the user's query along two dimensions:
intentType — what kind of request?
— user names a host or show (e.g. "Lex Fridman", "Radiolab")specific-podcaster
— user describes a topic or guest (e.g. "Geoffrey Hinton interview about AI")specific-topic
— broad exploration (e.g. "best science podcasts", "podcasts about space")discovery
contentScope — what are they looking for?
— a show/feed (e.g. "find the Radiolab podcast")podcast-show
— a specific episode (e.g. "the Radiolab episode about colors")podcast-episode
Step 2 — Resolve the show
If intentType is
(show name is known):
Go directly to Clawsica (step 3). The query likely contains the show title.specific-podcaster
If intentType is
or specific-topic
(show name is unknown):
Search the web first to discover likely podcast titles, then proceed to Clawsica with those titles.discovery
Step 3 — Clawsica show search
Search for podcast shows using the public Clawsica endpoint. This returns show metadata including RSS feed URLs.
curl -s "https://clawsica.wherever.audio/p?q=radiolab"
Returns a JSON array of show objects. Each object includes a
url field containing the RSS feed URL.
Important: Only use the
url field from Clawsica results as the RSS URL. Do NOT substitute web page URLs, Apple Podcasts links, Spotify links, or any other URL — Wherever.Audio only understands RSS feed URLs. If Clawsica returns no results and you cannot obtain a definitive RSS feed URL, tell the user you were unable to find the podcast rather than guessing with a non-RSS URL.
If Clawsica returns no results, try alternate spellings or broader terms. See
references/CLAWSICA_API.md for the full API reference.
Step 4 — Branch by contentScope
If contentScope is
:
Construct a show link using the RSS URL from step 3 and present it immediately. Do not ask for additional confirmation. Done.podcast-show
Example:
https://wherever.audio/show?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab
If contentScope is
:
Continue to step 5.podcast-episode
Step 5 — Run local feed tooling (required for episode lookup)
For episode lookup, use local tooling instead of manual XML parsing:
python scripts/search_feed_episodes.py --mode search --rss-url "https://feeds.feedburner.com/radiolab" --query "space stories" --limit 5
Optional semantic rerank:
python scripts/search_feed_episodes.py --mode search --rss-url "https://feeds.feedburner.com/radiolab" --query "space stories" --limit 5 --semantic
Compact
search output contract:
- top-level keys:
,mode
,rssUrl
,query
,semanticUsed
,candidateCountcandidates - candidate keys:
,guid
,title
,pubDate
,fallbackLinkscore
Use these candidate rows to select the best episode. Do not return feed-level metadata unless explicitly requested.
Selection policy:
- Auto-pick when the top
is clearly stronger than the second candidate.score - If top candidates are near-tied, ask one disambiguation question.
Step 6 — Construct the episode link
Build a wherever.audio episode link using values from the selected
search candidate:
— the feed URL from step 3rss_url
— candidateguidguid
— candidatefallbackfallbackLink
Example:
https://wherever.audio/listen?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab&itemGuid=some-guid-value&fallbackLink=https%3A%2F%2Fradiolab.org%2Fepisode
Present the link to the user along with the episode title and publish date.
Optional utilities — newest and overview
If the user asks for latest episodes from a known feed:
python scripts/search_feed_episodes.py --mode newest --rss-url "https://feeds.feedburner.com/radiolab" --limit 10
Compact
newest output contract:
- top-level keys:
,mode
,rssUrl
,countitems - item keys:
,guid
,title
,pubDatefallbackLink
If the user asks for feed-level metadata:
python scripts/search_feed_episodes.py --mode overview --rss-url "https://feeds.feedburner.com/radiolab"
Compact
overview output contract:
,mode
,rssUrl
,feedTitle
,feedDescriptionShort
,author
,language
,lastBuildDateitemCount
Use these utility modes to answer the request directly while keeping payloads compact.
Run the local feed tool (for developers/testing)
Path: scripts/search_feed_episodes.py (relative to the skill directory) Requirements: scripts/requirements.txt (feedparser, rapidfuzz, pytest) Quick start (recommended, cross-platform):
- Create and activate a virtual environment in the skill folder: python3 -m venv .venv source .venv/bin/activate # macOS / Linux.venv\Scripts\activate # Windows (PowerShell)
- Install dependencies: pip install -r scripts/requirements.txt
- Run the tool (examples): python scripts/search_feed_episodes.py --mode overview --rss-url "<RSS_URL>" python scripts/search_feed_episodes.py --mode newest --rss-url "<RSS_URL>" --limit 10 python scripts/search_feed_episodes.py --mode search --rss-url "<RSS_URL>" --query "attack on Iran" --limit 5 --semantic Notes: The tool prints compact JSON matching the skill's expected contracts. Make the script executable (chmod +x scripts/search_feed_episodes.py) for direct execution. Use the venv if system pip is restricted.
Response Format
When a link is available, respond in this order:
- The Wherever URL (first line).
- One short line identifying the resolved show/episode.
- Optional one-line note only if there was ambiguity.
Keep responses concise. Do not include raw metadata dumps unless explicitly requested.
Prohibited Behavior
- Do not return only webpage metadata when a Wherever link can be built.
- Do not ask "Should I proceed?" if required link parameters are already known.
- Do not present candidate options unless disambiguation is truly required.
Privacy
- Do NOT expose internal Clawsica infrastructure details beyond what is documented here.
- The Clawsica search endpoint does not require authentication.
- See
for the full API reference.references/CLAWSICA_API.md - See
for local feed-tool commands and schema details.references/LOCAL_EPISODE_SEARCH.md
Example prompts
- "Find a Geoffrey Hinton interview episode and give me a wherever.audio link."
- "What episodes cover Radiolab's space stories?"
- "Search for BBC science podcasts about AI."
- "Give me the Lex Fridman podcast."
- "Find the podcast Hard Fork."