{"slug":"ibigqiang-video-a25330","title":"\u89c6\u9891\u64ad\u5ba2\u8f6c\u5199\u4e0e\u7ed3\u6784\u5316\u6458\u8981","description":"\u9762\u5411\u89c6\u9891\u4e0e\u64ad\u5ba2\u5185\u5bb9\u7814\u7a76\uff1a\u5148\u5224\u65ad\u5e73\u53f0\u4e0e\u5a92\u4f53\u7c7b\u578b\uff0c\u4f18\u5148\u63d0\u53d6\u5b57\u5e55\uff0c\u65e0\u5b57\u5e55\u5219\u4e0b\u8f7d\u97f3\u9891\u3001\u6309 25MB \u4e0a\u9650\u5206\u6bb5\uff0c\u8c03\u7528 Groq Whisper \u8f6c\u5199\uff0c\u518d\u6309\u89c6\u9891\u6216\u64ad\u5ba2\u6a21\u677f\u8f93\u51fa\u6982\u89c8\u3001\u8981\u70b9\u3001\u91d1\u53e5\u4e0e\u884c\u52a8\u9879\u3002\u542b\u9519\u8bef\u5904\u7406\u4e0e\u4f9d\u8d56\u8bf4\u660e\u3002","category":"\u9009\u9898\u4e0e\u7814\u7a76","tags":["iBigQiang","\u9009\u9898\u4e0e\u7814\u7a76"],"author":"iBigQiang","source_url":"https://github.com/iBigQiang/feedgrab/blob/9f691a18c7f3245d52261494405c561762aa8981/skills/video/SKILL.md","license":"MIT","status":"published","verification":"source_reviewed","verification_notes":"\u5df2\u6838\u5bf9\u539f\u59cb\u4ed3\u5e93\u3001\u56fa\u5b9a\u63d0\u4ea4\u3001\u8bb8\u53ef\u3001\u6280\u80fd\u6b63\u6587\u4e0e\u5305\u7ed3\u6784\uff0c\u5e76\u8865\u5145\u4e2d\u6587\u6267\u884c\u9a8c\u6536\u8bf4\u660e\uff1b\u672a\u8fd0\u884c\u5305\u5185\u811a\u672c\u3002","revision":"2d993f996d0442bf815d2e054593a999","created_at":"2026-11-02T14:47:08+00:00","updated_at":"2026-11-02T14:47:08+00:00","source_repo":"iBigQiang/feedgrab","source_path":"skills/video/SKILL.md","source_commit":"9f691a18c7f3245d52261494405c561762aa8981","source_updated_at":"2026-11-02T14:46:04+00:00","stars":0,"proxy_score":null,"score":null,"grade":null,"dimensions":{},"evaluation":{},"installs":0,"platforms":[],"formats":[],"category_slug":"research","category_name":"\u9009\u9898\u4e0e\u7814\u7a76","quality":{"review_type":"text_and_package_review","readiness":"requires_setup","reviewed_at":"2026-11-02T14:46:04+00:00","review_summary":"\u8f6c\u5199\u4e0e\u6458\u8981\u6d41\u7a0b\u5206\u6b65\u6e05\u6670\u3001\u9519\u8bef\u5904\u7406\u5177\u4f53\uff0c\u4f46\u4f9d\u8d56 yt-dlp\u3001ffmpeg \u4e0e Groq API Key \u7b49\u5916\u90e8\u6761\u4ef6\uff0c\u9700\u7528\u6237\u81ea\u884c\u5b89\u88c5\u914d\u7f6e\uff1b\u672a\u505a\u5b9e\u9645\u8fd0\u884c\u9a8c\u8bc1\u3002","cost_notes":"Groq Whisper \u8f6c\u5199\u6309\u7528\u91cf\u8ba1\u8d39\u6216\u53d7\u514d\u8d39\u989d\u5ea6\u9650\u5236\uff0c\u9700\u7528\u6237\u81ea\u884c\u786e\u8ba4\uff1b\u5305\u5185\u672a\u7ed9\u51fa\u4ef7\u683c\u3002","source_sha256":"89c399eb7e6bf13ecd8f1fe59ba1ddb609ca684a15cbf465aef2b9ea2150dee5","prerequisites":["yt-dlp\u3001ffmpeg\u3001curl\u3001python3","\u65e0\u5b57\u5e55\u65f6\u9700 GROQ_API_KEY\uff08Groq \u63a7\u5236\u53f0\u7533\u8bf7\uff09","\u90e8\u5206\u5e73\u53f0\u9700\u6d4f\u89c8\u5668 Cookie \u6216\u767b\u5f55\u6001","\u53ef\u5199\u7684 /tmp \u4e34\u65f6\u76ee\u5f55"],"checks":["\u5148\u5224\u65ad\u5a92\u4f53\u7c7b\u578b\u5e76\u8d70\u5bf9\u5e94\u5206\u652f\uff0cBilibili 412 \u65f6\u6539\u7528 API \u76f4\u53d6\u97f3\u9891\u6d41\u800c\u975e\u53cd\u590d\u91cd\u8bd5 yt-dlp","\u97f3\u9891\u8d85\u8fc7 25MB \u65f6\u6309 10 \u5206\u949f\u5206\u6bb5\u5e76\u987a\u5e8f\u8f6c\u5199\uff0c\u672a\u5e76\u884c\u8c03\u7528 Groq","\u6458\u8981\u7ed3\u6784\u7b26\u5408\u89c6\u9891\uff08\u226420 \u5206\u949f\uff09\u6216\u64ad\u5ba2\uff08>20 \u5206\u949f\uff09\u6a21\u677f\uff0c\u8981\u70b9\u6570\u91cf\u5728\u8981\u6c42\u533a\u95f4","\u8f6c\u5199\u6587\u672c\u4e0e\u6458\u8981\u5206\u5f00\u5448\u73b0\uff0c\u6458\u8981\u4e2d\u7684\u91d1\u53e5\u53ef\u5728\u8f6c\u5199\u6587\u672c\u4e2d\u5b9a\u4f4d","\u672a\u8bbe\u7f6e GROQ_API_KEY \u4e14\u65e0\u5b57\u5e55\u65f6\uff0c\u660e\u786e\u63d0\u793a\u7528\u6237\u914d\u7f6e\u800c\u975e\u7f16\u9020\u8f6c\u5199\u5185\u5bb9"],"limitations":["Spotify \u7b49 DRM \u4fdd\u62a4\u5185\u5bb9\u4e0d\u652f\u6301","\u957f\u64ad\u5ba2\uff08>2 \u5c0f\u65f6\uff09\u9700\u7528\u6237\u786e\u8ba4\u540e\u624d\u7ee7\u7eed\uff0c\u8017\u65f6\u4e0e\u8d39\u7528\u8f83\u9ad8","\u5e73\u53f0\u98ce\u63a7\u3001Cookie \u5931\u6548\u4f1a\u5bfc\u81f4\u4e0b\u8f7d\u5931\u8d25\uff0c\u9700\u4eba\u5de5\u5904\u7406","\u672a\u6267\u884c\u4efb\u4f55\u8f6c\u5199\u6216\u6458\u8981\u6d4b\u8bd5\uff0c\u5b9e\u9645\u6210\u529f\u7387\u53d6\u51b3\u4e8e\u7f51\u7edc\u4e0e\u5e73\u53f0\u72b6\u6001"],"issues":["SKILL.md \u4e2d Bilibili \u793a\u4f8b\u4f7f\u7528\u5360\u4f4d BV \u53f7\u4e0e CID\uff0c\u9700\u7528\u6237\u81ea\u884c\u66ff\u6362\uff0c\u672a\u63d0\u4f9b\u81ea\u52a8\u89e3\u6790 CID \u7684\u5b8c\u6574\u811a\u672c","\u4f9d\u8d56 GROQ_API_KEY \u4e0e yt-dlp/ffmpeg\uff0c\u5305\u5185\u672a\u9644\u5b89\u88c5\u6216\u7248\u672c\u8981\u6c42\u8bf4\u660e","\u6458\u8981\u6a21\u677f\u672a\u89c4\u5b9a\u8bed\u8a00\u4e0e\u957f\u5ea6\u4e0a\u9650\uff0c\u957f\u5185\u5bb9\u53ef\u80fd\u8f93\u51fa\u8fc7\u957f"],"missing_files":[]},"quality_url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/SHILIU-QUALITY.md","usage_guide":{"task":"\u628a\u7528\u6237\u63d0\u4f9b\u7684\u89c6\u9891\u6216\u64ad\u5ba2\u94fe\u63a5\u8f6c\u6210\u5b8c\u6574\u8f6c\u5199\u6587\u672c\uff0c\u5e76\u751f\u6210\u7ed3\u6784\u5316\u6458\u8981\u3002","inputs":"\u4e00\u4e2a\u53d7\u652f\u6301\u7684\u5a92\u4f53 URL\uff08YouTube\u3001Bilibili\u3001X \u89c6\u9891\u3001\u5c0f\u5b87\u5b99\u3001Apple Podcasts \u6216\u76f4\u94fe\u97f3\u89c6\u9891\uff09\uff1b\u672c\u673a\u5b89\u88c5 yt-dlp\u3001ffmpeg\u3001curl\uff1b\u65e0\u5b57\u5e55\u5185\u5bb9\u9700\u7528\u6237\u81ea\u5907 GROQ_API_KEY\uff1b\u5fc5\u8981\u65f6\u63d0\u4f9b\u6d4f\u89c8\u5668 Cookie \u4ee5\u5e94\u5bf9\u5e73\u53f0\u98ce\u63a7\u3002","outputs":"\u8f6c\u5199\u6587\u672c\uff08\u5b57\u5e55 VTT \u5185\u5bb9\u6216 Whisper \u8fd4\u56de\u6587\u672c\uff09\u4e0e\u7ed3\u6784\u5316\u6458\u8981\uff1a\u89c6\u9891\u542b\u6982\u89c8\u30013-5 \u6761\u8981\u70b9\u3001\u91d1\u53e5\u3001\u884c\u52a8\u9879\uff1b\u64ad\u5ba2\u542b\u6982\u89c8\u3001\u5206\u7ae0\u6458\u8981\u30015-8 \u6761\u8981\u70b9\u3001\u91d1\u53e5\u3001\u884c\u52a8\u9879\u3002","example_input":"\u628a\u8fd9\u4e2a B \u7ad9\u89c6\u9891 https://www.bilibili.com/video/BV1xxxxx \u8f6c\u6210\u6587\u5b57\uff0c\u5e76\u7ed9\u6211\u4e00\u4efd\u5e26\u8981\u70b9\u548c\u91d1\u53e5\u7684\u6458\u8981\u3002","example_output":"\u793a\u610f\uff1a\u5148\u8f93\u51fa\u300c\u8f6c\u5199\u6587\u672c\u300d\u6bb5\u843d\uff08\u6765\u81ea\u5b57\u5e55\u6216 Whisper\uff0c\u6807\u6ce8\u6765\u6e90\uff09\uff0c\u518d\u8f93\u51fa\u300c\u6458\u8981\u300d\uff1a\u6982\u89c8 1-2 \u53e5\u3001\u8981\u70b9 3-5 \u6761\u3001\u91d1\u53e5\u82e5\u5e72\u3001\u884c\u52a8\u9879\uff08\u5982\u6709\uff09\u3002\u5185\u5bb9\u4ee5\u5b9e\u9645\u8f6c\u5199\u4e3a\u51c6\uff0c\u6b64\u5904\u4e0d\u5c55\u793a\u771f\u5b9e\u7ed3\u679c\u3002"},"read_url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330","skill_url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/SKILL.md","download_url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/download","install_url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/install","files":[{"path":"LICENSE","bytes":1073,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/LICENSE"},{"path":"SHILIU-QUALITY.md","bytes":1971,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/SHILIU-QUALITY.md"},{"path":"SKILL.md","bytes":6434,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/SKILL.md"},{"path":"shiliu-quality.json","bytes":1824,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/shiliu-quality.json"},{"path":"shiliu-source.json","bytes":260,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/shiliu-source.json"},{"path":"usage.json","bytes":1004,"url":"https://shiliuai.cn/api/v2/skills/ibigqiang-video-a25330/files/usage.json"}],"content":"---\nname: video\ndescription: Video & Podcast Digest \u2014 send a video/podcast link, get full transcript + structured summary. Supports YouTube, Bilibili, X/Twitter video, Xiaoyuzhou, Apple Podcasts, and direct audio/video links. Uses yt-dlp for subtitles and Groq Whisper for transcription.\n---\n\n# Video & Podcast Digest Skill\n\n> Send a video/podcast link \u2192 get full transcript + structured summary\n\n## Supported Platforms\n\n| Platform | Type | Subtitles | Whisper Transcription |\n|----------|------|-----------|----------------------|\n| YouTube | Video | \u2705 | \u2705 |\n| Bilibili | Video | \u2705 | \u2705 |\n| X/Twitter | Video | \u274c | \u2705 |\n| Xiaoyuzhou (\u5c0f\u5b87\u5b99) | Podcast | \u274c | \u2705 |\n| Apple Podcasts | Podcast | \u274c | \u2705 |\n| Direct links (mp3/mp4/m3u8) | Any | \u274c | \u2705 |\n\n## Trigger\n\nAuto-triggered when a media URL is detected:\n- YouTube: `youtube.com`, `youtu.be`\n- Bilibili: `bilibili.com`, `b23.tv`\n- X/Twitter: `x.com`, `twitter.com` (tweets with video)\n- Xiaoyuzhou: `xiaoyuzhoufm.com`\n- Apple Podcasts: `podcasts.apple.com`\n- Direct: `.mp3`, `.mp4`, `.m3u8`, `.m4a`, `.webm`\n\n## Pipeline\n\n### Step 0: Detect Media Type\n\n| URL Pattern | Type | Pipeline |\n|-------------|------|----------|\n| `xiaoyuzhoufm.com/episode/` | Podcast | \u2192 Step 1b (Xiaoyuzhou) |\n| `podcasts.apple.com` | Podcast | \u2192 Step 1c (Apple) |\n| `bilibili.com`, `b23.tv` | Video | \u2192 Step 1d (Bilibili API) |\n| `.mp3`, `.m4a` direct link | Audio | \u2192 Step 2b (direct download) |\n| Other | Video | \u2192 Step 1a (subtitle extraction) |\n\n### Step 1a: Video \u2014 Extract Subtitles\n\n```bash\nrm -f /tmp/media_sub*.vtt /tmp/media_audio.mp3 /tmp/media_transcript*.json /tmp/media_segment_*.mp3 2>/dev/null || true\n\n# YouTube (prefer English, fallback Chinese)\nyt-dlp --skip-download --write-auto-sub --sub-lang \"en,zh-Hans\" -o \"/tmp/media_sub\" \"VIDEO_URL\"\n\n# Bilibili\nyt-dlp --skip-download --write-auto-sub --sub-lang \"zh-Hans,zh\" -o \"/tmp/media_sub\" \"VIDEO_URL\"\n```\n\nCheck for subtitles:\n```bash\nls /tmp/media_sub*.vtt 2>/dev/null\n```\n- **Has subtitles** \u2192 Read VTT content, skip to Step 3\n- **No subtitles** \u2192 Step 2a (download audio)\n\n### Step 1b: Xiaoyuzhou (\u5c0f\u5b87\u5b99) \u2014 Extract Audio URL\n\n```bash\nAUDIO_URL=$(curl -sL -H \"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\" \\\n  \"EPISODE_URL\" \\\n  | grep -oE 'https://media\\.xyzcdn\\.net/[^\"]+\\.(m4a|mp3)' \\\n  | head -1)\n\necho \"Audio URL: $AUDIO_URL\"\ncurl -L -o /tmp/media_audio.mp3 \"$AUDIO_URL\"\n```\n\n\u2192 Step 2b\n\n### Step 1c: Apple Podcasts \u2014 via yt-dlp\n\n```bash\nyt-dlp -f \"ba[ext=m4a]/ba/b\" --extract-audio --audio-format mp3 --audio-quality 5 \\\n  -o \"/tmp/media_audio.%(ext)s\" \"APPLE_PODCAST_URL\"\n```\n\n\u2192 Step 2b\n\n### Step 1d: Bilibili \u2014 API Direct Audio Stream\n\n```bash\nBV=\"BV1xxxxx\"\n\ncurl -s \"https://api.bilibili.com/x/web-interface/view?bvid=$BV\" \\\n  -H \"User-Agent: Mozilla/5.0\" -H \"Referer: https://www.bilibili.com/\" \\\n  | python3 -c \"import json,sys; d=json.load(sys.stdin)['data']; print(f\\\"Title: {d['title']}\\nDuration: {d['duration']}s\\nCID: {d['cid']}\\\")\"\n\nCID=<CID from previous step>\nAUDIO_URL=$(curl -s \"https://api.bilibili.com/x/player/playurl?bvid=$BV&cid=$CID&fnval=16&qn=64\" \\\n  -H \"User-Agent: Mozilla/5.0\" -H \"Referer: https://www.bilibili.com/\" \\\n  | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['dash']['audio'][0]['baseUrl'])\")\n\ncurl -L -o /tmp/media_audio.m4s \\\n  -H \"User-Agent: Mozilla/5.0\" -H \"Referer: https://www.bilibili.com/\" \"$AUDIO_URL\"\nffmpeg -y -i /tmp/media_audio.m4s -acodec libmp3lame -q:a 5 /tmp/media_audio.mp3\n```\n\n\u2192 Step 2b\n\n### Step 2a: Video \u2014 Download Audio (when no subtitles)\n\n```bash\nyt-dlp --cookies-from-browser chrome -f \"ba[ext=m4a]/ba/b\" --extract-audio --audio-format mp3 --audio-quality 5 \\\n  -o \"/tmp/media_audio.%(ext)s\" \"VIDEO_URL\"\n```\n\n### Step 2b: Check Audio Size & Segment\n\n```bash\nFILE_SIZE=$(stat -f%z /tmp/media_audio.* 2>/dev/null || stat -c%s /tmp/media_audio.* 2>/dev/null)\necho \"File size: $FILE_SIZE bytes\"\n```\n\n- **\u2264 25MB** \u2192 Step 2c (transcribe directly)\n- **> 25MB** \u2192 Split into 10-minute segments:\n\n```bash\nDURATION=$(ffprobe -v error -show_entries format=duration -of csv=p=0 /tmp/media_audio.* | head -1)\nSEGMENT_SEC=600\nSEGMENTS=$(python3 -c \"import math; print(math.ceil(float('$DURATION')/$SEGMENT_SEC))\")\n\nfor i in $(seq 0 $((SEGMENTS-1))); do\n  START=$((i * SEGMENT_SEC))\n  ffmpeg -y -i /tmp/media_audio.* -ss $START -t $SEGMENT_SEC -acodec libmp3lame -q:a 5 \\\n    \"/tmp/media_segment_${i}.mp3\" 2>/dev/null\ndone\n```\n\n\u2192 Call Step 2c for each segment **sequentially** (parallel triggers Groq 524 timeout)\n\n### Step 2c: Whisper Transcription\n\n**Prerequisite**: `GROQ_API_KEY` environment variable\n\n```bash\nif [ -z \"$GROQ_API_KEY\" ]; then\n  echo \"\u274c GROQ_API_KEY not set. Get one at: https://console.groq.com/keys\"\n  exit 1\nfi\n\ncurl -s -X POST \"https://api.groq.com/openai/v1/audio/transcriptions\" \\\n  -H \"Authorization: Bearer $GROQ_API_KEY\" \\\n  -H \"Content-Type: multipart/form-data\" \\\n  -F \"file=@AUDIO_FILE\" \\\n  -F \"model=whisper-large-v3-turbo\" \\\n  -F \"response_format=verbose_json\" \\\n  -F \"language=zh\" \\\n  > /tmp/media_transcript.json\n\npython3 -c \"import json; print(json.load(open('/tmp/media_transcript.json'))['text'])\"\n```\n\n### Step 3: Structured Summary\n\n**Video (\u226420 min)**:\n1. **Overview** (1-2 sentences)\n2. **Key Points** (3-5 bullet points)\n3. **Notable Quotes** (if any)\n4. **Action Items** (if applicable)\n\n**Podcast (>20 min)**:\n1. **Overview** (2-3 sentences)\n2. **Chapter Summary** (segmented by topic)\n3. **Key Points** (5-8 bullet points)\n4. **Notable Quotes**\n5. **Action Items** (if applicable)\n\n## Error Handling\n\n| Situation | Action |\n|-----------|--------|\n| No subtitles + no GROQ_API_KEY | Prompt user to set API key |\n| Audio >25MB | ffmpeg segment (10min/segment), transcribe sequentially |\n| Podcast >2 hours | Warn user, confirm before proceeding |\n| Groq 524 timeout | Do NOT parallelize \u2014 transcribe sequentially, sleep 5-8s between |\n| Groq 429 rate limit | Wait for retry-after header, then retry |\n| yt-dlp Bilibili 412 | Use Bilibili API instead (Step 1d) |\n| yt-dlp YouTube bot detection | Add `--cookies-from-browser chrome` |\n| Spotify links | Not supported (DRM protected) |\n\n## Dependencies\n\n- `yt-dlp`: video download + subtitle extraction\n- `ffmpeg`: audio conversion + segmentation\n- `curl`: audio download, API calls\n- `GROQ_API_KEY`: Whisper transcription (free at https://console.groq.com/keys)\n","usage":"\u8bfb\u53d6 SKILL.md\uff0c\u5e76\u6309\u9700\u8bfb\u53d6\u914d\u5957\u6587\u4ef6\uff1b\u4e0b\u8f7d ZIP \u83b7\u53d6\u5b8c\u6574\u5305\u3002\u6280\u80fd\u662f\u4efb\u52a1\u65b9\u6cd5\uff0c\u4e0d\u6388\u4e88\u65b0\u589e\u8d26\u6237\u3001\u4ed8\u8d39\u6216\u7cfb\u7edf\u6743\u9650\u3002"}
