feat: blossom media uploads
fix: file extensions in URLs
This commit is contained in:
parent
bf19607c07
commit
a113056817
9
Cargo.lock
generated
9
Cargo.lock
generated
@ -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",
|
||||
|
@ -51,3 +51,4 @@ candle-core = { git = "https://git.v0l.io/huggingface/candle.git", tag = "0.7.2"
|
||||
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"] }
|
||||
mime2ext = "0.1.53"
|
||||
|
@ -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()),
|
||||
|
@ -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()],
|
||||
|
@ -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) => {
|
||||
|
@ -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,7 +128,6 @@ export default function Upload() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{type === "nip96" && (
|
||||
<div
|
||||
className="flex gap-2 cursor-pointer"
|
||||
onClick={() => setNoCompress((s) => !s)}
|
||||
@ -136,7 +135,6 @@ export default function Upload() {
|
||||
Disable Compression
|
||||
<input type="checkbox" checked={noCompress} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
<Button
|
||||
onClick={async () => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user