Clean up code

This commit is contained in:
FliegendeWurst 2020-04-21 23:20:04 +02:00
parent e424ff6a72
commit 753689d0ba
2 changed files with 28 additions and 63 deletions

View File

@ -3,62 +3,22 @@ use error_chain::error_chain;
use super::*;
error_chain! {
// The type defined for this error. These are the conventional
// and recommended names, but they can be arbitrarily chosen.
//
// It is also possible to leave this section out entirely, or
// leave it empty, and these names will be used automatically.
types {
Error, ErrorKind, ResultExt, Result;
}
// Without the `Result` wrapper:
//
// types {
// Error, ErrorKind, ResultExt;
// }
// Automatic conversions between this error chain and other
// error chains. In this case, it will e.g. generate an
// `ErrorKind` variant called `Another` which in turn contains
// the `other_error::ErrorKind`, with conversions from
// `other_error::Error`.
//
// Optionally, some attributes can be added to a variant.
//
// This section can be empty.
links {
// Another(other_error::Error, other_error::ErrorKind) #[cfg(unix)];
}
// Automatic conversions between this error chain and other
// error types not defined by the `error_chain!`. These will be
// wrapped in a new error with, in the first case, the
// `ErrorKind::Fmt` variant. The description and cause will
// forward to the description and cause of the original error.
//
// Optionally, some attributes can be added to a variant.
//
// This section can be empty.
foreign_links {
//ALSA(alsa::Error);
//Channel(crossbeam_channel::SendError); // TODO: requires type argument
//Discord(serenity::Error);
Io(std::io::Error);
Reqwest(reqwest::Error);
//Pulse(pulse::error::PAErr);
}
// Define additional `ErrorKind` variants. Define custom responses with the
// `description` and `display` calls.
errors {
UnsupportedChannel(x: String) {
description("unsupported channel kind")
display("unsupported channel kind {:?}", x)
}
}
// If this annotation is left off, a variant `Msg(s: String)` will be added, and `From`
// impls will be provided for `String` and `&str`
//skip_msg_variant
}

View File

@ -29,7 +29,6 @@ struct ILIAS {
// TODO: use these for re-authentication in case of session timeout/invalidation
user: String,
pass: String,
path_prefix: PathBuf,
client: Client
}
@ -189,15 +188,18 @@ impl URL {
}
impl ILIAS {
async fn login<S1, S2>(opt: Opt, user: S1, pass: S1) -> Result<Self> where S1: Into<String>, S2: Into<String> {
async fn login<S1: Into<String>, S2: Into<String>>(opt: Opt, user: S1, pass: S2) -> Result<Self> {
let user = user.into();
let pass = pass.into();
let client = Client::builder()
.cookie_store(true)
.user_agent("KIT-ILIAS-fuse/0.0.1-dev")
.user_agent("KIT-ILIAS-downloader/0.1.0")
.build()?;
let this = ILIAS {
opt, client, user, pass
};
println!("Logging into Shibboleth..");
let session_establishment = client
let session_establishment = this.client
.post("https://ilias.studium.kit.edu/Shibboleth.sso/Login")
.form(&json!({
"sendLogin": "1",
@ -207,11 +209,11 @@ impl ILIAS {
}))
.send().await?;
println!("Logging into identity provider..");
let login_response = client
let login_response = this.client
.post(session_establishment.url().clone())
.form(&json!({
"j_username": &user,
"j_password": &pass,
"j_username": &this.user,
"j_password": &this.pass,
"_eventId_proceed": ""
}))
.send().await?.text().await?;
@ -231,7 +233,7 @@ impl ILIAS {
let relay_state = Selector::parse(r#"input[name="RelayState"]"#).unwrap();
let relay_state = dom.select(&relay_state).next().expect("no relay state");
println!("Logging into ILIAS..");
client
this.client
.post("https://ilias.studium.kit.edu/Shibboleth.sso/SAML2/POST")
.form(&json!({
"SAMLResponse": saml.value().attr("value").unwrap(),
@ -239,10 +241,7 @@ impl ILIAS {
}))
.send().await?;
println!("Logged in!");
let path_prefix = PathBuf::from(env!("ILIAS_DIR"));
Ok(ILIAS {
opt, client, user, pass, path_prefix
})
Ok(this)
}
async fn personal_desktop(&mut self) -> Result<Dashboard> {
@ -297,7 +296,7 @@ async fn main() {
let desktop = ilias.personal_desktop().await.unwrap();
let mut queue = VecDeque::new();
for item in desktop.items {
let mut path = ilias.path_prefix.clone();
let mut path = ilias.opt.output.clone();
path.push(item.name());
queue.push_back((path, item));
}
@ -325,10 +324,10 @@ lazy_static!{
//async fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) {
fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) -> impl std::future::Future<Output = ()> + Send { async move {
if ilias.opt.verbose > 0 {
println!("Syncing {} {}..", obj.kind(), path.strip_prefix(&ilias.path_prefix).unwrap().to_string_lossy());
println!("Syncing {} {}..", obj.kind(), path.strip_prefix(&ilias.opt.output).unwrap().to_string_lossy());
}
match &obj {
Course { name, url } => {
Course { url, .. } => {
if let Err(e) = fs::create_dir(&path) {
if e.kind() != io::ErrorKind::AlreadyExists {
println!("error: {:?}", e);
@ -346,7 +345,7 @@ fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) -> impl std::future::F
});
}
},
Folder { name, url } => {
Folder { url, .. } => {
if let Err(e) = fs::create_dir(&path) {
if e.kind() != io::ErrorKind::AlreadyExists {
println!("error: {:?}", e);
@ -364,7 +363,7 @@ fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) -> impl std::future::F
});
}
},
File { name, url } => {
File { url, .. } => {
if ilias.opt.skip_files {
return;
}
@ -387,7 +386,7 @@ fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) -> impl std::future::F
Err(e) => println!("error: {:?}", e)
}
},
PluginDispatch { name, url } => {
PluginDispatch { url, .. } => {
if ilias.opt.no_videos {
return;
}
@ -450,15 +449,21 @@ fn process(ilias: Arc<ILIAS>, path: PathBuf, obj: Object) -> impl std::future::F
let url = format!("{}{}", ILIAS_URL, url);
let data = ilias.download(&url);
let html = data.await.unwrap().text().await.unwrap();
//println!("{}", html);
if ilias.opt.verbose > 1 {
println!("{}", html);
}
let json: serde_json::Value = {
let mut json_capture = XOCT_REGEX.captures_iter(&html);
let json = &json_capture.next().unwrap()[1];
//println!("{}", json);
if ilias.opt.verbose > 1 {
println!("{}", json);
}
let json = json.split(",\n").nth(0).unwrap();
serde_json::from_str(&json.trim()).unwrap()
};
//println!("{}", json);
if ilias.opt.verbose > 1 {
println!("{}", json);
}
let url = json["streams"][0]["sources"]["mp4"][0]["src"].as_str().unwrap();
let resp = ilias.download(&url).await.unwrap();
let mut reader = stream_reader(resp.bytes_stream().map_err(|x| {