1
0
mirror of https://github.com/moparisthebest/SickRage synced 2024-08-13 16:53:54 -04:00

Fixed find propers.

Added ability to force a find propers search.
This commit is contained in:
echel0n 2014-05-19 10:40:25 -07:00
parent 621f790392
commit 854de69683
22 changed files with 107 additions and 37 deletions

View File

@ -29,7 +29,16 @@ Currently running<br />
<h3>Daily Search:</h3> <h3>Daily Search:</h3>
<a class="btn" href="$sbRoot/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a> <a class="btn" href="$sbRoot/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a>
#if not $searchStatus: #if not $dailySearchStatus:
Not in progress<br />
#else:
In Progress<br />
#end if
<br />
<h3>Find Propers Search:</h3>
<a class="btn" href="$sbRoot/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a>
#if not $findPropersStatus:
Not in progress<br /> Not in progress<br />
#else: #else:
In Progress<br /> In Progress<br />

View File

@ -26,7 +26,7 @@ from sickbeard import processTV
class PostProcesser(): class PostProcesser():
def run(self): def run(self, force=False):
if not sickbeard.PROCESS_AUTOMATICALLY: if not sickbeard.PROCESS_AUTOMATICALLY:
return return

View File

@ -38,7 +38,9 @@ class DailySearcher():
self.amActive = False self.amActive = False
def run(self): def run(self, force=False):
self.amActive = True
# remove names from cache that link back to active shows that we watch # remove names from cache that link back to active shows that we watch
sickbeard.name_cache.syncNameCache() sickbeard.name_cache.syncNameCache()

View File

@ -48,7 +48,7 @@ class GenericQueue:
self.queue.put(item) self.queue.put(item)
return item return item
def run(self): def run(self, force=False):
# only start a new task if one isn't already going # only start a new task if one isn't already going
if self.thread == None or self.thread.isAlive() == False: if self.thread == None or self.thread.isAlive() == False:

View File

@ -19,6 +19,7 @@
import time import time
import datetime import datetime
import operator import operator
import threading
import sickbeard import sickbeard
@ -37,6 +38,7 @@ from name_parser.parser import NameParser, InvalidNameException
class ProperFinder(): class ProperFinder():
def __init__(self): def __init__(self):
self.amActive = False
self.updateInterval = datetime.timedelta(hours=1) self.updateInterval = datetime.timedelta(hours=1)
check_propers_interval = {'15m': 15, '45m': 45, '90m': 90, '4h': 4*60, 'daily': 24*60} check_propers_interval = {'15m': 15, '45m': 45, '90m': 90, '4h': 4*60, 'daily': 24*60}
@ -44,7 +46,7 @@ class ProperFinder():
if sickbeard.CHECK_PROPERS_INTERVAL == curInterval: if sickbeard.CHECK_PROPERS_INTERVAL == curInterval:
self.updateInterval = datetime.timedelta(minutes = check_propers_interval[curInterval]) self.updateInterval = datetime.timedelta(minutes = check_propers_interval[curInterval])
def run(self): def run(self, force=False):
if not sickbeard.DOWNLOAD_PROPERS: if not sickbeard.DOWNLOAD_PROPERS:
return return
@ -57,15 +59,18 @@ class ProperFinder():
hourDiff = datetime.datetime.today().time().hour - updateTime.hour hourDiff = datetime.datetime.today().time().hour - updateTime.hour
dayDiff = (datetime.date.today() - self._get_lastProperSearch()).days dayDiff = (datetime.date.today() - self._get_lastProperSearch()).days
if sickbeard.CHECK_PROPERS_INTERVAL == "daily": if sickbeard.CHECK_PROPERS_INTERVAL == "daily" and not force:
# if it's less than an interval after the update time then do an update # if it's less than an interval after the update time then do an update
if not (hourDiff >= 0 and hourDiff < self.updateInterval.seconds / 3600 or dayDiff >= 1): if not (hourDiff >= 0 and hourDiff < self.updateInterval.seconds / 3600 or dayDiff >= 1):
return return
logger.log(u"Beginning the search for new propers") logger.log(u"Beginning the search for new propers")
self.amActive = True
propers = self._getProperList() propers = self._getProperList()
if propers:
self._downloadPropers(propers) self._downloadPropers(propers)
self._set_lastProperSearch(datetime.datetime.today().toordinal()) self._set_lastProperSearch(datetime.datetime.today().toordinal())
@ -76,15 +81,16 @@ class ProperFinder():
else: else:
logger.log(u"%sin ~%s" % (msg, sickbeard.CHECK_PROPERS_INTERVAL)) logger.log(u"%sin ~%s" % (msg, sickbeard.CHECK_PROPERS_INTERVAL))
def _getProperList(self): self.amActive = False
def _getProperList(self):
propers = {} propers = {}
# for each provider get a list of the propers # for each provider get a list of the
for curProvider in providers.sortedProviderList(): origThreadName = threading.currentThread().name
providers = [x for x in sickbeard.providers.sortedProviderList() if x.isActive()]
if not curProvider.isActive(): for curProvider in providers:
continue threading.currentThread().name = origThreadName + " :: [" + curProvider.name + "]"
search_date = datetime.datetime.today() - datetime.timedelta(days=2) search_date = datetime.datetime.today() - datetime.timedelta(days=2)
@ -97,25 +103,21 @@ class ProperFinder():
# if they haven't been added by a different provider than add the proper to the list # if they haven't been added by a different provider than add the proper to the list
for x in curPropers: for x in curPropers:
showObj = helpers.findCertainShow(sickbeard.showList, x.indexerid)
if not showObj:
logger.log(u"Unable to find the show in our watch list " + str(x.name), logger.DEBUG)
continue
name = self._genericName(x.name) name = self._genericName(x.name)
if not name in propers: if not name in propers:
logger.log(u"Found new proper: " + x.name, logger.DEBUG) logger.log(u"Found new proper: " + x.name, logger.DEBUG)
x.provider = curProvider x.provider = curProvider
propers[name] = x propers[name] = x
# reset thread name back to original
threading.currentThread().name = origThreadName
# take the list of unique propers and get it sorted by # take the list of unique propers and get it sorted by
sortedPropers = sorted(propers.values(), key=operator.attrgetter('date'), reverse=True) sortedPropers = sorted(propers.values(), key=operator.attrgetter('date'), reverse=True)
finalPropers = [] finalPropers = []
for curProper in sortedPropers: for curProper in sortedPropers:
in_cache = False
# parse the file name
try: try:
myParser = NameParser(False) myParser = NameParser(False)
parse_result = myParser.parse(curProper.name) parse_result = myParser.parse(curProper.name)
@ -126,23 +128,51 @@ class ProperFinder():
if not parse_result.series_name: if not parse_result.series_name:
continue continue
cacheResult = sickbeard.name_cache.retrieveNameFromCache(parse_result.series_name)
if cacheResult:
in_cache = True
curProper.indexerid = int(cacheResult)
elif cacheResult == 0:
return None
if not curProper.indexerid: if not curProper.indexerid:
showResult = helpers.searchDBForShow(parse_result.series_name)
if showResult:
curProper.indexerid = int(showResult[0])
if not curProper.indexerid:
for curShow in sickbeard.showList:
if show_name_helpers.isGoodResult(curProper.name, curShow, False):
curProper.indexerid = curShow.indexerid
break
showObj = None
if curProper.indexerid:
showObj = helpers.findCertainShow(sickbeard.showList, curProper.indexerid)
if not showObj:
sickbeard.name_cache.addNameToCache(parse_result.series_name, 0)
continue continue
if not in_cache:
sickbeard.name_cache.addNameToCache(parse_result.series_name, curProper.indexerid)
# scene numbering -> indexer numbering
parse_result = parse_result.convert(showObj)
if not parse_result.episode_numbers: if not parse_result.episode_numbers:
logger.log( logger.log(
u"Ignoring " + curProper.name + " because it's for a full season rather than specific episode", u"Ignoring " + curProper.name + " because it's for a full season rather than specific episode",
logger.DEBUG) logger.DEBUG)
continue continue
# populate our Proper instance # populate our Proper instance
if parse_result.air_by_date or parse_result.sports: if parse_result.air_by_date or parse_result.sports:
curProper.season = -1 curProper.season = -1
curProper.episode = parse_result.air_date or parse_result.sports_event_date curProper.episode = parse_result.air_date or parse_result.sports_event_date
else: else:
curProper.scene_season = parse_result.season_number if parse_result.season_number != None else 1 curProper.season = parse_result.season_number if parse_result.season_number != None else 1
curProper.scene_episode = parse_result.episode_numbers[0] curProper.episode = parse_result.episode_numbers[0]
curProper.quality = Quality.nameQuality(curProper.name) curProper.quality = Quality.nameQuality(curProper.name)
@ -214,11 +244,6 @@ class ProperFinder():
logger.log(u"Unable to find episode with date " + str( logger.log(u"Unable to find episode with date " + str(
curProper.episode) + " for show " + parse_result.series_name + ", skipping", logger.WARNING) curProper.episode) + " for show " + parse_result.series_name + ", skipping", logger.WARNING)
continue continue
else:
# items stored in cache are scene numbered, convert before lookups
epObj = showObj.getEpisode(curProper.season, curProper.episode)
curProper.season = epObj.season
curProper.episode = epObj.episode
# check if we actually want this proper (if it's the right quality) # check if we actually want this proper (if it's the right quality)
sqlResults = db.DBConnection().select( sqlResults = db.DBConnection().select(

View File

@ -317,6 +317,7 @@ class HDTorrentsProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -262,6 +262,7 @@ class IPTorrentsProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -396,6 +396,7 @@ class KATProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -310,6 +310,7 @@ class NextGenProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -287,6 +287,7 @@ class PublicHDProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -302,6 +302,7 @@ class SCCProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -238,6 +238,7 @@ class SpeedCDProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -376,6 +376,7 @@ class ThePirateBayProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -265,6 +265,7 @@ class TorrentDayProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -261,6 +261,7 @@ class TorrentLeechProvider(generic.TorrentProvider):
for sqlshow in sqlResults: for sqlshow in sqlResults:
self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) self.show = curshow = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"]))
if not self.show: continue
curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) curEp = curshow.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"]))
searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK')

View File

@ -44,6 +44,7 @@ class Scheduler:
self.initThread() self.initThread()
self.abort = False self.abort = False
self.force = False
def initThread(self): def initThread(self):
if self.thread == None or not self.thread.isAlive(): if self.thread == None or not self.thread.isAlive():
@ -55,6 +56,7 @@ class Scheduler:
def forceRun(self): def forceRun(self):
if not self.action.amActive: if not self.action.amActive:
self.lastRun = datetime.datetime.fromordinal(1) self.lastRun = datetime.datetime.fromordinal(1)
self.force = True
return True return True
return False return False
@ -70,7 +72,7 @@ class Scheduler:
if not self.silent: if not self.silent:
logger.log(u"Starting new thread: " + self.threadName, logger.DEBUG) logger.log(u"Starting new thread: " + self.threadName, logger.DEBUG)
self.action.run() self.action.run(self.force)
except Exception, e: except Exception, e:
logger.log(u"Exception generated in thread " + self.threadName + ": " + ex(e), logger.ERROR) logger.log(u"Exception generated in thread " + self.threadName + ": " + ex(e), logger.ERROR)
logger.log(repr(traceback.format_exc()), logger.DEBUG) logger.log(repr(traceback.format_exc()), logger.DEBUG)
@ -80,4 +82,7 @@ class Scheduler:
self.thread = None self.thread = None
return return
if self.force:
self.force = False
time.sleep(1) time.sleep(1)

View File

@ -184,7 +184,7 @@ class BacklogSearcher:
myDB.action("UPDATE info SET last_backlog=" + str(when)) myDB.action("UPDATE info SET last_backlog=" + str(when))
def run(self): def run(self, force=False):
try: try:
self.searchBacklog() self.searchBacklog()
except: except:

View File

@ -67,6 +67,13 @@ class SearchQueue(generic_queue.GenericQueue):
return True return True
return False return False
def is_dailysearch_in_progress(self):
queue = [x for x in self.queue.queue] + [self.currentItem]
for cur_item in queue:
if isinstance(cur_item, DailySearchQueueItem):
return True
return False
def add_item(self, item): def add_item(self, item):
if isinstance(item, DailySearchQueueItem) and not self.is_in_queue(item.show, item.segment): if isinstance(item, DailySearchQueueItem) and not self.is_in_queue(item.show, item.segment):

View File

@ -86,7 +86,7 @@ class SubtitlesFinder():
The SubtitlesFinder will be executed every hour but will not necessarly search The SubtitlesFinder will be executed every hour but will not necessarly search
and download subtitles. Only if the defined rule is true and download subtitles. Only if the defined rule is true
""" """
def run(self): def run(self, force=False):
# TODO: Put that in the __init__ before starting the thread? # TODO: Put that in the __init__ before starting the thread?
if not sickbeard.USE_SUBTITLES: if not sickbeard.USE_SUBTITLES:
logger.log(u'Subtitles support disabled', logger.DEBUG) logger.log(u'Subtitles support disabled', logger.DEBUG)

View File

@ -32,7 +32,7 @@ class TraktChecker():
self.todoWanted = [] self.todoWanted = []
self.todoBacklog = [] self.todoBacklog = []
def run(self): def run(self, force=False):
if sickbeard.TRAKT_USE_WATCHLIST: if sickbeard.TRAKT_USE_WATCHLIST:
self.todoWanted = [] #its about to all get re-added self.todoWanted = [] #its about to all get re-added
if len(sickbeard.ROOT_DIRS.split('|')) < 2: if len(sickbeard.ROOT_DIRS.split('|')) < 2:

View File

@ -57,7 +57,7 @@ class CheckVersion():
else: else:
self.updater = None self.updater = None
def run(self): def run(self, force=False):
updated = None updated = None
if self.check_for_new_version(): if self.check_for_new_version():
if sickbeard.AUTO_UPDATE: if sickbeard.AUTO_UPDATE:

View File

@ -206,7 +206,8 @@ class ManageSearches:
#t.backlogPI = sickbeard.backlogSearchScheduler.action.getProgressIndicator() #t.backlogPI = sickbeard.backlogSearchScheduler.action.getProgressIndicator()
t.backlogPaused = sickbeard.searchQueueScheduler.action.is_backlog_paused() # @UndefinedVariable t.backlogPaused = sickbeard.searchQueueScheduler.action.is_backlog_paused() # @UndefinedVariable
t.backlogRunning = sickbeard.searchQueueScheduler.action.is_backlog_in_progress() # @UndefinedVariable t.backlogRunning = sickbeard.searchQueueScheduler.action.is_backlog_in_progress() # @UndefinedVariable
t.searchStatus = sickbeard.dailySearchScheduler.action.amActive # @UndefinedVariable t.dailySearchStatus = sickbeard.searchQueueScheduler.action.is_dailysearch_in_progress() # @UndefinedVariable
t.findPropersStatus = sickbeard.properFinderScheduler.action.amActive # @UndefinedVariable
t.submenu = ManageMenu() t.submenu = ManageMenu()
@ -231,7 +232,18 @@ class ManageSearches:
result = sickbeard.dailySearchScheduler.forceRun() result = sickbeard.dailySearchScheduler.forceRun()
if result: if result:
logger.log(u"Daily search forced") logger.log(u"Daily search forced")
ui.notifications.message('Daily search for new releases started') ui.notifications.message('Daily search started')
redirect("/manage/manageSearches/")
@cherrypy.expose
def forceFindPropers(self):
# force it to run the next time it looks
result = sickbeard.properFinderScheduler.forceRun()
if result:
logger.log(u"Find propers search forced")
ui.notifications.message('Find propers search started')
redirect("/manage/manageSearches/") redirect("/manage/manageSearches/")