From fe0b9523012c495c0c868dc89eceb7092c5fbf4c Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 25 Jan 2020 01:48:51 +0800 Subject: [PATCH] init commit --- Cargo.toml | 13 +++++++++++ src/main.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ce3bd6e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "m3u8download" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +m3u8-rs = "1.0.5" +reqwest = "0.10.1" +http = "0.2.0" +rust_util = "0.2.1" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..62f7193 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,63 @@ +use http::Uri; +use rust_util::*; + +fn main() { + println!("Hello, world!"); + + let u = "https://a:d@hatter.ink:443/aaa/bbb/cccc?aa=1#dd"; + let uri = u.parse::().unwrap(); + println!("{}", uri); + println!("{:?}", uri.scheme()); + println!("{:?}", uri.scheme_str()); + println!("{:?}", uri.authority()); + println!("{:?}", uri.host()); + println!("{:?}", uri.port()); + println!("{:?}", uri.path()); + println!("{:?}", uri.query()); + println!("{:?}", uri.path_and_query()); + println!("{:?}", uri.path().split('/').collect::>()); + let mut v = uri.path().split('/').collect::>(); + if !v.is_empty() { + let l = v.len()-1; + v[l]="xxxxx"; + } + println!("{:?}", v.join("/")); +} + +fn _make_url(base_url: &str, ts_url: &str) -> XResult { + let lower_ts_url = ts_url.to_lowercase(); + if lower_ts_url.starts_with("http://") || lower_ts_url.starts_with("https://") { + return Ok(ts_url.into()); + } + + let parsed_base_url = base_url.parse::()?; + let lower_scheme_str = match parsed_base_url.scheme_str() { + None => return Err(new_box_error(&format!("Base url has no scheme: {}", base_url))), + Some(s) => s.to_lowercase(), + }; + + if ts_url.starts_with("//") { + return Ok(iff!(lower_scheme_str == "http", "http:", "https:").to_owned() + ts_url); + } + + let authority = match parsed_base_url.authority() { + None => return Err(new_box_error(&format!("Base url has no authority: {}", base_url))), + Some(a) => a, + }; + + if ts_url.starts_with('/') { + return Ok(format!("{}://{}{}", lower_scheme_str, authority, ts_url)); + } + + let relative_base_url = format!("{}://{}{}", lower_scheme_str, authority, parsed_base_url.path()); + if relative_base_url.ends_with('/') { + // ends with '/' + Ok(relative_base_url + ts_url) + } else { + // not ends with '/' + let mut splited_by_slash = relative_base_url.split('/').collect::>(); + let splited_by_slash_len = splited_by_slash.len(); + splited_by_slash[splited_by_slash_len - 1] = ts_url; + Ok(splited_by_slash.join("/")) + } +}