Install
openclaw skills install 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...
openclaw skills install 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.