#
rusty_ytdl
[![crates.io](https://img.shields.io/crates/v/rusty_ytdl.svg?style=for-the-badge&logo=rust)](https://crates.io/crates/rusty_ytdl) [![Released API docs](https://img.shields.io/badge/docs.rs-rusty__ytdl-C36241?style=for-the-badge&logo=docs.rs)](https://docs.rs/rusty_ytdl)
Youtube searching and downloading module written with **pure Rust**. Download videos **blazing-fast** without getting stuck on Youtube download speed (Downloads 20MB video files in just 10 seconds!) ## Overview - [Roadmap](#roadmap) - [Features](#features) - [Usage](#usage) - [Limitations](#limitations) ## Roadmap - [ ] benchmarks ## Features - Download live and non-live videos - Search with query (Video, Playlist, Channel) - Blocking and asynchronous API - Proxy, IPv6, and cookie support on request - Built-in FFmpeg audio and video filter apply support (Non-live videos only) [Example](examples/download_with_ffmpeg.rs) - [CLI](https://crates.io/crates/rusty_ytdl-cli) # Usage ```rust,ignore use rusty_ytdl::Video; #[tokio::main] async fn main() { let video_url = "https://www.youtube.com/watch?v=FZ8BxMU3BYc"; // FZ8BxMU3BYc works too! let video = Video::new(url).unwrap(); let stream = video.stream().await.unwrap(); while let Some(chunk) = stream.chunk().await.unwrap() { // Do what you want with chunks println!("{:#?}", chunk); } // Or direct download to path let path = std::path::Path::new(r"test.mp3"); video.download(path).await.unwrap(); // // Or with options // let video_options = VideoOptions { quality: VideoQuality::Lowest, filter: VideoSearchOptions::Audio, ..Default::default() }; let video = Video::new_with_options(url, video_options).unwrap(); let stream = video.stream().await.unwrap(); while let Some(chunk) = stream.chunk().await.unwrap() { // Do what you want with chunks println!("{:#?}", chunk); } // Or direct download to path let path = std::path::Path::new(r"test.mp3"); video.download(path).await.unwrap(); } ``` or get only video informations ```rust,ignore use rusty_ytdl::Video; use rusty_ytdl::{choose_format,VideoOptions}; #[tokio::main] async fn main() { let video_url = "https://www.youtube.com/watch?v=FZ8BxMU3BYc"; // FZ8BxMU3BYc works too! // Also works with live videos!! let video = Video::new(url).unwrap(); let video_info = video.get_info().await.unwrap(); println!("{:#?}",video_info); /* VideoInfo { dash_manifest_url: Option, hls_manifest_url: Option, video_details: VideoDetails, formats: Vec, related_videos: Vec } */ let video_options = VideoOptions { quality: VideoQuality::Lowest, filter: VideoSearchOptions::Audio, ..Default::default() }; let format = choose_format(&video_info.unwrap().formats,&video_options); println!("{:#?}",format); // Or with options let video = Video::new_with_options(url, video_options.clone()).unwrap(); let format = choose_format(&video_info.formats, &video_options); let video_info = video.get_info().await.unwrap(); println!("{:#?}",video_info); } ``` For more examples, check [examples](examples/) ## Limitations rusty_ytdl cannot download videos that fall into the following - Regionally restricted (requires a [proxy](examples/proxy.rs)) - Private (if you have access, requires [cookies](examples/cookies.rs)) - Rentals (if you have access, requires [cookies](examples/cookies.rs)) - YouTube Premium content (if you have access, requires [cookies](examples/cookies.rs)) - Only [HLS Livestreams](https://en.wikipedia.org/wiki/HTTP_Live_Streaming) are currently supported. Other formats not will be fetch Generated download links are valid for 6 hours, and may only be downloadable from the same IP address. ### Ratelimits When doing to many requests YouTube might block. This will result in your requests getting denied with HTTP Status Code 429. The following steps might help you: - Use proxies (you can find an example [proxy](examples/proxy.rs)) - Extend on the Proxy Idea by rotating (IPv6)Addresses (you can find an example [IPv6](examples/ipv6.rs)) - Use cookies (you can find an example [cookies](examples/cookies.rs)) - for this to take effect you have to first wait for the current ratelimit to expire! - Wait it out # Installation ```bash cargo add rusty_ytdl ``` Or add the following to your `Cargo.toml` file: ```toml [dependencies] rusty_ytdl = "0.7.4" ```