#youtube #downloader #searcher #youtube-dl #ytdl #search-query

rusty_ytdl

Rust 编写的用于 YouTube 视频搜索和下载的库

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 视频

Download history 124/week @ 2024-05-04 231/week @ 2024-05-11 148/week @ 2024-05-18 144/week @ 2024-05-25 121/week @ 2024-06-01 119/week @ 2024-06-08 124/week @ 2024-06-15 158/week @ 2024-06-22 183/week @ 2024-06-29 493/week @ 2024-07-06 304/week @ 2024-07-13 213/week @ 2024-07-20 359/week @ 2024-07-27 103/week @ 2024-08-03 560/week @ 2024-08-10 266/week @ 2024-08-17

1,304 个月下载量
用于 5 个 Crates(4 个直接使用)

MIT/Apache

345KB
8K SLoC

rusty_ytdl

crates.io Released API docs

使用纯 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