Python project to create a podcast feed from videos in a youtube playlist.
This repository has been archived on 2026-08-02. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Python 94.9%
  • Dockerfile 2.8%
  • Shell 1.2%
  • Just 1.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-06-18 16:34:35 +10:00
.claude 🔧 add .claude project settings to repo 2026-05-24 16:22:09 +10:00
.woodpecker 👷 add WuMing AI PR review pipeline 2026-06-12 06:27:10 +10:00
src/playlist2podcast 📝 document Floatplane-related magic values and guard 2026-04-25 15:10:06 +10:00
tests/unit fix: fix image extension detection and add HTTP error check in 2026-04-05 12:58:52 +10:00
.editorconfig Tickle container creation and runtime a bit more. 2024-09-15 18:56:42 +10:00
.gitignore Update .gitignore 2026-02-11 11:57:23 +10:00
.gitleaks.toml chore: switch to gitleaks, add Python 3.14, drop 3.10 2026-04-02 12:43:55 +10:00
.pre-commit-config.yaml 🔧 bump deps 2026-06-12 06:44:52 +10:00
.python-version chore: switch to gitleaks, add Python 3.14, drop 3.10 2026-04-02 12:43:55 +10:00
CHANGELOG.md 📝 update changelog for 2026.6.18 2026-06-18 16:34:31 +10:00
CLAUDE.md 📝 remove co-authored-by trailer guidance 2026-05-24 16:22:15 +10:00
cliff.toml 🔧 switch commit messages to gitmoji format 2026-04-25 13:30:58 +10:00
config.toml.example feat: move hardcoded feed metadata into config with auto-migration 2026-03-24 06:55:32 +10:00
Containerfile Update Container file to work with kaniko 2026-01-19 16:00:23 +10:00
entry-point.sh Fix container image 2024-12-22 15:22:40 +10:00
icon.xcf Adds ability to check more than one playlist (#7) 2021-03-19 08:02:04 +01:00
justfile 🔧 switch commit messages to gitmoji format 2026-04-25 13:30:58 +10:00
LICENSE.md Added pre-commit processing / checking: 2021-10-10 09:41:43 +10:00
logging-config.toml Using Loguru and dropping Python 3.8 support 2024-09-15 13:09:15 +10:00
noxfile.py 👷 fix python beta tests 2026-06-12 07:02:45 +10:00
pylock.toml 🔧 remove upper limit of requires-python 2026-06-12 06:53:42 +10:00
pyproject.toml 🔧 version to 2026.6.18 2026-06-18 16:34:35 +10:00
README.md Retiring notic 2026-06-18 16:34:16 +10:00
ruff.toml Release 1.0.0 2024-05-12 19:26:44 +10:00
uv.lock 🔧 version to 2026.6.18 2026-06-18 16:34:35 +10:00

Warning

This project is archived and no longer maintained. It has been superseded by sub2pod — please use that instead. sub2pod is also available on PyPI: pip install sub2pod

Playlist2Podcast

Repo CI - Woodpecker Downloads PyPI - Python Version PyPI - Wheel AGPL

Playlist2Podcast is a command line tool that takes a Youtube playlist, downloads the audio portion of the videos on that list, and creates a podcast feed from this.

Playlist2Podcast:

  1. downloads and converts the videos in one or more playlists to opus audio only files,
  2. downloads thumbnails and converts them to JPEG format, and
  3. creates a podcast feed with the downloaded videos and thumbnails.

Install and run natively

Easiest way to use Playlist2Podcast is to use pipx to install it from PyPi. Then you can simply use playlist2podcast on the command line run it. To configure playlist2podacast you can rename the [config.toml.example][1] file to config.toml and adjust values as needed.

Below is an annotated version of the config.toml file explaining the various settings:

   # version of playlist2podcasts this configuration file is built for.
   version = "2.0.0"
   # URL where the feed.rss file will be published. This value is used for references within the generated `feed.rss`
   # file. This value needs to be provided.
   podcast_host = "http://<...>"
   # directory on local file system to place all files for podcast in
   publish_dir = "publish"
   # directory on local file system where all media files are saved to, this is a sub directory inside the publish_dir
   media_dir = "media"
   # how many of the most recent episodes to download and save for each playlist
   number_of_episodes = 5
   # optional, file (with path if needed) on local filesystem where youtube cookie is stored for yt-dlp to use
   youtube_cookie_file = "youtube-dl-cookies.txt"

   # Each youtube playlist to be processed into your podcast is contained under a `[[play_lists]]` header. You can have
   # multiple `[[play_lists]]` sections

   [[play_lists]]
   # URL to list of media to look at and download audio files from to build your personalised podcast
   url = "https://www.youtube.com/@PythonBytes/streams"
   # Include filters allowing to only process some videos. Will allow all if empty.
   include = []
   # Exclude filters for videos NOT to download. If some video has been selected with an include filer but is also selected
   # with an exclude filter, that video will be excluded. In other words, exclude filters trump include filters.
   exclude = []

   [[play_lists]]
   # Second playlist to show an example of include and exclude filters. In this example, we exclude all videos that
   # contain "shorts" anywhere in the title or url. Additionally we only include videos where the title starts with
   # "The Level1 Show"
   url = "https://www.youtube.com/c/Level1Techs/videos"
   include = [
       "^The Level1 Show.*",
   ]
   exclude = [
       "shorts",
   ]

Docker

There is a container image published for playlist2podcast that can be used with docker of Podman.

Following is an example run command using podman (replace podman with docker to run with docker):

   podman run \
      --rm \
      --replace \
      --detach \
      --env TZ=UTC \
      --env UPDATE_INTERVAL=4h \
      --env LOGGING_CONFIG=/config/logging-config.toml \
      --name playlist2podcasts \
      --volume ./playlist2podcasts/config:/config \
      --volume ./playlist2podcasts/publish:/publish \
      --volume ./playlist2podcasts/logging:/logging \
      codeberg.org/pyyttools/playlist2podcasts:latest

Changelog

See the [Changelog][2] for any changes introduced with each version.

License

Playlist2Podcast is licences under the GNU Affero General Public License v3.0