No description
  • Python 92.1%
  • Jinja 5.9%
  • Dockerfile 2%
Find a file
kjh 0ccae94b5b
All checks were successful
Build container image / Build oci image (push) Successful in 1m42s
Merge pull request 'Update python:3.12 Docker digest to ea7b35c' (#18) from renovate/python-3.12 into master
Reviewed-on: #18
2026-06-17 09:22:55 +02:00
.forgejo/workflows Don't automatically update workflow files at all, also don't rebuild if only the renovate files where changed 2026-06-14 00:08:17 +02:00
.idea Created some helper functions 2025-01-22 21:59:21 +01:00
docs Small formatting and readability improvements 2025-11-04 22:58:01 +01:00
src Update python requirements to v1 2026-06-13 22:33:54 +00:00
agpl-3.0.md Split license into two files to ensure that all terms of the agpl-3.0 are followed. 2025-01-27 23:02:15 +01:00
Dockerfile Update python:3.12 Docker digest to ea7b35c 2026-06-17 02:33:16 +00:00
LICENSE.md Restrict license to only allow version 3. 2025-01-27 23:05:59 +01:00
README.md Replaced placeholder with real git repository URL 2025-11-05 00:06:44 +01:00
renovate.json5 Don't automatically update workflow files at all, also don't rebuild if only the renovate files where changed 2026-06-14 00:08:17 +02:00

Audible downloader and podcast feed generator

AudiblePodcastFeed serves two related functions, it:

  • downloads books from one connected audible library and decrypts the audio files.
  • provides an RSS podcast feeds organized by book series.

I created AudiblePodcastFeed to allow me to easily listen to my purchased audiobooks using the overcast podcast app. The RSS podcast feeds generated should be compatible with other podcast players, but I have not tested that.

AudiblePodcastFeed is desinged to run in a docker container. Other deployment methods are not supported.

About this documentation

This documentation assumes you are familiar with:

Quick start

Setup

  1. Create a directory with the following docker-compose.yaml:
services:
  audible-podcasts:
    build: ./build
    volumes:
    - metadata:/app/metadata_files
    - audio:/app/audio_files
    environment:
      PODCAST_FEED_IMAGE: "{{ url for cover image }}"
      PODCAST_HASH_SALT: "{{ random string }}"
      AUTH_ENABLED: True
      HTTP_USERNAME: "{{ user }}"
      HTTP_PASSWORD: "{{ password }}"
    restart: unless-stopped
    ports:
    - 8080:8080
  audible-podcasts-downloader:
    build: ./build
    volumes:
    - ./audible_auth:/app/audible_auth
    - metadata:/app/metadata_files
    - audio:/app/audio_files
    command: python library_downloader.py download
    restart: no

volumes:
  audio:
  metadata:

Important

Replace all the placeholders including the double curly braces.

  1. Clone this repository into the build subdirectory:
git clone https://github.com/usbpc/AudiblePodcastFeed.git build
  1. Create a audible authentication file:
touch audible_auth
docker compose run -i audible-podcasts-downloader python generate_audible_auth.py --locale DE

Important

Replace the locale DE with the marketplace country code of your audible account.

  1. Start the docker compose services
  2. Optional: Configure a reverse proxy for https (see the docs)
  3. Optional: Set up a sheduled job for automatic downloading (see the docs)

Note

By default the audiobooks are only downloaded once on initial startup. To download and decrypted audiobooks added to the connected audible library after initial startup, start the audible-podcasts-downloader service again.

Usage

  1. Open the overview page on the root of the audible-podcasts web server. http://localhost:8080/, if running on your local machine using the docker compose configuration from above.
  2. Copy any of the RSS feed links and add to your podcast app.

Configuration

Environment variable Default value Description
PODCAST_FEED_IMAGE None, reqired to be set URL of cover image used for podcast feeds.
PODCAST_HASH_SALT Random 16 character string Hash salt used to obfuscate download links for audio files. Required since overcast dosen't send http basic auth for downloads.
AUTH_ENABLED True Used to disable authentication handling in the starlette application. Set to False when handeling authentication in an external reverse proxy.
HTTP_USERNAME user Username for http basic auth for the podcast feeds. Should also be set if external auth is used. The overview page uses this value to generate links with authentication to the individual RSS feeds.
HTTP_PASSWORD Random 8 character string Password for http basic auth for the podcast feeds. Should also be set if external auth is used.

Technical details

The project is written in python and uses the following packages:

  • audible for listing and downloading the audiobooks from the connected audible library.
  • starlette for providing the api for the podcast feeds and overview webpage.
  • jinja2 as the templating engine for the RSS podcast feeds and overview webpage.
  • uvicorn as the ASGI web server for running the starlette application.

In addition to the python packages, library_downloader.py uses ffmpeg to decrypt the downloaded audio files.