Install
openclaw skills install @ryandeathridge/video2podcastConvert bookmarked videos from YouTube, X (Twitter), and other sites into a podcast RSS feed hosted on Cloudflare R2. Use when the user says things like "add this to my podcast feed", "add this video to my podcast", "sync my podcast feed", "put this YouTube video in my podcast", or "subscribe to this playlist as a podcast". Manages a persistent episode list and hosts audio files + feed.xml on Cloudflare R2.
openclaw skills install @ryandeathridge/video2podcastTurn any video URL into a podcast episode. Publishes a valid RSS feed to Cloudflare R2 that can be subscribed to in Apple Podcasts, Overcast, Pocket Casts, and any podcast app.
Supports YouTube, X (Twitter), and the ~1,000 other sites that yt-dlp supports.
# Python packages
pip3 install yt-dlp boto3
# ffmpeg (required for audio conversion)
brew install ffmpeg # macOS
sudo apt install ffmpeg # Linux
podcast-feedhttps://pub-abc123.r2.dev)Run the interactive setup:
python3 /path/to/skills/video-podcast/scripts/video_podcast.py setup
Or add these to ~/.openclaw/.env manually:
VIDPOD_R2_ACCESS_KEY=your_access_key_id
VIDPOD_R2_SECRET=your_secret_access_key
VIDPOD_R2_ENDPOINT=https://<account_id>.r2.cloudflarestorage.com
VIDPOD_R2_BUCKET=podcast-feed
VIDPOD_PUBLIC_BASE=https://pub-<hash>.r2.dev
# Optional
VIDPOD_FEED_TITLE=My Video Podcast
VIDPOD_FEED_AUTHOR=Your Name
Podcast apps display a 1400×1400px JPEG as artwork. Upload one to your bucket:
# Using AWS CLI (if installed)
aws s3 cp cover.jpg s3://podcast-feed/cover.jpg \
--endpoint-url https://<account_id>.r2.cloudflarestorage.com \
--content-type image/jpeg
# Or via the Cloudflare R2 dashboard — drag and drop cover.jpg into the bucket
The image must be named cover.jpg in the root of your bucket.
python3 video_podcast.py add "https://www.youtube.com/watch?v=..."
python3 video_podcast.py add "https://x.com/user/status/123456789"
python3 video_podcast.py add "https://vimeo.com/..."
Add all videos from a playlist that aren't already in the feed:
python3 video_podcast.py sync-youtube PLxxxxxxxxxxxxxxxx
The playlist ID is the part after list= in the YouTube URL.
python3 video_podcast.py list
python3 video_podcast.py feed
python3 video_podcast.py remove "https://www.youtube.com/watch?v=..."
feed.xml is rebuilt and uploaded with no-cache headers so podcast apps always see the latest version.| Location | Purpose |
|---|---|
~/.openclaw/video-podcast-state.json | Episode list + processed URL GUIDs (deduplication) |
R2 <guid>.mp3 | Audio files (public, 7-day cache) |
R2 feed.xml | Podcast RSS feed (public, no-cache) |
R2 cover.jpg | Podcast artwork (optional) |
Any URL that yt-dlp supports, including:
ffmpeg not found
brew install ffmpeg # macOS
sudo apt install ffmpeg # Linux
SSL errors with R2
Make sure you're using Python 3.10+ with OpenSSL 3.x. On macOS the system Python (/usr/bin/python3) uses LibreSSL which may not work. Install Python via Homebrew:
brew install python@3.13
Age-restricted YouTube videos yt-dlp needs your browser cookies:
yt-dlp --cookies-from-browser chrome "https://youtube.com/watch?v=..."
Then run add again — yt-dlp caches the cookies.
X/Twitter videos fail Public tweets work without auth. Private accounts require cookies:
yt-dlp --cookies-from-browser chrome "https://x.com/user/status/..."
Episode not appearing in podcast app
Most podcast apps cache the feed for 1–24 hours. Force a refresh in the app, or check the feed directly: python3 video_podcast.py feed
When used via the OpenClaw agent, trigger phrases include:
The agent will run the appropriate subcommand and report back the result.