Skip to content
/ podqueue Public

Automate the archiving of podcast feeds, including show notes and images.

License

Notifications You must be signed in to change notification settings

tquin/podqueue

Repository files navigation

tquin/podqueue

Automate the archiving of podcast feeds, including show notes and images.

This Python project aims for a simple user interface - you just need to modify podqueue.conf with your inputs and outputs, and then schedule the program to run periodically.

What does my config look like?

The order of precedence for these is CLI arguments taking the highest priority, environment variables second, and the .conf file last. If you are using the Docker image, environment variables are recommended.

CLI argument Environment variable .conf file Description Default value
-o, --opml PQ_OPML opml Pass an OPML file that contains a podcast subscription list. podqueue.opml
-d, --dest PQ_DEST dest The destination folder for downloads. Will be created if required, including sub-directories for each separate podcast. pq/
-t, --time-format PQ_TIME_FORMAT time_format Specify a time format string for JSON files. _Please note, % must be escaped with %% for the .conf file option. %Y-%m-%d
-v, --verbose PQ_VERBOSE verbose Prints additional debug information. If excluded, only errors are logged (no stdout for automation). False
-l, --log-file PQ_LOG_FILE log_file Specify the log file path. ./podqueue.log
'--bg', '--server' PQ_SERVER server Run in continuous background server mode. False
--server-sleep-hours PQ_SERVER_SLEEP_HOURS server_sleep_hours How many hours to pause between runs when in server mode. 1

Where do I get my OPML?

This will depend on your podcast app, but most will be able to export your list of subscriptions into a common XML format.

If you use a different app that has a similar functionality, please let me know and I'll add it to this list.

Podcast App Podcast App Supported OPML Export Options
Pocket Casts OPML export
Overcast Option available in the app's Settings page, or here on the web.
Castro Export Subscriptions
Downcast Exporting Podcast Subscriptions
Podcast Addict How can I backup and restore my subscription & data?
Castbox OPML Export
Apple Podcasts 🛠 Not available in iOS app or macOS since Catalina. However, if you sync your podcasts to your Mac, there is an open-source workaround.
Google Podcasts 🛠 Officially unavailable. There is a Gist by @telmen (I tested, seems to work) that can be run in your browser's Devtools if you're feeling lucky.
Spotify Not available, since Spotify doesn't use open Podcast standards. Community suggestion is 'now reaching the internal teams at Spotify', as of six months ago.
Stitcher Not available.

Your file should look something like this, with one line per podcast:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<opml version="1.0">
  <head>
    <title>Pocket Casts Feeds</title>
  </head>
  <body>
    <outline text="feeds">
      <outline type="rss" text="Accidental Tech Podcast" xmlUrl="https://atp.fm/episodes?format=rss" />
      <outline type="rss" text="The Unmade Podcast" xmlUrl="https://www.unmade.fm/episodes?format=rss" />
      <outline type="rss" text="You Look Nice Today" xmlUrl="https://feeds.fireside.fm/youlooknicetoday/rss" />
      <outline type="rss" text="The Pen Addict" xmlUrl="https://www.relay.fm/penaddict/feed" />

      ... etc ...

    </outline>
  </body>
</opml>

How to install

Installation is done through Python's pip:

python3 -m pip install --upgrade podqueue
python3 -m podqueue --help

Alternatively, you can use Docker to containerise podqueue. This requires two volumes mounts, one for the output location to save podcast files to on the host, and the other to store the podqueue.opml config and log files.

Docker Compose:

services:
  podqueue:
    name: podqueue
    image: tquin/podqueue
    user: "<YOUR UID>:<YOUR GUID>"
    restart: unless-stopped
    volumes:
      - "<YOUR_OUTPUT_DIRECTORY>:/data"
      - "<YOUR_CONFIG_DIRECTORY>:/config"

Docker CLI:

docker pull tquin/podqueue
cat <YOUR_CONFIG_DIRECTORY>/podqueue.opml # Replace this example with your subscription list
docker run -it \
  -v <YOUR_OUTPUT_DIRECTORY>:/data \
  -v <YOUR_CONFIG_DIRECTORY>:/config \
  --restart unless-stopped \
  --user "<YOUR UID>:<YOUR GUID>" \
  tquin/podqueue

Or you can just clone this repo directly:

git clone https://github.com/tquin/podqueue
cd podqueue/
python3 podqueue/main.py --help

Output

Executing the script will download each podcast into their own subdirectory, with episode metadata (shownotes, date, title, link) and show metadata (episode count, description, image) in each subdirectory. Episodes will be downloaded in default feed order - usually newest first, but it could depend on the podcast.

Example directory tree:

output/
├─ Accidental_Tech_Podcast/
├── episodes/
│  ├── 2021-12-30_463_No_Indication_of_Progress.json
│  ├── 2021-12-30_463_No_Indication_of_Progress.mp3
│  ├── 2022-01-06_464_Monks_at_Drafting_Tables.json
│  ├── 2022-01-06_464_Monks_at_Drafting_Tables.mp3
│  ├── ...
├── Accidental_Tech_Podcast.png
├── Accidental_Tech_Podcast.json
├─ The_Pen_Addict/
├── episodes/
│  ├── 2021-12-29_494_The_Centre_is_Twisty.json
│  ├── 2021-12-29_494_The_Centre_is_Twisty.mp3
│  ├── 2022-01-05_495_Parter_Jocker.json
│  ├── 2022-01-05_495_Parter_Jocker.mp3
│  ├── ...
├── The_Pen_Addict.png
├── The_Pen_Addict.json

And a sample JSON file for an episode (note that description will often be HTML-formatted):

{
    "published_parsed": "2022-04-05",
    "title": "Episode 451: Minitel (Entry 791.IS4209)",
    "link": "https://pdst.fm/e/aphid.fireside.fm/d/1437767933/8658dd0c-baa7-4412-9466-918650a0013d/e373ca83-d5d9-4b8b-b03f-5fcd012ac9a2.mp3",
    "description": "In which a French-only precursor to the World Wide Web appears in the late 1970s in a wave of Gallic futurist fervor, and John may have been making long distance calls from a Parisian prison. Certificate #23054."
}

Todos

  • Distro packaging
  • Better config file location, eg $HOME/.config/podqueue.conf
  • Built-in systemd/cron timers
  • Option to only download after X date (--no-backlog or --earliest ?)

About

Automate the archiving of podcast feeds, including show notes and images.

Resources

License

Stars

Watchers

Forks

Packages

No packages published