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
- 其他canaries.jsonl344 B
- 其他edge_cases.jsonl782 B
- 其他profiles/claude_code/canaries.jsonl661 B
- 参考文档README.md1.9 KB
- 脚本runner.py10.2 KB
- 参考文档skill.yaml2.4 KB
- 其他workflow_regression.jsonl673 B
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— feedsmanifest.episodes[].audio_pathinto WhisperSAI-podcast-rag-index— writes transcripts into the ChromaDB index
04 同仓库更多 Skills
sample-glob
暂无简介
sample-alpha
Synthetic skill for sai-overlay deploy tests. Not a real skill.
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.
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.
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.