From 88f8cd708b469623d3a0c0f0214036c5b26c0d1f Mon Sep 17 00:00:00 2001 From: Dean Gardiner Date: Mon, 28 Jul 2014 16:11:20 +1200 Subject: [PATCH] [TV] Implemented fast show updates, working on "update_info" restructure --- couchpotato/core/media/show/_base/main.py | 69 ++++++++++++++++++++++--------- couchpotato/core/media/show/episode.py | 29 +++++++------ couchpotato/core/media/show/season.py | 33 +++++++++------ 3 files changed, 85 insertions(+), 46 deletions(-) diff --git a/couchpotato/core/media/show/_base/main.py b/couchpotato/core/media/show/_base/main.py index da70c3d..7da66ae 100755 --- a/couchpotato/core/media/show/_base/main.py +++ b/couchpotato/core/media/show/_base/main.py @@ -5,7 +5,7 @@ from couchpotato import get_db from couchpotato.api import addApiView from couchpotato.core.event import fireEvent, fireEventAsync, addEvent from couchpotato.core.helpers.encoding import simplifyString -from couchpotato.core.helpers.variable import getTitle +from couchpotato.core.helpers.variable import getTitle, find from couchpotato.core.logger import CPLog from couchpotato.core.media import MediaBase from qcond import QueryCondenser @@ -79,15 +79,13 @@ class ShowBase(MediaBase): 'category_id': cat_id if cat_id is not None and len(cat_id) > 0 and cat_id != '-1' else None } - # TODO: stuff below is mostly a copy of what is done in movie - # Can we make a base function to do this stuff? - # Remove season info for later use (save separately) seasons_info = info.get('seasons', {}) identifiers = info.get('identifiers', {}) # Make sure we don't nest in_wanted data - del info['identifiers'] + try: del info['identifiers'] + except: pass try: del info['in_wanted'] except: pass try: del info['in_library'] @@ -164,15 +162,14 @@ class ShowBase(MediaBase): season_info = seasons_info[season_nr] episodes = season_info.get('episodes', {}) - season = fireEvent('show.season.add', m.get('_id'), season_info, single = True) + season = fireEvent('show.season.add', m.get('_id'), season_info, update_after = False, single = True) # Add Episodes for episode_nr in episodes: episode_info = episodes[episode_nr] episode_info['season_number'] = season_nr - fireEvent('show.episode.add', season.get('_id'), episode_info, single = True) - + fireEvent('show.episode.add', season.get('_id'), episode_info, update_after = False, single = True) if added and notify_after: @@ -191,10 +188,7 @@ class ShowBase(MediaBase): except: log.error('Failed adding media: %s', traceback.format_exc()) - def updateInfo(self, media_id = None, identifiers = None, info = None): - if not info: info = {} - if not identifiers: identifiers = {} - + def updateInfo(self, media_id = None, media = None, identifiers = None, info = None): """ Update movie information inside media['doc']['info'] @@ -209,29 +203,38 @@ class ShowBase(MediaBase): @return: dict, with media """ + if not info: info = {} + if not identifiers: identifiers = {} + if self.shuttingDown(): return try: db = get_db() - if media_id: - media = db.get('id', media_id) - else: - media = db.get('media', identifiers, with_doc = True)['doc'] + if media is None: + if media_id: + media = db.get('id', media_id) + else: + media = db.get('media', identifiers, with_doc = True)['doc'] if not info: info = fireEvent('show.info', identifiers = media.get('identifiers'), merge = True) - # Don't need those here - try: del info['seasons'] - except: pass + # Remove season info for later use (save separately) + seasons_info = info.get('seasons', {}) + identifiers = info.get('identifiers', {}) + try: del info['identifiers'] except: pass try: del info['in_wanted'] except: pass try: del info['in_library'] except: pass + try: del info['identifiers'] + except: pass + try: del info['seasons'] + except: pass if not info or len(info) == 0: log.error('Could not update, no show info to work with: %s', media.get('identifier')) @@ -240,9 +243,35 @@ class ShowBase(MediaBase): # Update basic info media['info'] = info + show_tree = fireEvent('library.tree', media_id = media['_id'], single = True) + + # Update seasons + for season_num in seasons_info: + season_info = seasons_info[season_num] + episodes = season_info.get('episodes', {}) + + # Find season that matches number + season = find(lambda s: s.get('info', {}).get('number', 0) == season_num, show_tree.get('seasons', [])) + + if not season: + log.warning('Unable to find season "%s"', season_num) + continue + + # Update season + fireEvent('show.season.update_info', season['_id'], info = season_info, single = True) + + # Update episodes + for episode_num in episodes: + episode_info = episodes[episode_num] + episode_info['season_number'] = season_num + + # Find episode that matches number + episode = find(lambda s: s.get('info', {}).get('number', 0) == episode_num, season.get('episodes', [])) + + fireEvent('show.episode.update_info', episode['_id'], info = episode_info, single = True) + # Update image file image_urls = info.get('images', []) - self.getPoster(media, image_urls) db.update(media) diff --git a/couchpotato/core/media/show/episode.py b/couchpotato/core/media/show/episode.py index 754a48f..0993bfd 100755 --- a/couchpotato/core/media/show/episode.py +++ b/couchpotato/core/media/show/episode.py @@ -48,13 +48,17 @@ class Episode(MediaBase): # Update library info if update_after is not False: handle = fireEventAsync if update_after is 'async' else fireEvent - handle('show.season.update_info', episode.get('_id'), info = info, single = True) + handle('show.season.update_info', episode.get('_id'), identifiers, info, single = True) return episode - def updateInfo(self, media_id = None, info = None, force = False): + def updateInfo(self, media_id = None, identifiers = None, info = None): if not info: info = {} + identifiers = info.get('identifiers') or identifiers + try: del info['identifiers'] + except: pass + if self.shuttingDown(): return @@ -69,26 +73,25 @@ class Episode(MediaBase): info = fireEvent( 'episode.info', show.get('identifiers'), { - 'season_identifier': season.get('info', {}).get('number'), - 'episode_identifier': episode.get('identifiers') + 'season_identifiers': season.get('identifiers'), + 'season_number': season.get('info', {}).get('number'), + + 'episode_identifiers': episode.get('identifiers'), + 'episode_number': episode.get('info', {}).get('number'), + + 'absolute_number': episode.get('info', {}).get('absolute_number') }, merge = True ) # Update/create media - if force: - - episode['identifiers'].update(info['identifiers']) - if 'identifiers' in info: - del info['identifiers'] - - episode.update({'info': info}) - e = db.update(episode) - episode.update(e) + episode['identifiers'].update(identifiers) + episode.update({'info': info}) # Get images image_urls = info.get('images', []) existing_files = episode.get('files', {}) self.getPoster(image_urls, existing_files) + db.update(episode) return episode diff --git a/couchpotato/core/media/show/season.py b/couchpotato/core/media/show/season.py index 6c9ff09..eb5fd6a 100755 --- a/couchpotato/core/media/show/season.py +++ b/couchpotato/core/media/show/season.py @@ -50,38 +50,45 @@ class Season(MediaBase): # Update library info if update_after is not False: handle = fireEventAsync if update_after is 'async' else fireEvent - handle('show.season.update_info', season.get('_id'), info = info, single = True) + handle('show.season.update_info', season.get('_id'), identifiers, info, single = True) return season - def updateInfo(self, media_id = None, info = None, force = False): + def updateInfo(self, media_id = None, identifiers = None, info = None): if not info: info = {} + identifiers = info.get('identifiers') or identifiers + try: del info['identifiers'] + except: pass + try: del info['episodes'] + except: pass + if self.shuttingDown(): return db = get_db() - season = db.get('id', media_id) + if media_id: + season = db.get('id', media_id) + else: + season = db.get('media', identifiers, with_doc = True)['doc'] + + show = db.get('id', season['parent_id']) # Get new info if not info: - info = fireEvent('season.info', season.get('identifiers'), merge = True) + info = fireEvent('season.info', show.get('identifiers'), { + 'season_number': season.get('info', {}).get('number', 0) + }, merge = True) # Update/create media - if force: - - season['identifiers'].update(info['identifiers']) - if 'identifiers' in info: - del info['identifiers'] - - season.update({'info': info}) - s = db.update(season) - season.update(s) + season['identifiers'].update(identifiers) + season.update({'info': info}) # Get images image_urls = info.get('images', []) existing_files = season.get('files', {}) self.getPoster(image_urls, existing_files) + db.update(season) return season