mirror of
https://github.com/Waradu/streamshare.git
synced 2025-04-22 04:14:06 +02:00
refractored code
This commit is contained in:
parent
11456948d5
commit
2d635f5807
4 changed files with 116 additions and 85 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1084,7 +1084,7 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "streamshare"
|
name = "streamshare"
|
||||||
version = "3.0.0"
|
version = "4.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "streamshare"
|
name = "streamshare"
|
||||||
version = "3.0.0"
|
version = "4.0.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Upload to streamshare library"
|
description = "Upload to streamshare library"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
|
@ -7,6 +7,8 @@ Upload files to [streamshare](https://streamshare.wireway.ch)
|
||||||
Upload:
|
Upload:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
let client = StreamShare::default();
|
||||||
|
|
||||||
let callback = |uploaded_bytes, total_bytes| {
|
let callback = |uploaded_bytes, total_bytes| {
|
||||||
println!(
|
println!(
|
||||||
"Uploaded {}b of {}b",
|
"Uploaded {}b of {}b",
|
||||||
|
@ -15,7 +17,7 @@ let callback = |uploaded_bytes, total_bytes| {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
match upload(&file_path, callback).await {
|
match client.upload(&file_path, callback).await {
|
||||||
Ok((file_identifier, _deletion_token)) => {
|
Ok((file_identifier, _deletion_token)) => {
|
||||||
let download_url = format!(
|
let download_url = format!(
|
||||||
"https://streamshare.wireway.ch/download/{}",
|
"https://streamshare.wireway.ch/download/{}",
|
||||||
|
@ -32,7 +34,9 @@ match upload(&file_path, callback).await {
|
||||||
Delete:
|
Delete:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
match streamshare::delete(file_identifier, deletion_token).await {
|
let client = StreamShare::default();
|
||||||
|
|
||||||
|
match client.delete(file_identifier, deletion_token).await {
|
||||||
Ok(_) => println!("File deleted successfully"),
|
Ok(_) => println!("File deleted successfully"),
|
||||||
Err(e) => eprintln!("Error deleting file: {}", e),
|
Err(e) => eprintln!("Error deleting file: {}", e),
|
||||||
}
|
}
|
||||||
|
|
71
src/lib.rs
71
src/lib.rs
|
@ -17,14 +17,33 @@ struct CreateResponse {
|
||||||
deletion_token: String,
|
deletion_token: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn upload<F>(file_path: &str, mut callback: F) -> Result<(String, String), Box<dyn std::error::Error>>
|
pub struct StreamShare {
|
||||||
where
|
server_url: String,
|
||||||
F: FnMut(u64, u64)
|
chunk_size: usize,
|
||||||
{
|
client: Client,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StreamShare {
|
||||||
|
pub fn new(server_url: String, chunk_size: usize) -> Self {
|
||||||
|
Self {
|
||||||
|
server_url: server_url,
|
||||||
|
chunk_size: chunk_size,
|
||||||
|
client: Client::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn upload<F>(
|
||||||
|
&self,
|
||||||
|
file_path: &str,
|
||||||
|
mut callback: F,
|
||||||
|
) -> Result<(String, String), Box<dyn std::error::Error>>
|
||||||
|
where
|
||||||
|
F: FnMut(u64, u64),
|
||||||
|
{
|
||||||
let path = Path::new(file_path);
|
let path = Path::new(file_path);
|
||||||
let metadata = fs::metadata(path).await?;
|
let metadata = fs::metadata(path).await?;
|
||||||
if !metadata.is_file() {
|
if !metadata.is_file() {
|
||||||
return Err("Selected item is not a file".into());
|
return Err(format!("Selected item is not a file: {}", file_path).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let file_size = metadata.len();
|
let file_size = metadata.len();
|
||||||
|
@ -33,11 +52,11 @@ where
|
||||||
.and_then(|s| s.to_str())
|
.and_then(|s| s.to_str())
|
||||||
.unwrap_or("unknown");
|
.unwrap_or("unknown");
|
||||||
|
|
||||||
let client = Client::new();
|
let create_url = format!("https://{}/api/create", self.server_url);
|
||||||
let create_url = "https://streamshare.wireway.ch/api/create";
|
|
||||||
|
|
||||||
let res = client
|
let res = self
|
||||||
.post(create_url)
|
.client
|
||||||
|
.post(&create_url)
|
||||||
.json(&serde_json::json!({ "name": file_name }))
|
.json(&serde_json::json!({ "name": file_name }))
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -48,19 +67,17 @@ where
|
||||||
|
|
||||||
let create_response: CreateResponse = res.json().await?;
|
let create_response: CreateResponse = res.json().await?;
|
||||||
let ws_url = format!(
|
let ws_url = format!(
|
||||||
"wss://streamshare.wireway.ch/api/upload/{}",
|
"wss://{}/api/upload/{}",
|
||||||
create_response.file_identifier
|
self.server_url, create_response.file_identifier
|
||||||
);
|
);
|
||||||
let (mut ws_stream, _) = connect_async(ws_url).await?;
|
let (mut ws_stream, _) = connect_async(ws_url).await?;
|
||||||
|
|
||||||
let mut file = File::open(path).await?;
|
let mut file = File::open(path).await?;
|
||||||
const CHUNK_SIZE: usize = 1024 * 1024;
|
let mut buffer = vec![0u8; self.chunk_size];
|
||||||
let mut buffer = vec![0u8; CHUNK_SIZE];
|
|
||||||
let mut uploaded: u64 = 0;
|
let mut uploaded: u64 = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let n = file.read(&mut buffer).await?;
|
let n = file.read(&mut buffer).await?;
|
||||||
|
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -68,7 +85,6 @@ where
|
||||||
let chunk = &buffer[..n];
|
let chunk = &buffer[..n];
|
||||||
ws_stream.send(Message::Binary(chunk.to_vec())).await?;
|
ws_stream.send(Message::Binary(chunk.to_vec())).await?;
|
||||||
uploaded += n as u64;
|
uploaded += n as u64;
|
||||||
|
|
||||||
callback(uploaded, file_size);
|
callback(uploaded, file_size);
|
||||||
|
|
||||||
match ws_stream.next().await {
|
match ws_stream.next().await {
|
||||||
|
@ -92,22 +108,33 @@ where
|
||||||
create_response.file_identifier,
|
create_response.file_identifier,
|
||||||
create_response.deletion_token,
|
create_response.deletion_token,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn delete(
|
pub async fn delete(
|
||||||
|
&self,
|
||||||
file_identifier: &str,
|
file_identifier: &str,
|
||||||
deletion_token: &str,
|
deletion_token: &str,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let client = Client::new();
|
|
||||||
let delete_url = format!(
|
let delete_url = format!(
|
||||||
"https://streamshare.wireway.ch/api/delete/{}/{}",
|
"https://{}/api/delete/{}/{}",
|
||||||
file_identifier, deletion_token
|
self.server_url, file_identifier, deletion_token
|
||||||
);
|
);
|
||||||
|
|
||||||
let res = client.delete(&delete_url).send().await?;
|
let res = self.client.delete(&delete_url).send().await?;
|
||||||
if res.status().is_success() {
|
if res.status().is_success() {
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Err(format!("Failed to delete file: {}", res.status()).into())
|
Err(format!("Failed to delete file: {}", res.status()).into())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for StreamShare {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
server_url: "streamshare.wireway.ch".to_string(),
|
||||||
|
chunk_size: 1024 * 1024,
|
||||||
|
client: Client::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue