@ -20,7 +20,7 @@ from __future__ import with_statement
import cherrypy
import cherrypy
import webbrowser
import webbrowser
import sqlite3
import time
import datetime
import datetime
import socket
import socket
import os , sys , subprocess , re
import os , sys , subprocess , re
@ -41,6 +41,7 @@ from sickbeard import helpers, db, exceptions, show_queue, search_queue, schedul
from sickbeard import logger
from sickbeard import logger
from sickbeard import naming
from sickbeard import naming
from sickbeard import dailysearcher
from sickbeard import dailysearcher
from sickbeard import maintenance
from sickbeard import scene_numbering , scene_exceptions , name_cache
from sickbeard import scene_numbering , scene_exceptions , name_cache
from indexers . indexer_api import indexerApi
from indexers . indexer_api import indexerApi
from indexers . indexer_exceptions import indexer_shownotfound , indexer_exception , indexer_error , indexer_episodenotfound , \
from indexers . indexer_exceptions import indexer_shownotfound , indexer_exception , indexer_error , indexer_episodenotfound , \
@ -77,6 +78,7 @@ PIDFILE = ''
DAEMON = None
DAEMON = None
maintenanceScheduler = None
dailySearchScheduler = None
dailySearchScheduler = None
backlogSearchScheduler = None
backlogSearchScheduler = None
showUpdateScheduler = None
showUpdateScheduler = None
@ -472,7 +474,7 @@ def initialize(consoleLogging=True):
USE_FAILED_DOWNLOADS , DELETE_FAILED , ANON_REDIRECT , LOCALHOST_IP , TMDB_API_KEY , DEBUG , PROXY_SETTING , \
USE_FAILED_DOWNLOADS , DELETE_FAILED , ANON_REDIRECT , LOCALHOST_IP , TMDB_API_KEY , DEBUG , PROXY_SETTING , \
AUTOPOSTPROCESSER_FREQUENCY , DEFAULT_AUTOPOSTPROCESSER_FREQUENCY , MIN_AUTOPOSTPROCESSER_FREQUENCY , \
AUTOPOSTPROCESSER_FREQUENCY , DEFAULT_AUTOPOSTPROCESSER_FREQUENCY , MIN_AUTOPOSTPROCESSER_FREQUENCY , \
ANIME_DEFAULT , NAMING_ANIME , ANIMESUPPORT , USE_ANIDB , ANIDB_USERNAME , ANIDB_PASSWORD , ANIDB_USE_MYLIST , \
ANIME_DEFAULT , NAMING_ANIME , ANIMESUPPORT , USE_ANIDB , ANIDB_USERNAME , ANIDB_PASSWORD , ANIDB_USE_MYLIST , \
ANIME_SPLIT_HOME
ANIME_SPLIT_HOME , maintenanceScheduler
if __INITIALIZED__ :
if __INITIALIZED__ :
return False
return False
@ -904,7 +906,7 @@ def initialize(consoleLogging=True):
# initialize the cache database
# initialize the cache database
db . upgradeDatabase ( db . DBConnection ( " cache.db " ) , cache_db . InitialSchema )
db . upgradeDatabase ( db . DBConnection ( " cache.db " ) , cache_db . InitialSchema )
# initalize the failed downloads database
# initi alize the failed downloads database
db . upgradeDatabase ( db . DBConnection ( " failed.db " ) , failed_db . InitialSchema )
db . upgradeDatabase ( db . DBConnection ( " failed.db " ) , failed_db . InitialSchema )
# fix up any db problems
# fix up any db problems
@ -933,10 +935,20 @@ def initialize(consoleLogging=True):
newznabProviderList = providers . getNewznabProviderList ( NEWZNAB_DATA )
newznabProviderList = providers . getNewznabProviderList ( NEWZNAB_DATA )
providerList = providers . makeProviderList ( )
providerList = providers . makeProviderList ( )
# the interval for this is stored inside the ShowUpdater class
maintenanceScheduler = scheduler . Scheduler ( maintenance . Maintenance ( ) ,
showUpdaterInstance = showUpdater . ShowUpdater ( )
cycleTime = datetime . timedelta ( hours = 1 ) ,
showUpdateScheduler = scheduler . Scheduler ( showUpdaterInstance ,
threadName = " MAINTENANCE " ,
cycleTime = showUpdaterInstance . updateInterval ,
silent = True ,
runImmediately = True )
dailySearchScheduler = scheduler . Scheduler ( dailysearcher . DailySearcher ( ) ,
cycleTime = datetime . timedelta ( minutes = DAILYSEARCH_FREQUENCY ) ,
threadName = " DAILYSEARCHER " ,
silent = True ,
runImmediately = DAILYSEARCH_STARTUP )
showUpdateScheduler = scheduler . Scheduler ( showUpdater . ShowUpdater ( ) ,
cycleTime = showUpdater . ShowUpdater ( ) . updateInterval ,
threadName = " SHOWUPDATER " ,
threadName = " SHOWUPDATER " ,
runImmediately = False )
runImmediately = False )
@ -956,29 +968,30 @@ def initialize(consoleLogging=True):
threadName = " SEARCHQUEUE " ,
threadName = " SEARCHQUEUE " ,
silent = True )
silent = True )
properFinderInstance = properFinder . ProperFinder ( )
properFinderScheduler = scheduler . Scheduler ( properFinder . ProperFinder ( ) ,
properFinderScheduler = scheduler . Scheduler ( properFinderInstance ,
cycleTime = properFinder . ProperFinder ( ) . updateInterval ,
cycleTime = properFinderInstance . updateInterval ,
threadName = " FINDPROPERS " ,
threadName = " FINDPROPERS " ,
silent = False if DOWNLOAD_PROPERS else True ,
runImmediately = True )
runImmediately = True )
if not DOWNLOAD_PROPERS :
properFinderScheduler . silent = True
autoPostProcesserScheduler = scheduler . Scheduler ( autoPostProcesser . PostProcesser ( ) ,
autoPostProcesserScheduler = scheduler . Scheduler ( autoPostProcesser . PostProcesser ( ) ,
cycleTime = datetime . timedelta (
cycleTime = datetime . timedelta (
minutes = AUTOPOSTPROCESSER_FREQUENCY ) ,
minutes = AUTOPOSTPROCESSER_FREQUENCY ) ,
threadName = " POSTPROCESSER " ,
threadName = " POSTPROCESSER " ,
silent = False if PROCESS_AUTOMATICALLY else True ,
runImmediately = True )
runImmediately = True )
if not PROCESS_AUTOMATICALLY :
autoPostProcesserScheduler . silent = True
traktWatchListCheckerSchedular = scheduler . Scheduler ( traktWatchListChecker . TraktChecker ( ) ,
traktWatchListCheckerSchedular = scheduler . Scheduler ( traktWatchListChecker . TraktChecker ( ) ,
cycleTime = datetime . timedelta ( hours = 1 ) ,
cycleTime = datetime . timedelta ( hours = 1 ) ,
threadName = " TRAKTWATCHLIST " ,
threadName = " TRAKTWATCHLIST " ,
silent = False if USE_TRAKT else True ,
runImmediately = True )
runImmediately = True )
if not USE_TRAKT :
subtitlesFinderScheduler = scheduler . Scheduler ( subtitles . SubtitlesFinder ( ) ,
traktWatchListCheckerSchedular . silent = True
cycleTime = datetime . timedelta ( hours = SUBTITLES_FINDER_FREQUENCY ) ,
threadName = " FINDSUBTITLES " ,
silent = False if USE_SUBTITLES else True ,
runImmediately = True )
backlogSearchScheduler = searchBacklog . BacklogSearchScheduler ( searchBacklog . BacklogSearcher ( ) ,
backlogSearchScheduler = searchBacklog . BacklogSearchScheduler ( searchBacklog . BacklogSearcher ( ) ,
cycleTime = datetime . timedelta (
cycleTime = datetime . timedelta (
@ -987,23 +1000,6 @@ def initialize(consoleLogging=True):
silent = True ,
silent = True ,
runImmediately = BACKLOG_STARTUP )
runImmediately = BACKLOG_STARTUP )
dailySearchScheduler = scheduler . Scheduler ( dailysearcher . DailySearcher ( ) ,
cycleTime = datetime . timedelta ( minutes = DAILYSEARCH_FREQUENCY ) ,
threadName = " DAILYSEARCHER " ,
silent = True ,
runImmediately = DAILYSEARCH_STARTUP )
subtitlesFinderScheduler = scheduler . Scheduler ( subtitles . SubtitlesFinder ( ) ,
cycleTime = datetime . timedelta ( hours = SUBTITLES_FINDER_FREQUENCY ) ,
threadName = " FINDSUBTITLES " ,
runImmediately = True )
if not USE_SUBTITLES :
subtitlesFinderScheduler . silent = True
showList = [ ]
loadingShowList = { }
# dynamically load provider settings
# dynamically load provider settings
for curTorrentProvider in [ curProvider for curProvider in providers . sortedProviderList ( ) if
for curTorrentProvider in [ curProvider for curProvider in providers . sortedProviderList ( ) if
curProvider . providerType == GenericProvider . TORRENT ] :
curProvider . providerType == GenericProvider . TORRENT ] :
@ -1099,23 +1095,29 @@ def initialize(consoleLogging=True):
except :
except :
pass
pass
showList = [ ]
loadingShowList = { }
__INITIALIZED__ = True
__INITIALIZED__ = True
return True
return True
def start ( ) :
def start ( ) :
global __INITIALIZED__ , backlogSearchScheduler , \
global __INITIALIZED__ , maintenanceScheduler , backlogSearchScheduler , \
showUpdateScheduler , versionCheckScheduler , showQueueScheduler , \
showUpdateScheduler , versionCheckScheduler , showQueueScheduler , \
properFinderScheduler , autoPostProcesserScheduler , searchQueueScheduler , \
properFinderScheduler , autoPostProcesserScheduler , searchQueueScheduler , \
subtitlesFinderScheduler , started , USE_SUBTITLES , \
subtitlesFinderScheduler , USE_SUBTITLES , traktWatchListCheckerSchedular , \
traktWatchListCheckerSchedular , dailySearchScheduler , started
dailySearchScheduler , started
with INIT_LOCK :
with INIT_LOCK :
if __INITIALIZED__ :
if __INITIALIZED__ :
# start the version checker
# start the maintenance scheduler
versionCheckScheduler . thread . start ( )
maintenanceScheduler . thread . start ( )
logger . log ( u " Performing initial maintenance tasks, please wait ... " )
while maintenanceScheduler . action . amActive :
time . sleep ( 1 )
# start the daily search scheduler
# start the daily search scheduler
dailySearchScheduler . thread . start ( )
dailySearchScheduler . thread . start ( )
@ -1123,17 +1125,20 @@ def start():
# start the backlog scheduler
# start the backlog scheduler
backlogSearchScheduler . thread . start ( )
backlogSearchScheduler . thread . start ( )
# start the search queue check er
# start the show updat er
searchQueu eScheduler . thread . start ( )
showUpdat eScheduler . thread . start ( )
# start the queue checker
# start the version checker
properFinder Scheduler. thread . start ( )
versionCheck Scheduler. thread . start ( )
# start the queue checker
# start the queue checker
showQueueScheduler . thread . start ( )
showQueueScheduler . thread . start ( )
# start the show updater
# start the search queue checker
showUpdateScheduler . thread . start ( )
searchQueueScheduler . thread . start ( )
# start the queue checker
properFinderScheduler . thread . start ( )
# start the proper finder
# start the proper finder
autoPostProcesserScheduler . thread . start ( )
autoPostProcesserScheduler . thread . start ( )
@ -1149,10 +1154,11 @@ def start():
def halt ( ) :
def halt ( ) :
global __INITIALIZED__ , backlogSearchScheduler , showUpdateScheduler , \
global __INITIALIZED__ , maintenanceScheduler , backlogSearchScheduler , \
showQueueScheduler , properFinderScheduler , autoPostProcesserScheduler , searchQueueScheduler , \
showUpdateScheduler , versionCheckScheduler , showQueueScheduler , \
subtitlesFinderScheduler , dailySearchScheduler , started , \
properFinderScheduler , autoPostProcesserScheduler , searchQueueScheduler , \
traktWatchListCheckerSchedular
subtitlesFinderScheduler , traktWatchListCheckerSchedular , \
dailySearchScheduler , started
with INIT_LOCK :
with INIT_LOCK :
@ -1162,10 +1168,10 @@ def halt():
# abort all the threads
# abort all the threads
backlogSearch Scheduler. abort = True
maintenance Scheduler. abort = True
logger . log ( u " Waiting for the BACKLOG thread to exit " )
logger . log ( u " Waiting for the MAINTENANCE scheduler thread to exit " )
try :
try :
backlogSearch Scheduler. thread . join ( 10 )
maintenance Scheduler. thread . join ( 10 )
except :
except :
pass
pass
@ -1176,6 +1182,13 @@ def halt():
except :
except :
pass
pass
backlogSearchScheduler . abort = True
logger . log ( u " Waiting for the BACKLOG thread to exit " )
try :
backlogSearchScheduler . thread . join ( 10 )
except :
pass
showUpdateScheduler . abort = True
showUpdateScheduler . abort = True
logger . log ( u " Waiting for the SHOWUPDATER thread to exit " )
logger . log ( u " Waiting for the SHOWUPDATER thread to exit " )
try :
try :
@ -1234,7 +1247,7 @@ def halt():
if ADBA_CONNECTION :
if ADBA_CONNECTION :
ADBA_CONNECTION . logout ( )
ADBA_CONNECTION . logout ( )
#ADBA_CONNECTION.stop()
# ADBA_CONNECTION.stop()
logger . log ( u " Waiting for the ANIDB CONNECTION thread to exit " )
logger . log ( u " Waiting for the ANIDB CONNECTION thread to exit " )
try :
try :
ADBA_CONNECTION . join ( 5 )
ADBA_CONNECTION . join ( 5 )
@ -1336,7 +1349,7 @@ def restart(soft=True):
if soft :
if soft :
halt ( )
halt ( )
saveAll ( )
saveAll ( )
#logger.log(u"Restarting cherrypy")
# logger.log(u"Restarting cherrypy")
#cherrypy.engine.restart()
#cherrypy.engine.restart()
logger . log ( u " Re-initializing all data " )
logger . log ( u " Re-initializing all data " )
initialize ( )
initialize ( )