From 711fcd5e7feb2b254a7d698909748ca2b9cd1b97 Mon Sep 17 00:00:00 2001 From: Aleksi Lassila Date: Sat, 8 Jun 2024 16:56:09 +0300 Subject: [PATCH] fix: Episode page file requesting --- .../EpisodeMediaManagerModal.svelte | 108 ------------------ .../MMAddToSonarrDialog.svelte | 6 +- ....svelte => RadarrMediaManagerModal.svelte} | 0 ....svelte => SonarrMediaManagerModal.svelte} | 0 .../components/SeriesPage/SeriesPage.svelte | 2 +- src/lib/pages/EpisodePage.svelte | 22 +++- src/lib/pages/MoviePage.svelte | 2 +- src/lib/utils.ts | 28 +++++ 8 files changed, 50 insertions(+), 118 deletions(-) delete mode 100644 src/lib/components/MediaManagerModal/EpisodeMediaManagerModal.svelte rename src/lib/components/MediaManagerModal/{MovieMediaManagerModal.svelte => RadarrMediaManagerModal.svelte} (100%) rename src/lib/components/MediaManagerModal/{SeasonMediaManagerModal.svelte => SonarrMediaManagerModal.svelte} (100%) diff --git a/src/lib/components/MediaManagerModal/EpisodeMediaManagerModal.svelte b/src/lib/components/MediaManagerModal/EpisodeMediaManagerModal.svelte deleted file mode 100644 index 49e82f8..0000000 --- a/src/lib/components/MediaManagerModal/EpisodeMediaManagerModal.svelte +++ /dev/null @@ -1,108 +0,0 @@ - - - - {#await sonarrEpisode then sonarrEpisode} - {#if !sonarrEpisode} - - {:else} -
- -

{sonarrEpisode?.title}

-

Season {season} Episode {episode}

-
-
- -
-
- {/if} - {/await} -
diff --git a/src/lib/components/MediaManagerModal/MMAddToSonarrDialog.svelte b/src/lib/components/MediaManagerModal/MMAddToSonarrDialog.svelte index b85c3d7..73fedd2 100644 --- a/src/lib/components/MediaManagerModal/MMAddToSonarrDialog.svelte +++ b/src/lib/components/MediaManagerModal/MMAddToSonarrDialog.svelte @@ -28,7 +28,7 @@ export let title: string; export let modalId: symbol; - export let onComplete: () => void = () => {}; + export let onComplete: (() => void) | (() => Promise) = () => Promise.resolve(); $: backgroundUrl = TMDB_BACKDROP_SMALL + backdropUri; let tab: 'add-to-sonarr' | 'root-folders' | 'quality-profiles' | 'monitor-settings' = @@ -63,7 +63,7 @@ }); addOptionsStore.subscribe(() => (tab = 'add-to-sonarr')); - function handleAddToSonarr() { + async function handleAddToSonarr() { return sonarrApi .addToSonarr(tmdbId as number, { rootFolderPath: $addOptionsStore.rootFolderPath || undefined, @@ -73,7 +73,7 @@ .then((success) => { if (success) { modalStack.close(modalId); - onComplete(); + return onComplete(); } }); } diff --git a/src/lib/components/MediaManagerModal/MovieMediaManagerModal.svelte b/src/lib/components/MediaManagerModal/RadarrMediaManagerModal.svelte similarity index 100% rename from src/lib/components/MediaManagerModal/MovieMediaManagerModal.svelte rename to src/lib/components/MediaManagerModal/RadarrMediaManagerModal.svelte diff --git a/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte b/src/lib/components/MediaManagerModal/SonarrMediaManagerModal.svelte similarity index 100% rename from src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte rename to src/lib/components/MediaManagerModal/SonarrMediaManagerModal.svelte diff --git a/src/lib/components/SeriesPage/SeriesPage.svelte b/src/lib/components/SeriesPage/SeriesPage.svelte index ea45668..24a4da8 100644 --- a/src/lib/components/SeriesPage/SeriesPage.svelte +++ b/src/lib/components/SeriesPage/SeriesPage.svelte @@ -25,7 +25,7 @@ import EpisodeGrid from './EpisodeGrid.svelte'; import { formatSize } from '../../utils'; import FileDetailsDialog from './FileDetailsDialog.svelte'; - import SeasonMediaManagerModal from '../MediaManagerModal/SeasonMediaManagerModal.svelte'; + import SeasonMediaManagerModal from '../MediaManagerModal/SonarrMediaManagerModal.svelte'; import MMAddToSonarrDialog from '../MediaManagerModal/MMAddToSonarrDialog.svelte'; import ConfirmDialog from '../Dialog/ConfirmDialog.svelte'; import DownloadDetailsDialog from './DownloadDetailsDialog.svelte'; diff --git a/src/lib/pages/EpisodePage.svelte b/src/lib/pages/EpisodePage.svelte index f49c128..5d00384 100644 --- a/src/lib/pages/EpisodePage.svelte +++ b/src/lib/pages/EpisodePage.svelte @@ -9,7 +9,7 @@ import Button from '../components/Button.svelte'; import { jellyfinApi } from '../apis/jellyfin/jellyfin-api'; import { playerState } from '../components/VideoPlayer/VideoPlayer'; - import { formatSize } from '../utils'; + import { formatSize, retry, timeout } from '../utils'; import { createModal } from '../components/Modal/modal.store'; import ButtonGhost from '../components/Ghosts/ButtonGhost.svelte'; import { @@ -19,8 +19,9 @@ type SonarrSeries } from '../apis/sonarr/sonarr-api'; import MMAddToSonarrDialog from '../components/MediaManagerModal/MMAddToSonarrDialog.svelte'; - import SeasonMediaManagerModal from '../components/MediaManagerModal/SeasonMediaManagerModal.svelte'; + import SonarrMediaManagerModal from '../components/MediaManagerModal/SonarrMediaManagerModal.svelte'; import ConfirmDialog from '../components/Dialog/ConfirmDialog.svelte'; + import { tick } from 'svelte'; export let id: string; // Series ID export let season: string; @@ -65,10 +66,21 @@ }); } - function handleRequestEpisode() { + async function handleAddedToSonarr() { + sonarrItem = sonarrApi.getSeriesByTmdbId(Number(id)); + return retry(() => getSonarrEpisode(sonarrItem)).then((sonarrEpisode) => { + sonarrEpisode && + createModal(SonarrMediaManagerModal, { + sonarrItem: sonarrEpisode, + onGrabRelease: () => {} + }); + }); + } + + async function handleRequestEpisode() { return Promise.all([sonarrEpisode, tmdbEpisode]).then(([sonarrEpisode, tmdbEpisode]) => { if (sonarrEpisode) { - createModal(SeasonMediaManagerModal, { + createModal(SonarrMediaManagerModal, { sonarrItem: sonarrEpisode, onGrabRelease: () => {} // TODO }); @@ -77,7 +89,7 @@ tmdbId: Number(id), backdropUri: tmdbEpisode.still_path || '', title: tmdbEpisode.name || '', - onComplete: () => (sonarrItem = sonarrApi.getSeriesByTmdbId(Number(id))) + onComplete: handleAddedToSonarr }); } else { console.error('No series found'); diff --git a/src/lib/pages/MoviePage.svelte b/src/lib/pages/MoviePage.svelte index 7faae2e..aee1cda 100644 --- a/src/lib/pages/MoviePage.svelte +++ b/src/lib/pages/MoviePage.svelte @@ -25,7 +25,7 @@ import Carousel from '../components/Carousel/Carousel.svelte'; import TmdbPersonCard from '../components/PersonCard/TmdbPersonCard.svelte'; import TmdbCard from '../components/Card/TmdbCard.svelte'; - import MovieMediaManagerModal from '../components/MediaManagerModal/MovieMediaManagerModal.svelte'; + import MovieMediaManagerModal from '../components/MediaManagerModal/RadarrMediaManagerModal.svelte'; import MMAddToRadarrDialog from '../components/MediaManagerModal/MMAddToRadarrDialog.svelte'; import FileDetailsDialog from '../components/SeriesPage/FileDetailsDialog.svelte'; import DownloadDetailsDialog from '../components/SeriesPage/DownloadDetailsDialog.svelte'; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 5a4e788..a6c6aa9 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -91,6 +91,34 @@ export function timeout(ms: number, ret?: T) { return new Promise((resolve) => setTimeout(() => resolve(ret), ms)); } +export function retry( + fn: () => Promise, + successFn: (v: T) => boolean = (v) => !!v, + options: { retries?: number; delay?: number; reject?: boolean } = {} +) { + let { retries = 3, delay = 1000, reject = false } = options; + return new Promise((resolve, _reject) => { + function attempt() { + fn().then((v) => { + if (successFn(v)) { + resolve(v); + } else { + if (retries > 0) { + retries--; + setTimeout(attempt, delay); + } else if (reject) { + _reject(new Error('Max retries reached')); + } else { + resolve(v); + } + } + }); + } + + attempt(); + }); +} + export function formatDateToYearMonthDay(date: Date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0');