From a1130568170753b7fce511a9dd57cc34ad22f51a Mon Sep 17 00:00:00 2001 From: kieran Date: Fri, 6 Dec 2024 19:56:02 +0000 Subject: [PATCH] feat: blossom media uploads fix: file extensions in URLs --- Cargo.lock | 9 ++++++++- Cargo.toml | 3 ++- src/routes/blossom.rs | 9 ++++++++- src/routes/mod.rs | 9 ++++++++- ui_src/src/upload/blossom.ts | 18 +++++++++++++++++- ui_src/src/views/upload.tsx | 18 ++++++++---------- 6 files changed, 51 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb0d473..fcc0e62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -2016,6 +2016,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime2ext" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "515a63dc9666c865e848b043ab52fe9a5c713ae89cde4b5fbaae67cfd614b93a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2989,6 +2995,7 @@ dependencies = [ "hex", "libc", "log", + "mime2ext", "nostr", "pretty_env_logger", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index b7ffde7..b74e156 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,4 +50,5 @@ ffmpeg-rs-raw = { git = "https://git.v0l.io/Kieran/ffmpeg-rs-raw.git", rev = "df candle-core = { git = "https://git.v0l.io/huggingface/candle.git", tag = "0.7.2", optional = true } candle-nn = { git = "https://git.v0l.io/huggingface/candle.git", tag = "0.7.2", optional = true } candle-transformers = { git = "https://git.v0l.io/huggingface/candle.git", tag = "0.7.2", optional = true } -sqlx-postgres = { version = "0.8.2", optional = true, features = ["chrono", "uuid"] } \ No newline at end of file +sqlx-postgres = { version = "0.8.2", optional = true, features = ["chrono", "uuid"] } +mime2ext = "0.1.53" diff --git a/src/routes/blossom.rs b/src/routes/blossom.rs index ae8b27d..59bfb67 100644 --- a/src/routes/blossom.rs +++ b/src/routes/blossom.rs @@ -34,7 +34,14 @@ impl BlobDescriptor { pub fn from_upload(settings: &Settings, value: &FileUpload) -> Self { let id_hex = hex::encode(&value.id); Self { - url: format!("{}/{}", settings.public_url, &id_hex), + url: format!( + "{}/{}{}", + settings.public_url, + &id_hex, + mime2ext::mime2ext(&value.mime_type) + .map(|m| format!(".{m}")) + .unwrap_or("".to_string()) + ), sha256: id_hex, size: value.size, mime_type: Some(value.mime_type.clone()), diff --git a/src/routes/mod.rs b/src/routes/mod.rs index d7be751..92d1c9f 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -57,7 +57,14 @@ impl Nip94Event { let mut tags = vec![ vec![ "url".to_string(), - format!("{}/{}", &settings.public_url, &hex_id), + format!( + "{}/{}{}", + &settings.public_url, + &hex_id, + mime2ext::mime2ext(&upload.mime_type) + .map(|m| format!(".{m}")) + .unwrap_or("".to_string()) + ), ], vec!["x".to_string(), hex_id], vec!["m".to_string(), upload.mime_type.clone()], diff --git a/ui_src/src/upload/blossom.ts b/ui_src/src/upload/blossom.ts index cf2a914..139aa76 100644 --- a/ui_src/src/upload/blossom.ts +++ b/ui_src/src/upload/blossom.ts @@ -34,6 +34,22 @@ export class Blossom { } } + async media(file: File) { + const hash = await window.crypto.subtle.digest( + "SHA-256", + await file.arrayBuffer(), + ); + const tags = [["x", bytesToString("hex", new Uint8Array(hash))]]; + + const rsp = await this.#req("/media", "PUT", file, tags); + if (rsp.ok) { + return (await rsp.json()) as BlobDescriptor; + } else { + const text = await rsp.text(); + throw new Error(text); + } + } + async #req( path: string, method: "GET" | "POST" | "DELETE" | "PUT", @@ -42,7 +58,7 @@ export class Blossom { ) { throwIfOffline(); - const url = `${this.url}upload`; + const url = `${this.url}${path}`; const now = unixNow(); const auth = async (url: string, method: string) => { const auth = await this.publisher.generic((eb) => { diff --git a/ui_src/src/views/upload.tsx b/ui_src/src/views/upload.tsx index 2dae25e..684b454 100644 --- a/ui_src/src/views/upload.tsx +++ b/ui_src/src/views/upload.tsx @@ -31,7 +31,7 @@ export default function Upload() { setError(undefined); if (type === "blossom") { const uploader = new Blossom(url, pub); - const result = await uploader.upload(toUpload); + const result = noCompress ? await uploader.upload(toUpload) : await uploader.media(toUpload); setResults((s) => [...s, result]); } if (type === "nip96") { @@ -128,15 +128,13 @@ export default function Upload() { - {type === "nip96" && ( -
setNoCompress((s) => !s)} - > - Disable Compression - -
- )} +
setNoCompress((s) => !s)} + > + Disable Compression + +