feat: 实现下载,给出例子

This commit is contained in:
amtoaer
2024-03-19 00:04:32 +08:00
parent 210a72c9cf
commit f46a837533
10 changed files with 259 additions and 150 deletions

View File

@@ -1,8 +1,11 @@
use std::path::Path;
use std::rc::Rc;
use bili_sync::bilibili::{
AudioQuality, BiliClient, FavoriteList, Video, VideoCodecs, VideoQuality,
AudioQuality, BestStream, BiliClient, FavoriteList, FilterOption, Video, VideoCodecs,
VideoQuality,
};
use bili_sync::downloader::Downloader;
use futures_util::{pin_mut, StreamExt};
#[tokio::main]
@@ -10,36 +13,57 @@ async fn main() {
let bili_client = Rc::new(BiliClient::anonymous());
let favorite_list = FavoriteList::new(bili_client.clone(), "52642258".to_string());
dbg!(favorite_list.get_info().await.unwrap());
let video_stream = favorite_list.into_video_stream();
// from doc: https://docs.rs/async-stream/latest/async_stream/
pin_mut!(video_stream);
let mut count = 3;
let mut third_video = None;
while let Some(mut video) = video_stream.next().await {
count -= 1;
video = dbg!(video);
if count <= 0 {
third_video = Some(video);
break;
}
}
let third_video = Video::new(bili_client.clone(), third_video.unwrap().bvid);
let third_video_info = dbg!(video_stream.skip(2).next().await.unwrap());
let third_video = Video::new(bili_client.clone(), third_video_info.bvid);
dbg!(third_video.get_tags().await.unwrap());
let pages = dbg!(third_video.get_pages().await.unwrap());
dbg!(third_video
let best_stream = dbg!(third_video
.get_page_analyzer(&pages[0])
.await
.unwrap()
.best_stream(
VideoQuality::QualityDolby,
VideoQuality::Quality360p,
AudioQuality::QualityDolby,
AudioQuality::Quality64k,
vec![VideoCodecs::HEV, VideoCodecs::AVC],
false,
false,
false,
false,
))
.best_stream(&FilterOption {
video_max_quality: VideoQuality::QualityDolby,
video_min_quality: VideoQuality::Quality360p,
audio_max_quality: AudioQuality::QualityDolby,
audio_min_quality: AudioQuality::Quality64k,
codecs: Rc::new(vec![VideoCodecs::HEV, VideoCodecs::AVC]),
no_dolby_video: false,
no_dolby_audio: false,
no_hdr: false,
no_hires: false,
}))
.unwrap();
let downloader = Downloader::default();
let base = Path::new("./");
let output_path = base.join(format!("{}.mp4", third_video_info.title));
match best_stream {
BestStream::Mixed(stream) => {
let url = dbg!(stream.url());
downloader.fetch(url, &output_path).await.unwrap();
}
BestStream::VideoAudio { video, audio } => {
let url = dbg!(video.url());
let Some(audio) = audio else {
downloader.fetch(url, &output_path).await.unwrap();
return;
};
let video_path = base.join(format!("{}_video_tmp", third_video_info.title));
downloader.fetch(url, &video_path).await.unwrap();
let url = dbg!(audio.url());
let audio_path = base.join(format!("{}_audio_tmp", third_video_info.title));
downloader.fetch(url, &audio_path).await.unwrap();
downloader
.merge(&video_path, &audio_path, &output_path)
.await
.unwrap();
}
}
}