diff --git a/src/lib/components/RequestModal/SeriesRequestModal.svelte b/src/lib/components/RequestModal/SeriesRequestModal.svelte
index eb4b440..e768bda 100644
--- a/src/lib/components/RequestModal/SeriesRequestModal.svelte
+++ b/src/lib/components/RequestModal/SeriesRequestModal.svelte
@@ -20,7 +20,8 @@
seasonPack: {
sonarrId,
seasonNumber
- }
+ },
+ groupId: modalId
},
modalId
);
diff --git a/src/lib/components/VideoPlayer/VideoPlayer.svelte b/src/lib/components/VideoPlayer/VideoPlayer.svelte
index 767e676..a3a76da 100644
--- a/src/lib/components/VideoPlayer/VideoPlayer.svelte
+++ b/src/lib/components/VideoPlayer/VideoPlayer.svelte
@@ -18,7 +18,7 @@
export let modalId: Symbol;
- let uiVisible = false;
+ let uiVisible = true;
let video: HTMLVideoElement;
let mouseMovementTimeout: NodeJS.Timeout;
@@ -37,7 +37,15 @@
return;
}
+ video.poster = item?.BackdropImageTags?.length
+ ? `http://jellyfin.home/Items/${item?.Id}/Images/Backdrop?quality=100&tag=${item?.BackdropImageTags?.[0]}`
+ : '';
+
if (!directPlay) {
+ if (!Hls.isSupported()) {
+ throw new Error('HLS is not supported');
+ }
+
const hls = new Hls();
hls.loadSource(PUBLIC_JELLYFIN_URL + playbackUri);
@@ -76,32 +84,31 @@
}
function handleMouseMove() {
- uiVisible = true;
- clearTimeout(mouseMovementTimeout);
- mouseMovementTimeout = setTimeout(() => {
- uiVisible = false;
- }, 2000);
+ // uiVisible = true;
+ // clearTimeout(mouseMovementTimeout);
+ // mouseMovementTimeout = setTimeout(() => {
+ // uiVisible = false;
+ // }, 2000);
}
onDestroy(() => clearInterval(progressInterval));
$: {
if (video && $playerState.jellyfinId) {
- if (!Hls.isSupported()) {
- throw new Error('HLS is not supported');
- }
-
if (video.src === '') fetchPlaybackInfo($playerState.jellyfinId);
}
}
-
+
-
+
{
? ((radarrDownload.size - radarrDownload.sizeleft) / radarrDownload.size) * 100
: undefined;
const completionTime = radarrDownload?.estimatedCompletionTime || undefined;
- const download =
- downloadProgress && completionTime
- ? { progress: downloadProgress, completionTime }
- : undefined;
+ const download = downloadProgress ? { progress: downloadProgress, completionTime } : undefined;
const length = jellyfinItem?.RunTimeTicks
? jellyfinItem.RunTimeTicks / 10_000_000 / 60
@@ -117,14 +112,6 @@ async function getLibrary(): Promise
{
? { length, progress: watchingProgress }
: undefined;
- // const tmdbMovie = await getTmdbMovie(radarrMovie.tmdbId || 0);
- // const backdropUrl = (
- // tmdbMovie?.images?.backdrops?.find((b) => b.iso_639_1 === get(settings).language) ||
- // tmdbMovie?.images?.backdrops?.find((b) => b.iso_639_1 === 'en') ||
- // tmdbMovie?.images?.backdrops?.find((b) => b.iso_639_1) ||
- // tmdbMovie?.images?.backdrops?.[0]
- // )?.file_path;
-
const backdropUrl = await getTmdbMovieBackdrop(radarrMovie.tmdbId || 0);
const posterUri = await getTmdbMoviePoster(radarrMovie.tmdbId || 0);
@@ -141,7 +128,6 @@ async function getLibrary(): Promise {
jellyfinItem,
radarrMovie,
radarrDownloads: itemRadarrDownloads
- // tmdbMovie
};
});
@@ -159,10 +145,7 @@ async function getLibrary(): Promise {
? ((sonarrDownload.size - sonarrDownload.sizeleft) / sonarrDownload.size) * 100
: undefined;
const completionTime = sonarrDownload?.estimatedCompletionTime || undefined;
- const download =
- downloadProgress && completionTime
- ? { progress: downloadProgress, completionTime }
- : undefined;
+ const download = downloadProgress ? { progress: downloadProgress, completionTime } : undefined;
const nextJellyfinEpisode = jellyfinItem
? jellyfinContinueWatching.find((i) => i.SeriesId === jellyfinItem?.Id) ||
@@ -183,14 +166,6 @@ async function getLibrary(): Promise {
: undefined;
const tmdbId = tmdbItem?.id || undefined;
- // const tmdbSeries = await getTmdbSeries(tmdbId || 0);
- // const backdropUrl = (
- // tmdbSeries?.images?.backdrops?.find((b) => b.iso_639_1 === get(settings).language) ||
- // tmdbSeries?.images?.backdrops?.find((b) => b.iso_639_1 === 'en') ||
- // tmdbSeries?.images?.backdrops?.find((b) => b.iso_639_1) ||
- // tmdbSeries?.images?.backdrops?.[0]
- // )?.file_path;
-
const backdropUrl = await getTmdbSeriesBackdrop(tmdbId || 0);
const posterUri = tmdbItem?.poster_path || '';
@@ -209,7 +184,6 @@ async function getLibrary(): Promise {
sonarrDownloads: itemSonarrDownloads,
jellyfinEpisodes: jellyfinEpisodes.filter((i) => i.SeriesId === jellyfinItem?.Id),
nextJellyfinEpisode
- // tmdbSeries
};
});
@@ -232,7 +206,7 @@ let delayedRefreshTimeout: NodeJS.Timeout;
function createLibraryStore() {
const { update, set, ...library } = writable>(getLibrary()); //TODO promise to undefined
- async function filterNotInLibrary(toFilter: T[], getTmdbId: (item: T) => any) {
+ async function filterNotInLibrary(toFilter: T[], getTmdbId: (item: T) => number) {
const libraryData = await get(library);
return toFilter.filter((item) => !(getTmdbId(item) in libraryData.items));
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 5de3124..f6ba6d1 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -57,31 +57,31 @@
}
-{#await tmdbPopularMoviesPromise}
-
-{:then movies}
- {@const movie = movies[showcaseIndex]}
- {#key movie?.id}
- g.name || '') || []}
- runtime={movie?.runtime || 0}
- releaseDate={new Date(movie?.release_date || Date.now())}
- tmdbRating={movie?.vote_average || 0}
- trailerId={movie?.videos?.results?.find((v) => v.site === 'YouTube' && v.type === 'Trailer')
- ?.key}
- director={movie?.credits?.crew?.find((c) => c.job === 'Director')?.name}
- backdropUri={movie?.backdrop_path || ''}
- posterUri={movie?.poster_path || ''}
- {onPrevious}
- {onNext}
- {showcaseIndex}
- showcaseLength={movies.length}
- />
- {/key}
-{/await}
+
+ {#await tmdbPopularMoviesPromise then movies}
+ {@const movie = movies[showcaseIndex]}
+ {#key movie?.id}
+ g.name || '') || []}
+ runtime={movie?.runtime || 0}
+ releaseDate={new Date(movie?.release_date || Date.now())}
+ tmdbRating={movie?.vote_average || 0}
+ trailerId={movie?.videos?.results?.find((v) => v.site === 'YouTube' && v.type === 'Trailer')
+ ?.key}
+ director={movie?.credits?.crew?.find((c) => c.job === 'Director')?.name}
+ backdropUri={movie?.backdrop_path || ''}
+ posterUri={movie?.poster_path || ''}
+ {onPrevious}
+ {onNext}
+ {showcaseIndex}
+ showcaseLength={movies.length}
+ />
+ {/key}
+ {/await}
+
diff --git a/src/routes/discover/+page.svelte b/src/routes/discover/+page.svelte
index a845246..9d57824 100644
--- a/src/routes/discover/+page.svelte
+++ b/src/routes/discover/+page.svelte
@@ -70,11 +70,9 @@
subtitle: actor.known_for_department || ''
}))
);
-
- const headerStyle = 'uppercase tracking-widest font-bold';
-
+
{#await fetchTrendingProps()}
diff --git a/src/routes/library/+page.svelte b/src/routes/library/+page.svelte
index 5a1aef7..26b8851 100644
--- a/src/routes/library/+page.svelte
+++ b/src/routes/library/+page.svelte
@@ -20,6 +20,7 @@
let searchInput: HTMLInputElement | undefined;
let searchInputValue = '';
+ let openNextUpTab: 'downloading' | 'nextUp' = 'downloading';
let openTab: 'available' | 'watched' | 'unavailable' = 'available';
let items: PlayableItem[] = [];
@@ -211,19 +212,35 @@
>
- {#if downloadingProps.length}
-
- {#each downloadingProps as props (props.tmdbId)}
-
- {/each}
-
- {:else}
-
- {#each nextUpProps as props (props.tmdbId)}
-
- {:else}
-
- {/each}
+ {#if downloadingProps.length || nextUpProps.length}
+
+
+
+
+
+ {#if downloadingProps.length && openNextUpTab === 'downloading'}
+ {#each downloadingProps as props (props.tmdbId)}
+
+ {/each}
+ {:else if openNextUpTab === 'nextUp'}
+ {#each nextUpProps as props (props.tmdbId)}
+
+ {/each}
+ {/if}
{/if}
@@ -243,19 +260,29 @@
(openTab = 'available')}
>
+ Available
+
(openTab = 'watched')}
>
+ Watched
+
(openTab = 'unavailable')}
>
+ Unavailable
+
@@ -272,13 +299,17 @@
{#if loading}
-
+
{#each [...Array(20).keys()] as index (index)}
{/each}
{:else}
-
+
{#if openTab === 'available'}
{#each availableProps as props (props.tmdbId)}
diff --git a/src/routes/movie/[id]/MoviePage.svelte b/src/routes/movie/[id]/MoviePage.svelte
index 606c343..2c8cf44 100644
--- a/src/routes/movie/[id]/MoviePage.svelte
+++ b/src/routes/movie/[id]/MoviePage.svelte
@@ -257,11 +257,13 @@
Download Completed In
- {formatMinutesToTime(
- (new Date($itemStore.item?.download.completionTime).getTime() - Date.now()) /
- 1000 /
- 60
- )}
+ {$itemStore.item?.download.completionTime
+ ? formatMinutesToTime(
+ (new Date($itemStore.item?.download.completionTime).getTime() - Date.now()) /
+ 1000 /
+ 60
+ )
+ : 'Stalled'}
{/if}
diff --git a/src/routes/series/[id]/SeriesPage.svelte b/src/routes/series/[id]/SeriesPage.svelte
index 1e51cd5..8f51a40 100644
--- a/src/routes/series/[id]/SeriesPage.svelte
+++ b/src/routes/series/[id]/SeriesPage.svelte
@@ -322,11 +322,13 @@
Download Completed In
- {formatMinutesToTime(
- (new Date($itemStore.item?.download.completionTime).getTime() - Date.now()) /
- 1000 /
- 60
- )}
+ {$itemStore.item?.download.completionTime
+ ? formatMinutesToTime(
+ (new Date($itemStore.item?.download.completionTime).getTime() - Date.now()) /
+ 1000 /
+ 60
+ )
+ : 'Stalled'}
{/if}