diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 7a0b223..c4d41d8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,8 +5,8 @@ "email": "daymadev89@gmail.com" }, "metadata": { - "description": "Professional Claude Code skills for GitHub operations, document conversion, diagram generation, statusline customization, Teams communication, repomix utilities, skill creation, CLI demo generation, LLM icon access, Cloudflare troubleshooting, UI design system extraction, and professional presentation creation", - "version": "1.5.0", + "description": "Professional Claude Code skills for GitHub operations, document conversion, diagram generation, statusline customization, Teams communication, repomix utilities, skill creation, CLI demo generation, LLM icon access, Cloudflare troubleshooting, UI design system extraction, professional presentation creation, and YouTube video downloading", + "version": "1.6.0", "homepage": "https://github.com/daymade/claude-code-skills" }, "plugins": [ @@ -129,6 +129,16 @@ "category": "productivity", "keywords": ["presentation", "powerpoint", "pptx", "slides", "marp", "charts", "data-visualization", "pyramid-principle"], "skills": ["./ppt-creator"] + }, + { + "name": "youtube-downloader", + "description": "Download YouTube videos and audio using yt-dlp with robust error handling. Use when users request downloading YouTube videos, extracting audio from YouTube, or need help with yt-dlp download issues like nsig extraction failures or network problems", + "source": "./", + "strict": false, + "version": "1.0.0", + "category": "utilities", + "keywords": ["youtube", "yt-dlp", "video-download", "audio-extraction", "mp3", "download", "youtube-dl"], + "skills": ["./youtube-downloader"] } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 01b7761..f955f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Security - None +## [1.6.0] - 2025-10-26 + +### Added +- **New Skill**: youtube-downloader - YouTube video and audio downloading with yt-dlp + - Download YouTube videos and playlists with robust error handling + - Audio-only download with MP3 conversion + - Android client workaround for nsig extraction issues (automatic) + - Format listing and custom format selection + - Network error handling for proxy/restricted environments + - Bundled Python script: `download_video.py` with yt-dlp availability check + - Comprehensive troubleshooting documentation for common yt-dlp issues + - Demo tape file and GIF showing download workflow + +### Changed +- Updated marketplace.json from 12 to 13 skills +- Updated marketplace version from 1.5.0 to 1.6.0 +- Enhanced marketplace metadata description to include YouTube downloading capability +- Updated CLAUDE.md with complete 13-skill listing +- Updated CLAUDE.md marketplace version to v1.6.0 +- Updated README.md to reflect 13 available skills +- Updated README.md badges (skills count, version) +- Added youtube-downloader to manual installation instructions +- Added youtube-downloader use case section in README +- Added youtube-downloader to documentation quick links +- Added yt-dlp to requirements section + +## [1.5.0] - 2025-10-26 + +### Added +- **New Skill**: ppt-creator - Professional presentation creation with dual-path PPTX generation + - Pyramid Principle structure (conclusion → reasons → evidence) + - Assertion-evidence slide framework + - Automatic data synthesis and chart generation (matplotlib) + - Dual-path PPTX creation (Marp CLI + document-skills:pptx) + - Complete orchestration: content → data → charts → PPTX with charts + - 45-60 second speaker notes per slide + - Quality scoring with auto-refinement (target: 75/100) + +### Changed +- Updated marketplace.json from 11 to 12 skills +- Updated marketplace version from 1.4.0 to 1.5.0 + ## [1.4.0] - 2025-10-25 ### Added @@ -136,7 +178,9 @@ We use [Semantic Versioning](https://semver.org/): 4. Create git tag: `git tag -a v1.x.x -m "Release v1.x.x"` 5. Push tag: `git push origin v1.x.x` -[Unreleased]: https://github.com/daymade/claude-code-skills/compare/v1.4.0...HEAD +[Unreleased]: https://github.com/daymade/claude-code-skills/compare/v1.6.0...HEAD +[1.6.0]: https://github.com/daymade/claude-code-skills/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/daymade/claude-code-skills/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/daymade/claude-code-skills/compare/v1.3.0...v1.4.0 [1.3.0]: https://github.com/daymade/claude-code-skills/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/daymade/claude-code-skills/compare/v1.1.0...v1.2.0 diff --git a/CLAUDE.md b/CLAUDE.md index 2acc9a4..ea7347e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Repository Overview -This is a Claude Code skills marketplace containing 12 production-ready skills organized in a plugin marketplace structure. Each skill is a self-contained package that extends Claude's capabilities with specialized knowledge, workflows, and bundled resources. +This is a Claude Code skills marketplace containing 13 production-ready skills organized in a plugin marketplace structure. Each skill is a self-contained package that extends Claude's capabilities with specialized knowledge, workflows, and bundled resources. **Essential Skill**: `skill-creator` is the most important skill in this marketplace - it's a meta-skill that enables users to create their own skills. Always recommend it first for users interested in extending Claude Code. @@ -118,7 +118,7 @@ Skills for public distribution must NOT contain: ## Marketplace Configuration The marketplace is configured in `.claude-plugin/marketplace.json`: -- Contains 12 plugins, each mapping to one skill +- Contains 13 plugins, each mapping to one skill - Each plugin has: name, description, version, category, keywords, skills array - Marketplace metadata: name, owner, version, homepage @@ -128,7 +128,7 @@ The marketplace is configured in `.claude-plugin/marketplace.json`: 1. **Marketplace Version** (`.claude-plugin/marketplace.json` → `metadata.version`) - Tracks the marketplace catalog as a whole - - Current: v1.5.0 + - Current: v1.6.0 - Bump when: Adding/removing skills, major marketplace restructuring - Semantic versioning: MAJOR.MINOR.PATCH @@ -156,6 +156,7 @@ The marketplace is configured in `.claude-plugin/marketplace.json`: 10. **cloudflare-troubleshooting** - API-driven Cloudflare diagnostics and debugging 11. **ui-designer** - Design system extraction from UI mockups 12. **ppt-creator** - Professional presentation creation with dual-path PPTX generation +13. **youtube-downloader** - YouTube video and audio downloading with yt-dlp error handling **Recommendation**: Always suggest `skill-creator` first for users interested in creating skills or extending Claude Code. diff --git a/README.md b/README.md index 76ae6ad..7c44b5d 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,15 @@ [![简体中文](https://img.shields.io/badge/语言-简体中文-red)](./README.zh-CN.md) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Skills](https://img.shields.io/badge/skills-12-blue.svg)](https://github.com/daymade/claude-code-skills) -[![Version](https://img.shields.io/badge/version-1.5.0-green.svg)](https://github.com/daymade/claude-code-skills) +[![Skills](https://img.shields.io/badge/skills-13-blue.svg)](https://github.com/daymade/claude-code-skills) +[![Version](https://img.shields.io/badge/version-1.6.0-green.svg)](https://github.com/daymade/claude-code-skills) [![Claude Code](https://img.shields.io/badge/Claude%20Code-2.0.13+-purple.svg)](https://claude.com/code) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/daymade/claude-code-skills/graphs/commit-activity) -Professional Claude Code skills marketplace featuring 12 production-ready skills for enhanced development workflows. +Professional Claude Code skills marketplace featuring 13 production-ready skills for enhanced development workflows. ## 📑 Table of Contents @@ -136,6 +136,9 @@ claude plugin install llm-icon-finder@daymade/claude-code-skills # CLI demo generation claude plugin install cli-demo-generator@daymade/claude-code-skills + +# YouTube video/audio downloading +claude plugin install youtube-downloader@daymade/claude-code-skills ``` Each skill can be installed independently - choose only what you need! @@ -428,6 +431,31 @@ Create persuasive, audience-ready slide decks from topics or documents with data --- +### 12. **youtube-downloader** - YouTube Video & Audio Downloader + +Download YouTube videos and audio using yt-dlp with robust error handling and automatic workarounds for common issues. + +**When to use:** +- Downloading YouTube videos or playlists +- Extracting audio from YouTube videos as MP3 +- Experiencing yt-dlp download failures or nsig extraction errors +- Need help with format selection or quality options +- Working with YouTube content in regions with access restrictions + +**Key features:** +- Android client workaround for nsig extraction issues (automatic) +- Audio-only download with MP3 conversion +- Format listing and custom format selection +- Output directory customization +- Network error handling for proxy/restricted environments +- Availability check for yt-dlp dependency + +**🎬 Live Demo** + +![YouTube Downloader Demo](./demos/youtube-downloader/download-video.gif) + +--- + ## 🎬 Interactive Demo Gallery Want to see all demos in one place with click-to-enlarge functionality? Check out our [interactive demo gallery](./demos/index.html) or browse the [demos directory](./demos/). @@ -452,6 +480,9 @@ Use **skill-creator** (see [Essential Skill](#-essential-skill-skill-creator) se ### For Presentations & Business Communication Use **ppt-creator** to generate professional slide decks with data visualizations, structured storytelling, and complete PPTX output for pitches, reviews, and keynotes. +### For Media & Content Download +Use **youtube-downloader** to download YouTube videos and extract audio from videos with automatic workarounds for common download issues. + ## 📚 Documentation Each skill includes: @@ -472,6 +503,7 @@ Each skill includes: - **llm-icon-finder**: See `llm-icon-finder/references/icons-list.md` for available icons - **cli-demo-generator**: See `cli-demo-generator/references/vhs_syntax.md` for VHS syntax and `cli-demo-generator/references/best_practices.md` for demo guidelines - **ppt-creator**: See `ppt-creator/references/WORKFLOW.md` for 9-stage creation process and `ppt-creator/references/ORCHESTRATION_OVERVIEW.md` for automation +- **youtube-downloader**: See `youtube-downloader/SKILL.md` for usage examples and troubleshooting ## 🛠️ Requirements @@ -480,6 +512,7 @@ Each skill includes: - **gh CLI** (for github-ops) - **markitdown** (for markdown-tools) - **mermaid-cli** (for mermaid-tools) +- **yt-dlp** (for youtube-downloader): `brew install yt-dlp` or `pip install yt-dlp` - **VHS** (for cli-demo-generator): `brew install vhs` - **asciinema** (optional, for cli-demo-generator interactive recording) - **ccusage** (optional, for statusline cost tracking) diff --git a/README.zh-CN.md b/README.zh-CN.md index 0f797a4..397875c 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -6,15 +6,15 @@ [![简体中文](https://img.shields.io/badge/语言-简体中文-red)](./README.zh-CN.md) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Skills](https://img.shields.io/badge/skills-11-blue.svg)](https://github.com/daymade/claude-code-skills) -[![Version](https://img.shields.io/badge/version-1.4.0-green.svg)](https://github.com/daymade/claude-code-skills) +[![Skills](https://img.shields.io/badge/skills-13-blue.svg)](https://github.com/daymade/claude-code-skills) +[![Version](https://img.shields.io/badge/version-1.6.0-green.svg)](https://github.com/daymade/claude-code-skills) [![Claude Code](https://img.shields.io/badge/Claude%20Code-2.0.13+-purple.svg)](https://claude.com/code) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/daymade/claude-code-skills/graphs/commit-activity) -专业的 Claude Code 技能市场,提供 11 个生产就绪的技能,用于增强开发工作流。 +专业的 Claude Code 技能市场,提供 13 个生产就绪的技能,用于增强开发工作流。 ## 📑 目录 diff --git a/demos/ui-designer/extract-design-system.gif b/demos/ui-designer/extract-design-system.gif index e69de29..fc60b80 100644 Binary files a/demos/ui-designer/extract-design-system.gif and b/demos/ui-designer/extract-design-system.gif differ diff --git a/demos/youtube-downloader/download-video.gif b/demos/youtube-downloader/download-video.gif new file mode 100644 index 0000000..baf02ec Binary files /dev/null and b/demos/youtube-downloader/download-video.gif differ diff --git a/demos/youtube-downloader/download-video.tape b/demos/youtube-downloader/download-video.tape new file mode 100644 index 0000000..ad09386 --- /dev/null +++ b/demos/youtube-downloader/download-video.tape @@ -0,0 +1,39 @@ +Output demos/youtube-downloader/download-video.gif + +Set FontSize 16 +Set Width 1400 +Set Height 700 +Set Theme "Dracula" +Set Padding 20 + +Type "# YouTube Downloader Demo" Sleep 500ms +Enter +Sleep 1s + +Type "# Show help for download_video.py" Sleep 500ms +Enter +Sleep 1s + +Type "./youtube-downloader/scripts/download_video.py --help" Sleep 500ms +Enter +Sleep 2s + +Type "# Example: Download audio only" Sleep 500ms +Enter +Sleep 1s + +Type "./youtube-downloader/scripts/download_video.py 'URL' --audio-only" Sleep 500ms +Enter +Sleep 1s + +Type "# Example: List available formats" Sleep 500ms +Enter +Sleep 1s + +Type "./youtube-downloader/scripts/download_video.py 'URL' --list-formats" Sleep 500ms +Enter +Sleep 1s + +Type "# Download complete!" Sleep 500ms +Enter +Sleep 2s diff --git a/youtube-downloader/SKILL.md b/youtube-downloader/SKILL.md new file mode 100644 index 0000000..cf1ba60 --- /dev/null +++ b/youtube-downloader/SKILL.md @@ -0,0 +1,175 @@ +--- +name: youtube-downloader +description: Download YouTube videos and audio using yt-dlp with robust error handling. Use this skill when users request downloading YouTube videos, extracting audio from YouTube, or need help with yt-dlp download issues like nsig extraction failures or network problems. +--- + +# YouTube Downloader + +## Overview + +Enable reliable YouTube video and audio downloads using yt-dlp with built-in workarounds for common issues like nsig extraction failures and network problems. Particularly useful for users behind proxies or in regions with YouTube access restrictions. + +## When to Use This Skill + +This skill should be invoked when users: +- Request downloading YouTube videos or playlists +- Want to extract audio from YouTube videos +- Experience yt-dlp download failures or nsig extraction errors +- Need help with format selection or quality options +- Ask about downloading from YouTube with specific requirements (resolution, format, etc.) + +## Prerequisites + +Verify yt-dlp is installed before proceeding: + +```bash +which yt-dlp +``` + +If not installed, install via: + +```bash +brew install yt-dlp # macOS +# or +pip install yt-dlp # Cross-platform +``` + +## Quick Start + +### Basic Video Download + +For simple video downloads, use the bundled `scripts/download_video.py`: + +```bash +scripts/download_video.py "https://youtu.be/VIDEO_ID" +``` + +This automatically applies the Android client workaround to avoid nsig extraction issues. + +### Audio-Only Download + +To extract audio as MP3: + +```bash +scripts/download_video.py "https://youtu.be/VIDEO_ID" --audio-only +``` + +### Custom Output Directory + +Specify where to save downloads: + +```bash +scripts/download_video.py "https://youtu.be/VIDEO_ID" -o ~/Downloads/YouTube +``` + +## Common Tasks + +### 1. List Available Formats + +Before downloading, check available video/audio formats: + +```bash +scripts/download_video.py "https://youtu.be/VIDEO_ID" --list-formats +``` + +Or use yt-dlp directly: + +```bash +yt-dlp -F "https://youtu.be/VIDEO_ID" +``` + +### 2. Download Specific Format + +After identifying format codes from the list: + +```bash +scripts/download_video.py "https://youtu.be/VIDEO_ID" -f "bestvideo+bestaudio" +``` + +Common format specifications: +- `bestvideo+bestaudio/best` - Best quality video and audio +- `bestvideo[height<=1080]+bestaudio` - Max 1080p video +- `bestaudio` - Audio only (best quality) +- `18` - Format code 18 (typically 360p MP4) + +### 3. Download Playlist + +Use yt-dlp directly for playlists: + +```bash +yt-dlp --extractor-args "youtube:player_client=android" "PLAYLIST_URL" +``` + +### 4. Download with Subtitles + +Include subtitles in the download: + +```bash +yt-dlp --extractor-args "youtube:player_client=android" --write-subs --sub-lang en "VIDEO_URL" +``` + +## Troubleshooting + +### nsig Extraction Failed + +**Symptoms:** +``` +WARNING: [youtube] nsig extraction failed: Some formats may be missing +ERROR: Requested format is not available +``` + +**Solution:** +Use the Android client workaround (automatically applied by `scripts/download_video.py`): + +```bash +yt-dlp --extractor-args "youtube:player_client=android" "VIDEO_URL" +``` + +This is a YouTube-specific issue where the default web client fails to extract signature parameters. The Android client bypasses this restriction. + +### GVS PO Token Warning + +**Symptoms:** +``` +WARNING: android client https formats require a GVS PO Token +``` + +**Impact:** +This warning can be ignored for most use cases. The download will still succeed using available formats. Only some high-quality formats may be skipped. + +**Solution (if needed):** +For advanced users requiring all formats, see: https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide + +### Network Issues in China or Behind Proxies + +Downloads may experience intermittent connectivity. The script handles this automatically by retrying, but slower speeds are expected due to network conditions. Allow sufficient time for completion. + +## Script Reference + +### scripts/download_video.py + +A Python wrapper around yt-dlp that applies best practices by default: +- Uses Android client workaround automatically +- Creates output directories if needed +- Provides clear success/failure feedback +- Supports common download scenarios + +**Arguments:** +- `url` - YouTube video URL (required) +- `-o, --output-dir` - Output directory (default: current directory) +- `-f, --format` - Format specification +- `--no-android-client` - Disable Android client workaround +- `-a, --audio-only` - Download audio only (as MP3) +- `-F, --list-formats` - List available formats + +**Example usage:** +```bash +# Basic download +scripts/download_video.py "https://youtu.be/VIDEO_ID" + +# Audio only to specific directory +scripts/download_video.py "https://youtu.be/VIDEO_ID" -o ~/Music --audio-only + +# Custom format +scripts/download_video.py "https://youtu.be/VIDEO_ID" -f "bestvideo[height<=720]+bestaudio" +``` diff --git a/youtube-downloader/scripts/download_video.py b/youtube-downloader/scripts/download_video.py new file mode 100755 index 0000000..8d6eb0d --- /dev/null +++ b/youtube-downloader/scripts/download_video.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +""" +YouTube video downloader using yt-dlp with robust error handling. + +This script handles common issues like nsig extraction failures and network problems, +especially useful for users behind proxies or in regions with YouTube access issues. + +Requirements: + - yt-dlp: Install via `brew install yt-dlp` (macOS) or `pip install yt-dlp` (cross-platform) + +Usage: + scripts/download_video.py "https://youtu.be/VIDEO_ID" + scripts/download_video.py "https://youtu.be/VIDEO_ID" --audio-only + scripts/download_video.py "https://youtu.be/VIDEO_ID" -o ~/Downloads +""" + +import argparse +import subprocess +import sys +from pathlib import Path + + +def download_video( + url: str, + output_dir: str = ".", + format_spec: str = None, + use_android_client: bool = True, + audio_only: bool = False, + list_formats: bool = False, +) -> int: + """ + Download a YouTube video using yt-dlp. + + Args: + url: YouTube video URL + output_dir: Directory to save the downloaded file + format_spec: Format specification (e.g., "bestvideo+bestaudio/best") + use_android_client: Use Android client to avoid nsig extraction issues + audio_only: Download audio only + list_formats: List available formats instead of downloading + + Returns: + Exit code (0 for success, non-zero for failure) + """ + # Check if yt-dlp is installed + check_result = subprocess.run( + ["which", "yt-dlp"], capture_output=True, text=True + ) + if check_result.returncode != 0: + print("✗ Error: yt-dlp is not installed") + print(" Install via: brew install yt-dlp # or: pip install yt-dlp") + return 1 + + # Build yt-dlp command + cmd = ["yt-dlp"] + + # Use Android client by default to avoid nsig extraction issues + if use_android_client: + cmd.extend(["--extractor-args", "youtube:player_client=android"]) + + # List formats if requested + if list_formats: + cmd.extend(["-F", url]) + result = subprocess.run(cmd) + return result.returncode + + # Set output directory + output_path = Path(output_dir).expanduser().resolve() + output_path.mkdir(parents=True, exist_ok=True) + cmd.extend(["-P", str(output_path)]) + + # Handle audio-only downloads + if audio_only: + cmd.extend(["-x", "--audio-format", "mp3"]) + elif format_spec: + cmd.extend(["-f", format_spec]) + + # Add URL + cmd.append(url) + + # Execute download + print(f"Executing: {' '.join(cmd)}") + result = subprocess.run(cmd) + + if result.returncode == 0: + print(f"\n✓ Download completed successfully!") + print(f" Location: {output_path}") + else: + print(f"\n✗ Download failed with exit code {result.returncode}") + + return result.returncode + + +def main(): + parser = argparse.ArgumentParser( + description="Download YouTube videos using yt-dlp with robust error handling" + ) + parser.add_argument("url", help="YouTube video URL") + parser.add_argument( + "-o", + "--output-dir", + default=".", + help="Output directory (default: current directory)", + ) + parser.add_argument( + "-f", "--format", help="Format specification (e.g., 'bestvideo+bestaudio/best')" + ) + parser.add_argument( + "--no-android-client", + action="store_true", + help="Disable Android client workaround", + ) + parser.add_argument( + "-a", "--audio-only", action="store_true", help="Download audio only (as MP3)" + ) + parser.add_argument( + "-F", "--list-formats", action="store_true", help="List available formats" + ) + + args = parser.parse_args() + + exit_code = download_video( + url=args.url, + output_dir=args.output_dir, + format_spec=args.format, + use_android_client=not args.no_android_client, + audio_only=args.audio_only, + list_formats=args.list_formats, + ) + + sys.exit(exit_code) + + +if __name__ == "__main__": + main()