Browse Source

[TV] Implemented fast show updates, working on "update_info" restructure

pull/3730/merge
Dean Gardiner 11 years ago
parent
commit
88f8cd708b
  1. 69
      couchpotato/core/media/show/_base/main.py
  2. 29
      couchpotato/core/media/show/episode.py
  3. 33
      couchpotato/core/media/show/season.py

69
couchpotato/core/media/show/_base/main.py

@ -5,7 +5,7 @@ from couchpotato import get_db
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
from couchpotato.core.helpers.encoding import simplifyString 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.logger import CPLog
from couchpotato.core.media import MediaBase from couchpotato.core.media import MediaBase
from qcond import QueryCondenser 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 '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) # Remove season info for later use (save separately)
seasons_info = info.get('seasons', {}) seasons_info = info.get('seasons', {})
identifiers = info.get('identifiers', {}) identifiers = info.get('identifiers', {})
# Make sure we don't nest in_wanted data # Make sure we don't nest in_wanted data
del info['identifiers'] try: del info['identifiers']
except: pass
try: del info['in_wanted'] try: del info['in_wanted']
except: pass except: pass
try: del info['in_library'] try: del info['in_library']
@ -164,15 +162,14 @@ class ShowBase(MediaBase):
season_info = seasons_info[season_nr] season_info = seasons_info[season_nr]
episodes = season_info.get('episodes', {}) 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 # Add Episodes
for episode_nr in episodes: for episode_nr in episodes:
episode_info = episodes[episode_nr] episode_info = episodes[episode_nr]
episode_info['season_number'] = season_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: if added and notify_after:
@ -191,10 +188,7 @@ class ShowBase(MediaBase):
except: except:
log.error('Failed adding media: %s', traceback.format_exc()) log.error('Failed adding media: %s', traceback.format_exc())
def updateInfo(self, media_id = None, identifiers = None, info = None): def updateInfo(self, media_id = None, media = None, identifiers = None, info = None):
if not info: info = {}
if not identifiers: identifiers = {}
""" """
Update movie information inside media['doc']['info'] Update movie information inside media['doc']['info']
@ -209,29 +203,38 @@ class ShowBase(MediaBase):
@return: dict, with media @return: dict, with media
""" """
if not info: info = {}
if not identifiers: identifiers = {}
if self.shuttingDown(): if self.shuttingDown():
return return
try: try:
db = get_db() db = get_db()
if media_id: if media is None:
media = db.get('id', media_id) if media_id:
else: media = db.get('id', media_id)
media = db.get('media', identifiers, with_doc = True)['doc'] else:
media = db.get('media', identifiers, with_doc = True)['doc']
if not info: if not info:
info = fireEvent('show.info', identifiers = media.get('identifiers'), merge = True) info = fireEvent('show.info', identifiers = media.get('identifiers'), merge = True)
# Don't need those here # Remove season info for later use (save separately)
try: del info['seasons'] seasons_info = info.get('seasons', {})
except: pass identifiers = info.get('identifiers', {})
try: del info['identifiers'] try: del info['identifiers']
except: pass except: pass
try: del info['in_wanted'] try: del info['in_wanted']
except: pass except: pass
try: del info['in_library'] try: del info['in_library']
except: pass except: pass
try: del info['identifiers']
except: pass
try: del info['seasons']
except: pass
if not info or len(info) == 0: if not info or len(info) == 0:
log.error('Could not update, no show info to work with: %s', media.get('identifier')) 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 # Update basic info
media['info'] = 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 # Update image file
image_urls = info.get('images', []) image_urls = info.get('images', [])
self.getPoster(media, image_urls) self.getPoster(media, image_urls)
db.update(media) db.update(media)

29
couchpotato/core/media/show/episode.py

@ -48,13 +48,17 @@ class Episode(MediaBase):
# Update library info # Update library info
if update_after is not False: if update_after is not False:
handle = fireEventAsync if update_after is 'async' else fireEvent 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 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 = {} if not info: info = {}
identifiers = info.get('identifiers') or identifiers
try: del info['identifiers']
except: pass
if self.shuttingDown(): if self.shuttingDown():
return return
@ -69,26 +73,25 @@ class Episode(MediaBase):
info = fireEvent( info = fireEvent(
'episode.info', show.get('identifiers'), { 'episode.info', show.get('identifiers'), {
'season_identifier': season.get('info', {}).get('number'), 'season_identifiers': season.get('identifiers'),
'episode_identifier': episode.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 merge = True
) )
# Update/create media # Update/create media
if force: episode['identifiers'].update(identifiers)
episode.update({'info': info})
episode['identifiers'].update(info['identifiers'])
if 'identifiers' in info:
del info['identifiers']
episode.update({'info': info})
e = db.update(episode)
episode.update(e)
# Get images # Get images
image_urls = info.get('images', []) image_urls = info.get('images', [])
existing_files = episode.get('files', {}) existing_files = episode.get('files', {})
self.getPoster(image_urls, existing_files) self.getPoster(image_urls, existing_files)
db.update(episode)
return episode return episode

33
couchpotato/core/media/show/season.py

@ -50,38 +50,45 @@ class Season(MediaBase):
# Update library info # Update library info
if update_after is not False: if update_after is not False:
handle = fireEventAsync if update_after is 'async' else fireEvent 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 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 = {} 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(): if self.shuttingDown():
return return
db = get_db() 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 # Get new info
if not 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 # Update/create media
if force: season['identifiers'].update(identifiers)
season.update({'info': info})
season['identifiers'].update(info['identifiers'])
if 'identifiers' in info:
del info['identifiers']
season.update({'info': info})
s = db.update(season)
season.update(s)
# Get images # Get images
image_urls = info.get('images', []) image_urls = info.get('images', [])
existing_files = season.get('files', {}) existing_files = season.get('files', {})
self.getPoster(image_urls, existing_files) self.getPoster(image_urls, existing_files)
db.update(season)
return season return season

Loading…
Cancel
Save