1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
//! Functions for handling file upload and deletion through Catbox's API
//!
//! Calls API described at <https://catbox.moe/tools.php>.
//!
//! See <https://catbox.moe/faq.php> for allowed filetypes and content.
use std::error::Error;
use reqwest::{
multipart::{Form, Part},
Client,
};
use crate::{helper::*, CATBOX_API_URL, UASTRING};
/// Upload a file to catbox.
///
/// Returns an URL to the file
///
/// See <https://catbox.moe/faq.php> for allowed formats and content.
///
/// # Arguments
///
/// * `file_path` - Path to the file to be uploaded
/// * `user_hash` - User's account hash, required for deleting. (Optional)
pub async fn from_file<S: Into<String>>(
file_path: S,
user_hash: Option<S>,
) -> Result<String, Box<dyn Error>> {
let file_path = file_path.into();
let file = file_stream(&file_path).await?;
let file_name = file_name(&file_path);
let form = Form::new()
.text("reqtype", "fileupload")
.text(
"userhash",
user_hash
.and_then(|hash| Some(hash.into()))
.unwrap_or_default(),
)
.part("fileToUpload", Part::stream(file).file_name(file_name));
Ok(Client::builder()
.user_agent(UASTRING)
.build()
.unwrap_or_else(|_| Client::new())
.post(CATBOX_API_URL)
.multipart(form)
.send()
.await?
.text()
.await?)
}
/// Upload contents from an URL to catbox
///
/// Returns an URL to the file
///
/// See <https://catbox.moe/faq.php> for allowed formats and content.
///
/// # Arguments
///
/// * `url` - URL to file
/// * `user_hash` - User's account hash, required for deleting. (Optional)
pub async fn from_url<S: Into<String>>(
url: S,
user_hash: Option<S>,
) -> Result<String, Box<dyn Error>> {
let form = [
("reqtype", "urlupload"),
(
"userhash",
&user_hash
.and_then(|hash| Some(hash.into()))
.unwrap_or_default(),
),
("url", &url.into()),
];
Ok(Client::builder()
.user_agent(UASTRING)
.build()
.unwrap_or_else(|_| Client::new())
.post(CATBOX_API_URL)
.form(&form)
.send()
.await?
.text()
.await?)
}
/// Delete files
///
/// Returns "Files successfully deleted." on success
///
/// # Arguments
///
/// * `user_hash` - User's account hash
/// * `files` - Names of the files to be deleted
pub async fn delete<S: Into<String>>(
user_hash: S,
files: Vec<S>,
) -> Result<String, Box<dyn Error>> {
let files: Vec<_> = files.into_iter().map(|file| file.into()).collect();
let form = [
("reqtype", "deletefiles"),
("userhash", &user_hash.into()),
("files", &files.join(" ")),
];
Ok(Client::builder()
.user_agent(UASTRING)
.build()
.unwrap_or_else(|_| Client::new())
.post(CATBOX_API_URL)
.form(&form)
.send()
.await?
.text()
.await?)
}