uploader/
lib.rs

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}