searcher and matcher now uses the new related_libraries and root_library from media instead of using extra db queries

This commit is contained in:
Dean Gardiner
2013-12-02 23:27:26 +13:00
parent 11ea9b4e91
commit 3c675b5b8a
2 changed files with 28 additions and 37 deletions
+27 -35
View File
@@ -1,10 +1,10 @@
from couchpotato import get_session, Env
from couchpotato import Env, get_session
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.variable import getTitle, tryInt, toIterable
from couchpotato.core.logger import CPLog
from couchpotato.core.media._base.searcher.main import SearchSetupError
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Media, Library
from couchpotato.core.settings.model import Media
from qcond import QueryCondenser
from qcond.helpers import simplify
@@ -42,6 +42,8 @@ class ShowSearcher(Plugin):
addEvent('searcher.get_media_identifier', self.getMediaIdentifier)
def single(self, media, search_protocols = None, manual = False):
show, season, episode = self.getLibraries(media['library'])
if media['type'] == 'show':
# TODO handle show searches (scan all seasons)
return
@@ -72,9 +74,7 @@ class ShowSearcher(Plugin):
#fireEvent('episode.delete', episode['id'], single = True)
return
# TODO replace with 'related_libraries'
show, season, episode = self.getMedia(media)
if show is None or season is None:
if not show or not season:
log.error('Unable to find show or season library in database, missing required data for searching')
return
@@ -97,7 +97,7 @@ class ShowSearcher(Plugin):
# Don't search for quality lower then already available.
if has_better_quality is 0:
log.info('Search for %s S%02d%s in %s', (getTitle(show), season.season_number, "E%02d" % episode.episode_number if episode else "", quality_type['quality']['label']))
log.info('Search for %s S%02d%s in %s', (getTitle(show), season['season_number'], "E%02d" % episode['episode_number'] if episode else "", quality_type['quality']['label']))
quality = fireEvent('quality.single', identifier = quality_type['quality']['identifier'], single = True)
results = fireEvent('searcher.search', search_protocols, media, quality, single = True)
@@ -139,16 +139,16 @@ class ShowSearcher(Plugin):
if media['type'] not in ['show', 'season', 'episode']:
return
# TODO replace with 'related_libraries'
show, season, episode = self.getMedia(media)
if show is None:
show, season, episode = self.getLibraries(media['library'])
if not show:
return None
titles = []
# Add season map_names if they exist
if season is not None and 'map_names' in show.info:
season_names = show.info['map_names'].get(str(season.season_number), {})
if season is not None and 'map_names' in show['info']:
season_names = show['info']['map_names'].get(str(season['season_number']), {})
# Add titles from all locations
# TODO only add name maps from a specific location
@@ -156,7 +156,7 @@ class ShowSearcher(Plugin):
titles += [name for name in names if name not in titles]
# Add show titles
titles += [title.title for title in show.titles if title.title not in titles]
titles += [title['title'] for title in show['titles'] if title['title'] not in titles]
# Use QueryCondenser to build a list of optimal search titles
condensed_titles = self.query_condenser.distinct(titles)
@@ -200,12 +200,6 @@ class ShowSearcher(Plugin):
if not fireEvent('searcher.correct_words', release['name'], media, single = True):
return False
# TODO replace with 'related_libraries'
show, season, episode = self.getMedia(media)
if show is None or season is None:
log.error('Unable to find show or season library in database, missing required data for searching')
return
match = fireEvent('matcher.best', release, media, quality, single = True)
if match:
return match.weight
@@ -260,26 +254,24 @@ class ShowSearcher(Plugin):
return identifier
# TODO move this somewhere else
def getMedia(self, media):
db = get_session()
def getLibraries(self, library):
if 'related_libraries' not in library:
log.warning("'related_libraries' missing from media library, unable to continue searching")
return None, None, None
media_library = db.query(Library).filter_by(id = media['library_id']).first()
libraries = library['related_libraries']
show = None
season = None
episode = None
# Get libraries and return lists only if there is multiple items
show = libraries.get('show', [])
if len(show) <= 1:
show = show[0] if len(show) else None
if media['type'] == 'episode':
show = media_library.parent.parent
season = media_library.parent
episode = media_library
season = libraries.get('season', [])
if len(season) <= 1:
season = season[0] if len(season) else None
if media['type'] == 'season':
show = media_library.parent
season = media_library
if media['type'] == 'show':
show = media_library
episode = libraries.get('episode', [])
if len(episode) <= 1:
episode = episode[0] if len(episode) else None
return show, season, episode
+1 -2
View File
@@ -73,8 +73,7 @@ class Matcher(Plugin):
return True
def correctTitle(self, chain, media):
# TODO need to switch this to use media['related_libraries']
root_library = fireEvent('searcher.get_media_root', media['library'], single = True)
root_library = media['library']['root_library']
if 'show_name' not in chain.info or not len(chain.info['show_name']):
log.info('Wrong: missing show name in parsed result')