1个稳定版本
1.0.0 | 2024年1月11日 |
---|
#290 in 视频
340KB
7.5K SLoC
rusty_ytdl
使用纯Rust编写的YouTube搜索和下载模块。下载视频时无需受限于YouTube下载速度(20MB的视频文件仅需10秒即可下载!)
概述
路线图
- ffmpeg功能
- 基准测试
功能
- 下载直播和非直播视频
- 使用查询(视频、播放列表、频道)进行搜索
- 阻塞和非阻塞API
- 支持请求时的代理、IPv6和cookie
- 命令行界面
用法
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();
}
或仅获取视频信息
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<String>,
hls_manifest_url: Option<String>,
video_details: VideoDetails,
formats: Vec<VideoFormat>,
related_videos: Vec<RelatedVideo>
}
*/
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);
}
更多示例,请查看示例
限制
rusty_ytdl无法下载以下类型的视频
- 地区限制(需要代理)
- 私有(如果您有权访问,则需要cookie)
- 租赁(如果您有权访问,则需要cookie)
- YouTube Premium内容(如果您有权访问,则需要cookie)
- 目前仅支持HLS直播流。其他格式不支持
生成的下载链接有效期为6小时,并且只能从同一IP地址下载。
速率限制
当请求过多时,YouTube可能会阻止请求。这会导致请求被拒绝,HTTP状态码为429。以下步骤可能有助于解决问题
- 使用代理(您可以找到一个示例 代理)
- 通过旋转(IPv6)地址来扩展代理想法(您可以找到一个示例 IPv6)
- 使用cookie(您可以找到一个示例 cookie)
- 为了使其生效,您必须首先等待当前的速率限制过期!
- 等待
安装
cargo add rusty_ytdl
或将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
rusty_ytdl = "0.6.6"
依赖关系
~36–52MB
~818K SLoC