You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.2 KiB
93 lines
3.2 KiB
from couchpotato import get_db
|
|
from couchpotato.api import addApiView
|
|
from couchpotato.core.event import fireEvent, addEvent, fireEventAsync
|
|
from couchpotato.core.helpers.variable import getTitle
|
|
from couchpotato.core.logger import CPLog
|
|
from couchpotato.core.media._base.searcher.main import Searcher
|
|
from couchpotato.core.media._base.searcher.main import SearchSetupError
|
|
from couchpotato.core.media.show import ShowTypeBase
|
|
|
|
log = CPLog(__name__)
|
|
|
|
autoload = 'ShowSearcher'
|
|
|
|
|
|
class ShowSearcher(Searcher, ShowTypeBase):
|
|
type = 'show'
|
|
|
|
in_progress = False
|
|
|
|
def __init__(self):
|
|
super(ShowSearcher, self).__init__()
|
|
|
|
addEvent('%s.searcher.all' % self.getType(), self.searchAll)
|
|
addEvent('%s.searcher.single' % self.getType(), self.single)
|
|
addEvent('searcher.get_search_title', self.getSearchTitle)
|
|
|
|
addApiView('%s.searcher.full_search' % self.getType(), self.searchAllView, docs = {
|
|
'desc': 'Starts a full search for all wanted episodes',
|
|
})
|
|
|
|
def searchAllView(self, **kwargs):
|
|
fireEventAsync('%s.searcher.all' % self.getType(), manual = True)
|
|
|
|
return {
|
|
'success': not self.in_progress
|
|
}
|
|
|
|
def searchAll(self, manual = False):
|
|
pass
|
|
|
|
def single(self, media, search_protocols = None, manual = False, force_download = False, notify = True):
|
|
|
|
db = get_db()
|
|
profile = db.get('id', media['profile_id'])
|
|
|
|
if not profile or (media['status'] == 'done' and not manual):
|
|
log.debug('Media does not have a profile or already done, assuming in manage tab.')
|
|
fireEvent('media.restatus', media['_id'], single = True)
|
|
return
|
|
|
|
default_title = getTitle(media)
|
|
if not default_title:
|
|
log.error('No proper info found for media, removing it from library to stop it from causing more issues.')
|
|
fireEvent('media.delete', media['_id'], single = True)
|
|
return
|
|
|
|
fireEvent('notify.frontend', type = 'show.searcher.started.%s' % media['_id'], data = True, message = 'Searching for "%s"' % default_title)
|
|
|
|
seasons = []
|
|
|
|
tree = fireEvent('library.tree', media, single = True)
|
|
if tree:
|
|
for season in tree.get('seasons', []):
|
|
if season.get('info'):
|
|
continue
|
|
|
|
# Skip specials (and seasons missing 'number') for now
|
|
# TODO: set status for specials to skipped by default
|
|
if not season['info'].get('number'):
|
|
continue
|
|
|
|
seasons.append(season)
|
|
|
|
result = True
|
|
for season in seasons:
|
|
if not fireEvent('show.season.searcher.single', search_protocols, manual, force_download, False):
|
|
result = False
|
|
break
|
|
|
|
fireEvent('notify.frontend', type = 'show.searcher.ended.%s' % media['_id'], data = True)
|
|
|
|
return result
|
|
|
|
def getSearchTitle(self, media):
|
|
show = None
|
|
if media.get('type') == 'show':
|
|
show = media
|
|
elif media.get('type') in ('show.season', 'show.episode'):
|
|
related = fireEvent('library.related', media, single = True)
|
|
show = related['show']
|
|
|
|
if show:
|
|
return getTitle(show)
|
|
|