[TV] Implemented fast show updates, working on "update_info" restructure
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user