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');