advanced-video-downloader
Advanced Video Downloader
Overview
This skill provides comprehensive video downloading and transcription capabilities from 1000+ platforms including YouTube, Bilibili, TikTok, Twitter, Instagram, and more. It combines:
- yt-dlp: Powerful video downloading tool
- SiliconFlow API: Free AI-powered transcription to convert videos to Markdown
When to Use This Skill
Activate this skill when the user:
- Explicitly requests to download a video ("download this video", "下载视频")
- Provides video URLs from any platform
- Mentions saving videos for offline viewing
- Wants to extract audio from videos
- Needs to download multiple videos or playlists
- Asks about video quality options
- Requests video transcription ("转录视频", "提取字幕", "视频转文字")
- Wants to convert video/audio to text or Markdown
- Asks to download AND transcribe a video in one workflow
- Requests to search and download videos from Twitter/X ("在Twitter上搜XXX下载视频", "twitter下载视频")
- Wants to batch download videos from social media platforms (批量下载Twitter视频)
- Needs to download Twitter videos using cookies (requires cookies.txt for authentication)
Core Capabilities
1. Single Video Download
Download individual videos from any supported platform with automatic quality selection.
Example usage:
User: "Download this YouTube video: https://youtube.com/watch?v=abc123"
User: "下载这个B站视频: https://bilibili.com/video/BV1xxx"
2. Batch & Playlist Download
Download multiple videos or entire playlists at once.
Example usage:
User: "Download all videos from this playlist"
User: "Download these 3 videos: [URL1], [URL2], [URL3]"
User: "在Twitter上搜wataa,下载3个视频"
Twitter/X Search & Batch Download Workflow:
Twitter/X requires authentication (cookies) to search and download videos. Follow these steps:
# 1. Get cookies.txt file (see "Getting Twitter Cookies" below)
# Required cookies: auth_token, ct0, twid
# 2. Use the bundled script to search and download
python scripts/twitter_video_downloader.py --search "KEYWORD" --count 5 --cookies cookies.txt
# Or with quality limit (recommended for large videos)
python scripts/twitter_video_downloader.py --search "KEYWORD" --count 5 --cookies cookies.txt --quality 720
# 3. Or manually batch download extracted URLs
yt-dlp --cookies cookies.txt \
-f "bestvideo[height<=720][ext=mp4]+bestaudio[ext=m4a]/best[height<=720][ext=mp4]/best" \
--merge-output-format mp4 \
-o "%(title)s.%(ext)s" \
"URL1" "URL2" "URL3"
Getting Twitter Cookies:
- Install browser extension "Get cookies.txt LOCALLY"
- Log in to Twitter/X in your browser
- Click the extension icon and export cookies
- Save as
cookies.txtin Netscape format
Note: Without valid cookies, Twitter/X search will return no results and downloads will fail.
3. Audio Extraction
Extract audio only from videos, saving as MP3 or M4A.
Example usage:
User: "Download only the audio from this video"
User: "Convert this video to MP3"
4. Quality Selection
Choose specific video quality (4K, 1080p, 720p, etc.).
Example usage:
User: "Download in 4K quality"
User: "Get the 720p version to save space"
5. Video/Audio Transcription
Convert video or audio files to Markdown text using SiliconFlow's free AI transcription API.
Example usage:
User: "Transcribe this video to text" / "转录这个视频"
User: "Download and transcribe this YouTube video"
User: "将这个音频转成文字"
User: "Extract transcript from this MP4 file"
Supported formats:
- Audio: MP3, WAV, M4A, FLAC, AAC, OGG, OPUS, WMA
- Video: MP4, AVI, MOV, MKV, FLV, WMV, WEBM, M4V
Response Pattern
When a user requests video download:
Step 1: Identify the Platform and URL(s)
# Extract video URL(s) from user message
# Identify platform: YouTube, Bilibili, TikTok, etc.
Step 2: Check Tool Availability
# Check if yt-dlp is installed
yt-dlp --version
Step 3: Select Appropriate yt-dlp Command
Based on platform and requirements:
- YouTube, Twitter, Instagram, TikTok: Basic command works
- Bilibili: Basic command works for most videos
- Quality selection: Use
-fwith height filter - Audio only: Use
-x --audio-format mp3 - Playlists: Use playlist-specific output template
Step 4: Execute Download
Use yt-dlp directly with appropriate options:
# Basic download (best quality MP4)
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --merge-output-format mp4 -o "%(title)s.%(ext)s" "VIDEO_URL"
# Specific quality (1080p)
yt-dlp -f "bestvideo[height<=1080]+bestaudio/best[height<=1080]" --merge-output-format mp4 -o "%(title)s.%(ext)s" "VIDEO_URL"
# Audio only (MP3)
yt-dlp -x --audio-format mp3 -o "%(title)s.%(ext)s" "VIDEO_URL"
# With cookies file (for protected content)
yt-dlp --cookies cookies.txt -o "%(title)s.%(ext)s" "VIDEO_URL"
# Playlist download
yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "PLAYLIST_URL"
Step 5: Report Results
After download completes, report:
- ✅ Video title and duration
- ✅ File size and format
- ✅ Save location
- ✅ Download speed and time taken
- ⚠️ Any warnings or quality limitations
Example output:
✅ Downloaded: "Video Title Here"
Duration: 15:30
Quality: 1080p MP4
Size: 234 MB
Location: ./Video Title Here.mp4
Time: 45 seconds at 5.2 MB/s
Transcription Response Pattern
When a user requests video/audio transcription:
Step 1: Check Prerequisites
# Verify SiliconFlow API key is available
echo $SILICONFLOW_API_KEY
# Or user must provide via --api-key parameter
API Key Setup:
- Get free API key from: https://cloud.siliconflow.cn/account/ak
- Copy
.env.exampleto.envand add your API key - Or set environment variable:
SILICONFLOW_API_KEY=sk-xxx
Step 2: Validate File
Ensure the file exists and is a supported format (audio or video).
Step 3: Execute Transcription
Use the bundled script scripts/transcribe_siliconflow.py:
# Basic transcription
python scripts/transcribe_siliconflow.py --file video.mp4 --api-key sk-xxx
# With custom output path
python scripts/transcribe_siliconflow.py --file audio.mp3 --output transcript.md --api-key sk-xxx
# Using environment variable for API key
python scripts/transcribe_siliconflow.py --file video.mp4
Step 4: Report Transcription Results
✅ Transcription complete!
File: video.mp4
Output: 2025-01-15-video.md
Size: 12.5 KB
Preview:
--------------------------------------------------
[First 200 characters of transcription...]
--------------------------------------------------
Combined Workflow: Download + Transcribe
For requests like "Download and transcribe this video":
# Step 1: Download video
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best" --merge-output-format mp4 -o "%(title)s.%(ext)s" "VIDEO_URL"
# Step 2: Transcribe the downloaded file
python scripts/transcribe_siliconflow.py --file "Downloaded Video Title.mp4" --api-key sk-xxx
Platform-Specific Notes
YouTube
- Fully supported by yt-dlp
- No authentication needed for public videos
- Supports all quality levels including 4K/8K
Bilibili
- Supported by yt-dlp
- High-quality downloads may require login cookies
- Use
--cookieswith cookies.txt for member-only content
Twitter/X
- Search & Download Workflow: For downloading multiple videos from search results
- Use Playwright to search with cookies authentication
- Extract video URLs from search results
- Batch download using yt-dlp with cookies
Important: Twitter/X requires authentication (cookies) to search videos. Without cookies, search will return no results.
Quick Start - Using the bundled script:
# Search and download 5 videos with cookies
python scripts/twitter_video_downloader.py --search "KEYWORD" --count 5 --cookies cookies.txt
# With quality limit (720p)
python scripts/twitter_video_downloader.py --search "KEYWORD" --count 5 --cookies cookies.txt --quality 720
Manual Workflow Example:
# Step 1: Search and extract URLs using Playwright with cookies
from playwright.sync_api import sync_playwright
def search_twitter_videos(keyword, cookies_file, count=5):
# Read cookies from Netscape format file
cookies = []
with open(cookies_file, "r") as f:
for line in f:
line = line.strip()
if line.startswith("#") or not line:
continue
parts = line.split("\t")
if len(parts) >= 7:
cookies.append({
"domain": parts[0],
"path": parts[2],
"secure": parts[3] == "TRUE",
"expires": int(parts[4]) if parts[4].isdigit() else None,
"name": parts[5],
"value": parts[6],
"httpOnly": parts[0].startswith("#HttpOnly"),
})
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
context.add_cookies(cookies) # Add auth cookies
page = context.new_page()
page.goto(f"https://x.com/search?q={keyword}&f=video", wait_until="domcontentloaded")
page.wait_for_timeout(8000)
# Extract video URLs
video_links = page.evaluate("""() => {
const links = [];
document.querySelectorAll('article').forEach(article => {
const hasVideo = article.querySelector('[data-testid="videoPlayer"]') ||
article.querySelector('video');
if (hasVideo) {
const timeLink = article.querySelector('time');
if (timeLink) {
const link = timeLink.closest('a');
if (link && link.href) links.push(link.href);
}
}
});
return links.slice(0, """ + str(count) + """);
}""")
browser.close()
return video_links
# Step 2: Download with yt-dlp using cookies
# yt-dlp --cookies cookies.txt -f "bestvideo[height<=720][ext=mp4]+bestaudio[ext=m4a]/best" \
# --merge-output-format mp4 -o "%(title)s.%(ext)s" "URL1" "URL2" ...
Required Twitter Cookies:
auth_token- Authentication tokenct0- CSRF tokentwid- User ID
Get these by exporting cookies from your browser after logging into Twitter/X.
Other Platforms
- Most platforms work well with yt-dlp
- Check
references/supported_platforms.mdfor full list
Handling Cookies for Protected Content
For platforms requiring authentication (Bilibili VIP, member-only content, etc.):
Method 1: Export Cookies File (Recommended)
# Use browser extension "Get cookies.txt LOCALLY"
# Export cookies.txt, then:
yt-dlp --cookies cookies.txt "VIDEO_URL"
Method 2: Manual Cookies File
# Create cookies.txt in Netscape format
# Use browser extension "Get cookies.txt LOCALLY"
# Then use with yt-dlp
yt-dlp --cookies cookies.txt "VIDEO_URL"
Troubleshooting
Issue: Video quality lower than expected
Solution:
- Check if platform requires login for HD
- Use
--cookies cookies.txtfor authenticated access - Explicitly specify quality with
-fparameter
Issue: Download very slow
Solution:
- Check internet connection
- Try different time of day (peak hours affect speed)
- Use
--concurrent-fragmentsfor faster downloads
Issue: "Video unavailable" or geo-restricted
Solution:
- Video may be region-locked
- Use proxy/VPN if legally permitted
- Check if video is still available on platform
Issue: Transcription API key error
Solution:
- Verify API key starts with
sk- - Get free key from: https://cloud.siliconflow.cn/account/ak
- Set environment variable:
SILICONFLOW_API_KEY=sk-xxx
Issue: Transcription returns empty text
Solution:
- Check if audio/video has clear speech
- Verify file format is supported
- File may be too short or contain only music
Common Commands
Quality Presets
# 4K (2160p)
yt-dlp -f "bestvideo[height<=2160]+bestaudio/best[height<=2160]" --merge-output-format mp4 "VIDEO_URL"
# 1080p (Full HD)
yt-dlp -f "bestvideo[height<=1080]+bestaudio/best[height<=1080]" --merge-output-format mp4 "VIDEO_URL"
# 720p (HD)
yt-dlp -f "bestvideo[height<=720]+bestaudio/best[height<=720]" --merge-output-format mp4 "VIDEO_URL"
# 480p (SD)
yt-dlp -f "bestvideo[height<=480]+bestaudio/best[height<=480]" --merge-output-format mp4 "VIDEO_URL"
Audio Extraction
# Extract as MP3
yt-dlp -x --audio-format mp3 -o "%(title)s.%(ext)s" "VIDEO_URL"
# Extract as M4A (better quality)
yt-dlp -x --audio-format m4a -o "%(title)s.%(ext)s" "VIDEO_URL"
Batch Downloads
# Download multiple URLs from file
yt-dlp -a urls.txt
# Download playlist with custom naming
yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "PLAYLIST_URL"
# Download channel's videos
yt-dlp -o "%(uploader)s/%(title)s.%(ext)s" "CHANNEL_URL"
Bundled Resources
Configuration
.env.example
Template for environment variables. Copy to .env and add your SiliconFlow API key.
Scripts
scripts/transcribe_siliconflow.py
AI-powered transcription script using SiliconFlow's free API.
Usage:
python scripts/transcribe_siliconflow.py --file <audio/video> [--api-key <key>] [--output <path>]
Parameters:
--file, -f: Input audio/video file (required)--api-key, -k: SiliconFlow API key (or useSILICONFLOW_API_KEYenv var)--output, -o: Output markdown file path (default:YYYY-MM-DD-filename.md)--model, -m: Model to use (default:FunAudioLLM/SenseVoiceSmall)
scripts/twitter_video_downloader.py
Search and download videos from Twitter/X in batch.
Prerequisites:
pip install playwright
playwright install chromium
Usage:
# Search and download videos
python scripts/twitter_video_downloader.py --search "KEYWORD" --count 3 --cookies cookies.txt
# Download specific URLs
python scripts/twitter_video_downloader.py --urls "URL1,URL2,URL3" --cookies cookies.txt
Parameters:
--search, -s: Search keyword for Twitter/X videos--urls, -u: Comma-separated list of video URLs to download--cookies, -c: Path to cookies.txt file (required)--count, -n: Number of videos to download from search (default: 3)--output, -o: Output filename template (default:%(title)s.%(ext)s)--quality, -q: Maximum video height, e.g., 720 for 720p (optional)
Getting Twitter Cookies:
- Install browser extension "Get cookies.txt LOCALLY"
- Log in to Twitter/X in your browser
- Click the extension icon and export cookies
- Save as
cookies.txtin Netscape format
Example Workflow:
# Download 5 videos from Twitter search with quality limit
python scripts/twitter_video_downloader.py --search "wataa" --count 5 --cookies cookies.txt --quality 720
# Download specific Twitter videos
python scripts/twitter_video_downloader.py --urls "https://x.com/user/status/123,https://x.com/user/status/456" --cookies cookies.txt
References
references/supported_platforms.md
Comprehensive list of 1000+ supported platforms with platform-specific notes and requirements.
references/quality_formats.md
Detailed explanation of video formats, codecs, and quality selection strategies.
Tips for Best Results
- Always specify quality if user has preference - saves bandwidth and storage
- Batch downloads save time - use playlist URLs when possible
- Audio extraction is faster - recommend for podcast/music content
- Check file size before downloading - warn user for very large files (>1GB)
- Transcription works best with clear audio - consider extracting audio first for better results
Sources
More from naohainezha/skill
reactions
React to the user's Telegram message with an emoji. Use when the message evokes a genuine emotional response.
28self-reflection
Daily self-reflection and personal growth. Triggered by heartbeat at end of day. Review the day's experiences, extract lessons, update personality, and write a diary entry.
6voice
Send voice messages (TTS) to the user via Telegram. Use when replying to voice messages or when a voice reply feels natural.
3scheduler
Create, manage, and delete scheduled tasks (cron jobs) and configure heartbeat. Use when users ask for reminders, recurring tasks, daily summaries, periodic checks, or anything time-based. Also manages HEARTBEAT.md for periodic awareness checks.
3thread-management
Manage chat threads — create, list, switch, delete, and search conversations. Use when users want to organize their chats.
3memory-management
Search and manage Alma's memory and conversation history. Use when the user asks about past conversations, personal facts, preferences, or anything that requires recalling information ("你知道我...吗", "我们之前聊过...", "你还记得...", "帮我找之前说的..."). Also used to store new memories and search through archived chat threads.
3