Files
filebrowser/frontend/src/api/files.js
T

179 lines
3.9 KiB
JavaScript
Raw Normal View History

2022-05-02 13:47:22 +00:00
import { fetchURL, removePrefix, createURL } from "./utils";
2021-03-21 12:51:58 +01:00
import { baseURL } from "@/utils/constants";
import store from "@/store";
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
export async function fetch(url) {
url = removePrefix(url);
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
const res = await fetchURL(`/api/resources${url}`, {});
2019-01-05 16:12:09 +00:00
2022-05-04 12:11:36 +00:00
let data = await res.json();
data.url = `/files${url}`;
if (data.isDir) {
if (!data.url.endsWith("/")) data.url += "/";
data.items = data.items.map((item, index) => {
item.index = index;
item.url = `${data.url}${encodeURIComponent(item.name)}`;
if (item.isDir) {
item.url += "/";
}
return item;
});
2019-01-05 16:12:09 +00:00
}
2022-05-04 12:11:36 +00:00
return data;
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
async function resourceAction(url, method, content) {
url = removePrefix(url);
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
let opts = { method };
2019-01-05 16:12:09 +00:00
if (content) {
2021-03-21 12:51:58 +01:00
opts.body = content;
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
const res = await fetchURL(`/api/resources${url}`, opts);
2019-01-05 16:12:09 +00:00
2022-05-04 12:11:36 +00:00
return res;
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export async function remove(url) {
return resourceAction(url, "DELETE");
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export async function put(url, content = "") {
return resourceAction(url, "PUT", content);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export function download(format, ...files) {
let url = `${baseURL}/api/raw`;
2019-01-05 16:12:09 +00:00
if (files.length === 1) {
2021-03-21 12:51:58 +01:00
url += removePrefix(files[0]) + "?";
2019-01-05 16:12:09 +00:00
} else {
2021-03-21 12:51:58 +01:00
let arg = "";
2019-01-05 16:12:09 +00:00
for (let file of files) {
2021-03-21 12:51:58 +01:00
arg += removePrefix(file) + ",";
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
arg = arg.substring(0, arg.length - 1);
arg = encodeURIComponent(arg);
url += `/?files=${arg}&`;
2019-01-05 16:12:09 +00:00
}
2021-03-03 17:46:37 +00:00
if (format) {
2021-03-21 12:51:58 +01:00
url += `algo=${format}&`;
2019-01-05 16:12:09 +00:00
}
2021-03-03 17:46:37 +00:00
2021-03-21 12:51:58 +01:00
if (store.state.jwt) {
url += `auth=${store.state.jwt}&`;
}
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
window.open(url);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export async function post(url, content = "", overwrite = false, onupload) {
url = removePrefix(url);
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
let bufferContent;
if (
content instanceof Blob &&
!["http:", "https:"].includes(window.location.protocol)
) {
bufferContent = await new Response(content).arrayBuffer();
}
2019-01-05 16:12:09 +00:00
return new Promise((resolve, reject) => {
2021-03-21 12:51:58 +01:00
let request = new XMLHttpRequest();
request.open(
"POST",
`${baseURL}/api/resources${url}?override=${overwrite}`,
true
);
request.setRequestHeader("X-Auth", store.state.jwt);
if (typeof onupload === "function") {
request.upload.onprogress = onupload;
2019-01-05 16:12:09 +00:00
}
request.onload = () => {
if (request.status === 200) {
2021-03-21 12:51:58 +01:00
resolve(request.responseText);
2019-01-05 16:12:09 +00:00
} else if (request.status === 409) {
2021-03-21 12:51:58 +01:00
reject(request.status);
2019-01-05 16:12:09 +00:00
} else {
2021-03-21 12:51:58 +01:00
reject(request.responseText);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
};
2019-01-05 16:12:09 +00:00
request.onerror = (error) => {
2021-03-21 12:51:58 +01:00
reject(error);
};
2019-01-05 16:12:09 +00:00
2021-03-21 12:51:58 +01:00
request.send(bufferContent || content);
});
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
function moveCopy(items, copy = false, overwrite = false, rename = false) {
let promises = [];
2019-01-05 16:12:09 +00:00
for (let item of items) {
2021-03-21 12:51:58 +01:00
const from = item.from;
const to = encodeURIComponent(removePrefix(item.to));
const url = `${from}?action=${
copy ? "copy" : "rename"
}&destination=${to}&override=${overwrite}&rename=${rename}`;
promises.push(resourceAction(url, "PATCH"));
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
return Promise.all(promises);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export function move(items, overwrite = false, rename = false) {
return moveCopy(items, false, overwrite, rename);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export function copy(items, overwrite = false, rename = false) {
return moveCopy(items, true, overwrite, rename);
2019-01-05 16:12:09 +00:00
}
2021-03-21 12:51:58 +01:00
export async function checksum(url, algo) {
const data = await resourceAction(`${url}?checksum=${algo}`, "GET");
return (await data.json()).checksums[algo];
2019-01-05 16:12:09 +00:00
}
2022-05-02 13:47:22 +00:00
export function getDownloadURL(file, inline) {
const params = {
...(inline && { inline: "true" }),
};
return createURL("api/raw" + file.path, params);
}
export function getPreviewURL(file, size) {
const params = {
inline: "true",
key: Date.parse(file.modified),
};
return createURL("api/preview/" + size + file.path, params);
}
export function getSubtitlesURL(file) {
const params = {
inline: "true",
};
const subtitles = [];
for (const sub of file.subtitles) {
subtitles.push(createURL("api/raw" + sub, params));
}
return subtitles;
}