diff --git a/web/src/components/save/buttons/DownloadButton.svelte b/web/src/components/save/buttons/DownloadButton.svelte index 9ebb2234..2dbd4b3e 100644 --- a/web/src/components/save/buttons/DownloadButton.svelte +++ b/web/src/components/save/buttons/DownloadButton.svelte @@ -33,39 +33,48 @@ }, 2500) } + // alerts are temporary, we don't have an error popup yet >_< const download = async (link: string) => { changeDownloadButton("think"); const response = await API.request(link); + if (!response) { changeDownloadButton("error"); 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"); restoreDownloadButton(); - console.log(`error from api: ${response?.text}`) + return alert(`error from api: ${response.text}`); } - if (response?.url) { - if (response?.status === "redirect") { - changeDownloadButton("done"); - window.open(response?.url, '_blank'); - restoreDownloadButton(); - } - if (response?.status === "stream") { - changeDownloadButton("check"); + if (response.status === "redirect") { + changeDownloadButton("done"); + restoreDownloadButton(); - const probeResult = await API.probeCobaltStream(response?.url); - if (probeResult === 200) { - changeDownloadButton("done"); - window.open(response?.url, '_blank'); - restoreDownloadButton(); - } + return window.open(response.url, '_blank'); + } + + if (response.status === "stream") { + changeDownloadButton("check"); + + const probeResult = await API.probeCobaltStream(response.url); + + if (probeResult === 200) { + changeDownloadButton("done"); + restoreDownloadButton(); + + return window.open(response.url, '_blank'); + } else { + changeDownloadButton("error"); + restoreDownloadButton(); + + return alert("couldn't probe the stream"); } } }; diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index fef499cb..3719080c 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -1,3 +1,5 @@ +import type { CobaltAPIResponse } from "$lib/types/api"; + const apiURL = "https://api.cobalt.tools"; const request = async (url: string) => { @@ -5,7 +7,7 @@ const request = async (url: string) => { url } - const response = await fetch(`${apiURL}/api/json`, { + const response: CobaltAPIResponse | undefined = await fetch(`${apiURL}/api/json`, { method: "POST", body: JSON.stringify(request), headers: { diff --git a/web/src/lib/types/api.ts b/web/src/lib/types/api.ts new file mode 100644 index 00000000..2a739f60 --- /dev/null +++ b/web/src/lib/types/api.ts @@ -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;