diff --git a/src/lib/apis/jellyfin/jellyfinApi.ts b/src/lib/apis/jellyfin/jellyfinApi.ts index 31ec068..e3dd571 100644 --- a/src/lib/apis/jellyfin/jellyfinApi.ts +++ b/src/lib/apis/jellyfin/jellyfinApi.ts @@ -59,7 +59,7 @@ export const getJellyfinItems = () => // } // }).then((r) => r.data?.Items || []); -export const getJellyfinEpisodes = (seriesId: string) => +export const getJellyfinEpisodes = () => JellyfinApi.get('/Users/{userId}/Items', { params: { path: { @@ -73,7 +73,10 @@ export const getJellyfinEpisodes = (seriesId: string) => headers: { 'cache-control': 'max-age=10' } - }).then((r) => r.data?.Items?.filter((i) => i.SeriesId === seriesId) || []); + }).then((r) => r.data?.Items || []); + +export const getJellyfinEpisodesBySeries = (seriesId: string) => + getJellyfinEpisodes().then((items) => items.filter((i) => i.SeriesId === seriesId) || []); export const getJellyfinItemByTmdbId = (tmdbId: string) => getJellyfinItems().then((items) => items.find((i) => i.ProviderIds?.Tmdb == tmdbId)); diff --git a/src/lib/apis/tmdb/tmdbApi.ts b/src/lib/apis/tmdb/tmdbApi.ts index 0b8c216..d4ad83e 100644 --- a/src/lib/apis/tmdb/tmdbApi.ts +++ b/src/lib/apis/tmdb/tmdbApi.ts @@ -20,6 +20,7 @@ export interface TmdbMovieFull2 extends TmdbMovie2 { videos: operations['movie-videos']['responses']['200']['content']['application/json']; credits: operations['movie-credits']['responses']['200']['content']['application/json']; external_ids: operations['movie-external-ids']['responses']['200']['content']['application/json']; + images: operations['movie-images']['responses']['200']['content']['application/json']; } export interface TmdbSeriesFull2 extends TmdbSeries2 { @@ -43,7 +44,8 @@ export const getTmdbMovie = async (tmdbId: number) => movie_id: tmdbId }, query: { - append_to_response: 'videos,credits,external_ids' + append_to_response: 'videos,credits,external_ids,images', + ...({ include_image_language: get(settings).language + ',en,null' } as any) } } }).then((res) => res.data as TmdbMovieFull2 | undefined); diff --git a/src/lib/components/EpisodeCard/EpisodeCard.svelte b/src/lib/components/EpisodeCard/EpisodeCard.svelte index cc78d6d..f846786 100644 --- a/src/lib/components/EpisodeCard/EpisodeCard.svelte +++ b/src/lib/components/EpisodeCard/EpisodeCard.svelte @@ -6,11 +6,13 @@ import { fade } from 'svelte/transition'; export let backdropPath: string; - export let title: string; - export let subtitle: string; + + export let title = ''; + export let subtitle = ''; export let episodeNumber: string | undefined = undefined; - export let runtime: number; + export let runtime = 0; export let progress = 0; + export let handlePlay: (() => void) | undefined = undefined; export let size: 'md' | 'dynamic' = 'md'; @@ -31,36 +33,49 @@ transition:fade|global >
-
+
- - {episodeNumber} + + {#if episodeNumber} +

{episodeNumber}

+ {/if}
- - {runtime} min + + {#if runtime} +

+ {runtime} min +

+ {/if}
-
-
{subtitle}
-
- {title} -
+
+ +
+ {#if subtitle} +
{subtitle}
+ {/if} + {#if title} +
+ {title} +
+ {/if} +
+
+
@@ -72,5 +87,11 @@
-
+ {#if progress} +
+
+
+ {/if}
diff --git a/src/lib/components/IconButton.svelte b/src/lib/components/IconButton.svelte index 88b62a0..34d90fb 100644 --- a/src/lib/components/IconButton.svelte +++ b/src/lib/components/IconButton.svelte @@ -4,7 +4,7 @@ export let disabled = false; -
-
+ diff --git a/src/lib/components/ResourceDetails/LibraryDetails.svelte b/src/lib/components/ResourceDetails/LibraryDetails.svelte index 5ff1c3a..68a81b3 100644 --- a/src/lib/components/ResourceDetails/LibraryDetails.svelte +++ b/src/lib/components/ResourceDetails/LibraryDetails.svelte @@ -1,5 +1,5 @@
@@ -69,8 +79,10 @@ />
-
-

2014

+
+

{new Date(series?.first_air_date || Date.now()).getFullYear()}

+ +

{series?.status}

{series?.genres?.map((g) => g.name).join(', ')}

@@ -87,10 +99,11 @@
- {#each series?.seasons || [] as season, i} + {#each [...Array(series?.number_of_seasons || 0).keys()].map((i) => i + 1) as seasonNumber} + {@const season = series?.seasons?.find((s) => s.season_number === seasonNumber)} {@const isSelected = season?.season_number === visibleSeason}
-
+

{series?.tagline || series?.name}

{series?.overview}

-
+
-

Directed By

+

Created By

{series?.created_by?.map((c) => c.name).join(', ')}

+ {#if series?.first_air_date} +
+

First Air Date

+

+ {new Date(series?.first_air_date).toLocaleDateString('en', { + year: 'numeric', + month: 'short', + day: 'numeric' + })} +

+
+ {/if} + {#if series?.next_episode_to_air} +
+

Next Air Date

+

+ {new Date(series.next_episode_to_air?.air_date).toLocaleDateString('en', { + year: 'numeric', + month: 'short', + day: 'numeric' + })} +

+
+ {:else if series?.last_air_date} +
+

Last Air Date

+

+ {new Date(series.last_air_date).toLocaleDateString('en', { + year: 'numeric', + month: 'short', + day: 'numeric' + })} +

+
+ {/if} +
+

Networks

+

{series?.networks?.map((n) => n.name).join(', ')}

+
+
+

Episode Run Time

+

{series?.episode_run_time} Minutes

+
+
+

Spoken Languages

+

+ {series?.spoken_languages?.map((l) => capitalize(l.name || '')).join(', ')} +

+