#youtube-dl #download #youtube #parse #parser

youtube-dl-parser

运行youtube-dl并解析其下载输出

3个不稳定版本

0.2.0 2023年3月24日
0.1.1 2023年1月27日
0.1.0 2023年1月17日

#364 in 视频


youtube-dl-gui 中使用

MIT 协议

28KB
479 代码行

youtube-dl-parser

运行youtube-dl并解析其下载输出。

用法

要使用此Crate,将 youtube-dl-parser 添加到项目的 Cargo.toml 依赖中

[dependencies]
youtube-dl-parser = "0.2.0"

功能

  • 提供对youtube-dl下载输出的迭代器。
  • 提供解析每个输出的额外迭代器。
  • 公开mp3和mp4youtube-dl下载的duct表达式。

重要

为了使用库提供的函数,必须在PATH中添加 youtube-dlFFmpeg,或者在当前目录中。

进行中

该Crate目前正在开发中,并且仅解析YouTube mp3和mp4下载的输出。

贡献

欢迎为扩展此Crate做出贡献!


lib.rs:

Crate youtube-dl-parser 运行youtube-dl并解析其下载输出。

用法

要使用此Crate,将 youtube-dl-parser 添加到项目的 Cargo.toml 依赖中

[dependencies]
youtube-dl-parser = "0.2.0"

重要

为了使用库提供的函数,必须在PATH中添加 youtube-dlFFmpeg,或者在当前目录中。

进行中

该Crate目前正在开发中,并且仅解析YouTube mp3和mp4下载的输出。

示例:启动youtube-dl mp3下载并匹配其输出

use youtube_dl_parser::expressions::mp3_download_expression;
use youtube_dl_parser::reader::{OutputReader, ParsedOutputReader};
use youtube_dl_parser::state::parsed_state::{
DeletingState, DownloadState, ErrorState, FFmpegState, ParsedState, YoutubeState,
};
use youtube_dl_parser::state::ParsedOutputState;

let youtube_dl_path = "youtube-dl.exe";
let url = "https://www.youtube.com/watch?v=tPEE9ZwTmy0";
let downloads_folder = "downloads";

let big_cmd = mp3_download_expression(youtube_dl_path, url, downloads_folder);
let stdout = big_cmd
.stderr_to_stdout()
.reader()
.expect("Unable to execute youtube-dl");

let output_reader = OutputReader::new(stdout);

let parsed_output_reader = ParsedOutputReader::new(output_reader);

for parsed_state in parsed_output_reader {
match parsed_state {
ParsedOutputState::Parsed(parsed_state) => match parsed_state {
ParsedState::Youtube(youtube_state) => match youtube_state {
YoutubeState::Initiating => {
println!("Initiating youtube download");
}
YoutubeState::ParseError(parse_error) => {
println!("YouTube state parse error: {parse_error}");
}
},
ParsedState::Download(download_state) => match download_state {
DownloadState::Destination(destination) => {
println!("Starting download with destination: {destination}");
}
DownloadState::Resuming(byte) => {
println!("Resuming download from byte: {byte}");
}
DownloadState::Downloading(progress, total_size, download_speed, eta) => {
println!("Progress: {progress}%, Total size: {total_size} bytes, Download speed: {download_speed} bytes per second, ETA: {eta} seconds");
}
DownloadState::Downloaded(progress, total_size, completion_time) => {
println!("Download finished at {progress}% of {total_size} bytes in {completion_time} seconds");
}
DownloadState::ParseError(err) => {
println!("Download state parse error: {err}")
}
},
ParsedState::FFMpeg(ffmpeg_state) => match ffmpeg_state {
FFmpegState::Destination(destination) => {
println!("Using ffmpeg with file destination: {destination}");
}
FFmpegState::ParseError(parse_error) => {
println!("FFmpeg state parse error: {parse_error}");
}
},
ParsedState::Error(error_state) => match error_state {
ErrorState::Error(error) => {
println!("Error occurred: {error}")
}
},
ParsedState::Deleting(deleting_state) => match deleting_state {
DeletingState::DeletingTemporaryFile(path) => {
println!("Deleting temporary file: {path}");
}
DeletingState::ParseError(parse_error) => {
println!("Deleting state parse error: {parse_error}");
}
},
ParsedState::None(output) => {
println!("No state detected: {output}")
}
ParsedState::Unknown(output) => {
println!("Unknown output state: {output}");
}
ParsedState::ParseError(parse_error) => {
println!("Output parse error: {parse_error}");
}
},
ParsedOutputState::Finished => {
println!("Output finished");
}
ParsedOutputState::Error(parsed_error_state) => {
println!(
"Exit code: {:?}, Error: {}",
parsed_error_state.exit_code, parsed_error_state.error
);
}
}
}

依赖项

~0.2–7.5MB
~43K SLoC