diff --git a/src/lib/apis/tmdb/tmdb-api.ts b/src/lib/apis/tmdb/tmdb-api.ts index f721761..8f26041 100644 --- a/src/lib/apis/tmdb/tmdb-api.ts +++ b/src/lib/apis/tmdb/tmdb-api.ts @@ -305,6 +305,35 @@ export class TmdbApi implements Api { getPersonBackdrops = async (person_id: number) => this.getPersonTaggedImages(person_id).then((r) => r.filter((i) => (i.aspect_ratio || 0) > 1.5)); + getMovieVideos = async (tmdbId: number) => { + return this.getClient() + .GET('/3/movie/{movie_id}/videos', { + params: { + path: { + movie_id: tmdbId + }, + query: { + language: get(settings)?.language || 'en', + } + } + }) + .then((res) => res.data?.results || []); + }; + getSeriesVideos = async (tmdbId: number) => { + return this.getClient() + ?.GET('/3/tv/{series_id}/videos', { + params: { + path: { + series_id: tmdbId + }, + query: { + language: get(settings)?.language || 'en', + } + } + }) + .then((res) => res.data?.results || []); + }; + // OTHER // USER diff --git a/src/lib/components/HeroCarousel/HeroBackground.svelte b/src/lib/components/HeroCarousel/HeroBackground.svelte index 1a39ec4..758113f 100644 --- a/src/lib/components/HeroCarousel/HeroBackground.svelte +++ b/src/lib/components/HeroCarousel/HeroBackground.svelte @@ -3,6 +3,7 @@ import classNames from 'classnames'; import { onDestroy } from 'svelte'; import { isFirefox } from '../../utils/browser-detection'; + import YouTubeBackground from '../YouTubeBackground.svelte'; export let urls: Promise; export let index: number; @@ -36,45 +37,47 @@
+ {#await urls then urlArray} {#if !isFirefox()} - {#await urls then urls} - {#each urls as url, i} -
+ {:else} +
+ {/if} + {/if} + {/each} + {:else} +
+ {#each urlArray as { backdropUrl }, i} +
+
+ style={`background-image: url('${backdropUrl}'); ${ + !PLATFORM_TV && + 'transform: translateZ(-5px) scale(6); -webkit-transform: translateZ(-5px) scale(6);' + }`} + /> +
{/each} - {/await} - {:else} -
- {#await urls then urls} - {#each urls as url, i} -
-
-
- {/each} - {/await}
{/if} +{/await}
; + export let urls: Promise<{ trailerUrl: string; backdropUrl: string }[]>; export let index = 0; export let hideInterface = false; diff --git a/src/lib/components/HeroShowcase/HeroShowcase.svelte b/src/lib/components/HeroShowcase/HeroShowcase.svelte index d486923..efe3f2a 100644 --- a/src/lib/components/HeroShowcase/HeroShowcase.svelte +++ b/src/lib/components/HeroShowcase/HeroShowcase.svelte @@ -35,7 +35,10 @@ items.map((i) => `${TMDB_IMAGES_ORIGINAL}${i.backdropUri}`))} + urls={items.then((items) => items.map((i) => ({ + backdropUrl: `${TMDB_IMAGES_ORIGINAL}${i.backdropUri}`, + trailerUrl: i.trailerUrl || '' + })))} bind:index={showcaseIndex} on:enter on:navigate={({ detail }) => { diff --git a/src/lib/components/HeroShowcase/TmdbMoviesHeroShowcase.svelte b/src/lib/components/HeroShowcase/TmdbMoviesHeroShowcase.svelte index 190d2f0..2573b69 100644 --- a/src/lib/components/HeroShowcase/TmdbMoviesHeroShowcase.svelte +++ b/src/lib/components/HeroShowcase/TmdbMoviesHeroShowcase.svelte @@ -3,35 +3,48 @@ import { formatMinutesToTime, formatThousands } from '$lib/utils'; import { navigate } from '../StackRouter/StackRouter'; import HeroShowcase from './HeroShowcase.svelte'; + import { tmdbApi } from '$lib/apis/tmdb/tmdb-api'; export let movies: Promise; - $: items = movies.then((movies) => - movies.map((movie) => ({ - id: movie.id ?? 0, - type: 'movie' as const, - posterUri: movie.poster_path ?? '', - backdropUri: movie.backdrop_path ?? '', - title: `${movie.title}`, - overview: movie.overview ?? '', - infoProperties: [ - ...(movie.release_date - ? [{ label: new Date(movie.release_date).getFullYear().toString() }] - : []), - ...(movie.runtime ? [{ label: formatMinutesToTime(movie.runtime) }] : []), - ...(movie.vote_average - ? [ - { - label: `${movie.vote_average.toFixed(1)} TMDB (${formatThousands( - movie.vote_count ?? 0 - )})`, - href: `https://www.themoviedb.org/movie/${movie.id}` - } - ] - : []), - ...(movie.genres ? [{ label: movie.genres.map((genre) => genre.name).join(', ') }] : []) - ] - })) - ); + + $: items = movies.then(async (movies) => { + return Promise.all( + movies.map(async (movie) => { + const trailerUrl = movie.id + ? await tmdbApi.getMovieVideos(movie.id).then((videos) => + videos.find((video) => video.type === 'Trailer' && video.site === 'YouTube')?.key || '' + ) + : ''; + + return { + id: movie.id ?? 0, + type: 'movie' as const, + posterUri: movie.poster_path ?? '', + backdropUri: movie.backdrop_path ?? '', + title: movie.title ?? '', + overview: movie.overview ?? '', + trailerUrl: trailerUrl ?? '', + infoProperties: [ + ...(movie.release_date + ? [{ label: new Date(movie.release_date).getFullYear().toString() }] + : []), + ...(movie.runtime ? [{ label: formatMinutesToTime(movie.runtime) }] : []), + ...(movie.vote_average + ? [ + { + label: `${movie.vote_average.toFixed(1)} TMDB (${formatThousands( + movie.vote_count ?? 0 + )})`, + href: `https://www.themoviedb.org/movie/${movie.id}` + } + ] + : []), + ...(movie.genres ? [{ label: movie.genres.map((genre) => genre.name).join(', ') }] : []) + ] + }; + }) + ); + }); navigate(`/movie/${detail?.id}`)} {items} /> diff --git a/src/lib/components/HeroShowcase/TmdbSeriesHeroShowcase.svelte b/src/lib/components/HeroShowcase/TmdbSeriesHeroShowcase.svelte index 792692f..8a24cde 100644 --- a/src/lib/components/HeroShowcase/TmdbSeriesHeroShowcase.svelte +++ b/src/lib/components/HeroShowcase/TmdbSeriesHeroShowcase.svelte @@ -1,38 +1,51 @@ navigate(`/series/${detail?.id}`)} {items} /> diff --git a/src/lib/components/YouTubeBackground.svelte b/src/lib/components/YouTubeBackground.svelte new file mode 100644 index 0000000..2e7cb1d --- /dev/null +++ b/src/lib/components/YouTubeBackground.svelte @@ -0,0 +1,225 @@ + + + + + + +
+ +{#if showBackgroundImage || showBackgroundImageError} +
+{/if} + + diff --git a/src/lib/pages/TitlePages/MoviePage/MoviePage.svelte b/src/lib/pages/TitlePages/MoviePage/MoviePage.svelte index d881297..e00b2ba 100644 --- a/src/lib/pages/TitlePages/MoviePage/MoviePage.svelte +++ b/src/lib/pages/TitlePages/MoviePage/MoviePage.svelte @@ -76,7 +76,7 @@ (movie) => movie?.images.backdrops ?.sort((a, b) => (b.vote_count || 0) - (a.vote_count || 0)) - ?.map((bd) => TMDB_IMAGES_ORIGINAL + bd.file_path || '') + ?.map((bd) => ({backdropUrl: TMDB_IMAGES_ORIGINAL + bd.file_path || ''})) .slice(0, 5) || [] )} > diff --git a/src/lib/pages/TitlePages/SeriesPage/SeriesPage.svelte b/src/lib/pages/TitlePages/SeriesPage/SeriesPage.svelte index 02011f2..0559244 100644 --- a/src/lib/pages/TitlePages/SeriesPage/SeriesPage.svelte +++ b/src/lib/pages/TitlePages/SeriesPage/SeriesPage.svelte @@ -91,7 +91,7 @@ (series) => series?.images.backdrops ?.sort((a, b) => (b.vote_count || 0) - (a.vote_count || 0)) - ?.map((i) => TMDB_IMAGES_ORIGINAL + i.file_path) + ?.map((bd) => ({backdropUrl: TMDB_IMAGES_ORIGINAL + bd.file_path || ''})) .slice(0, 5) || [] )} >