web: add api response types & clean up DownloadButton
This commit is contained in:
parent
1f2c28bd02
commit
3554222f42
3 changed files with 75 additions and 18 deletions
|
@ -33,39 +33,48 @@
|
||||||
}, 2500)
|
}, 2500)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// alerts are temporary, we don't have an error popup yet >_<
|
||||||
const download = async (link: string) => {
|
const download = async (link: string) => {
|
||||||
changeDownloadButton("think");
|
changeDownloadButton("think");
|
||||||
|
|
||||||
const response = await API.request(link);
|
const response = await API.request(link);
|
||||||
|
|
||||||
if (!response) {
|
if (!response) {
|
||||||
changeDownloadButton("error");
|
changeDownloadButton("error");
|
||||||
restoreDownloadButton();
|
restoreDownloadButton();
|
||||||
|
|
||||||
console.log("couldn't access the api")
|
return alert("couldn't access the api")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (["error", "rate-limit"].includes(response?.status) && response?.text) {
|
if (response.status === "error" || response.status === "rate-limit") {
|
||||||
changeDownloadButton("error");
|
changeDownloadButton("error");
|
||||||
restoreDownloadButton();
|
restoreDownloadButton();
|
||||||
|
|
||||||
console.log(`error from api: ${response?.text}`)
|
return alert(`error from api: ${response.text}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response?.url) {
|
if (response.status === "redirect") {
|
||||||
if (response?.status === "redirect") {
|
|
||||||
changeDownloadButton("done");
|
changeDownloadButton("done");
|
||||||
window.open(response?.url, '_blank');
|
|
||||||
restoreDownloadButton();
|
restoreDownloadButton();
|
||||||
|
|
||||||
|
return window.open(response.url, '_blank');
|
||||||
}
|
}
|
||||||
if (response?.status === "stream") {
|
|
||||||
|
if (response.status === "stream") {
|
||||||
changeDownloadButton("check");
|
changeDownloadButton("check");
|
||||||
|
|
||||||
const probeResult = await API.probeCobaltStream(response?.url);
|
const probeResult = await API.probeCobaltStream(response.url);
|
||||||
|
|
||||||
if (probeResult === 200) {
|
if (probeResult === 200) {
|
||||||
changeDownloadButton("done");
|
changeDownloadButton("done");
|
||||||
window.open(response?.url, '_blank');
|
|
||||||
restoreDownloadButton();
|
restoreDownloadButton();
|
||||||
}
|
|
||||||
|
return window.open(response.url, '_blank');
|
||||||
|
} else {
|
||||||
|
changeDownloadButton("error");
|
||||||
|
restoreDownloadButton();
|
||||||
|
|
||||||
|
return alert("couldn't probe the stream");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import type { CobaltAPIResponse } from "$lib/types/api";
|
||||||
|
|
||||||
const apiURL = "https://api.cobalt.tools";
|
const apiURL = "https://api.cobalt.tools";
|
||||||
|
|
||||||
const request = async (url: string) => {
|
const request = async (url: string) => {
|
||||||
|
@ -5,7 +7,7 @@ const request = async (url: string) => {
|
||||||
url
|
url
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(`${apiURL}/api/json`, {
|
const response: CobaltAPIResponse | undefined = await fetch(`${apiURL}/api/json`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify(request),
|
body: JSON.stringify(request),
|
||||||
headers: {
|
headers: {
|
||||||
|
|
46
web/src/lib/types/api.ts
Normal file
46
web/src/lib/types/api.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
enum CobaltResponseType {
|
||||||
|
Error = 'error',
|
||||||
|
RateLimit = 'rate-limit',
|
||||||
|
Picker = 'picker',
|
||||||
|
Redirect = 'redirect',
|
||||||
|
Stream = 'stream'
|
||||||
|
}
|
||||||
|
|
||||||
|
type CobaltErrorResponse = {
|
||||||
|
status: CobaltResponseType.Error | CobaltResponseType.RateLimit,
|
||||||
|
text: string
|
||||||
|
};
|
||||||
|
|
||||||
|
type CobaltPartialURLResponse = { url: string }
|
||||||
|
|
||||||
|
type CobaltPartialImagesPickerResponse = {
|
||||||
|
pickerType: 'images',
|
||||||
|
picker: CobaltPartialURLResponse[]
|
||||||
|
}
|
||||||
|
|
||||||
|
type CobaltPartialVariousPickerResponse = {
|
||||||
|
pickerType: 'various',
|
||||||
|
picker: {
|
||||||
|
type: 'photo' | 'video',
|
||||||
|
url: string,
|
||||||
|
thumb: string
|
||||||
|
}[];
|
||||||
|
}
|
||||||
|
|
||||||
|
type CobaltPickerResponse = {
|
||||||
|
status: CobaltResponseType.Picker
|
||||||
|
audio: string | false,
|
||||||
|
} & (CobaltPartialImagesPickerResponse | CobaltPartialVariousPickerResponse);
|
||||||
|
|
||||||
|
type CobaltRedirectResponse = {
|
||||||
|
status: CobaltResponseType.Redirect
|
||||||
|
} & CobaltPartialURLResponse;
|
||||||
|
|
||||||
|
type CobaltStreamResponse = {
|
||||||
|
status: CobaltResponseType.Stream
|
||||||
|
} & CobaltPartialURLResponse;
|
||||||
|
|
||||||
|
export type CobaltAPIResponse = CobaltErrorResponse
|
||||||
|
| CobaltPickerResponse
|
||||||
|
| CobaltRedirectResponse
|
||||||
|
| CobaltStreamResponse;
|
Loading…
Reference in a new issue