AGENT SKILL

SAI-podcast-download

Atomic SAI skill. Download podcast episode audio from an RSS feed or a Spotify show URL (resolved to RSS via the iTunes Search API — Spotify itself blocks audio downloads). Resume-safe, retry-aware. Emits a manifest.json that downstream skills (local-transcribe, podcast-rag-index) consume. Use whenever you need to download a podcast, grab episodes of a show, pull audio for a Spotify show URL, or any workflow needs raw podcast MP3s as input.

License 许可
Apache-2.0
最近更新
2026-07-17
Stars
★ 30
Forks
14

01 前言 Front Matter

name
SAI-podcast-download
description
Atomic SAI skill. Download podcast episode audio from an RSS feed or a Spotify show URL (resolved to RSS via the iTunes Search API — Spotify itself blocks audio downloads). Resume-safe, retry-aware. Emits a manifest.json that downstream skills (local-transcribe, podcast-rag-index) consume. Use whenever you need to download a podcast, grab episodes of a show, pull audio for a Spotify show URL, or any workflow needs raw podcast MP3s as input.

02 资源文件 7

03 SKILL.md 正文

Trigger manifest — podcast-download (atomic, autonomous)

Code: skills/podcast-download/ Manifest: skill.yaml (4-tier cascade) Entry point: runner.py → run(inputs)

Cascade plan

1. resolve_feed       (rules) → Spotify URL → RSS via iTunes Search API
2. list_episodes      (rules) → parse RSS, filter by since_date / max_episodes
3. download_each      (rules) → fetch missing audio (retries, resume-safe)
4. write_manifest     (rules) → emit manifest.json; ready_to_propose

All tiers are deterministic Python. No LLM calls. No external auth required.

Invocation

.venv/bin/python3.12 \
  skills/podcast-download/runner.py run \
  --inputs-json '{
    "spotify_show_url": "https://open.spotify.com/show/<spotify-show-id>",
    "output_dir":       "~/Media/podcasts/<show-slug>",
    "since_date":       "2020-01-01",
    "max_episodes":     0
  }'

Either spotify_show_url or feed_url is required. max_episodes: 0 means all. Invoke runners by absolute path (folder names use hyphens, so python -m won't import).

Standard manifest shape

{
  "workflow_id": "podcast-download",
  "feed_url":    "https://.../feed.xml",
  "episodes": [
    {
      "episode_id":  "<sha1-hex>",
      "title":       "...",
      "pub_date":    "YYYY-MM-DD",
      "audio_path":  "/abs/path/to/file.mp3",
      "audio_url":   "https://...",
      "show_title":  "..."
    }
  ],
  "download_results": {"downloaded": [...], "skipped": [...], "failed": [...]}
}

Composes with

  • SAI-local-transcribe — feeds manifest.episodes[].audio_path into Whisper
  • SAI-podcast-rag-index — writes transcripts into the ChromaDB index

04 同仓库更多 Skills

lutzfinger
lutzfinger/SAI-baseversion

sample-glob

暂无简介

★ 30
lutzfinger
lutzfinger/SAI-baseversion

sample-alpha

Synthetic skill for sai-overlay deploy tests. Not a real skill.

★ 30
lutzfinger
lutzfinger/SAI-baseversion

sample-incoming

Fixture for PR 7 (scaffold-claude-code-skill). Simulates a Claude-Code skill discovered in the plugin-install path with no skill.yaml manifest. The scaffold subcommand reads this dir and emits a starter skill.yaml v2 with a single claude_code profile.

★ 30
lutzfinger
lutzfinger/SAI-baseversion

SAI-podcast-rag-index

Atomic SAI skill. Index a directory of transcript .md files (YAML frontmatter, one per episode) into an existing ChromaDB RAG store by delegating to a rag-index-updater-style index.py. Pure mechanism — no operator paths or collection baked in; the caller supplies indexer_scripts / manifest_path directly or via a private config_path. Hash-skips unchanged files. Use whenever you need to index transcripts, add transcripts to a RAG, or embed episodes for semantic lookup.

★ 30
lutzfinger
lutzfinger/SAI-baseversion

SAI-local-transcribe

Atomic SAI skill. Fully-local audio transcription via Whisper (mlx-whisper on Apple Silicon, faster-whisper fallback elsewhere). No audio leaves the machine; no API keys. Accepts a single audio file, a directory, or a podcast-download manifest.json. Writes one .md per input with YAML frontmatter compatible with a rag-index-updater pipeline. Use whenever you need to transcribe audio, run whisper on a file, transcribe all episodes in a folder, or any workflow needs text from audio.

Skill与智能体开发
★ 30