YouTube Chapter Splitter (ytcs)
A simple and powerful Rust CLI tool to download YouTube videos, extract audio to MP3, and automatically split them into individual tracks based on chapters.
โจ Features
- ๐ต Download YouTube audio in high-quality MP3 format (192 kbps)
- ๐ผ๏ธ Download album artwork automatically with embedded cover art in MP3 tags
- ๐ Automatic chapter detection from YouTube video metadata
- ๐ Silence detection fallback for videos without chapters
- โ๏ธ Smart audio splitting with complete ID3 metadata tags (title, artist, album, track number, cover art)
- ๐จ Clean folder names with intelligent formatting (removes brackets, pipes, capitalizes)
- ๐ Smart default output to ~/Music directory (cross-platform)
- ๐ฏ Force artist/album names with CLI options
- โก Dependency checking with automatic installation prompts
- ๐งน URL cleaning - automatically removes playlist and extra parameters
- ๐ชถ Lightweight binary (6.3 MB) with minimal dependencies
๐ Quick Start
Prerequisites
The application will check for dependencies at startup and offer to install them:
- yt-dlp:
pip install yt-dlp - ffmpeg:
- Linux:
sudo apt install ffmpeg - macOS:
brew install ffmpeg - Windows: Download from ffmpeg.org
- Linux:
Installation
Option 1: From crates.io (Recommended)
The ytcs binary will be installed in ~/.cargo/bin/ (make sure it's in your PATH).
Option 2: From source
# Clone the repository
# Build and install
Usage
Download and split:
Configuration (interactive wizard; Enter keeps each current value):
Settings are stored in ~/.config/ytcs/config.toml (or $XDG_CONFIG_HOME/ytcs/config.toml). The wizard is created on first ytcs config or first download.
Options (download command):
-o, --output <DIR>- Output directory (overridesdefault_output_dirin config)-a, --artist <ARTIST>- Force artist name (overrides auto-detection)-A, --album <ALBUM>- Force album name (overrides auto-detection)
Examples:
# Download and split a YouTube video (saves to ~/Music)
# Specify custom output directory
# Force artist and album names
# URL cleaning works automatically (removes &list=, &start_radio=, etc.)
Important: Always put URLs in quotes to avoid shell interpretation of special characters:
๐ Example Output
ytcs v0.15.5
โถ Fetching video information
โถ Marigold - Oblivion Gate
โโ Duration 29m 29s
โโ Tracks 5
โโ Artist Marigold (detected)
โโ Album Oblivion Gate (detected)
โถ Downloading artwork
โโ Saved ~/Music/Marigold - Oblivion Gate/cover.jpg
โถ Downloading audio
[========================================] Downloading audio...
โโ Saved ~/Music/Marigold - Oblivion Gate/temp_audio.mp3
โถ Splitting into 5 tracks
โโ 1 Oblivion Gate [5m 54s]
โโ 2 Obsidian Throne [5m 35s]
โโ 3 Crimson Citadel [5m 47s]
โโ 4 Silver Spire [6m 30s]
โโ 5 Eternal Pyre [5m 43s]
โ ~/Music/Marigold - Oblivion Gate
Result:
~/Music/Marigold - Oblivion Gate/
โโโ cover.jpg
โโโ 01. Oblivion Gate.mp3
โโโ 02. Obsidian Throne.mp3
โโโ 03. Crimson Citadel.mp3
โโโ 04. Silver Spire.mp3
โโโ 05. Eternal Pyre.mp3
๐ฏ How It Works
- URL Cleaning: Removes playlist parameters and extra query strings
- Video Info: Fetches video metadata including title, duration, and chapters
- Artwork Download: Downloads the highest quality thumbnail as
cover.jpg - Audio Download: Extracts audio in MP3 format using yt-dlp
- Track Detection: Uses YouTube chapters or falls back to silence detection
- Audio Splitting: Splits audio using ffmpeg with proper metadata and embedded cover art
- Cleanup: Removes temporary files and organizes output
๐ ๏ธ Advanced Features
Configuration file
Run ytcs config to set output folder, MP3 bitrate (128/192/320), cover download, filename/folder templates (%n, %t, %a, %A), cookies browser, download timeouts, retries, dependency install behavior, and yt-dlp auto-update options.
Without a custom default_output_dir, albums go to the system Music folder (~/Music on Linux/macOS, %USERPROFILE%\Music on Windows). The -o flag still overrides that for a single run.
Folder Name Cleaning
The application automatically cleans folder names:
- Removes
[...]and(...)content and everything after[FULL ALBUM] - Replaces
_,|, and/with- - Capitalizes words properly
- Removes duplicate track numbers from chapter titles
Examples:
Input: "MARIGOLD - Oblivion Gate [Full Album] (70s Psychedelic Blues Acid Rock)"
Output: "Marigold - Oblivion Gate"
Input: "PURPLE DREAMS - WANDERING SHADOWS (FULL ALBUM) | 70s Progressive/Psychedelic Rock"
Output: "Purple Dreams - Wandering Shadows"
Complete ID3 Metadata Tagging
Each MP3 file includes comprehensive ID3v2.3 tags:
- Title: Track name (e.g., "Oblivion Gate")
- Artist: Auto-detected or forced (e.g., "Marigold")
- Album: Auto-detected or forced (e.g., "Oblivion Gate")
- Track: Track number / Total tracks (e.g., "1/5")
- Cover Art: โ Embedded album artwork (if downloaded)
Music players like iTunes, VLC, foobar2000, and mobile apps will display the album artwork automatically!
Force Artist and Album Names
Override automatic detection when video titles are non-standard:
# Auto-detection from title
# Force both artist and album
# Force only artist (album auto-detected)
# Force only album (artist auto-detected)
Silence Detection
If no chapters are found, the tool automatically detects silence periods:
- Threshold: -30 dB
- Minimum duration: 2.0 seconds
- Uses ffmpeg's
silencedetectfilter
๐ Project Structure
youtube-chapter-splitter/
โโโ src/
โ โโโ main.rs # CLI application
โ โโโ lib.rs # Library exports
โ โโโ error.rs # Error handling
โ โโโ chapters.rs # Chapter parsing and manipulation
โ โโโ downloader.rs # YouTube downloading and thumbnail
โ โโโ audio.rs # Audio processing with ffmpeg
โ โโโ utils.rs # Utility functions (formatting, cleaning)
โโโ examples/
โ โโโ basic_usage.rs # Programmatic usage example
โ โโโ chapters_example.json # Sample chapters file
โโโ Cargo.toml # Dependencies and configuration
โโโ README.md # This file
โโโ LICENSE # MIT License
โโโ .gitignore # Git ignore rules
๐งช Testing
Test with a real video:
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
# Clone the repository
# Install dependencies
# Run tests
# Run with debug output
RUST_LOG=debug
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- yt-dlp - YouTube video downloader
- ffmpeg - Audio processing
- clap - Command line argument parser
- ureq - Lightweight HTTP client for thumbnail download
- dirs - Cross-platform directory detection
๐ Known Issues
- Age-restricted videos may require authentication
- Some videos with DRM protection cannot be downloaded
- Download links are valid for 6 hours only
โ FAQ
Q: Where are my files saved?
A: By default, files are saved to your Music directory (~/Music on Linux/macOS, %USERPROFILE%\Music on Windows). You can change this with the -o flag.
Q: Why not use a pure Rust solution instead of ffmpeg?
A: We use ffmpeg for audio encoding and splitting (industry standard), but we use the Rust library lofty for adding metadata and album artwork. This hybrid approach gives us the best of both worlds: ffmpeg's robust audio processing and Rust's safe, efficient metadata handling.
Q: Can I use this for playlists?
A: Currently, the tool processes one video at a time. Playlist support may be added in the future.
Q: What if a video has no chapters?
A: The tool automatically falls back to silence detection to identify track boundaries.
Q: Can I customize silence detection parameters?
A: Currently, the parameters are fixed (-30 dB threshold, 2.0s minimum duration). Custom parameters may be added in future versions.
Q: How do I avoid the [1], [2] background job messages?
A: Always put the URL in quotes: ytcs "URL" instead of ytcs URL. The & character in URLs is interpreted by the shell as a background job operator.
Q: Does the cover art appear in my music player?
A: Yes! The album artwork is automatically embedded in each MP3 file using the lofty Rust library. It works with iTunes, VLC, foobar2000, Windows Media Player, and most mobile music apps.
๐ Changelog
See CHANGELOG.md for detailed version history.
v0.15.5 (Latest)
ytcs config: Interactive configuration wizard andytcs config --show; downloads honor~/.config/ytcs/config.toml- Parsing: Album titles no longer keep trailing
- Full Album - โฆpromo segments - Splitting UI: Track list without overlapping progress bars
- UI (from v0.15.0): Tree-style output, metadata prompts, aligned track lines
๐ Support
If you encounter any issues or have questions:
- Open an issue on GitHub
- Check existing issues for solutions
Made with โค๏ธ and Rust