Podcast Discovery
by @aegrumet
Podcast discovery for Wherever.Audio -- find shows and episodes, generate wherever.audio links.
clawhub install podcast-discoveryπ About This Skill
name: podcast-discovery description: "Podcast discovery for Wherever.Audio -- find shows and episodes, generate wherever.audio links." user-invocable: true metadata: openclaw: emoji: "π§"
podcast-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:
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:
1. Resolve a valid RSS URL from Clawsica.
2. If contentScope = podcast-show, immediately return a show link.
3. If contentScope = podcast-episode and a matching item is found, immediately return an episode link.
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:
If none of the above apply, do not ask for confirmation. Return the link.
Token Budget Policy
Workflow
Step 1 β Classify the query
Before searching, classify the user's query along two dimensions:
intentType β what kind of request?
specific-podcaster β user names a host or show (e.g. "Lex Fridman", "Radiolab")specific-topic β user describes a topic or guest (e.g. "Geoffrey Hinton interview about AI")discovery β broad exploration (e.g. "best science podcasts", "podcasts about space")contentScope β what are they looking for?
podcast-show β a show/feed (e.g. "find the Radiolab podcast")podcast-episode β a specific episode (e.g. "the Radiolab episode about colors")Step 2 β Resolve the show
If intentType is specific-podcaster (show name is known):
Go directly to Clawsica (step 3). The query likely contains the show title.
If intentType is specific-topic or discovery (show name is unknown):
Search the web first to discover likely podcast titles, then proceed to Clawsica with those titles.
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 podcast-show:
Construct a show link using the RSS URL from step 3 and present it immediately. Do not ask for additional confirmation. Done.
Example: https://wherever.audio/show?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab
If contentScope is podcast-episode:
Continue to step 5.
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:
mode, rssUrl, query, semanticUsed, candidateCount, candidatesguid, title, pubDate, fallbackLink, scoreUse these candidate rows to select the best episode. Do not return feed-level metadata unless explicitly requested.
Selection policy:
score is clearly stronger than the second candidate.Step 6 β Construct the episode link
Build a wherever.audio episode link using values from the selected search candidate:
rss_url β the feed URL from step 3guid β candidate guidfallback β candidate fallbackLinkExample:
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:
mode, rssUrl, count, itemsguid, title, pubDate, fallbackLinkIf 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, lastBuildDate, itemCountUse 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):
1) 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)
2) Install dependencies:
pip install -r scripts/requirements.txt
3) Run the tool (examples):
python scripts/search_feed_episodes.py --mode overview --rss-url "
Response Format
When a link is available, respond in this order: 1. The Wherever URL (first line). 2. One short line identifying the resolved show/episode. 3. Optional one-line note only if there was ambiguity.
Keep responses concise. Do not include raw metadata dumps unless explicitly requested.
Prohibited Behavior
Privacy
references/CLAWSICA_API.md for the full API reference.references/LOCAL_EPISODE_SEARCH.md for local feed-tool commands and schema details.