web: add api response types & clean up DownloadButton

This commit is contained in:
wukko 2024-06-16 18:53:45 +06:00
parent 1f2c28bd02
commit 3554222f42
No known key found for this signature in database
GPG key ID: 3E30B3F26C7B4AA2
3 changed files with 75 additions and 18 deletions

View file

@ -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");
} }
} }
}; };

View file

@ -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
View 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;