fix(plex-sync): fixes processing movies using TMDB agent

fix #363
This commit is contained in:
sct
2020-12-20 11:00:48 +09:00
parent f6865ca0c1
commit 764db94f1b

View File

@@ -1,7 +1,10 @@
import { getRepository } from 'typeorm'; import { getRepository } from 'typeorm';
import { User } from '../../entity/User'; import { User } from '../../entity/User';
import PlexAPI, { PlexLibraryItem } from '../../api/plexapi'; 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 Media from '../../entity/Media';
import { MediaStatus, MediaType } from '../../constants/media'; import { MediaStatus, MediaType } from '../../constants/media';
import logger from '../../logger'; import logger from '../../logger';
@@ -93,40 +96,58 @@ class JobPlexSync {
this.log(`Saved ${plexitem.title}`); this.log(`Saved ${plexitem.title}`);
} }
} else { } else {
const matchedid = plexitem.guid.match(/imdb:\/\/(tt[0-9]+)/); let tmdbMovieId: number | undefined;
let tmdbMovie: TmdbMovieDetails | undefined;
if (matchedid?.[1]) { const imdbMatch = plexitem.guid.match(imdbRegex);
const tmdbMovie = await this.tmdb.getMovieByImdbId({ const tmdbMatch = plexitem.guid.match(tmdbRegex);
imdbId: matchedid[1],
if (imdbMatch) {
tmdbMovie = await this.tmdb.getMovieByImdbId({
imdbId: imdbMatch[1],
}); });
tmdbMovieId = tmdbMovie.id;
} else if (tmdbMatch) {
tmdbMovieId = Number(tmdbMatch[1]);
}
const existing = await this.getExisting(tmdbMovie.id); if (!tmdbMovieId) {
if (existing && existing.status === MediaStatus.AVAILABLE) { throw new Error('Unable to find TMDB ID');
this.log(`Title exists and is already available ${plexitem.title}`); }
} else if (existing && existing.status !== MediaStatus.AVAILABLE) {
existing.status = MediaStatus.AVAILABLE; const existing = await this.getExisting(tmdbMovieId);
await mediaRepository.save(existing); if (existing && existing.status === MediaStatus.AVAILABLE) {
this.log( this.log(`Title exists and is already available ${plexitem.title}`);
`Request for ${plexitem.title} exists. Setting status AVAILABLE`, } else if (existing && existing.status !== MediaStatus.AVAILABLE) {
'info' existing.status = MediaStatus.AVAILABLE;
); await mediaRepository.save(existing);
} else if (tmdbMovie) { this.log(
const newMedia = new Media(); `Request for ${plexitem.title} exists. Setting status AVAILABLE`,
newMedia.imdbId = tmdbMovie.external_ids.imdb_id; 'info'
newMedia.tmdbId = tmdbMovie.id; );
newMedia.status = MediaStatus.AVAILABLE; } else {
newMedia.mediaType = MediaType.MOVIE; // If we have a tmdb movie guid but it didn't already exist, only then
await mediaRepository.save(newMedia); // do we request the movie from tmdb (to reduce api requests)
this.log(`Saved ${tmdbMovie.title}`); 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) { } catch (e) {
this.log( this.log(
`Failed to process plex item. ratingKey: ${ `Failed to process plex item. ratingKey: ${plexitem.ratingKey}`,
plexitem.parentRatingKey ?? plexitem.ratingKey 'error',
}`, {
'error' errorMessage: e.message,
plexitem,
}
); );
} }
} }