From 87e56ab5a7e409eb213ee8280bce97910f4a6d3c Mon Sep 17 00:00:00 2001
From: Guillaume Serre <guillaume.serre@gmail.com>
Date: Sat, 23 Feb 2013 17:13:37 +0100
Subject: [PATCH] Adding additional show settings : "Desired Audio Language"
 (only en and fr for now) and "Custom Search Names", supported fully by
 BinNewz and T411, other providers need some work

---
 data/interfaces/default/config_providers.tmpl | 23 ++-------------
 data/interfaces/default/editShow.tmpl         | 18 ++++++++++--
 sickbeard/__init__.py                         | 10 ++-----
 sickbeard/common.py                           |  8 ++++++
 sickbeard/databases/mainDB.py                 | 28 ++++++++++++++++---
 sickbeard/providers/binnewz.py                | 25 +++++++++--------
 sickbeard/providers/t411.py                   | 27 +++++++++---------
 sickbeard/show_name_helpers.py                |  4 +++
 sickbeard/tv.py                               | 17 ++++++++++-
 sickbeard/webserve.py                         |  4 ++-
 10 files changed, 102 insertions(+), 62 deletions(-)

diff --git a/data/interfaces/default/config_providers.tmpl b/data/interfaces/default/config_providers.tmpl
index 7ff97f632..439913e3e 100755
--- a/data/interfaces/default/config_providers.tmpl
+++ b/data/interfaces/default/config_providers.tmpl
@@ -143,16 +143,9 @@
                     </div><!-- /nzbs_r_usDiv //-->
 
                     <div class="providerDiv" id="binnewzDiv">
-                        <div class="field-pair">
-                            <label class="clearfix">
-                                <span class="component-title">Language</span>
-                                <select class="component-desc" name="binnewz_language" value="$sickbeard.BINNEWZ_LANGUAGE">
-                                	<option value="vostfr" #if $sickbeard.BINNEWZ_LANGUAGE == "vostfr" then "selected=\"true\"" else ""#>VOSTFR</option>
-                                	<option value="vf" #if $sickbeard.BINNEWZ_LANGUAGE == "vf" then "selected=\"true\"" else ""#>VF</option>
-                                	<option value="vo" #if $sickbeard.BINNEWZ_LANGUAGE == "vo" then "selected=\"true\"" else ""#>VO</option>
-                                </select>
-                            </label>
-                        </div>
+						<p>
+							Nothing to set up for this provider
+						</p>
                     </div><!-- /binnewzDiv //-->
 
                     <div class="providerDiv" id="tvtorrentsDiv">
@@ -183,16 +176,6 @@
                                 <input class="component-desc" type="text" name="t411_password" value="$sickbeard.T411_PASSWORD" size="40" />
                             </label>
                         </div>
-                        <div class="field-pair">
-							<label class="clearfix">
-                                <span class="component-title">T411 Language</span>
-                                <select class="component-desc" name="t411_language" value="$sickbeard.T411_LANGUAGE">
-                                	<option value="vostfr" #if $sickbeard.T411_LANGUAGE == "vostfr" then "selected=\"true\"" else ""#>VOSTFR</option>
-                                	<option value="vf" #if $sickbeard.T411_LANGUAGE == "vf" then "selected=\"true\"" else ""#>VF</option>
-                                	<option value="vo" #if $sickbeard.T411_LANGUAGE == "vo" then "selected=\"true\"" else ""#>VO</option>
-                                </select>
-                            </label>
-                        </div>
                     </div><!-- /t411Div //-->
 
                     <div class="providerDiv" id="btnDiv">
diff --git a/data/interfaces/default/editShow.tmpl b/data/interfaces/default/editShow.tmpl
index a0ce6dd7e..be816155f 100644
--- a/data/interfaces/default/editShow.tmpl
+++ b/data/interfaces/default/editShow.tmpl
@@ -59,12 +59,24 @@ Quality:
 #set global $bestQualities = $qualities[1]
 #include $os.path.join($sickbeard.PROG_DIR, "data/interfaces/default/inc_qualityChooser.tmpl")
 <br />
-<br />
-Language: <select name="tvdbLang" id="tvdbLangSelect"></select><br />
+Metadata Language: <select name="tvdbLang" id="tvdbLangSelect"></select><br />
 Note: This will only affect the language of the retrieved metadata file contents and episode filenames.<br />
-This <b>DOES NOT</b> allow Sick Beard to download non-english TV episodes!<br />
 <br />
 <br />
+Desired Audio language: <select name="audio_lang" id="showLangSelect">
+#for $k,$v in $common.showLanguages.iteritems():
+	<option value="$k"
+	#if $show.audio_lang == $k:
+		selected
+	#end if
+	>$v</option>
+#end for
+</select>
+<br />
+<br />
+Custom Search Names: <input type="text" name="custom_search_names" id="custom_search_names" value="$show.custom_search_names" size="50" /><br />
+<strong>Note:</strong> Custom names used to find show. Define some custom names if show can't be found. Custom names should be separated by ",". Keep empty to use default show name (based on metadata language)<br />
+<br />
 Flatten files (no folders): <input type="checkbox" name="flatten_folders" #if $show.flatten_folders == 1 and not $sickbeard.NAMING_FORCE_FOLDERS then "checked=\"checked\"" else ""# #if $sickbeard.NAMING_FORCE_FOLDERS then "disabled=\"disabled\"" else ""#/><br /><br />
 Paused: <input type="checkbox" name="paused" #if $show.paused == 1 then "checked=\"checked\"" else ""# /><br /><br />
 
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index bcb413b61..77d761fef 100755
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -182,12 +182,10 @@ NZBSRUS_UID = None
 NZBSRUS_HASH = None
 
 BINNEWZ = False
-BINNEWZ_LANGUAGE = "vostfr"
 
 T411 = False
 T411_USERNAME = None
 T411_PASSWORD = None
-T411_LANGUAGE = "vostfr"
 
 NZBMATRIX = False
 NZBMATRIX_USERNAME = None
@@ -326,8 +324,8 @@ def initialize(consoleLogging=True):
                 PLEX_SERVER_HOST, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, \
                 showUpdateScheduler, __INITIALIZED__, LAUNCH_BROWSER, showList, loadingShowList, \
                 NZBS, NZBS_UID, NZBS_HASH, EZRSS, TVTORRENTS, TVTORRENTS_DIGEST, TVTORRENTS_HASH, BTN, BTN_API_KEY, TORRENT_DIR, USENET_RETENTION, SOCKET_TIMEOUT, \
-				BINNEWZ, BINNEWZ_LANGUAGE, \
-                T411, T411_LANGUAGE, T411_USERNAME, T411_PASSWORD, \
+				BINNEWZ, \
+                T411, T411_USERNAME, T411_PASSWORD, \
                 SEARCH_FREQUENCY, DEFAULT_SEARCH_FREQUENCY, BACKLOG_SEARCH_FREQUENCY, \
                 QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, STATUS_DEFAULT, \
                 GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, \
@@ -561,11 +559,9 @@ def initialize(consoleLogging=True):
 
         CheckSection(CFG, 'BinNewz')
         BINNEWZ = bool(check_setting_int(CFG, 'BinNewz', 'binnewz', 0))
-        BINNEWZ_LANGUAGE = check_setting_str(CFG, 'BinNewz', 'language', 'vo')
 
         CheckSection(CFG, 'T411')
         T411 = bool(check_setting_int(CFG, 'T411', 't411', 0))
-        T411_LANGUAGE = check_setting_str(CFG, 'T411', 'language', 'vo')
         T411_USERNAME = check_setting_str(CFG, 'T411', 'username', '')
         T411_PASSWORD = check_setting_str(CFG, 'T411', 'password', '')
 
@@ -1049,13 +1045,11 @@ def save_config():
 
     new_config['BinNewz'] = {}
     new_config['BinNewz']['binnewz'] = int(BINNEWZ)
-    new_config['BinNewz']['language'] = BINNEWZ_LANGUAGE
 
     new_config['T411'] = {}
     new_config['T411']['t411'] = int(T411)
     new_config['T411']['username'] = T411_USERNAME
     new_config['T411']['password'] = T411_PASSWORD
-    new_config['T411']['language'] = T411_LANGUAGE
 
     new_config['Womble'] = {}
     new_config['Womble']['womble'] = int(WOMBLE)
diff --git a/sickbeard/common.py b/sickbeard/common.py
index 94819b477..3da199250 100644
--- a/sickbeard/common.py
+++ b/sickbeard/common.py
@@ -259,3 +259,11 @@ countryList = {'Australia': 'AU',
                'USA': 'US'
                }
 
+showLanguages = {'en':'english',
+                 'fr':'french',
+				 '':'unknown'
+                 }
+
+languageShortCode = {'english':'en',
+                     'french':'fr'
+                     }
\ No newline at end of file
diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py
index 12d25ba33..2ebf99c2c 100644
--- a/sickbeard/databases/mainDB.py
+++ b/sickbeard/databases/mainDB.py
@@ -339,7 +339,14 @@ class AddLang (FixSabHostURL):
     def execute(self):
         self.addColumn("tv_shows", "lang", "TEXT", "en")
 
-class PopulateRootDirs (AddLang):
+class AddCustomSearchNames (AddLang):
+    def test(self):
+        return self.hasColumn("tv_shows", "custom_search_names")
+
+    def execute(self):
+        self.addColumn("tv_shows", "custom_search_names", "TEXT", "")
+
+class PopulateRootDirs (AddCustomSearchNames):
     def test(self):
         return self.checkDBVersion() >= 7
     
@@ -413,8 +420,21 @@ class FixAirByDateSetting(SetNzbTorrentSettings):
                 self.connection.action("UPDATE tv_shows SET air_by_date = ? WHERE tvdb_id = ?", [1, cur_show["tvdb_id"]])
         
         self.incDBVersion()
+        
+class AddAudioLang (FixAirByDateSetting):
+    def test(self):
+        return self.hasColumn("tv_shows", "audio_lang")
+
+    def execute(self):
+        self.addColumn("tv_shows", "audio_lang", "TEXT", "en")
+        
+class AddShowLangsToEpisode (AddAudioLang):
+    def test(self):
+        return self.hasColumn("tv_episodes", "audio_langs")
+    def execute(self):
+        self.addColumn("tv_episodes", "audio_langs", "TEXT", "")
 
-class AddSizeAndSceneNameFields(FixAirByDateSetting):
+class AddSizeAndSceneNameFields(AddShowLangsToEpisode):
 
     def test(self):
         return self.checkDBVersion() >= 10
@@ -525,8 +545,8 @@ class RenameSeasonFolders(AddSizeAndSceneNameFields):
         
         # rename the column
         self.connection.action("ALTER TABLE tv_shows RENAME TO tmp_tv_shows")
-        self.connection.action("CREATE TABLE tv_shows (show_id INTEGER PRIMARY KEY, location TEXT, show_name TEXT, tvdb_id NUMERIC, network TEXT, genre TEXT, runtime NUMERIC, quality NUMERIC, airs TEXT, status TEXT, flatten_folders NUMERIC, paused NUMERIC, startyear NUMERIC, tvr_id NUMERIC, tvr_name TEXT, air_by_date NUMERIC, lang TEXT)")
-        sql = "INSERT INTO tv_shows(show_id, location, show_name, tvdb_id, network, genre, runtime, quality, airs, status, flatten_folders, paused, startyear, tvr_id, tvr_name, air_by_date, lang) SELECT show_id, location, show_name, tvdb_id, network, genre, runtime, quality, airs, status, seasonfolders, paused, startyear, tvr_id, tvr_name, air_by_date, lang FROM tmp_tv_shows"
+        self.connection.action("CREATE TABLE tv_shows (show_id INTEGER PRIMARY KEY, location TEXT, show_name TEXT, tvdb_id NUMERIC, network TEXT, genre TEXT, runtime NUMERIC, quality NUMERIC, airs TEXT, status TEXT, flatten_folders NUMERIC, paused NUMERIC, startyear NUMERIC, tvr_id NUMERIC, tvr_name TEXT, air_by_date NUMERIC, lang TEXT, custom_search_names TEXT, audio_lang TEXT)")
+        sql = "INSERT INTO tv_shows(show_id, location, show_name, tvdb_id, network, genre, runtime, quality, airs, status, flatten_folders, paused, startyear, tvr_id, tvr_name, air_by_date, lang, custom_search_names, show_lang) SELECT show_id, location, show_name, tvdb_id, network, genre, runtime, quality, airs, status, seasonfolders, paused, startyear, tvr_id, tvr_name, air_by_date, lang, custom_search_names, audio_lang FROM tmp_tv_shows"
         self.connection.action(sql)
         
         # flip the values to be opposite of what they were before
diff --git a/sickbeard/providers/binnewz.py b/sickbeard/providers/binnewz.py
index 4f07efcd6..ab9fe73c3 100644
--- a/sickbeard/providers/binnewz.py
+++ b/sickbeard/providers/binnewz.py
@@ -28,6 +28,7 @@ import gzip
 import re
 import sickbeard
 import urllib
+import urllib2
 from sickbeard.common import Quality
 
 class BinNewzProvider(generic.NZBProvider):
@@ -53,10 +54,12 @@ class BinNewzProvider(generic.NZBProvider):
 
     def _get_episode_search_strings(self, ep_obj):
         strings = []
-        
-        strings.append("%s S%02dE%02d" % ( ep_obj.show.name, ep_obj.season, ep_obj.episode) )
-        strings.append("%s %dx%d" % ( ep_obj.show.name, ep_obj.season, ep_obj.episode ) )
-        
+
+        showNames = show_name_helpers.allPossibleShowNames(ep_obj.show)
+        for showName in showNames:
+            strings.append("%s S%02dE%02d" % ( showName, ep_obj.season, ep_obj.episode) )
+            strings.append("%s %dx%d" % ( showName, ep_obj.season, ep_obj.episode ) )
+
         return strings
     
     def _get_title_and_url(self, item):
@@ -64,7 +67,7 @@ class BinNewzProvider(generic.NZBProvider):
     
     def getQuality(self, item):
         return item.getQuality()
-    
+
     def doBinSearch(self, filename, minSize, newsgroup=None):
         
         binsearch_results = []
@@ -153,6 +156,10 @@ class BinNewzProvider(generic.NZBProvider):
                     encoder = encoderSpan.contents[0]
                 name = cells[2].text.strip()
                 language = cells[3].find("img").get("src")
+
+                if show.audio_lang == "fr":
+                    if not "_fr" in language:
+                        continue
                 
                 if "_stfr" in language:
                     language = "vostfr"
@@ -160,11 +167,7 @@ class BinNewzProvider(generic.NZBProvider):
                     language = "vf"
                 else:
                     language = "vo"
-    
-                if language != sickbeard.BINNEWZ_LANGUAGE:
-                    print "Skipping download, language found: %s wanted: %s" % (language, sickbeard.BINNEWZ_LANGUAGE)
-                    continue
-                
+               
                 # blacklist_groups = [ "alt.binaries.multimedia" ]
                 blacklist_groups = []                
                 
@@ -262,9 +265,9 @@ class BinNewzProvider(generic.NZBProvider):
                     print "Range detected"
                     
                 binsearch_results = self.doBinSearch( filename, minSize, newsgroup )
+                # binsearch_results = self.doNZBClub( filename, minSize, newsgroup )
                 
                 for binsearch_result in binsearch_results:
-                    print "adding result from %s, quality: %s, size: %8.2f MB" % (binsearch_result.url, qualityStr, binsearch_result.sizeInMegs)
                     results.append( BinNewzSearchResult( name, binsearch_result.nzbdata, binsearch_result.url, quality))
 
         return results
diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py
index eccce5b71..84cf3e716 100644
--- a/sickbeard/providers/t411.py
+++ b/sickbeard/providers/t411.py
@@ -17,15 +17,10 @@
 # You should have received a copy of the GNU General Public License
 # along with Sick Beard.  If not, see <http://www.gnu.org/licenses/>.
 
-from StringIO import StringIO
 from bs4 import BeautifulSoup
-from sickbeard import helpers, logger, classes, show_name_helpers
+from sickbeard import classes, show_name_helpers
 from sickbeard.common import Quality
-from sickbeard.exceptions import ex
-import datetime
 import generic
-import gzip
-import re
 import cookielib
 import sickbeard
 import urllib
@@ -49,13 +44,21 @@ class T411Provider(generic.TorrentProvider):
         
     def isEnabled(self):
         return sickbeard.T411
+    
+    def getSearchParams(self, searchString, audio_lang):
+        if audio_lang == "en":
+            return urllib.urlencode( {'search': searchString, 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } ) + "&term%5B17%5D%5B%5D=540&term%5B17%5D%5B%5D=721"
+        elif audio_lang == "fr":
+            return urllib.urlencode( {'search': searchString, 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } ) + "&term%5B17%5D%5B%5D=541&term%5B17%5D%5B%5D=542"
+        else:
+            return urllib.urlencode( {'search': searchString, 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } )
 
     def _get_season_search_strings(self, show, season):
 
         showNames = show_name_helpers.allPossibleShowNames(show)
         results = []
         for showName in showNames:
-            results.append( urllib.urlencode( {'search': showName + " S%02d" % season, 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } ) )
+            results.append( self.getSearchParams(showName + " S%02d" % season, show.audio_lang ))
         return results
 
     def _get_episode_search_strings(self, ep_obj):
@@ -63,8 +66,8 @@ class T411Provider(generic.TorrentProvider):
         showNames = show_name_helpers.allPossibleShowNames(ep_obj.show)
         results = []
         for showName in showNames:
-            results.append( urllib.urlencode( {'search': "%s S%02dE%02d" % ( showName, ep_obj.season, ep_obj.episode), 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } ) )
-            results.append( urllib.urlencode( {'search': "%s %dx%d" % ( showName, ep_obj.season, ep_obj.episode ), 'cat' : 210, 'submit' : 'Recherche', 'subcat': 433 } ) )
+            results.append( self.getSearchParams( "%s S%02dE%02d" % ( showName, ep_obj.season, ep_obj.episode), ep_obj.show.audio_lang ) )
+            results.append( self.getSearchParams( "%s %dx%d" % ( showName, ep_obj.season, ep_obj.episode ), ep_obj.show.audio_lang ) )
         return results
     
     def _get_title_and_url(self, item):
@@ -98,13 +101,9 @@ class T411Provider(generic.TorrentProvider):
                 link = row.find("a", title=True)
                 title = link['title']
                 
-                if sickbeard.T411_LANGUAGE == "vostfr":
-                    if not "vostfr" in title.lower():
-                        continue
-                
                 torrentPage = self.opener.open( link['href'] )
                 torrentSoup = BeautifulSoup( torrentPage )
-                
+               
                 downloadTorrentLink = torrentSoup.find("a", text=u"T�l�charger")
                 if downloadTorrentLink:
                     
diff --git a/sickbeard/show_name_helpers.py b/sickbeard/show_name_helpers.py
index ed2c0a35c..f29713388 100644
--- a/sickbeard/show_name_helpers.py
+++ b/sickbeard/show_name_helpers.py
@@ -239,6 +239,10 @@ def allPossibleShowNames(show):
     if show.tvrname != "" and show.tvrname != None:
         showNames.append(show.tvrname)
 
+    if show.custom_search_names != '':
+        for custom_name in show.custom_search_names.split(','):
+            showNames.append(custom_name)
+
     newShowNames = []
 
     country_list = countryList
diff --git a/sickbeard/tv.py b/sickbeard/tv.py
index e4527cdc0..a192700d0 100644
--- a/sickbeard/tv.py
+++ b/sickbeard/tv.py
@@ -67,6 +67,8 @@ class TVShow(object):
         self.paused = 0
         self.air_by_date = 0
         self.lang = lang
+        self.audio_lang = ""
+        self.custom_search_names = ""
 
         self.lock = threading.Lock()
         self._isDirGood = False
@@ -613,7 +615,12 @@ class TVShow(object):
 
             if self.lang == "":
                 self.lang = sqlResults[0]["lang"]
+                
+            if self.audio_lang == "":
+                self.audio_lang = sqlResults[0]["audio_lang"]                
 
+            if self.custom_search_names == "":
+                self.custom_search_names = sqlResults[0]["custom_search_names"]                
 
     def loadFromTVDB(self, cache=True, tvapi=None, cachedSeason=None):
 
@@ -656,6 +663,12 @@ class TVShow(object):
 
         if self.status == None:
             self.status = ""
+        
+        if myEp["audio_lang"]:
+            self.audio_lang = myEp["audio_lang"]
+
+        if myEp["custom_search_names"]:
+            self.custom_search_names = myEp["custom_search_names"]   
 
         self.saveToDB()
 
@@ -824,7 +837,9 @@ class TVShow(object):
                         "air_by_date": self.air_by_date,
                         "startyear": self.startyear,
                         "tvr_name": self.tvrname,
-                        "lang": self.lang
+                        "lang": self.lang,
+                        "audio_lang": self.audio_lang,
+                        "custom_search_names": self.custom_search_names
                         }
 
         myDB.upsert("tv_shows", newValueDict, controlValueDict)
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index bd474b01b..766da1fc7 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -2277,7 +2277,7 @@ class Home:
         return result['description'] if result else 'Episode not found.'
 
     @cherrypy.expose
-    def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, tvdbLang=None):
+    def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, tvdbLang=None, audio_lang=None, custom_search_names=None):
 
         if show == None:
             errString = "Invalid show ID: "+str(show)
@@ -2354,6 +2354,8 @@ class Home:
             showObj.paused = paused
             showObj.air_by_date = air_by_date
             showObj.lang = tvdb_lang
+            showObj.audio_lang = audio_lang
+            showObj.custom_search_names = custom_search_names
 
             # if we change location clear the db of episodes, change it, write to db, and rescan
             if os.path.normpath(showObj._location) != os.path.normpath(location):
-- 
GitLab