feat: add video cmd to cli

integrated stream filter
This commit is contained in:
ThetaDev 2022-08-27 00:28:50 +02:00
parent 30e79ebfbc
commit 5db85c05e8
3 changed files with 179 additions and 98 deletions

View file

@ -15,6 +15,7 @@ pub struct Filter {
video_formats: Option<HashSet<VideoFormat>>,
video_codecs: Option<HashSet<VideoCodec>>,
video_hdr: bool,
video_none: bool,
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
@ -204,6 +205,12 @@ impl Filter {
}
}
/// Output no video stream (audio only)
pub fn no_video(&mut self) -> &mut Self {
self.video_none = true;
self
}
fn apply_audio(&self, stream: &AudioStream) -> FilterResult {
self.apply_audio_max_bitrate(stream).join(
self.apply_audio_formats(stream).join(
@ -253,6 +260,10 @@ impl PlayerData {
streams: &'a [VideoStream],
filter: &Filter,
) -> Option<&'a VideoStream> {
if filter.video_none {
return None;
}
let mut fallback: Option<&VideoStream> = None;
streams
@ -286,26 +297,26 @@ impl PlayerData {
pub fn select_video_audio_stream(
&self,
filter: &Filter,
) -> Option<(&VideoStream, Option<&AudioStream>)> {
) -> (Option<&VideoStream>, Option<&AudioStream>) {
let video_stream = self.select_video_stream(filter);
let video_only_stream = self.select_video_only_stream(filter);
match (video_stream, video_only_stream) {
(None, None) => None,
(None, None) => (None, self.select_audio_stream(filter)),
(None, Some(video_only_stream)) => {
Some((video_only_stream, self.select_audio_stream(filter)))
(Some(video_only_stream), self.select_audio_stream(filter))
}
(Some(video_stream), None) => Some((video_stream, None)),
(Some(video_stream), None) => (Some(video_stream), None),
(Some(video_stream), Some(video_only_stream)) => match video_only_stream > video_stream
{
true => Some((
video_only_stream,
true => (
Some(video_only_stream),
Some(some_or_bail!(
self.select_audio_stream(filter),
Some((video_stream, None))
(Some(video_stream), None)
)),
)),
false => Some((video_stream, None)),
),
false => (Some(video_stream), None),
},
}
}
@ -386,6 +397,11 @@ mod tests {
Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=23544588&dur=313.834&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=18&lmt=1647456546485912&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=HWZNhARNT_nJgg&ns=pLFQxzhiCbZ9F2HJmDLveKoH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgeCEjusAq6p33rH0NHyTAbPIRaaEkjDE32AXBFzDvR-ICIQD0LI8hQVH8oCMWu6OuADzc1FSQhIqYs5RLkxBmObIdsw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4530434&vprv=1"),
None
)]
#[case::novideo(
Filter::default().no_video().to_owned(),
None,
Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=5199784&dur=313.801&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=251&keepalive=yes&lmt=1647453650291076&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALtI3j8ZChpNb0LcyDZ3yosbWnSpqaO0-jKAe_UM_RQyAiAMwrpdeNbJEnQn3q1eveaAcRcNIwy5iJ4fIjeBW_MUfg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1")
)]
#[case::noformat(Filter::default().audio_formats(hash_set!()).video_formats(hash_set!()).to_owned(), None, None)]
fn t_select_video_audio_stream(
#[case] filter: Filter,
@ -393,21 +409,16 @@ mod tests {
#[case] expect_audio_url: Option<&str>,
) {
let player_data = PLAYER_HDR;
let selection = player_data.select_video_audio_stream(&filter);
let (video, audio) = player_data.select_video_audio_stream(&filter);
match expect_video_url {
Some(expect_video_url) => {
let selection = selection.unwrap();
assert_eq!(selection.0.url, expect_video_url);
Some(expect_url) => assert_eq!(video.unwrap().url, expect_url),
None => assert_eq!(video, None),
}
match expect_audio_url {
Some(expect_audio_url) => {
assert_eq!(selection.1.unwrap().url, expect_audio_url)
}
None => assert_eq!(selection.1, None),
}
}
None => assert_eq!(selection, None),
match expect_audio_url {
Some(expect_url) => assert_eq!(audio.unwrap().url, expect_url),
None => assert_eq!(audio, None),
}
}
}