From 764db94f1bd7866309684d5bd56033b21cbc2e0c Mon Sep 17 00:00:00 2001 From: sct Date: Sun, 20 Dec 2020 11:00:48 +0900 Subject: [PATCH] fix(plex-sync): fixes processing movies using TMDB agent fix #363 --- server/job/plexsync/index.ts | 75 +++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/server/job/plexsync/index.ts b/server/job/plexsync/index.ts index c38197ffa..55bb420f0 100644 --- a/server/job/plexsync/index.ts +++ b/server/job/plexsync/index.ts @@ -1,7 +1,10 @@ import { getRepository } from 'typeorm'; import { User } from '../../entity/User'; import PlexAPI, { PlexLibraryItem } from '../../api/plexapi'; -import TheMovieDb, { TmdbTvDetails } from '../../api/themoviedb'; +import TheMovieDb, { + TmdbMovieDetails, + TmdbTvDetails, +} from '../../api/themoviedb'; import Media from '../../entity/Media'; import { MediaStatus, MediaType } from '../../constants/media'; import logger from '../../logger'; @@ -93,40 +96,58 @@ class JobPlexSync { this.log(`Saved ${plexitem.title}`); } } else { - const matchedid = plexitem.guid.match(/imdb:\/\/(tt[0-9]+)/); + let tmdbMovieId: number | undefined; + let tmdbMovie: TmdbMovieDetails | undefined; - if (matchedid?.[1]) { - const tmdbMovie = await this.tmdb.getMovieByImdbId({ - imdbId: matchedid[1], + const imdbMatch = plexitem.guid.match(imdbRegex); + const tmdbMatch = plexitem.guid.match(tmdbRegex); + + if (imdbMatch) { + tmdbMovie = await this.tmdb.getMovieByImdbId({ + imdbId: imdbMatch[1], }); + tmdbMovieId = tmdbMovie.id; + } else if (tmdbMatch) { + tmdbMovieId = Number(tmdbMatch[1]); + } + + if (!tmdbMovieId) { + throw new Error('Unable to find TMDB ID'); + } - const existing = await this.getExisting(tmdbMovie.id); - if (existing && existing.status === MediaStatus.AVAILABLE) { - this.log(`Title exists and is already available ${plexitem.title}`); - } else if (existing && existing.status !== MediaStatus.AVAILABLE) { - existing.status = MediaStatus.AVAILABLE; - await mediaRepository.save(existing); - this.log( - `Request for ${plexitem.title} exists. Setting status AVAILABLE`, - 'info' - ); - } else if (tmdbMovie) { - const newMedia = new Media(); - newMedia.imdbId = tmdbMovie.external_ids.imdb_id; - newMedia.tmdbId = tmdbMovie.id; - newMedia.status = MediaStatus.AVAILABLE; - newMedia.mediaType = MediaType.MOVIE; - await mediaRepository.save(newMedia); - this.log(`Saved ${tmdbMovie.title}`); + const existing = await this.getExisting(tmdbMovieId); + if (existing && existing.status === MediaStatus.AVAILABLE) { + this.log(`Title exists and is already available ${plexitem.title}`); + } else if (existing && existing.status !== MediaStatus.AVAILABLE) { + existing.status = MediaStatus.AVAILABLE; + await mediaRepository.save(existing); + this.log( + `Request for ${plexitem.title} exists. Setting status AVAILABLE`, + 'info' + ); + } else { + // If we have a tmdb movie guid but it didn't already exist, only then + // do we request the movie from tmdb (to reduce api requests) + if (!tmdbMovie) { + tmdbMovie = await this.tmdb.getMovie({ movieId: tmdbMovieId }); } + const newMedia = new Media(); + newMedia.imdbId = tmdbMovie.external_ids.imdb_id; + newMedia.tmdbId = tmdbMovie.id; + newMedia.status = MediaStatus.AVAILABLE; + newMedia.mediaType = MediaType.MOVIE; + await mediaRepository.save(newMedia); + this.log(`Saved ${tmdbMovie.title}`); } } } catch (e) { this.log( - `Failed to process plex item. ratingKey: ${ - plexitem.parentRatingKey ?? plexitem.ratingKey - }`, - 'error' + `Failed to process plex item. ratingKey: ${plexitem.ratingKey}`, + 'error', + { + errorMessage: e.message, + plexitem, + } ); } }