sub2pod
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://forge.marvin8.zone/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.
Release files for sub2pod 0.3.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sub2pod-0.3.3.tar.gz | 8.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sub2pod-0.3.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.7 kB
Release files / sub2pod-0.3.3.tar.gz
| Download URL | sub2pod-0.3.3.tar.gz |
|---|---|
| Size | 8.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d1a33b8e27dd7a5e5d942a68c05bdfb27558d22d6ae755503ee33ccf1c0b4792
|
|
BLAKE2b-256 checksum How to use checksums |
5ab688808799e0f31050ff24b9a225eb7679b67d12e0aa57828acf4ed4cc6886
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.2 {"installer":{"name":"uv","version":"0.12.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sub2pod-0.3.3-py3-none-any.whl
| Download URL | sub2pod-0.3.3-py3-none-any.whl |
|---|---|
| Size | 11.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
300bf7eee088414311f0910ff7ec54eee0074aa32efdf1b08378b264f6068ba0
|
|
BLAKE2b-256 checksum How to use checksums |
ba5a195a00e8418ce00cdf1d2a2309b21852305978f8e9ec2e0c6784ae31e7d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.2 {"installer":{"name":"uv","version":"0.12.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|