
Douyin Video Summary
- 1.7k installs
- 1 repo stars
- Updated February 10, 2026
- liu-wei-ai/douyin-video-summary
Automated extraction and summarization of Douyin video content into structured, searchable markdown using local speech-to-text and AI synthesis.
About
This skill automates Douyin video summarization by parsing share links, intercepting audio via browser, converting to WAV, transcribing Chinese speech with whisper.cpp, and generating structured markdown summaries. Supports optional sync to Feishu documents. Handles Douyin CDN restrictions by using curl with Referer headers instead of direct downloaders. Ideal for content teams, researchers, and developers monitoring Chinese social platforms. Apple Silicon GPU acceleration is automatic. Transcription quality balances speed and accuracy with the small GGML model. Cleans up intermediate files post-processing.
- Browser-based audio interception to bypass Douyin CDN 403 blocks
- Local whisper.cpp transcription with Metal GPU acceleration on Apple Silicon
- Structured markdown summary generation with core insights and takeaways
- Optional Feishu doc sync via Open API integration
- Handles both short links (v.douyin.com) and direct video URLs
Douyin Video Summary by the numbers
- 1,718 all-time installs (skills.sh)
- +27 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #203 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/liu-wei-ai/douyin-video-summary --skill douyin-video-summaryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.7k |
|---|---|
| repo stars | ★ 1 |
| Security audit | 1 / 3 scanners passed |
| Last updated | February 10, 2026 |
| Repository | liu-wei-ai/douyin-video-summary ↗ |
What it does
Extract, transcribe, and summarize Douyin videos locally using whisper.cpp with optional Feishu sync.
Who is it for?
Content monitoring, research automation, multilingual video archives, teams analyzing Chinese social media, knowledge workers curating video insights.
Skip if: Real-time streaming, high-volume commercial redistribution, users without whisper.cpp/ffmpeg, environments blocking browser automation.
When should I use this skill?
User shares Douyin URL, batch video analysis requested, content sync to documentation platform needed, Chinese speech transcription required.
What you get
Developer gains repeatable workflow to convert video URLs into indexed, shareable summaries with full transcription history and optional knowledge base integration.
- structured text summary
- local transcript
- optional Feithu doc sync
By the numbers
- Recommends the whisper.cpp ggml-small.bin model for speed and quality balance
Files
Douyin Video Summary
Summarize Douyin videos: extract audio → transcribe locally → AI summary.
Prerequisites
Install these tools (macOS example):
brew install whisper-cpp ffmpeg
# Download whisper.cpp GGML model (small recommended for speed/quality balance)
curl -L -o models/ggml-small.bin "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin"Workflow
When a Douyin link is received:
Step 1: Extract Video ID
Parse the Douyin URL to get the video ID. Douyin share links come in two formats:
- Short link:
https://v.douyin.com/xxxxx/→ follow redirect to get video ID - Direct link:
https://www.douyin.com/video/7604713801732365681
# Follow redirect to get final URL, extract numeric video ID
curl -sL -o /dev/null -w '%{url_effective}' 'https://v.douyin.com/xxxxx/' | grep -oE '[0-9]{15,}'Step 2: Get Audio via Browser
Douyin blocks direct downloads (yt-dlp, aria2c all get 403). Use the browser to intercept the audio URL:
1. Open the Douyin video page in the browser 2. Inject JS to intercept network requests before navigation:
window.__audioUrls = [];
const origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
if (url && (url.includes('.mp3') || url.includes('.m4a') || url.includes('mime_type=audio'))) {
window.__audioUrls.push(url);
}
return origOpen.apply(this, arguments);
};3. Navigate to the video page, click play to trigger audio loading 4. Retrieve intercepted URLs: window.__audioUrls 5. Download with curl (Referer header required):
curl -H "Referer: https://www.douyin.com/" -o audio.mp4 "<audio_url>"Important: aria2c will 403 on Douyin CDN URLs. Always use curl with the Referer header.
Step 3: Convert to WAV
ffmpeg -i audio.mp4 -ar 16000 -ac 1 -c:a pcm_s16le audio.wavStep 4: Transcribe with whisper.cpp
whisper-cli -m /path/to/ggml-small.bin -l zh -f audio.wav -otxt -of output- Use
-l zhfor Chinese content (auto-detect if unsure) - Apple Silicon GPU acceleration is automatic (Metal)
- Performance: ~20s for 5min audio on M4
Step 5: Generate Summary
Read the transcription text and produce a structured summary:
📹 **[Video Title] | [Author]**
时长:X分X秒 | 发布:YYYY-MM-DD
🎯 **核心观点:[one-line core message]**
**1. [Point 1 title]**
• [detail]
• [detail]
**2. [Point 2 title]**
• [detail]
💬 **一句话总结:[concise takeaway]**Step 6 (Optional): Sync to Feishu Doc
If Feishu integration is configured, append the summary to a Feishu document using the Feishu Open API. See references/feishu-sync.md for the API details.
Tips
- For short videos (<1min), the summary may be very brief — that's fine
- If browser interception fails, retry once; Douyin pages sometimes need a second load
- Clean up downloaded audio/wav files after processing to save disk space
- whisper.cpp
smallmodel is the best speed/quality tradeoff;mediummay OOM on 8GB machines
Feishu (Lark) Document Sync
Sync video summaries to a Feishu document using the Open API.
Authentication
Get tenant access token:
curl -X POST 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal' \
-H 'Content-Type: application/json' \
-d '{"app_id":"YOUR_APP_ID","app_secret":"YOUR_APP_SECRET"}'Document Structure
Use heading levels for auto-generated sidebar navigation:
- H1 (block_type: 3): Date category (e.g., "2026-02-09")
- H2 (block_type: 4): Video title (e.g., "大哥的亲子教育 | 童年录播姬")
- Text (block_type: 2): Summary content
- Divider (block_type: 22): Between videos
Append Content
POST to /open-apis/docx/v1/documents/{doc_id}/blocks/{doc_id}/children:
{
"children": [
{
"block_type": 4,
"heading2": {
"elements": [{"text_run": {"content": "Video Title | Author"}}]
}
},
{
"block_type": 2,
"text": {
"elements": [{"text_run": {"content": "Summary text", "text_element_style": {"bold": false}}}],
"style": {"align": 1}
}
}
],
"index": -1
}Delete Blocks
Batch delete by index range:
DELETE /open-apis/docx/v1/documents/{doc_id}/blocks/{doc_id}/children/batch_delete
Body: {"start_index": 0, "end_index": N}Required Permissions
docx:document— read/write documentsdrive:drive— manage file permissions (optional, for sharing)
Tips
- Write in batches of 5-8 blocks to avoid API errors
- Add
time.sleep(0.8)between batches for rate limiting - Use
document_revision_id: -1for latest revision when deleting - Bold text: set
"bold": trueintext_element_style
#!/bin/bash
# Extract audio from a Douyin video URL using curl with Referer header
# Usage: download_audio.sh <audio_direct_url> <output_file>
# Note: The audio URL must be obtained via browser interception (see SKILL.md Step 2)
set -euo pipefail
AUDIO_URL="${1:?Usage: download_audio.sh <audio_url> <output_file>}"
OUTPUT="${2:?Usage: download_audio.sh <audio_url> <output_file>}"
echo "Downloading audio..."
curl -sS -H "Referer: https://www.douyin.com/" -o "$OUTPUT" "$AUDIO_URL"
SIZE=$(stat -f%z "$OUTPUT" 2>/dev/null || stat -c%s "$OUTPUT" 2>/dev/null)
echo "Done: $OUTPUT ($(echo "scale=1; $SIZE/1024/1024" | bc)MB)"
#!/bin/bash
# Transcribe audio using whisper.cpp
# Usage: transcribe.sh <input_audio> <output_prefix> [model_path] [language]
# Converts to WAV if needed, then runs whisper-cli
set -euo pipefail
INPUT="${1:?Usage: transcribe.sh <input_audio> <output_prefix> [model_path] [language]}"
OUTPUT_PREFIX="${2:?Usage: transcribe.sh <input_audio> <output_prefix> [model_path] [language]}"
MODEL="${3:-models/ggml-small.bin}"
LANG="${4:-zh}"
WAV_FILE="${OUTPUT_PREFIX}.wav"
# Convert to 16kHz mono WAV
echo "Converting to WAV..."
ffmpeg -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "$WAV_FILE" 2>/dev/null
DURATION=$(ffprobe -i "$WAV_FILE" -show_entries format=duration -v quiet -of csv="p=0" | cut -d. -f1)
echo "Audio duration: ${DURATION}s"
# Transcribe
echo "Transcribing with whisper.cpp (model: $(basename $MODEL), lang: $LANG)..."
time whisper-cli -m "$MODEL" -l "$LANG" -f "$WAV_FILE" -otxt -of "$OUTPUT_PREFIX" 2>&1 | tail -5
echo "Output: ${OUTPUT_PREFIX}.txt"
Related skills
How it compares
Choose Douyin Video Summary over generic summarization skills when the input is specifically a Douyin link and local whisper.cpp transcription is required.
FAQ
What tools does Douyin Video Summary require?
Douyin Video Summary requires whisper-cpp and ffmpeg installed locally (macOS example uses brew), plus a downloaded whisper.cpp GGML model such as ggml-small.bin from Hugging Face for speed and quality balance.
Which Douyin URL formats trigger Douyin Video Summary?
Douyin Video Summary activates on shared Douyin links matching v.douyin.com short URLs or douyin.com/video/ page URLs when a user wants a text summary or transcript of the video.
Is Douyin Video Summary safe to install?
skills.sh reports 1 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.