Overview
This Skill implements a fully automated publishing process for the daily tech morning briefing podcast: podcast generation → RSS.com publishing → Xiaoyuzhou sync → Feishu notification.
Project Path: /Users/qitmac001395/workspace/QAL/ideas/apps/daily-podcast-ai
Core Capabilities
| Feature | Status | Required Configuration |
|---|---|---|
| Morning briefing podcast generation | ✅ Available | ELEVENLABS_API_KEY |
| RSS.com auto publishing | ✅ Available | RSS_COM_API_KEY + RSS_COM_PODCAST_ID |
| Xiaoyuzhou RSS subscription | ✅ Available | One-time manual configuration |
| Feishu message notification | ✅ Available | FEISHU_APP_ID + FEISHU_APP_SECRET + FEISHU_RECEIVER_OPEN_ID |
| Scheduled automatic execution | ✅ Available | macOS launchd (every day at 7 AM) |
Usage
Method 1: Automatic execution (recommended)
No action required, it runs automatically every day at 7 AM:
07:00 - 从缓存读取新闻(0:00-6:00收集的30-50篇)
07:02 - AI优选Top 10新闻
07:05 - 生成对话脚本(双人播报模式)
07:10 - TTS语音合成(ElevenLabs)
07:15 - 合并音频 + 生成封面
07:17 - 发布到RSS.com
07:18 - 发送飞书通知
08:00 - 小宇宙自动同步
Method 2: Manually publish for a specified date
cd /Users/qitmac001395/workspace/QAL/ideas/apps/daily-podcast-ai
# 发布昨天的播客
python scripts/publish_to_rss.py --date 2026-01-14
# 生成今天的播客并发布
python scripts/daily_generate.py --from-cache && \
python scripts/publish_to_rss.py --date $(date +%Y-%m-%d)
Method 3: Send Feishu notification only
python scripts/notify_feishu.py \
--date 2026-01-14 \
--rss-url "https://rss.com/podcasts/xxx/feed.xml" \
--episode-url "https://rss.com/podcasts/xxx/episodes/ep_xxx" \
--article-count 10
First-Time Configuration Guide
Step 1: RSS.com configuration (5 minutes)
-
Register an account: https://rss.com/ → Sign Up
-
Create a podcast: Dashboard → Create New Podcast
名称: 今日科技早报 分类: Technology / News 语言: Chinese (Simplified) -
Get credentials:
- Settings → API Keys → Generate New API Key
- Copy API Key:
rss_com_sk_xxx - Get the Podcast ID from the podcast URL
-
Configure environment variables: Edit
apps/daily-podcast-ai/.env:RSS_COM_API_KEY=rss_com_sk_your_actual_key RSS_COM_PODCAST_ID=your-podcast-uuid
Step 2: Xiaoyuzhou subscription configuration (3 minutes, only once)
- Log in to the creator platform: https://podcaster.xiaoyuzhoufm.com/podcasts/695e1e64e0970c835fb2e784/home
- Add RSS subscription:
- Settings → RSS Feed settings
- Enter:
https://rss.com/podcasts/{YOUR_ID}/feed.xml - Click "Verify and Import"
- First sync: Click "Sync Now"
Step 3: Feishu notification configuration (optional, 5 minutes)
- Create a Feishu app: https://open.feishu.cn/app
- Add permissions:
im:message+im:message:send_as_bot - Configure environment variables:
FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx FEISHU_RECEIVER_OPEN_ID=ou_18b8063b232cbdec73ea1541dfb74890 # 王植萌
Step 4: Test and verify (2 minutes)
# 测试发布
python scripts/publish_to_rss.py --date 2026-01-14
# 预期看到:
# ✅ Episode published successfully!
# 📱 发送飞书通知...
# ✅ 飞书消息发送成功
Technical Architecture
Integration Flowchart
┌─────────────┐
│ 早报生成 │ scripts/daily_generate.py
│ (每天7点) │ - 从cache读取新闻
└──────┬──────┘ - AI优选Top 10
│ - TTS语音合成
↓
┌─────────────┐
│ 输出文件 │ output/{date}/dailyReport/
│ │ - podcast-{date}-1.2x.mp3
│ │ - cover-{date}.png
└──────┬──────┘ - script-{date}.md
│
↓
┌─────────────┐
│ RSS发布 │ scripts/publish_to_rss.py
│ │ - 上传音频到RSS.com
└──────┬──────┘ - 创建单集元数据
│
├──────────────────┐
↓ ↓
┌─────────────┐ ┌─────────────┐
│ RSS Feed │ │ 飞书通知 │ scripts/notify_feishu.py
│ 更新 │ │ │ - 发送卡片消息
└──────┬──────┘ └─────────────┘ - 包含RSS链接
│
↓ (每小时)
┌─────────────┐
│ 小宇宙同步 │ podcaster.xiaoyuzhoufm.com
│ │ - 自动抓取RSS
└─────────────┘ - 发布到App
Key Files
| File | Lines | Function |
|---|---|---|
scripts/publish_to_rss.py |
376 | RSS.com publishing main script |
scripts/notify_feishu.py |
191 | Feishu notification script |
scripts/daily_generate.py |
651 | Podcast generation core logic |
scripts/daily_automated_run.sh |
100 | Scheduled task execution script |
docs/XIAOYUZHOU_INTEGRATION.md |
- | Complete integration guide |
QUICKSTART_XIAOYUZHOU.md |
- | 5-minute quick start |
Environment Variable List
# 必需 - 播客生成
ELEVENLABS_API_KEY=sk_xxx # TTS语音合成
# 可选 - AI增强
OPENAI_API_KEY=sk-xxx # AI摘要和优选
# 必需 - RSS发布
RSS_COM_API_KEY=rss_com_sk_xxx # RSS.com API
RSS_COM_PODCAST_ID=xxx-xxx-xxx # 播客频道ID
# 可选 - 飞书通知
FEISHU_APP_ID=cli_xxx # 飞书应用ID
FEISHU_APP_SECRET=xxx # 飞书密钥
FEISHU_RECEIVER_OPEN_ID=ou_xxx # 接收者Open ID
Code Improvements (Implemented)
1. Smart filename recognition (publish_to_rss.py:258-269)
Problem: The project generates podcast-{date}-1.2x.mp3, but the script expects podcast-{date}.mp3
Solution: Automatically find and use the multi-bitrate version
audio_file = base_path / f"podcast-{args.date}.mp3"
if not audio_file.exists():
audio_file_12x = base_path / f"podcast-{args.date}-1.2x.mp3"
audio_file_15x = base_path / f"podcast-{args.date}-1.5x.mp3"
if audio_file_12x.exists():
audio_file = audio_file_12x
2. Multi-endpoint retry mechanism (publish_to_rss.py:106-159)
Problem: RSS.com API endpoints may change
Solution: Try 3 possible endpoints in sequence
upload_endpoints = [
f"{self.API_BASE_URL}/upload",
f"{self.API_BASE_URL}/media",
f"{self.API_BASE_URL}/podcasts/{self.podcast_id}/media"
]
3. Feishu notification integration (publish_to_rss.py:343-362)
Features: Automatically called after successful publishing notify_feishu.py
Features:
- Use
check=Falseto prevent notification failures from interrupting the main process - Automatically extract article count
- Pass RSS URL and episode URL
Feishu message effect
After successful publishing, the recipient will receive a blue card message:
┌─────────────────────────────────────────┐
│ 🎙️ 今日科技早报已发布 │
├─────────────────────────────────────────┤
│ 📅 日期: 2026-01-14 │
│ 📰 内容: 精选 10 篇科技新闻 │
│ │
│ 📢 发布状态: │
│ - ✅ RSS.com 发布成功 │
│ - ⏳ 小宇宙同步中(预计1小时内) │
│ │
│ 🔗 单集链接: https://rss.com/... │
│ 📡 RSS Feed: https://rss.com/...feed.xml│
│ │
│ ─────────────────────────────────────── │
│ 💡 小宇宙订阅步骤: │
│ 1. 打开小宇宙创作者平台 │
│ 2. 点击「立即同步」查看最新单集 │
│ 3. 首次设置需添加RSS订阅(仅需一次) │
└─────────────────────────────────────────┘
Troubleshooting
FAQ
| Issue | Symptom | Solution |
|---|---|---|
| RSS publishing failed | 401 Unauthorized |
Check whether the API Key is correct/expired |
| File not found | Missing required files |
Confirm the podcast has been generated and check the output directory |
| Xiaoyuzhou not synced | RSS succeeds but the App has no episode | Manually click "Sync Now" |
| Feishu notification failed | Publishing succeeds but there is no message | Check app permissions and verify open_id |
| API endpoint 404 | Endpoint not found |
Check the latest RSS.com API documentation |
Debugging commands
# 查看最近的生成日志
tail -50 logs/daily_run.log
# 检查错误日志
tail -50 logs/daily_error.log
# 验证RSS Feed可访问
curl -I "https://rss.com/podcasts/{YOUR_ID}/feed.xml"
# 验证环境变量
python3 -c "from dotenv import load_dotenv; import os; load_dotenv(); \
print('RSS Key:', bool(os.getenv('RSS_COM_API_KEY'))); \
print('Podcast ID:', bool(os.getenv('RSS_COM_PODCAST_ID')))"
Use cases
Scenario 1: Daily automatic publishing (default)
Trigger: Automatically executes every day at 07:00 Process: Complete generation → publishing → notification No action required: Takes effect permanently after configuring once
Scenario 2: Republish yesterday's podcast
# 用户说: "帮我重新发布昨天的播客到小宇宙"
python scripts/publish_to_rss.py --date 2026-01-14
Scenario 3: Notify only, do not publish
# 用户说: "通知植萌播客已发布"
python scripts/notify_feishu.py \
--date 2026-01-14 \
--rss-url "https://rss.com/podcasts/xxx/feed.xml" \
--article-count 10
Scenario 4: Generate but do not publish
# 用户说: "生成今天的播客但先不发布"
python scripts/daily_generate.py --from-cache
# 不运行 publish_to_rss.py
Technical details
RSS.com API integration
API version: v4 Base URL: https://api.rss.com/v4 Authentication method: Bearer Token
Core endpoints:
POST /upload # 上传文件(主端点)
POST /media # 备选端点1
POST /podcasts/{id}/media # 备选端点2
POST /podcasts/{id}/episodes # 创建单集
GET /podcasts/{id}/feed.xml # RSS Feed
File upload:
- Audio: maximum 100MB, supports MP3/M4A
- Cover: maximum 5MB, 3000x3000px PNG recommended
- Timeout: 120 seconds
Xiaoyuzhou integration method
Method: RSS subscription (not API upload)
Advantages:
- ✅ Configure once, takes effect permanently
- ✅ No need to reverse engineer the Xiaoyuzhou API
- ✅ Officially supported, stable and reliable
- ✅ Supports multi-platform distribution
Update frequency:
- Default: hourly
- Configurable: 30 minutes/2 hours/4 hours
Feishu notification implementation
Message type: Interactive (card message)
Card structure:
{
"header": {"title": "🎙️ 今日科技早报已发布", "template": "blue"},
"elements": [
{"tag": "markdown", "content": "📅 日期: {date}\n📰 内容: 精选 {count} 篇..."}
]
}
Dependencies: httpx>=0.27.0
Monitoring and maintenance
Log location
logs/
├── daily_run.log # 主日志(生成+发布)
├── daily_error.log # 错误日志
├── hourly-stdout.log # 每小时收集日志
└── hourly-stderr.log # 收集错误
Key log search
# 查看最近5次发布状态
grep "Publication completed" logs/daily_run.log | tail -5
# 查看RSS发布错误
grep "RSS" logs/daily_error.log
# 查看飞书通知记录
grep "飞书通知" logs/daily_run.log | tail -5
Data cleanup
# 清理30天前的播客文件(节省空间)
find output/ -type d -mtime +30 -exec rm -rf {} +
# 清理缓存(保留最近7天)
find cache/ -name "*.json" -mtime +7 -delete
Cost estimate
Daily cost
| Service | Usage | Cost |
|---|---|---|
| ElevenLabs TTS | 3-5 minute audio | ¥1-2 |
| OpenAI GPT-4o-mini | Summary + curation | ¥0.5-1 |
| RSS.com | 3-5MB storage + traffic | Free |
| Xiaoyuzhou | RSS subscription | Free |
| Feishu API | 1 message/day | Free |
Monthly total: ¥45-90 (mainly ElevenLabs and OpenAI)
Free quota
- ElevenLabs: 10,000 credits/month (about 10 minutes)
- OpenAI: Paid, but gpt-4o-mini costs extremely little
- RSS.com: The free version supports 5GB storage + traffic
- Feishu: Free for enterprise self-built apps
Extended Features (Optional)
1. Multi-platform Distribution
Submit the same RSS Feed to:
- Xiaoyuzhou (already supported)
- Ximalaya
- Lizhi FM
- Apple Podcasts
- Spotify Podcasts
2. Data Analysis
Get statistics from RSS.com:
curl -H "Authorization: Bearer $RSS_COM_API_KEY" \
"https://api.rss.com/v4/podcasts/$RSS_COM_PODCAST_ID/analytics"
3. Smart Push
Optimize based on playback data:
- Adjust publishing time (currently 07:00)
- Optimize the news selection strategy
- A/B test different broadcast styles
4. Batch Operations
# 批量发布最近7天的播客
for date in $(seq -f "%Y-%m-%d" 7 -1 1); do
python scripts/publish_to_rss.py --date $date
sleep 10
done
Notes
Important Reminders
-
API Credential Security:
- ✅
.envAlready in.gitignorein - ❌ Do not commit API Keys to Git
- ❌ Do not print the full API Key in logs
- ✅
-
File Naming Convention:
- The project generates files with a rate suffix (
-1.2x.mp3) - The publishing script will automatically recognize them
- Prefer the 1.2x version (balances duration and audio quality)
- The project generates files with a rate suffix (
-
Error Handling Strategy:
- RSS publishing failure → interrupt the process (manual intervention required)
- Feishu notification failure → only log it (does not affect publishing)
- Xiaoyuzhou sync delay → can be triggered manually
-
RSS Feed Update Frequency:
- RSS.com: real-time updates
- Xiaoyuzhou: fetches hourly (configurable)
- Speed up sync: manually click "Sync Now"
Related Resources
Official Documentation
- RSS.com API: https://api.rss.com/v4/docs
- Xiaoyuzhou Creator Guide: https://podcaster.xiaoyuzhoufm.com/help
- Feishu Open Platform: https://open.feishu.cn/document/
Project Documentation
- Complete Integration Guide: docs/XIAOYUZHOU_INTEGRATION.md
- Quick Start: QUICKSTART_XIAOYUZHOU.md
- Main Project README: apps/daily-podcast-ai/README.md
Tool Links
- Feed Validation: https://validator.w3.org/feed/
- Card Message Builder: https://open.feishu.cn/tool/cardbuilder
- ElevenLabs Management: https://elevenlabs.io/app/
Update Log
- 2026-01-15: Initial version, supports RSS.com automatic publishing and Xiaoyuzhou subscription
- 2026-01-15: Added Feishu notification feature (Wang Zhimeng)
- 2026-01-15: Fixed the issue of recognizing multi-rate audio file names
- 2026-01-15: Enhanced API error handling, supports multi-endpoint retries
Skill Maintainer
- Creator: Claude Code
- Project: daily-podcast-ai
- Version: v1.0.0
- Last Updated: 2026-01-15