1use reqwest::{blocking::multipart, blocking::Client, Result};
2use serde::{Deserialize, Serialize};
3use std::env;
4use std::io::prelude::*;
5
6#[derive(Serialize, Deserialize, Debug)]
7pub struct UploadResponse {
8 pub shortcode: String,
9 pub status: i8,
10}
11
12pub fn upload(filepath: &str) -> Result<UploadResponse> {
13 let home_path = dirs::home_dir().map(|a| a.join(".streamable")).unwrap();
14
15 dotenv::from_path(home_path.as_path()).unwrap();
16
17 let username = env::var("STREAMABLE_USERNAME").unwrap();
18 let password = env::var("STREAMABLE_PASSWORD").unwrap();
19
20 let endpoint = "https://api.streamable.com/upload";
21
22 let form = multipart::Form::new()
23 .file("file", std::path::Path::new(filepath))
24 .unwrap_or_else(|e| panic!("Error: {}", e));
25
26 let client = Client::new();
27 let resp = client
28 .post(endpoint)
29 .basic_auth(username, Some(password))
30 .multipart(form)
31 .send()
32 .unwrap_or_else(|e| panic!("Error: {}", e));
33
34 let response_as_json = resp.json::<UploadResponse>().unwrap();
35
36 Ok(response_as_json)
37}
38
39pub fn get_username_password() -> (String, String) {
40 println!("Please input Your username and password");
41 let username = rpassword::read_password_from_tty(Some("Username: ")).unwrap();
42 let password = rpassword::read_password_from_tty(Some("Password: ")).unwrap();
43 (username, password)
44}
45
46pub fn setup() -> Result<()> {
47 let env = get_username_password();
48
49 let text = format!(
50 "STREAMABLE_USERNAME={}\nSTREAMABLE_PASSWORD={}",
51 env.0, env.1
52 );
53
54 let home_path = dirs::home_dir().unwrap();
55 let config_path = home_path.join(".streamable");
56 std::fs::OpenOptions::new()
57 .write(true)
58 .create(true)
59 .open(config_path)
60 .expect("can not create config file")
61 .write_all(text.as_bytes())
62 .unwrap();
63
64 println!(
65 "saved your login params in {} as .streamable",
66 home_path.to_str().unwrap()
67 );
68 Ok(())
69}
70
71#[cfg(test)]
72mod tests {
73 use crate::upload;
74
75 #[test]
76 fn streamable_upload() {
77 let _ = upload("./media/sample.mp4").unwrap();
78 }
79}