gradio / client /js /src /upload.ts
mindmime's picture
Upload folder using huggingface_hub
a03b3ba verified
import { upload_files } from "./client";
export function normalise_file(
file: FileData | null,
server_url: string,
proxy_url: string | null
): FileData | null;
export function normalise_file(
file: FileData[] | null,
server_url: string,
proxy_url: string | null
): FileData[] | null;
export function normalise_file(
file: FileData[] | FileData | null,
server_url: string, // root: string,
proxy_url: string | null // root_url: string | null
): FileData[] | FileData | null;
export function normalise_file(
file: FileData[] | FileData | null,
server_url: string, // root: string,
proxy_url: string | null // root_url: string | null
): FileData[] | FileData | null {
if (file == null) {
return null;
}
if (Array.isArray(file)) {
const normalized_file: (FileData | null)[] = [];
for (const x of file) {
if (x == null) {
normalized_file.push(null);
} else {
normalized_file.push(normalise_file(x, server_url, proxy_url));
}
}
return normalized_file as FileData[];
}
if (file.is_stream) {
if (proxy_url == null) {
return new FileData({
...file,
url: server_url + "/stream/" + file.path
});
}
return new FileData({
...file,
url: "/proxy=" + proxy_url + "stream/" + file.path
});
}
return new FileData({
...file,
url: get_fetchable_url_or_file(file.path, server_url, proxy_url)
});
}
function is_url(str: string): boolean {
try {
const url = new URL(str);
return url.protocol === "http:" || url.protocol === "https:";
} catch {
return false;
}
}
export function get_fetchable_url_or_file(
path: string | null,
server_url: string,
proxy_url: string | null
): string {
if (path == null) {
return proxy_url ? `/proxy=${proxy_url}file=` : `${server_url}/file=`;
}
if (is_url(path)) {
return path;
}
return proxy_url
? `/proxy=${proxy_url}file=${path}`
: `${server_url}/file=${path}`;
}
export async function upload(
file_data: FileData[],
root: string,
upload_id?: string,
upload_fn: typeof upload_files = upload_files
): Promise<(FileData | null)[] | null> {
let files = (Array.isArray(file_data) ? file_data : [file_data]).map(
(file_data) => file_data.blob!
);
return await Promise.all(
await upload_fn(root, files, undefined, upload_id).then(
async (response: { files?: string[]; error?: string }) => {
if (response.error) {
throw new Error(response.error);
} else {
if (response.files) {
return response.files.map((f, i) => {
const file = new FileData({ ...file_data[i], path: f });
return normalise_file(file, root, null);
});
}
return [];
}
}
)
);
}
export async function prepare_files(
files: File[],
is_stream?: boolean
): Promise<FileData[]> {
return files.map(
(f, i) =>
new FileData({
path: f.name,
orig_name: f.name,
blob: f,
size: f.size,
mime_type: f.type,
is_stream
})
);
}
export class FileData {
path: string;
url?: string;
orig_name?: string;
size?: number;
blob?: File;
is_stream?: boolean;
mime_type?: string;
alt_text?: string;
constructor({
path,
url,
orig_name,
size,
blob,
is_stream,
mime_type,
alt_text
}: {
path: string;
url?: string;
orig_name?: string;
size?: number;
blob?: File;
is_stream?: boolean;
mime_type?: string;
alt_text?: string;
}) {
this.path = path;
this.url = url;
this.orig_name = orig_name;
this.size = size;
this.blob = url ? undefined : blob;
this.is_stream = is_stream;
this.mime_type = mime_type;
this.alt_text = alt_text;
}
}