From dea999e2e93d11f57f3b0e778d2955395ed5c5ef Mon Sep 17 00:00:00 2001
From: onoblanc <onoblanc@frei-sodiam.fr>
Date: Thu, 13 Nov 2014 11:37:04 +0100
Subject: [PATCH] alpha libertalia

---
 data/interfaces/default/config_providers.tmpl |  17 +-
 sickbeard/__init__.py                         |  17 +-
 sickbeard/providers/__init__.py               |   1 +
 sickbeard/providers/libertalia.py             | 200 ++++++++++++++++++
 sickbeard/webserve.py                         |   9 +-
 5 files changed, 240 insertions(+), 4 deletions(-)
 create mode 100644 sickbeard/providers/libertalia.py

diff --git a/data/interfaces/default/config_providers.tmpl b/data/interfaces/default/config_providers.tmpl
index 55c51e9db..572e99c62 100644
--- a/data/interfaces/default/config_providers.tmpl
+++ b/data/interfaces/default/config_providers.tmpl
@@ -99,7 +99,7 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
                                 <span class="component-title jumbo">Configure Provider:</span>
                                 <span class="component-desc">
                                     #set $provider_config_list = []
-                                    #for $cur_provider in ("omgwtfnzbs", "tvtorrents", "torrentleech", "btn", "binnewz", "t411", "ftdb", "addict", "fnt", "tpi", "piratebay", "gks", "ethor", "thinkgeek", "xthor"):
+                                    #for $cur_provider in ("omgwtfnzbs", "tvtorrents", "torrentleech", "btn", "binnewz", "t411", "ftdb", "addict", "fnt", "libertalia", "tpi", "piratebay", "gks", "ethor", "thinkgeek", "xthor"):
                                         #set $cur_provider_obj = $sickbeard.providers.getProviderClass($cur_provider)
                                         #if $cur_provider_obj.providerType == $GenericProvider.NZB and not $sickbeard.USE_NZBS:
                                         	#continue
@@ -300,6 +300,21 @@ Nothing to set up for this provider
                         </div>
                     </div><!-- /thinkgeekDiv //-->
                     
+                     <div class="providerDiv" id="libertaliaDiv">
+                        <div class="field-pair">
+                            <label class="clearfix">
+                                <span class="component-title">libertalia User name:</span>
+                                <input class="component-desc" type="text" name="libertalia_username" value="$sickbeard.LIBERTALIA_USERNAME" size="40" />
+                            </label>
+                        </div>
+                        <div class="field-pair">
+                            <label class="clearfix">
+                                <span class="component-title">libertalia Password:</span>
+                                <input class="component-desc" type="text" name="libertalia_password" value="$sickbeard.LIBERTALIA_PASSWORD" size="40" />
+                            </label>
+                        </div>
+                    </div><!-- /libertaliaDiv //-->
+                    
                     <div class="providerDiv" id="xthorDiv">
                         <div class="field-pair">
                             <label class="clearfix">
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index 6f007513a..fc7c5fb3d 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -30,7 +30,7 @@ from threading import Lock
 
 # apparently py2exe won't build these unless they're imported somewhere
 from sickbeard import providers, metadata
-from providers import ezrss, tvtorrents, torrentleech, btn, nzbsrus, newznab, womble, nzbx, omgwtfnzbs, binnewz, t411, ftdb, tpi, fnt, addict, cpasbien, piratebay, gks, kat, ethor, xthor, thinkgeek
+from providers import ezrss, tvtorrents, torrentleech, btn, nzbsrus, newznab, womble, nzbx, omgwtfnzbs, binnewz, t411, ftdb, libertalia, tpi, fnt, addict, cpasbien, piratebay, gks, kat, ethor, xthor, thinkgeek
 from sickbeard.config import CheckSection, check_setting_int, check_setting_str, ConfigMigrator
 
 from sickbeard import searchCurrent, searchBacklog, showUpdater, versionChecker, properFinder, frenchFinder, autoPostProcesser, subtitles, traktWatchListChecker, SentFTPChecker
@@ -233,6 +233,10 @@ FNT = False
 FNT_USERNAME = None
 FNT_PASSWORD = None
 
+LIBERTALIA = False
+LIBERTALIA_USERNAME = None
+LIBERTALIA_PASSWORD = None
+
 XTHOR = False
 XTHOR_USERNAME = None
 XTHOR_PASSWORD = None
@@ -480,6 +484,7 @@ def initialize(consoleLogging=True):
                 TPI, TPI_USERNAME, TPI_PASSWORD, \
                 ADDICT, ADDICT_USERNAME, ADDICT_PASSWORD, \
                 FNT, FNT_USERNAME, FNT_PASSWORD, \
+                LIBERTALIA, LIBERTALIA_USERNAME, LIBERTALIA_PASSWORD, \
                 XTHOR, XTHOR_USERNAME, XTHOR_PASSWORD, \
                 THINKGEEK, THINKGEEK_USERNAME, THINKGEEK_PASSWORD, \
                 THEPIRATEBAY, THEPIRATEBAY_PROXY, THEPIRATEBAY_PROXY_URL, THEPIRATEBAY_TRUSTED, \
@@ -787,6 +792,11 @@ def initialize(consoleLogging=True):
         FNT_USERNAME = check_setting_str(CFG, 'FNT', 'username', '')
         FNT_PASSWORD = check_setting_str(CFG, 'FNT', 'password', '')
         
+        CheckSection(CFG, 'LIBERTALIA')
+        FNT = bool(check_setting_int(CFG, 'LIBERTALIA', 'libertalia', 0))
+        FNT_USERNAME = check_setting_str(CFG, 'LIBERTALIA', 'username', '')
+        FNT_PASSWORD = check_setting_str(CFG, 'LIBERTALIA', 'password', '')
+        
         CheckSection(CFG, 'XTHOR')
         XTHOR = bool(check_setting_int(CFG, 'XTHOR', 'xthor', 0))
         XTHOR_USERNAME = check_setting_str(CFG, 'XTHOR', 'username', '')
@@ -1540,6 +1550,11 @@ def save_config():
     new_config['FNT']['username'] = FNT_USERNAME
     new_config['FNT']['password'] = FNT_PASSWORD
     
+    new_config['LIBERTALIA'] = {}
+    new_config['LIBERTALIA']['libertalia'] = int(FNT)
+    new_config['LIBERTALIA']['username'] = LIBERTALIA_USERNAME
+    new_config['LIBERTALIA']['password'] = LIBERTALIA_PASSWORD
+    
     new_config['XTHOR'] = {}
     new_config['XTHOR']['xthor'] = int(XTHOR)
     new_config['XTHOR']['username'] = XTHOR_USERNAME
diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index 2f05f1fff..cf03f07ec 100644
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -28,6 +28,7 @@ __all__ = ['ezrss',
            'tpi',
            'addict',
            'fnt',
+           'libertalia',
            'cpasbien',
            'piratebay',
            'gks',
diff --git a/sickbeard/providers/libertalia.py b/sickbeard/providers/libertalia.py
new file mode 100644
index 000000000..eb2877b6a
--- /dev/null
+++ b/sickbeard/providers/libertalia.py
@@ -0,0 +1,200 @@
+# -*- coding: latin-1 -*-
+# Author: Raver2046 <raver2046@gmail.com>
+# based on tpi.py
+# URL: http://code.google.com/p/sickbeard/
+#
+# This file is part of Sick Beard.
+#
+# Sick Beard is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Sick Beard is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+# 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 bs4 import BeautifulSoup
+from sickbeard import classes, show_name_helpers, logger
+from sickbeard.common import Quality
+import generic
+import cookielib
+import sickbeard
+import urllib
+import urllib2
+import random
+import re
+
+class LIBERTALIAProvider(generic.TorrentProvider):
+
+    def __init__(self):
+        
+        generic.TorrentProvider.__init__(self, "LIBERTALIA")
+
+        self.supportsBacklog = True
+        
+        self.cj = cookielib.CookieJar()
+        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
+        
+        self.url = "https://libertalia.me"
+        
+        self.login_done = False
+        self.failed_login_logged = False
+        self.successful_login_logged = False
+        
+    def isEnabled(self):
+        return sickbeard.LIBERTALIA
+    
+    def getSearchParams(self, searchString, audio_lang, french=None, fullSeason=False):
+        results = []    
+        if audio_lang == "en" and french==None:
+             results.append( urllib.urlencode( {
+                'name': searchString                            
+            } ) + "&cat[]=9" )
+        elif audio_lang == "fr" or french:
+            results.append( urllib.urlencode( {
+                'name': searchString
+            } ) + "&cat[]=9")
+        else:
+            results.append( urllib.urlencode( {
+                'name': searchString
+            } ) + "&cat[]=9")
+        return results
+        
+    def _get_season_search_strings(self, show, season):
+
+        showNam = show_name_helpers.allPossibleShowNames(show)
+        showNames = list(set(showNam))
+        results = []
+        for showName in showNames:
+            results.extend( self.getSearchParams(showName + " saison%d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " season%d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " saison %d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " season %d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " saison%02d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " season%02d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " saison %02d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + " season %02d" % season, show.audio_lang, fullSeason=True))
+            results.extend( self.getSearchParams(showName + ".S%02d." % season, show.audio_lang, fullSeason=True))
+        return results
+
+    def _get_episode_search_strings(self, ep_obj, french=None):
+
+        showNam = show_name_helpers.allPossibleShowNames(ep_obj.show)
+        showNames = list(set(showNam))
+        results = []
+        for showName in showNames:
+            results.extend( self.getSearchParams( "%s S%02dE%02d" % ( showName, ep_obj.scene_season, ep_obj.scene_episode), ep_obj.show.audio_lang, french ))
+            results.extend( self.getSearchParams( "%s %dx%02d" % ( showName, ep_obj.scene_season, ep_obj.scene_episode ), ep_obj.show.audio_lang, french ))
+        return results
+    
+    def _get_title_and_url(self, item):
+        return (item.title, item.url)
+    
+    def getQuality(self, item):
+        return item.getQuality()
+    
+    def _doLogin(self, login, password):
+
+        listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
+                                                'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
+                                                'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13',
+                                                'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
+                                                'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
+                                                'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
+                                                'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
+                                                'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
+
+        self.opener.addheaders = [('User-agent', random.choice(listeUserAgents))] 
+                                       
+        data = urllib.urlencode({'username': login, 'password' :  password, 'submit' : 'login'})
+        
+     
+        r = self.opener.open(self.url + '/login.php',data)
+        
+        for index, cookie in enumerate(self.cj):
+            if (cookie.name == "session"): self.login_done = True
+                                
+        if not self.login_done and not self.failed_login_logged:
+            logger.log(u"Unable to login to LIBERTALIA. Please check username and password.", logger.WARNING) 
+            self.failed_login_logged = True
+        
+        if self.login_done and not self.successful_login_logged:
+            logger.log(u"Login to LIBERTALIA successful", logger.MESSAGE) 
+            self.successful_login_logged = True        
+
+    def _doSearch(self, searchString, show=None, season=None, french=None):
+
+        
+        if not self.login_done:
+            self._doLogin( sickbeard.LIBERTALIA_USERNAME, sickbeard.LIBERTALIA_PASSWORD )
+
+        results = []
+        
+        searchUrl = self.url + '/torrents.php?' + searchString.replace('!','')
+ 
+        logger.log(u"Search string: " + searchUrl, logger.DEBUG)
+        
+        r = self.opener.open( searchUrl )
+
+        soup = BeautifulSoup( r, "html.parser" )
+
+        resultsTable = soup.find("table", { "class" : "torrent_table"  })
+        if resultsTable:
+
+            rows = resultsTable.findAll("tr")
+            
+            for row in rows:
+                           
+                #bypass first row because title only
+                columns = row.find('td')                            
+                 
+                link = row.findAll('td')[1].find("a",  href=re.compile("torrents.php?id=")) 
+                if link:               
+                   title = link.text
+                   logger.log(u"LIBERTALIA TITLE TEMP: " + title, logger.DEBUG)                   
+                   'downloadURL =  self.url + "/" + row.find("a",href=re.compile("torrent_pass"))['href']              
+                   downloadURL =  row.find("a",href=re.compile("torrent_pass"))['href']
+                
+                   quality = Quality.nameQuality( title )
+                   if quality==Quality.UNKNOWN and title:
+                     if '720p' not in title.lower() and '1080p' not in title.lower():
+                        quality=Quality.SDTV
+                   if show and french==None:
+                     results.append( LIBERTALIASearchResult( self.opener, title, downloadURL, quality, str(show.audio_lang) ) )
+                   elif show and french:
+                     results.append( LIBERTALIASearchResult( self.opener, title, downloadURL, quality, 'fr' ) )
+                   else:
+                    results.append( LIBERTALIASearchResult( self.opener, title, downloadURL, quality ) )
+        
+        return results
+    
+    def getResult(self, episodes):
+        """
+        Returns a result of the correct type for this provider
+        """
+        result = classes.TorrentDataSearchResult(episodes)
+        result.provider = self
+
+        return result    
+    
+class LIBERTALIASearchResult:
+    
+    def __init__(self, opener, title, url, quality, audio_langs=None):
+        self.opener = opener
+        self.title = title
+        self.url = url
+        self.quality = quality
+        self.audio_langs=audio_langs    
+
+    def getNZB(self):
+        return self.opener.open( self.url , 'wb').read()             
+
+    def getQuality(self):
+        return self.quality
+
+provider = LIBERTALIAProvider()
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index 69d86823b..8bb6b16c9 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -1361,7 +1361,7 @@ class ConfigProviders:
                       tvtorrents_digest=None, tvtorrents_hash=None,
                       torrentleech_key=None,
                       btn_api_key=None,
-                      newzbin_username=None, newzbin_password=None,t411_username=None,t411_password=None,ftdb_username=None,ftdb_password=None,tpi_username=None,tpi_password=None,addict_username=None,addict_password=None,fnt_username=None,fnt_password=None,xthor_username=None,xthor_password=None,thinkgeek_username=None,thinkgeek_password=None,   
+                      newzbin_username=None, newzbin_password=None,t411_username=None,t411_password=None,ftdb_username=None,ftdb_password=None,tpi_username=None,tpi_password=None,addict_username=None,addict_password=None,fnt_username=None,fnt_password=None,libertalia_username=None,libertalia_password=None,xthor_username=None,xthor_password=None,thinkgeek_username=None,thinkgeek_password=None,   
                       gks_key=None,
                       ethor_key=None,                      
                       provider_order=None):
@@ -1444,7 +1444,9 @@ class ConfigProviders:
             elif curProvider == 'addict':
                 sickbeard.ADDICT = curEnabled 
             elif curProvider == 'fnt':
-                sickbeard.FNT = curEnabled  
+                sickbeard.FNT = curEnabled
+            elif curProvider == 'libertalia':
+                sickbeard.LIBERTALIA = curEnabled   
             elif curProvider == 'xthor':
                 sickbeard.XTHOR = curEnabled  
             elif curProvider == 'thinkgeek':
@@ -1488,6 +1490,9 @@ class ConfigProviders:
         sickbeard.FNT_USERNAME = fnt_username
         sickbeard.FNT_PASSWORD = fnt_password
 
+        sickbeard.LIBERTALIA_USERNAME = libertalia_username
+        sickbeard.LIBERTALIA_PASSWORD = libertalia_password
+        
         sickbeard.XTHOR_USERNAME = xthor_username
         sickbeard.XTHOR_PASSWORD = xthor_password
         
-- 
GitLab