Skip to content

Commit

Permalink
feat: dynamically fetch login screen backdrop images (#2206)
Browse files Browse the repository at this point in the history
* feat: dynamically fetch login screen backdrop images

* fix: remove media check from backdrops endpoint

* fix: remove mapping and work with TMDb data directly
  • Loading branch information
TheCatLady committed Oct 16, 2021
1 parent 492d8e3 commit 3486d0b
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 20 deletions.
16 changes: 16 additions & 0 deletions overseerr-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5167,6 +5167,22 @@ paths:
name:
type: string
example: Drama
/backdrops:
get:
summary: Get backdrops of trending items
description: Returns a list of backdrop image paths in a JSON array.
security: []
tags:
- tmdb
responses:
'200':
description: Results
content:
application/json:
schema:
type: array
items:
type: string

security:
- cookieAuth: []
Expand Down
Binary file removed public/images/rotate1.jpg
Binary file not shown.
Binary file removed public/images/rotate2.jpg
Binary file not shown.
Binary file removed public/images/rotate3.jpg
Binary file not shown.
Binary file removed public/images/rotate4.jpg
Binary file not shown.
Binary file removed public/images/rotate5.jpg
Binary file not shown.
Binary file removed public/images/rotate6.jpg
Binary file not shown.
20 changes: 10 additions & 10 deletions server/routes/discover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { mapMovieResult, mapPersonResult, mapTvResult } from '../models/Search';
import { mapNetwork } from '../models/Tv';
import { isMovie, isPerson } from '../utils/typeHelpers';

const createTmdbWithRegionLanaguage = (user?: User): TheMovieDb => {
export const createTmdbWithRegionLanguage = (user?: User): TheMovieDb => {
const settings = getSettings();

const region =
Expand All @@ -38,7 +38,7 @@ const createTmdbWithRegionLanaguage = (user?: User): TheMovieDb => {
const discoverRoutes = Router();

discoverRoutes.get('/movies', async (req, res) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const data = await tmdb.getDiscoverMovies({
page: Number(req.query.page),
Expand Down Expand Up @@ -69,7 +69,7 @@ discoverRoutes.get('/movies', async (req, res) => {
discoverRoutes.get<{ language: string }>(
'/movies/language/:language',
async (req, res, next) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const languages = await tmdb.getLanguages();

Expand Down Expand Up @@ -112,7 +112,7 @@ discoverRoutes.get<{ language: string }>(
discoverRoutes.get<{ genreId: string }>(
'/movies/genre/:genreId',
async (req, res, next) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const genres = await tmdb.getMovieGenres({
language: req.locale ?? (req.query.language as string),
Expand Down Expand Up @@ -194,7 +194,7 @@ discoverRoutes.get<{ studioId: string }>(
);

discoverRoutes.get('/movies/upcoming', async (req, res) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const now = new Date();
const offset = now.getTimezoneOffset();
Expand Down Expand Up @@ -228,7 +228,7 @@ discoverRoutes.get('/movies/upcoming', async (req, res) => {
});

discoverRoutes.get('/tv', async (req, res) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const data = await tmdb.getDiscoverTv({
page: Number(req.query.page),
Expand Down Expand Up @@ -259,7 +259,7 @@ discoverRoutes.get('/tv', async (req, res) => {
discoverRoutes.get<{ language: string }>(
'/tv/language/:language',
async (req, res, next) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const languages = await tmdb.getLanguages();

Expand Down Expand Up @@ -301,7 +301,7 @@ discoverRoutes.get<{ language: string }>(
discoverRoutes.get<{ genreId: string }>(
'/tv/genre/:genreId',
async (req, res, next) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const genres = await tmdb.getTvGenres({
language: req.locale ?? (req.query.language as string),
Expand Down Expand Up @@ -382,7 +382,7 @@ discoverRoutes.get<{ networkId: string }>(
);

discoverRoutes.get('/tv/upcoming', async (req, res) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const now = new Date();
const offset = now.getTimezoneOffset();
Expand Down Expand Up @@ -416,7 +416,7 @@ discoverRoutes.get('/tv/upcoming', async (req, res) => {
});

discoverRoutes.get('/trending', async (req, res) => {
const tmdb = createTmdbWithRegionLanaguage(req.user);
const tmdb = createTmdbWithRegionLanguage(req.user);

const data = await tmdb.getAllTrending({
page: Number(req.query.page),
Expand Down
26 changes: 25 additions & 1 deletion server/routes/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Router } from 'express';
import GithubAPI from '../api/github';
import TheMovieDb from '../api/themoviedb';
import { TmdbMovieResult, TmdbTvResult } from '../api/themoviedb/interfaces';
import { StatusResponse } from '../interfaces/api/settingsInterfaces';
import { Permission } from '../lib/permissions';
import { getSettings } from '../lib/settings';
Expand All @@ -9,9 +10,10 @@ import { mapProductionCompany } from '../models/Movie';
import { mapNetwork } from '../models/Tv';
import { appDataPath, appDataStatus } from '../utils/appDataVolume';
import { getAppVersion, getCommitTag } from '../utils/appVersion';
import { isPerson } from '../utils/typeHelpers';
import authRoutes from './auth';
import collectionRoutes from './collection';
import discoverRoutes from './discover';
import discoverRoutes, { createTmdbWithRegionLanguage } from './discover';
import mediaRoutes from './media';
import movieRoutes from './movie';
import personRoutes from './person';
Expand Down Expand Up @@ -160,6 +162,28 @@ router.get('/genres/tv', isAuthenticated(), async (req, res) => {
return res.status(200).json(genres);
});

router.get('/backdrops', async (req, res) => {
const tmdb = createTmdbWithRegionLanguage();

const data = (
await tmdb.getAllTrending({
page: 1,
timeWindow: 'week',
})
).results.filter((result) => !isPerson(result)) as (
| TmdbMovieResult
| TmdbTvResult
)[];

return res
.status(200)
.json(
data
.map((result) => result.backdrop_path)
.filter((backdropPath) => !!backdropPath)
);
});

router.get('/', (_req, res) => {
return res.status(200).json({
api: 'Overseerr API',
Expand Down
21 changes: 12 additions & 9 deletions src/components/Login/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import axios from 'axios';
import { useRouter } from 'next/dist/client/router';
import React, { useEffect, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import useSWR from 'swr';
import useSettings from '../../hooks/useSettings';
import { useUser } from '../../hooks/useUser';
import Accordion from '../Common/Accordion';
Expand Down Expand Up @@ -60,19 +61,21 @@ const Login: React.FC = () => {
}
}, [user, router]);

const { data: backdrops } = useSWR<string[]>('/api/v1/backdrops', {
refreshInterval: 0,
refreshWhenHidden: false,
revalidateOnFocus: false,
});

return (
<div className="relative flex flex-col min-h-screen bg-gray-900 py-14">
<PageTitle title={intl.formatMessage(messages.signin)} />
<ImageFader
forceOptimize
backgroundImages={[
'/images/rotate1.jpg',
'/images/rotate2.jpg',
'/images/rotate3.jpg',
'/images/rotate4.jpg',
'/images/rotate5.jpg',
'/images/rotate6.jpg',
]}
backgroundImages={
backdrops?.map(
(backdrop) => `https://www.themoviedb.org/t/p/original${backdrop}`
) ?? []
}
/>
<div className="absolute z-50 top-4 right-4">
<LanguagePicker />
Expand Down

0 comments on commit 3486d0b

Please sign in to comment.