#youtube #downloader #youtube-dl #searcher #ytdl

app rusty_ytdl-cli

rusty_ytdl的命令行界面

1个稳定版本

1.0.0 2024年1月11日

#290 in 视频

MIT/Apache

340KB
7.5K SLoC

rusty_ytdl

crates.io Released API docs

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