{
  "schemaVersion": "1.0",
  "item": {
    "slug": "podcast-discovery",
    "name": "Podcast Discovery",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/aegrumet/podcast-discovery",
    "canonicalUrl": "https://clawhub.ai/aegrumet/podcast-discovery",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/podcast-discovery",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=podcast-discovery",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/requirements.txt",
      "scripts/search_feed_episodes.py",
      "tests/test_search_feed_episodes.py",
      "tests/fixtures/sample_feed.xml",
      "references/CLAWSICA_API.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/podcast-discovery"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/podcast-discovery",
    "agentPageUrl": "https://openagent3.xyz/skills/podcast-discovery/agent",
    "manifestUrl": "https://openagent3.xyz/skills/podcast-discovery/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/podcast-discovery/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "podcast-discovery",
        "body": "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.\n\nDo NOT use this skill for non-podcast queries (general web search, music, etc.)."
      },
      {
        "title": "Trigger phrases",
        "body": "Use this skill immediately when the user message includes podcast lookup language such as:\n\n\"find podcast\", \"find the podcast\", \"look up podcast\", \"search podcasts\"\n\"find episode\", \"podcast episode about\", \"interview episode\", \"latest episodes\"\n\"give me a wherever link\", \"wherever link\", \"wherever.audio link\", \"listen link\", \"show link\"\nnamed show/host requests like \"Radiolab\", \"Lex Fridman\", \"Hard Fork\", or \"Joe Rogan\"\n\nWhen triggered, prioritize link construction over metadata reporting."
      },
      {
        "title": "Primary Objective (Highest Priority)",
        "body": "Your job is to produce a working Wherever link (/show or /listen) as soon as enough information is available.\n\nSuccess condition:\n\nResolve a valid RSS URL from Clawsica.\nIf contentScope = podcast-show, immediately return a show link.\nIf contentScope = podcast-episode and a matching item is found, immediately return an episode link.\n\nDo not stop at metadata, search summaries, or candidate lists if a valid link can be constructed."
      },
      {
        "title": "Link Templates",
        "body": "Episode (contentScope = podcast-episode):\nhttps://wherever.audio/listen?rssUrl={rss_url}&itemGuid={guid}&fallbackLink={fallback}\n\nShow (contentScope = podcast-show):\nhttps://wherever.audio/show?rssUrl={rss_url}\n\nAll {placeholder} values must be URL-encoded."
      },
      {
        "title": "Action Policy: Link-First, Ask-Last",
        "body": "Default behavior is to execute and return a link in the same response.\n\nOnly ask a follow-up question when one of these is true:\n\nYou cannot determine whether the user wants a show vs episode.\nClawsica returns no plausible show/RSS result after retries.\nMultiple episode candidates are similarly strong and no clear best match exists.\n\nIf none of the above apply, do not ask for confirmation. Return the link."
      },
      {
        "title": "Token Budget Policy",
        "body": "Run local tooling first and send only compact result fields to the model.\nNever send raw RSS XML, full feed dumps, or large metadata blobs to the model.\nFor episode matching, pass only top-ranked candidate rows needed for decision-making and link construction."
      },
      {
        "title": "Step 1 — Classify the query",
        "body": "Before searching, classify the user's query along two dimensions:\n\nintentType — what kind of request?\n\nspecific-podcaster — user names a host or show (e.g. \"Lex Fridman\", \"Radiolab\")\nspecific-topic — user describes a topic or guest (e.g. \"Geoffrey Hinton interview about AI\")\ndiscovery — broad exploration (e.g. \"best science podcasts\", \"podcasts about space\")\n\ncontentScope — what are they looking for?\n\npodcast-show — a show/feed (e.g. \"find the Radiolab podcast\")\npodcast-episode — a specific episode (e.g. \"the Radiolab episode about colors\")"
      },
      {
        "title": "Step 2 — Resolve the show",
        "body": "If intentType is specific-podcaster (show name is known):\nGo directly to Clawsica (step 3). The query likely contains the show title.\n\nIf intentType is specific-topic or discovery (show name is unknown):\nSearch the web first to discover likely podcast titles, then proceed to Clawsica with those titles."
      },
      {
        "title": "Step 3 — Clawsica show search",
        "body": "Search for podcast shows using the public Clawsica endpoint. This returns show metadata including RSS feed URLs.\n\ncurl -s \"https://clawsica.wherever.audio/p?q=radiolab\"\n\nReturns a JSON array of show objects. Each object includes a url field containing the RSS feed URL.\n\nImportant: 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.\n\nIf Clawsica returns no results, try alternate spellings or broader terms. See references/CLAWSICA_API.md for the full API reference."
      },
      {
        "title": "Step 4 — Branch by contentScope",
        "body": "If contentScope is podcast-show:\nConstruct a show link using the RSS URL from step 3 and present it immediately. Do not ask for additional confirmation. Done.\n\nExample: https://wherever.audio/show?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab\n\nIf contentScope is podcast-episode:\nContinue to step 5."
      },
      {
        "title": "Step 5 — Run local feed tooling (required for episode lookup)",
        "body": "For episode lookup, use local tooling instead of manual XML parsing:\n\npython scripts/search_feed_episodes.py --mode search --rss-url \"https://feeds.feedburner.com/radiolab\" --query \"space stories\" --limit 5\n\nOptional semantic rerank:\n\npython scripts/search_feed_episodes.py --mode search --rss-url \"https://feeds.feedburner.com/radiolab\" --query \"space stories\" --limit 5 --semantic\n\nCompact search output contract:\n\ntop-level keys: mode, rssUrl, query, semanticUsed, candidateCount, candidates\ncandidate keys: guid, title, pubDate, fallbackLink, score\n\nUse these candidate rows to select the best episode. Do not return feed-level metadata unless explicitly requested.\n\nSelection policy:\n\nAuto-pick when the top score is clearly stronger than the second candidate.\nIf top candidates are near-tied, ask one disambiguation question."
      },
      {
        "title": "Step 6 — Construct the episode link",
        "body": "Build a wherever.audio episode link using values from the selected search candidate:\n\nrss_url — the feed URL from step 3\nguid — candidate guid\nfallback — candidate fallbackLink\n\nExample:\n\nhttps://wherever.audio/listen?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab&itemGuid=some-guid-value&fallbackLink=https%3A%2F%2Fradiolab.org%2Fepisode\n\nPresent the link to the user along with the episode title and publish date."
      },
      {
        "title": "Optional utilities — newest and overview",
        "body": "If the user asks for latest episodes from a known feed:\n\npython scripts/search_feed_episodes.py --mode newest --rss-url \"https://feeds.feedburner.com/radiolab\" --limit 10\n\nCompact newest output contract:\n\ntop-level keys: mode, rssUrl, count, items\nitem keys: guid, title, pubDate, fallbackLink\n\nIf the user asks for feed-level metadata:\n\npython scripts/search_feed_episodes.py --mode overview --rss-url \"https://feeds.feedburner.com/radiolab\"\n\nCompact overview output contract:\n\nmode, rssUrl, feedTitle, feedDescriptionShort, author, language, lastBuildDate, itemCount\n\nUse these utility modes to answer the request directly while keeping payloads compact.\n\nRun the local feed tool (for developers/testing)\n\nPath: scripts/search_feed_episodes.py (relative to the skill directory)\nRequirements: scripts/requirements.txt (feedparser, rapidfuzz, pytest)\nQuick start (recommended, cross-platform):\n\nCreate and activate a virtual environment in the skill folder:\npython3 -m venv .venv\nsource .venv/bin/activate   # macOS / Linux.venv\\Scripts\\activate      # Windows (PowerShell)\nInstall dependencies:\npip install -r scripts/requirements.txt\nRun the tool (examples):\npython scripts/search_feed_episodes.py --mode overview --rss-url \"<RSS_URL>\"\npython scripts/search_feed_episodes.py --mode newest --rss-url \"<RSS_URL>\" --limit 10\npython scripts/search_feed_episodes.py --mode search --rss-url \"<RSS_URL>\" --query \"attack on Iran\" --limit 5 --semantic\nNotes:\nThe tool prints compact JSON matching the skill's expected contracts.\nMake the script executable (chmod +x scripts/search_feed_episodes.py) for direct execution.\nUse the venv if system pip is restricted."
      },
      {
        "title": "Response Format",
        "body": "When a link is available, respond in this order:\n\nThe Wherever URL (first line).\nOne short line identifying the resolved show/episode.\nOptional one-line note only if there was ambiguity.\n\nKeep responses concise. Do not include raw metadata dumps unless explicitly requested."
      },
      {
        "title": "Prohibited Behavior",
        "body": "Do not return only webpage metadata when a Wherever link can be built.\nDo not ask \"Should I proceed?\" if required link parameters are already known.\nDo not present candidate options unless disambiguation is truly required."
      },
      {
        "title": "Privacy",
        "body": "Do NOT expose internal Clawsica infrastructure details beyond what is documented here.\nThe Clawsica search endpoint does not require authentication.\nSee references/CLAWSICA_API.md for the full API reference.\nSee references/LOCAL_EPISODE_SEARCH.md for local feed-tool commands and schema details."
      },
      {
        "title": "Example prompts",
        "body": "\"Find a Geoffrey Hinton interview episode and give me a wherever.audio link.\"\n\"What episodes cover Radiolab's space stories?\"\n\"Search for BBC science podcasts about AI.\"\n\"Give me the Lex Fridman podcast.\"\n\"Find the podcast Hard Fork.\""
      }
    ],
    "body": "podcast-discovery\n\nPodcast discovery skill for Wherever.Audio. Given a natural-language query, find the right podcast show or episode and return a playable wherever.audio link.\n\nDo NOT use this skill for non-podcast queries (general web search, music, etc.).\n\nTrigger phrases\n\nUse this skill immediately when the user message includes podcast lookup language such as:\n\n\"find podcast\", \"find the podcast\", \"look up podcast\", \"search podcasts\"\n\"find episode\", \"podcast episode about\", \"interview episode\", \"latest episodes\"\n\"give me a wherever link\", \"wherever link\", \"wherever.audio link\", \"listen link\", \"show link\"\nnamed show/host requests like \"Radiolab\", \"Lex Fridman\", \"Hard Fork\", or \"Joe Rogan\"\n\nWhen triggered, prioritize link construction over metadata reporting.\n\nPrimary Objective (Highest Priority)\n\nYour job is to produce a working Wherever link (/show or /listen) as soon as enough information is available.\n\nSuccess condition:\n\nResolve a valid RSS URL from Clawsica.\nIf contentScope = podcast-show, immediately return a show link.\nIf contentScope = podcast-episode and a matching item is found, immediately return an episode link.\n\nDo not stop at metadata, search summaries, or candidate lists if a valid link can be constructed.\n\nLink Templates\n\nEpisode (contentScope = podcast-episode): https://wherever.audio/listen?rssUrl={rss_url}&itemGuid={guid}&fallbackLink={fallback}\n\nShow (contentScope = podcast-show): https://wherever.audio/show?rssUrl={rss_url}\n\nAll {placeholder} values must be URL-encoded.\n\nAction Policy: Link-First, Ask-Last\n\nDefault behavior is to execute and return a link in the same response.\n\nOnly ask a follow-up question when one of these is true:\n\nYou cannot determine whether the user wants a show vs episode.\nClawsica returns no plausible show/RSS result after retries.\nMultiple episode candidates are similarly strong and no clear best match exists.\n\nIf none of the above apply, do not ask for confirmation. Return the link.\n\nToken Budget Policy\nRun local tooling first and send only compact result fields to the model.\nNever send raw RSS XML, full feed dumps, or large metadata blobs to the model.\nFor episode matching, pass only top-ranked candidate rows needed for decision-making and link construction.\nWorkflow\nStep 1 — Classify the query\n\nBefore searching, classify the user's query along two dimensions:\n\nintentType — what kind of request?\n\nspecific-podcaster — user names a host or show (e.g. \"Lex Fridman\", \"Radiolab\")\nspecific-topic — user describes a topic or guest (e.g. \"Geoffrey Hinton interview about AI\")\ndiscovery — broad exploration (e.g. \"best science podcasts\", \"podcasts about space\")\n\ncontentScope — what are they looking for?\n\npodcast-show — a show/feed (e.g. \"find the Radiolab podcast\")\npodcast-episode — a specific episode (e.g. \"the Radiolab episode about colors\")\nStep 2 — Resolve the show\n\nIf intentType is specific-podcaster (show name is known): Go directly to Clawsica (step 3). The query likely contains the show title.\n\nIf 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.\n\nStep 3 — Clawsica show search\n\nSearch for podcast shows using the public Clawsica endpoint. This returns show metadata including RSS feed URLs.\n\ncurl -s \"https://clawsica.wherever.audio/p?q=radiolab\"\n\n\nReturns a JSON array of show objects. Each object includes a url field containing the RSS feed URL.\n\nImportant: 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.\n\nIf Clawsica returns no results, try alternate spellings or broader terms. See references/CLAWSICA_API.md for the full API reference.\n\nStep 4 — Branch by contentScope\n\nIf 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.\n\nExample: https://wherever.audio/show?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab\n\nIf contentScope is podcast-episode: Continue to step 5.\n\nStep 5 — Run local feed tooling (required for episode lookup)\n\nFor episode lookup, use local tooling instead of manual XML parsing:\n\npython scripts/search_feed_episodes.py --mode search --rss-url \"https://feeds.feedburner.com/radiolab\" --query \"space stories\" --limit 5\n\n\nOptional semantic rerank:\n\npython scripts/search_feed_episodes.py --mode search --rss-url \"https://feeds.feedburner.com/radiolab\" --query \"space stories\" --limit 5 --semantic\n\n\nCompact search output contract:\n\ntop-level keys: mode, rssUrl, query, semanticUsed, candidateCount, candidates\ncandidate keys: guid, title, pubDate, fallbackLink, score\n\nUse these candidate rows to select the best episode. Do not return feed-level metadata unless explicitly requested.\n\nSelection policy:\n\nAuto-pick when the top score is clearly stronger than the second candidate.\nIf top candidates are near-tied, ask one disambiguation question.\nStep 6 — Construct the episode link\n\nBuild a wherever.audio episode link using values from the selected search candidate:\n\nrss_url — the feed URL from step 3\nguid — candidate guid\nfallback — candidate fallbackLink\n\nExample:\n\nhttps://wherever.audio/listen?rssUrl=https%3A%2F%2Ffeeds.feedburner.com%2Fradiolab&itemGuid=some-guid-value&fallbackLink=https%3A%2F%2Fradiolab.org%2Fepisode\n\n\nPresent the link to the user along with the episode title and publish date.\n\nOptional utilities — newest and overview\n\nIf the user asks for latest episodes from a known feed:\n\npython scripts/search_feed_episodes.py --mode newest --rss-url \"https://feeds.feedburner.com/radiolab\" --limit 10\n\n\nCompact newest output contract:\n\ntop-level keys: mode, rssUrl, count, items\nitem keys: guid, title, pubDate, fallbackLink\n\nIf the user asks for feed-level metadata:\n\npython scripts/search_feed_episodes.py --mode overview --rss-url \"https://feeds.feedburner.com/radiolab\"\n\n\nCompact overview output contract:\n\nmode, rssUrl, feedTitle, feedDescriptionShort, author, language, lastBuildDate, itemCount\n\nUse these utility modes to answer the request directly while keeping payloads compact.\n\nRun the local feed tool (for developers/testing)\n\nPath: scripts/search_feed_episodes.py (relative to the skill directory) Requirements: scripts/requirements.txt (feedparser, rapidfuzz, pytest) Quick start (recommended, cross-platform):\n\nCreate and activate a virtual environment in the skill folder: python3 -m venv .venv source .venv/bin/activate # macOS / Linux.venv\\Scripts\\activate # Windows (PowerShell)\nInstall dependencies: pip install -r scripts/requirements.txt\nRun 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.\nResponse Format\n\nWhen a link is available, respond in this order:\n\nThe Wherever URL (first line).\nOne short line identifying the resolved show/episode.\nOptional one-line note only if there was ambiguity.\n\nKeep responses concise. Do not include raw metadata dumps unless explicitly requested.\n\nProhibited Behavior\nDo not return only webpage metadata when a Wherever link can be built.\nDo not ask \"Should I proceed?\" if required link parameters are already known.\nDo not present candidate options unless disambiguation is truly required.\nPrivacy\nDo NOT expose internal Clawsica infrastructure details beyond what is documented here.\nThe Clawsica search endpoint does not require authentication.\nSee references/CLAWSICA_API.md for the full API reference.\nSee references/LOCAL_EPISODE_SEARCH.md for local feed-tool commands and schema details.\nExample prompts\n\"Find a Geoffrey Hinton interview episode and give me a wherever.audio link.\"\n\"What episodes cover Radiolab's space stories?\"\n\"Search for BBC science podcasts about AI.\"\n\"Give me the Lex Fridman podcast.\"\n\"Find the podcast Hard Fork.\""
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/aegrumet/podcast-discovery",
    "publisherUrl": "https://clawhub.ai/aegrumet/podcast-discovery",
    "owner": "aegrumet",
    "version": "0.0.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/podcast-discovery",
    "downloadUrl": "https://openagent3.xyz/downloads/podcast-discovery",
    "agentUrl": "https://openagent3.xyz/skills/podcast-discovery/agent",
    "manifestUrl": "https://openagent3.xyz/skills/podcast-discovery/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/podcast-discovery/agent.md"
  }
}