Skip to content

Commit

Permalink
[mod] 优化Node相关结构
Browse files Browse the repository at this point in the history
  • Loading branch information
Borber committed Jan 17, 2023
1 parent aec93c0 commit 06d42e3
Show file tree
Hide file tree
Showing 17 changed files with 205 additions and 185 deletions.
8 changes: 5 additions & 3 deletions src/declarative.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{live, util, Cli};
use crate::{live, Cli};
use anyhow::{Ok, Result};
use clap::{Parser, Subcommand};
use paste::paste;
Expand All @@ -23,7 +23,7 @@ macro_rules! get_source_url_command {
match Cli::parse().command {
$(
Commands::$name { rid } => {
util::match_show_type(live::[<$name: lower>]::get(&rid).await?)
println!("{}", live::[<$name: lower>]::get(&rid).await?.to_string());
}
)*
}
Expand All @@ -36,4 +36,6 @@ macro_rules! get_source_url_command {

// 展开宏命令
// 添加新的直播平台可以在括号末尾添加,并在live文件夹里添加对应的文件
get_source_url_command!(Bili, Douyu, Douyin, Huya, Kuaishou, Cc, Huajiao, Yqs, Mht, Afreeca, Panda, Flex);
get_source_url_command!(
Bili, Douyu, Douyin, Huya, Kuaishou, Cc, Huajiao, Yqs, Mht, Afreeca, Panda, Flex, Wink
);
14 changes: 7 additions & 7 deletions src/live/afreeca.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use regex::Regex;

use crate::{
common::CLIENT,
model::{Node, ShowType},
model::ShowType,
util::parse_url,
};

const URL: &str = "https://play.afreecatv.com/";
Expand Down Expand Up @@ -45,19 +46,18 @@ pub async fn get(rid: &str) -> Result<ShowType> {
.await?
.json()
.await?;
Ok(ShowType::On(vec![Node {
rate: "原画".to_string(),
url: format!("{CDN}{}", json["CHANNEL"]["AID"].as_str().unwrap()),
}]))
Ok(ShowType::On(vec![parse_url(format!(
"{CDN}{}",
json["CHANNEL"]["AID"].as_str().unwrap()
))]))
}

#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get() {
match_show_type(get("dasl8121").await.unwrap());
println!("{}", get("dasl8121").await.unwrap().to_string());
}
}
50 changes: 13 additions & 37 deletions src/live/bili.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{
common::{CLIENT, USER_AGENT},
model::{Node, ShowType},
model::ShowType,
util::parse_url,
};

use anyhow::{Ok, Result};
Expand Down Expand Up @@ -46,29 +47,17 @@ pub async fn get(rid: &str) -> Result<ShowType> {
let mut stream_urls = vec![];
for obj in stream_info.as_array().unwrap() {
for format in obj["format"].as_array().unwrap() {
let format_name = format["format_name"].to_string();
for codec in format["codec"].as_array().unwrap() {
let quality_string = convert_qn_to_quality_string(
codec["current_qn"].to_string().as_str(),
);
let base_url = codec["base_url"].to_string();
for (idx, url_info) in
codec["url_info"].as_array().unwrap().iter().enumerate()
{
let host = url_info["host"].to_string();
let extra = url_info["extra"].to_string();
let rate_info = format!(
"{}-{}{}",
format_name.clone(),
quality_string.clone(),
idx + 1
)
.replace('"', "");
stream_urls.push(Node {
rate: rate_info,
url: format!("{}{}{}", host, base_url.clone(), extra)
.replace('"', ""),
});
let base_url = codec["base_url"].as_str().unwrap();
for url_info in codec["url_info"].as_array().unwrap() {
let host = url_info["host"].as_str().unwrap();
let extra = url_info["extra"].as_str().unwrap();
stream_urls.push(parse_url(format!(
"{}{}{}",
host,
base_url.clone(),
extra
)));
}
}
}
Expand Down Expand Up @@ -102,25 +91,12 @@ async fn get_stream_info(room_id: &str, qn: u64) -> Result<serde_json::Value> {
.to_owned())
}

/// 转化current_qn至对应清晰度
fn convert_qn_to_quality_string(qn: &str) -> String {
match qn {
"10000" => "原画".to_string(),
"400" => "蓝光".to_string(),
"250" => "超清".to_string(),
"150" => "高清".to_string(),
"80" => "流畅".to_string(),
_ => "未知画质".to_string(),
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get_url() {
match_show_type(get("1785182").await.unwrap());
println!("{}", get("23356199").await.unwrap().to_string());
}
}
61 changes: 27 additions & 34 deletions src/live/cc.rs
Original file line number Diff line number Diff line change
@@ -1,64 +1,57 @@
use crate::{
common::CLIENT,
model::ShowType,
util::parse_url,
};
use anyhow::{Ok, Result};
use regex::Regex;
use crate::{model::{Node, ShowType}, common::CLIENT};

const URL: &str = "https://cc.163.com/";

/// 网易CC直播
///
/// https://cc.163.com/
pub async fn get(rid: &str) -> Result<ShowType> {
let text = CLIENT.get(format!("{URL}{rid}")).send().await?.text().await?;
let text = CLIENT
.get(format!("{URL}{rid}"))
.send()
.await?
.text()
.await?;
let re = Regex::new(r#"<script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">([\s\S]*?)</script>"#).unwrap();
let json = match re.captures(&text) {
Some(rap) => {
rap.get(1).unwrap().as_str()
},
Some(rap) => rap.get(1).unwrap().as_str(),
None => {
return Ok(ShowType::Error("未找到直播间".to_string()));
},
}
};
let json: serde_json::Value = serde_json::from_str(json)?;
let resolution = match &json["props"]["pageProps"]["roomInfoInitData"]["live"]["quickplay"]["resolution"] {
serde_json::Value::Null => return Ok(ShowType::Off),
v => v,
};
let resolution =
match &json["props"]["pageProps"]["roomInfoInitData"]["live"]["quickplay"]["resolution"] {
serde_json::Value::Null => return Ok(ShowType::Off),
v => v,
};
let mut nodes = vec![];
for vbr in ["blueray", "ultra", "high", "standard"] {
let cdn = change_str(vbr);
if resolution[vbr] != serde_json::Value::Null {
nodes.push(Node{
rate: format!("{cdn}-ali"),
url: resolution[vbr]["cdn"]["ali"].as_str().unwrap().to_string(),
});
nodes.push(Node{
rate: format!("{cdn}-ks"),
url: resolution[vbr]["cdn"]["ks"].as_str().unwrap().to_string(),
});
nodes.push(parse_url(
resolution[vbr]["cdn"]["ali"].as_str().unwrap().to_string(),
));
nodes.push(parse_url(
resolution[vbr]["cdn"]["ks"].as_str().unwrap().to_string(),
));
break;
}
}
Ok(ShowType::On(nodes))
}

fn change_str(s: &str) -> &str {
match s {
"blueray" => "蓝光",
"ultra" => "超清",
"high" => "高清",
"standard" => "标清",
_ => "未知",
}
}


#[cfg(test)]
mod tests{
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get_url() {
match_show_type(get("361433").await.unwrap());
println!("{}", get("361433").await.unwrap().to_string());
}
}
}
16 changes: 5 additions & 11 deletions src/live/douyin.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::{
common::CLIENT,
model::{Node, ShowType},
model::ShowType, util::parse_url,
};

use anyhow::{Ok, Result};
Expand Down Expand Up @@ -29,14 +29,8 @@ pub async fn get(rid: &str) -> Result<ShowType> {
_ => match &room_info["room"]["stream_url"] {
Value::Null => Ok(ShowType::Off),
stream_url => Ok(ShowType::On(vec![
Node {
rate: "蓝光_flv".to_string(),
url: douyin_trim_value(&stream_url["flv_pull_url"]["FULL_HD1"]),
},
Node {
rate: "蓝光_hls".to_string(),
url: douyin_trim_value(&stream_url["hls_pull_url"]),
},
parse_url(douyin_trim_value(&stream_url["flv_pull_url"]["FULL_HD1"])),
parse_url(douyin_trim_value(&stream_url["hls_pull_url"])),
])),
},
}
Expand All @@ -55,9 +49,9 @@ fn douyin_trim_value(v: &Value) -> String {
#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get_url() {
match_show_type(get("228619203678").await.unwrap());
println!("{}", get("228619203678").await.unwrap().to_string());
}
}
16 changes: 4 additions & 12 deletions src/live/douyu.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use std::collections::HashMap;

use crate::model::Node;
use crate::{common::CLIENT, model::ShowType};

use crate::util::{do_js, md5};
use crate::util::{do_js, md5, parse_url};
use anyhow::{Ok, Result};
use chrono::prelude::*;
use regex::Regex;
Expand Down Expand Up @@ -34,14 +33,8 @@ pub async fn get(rid: &str) -> Result<ShowType> {
None => key,
};
Ok(ShowType::On(vec![
Node {
rate: "超清1".to_string(),
url: format!("{CDN_1}{key}.flv"),
},
Node {
rate: "超清2".to_string(),
url: format!("{CDN_2}{key}.flv"),
},
parse_url(format!("{CDN_1}{key}.flv")),
parse_url(format!("{CDN_2}{key}.flv")),
]))
}
_ => Ok(ShowType::Off),
Expand Down Expand Up @@ -134,10 +127,9 @@ async fn douyu_do_js(rid: &str) -> Result<Value> {
#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get_url() {
match_show_type(get("33").await.unwrap());
println!("{}", get("33").await.unwrap().to_string());
}
}
13 changes: 6 additions & 7 deletions src/live/flex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ use anyhow::{Ok, Result};

use crate::{
common::CLIENT,
model::{Node, ShowType},
model::ShowType,
util::parse_url,
};

const URL: &str = "https://api.flextv.co.kr/api/channels/rid/stream?option=all";
Expand All @@ -19,20 +20,18 @@ pub async fn get(rid: &str) -> Result<ShowType> {
.await?;
match &json["sources"][0]["url"] {
serde_json::Value::Null => return Ok(ShowType::Off),
url => Ok(ShowType::On(vec![Node {
rate: "原画".to_string(),
url: url.as_str().unwrap().to_string(),
}])),
url => Ok(ShowType::On(vec![parse_url(
url.as_str().unwrap().to_string(),
)])),
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_flex() {
match_show_type(get("399291").await.unwrap());
println!("{}", get("399291").await.unwrap().to_string());
}
}
13 changes: 6 additions & 7 deletions src/live/huajiao.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ use regex::Regex;

use crate::{
common::CLIENT,
model::{Node, ShowType},
model::ShowType,
util::parse_url,
};

const URL: &str = "https://www.huajiao.com/l/";
Expand Down Expand Up @@ -34,21 +35,19 @@ pub async fn get(rid: &str) -> Result<ShowType> {
.as_str()
.parse::<i32>()?
{
0 => Ok(ShowType::On(vec![Node {
rate: "超清".to_owned(),
url: format!("https://{pl}-flv.live.huajiao.com/live_huajiao_v2/{sn}.m3u8"),
}])),
0 => Ok(ShowType::On(vec![parse_url(format!(
"https://{pl}-flv.live.huajiao.com/live_huajiao_v2/{sn}.m3u8"
))])),
_ => Ok(ShowType::Off),
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::util::match_show_type;

#[tokio::test]
async fn test_get_url() {
match_show_type(get("337633032").await.unwrap());
println!("{}", get("337633032").await.unwrap().to_string());
}
}
Loading

0 comments on commit 06d42e3

Please sign in to comment.