Turns a ytdl-sub output directory into a valid, servable podcast RSS feed.
- Python 97.3%
- Just 2.7%
sub2pod
Licence: AGPL-3.0-or-later Python 3.12+ CI Codestyle: Ruff
Convert ytdl-sub output directories into
standards-compliant podcast RSS feeds. Point it at a directory full of downloaded
audio, and it writes feed.xml into each channel subdirectory — ready to serve or
submit to podcast directories.
What it does
- Reads Kodi
tvshow.nfoand per-episode.nfosidecars produced by ytdl-sub - Discovers date-prefixed audio files (
YYYY-MM-DD - <title>.<ext>) in each channel directory - Generates RSS 2.0 + iTunes namespace
feed.xmlper channel - Emits correct MIME types for
.opus,.mp3, and.m4aenclosures - Produces an
opml.xmlindex at the root level for one-click feed import - Falls back to filename parsing when
.nfosidecars are absent
What it does not do
- No download or subscription management (that's ytdl-sub's job)
- No web server — feed files are static XML; serve them however you like
- No podcast client or player
Installation
From PyPI
pip install sub2pod
From source
git clone https://codeberg.org/marvin8/sub2pod.git
cd sub2pod
uv sync
uv run sub2pod --help
Usage
sub2pod /path/to/ytdl-sub/output https://podcast.example.com
This walks the parent directory looking for subdirectories containing tvshow.nfo
and generates:
| Output | Location | Description |
|---|---|---|
feed.xml |
Each channel subdirectory | RSS 2.0 + iTunes podcast feed |
opml.xml |
Parent directory root | OPML index of all feeds |
Options
--dry-run Print paths without writing any files
--verbose Log per-episode details during generation
Example
# After ytdl-sub downloads new episodes:
sub2pod /home/NAS/ytdl-sub/mark/podcast https://podcasts.example.com
# Preview without writing:
sub2pod /home/NAS/ytdl-sub/mark/podcast https://podcasts.example.com --dry-run
# See what's being generated:
sub2pod /home/NAS/ytdl-sub/mark/podcast https://podcasts.example.com --verbose
How it works
- Channel discovery — Walks the parent directory for subdirectories containing
tvshow.nfo - Metadata parsing — Reads channel title and genre from
tvshow.nfo; reads per-episode title, description, date, runtime, and source URL from.nfosidecars - Episode discovery — Finds all date-prefixed audio files, pairs them with their
.nfosidecars, sorts newest-first - Feed generation — Builds RSS 2.0 XML with iTunes podcast namespace elements (
<itunes:image>,<itunes:duration>,<itunes:category>), writesfeed.xml - OPML index — Writes
opml.xmlat the root listing every channel feed
Input format
Each channel directory is expected to contain:
Links with Friends/
├── tvshow.nfo ← Channel metadata (title, genre)
├── poster.jpg ← Podcast artwork → <itunes:image>
├── 2026年05月19日 - Episode Title.opus ← Audio file
├── 2026年05月19日 - Episode Title.nfo ← Episode metadata sidecar
└── 2026年05月19日 - Episode Title-thumb.jpg ← Episode thumbnail
Documentation
- ytdl-sub Integration Guide — Configuring ytdl-sub to produce sub2pod-compatible output: NFO tags, episode thumbnails, trigger strategies, and Opus MIME type guidance.
Licence
Copyright (C) 2026 Marvin8
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.