一个强大的跨平台命令行播客下载工具,支持多个播客平台和 RSS 源
Project description
____ _ ____
/ ___|__ _ ___| |_ ___ | _ \ _____ ___ __
| | / _` / __| __/ __| | | | |/ _ \ \ /\ / / '_ \
| |__| (_| \__ \ |_\__ \ | |_| | (_) \ V V /| | | |
\____\__,_|___/\__|___/ |____/ \___/ \_/\_/ |_| |_|
Intelligent Podcast Downloader
一个强大的跨平台命令行播客下载工具,支持多个播客平台和 RSS 源。
IMPORTANT DISCLAIMER
+========================================================================+
| [!] IMPORTANT NOTICE |
+========================================================================+
| |
| This tool is provided for EDUCATIONAL and PERSONAL USE ONLY. |
| |
| By using this software, you explicitly agree to: |
| |
| 1. PERSONAL USE ONLY |
| - Use for personal learning, research, and hobby purposes |
| - NOT for commercial distribution or public sharing |
| - NOT for any profit-making activities |
| |
| 2. RESPECT COPYRIGHT LAWS |
| - All downloaded content remains property of original creators |
| - Respect intellectual property rights and copyright laws |
| - Support content creators through official channels |
| |
| 3. RESPECT BUSINESS ECOSYSTEMS |
| - Do not use this tool to circumvent paid subscriptions |
| - Support creators via official platforms and subscriptions |
| - Respect the business model of podcast platforms |
| |
| 4. LEGAL COMPLIANCE |
| - Comply with all applicable laws in your jurisdiction |
| - Comply with Terms of Service of podcast platforms |
| - Users are solely responsible for their usage |
| |
| PROHIBITED USES: |
| X Commercial redistribution of downloaded content |
| X Mass downloading for public sharing or distribution |
| X Bypassing paid subscription services |
| X Any activity that harms content creators or platforms |
| |
| The developers assume NO LIABILITY for misuse of this software. |
| |
+========================================================================+
+========================================================================+
| [!] 重要声明 |
+========================================================================+
| |
| 本工具仅供学习、研究和个人爱好使用。 |
| |
| 使用本软件即表示您明确同意: |
| |
| 1. 仅限个人使用 |
| - 用于个人学习、研究和爱好目的 |
| - 禁止用于商业分发或公开传播 |
| - 禁止用于任何盈利活动 |
| |
| 2. 尊重版权法规 |
| - 所有下载内容归原创作者所有 |
| - 尊重知识产权和版权法律 |
| - 通过官方渠道支持内容创作者 |
| |
| 3. 尊重商业生态 |
| - 不得使用本工具绕过付费订阅服务 |
| - 通过官方平台和订阅支持创作者 |
| - 尊重播客平台的商业模式 |
| |
| 4. 遵守法律法规 |
| - 遵守您所在地区的所有适用法律 |
| - 遵守播客平台的服务条款 |
| - 用户对其使用行为承担全部责任 |
| |
| 禁止用途: |
| X 商业性再分发下载的内容 |
| X 大规模下载用于公开分享或传播 |
| X 绕过付费订阅服务 |
| X 任何损害内容创作者或平台利益的行为 |
| |
| 开发者对本软件的滥用不承担任何责任。 |
| |
+========================================================================+
Features
- Smart Detection: Automatically identifies URL type, no need to specify downloader
- Multi-Platform Support:
- Apple Podcasts (single episodes and podcast pages)
- Xiaoyuzhou
- Standard RSS 2.0 feeds
- Async Concurrent Downloads: Configurable concurrency for faster downloads
- Progress Display: Real-time download progress tracking
- Episode Selection: Download specific episodes from Apple Podcasts links
- Smart File Management: Auto-naming, skip existing files
Installation
Option 1: Install via pip (Recommended)
pip install casts_down
Option 2: Install from source
git clone https://github.com/clemente0731/casts_down.git
cd casts_down
pip install -r requirements.txt
python casts_down.py <URL>
Usage
Unified Entry Point (Auto-detection)
# Smart detection - no need to specify platform
casts-down "<any-podcast-URL>"
# Apple Podcasts - Download single episode
casts-down "https://podcasts.apple.com/podcast/id123?i=456"
# Apple Podcasts - Download latest 3 episodes
casts-down "https://podcasts.apple.com/podcast/id123" --latest 3
# Xiaoyuzhou - Download single episode
casts-down "https://www.xiaoyuzhoufm.com/episode/xxx"
# Xiaoyuzhou - Download podcast
casts-down "https://www.xiaoyuzhoufm.com/podcast/xxx" --latest 5
# RSS Feed - Download all
casts-down "https://feeds.example.com/podcast.rss" --all
Advanced Options
# Specify output directory
casts-down "<URL>" -o ./my_podcasts
# Set concurrent downloads
casts-down "<URL>" --concurrent 5
# Skip existing files
casts-down "<URL>" --all --skip-existing
Command Line Arguments
+------------------+--------+---------------------------+------------------+
| Argument | Short | Description | Default |
+------------------+--------+---------------------------+------------------+
| --all | -a | Download all episodes | False (latest) |
| --latest N | -l N | Download latest N eps | 1 |
| --output DIR | -o DIR | Output directory | ./podcasts |
| --concurrent N | -c N | Concurrent downloads | 3 |
| --skip-existing | -s | Skip existing files | False |
+------------------+--------+---------------------------+------------------+
Platform Support
Fully Supported
Apple Podcasts
- Podcast homepage (download all or latest N episodes)
- Single episode links (smart matching and download)
- Automatic RSS extraction
Xiaoyuzhou
- Single episode links
- Podcast links (first 15 episodes)
- [!] Full podcast list requires additional reverse engineering
RSS Feeds
- Standard RSS 2.0 podcast feeds (most recommended)
Not Supported
Pocket Casts
- Client application, does not host audio files
- Recommendation: Download from original podcast RSS feed
Technical Stack
+------------------+--------------------------------+
| Component | Technology |
+------------------+--------------------------------+
| Language | Python 3.8+ |
| RSS Parsing | feedparser |
| HTTP Client | aiohttp (async downloads) |
| CLI Framework | click |
| Progress Display | tqdm |
| HTML Parsing | BeautifulSoup4 |
+------------------+--------------------------------+
Examples
Download NPR's "Up First" podcast
casts-down "https://feeds.npr.org/510318/podcast.xml" --latest 3
Download from Apple Podcasts
casts-down "https://podcasts.apple.com/us/podcast/the-daily/id1200361736" --all
Batch download with skip existing
casts-down "https://feeds.example.com/podcast.rss" --all -o ./downloads --skip-existing
Notes
[!] WARNING
+------------------------------------------------------------------+
| 1. RSS Feed Expiration: Some feeds may require auth or expired |
| 2. Audio URL Validity: Some URLs may contain time-limited tokens |
| 3. Rate Limiting: Frequent requests may trigger restrictions |
| 4. Copyright: Ensure downloads are for personal use only |
+------------------------------------------------------------------+
Troubleshooting
Issue: Cannot extract Apple Podcasts RSS
Solution:
- Ensure URL format is correct (contains podcast ID)
- Check network connection
- Use browser developer tools to manually find RSS URL
Issue: Download timeout
Solution:
- Reduce concurrency:
--concurrent 1 - Check network connection
- Some servers may have rate limiting
Issue: Abnormal file names
Solution:
- Tool automatically cleans illegal characters
- If issues persist, please submit an Issue
License
+------------------------------------------------------------------+
| MIT License |
| |
| Copyright (c) 2024 Casts Down Contributors |
+------------------------------------------------------------------+
Contributing
Contributions are welcome! Please submit Issues and Pull Requests.
Quick Test
# Test RSS parsing (no actual download)
casts-down "https://feeds.npr.org/510318/podcast.xml" --latest 1
# Test Apple Podcasts
casts-down "https://podcasts.apple.com/us/podcast/the-daily/id1200361736" --latest 1
Made with <3 by open source contributors
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file casts_down-1.0.2.tar.gz.
File metadata
- Download URL: casts_down-1.0.2.tar.gz
- Upload date:
- Size: 14.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
228561815853cb3db8f4d4d07c7009a24bed2f55859e70582d1fc11ba2072261
|
|
| MD5 |
14f12f4115cb2c9cc03eb90378df94a4
|
|
| BLAKE2b-256 |
60401d5a2286d383d73f8dc1e91010bd95dee38abd6a2469ef488bc3af541b18
|
Provenance
The following attestation bundles were made for casts_down-1.0.2.tar.gz:
Publisher:
build.yml on clemente0731/casts_down
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
casts_down-1.0.2.tar.gz -
Subject digest:
228561815853cb3db8f4d4d07c7009a24bed2f55859e70582d1fc11ba2072261 - Sigstore transparency entry: 926866762
- Sigstore integration time:
-
Permalink:
clemente0731/casts_down@4be4b4a069d82f7d6f2ef08e0eb953a579a18603 -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/clemente0731
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@4be4b4a069d82f7d6f2ef08e0eb953a579a18603 -
Trigger Event:
push
-
Statement type:
File details
Details for the file casts_down-1.0.2-py3-none-any.whl.
File metadata
- Download URL: casts_down-1.0.2-py3-none-any.whl
- Upload date:
- Size: 16.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7904bce5b9d52b9dbb36de73cb0da19bdd4f3473a29661db1729dead39e9bff4
|
|
| MD5 |
928b8d301632dc868852a06f2d6cbcf2
|
|
| BLAKE2b-256 |
56a4e9542b586e04fad8914f47b4826397d953a7fcc1526d7b0ef6598e0dc4d4
|
Provenance
The following attestation bundles were made for casts_down-1.0.2-py3-none-any.whl:
Publisher:
build.yml on clemente0731/casts_down
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
casts_down-1.0.2-py3-none-any.whl -
Subject digest:
7904bce5b9d52b9dbb36de73cb0da19bdd4f3473a29661db1729dead39e9bff4 - Sigstore transparency entry: 926866764
- Sigstore integration time:
-
Permalink:
clemente0731/casts_down@4be4b4a069d82f7d6f2ef08e0eb953a579a18603 -
Branch / Tag:
refs/tags/v1.0.2 - Owner: https://github.com/clemente0731
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@4be4b4a069d82f7d6f2ef08e0eb953a579a18603 -
Trigger Event:
push
-
Statement type: