diff --git a/data/interfaces/default/config_providers.tmpl b/data/interfaces/default/config_providers.tmpl index 55c51e9db10cdcbc012e6e99ac9c69592479885c..572e99c62270014dfd5117869a3a27e762f2a0b2 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 6f007513a32be3b547e48cd6cf66596a0d95d7eb..fc7c5fb3d424bfda9e8f6c980924a5bc23c2f299 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 2f05f1fff9426f010fe7e503be8fd798a951afe5..cf03f07ec6b7cd9b2d1e3a334fd4da9883bf1dba 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 0000000000000000000000000000000000000000..eb2877b6a18b2e1f99bb453340eaa0b14cd654d5 --- /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 69d86823bc120337b5d330c3a4615be705911269..8bb6b16c989d8884fb167f5835dd889209e33260 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