20 个版本
0.7.4 | 2024年8月10日 |
---|---|
0.7.3 | 2024年7月11日 |
0.7.2 | 2024年5月15日 |
0.7.1 | 2024年3月20日 |
0.4.2 | 2023年3月24日 |
#18 in 视频
1,304 个月下载量
用于 5 个 Crates(4 个直接使用)
345KB
8K SLoC
rusty_ytdl
使用纯 Rust 编写的 YouTube 搜索和下载模块。下载视频时无需在 YouTube 下载速度上卡住(20MB 视频文件只需 10 秒即可下载!)
概述
路线图
- 基准测试
特性
- 下载直播和非直播视频
- 通过查询(视频、播放列表、频道)搜索
- 阻塞和非阻塞 API
- 请求时支持代理、IPv6 和 Cookie
- 内置 FFmpeg 音频和视频过滤器应用支持(仅限非直播视频) 示例
- 命令行界面
用法
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)
- 使用Cookies(您可以在此找到示例 cookies)
- 为了使此功能生效,您必须首先等待当前的速率限制过期!
- 耐心等待
安装
cargo add rusty_ytdl
或者将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
rusty_ytdl = "0.7.4"
依赖项
~28–44MB
~749K SLoC