From 2354c742475c69f50403092a549eb44688121c92 Mon Sep 17 00:00:00 2001 From: echel0n Date: Tue, 2 Dec 2014 22:13:28 -0800 Subject: [PATCH] Updated IMDB libs. Minor code improvements made to IndexerAPI modules. New subtitle config feature which allows you to control if subtitles get there language codes appened to there filenames or not. Added El Rey Network image. Added code for generating imdbID's for shows missing there imdbID's such as shows from TVRage indexer.. --- gui/slick/images/network/el rey network.png | Bin 0 -> 6649 bytes .../interfaces/default/config_subtitles.tmpl | 7 ++ lib/imdb/__init__.py | 2 +- lib/imdb/imdbpy.cfg | 78 ------------------ lib/imdb/utils.py | 13 +-- lib/tvdb_api/tvdb_api.py | 6 +- lib/tvrage_api/tvrage_api.py | 13 ++- sickbeard/__init__.py | 5 +- sickbeard/traktChecker.py | 1 + sickbeard/tv.py | 29 +++---- sickbeard/webserve.py | 5 +- 11 files changed, 49 insertions(+), 110 deletions(-) create mode 100644 gui/slick/images/network/el rey network.png delete mode 100644 lib/imdb/imdbpy.cfg diff --git a/gui/slick/images/network/el rey network.png b/gui/slick/images/network/el rey network.png new file mode 100644 index 0000000000000000000000000000000000000000..d256f84832b689f2fadfc84b0ec8f3d2ed784c74 GIT binary patch literal 6649 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 DDZK$8 literal 0 HcmV?d00001 diff --git a/gui/slick/interfaces/default/config_subtitles.tmpl b/gui/slick/interfaces/default/config_subtitles.tmpl index 420d3e54..90d18bc3 100644 --- a/gui/slick/interfaces/default/config_subtitles.tmpl +++ b/gui/slick/interfaces/default/config_subtitles.tmpl @@ -106,6 +106,13 @@ Log downloaded Subtitle on History page? +
+ + +


diff --git a/lib/imdb/__init__.py b/lib/imdb/__init__.py index 0cdc9650..5114dd22 100644 --- a/lib/imdb/__init__.py +++ b/lib/imdb/__init__.py @@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA __all__ = ['IMDb', 'IMDbError', 'Movie', 'Person', 'Character', 'Company', 'available_access_systems'] -__version__ = VERSION = '5.0' +__version__ = VERSION = '5.1dev20141116' # Import compatibility module (importing it is enough). import _compat diff --git a/lib/imdb/imdbpy.cfg b/lib/imdb/imdbpy.cfg deleted file mode 100644 index 68b30538..00000000 --- a/lib/imdb/imdbpy.cfg +++ /dev/null @@ -1,78 +0,0 @@ -# -# IMDbPY configuration file. -# -# This file can be placed in many locations; the first file found is -# used, _ignoring_ the content of the others. -# -# Place it in one of the following directories (in order of precedence): -# -# - imdbpy.cfg in the current directory. -# - .imdbpy.cfg in the current directory. -# - imdbpy.cfg in the user's home directory. -# - .imdbpy.cfg in the user's home directory. -# - /etc/imdbpy.cfg Unix-like systems only. -# - /etc/conf.d/imdbpy.cfg Unix-like systems only. -# - sys.prefix + imdbpy.cfg for non-Unix (e.g.: C:\Python\etc\imdbpy.cfg) -# -# If this file is not found, 'http' access system is used by default. -# -# Lines starting with #, ; and // are considered comments and ignored. -# -# Some special values are replaced with Python equivalents (case insensitive): -# -# 0, off, false, no -> False -# 1, on, true, yes -> True -# none -> None -# -# Other options, like defaultModFunct, must be passed by the code. -# - -[imdbpy] -## Default. -accessSystem = httpThin - -## Optional (options common to every data access system): -# Activate adult searches (on, by default). -#adultSearch = on -# Number of results for searches (20 by default). -#results = 20 -# Re-raise all caught exceptions (off, by default). -#reraiseExceptions = off - -## Optional (options common to http and mobile data access systems): -# Proxy used to access the network. If it requires authentication, -# try with: http://username:password@server_address:port/ -#proxy = http://localhost:8080/ -# Cookies of the IMDb.com account -#cookie_id = string_representing_the_cookie_id -#cookie_uu = string_representing_the_cookie_uu -## Timeout for the connection to IMDb (30 seconds, by default). -#timeout = 30 -# Base url to access pages on the IMDb.com web server. -#imdbURL_base = http://akas.imdb.com/ - -## Parameters for the 'http' data access system. -# Parser to use; can be a single value or a list of value separated by -# a comma, to express order preference. Valid values: "lxml", "beautifulsoup" -#useModule = lxml,beautifulsoup - -## Parameters for the 'mobile' data access system. -#accessSystem = mobile - -## Parameters for the 'sql' data access system. -#accessSystem = sql -#uri = mysql://user:password@localhost/imdb -# ORM to use; can be a single value or a list of value separated by -# a comma, to express order preference. Valid values: "sqlobject", "sqlalchemy" -#useORM = sqlobject,sqlalchemy - -## Set the threshold for logging messages. -# Can be one of "debug", "info", "warning", "error", "critical" (default: -# "warning"). -loggingLevel = debug - -## Path to a configuration file for the logging facility; -# see: http://docs.python.org/library/logging.html#configuring-logging -#loggingConfig = ~/.imdbpy-logger.cfg - - diff --git a/lib/imdb/utils.py b/lib/imdb/utils.py index f468efd4..c43cb627 100644 --- a/lib/imdb/utils.py +++ b/lib/imdb/utils.py @@ -639,11 +639,14 @@ def analyze_company_name(name, stripNotes=False): o_name = name name = name.strip() country = None - if name.endswith(']'): - idx = name.rfind('[') - if idx != -1: - country = name[idx:] - name = name[:idx].rstrip() + if name.startswith('['): + name = re.sub('[!@#$\(\)\[\]]', '', name) + else: + if name.endswith(']'): + idx = name.rfind('[') + if idx != -1: + country = name[idx:] + name = name[:idx].rstrip() if not name: raise IMDbParserError('invalid name: "%s"' % o_name) result = {'name': name} diff --git a/lib/tvdb_api/tvdb_api.py b/lib/tvdb_api/tvdb_api.py index 5c94c871..115c31ec 100644 --- a/lib/tvdb_api/tvdb_api.py +++ b/lib/tvdb_api/tvdb_api.py @@ -571,9 +571,9 @@ class Tvdb: "https": self.config['proxy'], } - resp = session.get(url, cache_auto=True, params=params) + resp = session.get(url.strip(), cache_auto=True, params=params) else: - resp = requests.get(url, params=params) + resp = requests.get(url.strip(), params=params) resp.raise_for_status() except requests.exceptions.HTTPError, e: @@ -619,7 +619,7 @@ class Tvdb: raise tvdb_error("Bad zip file received from thetvdb.com, could not read it") else: try: - return xmltodict.parse(resp.content.strip(), postprocessor=process) + return xmltodict.parse(resp.text.rstrip("\r"), postprocessor=process) except: return dict([(u'data', None)]) diff --git a/lib/tvrage_api/tvrage_api.py b/lib/tvrage_api/tvrage_api.py index f5aff5ab..832b82ae 100644 --- a/lib/tvrage_api/tvrage_api.py +++ b/lib/tvrage_api/tvrage_api.py @@ -392,7 +392,7 @@ class TVRage: return os.path.join(tempfile.gettempdir(), "tvrage_api-%s" % (uid)) - #@retry(tvrage_error) + @retry(tvrage_error) def _loadUrl(self, url, params=None): try: log().debug("Retrieving URL %s" % url) @@ -471,11 +471,10 @@ class TVRage: return (key, value) - if resp.ok: - try: - return xmltodict.parse(resp.content.strip(), postprocessor=remap_keys) - except: - return dict([(u'data', None)]) + try: + return xmltodict.parse(resp.text.rstrip("\r"), postprocessor=remap_keys) + except: + return dict([(u'data', None)]) def _getetsrc(self, url, params=None): """Loads a URL using caching, returns an ElementTree of the source @@ -524,7 +523,7 @@ class TVRage: - Trailing whitespace """ - if not isinstance(data, dict or list): + if isinstance(data, basestring): data = data.replace(u"&", u"&") data = data.strip() diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index fc3fc877..75bbbd4c 100755 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -451,6 +451,7 @@ SUBTITLES_SERVICES_LIST = [] SUBTITLES_SERVICES_ENABLED = [] SUBTITLES_HISTORY = False SUBTITLES_FINDER_FREQUENCY = 1 +SUBTITLES_MULTI = False USE_FAILED_DOWNLOADS = False DELETE_FAILED = False @@ -515,7 +516,7 @@ def initialize(consoleLogging=True): GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, COMING_EPS_LAYOUT, COMING_EPS_SORT, COMING_EPS_DISPLAY_PAUSED, COMING_EPS_MISSED_RANGE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \ POSTER_SORTBY, POSTER_SORTDIR, \ METADATA_WDTV, METADATA_TIVO, METADATA_MEDE8ER, IGNORE_WORDS, REQUIRE_WORDS, CALENDAR_UNPROTECTED, CREATE_MISSING_SHOW_DIRS, \ - ADD_SHOWS_WO_DIR, USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, subtitlesFinderScheduler, \ + ADD_SHOWS_WO_DIR, USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, SUBTITLES_MULTI, subtitlesFinderScheduler, \ USE_FAILED_DOWNLOADS, DELETE_FAILED, ANON_REDIRECT, LOCALHOST_IP, TMDB_API_KEY, DEBUG, PROXY_SETTING, PROXY_INDEXERS, \ AUTOPOSTPROCESSER_FREQUENCY, DEFAULT_AUTOPOSTPROCESSER_FREQUENCY, MIN_AUTOPOSTPROCESSER_FREQUENCY, \ ANIME_DEFAULT, NAMING_ANIME, ANIMESUPPORT, USE_ANIDB, ANIDB_USERNAME, ANIDB_PASSWORD, ANIDB_USE_MYLIST, \ @@ -934,6 +935,7 @@ def initialize(consoleLogging=True): SUBTITLES_DEFAULT = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_default', 0)) SUBTITLES_HISTORY = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_history', 0)) SUBTITLES_FINDER_FREQUENCY = check_setting_int(CFG, 'Subtitles', 'subtitles_finder_frequency', 1) + SUBTITLES_MULTI = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_multi', 1)) USE_FAILED_DOWNLOADS = bool(check_setting_int(CFG, 'FailedDownloads', 'use_failed_downloads', 0)) DELETE_FAILED = bool(check_setting_int(CFG, 'FailedDownloads', 'delete_failed', 0)) @@ -1815,6 +1817,7 @@ def save_config(): new_config['Subtitles']['subtitles_default'] = int(SUBTITLES_DEFAULT) new_config['Subtitles']['subtitles_history'] = int(SUBTITLES_HISTORY) new_config['Subtitles']['subtitles_finder_frequency'] = int(SUBTITLES_FINDER_FREQUENCY) + new_config['Subtitles']['subtitles_multi'] = int(SUBTITLES_MULTI) new_config['FailedDownloads'] = {} new_config['FailedDownloads']['use_failed_downloads'] = int(USE_FAILED_DOWNLOADS) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 8ef1e0a5..7ca6f14d 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -119,6 +119,7 @@ class TraktChecker(): self.trakt_api.traktRequest("show/library/%APIKEY%", data) except (traktException, traktAuthException, traktServerBusy) as e: logger.log(u"Could not connect to Trakt service: %s" % e.message, logger.WARNING) + return def updateShows(self): logger.log(u"Starting trakt show watchlist check", logger.DEBUG) diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 27431ec1..c64adfce 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -910,10 +910,13 @@ class TVShow(object): 'last_update': '' } + i = imdb.IMDb() + if not self.imdbid: + self.imdbid = i.title2imdbID(self.name, kind='tv series') + if self.imdbid: logger.log(str(self.indexerid) + u": Loading show info from IMDb") - i = imdb.IMDb() imdbTv = i.get_movie(str(re.sub("[^0-9]", "", self.imdbid))) for key in filter(lambda x: x.replace('_', ' ') in imdbTv.keys(), imdb_info.keys()): @@ -1110,30 +1113,28 @@ class TVShow(object): myDB.mass_action(sql_l) def downloadSubtitles(self, force=False): - # TODO: Add support for force option if not ek.ek(os.path.isdir, self._location): logger.log(str(self.indexerid) + ": Show dir doesn't exist, can't download subtitles", logger.DEBUG) return + logger.log(str(self.indexerid) + ": Downloading subtitles", logger.DEBUG) try: - myDB = db.DBConnection() - episodes = myDB.select( - "SELECT location FROM tv_episodes WHERE showid = ? AND location NOT LIKE '' ORDER BY season DESC, episode DESC", - [self.indexerid]) + episodes = self.getAllEpisodes(has_location=True) + if not len(episodes) > 0: + logger.log(str(self.indexerid) + ": No episodes to download subtitles for " + self.name, logger.DEBUG) + return - for episodeLoc in episodes: - episode = self.makeEpFromFile(episodeLoc['location']) - subtitles = episode.downloadSubtitles(force=force) - except Exception as e: + for episode in episodes: + episode.downloadSubtitles(force=force) + + except Exception: logger.log("Error occurred when downloading subtitles: " + traceback.format_exc(), logger.DEBUG) - return - def saveToDB(self, forceSave=False): if not self.dirty and not forceSave: - logger.log(str(self.indexerid) + u": Not saving show to db - record is not dirty", logger.DEBUG) + logger.log(str(self.indexerid) + ": Not saving show to db - record is not dirty", logger.DEBUG) return logger.log(str(self.indexerid) + u": Saving show info to database", logger.DEBUG) @@ -1405,7 +1406,7 @@ class TVEpisode(object): need_languages = set(sickbeard.SUBTITLES_LANGUAGES) - set(self.subtitles) subtitles = subliminal.download_subtitles([self.location], languages=need_languages, services=sickbeard.subtitles.getEnabledServiceList(), force=force, - multi=True, cache_dir=sickbeard.CACHE_DIR) + multi=sickbeard.SUBTITLES_MULTI, cache_dir=sickbeard.CACHE_DIR) if sickbeard.SUBTITLES_DIR: for video in subtitles: diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index c5740025..a89b80e4 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2608,7 +2608,9 @@ class ConfigSubtitles(MainHandler): def saveSubtitles(self, use_subtitles=None, subtitles_plugins=None, subtitles_languages=None, subtitles_dir=None, - service_order=None, subtitles_history=None, subtitles_finder_frequency=None): + service_order=None, subtitles_history=None, subtitles_finder_frequency=None, + subtitles_multi=None): + results = [] if subtitles_finder_frequency == '' or subtitles_finder_frequency is None: @@ -2634,6 +2636,7 @@ class ConfigSubtitles(MainHandler): sickbeard.SUBTITLES_DIR = subtitles_dir sickbeard.SUBTITLES_HISTORY = config.checkbox_to_value(subtitles_history) sickbeard.SUBTITLES_FINDER_FREQUENCY = config.to_int(subtitles_finder_frequency, default=1) + sickbeard.SUBTITLES_MULTI = config.checkbox_to_value(subtitles_multi) # Subtitles services services_str_list = service_order.split()