From 2354c742475c69f50403092a549eb44688121c92 Mon Sep 17 00:00:00 2001
From: echel0n <sickrage.tv@gmail.com>
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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

literal 0
HcmV?d00001

diff --git a/gui/slick/interfaces/default/config_subtitles.tmpl b/gui/slick/interfaces/default/config_subtitles.tmpl
index 420d3e54a..90d18bc38 100644
--- a/gui/slick/interfaces/default/config_subtitles.tmpl
+++ b/gui/slick/interfaces/default/config_subtitles.tmpl
@@ -106,6 +106,13 @@
 		                                <span class="component-desc">Log downloaded Subtitle on History page?</span>
 		                            </label>
 		                        </div>                        		
+		                        <div class="field-pair">
+		                            <input type="checkbox" name="subtitles_multi" id="subtitles_multi" #if $sickbeard.SUBTITLES_MULTI then " checked=\"checked\"" else ""#/>
+		                            <label class="clearfix" for="subtitles_multi">
+		                                <span class="component-title">Subtitles Multi-Language</span>
+		                                <span class="component-desc">Append language codes to subtitle filenames?</span>
+		                            </label>
+		                        </div>
 	                    <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/>
                         </div>
                     </fieldset>
diff --git a/lib/imdb/__init__.py b/lib/imdb/__init__.py
index 0cdc9650f..5114dd22d 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 68b305386..000000000
--- 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 f468efd4d..c43cb627a 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 5c94c8712..115c31ec7 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 f5aff5ab8..832b82ae2 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"&amp;", u"&")
             data = data.strip()
 
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index fc3fc8773..75bbbd4c7 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 8ef1e0a57..7ca6f14d9 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 27431ec1b..c64adfce4 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:
-            logger.log("Error occurred when downloading subtitles: " + traceback.format_exc(), logger.DEBUG)
-            return
+            for episode in episodes:
+                episode.downloadSubtitles(force=force)
 
+        except Exception:
+            logger.log("Error occurred when downloading subtitles: " + traceback.format_exc(), logger.DEBUG)
 
     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 c5740025a..a89b80e44 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()
-- 
GitLab