diff --git a/lib/tvdb_api/tvdb_api.py b/lib/tvdb_api/tvdb_api.py index 62147a8f..14105e3a 100644 --- a/lib/tvdb_api/tvdb_api.py +++ b/lib/tvdb_api/tvdb_api.py @@ -44,6 +44,11 @@ from tvdb_ui import BaseUI, ConsoleUI from tvdb_exceptions import (tvdb_error, tvdb_userabort, tvdb_shownotfound, tvdb_seasonnotfound, tvdb_episodenotfound, tvdb_attributenotfound) +# Cached Session Handler +from lib.httpcache import CachingHTTPAdapter +s = requests.Session() +s.mount('http://', CachingHTTPAdapter()) + def log(): return logging.getLogger("tvdb_api") @@ -511,17 +516,12 @@ class Tvdb: try: log().debug("Retrieving URL %s" % url) - # cacheControl - if self.config['cache_enabled']: - from lib.httpcache import CachingHTTPAdapter - sess = requests.Session() - sess.mount('http://', CachingHTTPAdapter()) - else: - sess = requests.Session() - # get response from TVDB - resp = sess.get(url, params=params) - sess.close() + if self.config['cache_enabled']: + resp = s.get(url, params=params) + else: + resp = requests.get(url, params=params) + except requests.HTTPError, e: raise tvdb_error("HTTP error " + str(e.errno) + " while loading URL " + str(url)) @@ -534,21 +534,18 @@ class Tvdb: except Exception, e: raise tvdb_error("Unknown exception occured: " + str(e.message) + " while loading URL " + str(url)) - if resp.ok and resp.content: - if 'application/zip' in resp.headers.get("Content-Type", ''): - try: - # TODO: The zip contains actors.xml and banners.xml, which are currently ignored [GH-20] - log().debug("We recived a zip file unpacking now ...") - zipdata = StringIO.StringIO() - zipdata.write(resp.content) - myzipfile = zipfile.ZipFile(zipdata) - return myzipfile.read('%s.xml' % language) - except zipfile.BadZipfile: - raise tvdb_error("Bad zip file received from thetvdb.com, could not read it") + if 'application/zip' in resp.headers.get("Content-Type", '') and resp.ok: + try: + # TODO: The zip contains actors.xml and banners.xml, which are currently ignored [GH-20] + log().debug("We recived a zip file unpacking now ...") + zipdata = StringIO.StringIO() + zipdata.write(resp.content) + myzipfile = zipfile.ZipFile(zipdata) + return myzipfile.read('%s.xml' % language) + except zipfile.BadZipfile: + raise tvdb_error("Bad zip file received from thetvdb.com, could not read it") - return resp.content - - return None + return resp.content if resp.ok else None def _getetsrc(self, url, params=None, language=None): """Loads a URL using caching, returns an ElementTree of the source diff --git a/lib/tvrage_api/tvrage_api.py b/lib/tvrage_api/tvrage_api.py index ed1f038d..e4df8e47 100644 --- a/lib/tvrage_api/tvrage_api.py +++ b/lib/tvrage_api/tvrage_api.py @@ -36,6 +36,11 @@ from tvrage_ui import BaseUI from tvrage_exceptions import (tvrage_error, tvrage_userabort, tvrage_shownotfound, tvrage_seasonnotfound, tvrage_episodenotfound, tvrage_attributenotfound) +# Cached Session Handler +from lib.httpcache import CachingHTTPAdapter +s = requests.Session() +s.mount('http://', CachingHTTPAdapter()) + def log(): return logging.getLogger("tvrage_api") @@ -252,6 +257,7 @@ class TVRage: self.shows = ShowContainer() # Holds all Show classes self.corrections = {} # Holds show-name to show_id mapping + self.sess = requests.session() # HTTP Session self.config = {} @@ -266,15 +272,10 @@ class TVRage: if cache is True: self.config['cache_enabled'] = True - self.config['cache_location'] = self._getTempDir() - elif cache is False: self.config['cache_enabled'] = False - elif isinstance(cache, basestring): self.config['cache_enabled'] = True - self.config['cache_location'] = cache - else: raise ValueError("Invalid value for Cache %r (type was %s)" % (cache, type(cache))) @@ -345,17 +346,12 @@ class TVRage: try: log().debug("Retrieving URL %s" % url) - # cacheControl - if self.config['cache_enabled']: - from lib.httpcache import CachingHTTPAdapter - sess = requests.Session() - sess.mount('http://', CachingHTTPAdapter()) - else: - sess = requests.Session() - # get response from TVRage - resp = sess.get(url, params=params) - sess.close() + if self.config['cache_enabled']: + resp = s.get(url, params=params) + else: + resp = requests.get(url, params=params) + except requests.HTTPError, e: raise tvrage_error("HTTP error " + str(e.errno) + " while loading URL " + str(url)) @@ -365,7 +361,7 @@ class TVRage: except requests.Timeout, e: raise tvrage_error("Connection timed out " + str(e.message) + " while loading URL " + str(url)) - return resp.content if resp.ok and resp.content else None + return resp.content if resp.ok else None def _getetsrc(self, url, params=None): """Loads a URL using caching, returns an ElementTree of the source diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 411cd261..ec7e0890 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -37,6 +37,7 @@ from sickbeard import searchCurrent, searchBacklog, showUpdater, versionChecker, from sickbeard import helpers, db, exceptions, show_queue, search_queue, scheduler, show_name_helpers from sickbeard import logger from sickbeard import naming +from sickbeard import scene_numbering from common import SD, SKIPPED, NAMING_REPEAT diff --git a/sickbeard/databases/cache_db.py b/sickbeard/databases/cache_db.py index f83f0415..13156b08 100644 --- a/sickbeard/databases/cache_db.py +++ b/sickbeard/databases/cache_db.py @@ -57,7 +57,21 @@ class AddNetworkTimezones(AddSceneNameCache): def execute(self): self.connection.action("CREATE TABLE network_timezones (network_name TEXT PRIMARY KEY, timezone TEXT)") -class ConverSceneExceptionsToIndexerID(AddNetworkTimezones): +class AddXemNumbering(AddNetworkTimezones): + def test(self): + return self.hasTable("xem_numbering") + + def execute(self): + self.connection.action("CREATE TABLE xem_numbering (indexer TEXT, indexer_id INTEGER, season INTEGER, episode INTEGER, scene_season INTEGER, scene_episode INTEGER, PRIMARY KEY (indexer_id, season, episode))") + +class AddXemRefresh(AddXemNumbering): + def test(self): + return self.hasTable("xem_refresh") + + def execute(self): + self.connection.action("CREATE TABLE xem_refresh (indexer TEXT, indexer_id INTEGER PRIMARY KEY, last_refreshed INTEGER)") + +class ConvertSceneExceptionsToIndexerID(AddXemRefresh): def test(self): return self.hasColumn("scene_exceptions", "indexer_id") @@ -67,7 +81,7 @@ class ConverSceneExceptionsToIndexerID(AddNetworkTimezones): self.connection.action("INSERT INTO scene_exceptions(exception_id, indexer_id, show_name) SELECT exception_id, tvdb_id, show_name FROM tmp_scene_exceptions") self.connection.action("DROP TABLE tmp_scene_exceptions") -class ConverSceneNamesToIndexerID(ConverSceneExceptionsToIndexerID): +class ConvertSceneNamesToIndexerID(ConvertSceneExceptionsToIndexerID): def test(self): return self.hasColumn("scene_names", "indexer_id") @@ -76,3 +90,4 @@ class ConverSceneNamesToIndexerID(ConverSceneExceptionsToIndexerID): self.connection.action("CREATE TABLE scene_names (indexer_id INTEGER, name TEXT)") self.connection.action("INSERT INTO scene_names(indexer_id, name) SELECT tvdb_id, name FROM tmp_scene_names") self.connection.action("DROP TABLE tmp_scene_names") + diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 9865bb9f..a6b73673 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -27,7 +27,7 @@ from sickbeard import encodingKludge as ek from sickbeard.name_parser.parser import NameParser, InvalidNameException MIN_DB_VERSION = 9 # oldest db version we support migrating from -MAX_DB_VERSION = 26 +MAX_DB_VERSION = 27 class MainSanityCheck(db.DBSanityCheck): @@ -570,4 +570,18 @@ class AddArchiveFirstMatchOption(ConvertInfoToIndexerScheme): self.connection.action("ALTER TABLE tv_shows ADD archive_firstmatch NUMERIC") + self.incDBVersion() + +class AddSceneNumbering(AddArchiveFirstMatchOption): + def test(self): + return self.checkDBVersion() >= 27 + + def execute(self): + backupDatabase(27) + + if self.hasTable("scene_numbering"): + self.connection.action("DROP TABLE scene_numbering") + + self.connection.action("CREATE TABLE scene_numbering (indexer TEXT, indexer_id INTEGER, season INTEGER, episode INTEGER, scene_season INTEGER, scene_episode INTEGER, PRIMARY KEY (indexer_id, season, episode))") + self.incDBVersion() \ No newline at end of file diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 4e99809d..134834da 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -33,9 +33,8 @@ import uuid import base64 from lib import requests -from httplib import BadStatusLine from itertools import izip, cycle -from lib.httpcache import CachingHTTPAdapter +from contextlib import closing try: import json @@ -170,10 +169,6 @@ def getURL(url, post_data=None, headers=None, params=None, timeout=None): Returns a byte-string retrieved from the url provider. """ - # Cache Handler - sess = requests.Session() - sess.mount('http://', CachingHTTPAdapter()) - req_headers = ['User-Agent', USER_AGENT, 'Accept-Encoding', 'gzip,deflate'] if headers: for cur_header in headers: @@ -186,8 +181,7 @@ Returns a byte-string retrieved from the url provider. url = urlparse.urlunparse(parsed) it = iter(req_headers) - resp = sess.get(url, params=params, data=post_data, headers=dict(zip(it, it))) - sess.close() + resp = requests.get(url, params=params, data=post_data, headers=dict(zip(it, it))) except requests.HTTPError, e: logger.log(u"HTTP error " + str(e.errno) + " while loading URL " + url, logger.WARNING) return None @@ -200,7 +194,7 @@ Returns a byte-string retrieved from the url provider. logger.log(u"Connection timed out " + str(e.message) + " while loading URL " + url, logger.WARNING) return None - return resp.content if resp.ok and resp.content else None + return resp.content if resp.ok else None def _remove_file_failed(file): try: @@ -210,19 +204,13 @@ def _remove_file_failed(file): def download_file(url, filename): try: - # cache handler - sess = requests.Session() - sess.mount('http://', CachingHTTPAdapter()) - req = sess.get(url, stream=True) - - #CHUNK = 16 * 1024 - with open(filename, 'wb') as fp: - for chunk in req.iter_content(chunk_size=(16 *1024)): - if chunk: - fp.write(chunk) - fp.flush() - fp.close() - sess.close() + with closing(requests.get(url, stream=True)) as r: + with open(filename, 'wb') as fp: + for chunk in r.iter_content(chunk_size=(16 *1024)): + if chunk: + fp.write(chunk) + fp.flush() + fp.close() except requests.HTTPError, e: _remove_file_failed(filename) @@ -264,7 +252,7 @@ def makeDir(path): return True -def searchDBForShow(regShowName): +def searchDBForShow(regShowName, indexer_id=None): showNames = [re.sub('[. -]', ' ', regShowName),regShowName] @@ -302,7 +290,7 @@ def searchDBForShow(regShowName): return None -def searchIndexersForShow(regShowName): +def searchIndexersForShow(regShowName, indexer_id = None): showNames = [re.sub('[. -]', ' ', regShowName),regShowName] diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 8e9ac123..d90c661d 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -949,8 +949,7 @@ class GenericMetadata(): result = tmdb.TV(id) except: - return None - return None + pass if result is None: return None diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index 01590320..e4151dcc 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -676,7 +676,7 @@ class PostProcessor(object): root_ep = None for cur_episode in episodes: - # convert episode from scene numbering to TVDB numbering + # convert episode from scene numbering to Indexer numbering (s, e) = sickbeard.scene_numbering.get_indexer_numbering(indexer_id, season, int(cur_episode)) self._log(u"Retrieving episode object for " + str(s) + "x" + str(e), logger.DEBUG) diff --git a/sickbeard/scene_numbering.py b/sickbeard/scene_numbering.py index 5a3d6c68..7b9afbf1 100644 --- a/sickbeard/scene_numbering.py +++ b/sickbeard/scene_numbering.py @@ -27,26 +27,16 @@ try: except ImportError: from lib import simplejson as json +import sickbeard + from sickbeard import logger from sickbeard import db -from sickbeard.helpers import getURL +from sickbeard import helpers from sickbeard.exceptions import ex from lib import requests MAX_XEM_AGE_SECS = 86400 # 1 day -_schema_created = False -def _check_for_schema(): - global _schema_created - if not _schema_created: - myDB = db.DBConnection() - cacheDB = db.DBConnection('cache.db') - myDB.action('CREATE TABLE if not exists scene_numbering (indexer_id INTEGER, season INTEGER, episode INTEGER, scene_season INTEGER, scene_episode INTEGER, PRIMARY KEY (indexer_id, season, episode))') - - cacheDB.action('CREATE TABLE if not exists xem_numbering (indexer_id INTEGER, season INTEGER, episode INTEGER, scene_season INTEGER, scene_episode INTEGER, PRIMARY KEY (indexer_id, season, episode))') - cacheDB.action('CREATE TABLE if not exists xem_refresh (indexer_id INTEGER PRIMARY KEY, last_refreshed INTEGER)') - _schema_created = True - def get_scene_numbering(indexer_id, season, episode, fallback_to_xem=True): """ Returns a tuple, (season, episode), with the scene numbering (if there is one), @@ -62,7 +52,7 @@ def get_scene_numbering(indexer_id, season, episode, fallback_to_xem=True): """ if indexer_id is None or season is None or episode is None: return (season, episode) - + result = find_scene_numbering(indexer_id, season, episode) if result: return result @@ -79,11 +69,14 @@ def find_scene_numbering(indexer_id, season, episode): """ if indexer_id is None or season is None or episode is None: return (season, episode) - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return (season, episode) + indexer = showObj.indexer + myDB = db.DBConnection() - - rows = myDB.select("SELECT scene_season, scene_episode FROM scene_numbering WHERE indexer_id = ? and season = ? and episode = ?", [indexer_id, season, episode]) + + rows = myDB.select("SELECT scene_season, scene_episode FROM scene_numbering WHERE indexer = ? and indexer_id = ? and season = ? and episode = ?", [indexer, indexer_id, season, episode]) if rows: return (int(rows[0]["scene_season"]), int(rows[0]["scene_episode"])) else: @@ -96,11 +89,14 @@ def get_indexer_numbering(indexer_id, sceneSeason, sceneEpisode, fallback_to_xem """ if indexer_id is None or sceneSeason is None or sceneEpisode is None: return (sceneSeason, sceneEpisode) - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return (sceneSeason, sceneEpisode) + indexer = showObj.indexer + myDB = db.DBConnection() - rows = myDB.select("SELECT season, episode FROM scene_numbering WHERE indexer_id = ? and scene_season = ? and scene_episode = ?", [indexer_id, sceneSeason, sceneEpisode]) + rows = myDB.select("SELECT season, episode FROM scene_numbering WHERE indexer = ? and indexer_id = ? and scene_season = ? and scene_episode = ?", [indexer, indexer_id, sceneSeason, sceneEpisode]) if rows: return (int(rows[0]["season"]), int(rows[0]["episode"])) else: @@ -116,13 +112,16 @@ def get_scene_numbering_for_show(indexer_id): """ if indexer_id is None: return {} - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return {} + indexer = showObj.indexer + myDB = db.DBConnection() rows = myDB.select('''SELECT season, episode, scene_season, scene_episode - FROM scene_numbering WHERE indexer_id = ? - ORDER BY season, episode''', [indexer_id]) + FROM scene_numbering WHERE indexer = ? and indexer_id = ? + ORDER BY season, episode''', [indexer, indexer_id]) result = {} for row in rows: result[(int(row['season']), int(row['episode']))] = (int(row['scene_season']), int(row['scene_episode'])) @@ -137,8 +136,11 @@ def set_scene_numbering(indexer_id, season, episode, sceneSeason=None, sceneEpis """ if indexer_id is None or season is None or episode is None: return - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return + indexer = showObj.indexer + myDB = db.DBConnection() # sanity @@ -146,11 +148,11 @@ def set_scene_numbering(indexer_id, season, episode, sceneSeason=None, sceneEpis #if sceneEpisode == None: sceneEpisode = episode # delete any existing record first - myDB.action('DELETE FROM scene_numbering where indexer_id = ? and season = ? and episode = ?', [indexer_id, season, episode]) + myDB.action('DELETE FROM scene_numbering where indexer = ? and indexer_id = ? and season = ? and episode = ?', [indexer, indexer_id, season, episode]) # now, if the new numbering is not the default, we save a new record if sceneSeason is not None and sceneEpisode is not None: - myDB.action("INSERT INTO scene_numbering (indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?)", [indexer_id, season, episode, sceneSeason, sceneEpisode]) + myDB.action("INSERT INTO scene_numbering (indexer, indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?,?)", [indexer, indexer_id, season, episode, sceneSeason, sceneEpisode]) def find_xem_numbering(indexer_id, season, episode): @@ -165,13 +167,16 @@ def find_xem_numbering(indexer_id, season, episode): """ if indexer_id is None or season is None or episode is None: return None - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return None + indexer = showObj.indexer + if _xem_refresh_needed(indexer_id): _xem_refresh(indexer_id) cacheDB = db.DBConnection('cache.db') - rows = cacheDB.select("SELECT scene_season, scene_episode FROM xem_numbering WHERE indexer_id = ? and season = ? and episode = ?", [indexer_id, season, episode]) + rows = cacheDB.select("SELECT scene_season, scene_episode FROM xem_numbering WHERE indexer = ? and indexer_id = ? and season = ? and episode = ?", [indexer, indexer_id, season, episode]) if rows: return (int(rows[0]["scene_season"]), int(rows[0]["scene_episode"])) else: @@ -188,12 +193,15 @@ def get_indexer_numbering_for_xem(indexer_id, sceneSeason, sceneEpisode): """ if indexer_id is None or sceneSeason is None or sceneEpisode is None: return None - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return None + indexer = showObj.indexer + if _xem_refresh_needed(indexer_id): _xem_refresh(indexer_id) cacheDB = db.DBConnection('cache.db') - rows = cacheDB.select("SELECT season, episode FROM xem_numbering WHERE indexer_id = ? and scene_season = ? and scene_episode = ?", [indexer_id, sceneSeason, sceneEpisode]) + rows = cacheDB.select("SELECT season, episode FROM xem_numbering WHERE indexer = ? and indexer_id = ? and scene_season = ? and scene_episode = ?", [indexer, indexer_id, sceneSeason, sceneEpisode]) if rows: return (int(rows[0]["season"]), int(rows[0]["episode"])) else: @@ -208,10 +216,13 @@ def _xem_refresh_needed(indexer_id): """ if indexer_id is None: return False - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return False + indexer = showObj.indexer + cacheDB = db.DBConnection('cache.db') - rows = cacheDB.select("SELECT last_refreshed FROM xem_refresh WHERE indexer_id = ?", [indexer_id]) + rows = cacheDB.select("SELECT last_refreshed FROM xem_refresh WHERE indexer = ? and indexer_id = ?", [indexer, indexer_id]) if rows: return time.time() > (int(rows[0]['last_refreshed']) + MAX_XEM_AGE_SECS) else: @@ -225,41 +236,58 @@ def _xem_refresh(indexer_id): """ if indexer_id is None: return - + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return + indexer = showObj.indexer + try: - logger.log(u'Looking up XEM scene mapping for show %s' % (indexer_id,), logger.DEBUG) + logger.log(u'Looking up XEM scene mapping for show %s on %s' % (indexer_id, indexer,), logger.DEBUG) #data = getURL('http://thexem.de/map/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)) - data = requests.get('http://thexem.de/map/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)).json() - # http://thexem.de/map/all?id=1640 91&origin=tvdb&destination=scene + data = None + if 'Tvdb' in indexer: + data = requests.get('http://thexem.de/map/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)).json() + elif 'TVRage' in indexer: + data = requests.get('http://thexem.de/map/all?id=%s&origin=rage&destination=scene' % (indexer_id,)).json() + if data is None or data == '': - logger.log(u'No XEN data for show "%s", trying TVTumbler' % (indexer_id,), logger.MESSAGE) - #data = getURL('http://show-api.tvtumbler.com/api/thexem/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)) - data = requests.get('http://show-api.tvtumbler.com/api/thexem/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)).json() + logger.log(u'No XEN data for show "%s on %s", trying TVTumbler' % (indexer_id, indexer,), logger.MESSAGE) + if 'Tvdb' in indexer: + data = requests.get('http://show-api.tvtumbler.com/api/thexem/all?id=%s&origin=tvdb&destination=scene' % (indexer_id,)).json() + elif 'TVRage' in indexer: + data = requests.get('http://show-api.tvtumbler.com/api/thexem/all?id=%s&origin=rage&destination=scene' % (indexer_id,)).json() + if data is None or data == '': - logger.log(u'TVTumbler also failed for show "%s". giving up.' % (indexer_id,), logger.MESSAGE) + logger.log(u'TVTumbler also failed for show "%s on %s". giving up.' % (indexer_id, indexer,), logger.MESSAGE) return None + result = data if result: - _check_for_schema() cacheDB = db.DBConnection('cache.db') - cacheDB.action("INSERT OR REPLACE INTO xem_refresh (indexer_id, last_refreshed) VALUES (?,?)", [indexer_id, time.time()]) + cacheDB.action("INSERT OR REPLACE INTO xem_refresh (indexer, indexer_id, last_refreshed) VALUES (?,?,?)", [indexer, indexer_id, time.time()]) if 'success' in result['result']: - cacheDB.action("DELETE FROM xem_numbering where indexer_id = ?", [indexer_id]) + cacheDB.action("DELETE FROM xem_numbering where indexer = ? and indexer_id = ?", [indexer, indexer_id]) for entry in result['data']: if 'scene' in entry: - cacheDB.action("INSERT INTO xem_numbering (indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?)", - [indexer_id, entry['tvdb']['season'], entry['tvdb']['episode'], entry['scene']['season'], entry['scene']['episode'] ]) + if 'Tvdb' in indexer: + cacheDB.action("INSERT INTO xem_numbering (indexer, indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?,?)", + [indexer, indexer_id, entry['tvdb']['season'], entry['tvdb']['episode'], entry['scene']['season'], entry['scene']['episode'] ]) + elif 'TVRage' in indexer: + cacheDB.action("INSERT INTO xem_numbering (indexer, indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?,?)", + [indexer, indexer_id, entry['rage']['season'], entry['rage']['episode'], entry['scene']['season'], entry['scene']['episode'] ]) if 'scene_2' in entry: # for doubles - cacheDB.action("INSERT INTO xem_numbering (indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?)", - [indexer_id, entry['tvdb']['season'], entry['tvdb']['episode'], entry['scene_2']['season'], entry['scene_2']['episode'] ]) - - #logger.log(u'Found XEM scene data for show %s' % (indexer_id), logger.MESSAGE) + if 'Tvdb' in indexer: + cacheDB.action("INSERT INTO xem_numbering (indexer, indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?,?)", + [indexer, indexer_id, entry['tvdb']['season'], entry['tvdb']['episode'], entry['scene_2']['season'], entry['scene_2']['episode'] ]) + elif 'TVRage' in indexer: + cacheDB.action("INSERT INTO xem_numbering (indexer, indexer_id, season, episode, scene_season, scene_episode) VALUES (?,?,?,?,?,?)", + [indexer, indexer_id, entry['rage']['season'], entry['rage']['episode'], entry['scene_2']['season'], entry['scene_2']['episode'] ]) else: - logger.log(u'Failed to get XEM scene data for show %s because "%s"' % (indexer_id, result['message']), logger.MESSAGE) + logger.log(u'Failed to get XEM scene data for show %s from %s because "%s"' % (indexer_id, indexer, result['message']), logger.MESSAGE) else: - logger.log(u"Empty lookup result - no XEM data for show %s" % (indexer_id,), logger.MESSAGE) + logger.log(u"Empty lookup result - no XEM data for show %s on %s" % (indexer_id, indexer,), logger.MESSAGE) except Exception, e: - logger.log(u"Exception while refreshing XEM data for show " + str(indexer_id) + ": " + ex(e), logger.WARNING) + logger.log(u"Exception while refreshing XEM data for show " + str(indexer_id) + " on " + indexer + ": " + ex(e), logger.WARNING) logger.log(traceback.format_exc(), logger.DEBUG) return None @@ -271,15 +299,18 @@ def get_xem_numbering_for_show(indexer_id): """ if indexer_id is None: return {} - - _check_for_schema() + + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return {} + indexer = showObj.indexer + if _xem_refresh_needed(indexer_id): _xem_refresh(indexer_id) cacheDB = db.DBConnection('cache.db') rows = cacheDB.select('''SELECT season, episode, scene_season, scene_episode - FROM xem_numbering WHERE indexer_id = ? - ORDER BY season, episode''', [indexer_id]) + FROM xem_numbering WHERE indexer = ? and indexer_id = ? + ORDER BY season, episode''', [indexer, indexer_id]) result = {} for row in rows: result[(int(row['season']), int(row['episode']))] = (int(row['scene_season']), int(row['scene_episode'])) @@ -295,15 +326,18 @@ def get_xem_numbering_for_season(indexer_id, season): if indexer_id is None or season is None: return {} - _check_for_schema() + showObj = helpers.findCertainShow(sickbeard.showList, indexer_id) + if showObj is None: return {} + indexer = showObj.indexer + if _xem_refresh_needed(indexer_id): _xem_refresh(indexer_id) cacheDB = db.DBConnection('cache.db') rows = cacheDB.select('''SELECT season, scene_season - FROM xem_numbering WHERE indexer_id = ? AND season = ? - ORDER BY season''', [indexer_id, season]) + FROM xem_numbering WHERE indexer = ? and indexer_id = ? AND season = ? + ORDER BY season''', [indexer, indexer_id, season]) result = {} if rows: for row in rows: diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 0bf54188..001c108c 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -3340,6 +3340,12 @@ class Home: if isinstance(ep_obj, str): return json.dumps({'result': 'failure'}) + # figure out what segment the episode is in and remember it so we can backlog it + if ep_obj.show.air_by_date: + segment = str(ep_obj.airdate)[:7] + else: + segment = ep_obj.season + # make a queue item for it and put it on the queue ep_queue_item = search_queue.FailedQueueItem(ep_obj.show, {ep_obj.season: ep_obj.episode}) sickbeard.searchQueueScheduler.action.add_item(ep_queue_item) # @UndefinedVariable @@ -3364,6 +3370,27 @@ class Home: return json.dumps({'result': 'failure'}) +# try: +# +# +# ui.notifications.message('Info', pp.log) +# except exceptions.FailedHistoryNotFoundException: +# ui.notifications.error('Not Found Error', 'Couldn\'t find release in history. (Has it been over 30 days?)\n' +# 'Can\'t mark it as bad.') +# return json.dumps({'result': 'failure'}) +# except exceptions.FailedHistoryMultiSnatchException: +# ui.notifications.error('Multi-Snatch Error', 'The same episode was snatched again before the first one was done.\n' +# 'Please cancel any downloads of this episode and then set it back to wanted.\n Can\'t continue.') +# return json.dumps({'result': 'failure'}) +# except exceptions.FailedProcessingFailed: +# ui.notifications.error('Processing Failed', pp.log) +# return json.dumps({'result': 'failure'}) +# except Exception as e: +# ui.notifications.error('Unknown Error', 'Unknown exception: ' + str(e)) +# return json.dumps({'result': 'failure'}) +# +# return json.dumps({'result': 'success'}) + class UI: @cherrypy.expose