diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 42c198f5..c76864ca 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -541,13 +541,28 @@ def dbcheck(): 'device_id TEXT NOT NULL UNIQUE, device_token TEXT, device_name TEXT, friendly_name TEXT)' ) - # tvmaze_lookup table :: This table keeps record of the notification poster urls + # tvmaze_lookup table :: This table keeps record of the TVmaze lookups c_db.execute( 'CREATE TABLE IF NOT EXISTS tvmaze_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, ' 'thetvdb_id INTEGER, imdb_id TEXT, tvmaze_id INTEGER, tvmaze_url TEXT, tvmaze_json TEXT)' ) c_db.execute( - 'CREATE UNIQUE INDEX IF NOT EXISTS idx_tvmaze_lookup_thetvdb_id ON tvmaze_lookup (thetvdb_id);' + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_tvmaze_lookup_thetvdb_id ON tvmaze_lookup (thetvdb_id)' + ) + c_db.execute( + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_tvmaze_lookup_imdb_id ON tvmaze_lookup (imdb_id)' + ) + + # themoviedb_lookup table :: This table keeps record of the TheMovieDB lookups + c_db.execute( + 'CREATE TABLE IF NOT EXISTS themoviedb_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, ' + 'thetvdb_id INTEGER, imdb_id TEXT, themoviedb_id INTEGER, themoviedb_url TEXT, themoviedb_json TEXT)' + ) + c_db.execute( + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_themoviedb_lookup_thetvdb_id ON themoviedb_lookup (thetvdb_id)' + ) + c_db.execute( + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_themoviedb_lookup_imdb_id ON themoviedb_lookup (imdb_id)' ) # Upgrade sessions table from earlier versions diff --git a/plexpy/config.py b/plexpy/config.py index 86319803..f16c55ca 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -547,6 +547,7 @@ _CONFIG_DEFINITIONS = { 'TELEGRAM_ON_PMSUPDATE': (int, 'Telegram', 0), 'TELEGRAM_ON_CONCURRENT': (int, 'Telegram', 0), 'TELEGRAM_ON_NEWDEVICE': (int, 'Telegram', 0), + 'THEMOVIEDB_APIKEY': (str, 'General', 'e9a6655bae34bf694a0f3e33338dc28e'), 'TV_LOGGING_ENABLE': (int, 'Monitoring', 1), 'TV_NOTIFY_ENABLE': (int, 'Monitoring', 0), 'TV_NOTIFY_ON_START': (int, 'Monitoring', 1), diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index 188cef88..9c2b3c37 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -528,12 +528,29 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, * metadata['lastfm_id'] = metadata['guid'].split('lastfm://')[1].rsplit('/', 1)[0] metadata['lastfm_url'] = 'https://www.last.fm/music/' + metadata['lastfm_id'] - # Get TV Maze info (for tv only) - if metadata.get('thetvdb_id'): - tvmaze_info = lookup_tvmaze_by_tvdb_id(metadata['thetvdb_id']) + # Get TheMovieDB info + if metadata.get('themoviedb_id'): + themoveidb_json = get_themoviedb_info(metadata['media_type'], metadata['themoviedb_id']) + + if themoveidb_json.get('imdb_id'): + metadata['imdb_id'] = themoveidb_json['imdb_id'] + metadata['imdb_url'] = 'https://www.imdb.com/title/' + themoveidb_json['imdb_id'] + + elif metadata.get('thetvdb_id') or metadata.get('imdb_id'): + themoviedb_info = lookup_themoviedb_by_id(thetvdb_id=metadata.get('thetvdb_id'), + imdb_id=metadata.get('imdb_id')) + metadata.update(themoviedb_info) + + # Get TVmaze info (for tv shows only) + if metadata['media_type'] in ('show', 'season', 'episode') and (metadata.get('thetvdb_id') or metadata.get('imdb_id')): + tvmaze_info = lookup_tvmaze_by_id(thetvdb_id=metadata.get('thetvdb_id'), + imdb_id=metadata.get('imdb_id')) metadata.update(tvmaze_info) - if 'imdb_id' in tvmaze_info: - metadata['imdb_url'] = 'https://www.imdb.com/title/' + metadata['imdb_id'] + + if tvmaze_info.get('thetvdb_id'): + metadata['thetvdb_url'] = 'https://thetvdb.com/?tab=series&id=' + str(tvmaze_info['thetvdb_id']) + if tvmaze_info.get('imdb_id'): + metadata['imdb_url'] = 'https://www.imdb.com/title/' + tvmaze_info['imdb_id'] if metadata['media_type'] in ('movie', 'show', 'artist'): poster_thumb = metadata['thumb'] @@ -994,30 +1011,37 @@ def get_poster_info(poster_thumb, poster_key, poster_title): return poster_info -def lookup_tvmaze_by_tvdb_id(thetvdb_id): +def lookup_tvmaze_by_id(thetvdb_id=None, imdb_id=None): tvmaze_info = {} db = database.MonitorDatabase() try: query = 'SELECT imdb_id, tvmaze_id, tvmaze_url FROM tvmaze_lookup ' \ - 'WHERE thetvdb_id = ?' - tvmaze_info = db.select_single(query, args=[thetvdb_id]) + 'WHERE {} = ?'.format('thetvdb_id' if thetvdb_id else 'imdb_id') + tvmaze_info = db.select_single(query, args=[thetvdb_id or imdb_id]) except Exception as e: logger.warn(u"PlexPy NotificationHandler :: Unable to execute database query for lookup_tvmaze_by_tvdb_id: %s." % e) if not tvmaze_info: - response, err_msg, req_msg = request.request_response2('http://api.tvmaze.com/lookup/shows?thetvdb={}'.format(thetvdb_id)) + if thetvdb_id: + logger.debug(u"PlexPy NotificationHandler :: Looking up TVmaze info for thetvdb_id '{}'.".format(thetvdb_id)) + else: + logger.debug(u"PlexPy NotificationHandler :: Looking up TVmaze info for imdb_id '{}'.".format(imdb_id)) + + params = {'thetvdb': thetvdb_id} if thetvdb_id else {'imdb': imdb_id} + response, err_msg, req_msg = request.request_response2('http://api.tvmaze.com/lookup/shows', params=params) if response and not err_msg: tvmaze_json = response.json() + thetvdb_id = tvmaze_json.get('externals', {}).get('thetvdb', '') imdb_id = tvmaze_json.get('externals', {}).get('imdb', '') tvmaze_id = tvmaze_json.get('id', '') tvmaze_url = tvmaze_json.get('url', '') - keys = {'thetvdb_id': thetvdb_id} - tvmaze_info = {'imdb_id': imdb_id, - 'tvmaze_id': tvmaze_id, + keys = {'tvmaze_id': tvmaze_id} + tvmaze_info = {'thetvdb_id': thetvdb_id, + 'imdb_id': imdb_id, 'tvmaze_url': tvmaze_url, 'tvmaze_json': json.dumps(tvmaze_json)} db.upsert(table_name='tvmaze_lookup', key_dict=keys, value_dict=tvmaze_info) @@ -1031,4 +1055,101 @@ def lookup_tvmaze_by_tvdb_id(thetvdb_id): if req_msg: logger.debug(u"PlexPy NotificationHandler :: Request response: {}".format(req_msg)) - return tvmaze_info \ No newline at end of file + return tvmaze_info + + +def lookup_themoviedb_by_id(thetvdb_id=None, imdb_id=None): + themoviedb_info = {} + + db = database.MonitorDatabase() + + try: + query = 'SELECT thetvdb_id, imdb_id, themoviedb_id, themoviedb_url FROM themoviedb_lookup ' \ + 'WHERE {} = ?'.format('thetvdb_id' if thetvdb_id else 'imdb_id') + themoviedb_info = db.select_single(query, args=[thetvdb_id or imdb_id]) + except Exception as e: + logger.warn(u"PlexPy NotificationHandler :: Unable to execute database query for lookup_themoviedb_by_imdb_id: %s." % e) + + if not themoviedb_info: + if thetvdb_id: + logger.debug(u"PlexPy NotificationHandler :: Looking up The Movie Database info for thetvdb_id '{}'.".format(thetvdb_id)) + else: + logger.debug(u"PlexPy NotificationHandler :: Looking up The Movie Database info for imdb_id '{}'.".format(imdb_id)) + + params = {'api_key': plexpy.CONFIG.THEMOVIEDB_APIKEY, + 'external_source': 'tvdb_id' if thetvdb_id else 'imdb_id' + } + response, err_msg, req_msg = request.request_response2('https://api.themoviedb.org/3/find/{}'.format(thetvdb_id or imdb_id), params=params) + + if response and not err_msg: + themoviedb_find_json = response.json() + if themoviedb_find_json.get('tv_results'): + themoviedb_id = themoviedb_find_json['tv_results'][0]['id'] + elif themoviedb_find_json.get('movie_results'): + themoviedb_id = themoviedb_find_json['movie_results'][0]['id'] + else: + themoviedb_id = '' + + if themoviedb_id: + media_type = 'tv' if thetvdb_id else 'movie' + themoviedb_url = 'https://www.themoviedb.org/{}/{}'.format(media_type, themoviedb_id) + themoviedb_json = get_themoviedb_info(media_type, themoviedb_id) + + keys = {'themoviedb_id': themoviedb_id} + themoviedb_info = {'thetvdb_id': thetvdb_id, + 'imdb_id': imdb_id or themoviedb_json.get('imdb_id'), + 'themoviedb_url': themoviedb_url, + 'themoviedb_json': json.dumps(themoviedb_json) + } + + db.upsert(table_name='themoviedb_lookup', key_dict=keys, value_dict=themoviedb_info) + + themoviedb_info.pop('themoviedb_json') + + else: + if err_msg: + logger.error(u"PlexPy NotificationHandler :: {}".format(err_msg)) + + if req_msg: + logger.debug(u"PlexPy NotificationHandler :: Request response: {}".format(req_msg)) + + return themoviedb_info + + +def get_themoviedb_info(media_type, themoviedb_id): + if media_type == 'show': + media_type = 'tv' + + themoviedb_json = {} + + db = database.MonitorDatabase() + + try: + query = 'SELECT themoviedb_json FROM themoviedb_lookup ' \ + 'WHERE themoviedb_id = ?' + result = db.select_single(query, args=[themoviedb_id]) + except Exception as e: + logger.warn(u"PlexPy NotificationHandler :: Unable to execute database query for get_themoviedb_info: %s." % e) + + if result: + try: + return json.loads(result['themoviedb_json']) + except: + pass + + logger.debug(u"PlexPy NotificationHandler :: Looking up The Movie Database info for themoviedb_id '{}'.".format(themoviedb_id)) + + params = {'api_key': plexpy.CONFIG.THEMOVIEDB_APIKEY} + response, err_msg, req_msg = request.request_response2('https://api.themoviedb.org/3/{}/{}'.format(media_type, themoviedb_id), params=params) + + if response and not err_msg: + themoviedb_json = response.json() + + else: + if err_msg: + logger.error(u"PlexPy NotificationHandler :: {}".format(err_msg)) + + if req_msg: + logger.debug(u"PlexPy NotificationHandler :: Request response: {}".format(req_msg)) + + return themoviedb_json \ No newline at end of file diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 703816a9..dbc12c41 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -616,7 +616,7 @@ class PrettyMetadata(object): provider_link = self.parameters['themoviedb_url'] elif self.parameters['imdb_url']: provider_link = self.parameters['imdb_url'] - elif self.self.parameters['tvmaze_url']: + elif self.parameters['tvmaze_url']: provider_link = self.parameters['tvmaze_url'] elif self.parameters['lastfm_url']: provider_link = self.parameters['lastfm_url'] @@ -1478,6 +1478,8 @@ class FACEBOOK(Notifier): 'description': 'Select the source for movie links on the info cards. Leave blank for default.', 'input_type': 'select', 'select_options': {'': '', + 'imdb': 'IMDB', + 'themoviedb': 'The Movie Database', 'trakt': 'Trakt.tv', 'plexweb': 'Plex Web' } @@ -1491,6 +1493,7 @@ class FACEBOOK(Notifier): 'thetvdb': 'TheTVDB', 'tvmaze': 'TVmaze', 'imdb': 'IMDB', + 'themoviedb': 'The Movie Database', 'trakt': 'Trakt.tv', 'plexweb': 'Plex Web' }