Skip to content

vod2pod-rss

vod2pod-rss converts YouTube channels and playlists into podcast RSS feeds, enabling them to be subscribed to in any podcast client (including Audiobookshelf). Audio is transcoded to MP3 on the fly — no local storage required. Available at vod2pod.hdhomelab.com.


Deployment

vod2pod-rss runs in Kubernetes (media namespace) as a stateless Deployment backed by an in-memory Redis cache. The YouTube API key is injected via ExternalSecret.

graph LR
    Client -->|HTTPS| Gateway[Cilium Gateway]
    Gateway --> vod2pod[vod2pod-rss :8080]
    vod2pod -->|cache| Redis[Redis in-memory]
    vod2pod -->|YouTube Data API v3| YouTube[(YouTube)]
    vod2pod -->|stream audio| yt-dlp[yt-dlp internal]
    Vault -->|ExternalSecret| K8sSecret[K8s Secret]
    K8sSecret -->|YT_API_KEY| vod2pod
Hold "Alt" / "Option" to enable pan & zoom
  • URL


    vod2pod.hdhomelab.com

  • Namespace


    media

  • Storage


    None — stateless, Redis cache is in-memory only

  • Image


    madiele/vod2pod-rss

  • Config


    flux/apps/noah/media/vod2pod-rss/

  • Feed pattern


    https://vod2pod.hdhomelab.com/<youtube-url>


Usage

The feed URL pattern is:

https://vod2pod.hdhomelab.com/transcodize_rss?url=<youtube-url>

Construct a feed URL by appending any YouTube channel or playlist URL:

https://vod2pod.hdhomelab.com/transcodize_rss?url=https://www.youtube.com/@channelname/videos
https://vod2pod.hdhomelab.com/transcodize_rss?url=https://www.youtube.com/playlist?list=PLxxxxxx

Add it to Audiobookshelf as a podcast RSS feed. With the YouTube API key configured, up to 500 episodes are returned per feed.

Example feeds

https://vod2pod.hdhomelab.com/transcodize_rss?url=https://www.youtube.com/@8fenban/videos
https://vod2pod.hdhomelab.com/transcodize_rss?url=https://www.youtube.com/@zzjcoo/videos

Secrets

Vault path Key Used as
vod2pod-rss youtube-api-key YT_API_KEY env var

The YouTube API key is a YouTube Data API v3 key from the homelab-apis Google Cloud project. It removes the default 15-episode limit and raises it to 500 per feed.

Manual secret

Unlike database credentials, this secret must be written to Vault manually — there is no tofu module that provisions it:

vault kv put secret/vod2pod-rss youtube-api-key=<YOUR_KEY>


Audiobookshelf Integration

Audiobookshelf uses ssrf-req-filter to block requests to private/internal IPs (SSRF protection). Since vod2pod-rss runs inside the cluster, its ClusterIP falls in the 10.x.x.x range and gets blocked by default.

Resolution: Add vod2pod-rss hostnames to ABS's SSRF whitelist via SSRF_REQUEST_FILTER_WHITELIST in the Audiobookshelf deployment:

- name: SSRF_REQUEST_FILTER_WHITELIST
  value: "vod2pod.hdhomelab.com,vod2pod-rss,vod2pod-rss.media.svc.cluster.local"

This is already configured in flux/apps/noah/media/audiobookshelf/deployment.yaml.


Known Limitations

Episode file size is inaccurate

The <enclosure length> field in the RSS feed reflects the original video file size, not the transcoded MP3 size. Since transcoding happens on-the-fly, the actual audio size isn't known ahead of time. This is cosmetic only — playback is unaffected.


Key Environment Variables

Variable Value
YT_API_KEY From Vault via ExternalSecret
REDIS_ADDRESS vod2pod-redis
REDIS_PORT 6379
MP3_BITRATE 192
TRANSCODE true
TZ Asia/Hong_Kong