An open API service indexing awesome lists of open source software.

https://github.com/mithronn/rusty_ytdl

A Rust library for Youtube video searcher and downloader
https://github.com/mithronn/rusty_ytdl

rust youtube youtube-dl youtube-downloader youtube-search

Last synced: about 1 year ago
JSON representation

A Rust library for Youtube video searcher and downloader

Awesome Lists containing this project

README

          

#

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"
```