PodFetch is a lightweight command-line podcast downloader written in Rust. It helps you discover podcasts, resolve their RSS feeds, download new episodes, and organize them for local playback or self-hosted media servers such as Jellyfin or Audiobookshelf.
- 🔎 Search for podcasts by name using PodcastAddict
- 🔁 Fall back to the Apple iTunes podcast search API when needed
- 📡 Accept either a podcast name or a direct RSS feed URL
- ⬇️ Download new episodes only, tracking already-downloaded episodes in an archive file
- 🏷️ Tag downloaded audio files with title, artist, album, and embedded cover art
- 🧾 Write metadata and cover images for media-library integration
- 📁 Support configurable destination paths with placeholders for podcast name and author
From the project directory:
cargo install --path .Or build a release binary manually:
cargo build --release
./target/release/podfetch --helpPodFetch now includes local release automation for several distribution formats:
- 🐧 Linux tarball: built as a portable archive for direct use on Linux systems
- 📦 AppImage: created with the AppImage build script for desktop-friendly Linux installs
- 🪟 Windows zip: cross-compiled for Windows using
x86_64-pc-windows-gnu - 🐧 Arch Linux AUR: packaging metadata is available in aur/PKGBUILD
# Build the Linux binary
cargo build --release
# Build an AppImage
./scripts/build-appimage.sh build
# Build Windows and Linux release assets, then publish a GitHub release
./scripts/release-github.sh- Windows cross-compilation requires
x86_64-w64-mingw32-gccand the Rust Windows target - AppImage packaging uses
linuxdeploy, which is downloaded automatically by the script - If an icon is present as icon.png, the release scripts will generate icon.ico for the Windows executable
A static landing page for GitHub Pages is available in docs/index.html. Publish the repository’s docs/ folder as the Pages source to make it live.
On first run, PodFetch will prompt you to choose a default download directory template.
# Search for a podcast by name and download its episodes
podfetch "Darknet Diaries"
# Download from a known RSS feed directly
podfetch https://example.com/podcast.xml
# Force the input to be treated as a search term
podfetch --search "The Joe Rogan Experience"
# Override the download folder and use a custom template
podfetch -o "~/Music/podcasts/{podcast_name}" "My Podcast"
# Download up to 10 episodes at the same time
podfetch -j 10 "My Podcast"podfetch [OPTIONS] [URL_OR_NAME]Options:
-s, --search: force the input to be treated as a search term-o, --output <PATH>: override the download path template-j, --jobs <N>: set the maximum number of concurrent downloads (default: 5)
- PodFetch loads or creates a configuration file on first launch.
- It accepts either:
- a direct RSS feed URL, or
- a podcast name, which is searched and resolved to an RSS feed
- It determines an output directory based on the configured template and the podcast metadata.
- It downloads only episodes that have not already been recorded in the archive file.
- Each downloaded file is tagged with metadata and cover art where possible.
PodFetch stores its configuration in:
- Linux:
~/.local/share/podfetch/config.toml
Example configuration:
[config]
download_dir = "~/Downloads/podfetch/{podcast_name}"{podcast_name}: sanitized podcast title{podcast_author}: sanitized author name
The tool also expands ~ to your home directory.
A typical download folder looks like this:
~/Downloads/podfetch/My Podcast/
├── 01 - Episode Title.mp3
├── 02 - Another Episode.m4a
├── cover.jpg
├── folder.jpg
├── metadata.nfo
└── downloaded_episodes.txt
cargo fmt
cargo build
cargo test- Podcast discovery depends on external services such as PodcastAddict and Apple iTunes search.
- Some podcasts may not expose easily resolvable RSS URLs or may require manual handling.
- Downloads are based on the RSS feed content and the episode metadata from that feed.
- The project is licensed under GPL-2.0.
This project is licensed under the GPL-2.0 License. See the LICENSE file for details.