diff --git a/web/src/lib/components/download-movie-dialog.svelte b/web/src/lib/components/download-movie-dialog.svelte index 1650abf..7ff19ba 100644 --- a/web/src/lib/components/download-movie-dialog.svelte +++ b/web/src/lib/components/download-movie-dialog.svelte @@ -10,17 +10,20 @@ import * as Tabs from '$lib/components/ui/tabs/index.js'; import * as Table from '$lib/components/ui/table/index.js'; import client from '$lib/api'; - import type { components } from '$lib/api/api'; import SelectFilePathSuffixDialog from '$lib/components/select-file-path-suffix-dialog.svelte'; + let { movie } = $props(); let dialogueState = $state(false); - let torrents: components['schemas']['IndexerQueryResult'][] = $state([]); - let isLoadingTorrents: boolean = $state(false); - let torrentsError: string | null = $state(null); + let torrentsPromise: any = $state(); + let tabState: string = $state('basic'); + let isLoading: boolean = $state(false); + let advancedMode: boolean = $derived(tabState === 'advanced'); let queryOverride: string = $state(''); let filePathSuffix: string = $state(''); + let torrentsError: string | null = $state(null); async function downloadTorrent(result_id: string) { + torrentsError = null; const { data, response } = await client.POST(`/api/v1/movies/{movie_id}/torrents`, { params: { path: { @@ -52,56 +55,27 @@ } } - async function getTorrents( - override: boolean = false - ): Promise { - isLoadingTorrents = true; + async function search() { + isLoading = true; torrentsError = null; - torrents = []; - let { response, data } = await client.GET('/api/v1/movies/{movie_id}/torrents', { - params: { - query: { - search_query_override: override ? queryOverride : undefined - }, - path: { - movie_id: movie.id + torrentsPromise = client + .GET('/api/v1/movies/{movie_id}/torrents', { + params: { + query: { + search_query_override: advancedMode ? queryOverride : undefined + }, + path: { + movie_id: movie.id + } } - } - }); - data = data as components['schemas']['IndexerQueryResult'][]; - isLoadingTorrents = false; - - if (!response.ok) { - const errorMessage = `Failed to fetch torrents for movie ${movie.id}: ${response.statusText}`; - torrentsError = errorMessage; - if (dialogueState) toast.error(errorMessage); - return []; - } - - if (dialogueState) { - if (data.length > 0) { - toast.success(`Found ${data.length} torrents.`); - } else { - toast.info('No torrents found for your query.'); - } - } - return data; + }) + .finally(() => (isLoading = false)); + toast.info('Searching for torrents...'); + toast.info('Found ' + (await torrentsPromise).data?.length + ' torrents.'); } - - $effect(() => { - if (movie?.id) { - getTorrents().then((fetchedTorrents) => { - if (!isLoadingTorrents) { - torrents = fetchedTorrents; - } else if (fetchedTorrents.length > 0 || torrentsError) { - torrents = fetchedTorrents; - } - }); - } - }); - + (dialogueState ? search() : null)}> Download Movie @@ -110,7 +84,7 @@ Search and download torrents for a specific season or season packs. - + Standard Mode Advanced Mode @@ -118,19 +92,10 @@

@@ -167,15 +124,16 @@ + {#if torrentsError} +

An error occurred: {torrentsError}
+ {/if}
- {#if isLoadingTorrents} + {#await torrentsPromise}

Loading torrents...

- {:else if torrentsError} -

Error: {torrentsError}

- {:else if torrents.length > 0} + {:then data}

Found Torrents:

@@ -191,7 +149,7 @@ - {#each torrents as torrent (torrent.id)} + {#each data?.data as torrent (torrent.id)} {torrent.title} {(torrent.size / 1024 / 1024 / 1024).toFixed(2)}GB @@ -211,13 +169,22 @@ /> + {:else} + +
No torrents found.
+
{/each}
- {:else} -

No torrents found!

- {/if} + {:catch error} + +
Failed to load torrents.
+
+ +
Error: {error.message}
+
+ {/await}
diff --git a/web/src/lib/components/download-season-dialog.svelte b/web/src/lib/components/download-season-dialog.svelte index 78f782a..d0edeb5 100644 --- a/web/src/lib/components/download-season-dialog.svelte +++ b/web/src/lib/components/download-season-dialog.svelte @@ -16,13 +16,17 @@ let { show }: { show: components['schemas']['Show'] } = $props(); let dialogueState = $state(false); let selectedSeasonNumber: number = $state(1); - let torrents: components['schemas']['IndexerQueryResult'][] = $state([]); - let isLoadingTorrents: boolean = $state(false); let torrentsError: string | null = $state(null); let queryOverride: string = $state(''); let filePathSuffix: string = $state(''); + let torrentsPromise: any = $state(); + let tabState: string = $state('basic'); + let isLoading: boolean = $state(false); + let advancedMode: boolean = $derived(tabState === 'advanced'); + async function downloadTorrent(result_id: string) { + torrentsError = null; const { response } = await client.POST('/api/v1/tv/torrents', { params: { query: { @@ -50,56 +54,26 @@ } } - async function getTorrents( - season_number: number, - override: boolean = false - ): Promise { - isLoadingTorrents = true; + async function search() { + isLoading = true; torrentsError = null; - torrents = []; - - let { response, data } = await client.GET('/api/v1/tv/torrents', { - params: { - query: { - show_id: show.id!, - search_query_override: override ? queryOverride : undefined, - season_number: override ? undefined : season_number + torrentsPromise = client + .GET('/api/v1/tv/torrents', { + params: { + query: { + show_id: show.id!, + search_query_override: advancedMode ? queryOverride : undefined, + season_number: advancedMode ? undefined : selectedSeasonNumber + } } - } - }); - data = data as components['schemas']['IndexerQueryResult'][]; - isLoadingTorrents = false; - - if (!response.ok) { - const errorMessage = `Failed to fetch torrents for show ${show.id} and season ${selectedSeasonNumber}: ${response.statusText}`; - torrentsError = errorMessage; - if (dialogueState) toast.error(errorMessage); - return []; - } - - if (dialogueState) { - if (data.length > 0) { - toast.success(`Found ${data.length} torrents.`); - } else { - toast.info('No torrents found for your query.'); - } - } - return data; + }) + .finally(() => (isLoading = false)); + toast.info('Searching for torrents...'); + toast.info('Found ' + (await torrentsPromise).data?.length + ' torrents.'); } - $effect(() => { - if (show?.id) { - getTorrents(selectedSeasonNumber).then((fetchedTorrents) => { - if (!isLoadingTorrents) { - torrents = fetchedTorrents; - } else if (fetchedTorrents.length > 0 || torrentsError) { - torrents = fetchedTorrents; - } - }); - } - }); - + (dialogueState ? search() : null)}> Download Seasons @@ -108,7 +82,7 @@ Search and download torrents for a specific season or season packs. - + Standard Mode Advanced Mode @@ -126,21 +100,13 @@ max={show.seasons.at(-1)?.number} />

@@ -156,21 +122,13 @@

@@ -180,15 +138,16 @@ + {#if torrentsError} +

An error occurred: {torrentsError}
+ {/if}
- {#if isLoadingTorrents} + {#await torrentsPromise}

Loading torrents...

- {:else if torrentsError} -

Error: {torrentsError}

- {:else if torrents.length > 0} + {:then data}

Found Torrents:

@@ -207,7 +166,7 @@ - {#each torrents as torrent (torrent.id)} + {#each data?.data as torrent (torrent.id)} {torrent.title} {(torrent.size / 1024 / 1024 / 1024).toFixed(2)}GB @@ -242,13 +201,18 @@ /> + {:else} + +
No torrents found.
+
{/each}
- {:else if show?.seasons?.length > 0} -

No torrents found for season {selectedSeasonNumber}. Try a different season.

- {/if} + {:catch error} +
Failed to load torrents.
+
Error: {error.message}
+ {/await}