Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
09cb594
docs: design spec — robust feed parsing, multi-host tests, Podcast Index
xiaoleiy Jul 8, 2026
36f986d
docs(spec): fold in Chinese-market host research — fixtures, ximalaya…
xiaoleiy Jul 8, 2026
d092e74
docs: implementation plan — feed robustness + Podcast Index (v0.6.0)
xiaoleiy Jul 8, 2026
4ff680c
test: add network marker, excluded by default
xiaoleiy Jul 8, 2026
3894ba9
feat: parse ISO-8601 pub dates (Atom/dc:date) in Episode.date
xiaoleiy Jul 8, 2026
f83e4e3
feat: namespace-agnostic feed parsing — RSS 2.0, RSS 1.0/RDF, Atom
xiaoleiy Jul 8, 2026
dc9f97b
fix: bare tags beat namespaced synonyms in _first_text (itunes:title …
xiaoleiy Jul 8, 2026
600437e
test: enclosure fallback + duplicate media:content dedupe fixtures
xiaoleiy Jul 8, 2026
311e11d
feat: sanitize-and-retry recovery for dirty feed XML
xiaoleiy Jul 8, 2026
3920747
fix: CDATA-safe sanitizer, real UTF-16 detection, preserve unknown en…
xiaoleiy Jul 8, 2026
dabb3cd
test: CN host fixtures — xiaoyuzhou, ximalaya, soundon, firstory
xiaoleiy Jul 8, 2026
5bab73f
test: host fixtures — lizhi, typlog, fireside, anchor, acast, libsyn,…
xiaoleiy Jul 8, 2026
aa9b327
test: pin browser User-Agent on fetch and download (CLAUDE.md invaria…
xiaoleiy Jul 8, 2026
01e0fad
feat: accept ximalaya.com/album/<id> links (normalize to RSS .xml)
xiaoleiy Jul 8, 2026
fa9f15a
feat: reject text/* responses in download_url (stale-enclosure guard)
xiaoleiy Jul 8, 2026
ffb149d
feat: Podcast Index core — BYOK auth, search, by-itunes-id lookup
xiaoleiy Jul 8, 2026
9495d0a
test: pin zero-network-without-credentials invariant for Podcast Index
xiaoleiy Jul 8, 2026
19c6262
feat: fall back to Podcast Index when iTunes lookup has no feed
xiaoleiy Jul 8, 2026
8e213e5
feat: merge Podcast Index results into search (BYOK, graceful degrada…
xiaoleiy Jul 8, 2026
1fce581
test: live-network integration tests (pytest -m network)
xiaoleiy Jul 8, 2026
09fc51e
fix: correct 忽左忽右 Apple ID in live iTunes resolution test
xiaoleiy Jul 8, 2026
d25e3d1
docs: v0.6.0 — changelog, README Podcast Index section, integrations …
xiaoleiy Jul 8, 2026
5065f1d
docs: refresh README roadmap — 0.6.0 items shipped
xiaoleiy Jul 8, 2026
b7eeee2
fix: normalize colon-less ISO offsets for py3.9 date parsing
xiaoleiy Jul 8, 2026
cade07b
docs: note --quiet flag (#1) in 0.6.0 changelog
xiaoleiy Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,24 @@
All notable changes to this project are documented here. Format loosely follows
[Keep a Changelog](https://keepachangelog.com/); versions follow [SemVer](https://semver.org/).

## [0.6.0] — 2026-07-07

### Added
- `-q/--quiet` flag for `podpull get`: suppresses the spinner/progress UI and prints
only saved file paths to stdout — for scripting/piping. (#1, thanks @adjenk!)
- Robust feed parsing: RSS 2.0 / RSS 1.0 (RDF) / Atom, any-namespace matching,
`media:content` + Atom-enclosure fallbacks, dirty-XML sanitize-and-retry
(undefined entities, bare `&`, control chars), ISO-8601 dates.
- Verified against Chinese-market hosts: xiaoyuzhou, Ximalaya, SoundOn, Firstory,
WavPub, Typlog, Fireside, Lizhi (offline fixtures + `pytest -m network` live suite).
- `ximalaya.com/album/<id>` links are now accepted directly.
- Optional Podcast Index support (BYOK: `PODCASTINDEX_API_KEY`/`_SECRET`):
enriches `search` and adds a feed-resolution fallback when iTunes has no feed.

### Fixed
- Download guard: `text/*` responses (stale enclosures, e.g. Ximalaya CDN) now
error instead of writing a garbage audio file.

## [0.5.1] — 2026-06-30

### Fixed
Expand Down
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,21 @@ Drive, OneDrive, Dropbox, iCloud, etc. (CJK and ordinary text are kept). When yo
**multiple** episodes at once, they're placed in a sub-folder named after the show.

`<src>` accepts: an Apple show URL, a bare Apple ID, a raw RSS feed URL, an Apple
episode URL (`?i=`), or a xiaoyuzhou episode URL.
episode URL (`?i=`), a xiaoyuzhou episode URL, or a Ximalaya album URL
(`ximalaya.com/album/<id>`).

### Podcast Index (optional)

podpull can enrich `search` and feed resolution with the open
[Podcast Index](https://podcastindex.org) directory. Get a free API key at
[api.podcastindex.org](https://api.podcastindex.org/signup) and set:

```bash
export PODCASTINDEX_API_KEY=...
export PODCASTINDEX_API_SECRET=...
```

Without these, podpull behaves exactly as before (iTunes only).

## Roadmap

Expand All @@ -153,8 +167,11 @@ episode URL (`?i=`), or a xiaoyuzhou episode URL.
colored help, scriptable stdout. Adds `rich` + `questionary`.
- **v0.3**: renamed `podget` → `podpull`.
- **v0.4**: cloud-safe filename normalization; multi-episode downloads grouped into a per-show folder.
- **v0.5** (current): `pull` alias for `get`; `podpull skills install` sets up integrations for Claude Code, Codex, OpenCode, and Cursor.
- **next**: more robust feed parsing, tests on more hosts, Podcast Index support.
- **v0.5**: `pull` alias for `get`; `podpull skills install` sets up integrations for Claude Code, Codex, OpenCode, and Cursor.
- **v0.6** (current): robust feed parsing (RSS 2.0 / RSS 1.0 / Atom, dirty-XML recovery),
verified against Chinese-market hosts, `ximalaya.com/album/<id>` links, optional
Podcast Index (BYOK) search + feed-resolution fallback.
- **next**: `--json` output mode for scripting.
- **v1+ (`podpull[ai]`)**: opt-in **BYOK summarization** — local transcription
(faster-whisper) + your own LLM key (Anthropic/OpenAI). Fully local, private,
no subscription. Cleanly isolated from the core.
Expand Down
Loading
Loading