Simplified providers

This commit is contained in:
Ruud committed 2012-12-27 19:53:12 +01:00
1 parent 73c5b90232
commit 917c5552a4
16 files changed
+106 -246

No files matched your search

+24 -4
View File
@@ -1,5 +1,6 @@
from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.variable import tryFloat, mergeDicts, md5 from couchpotato.core.helpers.variable import tryFloat, mergeDicts, md5, \
possibleTitles, getTitle
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.environment import Env from couchpotato.environment import Env
@@ -56,8 +57,6 @@ class YarrProvider(Provider):
def __init__(self): def __init__(self):
addEvent('provider.belongs_to', self.belongsTo) addEvent('provider.belongs_to', self.belongsTo)
addEvent('%s.search' % self.type, self.search)
addEvent('yarr.search', self.search) addEvent('yarr.search', self.search)
def login(self): def login(self):
@@ -97,7 +96,28 @@ class YarrProvider(Provider):
return 'try_next' return 'try_next'
def search(self, movie, quality): def search(self, movie, quality):
return []
if self.isDisabled():
return []
# Login if needed
if self.urls.get('login') and (not self.login_opener and not self.login()):
log.error('Failed to login to: %s', self.getName())
return []
# Create result container
imdb_result = hasattr(self, '_search')
results = ResultList(self, movie, quality, imdb_result = imdb_result)
# Do search based on imdb id
if imdb_result:
self._search(movie, quality, results)
# Search possible titles
else:
for title in possibleTitles(getTitle(movie['library'])):
self._searchOnTitle(title, movie, quality, results)
return results
def belongsTo(self, url, provider = None, host = None): def belongsTo(self, url, provider = None, host = None):
try: try:
@@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
from couchpotato.core.helpers.variable import tryInt, possibleTitles, getTitle from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env from couchpotato.environment import Env
from dateutil.parser import parse from dateutil.parser import parse
@@ -30,18 +29,7 @@ class FTDWorld(NZBProvider):
] ]
cat_backup_id = 1 cat_backup_id = 1
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality)
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return results
def _search(self, title, movie, quality):
q = '"%s" %s' % (title, movie['library']['year']) q = '"%s" %s' % (title, movie['library']['year'])
@@ -64,9 +52,8 @@ class FTDWorld(NZBProvider):
main_table = html.find('table', attrs = {'id':'ftdresult'}) main_table = html.find('table', attrs = {'id':'ftdresult'})
if not main_table: if not main_table:
return [] return
results = ResultList(self, movie, quality)
items = main_table.find_all('tr', attrs = {'class': re.compile('tcontent')}) items = main_table.find_all('tr', attrs = {'class': re.compile('tcontent')})
for item in items: for item in items:
@@ -89,8 +76,6 @@ class FTDWorld(NZBProvider):
except: except:
log.error('Failed to parse HTML response from FTDWorld') log.error('Failed to parse HTML response from FTDWorld')
return results
def getLoginParams(self): def getLoginParams(self):
return tryUrlencode({ return tryUrlencode({
'userlogin': self.conf('username'), 'userlogin': self.conf('username'),
+5 -15
View File
@@ -24,33 +24,25 @@ class Newznab(NZBProvider, RSS):
limits_reached = {} limits_reached = {}
cat_backup_id = '2000'
http_time_between_calls = 1 # Seconds http_time_between_calls = 1 # Seconds
def search(self, movie, quality): def search(self, movie, quality):
hosts = self.getHosts() hosts = self.getHosts()
results = ResultList(self, movie, quality, imdb_result = True) results = ResultList(self, movie, quality, imdb_result = True)
for host in hosts: for host in hosts:
result = self._search(host, movie, quality) if self.isDisabled(host):
results.extend(result) continue
self._searchOnHost(host, movie, quality, results)
return results return results
def _search(self, host, movie, quality): def _searchOnHost(self, host, movie, quality, results):
if self.isDisabled(host):
return []
results = []
cat_id = self.getCatId(quality['identifier'])
arguments = tryUrlencode({ arguments = tryUrlencode({
'imdbid': movie['library']['identifier'].replace('tt', ''), 'imdbid': movie['library']['identifier'].replace('tt', ''),
'cat': ','.join(cat_id),
'apikey': host['api_key'], 'apikey': host['api_key'],
'extended': 1 'extended': 1
}) })
@@ -86,8 +78,6 @@ class Newznab(NZBProvider, RSS):
'content': self.getTextElement(nzb, 'description'), 'content': self.getTextElement(nzb, 'description'),
}) })
return results
def getHosts(self): def getHosts(self):
uses = splitString(str(self.conf('use'))) uses = splitString(str(self.conf('use')))
+2 -18
View File
@@ -1,9 +1,8 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from dateutil.parser import parse from dateutil.parser import parse
import time import time
@@ -19,20 +18,7 @@ class NZBClub(NZBProvider, RSS):
http_time_between_calls = 4 #seconds http_time_between_calls = 4 #seconds
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality)
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return results
def _search(self, title, movie, quality):
results = []
q = '"%s %s" %s' % (title, movie['library']['year'], quality.get('identifier')) q = '"%s %s" %s' % (title, movie['library']['year'], quality.get('identifier'))
@@ -75,8 +61,6 @@ class NZBClub(NZBProvider, RSS):
'extra_check': extra_check 'extra_check': extra_check
}) })
return results
def getMoreInfo(self, item): def getMoreInfo(self, item):
full_description = self.getCache('nzbclub.%s' % item['id'], item['detail_url'], cache_timeout = 25920000) full_description = self.getCache('nzbclub.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description) html = BeautifulSoup(full_description)
@@ -1,9 +1,8 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env from couchpotato.environment import Env
from dateutil.parser import parse from dateutil.parser import parse
@@ -22,20 +21,7 @@ class NzbIndex(NZBProvider, RSS):
http_time_between_calls = 1 # Seconds http_time_between_calls = 1 # Seconds
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality)
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return results
def _search(self, title, movie, quality):
results = []
q = '"%s" %s %s' % (title, movie['library']['year'], quality.get('identifier')) q = '"%s" %s %s' % (title, movie['library']['year'], quality.get('identifier'))
arguments = tryUrlencode({ arguments = tryUrlencode({
@@ -81,8 +67,6 @@ class NzbIndex(NZBProvider, RSS):
'extra_check': extra_check, 'extra_check': extra_check,
}) })
return results
def getMoreInfo(self, item): def getMoreInfo(self, item):
try: try:
if '/nfo/' in item['description'].lower(): if '/nfo/' in item['description'].lower():
@@ -1,7 +1,6 @@
from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env from couchpotato.environment import Env
import time import time
@@ -22,12 +21,7 @@ class Nzbsrus(NZBProvider, RSS):
] ]
cat_backup_id = 240 cat_backup_id = 240
def search(self, movie, quality): def _search(self, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality, imdb_result = True)
cat_id_string = '&'.join(['c%s=1' % x for x in self.getCatId(quality.get('identifier'))]) cat_id_string = '&'.join(['c%s=1' % x for x in self.getCatId(quality.get('identifier'))])
arguments = tryUrlencode({ arguments = tryUrlencode({
@@ -64,7 +58,5 @@ class Nzbsrus(NZBProvider, RSS):
'description': self.getTextElement(nzb, 'addtext'), 'description': self.getTextElement(nzb, 'addtext'),
}) })
return results
def getApiExt(self): def getApiExt(self):
return '/%s/' % (self.conf('userid')) return '/%s/' % (self.conf('userid'))
+1 -9
View File
@@ -1,7 +1,6 @@
from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.variable import tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
log = CPLog(__name__) log = CPLog(__name__)
@@ -16,12 +15,7 @@ class Nzbx(NZBProvider):
http_time_between_calls = 1 # Seconds http_time_between_calls = 1 # Seconds
def search(self, movie, quality): def _search(self, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality, imdb_result = True)
# Get nbzs # Get nbzs
arguments = tryUrlencode({ arguments = tryUrlencode({
@@ -41,5 +35,3 @@ class Nzbx(NZBProvider):
'size': tryInt(nzb['size']) / 1024 / 1024, 'size': tryInt(nzb['size']) / 1024 / 1024,
'score': 5 if nzb['votes']['upvotes'] > nzb['votes']['downvotes'] else 0 'score': 5 if nzb['votes']['upvotes'] > nzb['votes']['downvotes'] else 0
}) })
return results
@@ -1,10 +1,8 @@
from bs4 import BeautifulSoup
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from dateutil.parser import parse from dateutil.parser import parse
from urlparse import urlparse, parse_qs from urlparse import urlparse, parse_qs
@@ -31,18 +29,12 @@ class OMGWTFNZBs(NZBProvider, RSS):
def search(self, movie, quality): def search(self, movie, quality):
pre_releases = fireEvent('quality.pre_releases', single = True) if quality['identifier'] in fireEvent('quality.pre_releases', single = True):
if self.isDisabled() or quality['identifier'] in pre_releases:
return [] return []
results = ResultList(self, movie, quality) return super(OMGWTFNZBs, self).search(movie, quality)
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return results def _searchOnTitle(self, title, movie, quality, results):
def _search(self, title, movie, quality):
results = []
q = '%s %s' % (title, movie['library']['year']) q = '%s %s' % (title, movie['library']['year'])
params = tryUrlencode({ params = tryUrlencode({
@@ -56,18 +48,14 @@ class OMGWTFNZBs(NZBProvider, RSS):
for nzb in nzbs: for nzb in nzbs:
nzb_id = parse_qs(urlparse(self.getTextElement(nzb, 'link')).query).get('id')[0]
enclosure = self.getElement(nzb, 'enclosure').attrib enclosure = self.getElement(nzb, 'enclosure').attrib
size = enclosure['length']
results.append({ results.append({
'id': nzb_id, 'id': parse_qs(urlparse(self.getTextElement(nzb, 'link')).query).get('id')[0],
'name': toUnicode(self.getTextElement(nzb, 'title')), 'name': toUnicode(self.getTextElement(nzb, 'title')),
'age': self.calculateAge(int(time.mktime(parse(self.getTextElement(nzb, 'pubDate')).timetuple()))), 'age': self.calculateAge(int(time.mktime(parse(self.getTextElement(nzb, 'pubDate')).timetuple()))),
'size': tryInt(size) / 1024 / 1024, 'size': tryInt(enclosure['length']) / 1024 / 1024,
'url': enclosure['url'], 'url': enclosure['url'],
'detail_url': self.getTextElement(nzb, 'link'), 'detail_url': self.getTextElement(nzb, 'link'),
'description': self.getTextElement(nzb, 'description') 'description': self.getTextElement(nzb, 'description')
}) })
return results
@@ -1,7 +1,6 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.variable import tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentMagnetProvider from couchpotato.core.providers.torrent.base import TorrentMagnetProvider
import re import re
import traceback import traceback
@@ -29,12 +28,7 @@ class KickAssTorrents(TorrentMagnetProvider):
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
cat_backup_id = None cat_backup_id = None
def search(self, movie, quality): def _search(self, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality, imdb_results = True)
data = self.getHTMLData(self.urls['search'] % ('m', movie['library']['identifier'].replace('tt', ''))) data = self.getHTMLData(self.urls['search'] % ('m', movie['library']['identifier'].replace('tt', '')))
@@ -87,8 +81,6 @@ class KickAssTorrents(TorrentMagnetProvider):
except AttributeError: except AttributeError:
log.debug('No search results found.') log.debug('No search results found.')
return results
def ageToDays(self, age_str): def ageToDays(self, age_str):
age = 0 age = 0
age_str = age_str.replace(' ', ' ') age_str = age_str.replace(' ', ' ')
@@ -1,7 +1,6 @@
from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.variable import getTitle, tryInt, mergeDicts from couchpotato.core.helpers.variable import getTitle, tryInt, mergeDicts
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentProvider from couchpotato.core.providers.torrent.base import TorrentProvider
from dateutil.parser import parse from dateutil.parser import parse
import cookielib import cookielib
@@ -65,18 +64,11 @@ class PassThePopcorn(TorrentProvider):
else: else:
raise PassThePopcorn.NotLoggedInHTTPError(req.get_full_url(), code, msg, headers, fp) raise PassThePopcorn.NotLoggedInHTTPError(req.get_full_url(), code, msg, headers, fp)
def search(self, movie, quality): def _search(self, movie, quality, results):
if self.isDisabled():
return []
results = ResultList(self, movie, quality, imdb_results = True)
movie_title = getTitle(movie['library']) movie_title = getTitle(movie['library'])
quality_id = quality['identifier'] quality_id = quality['identifier']
log.info('Searching for %s at quality %s' % (movie_title, quality_id))
params = mergeDicts(self.quality_search_params[quality_id].copy(), { params = mergeDicts(self.quality_search_params[quality_id].copy(), {
'order_by': 'relevance', 'order_by': 'relevance',
'order_way': 'descending', 'order_way': 'descending',
@@ -85,7 +77,7 @@ class PassThePopcorn(TorrentProvider):
# Do login for the cookies # Do login for the cookies
if not self.login_opener and not self.login(): if not self.login_opener and not self.login():
return results return
try: try:
url = '%s?json=noredirect&%s' % (self.urls['torrent'], tryUrlencode(params)) url = '%s?json=noredirect&%s' % (self.urls['torrent'], tryUrlencode(params))
@@ -93,12 +85,11 @@ class PassThePopcorn(TorrentProvider):
res = json.loads(txt) res = json.loads(txt)
except: except:
log.error('Search on PassThePopcorn.me (%s) failed (could not decode JSON)' % params) log.error('Search on PassThePopcorn.me (%s) failed (could not decode JSON)' % params)
return [] return
try: try:
if not 'Movies' in res: if not 'Movies' in res:
log.info("PTP search returned nothing for '%s' at quality '%s' with search parameters %s" % (movie_title, quality_id, params)) return
return []
authkey = res['AuthKey'] authkey = res['AuthKey']
passkey = res['PassKey'] passkey = res['PassKey']
@@ -143,8 +134,6 @@ class PassThePopcorn(TorrentProvider):
except: except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
return results
def login(self): def login(self):
cookieprocessor = urllib2.HTTPCookieProcessor(cookielib.CookieJar()) cookieprocessor = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
@@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import tryUrlencode, toUnicode from couchpotato.core.helpers.encoding import tryUrlencode, toUnicode
from couchpotato.core.helpers.variable import getTitle, tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentMagnetProvider from couchpotato.core.providers.torrent.base import TorrentMagnetProvider
from urlparse import parse_qs from urlparse import parse_qs
import re import re
@@ -22,14 +21,16 @@ class PublicHD(TorrentMagnetProvider):
def search(self, movie, quality): def search(self, movie, quality):
if self.isDisabled() or not quality.get('hd', False): if not quality.get('hd', False):
return [] return []
results = ResultList(self, movie, quality) return super(PublicHD, self).search(movie, quality)
def _searchOnTitle(self, title, movie, quality, results):
params = tryUrlencode({ params = tryUrlencode({
'page':'torrents', 'page':'torrents',
'search': '%s %s' % (getTitle(movie['library']), movie['library']['year']), 'search': '%s %s' % (title, movie['library']['year']),
'active': 1, 'active': 1,
}) })
@@ -65,8 +66,6 @@ class PublicHD(TorrentMagnetProvider):
except: except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
return results
def getMoreInfo(self, item): def getMoreInfo(self, item):
full_description = self.getCache('publichd.%s' % item['id'], item['detail_url'], cache_timeout = 25920000) full_description = self.getCache('publichd.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description) html = BeautifulSoup(full_description)
@@ -2,7 +2,6 @@ from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import tryUrlencode, toUnicode from couchpotato.core.helpers.encoding import tryUrlencode, toUnicode
from couchpotato.core.helpers.variable import tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentProvider from couchpotato.core.providers.torrent.base import TorrentProvider
import traceback import traceback
@@ -27,10 +26,7 @@ class SceneAccess(TorrentProvider):
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
def search(self, movie, quality): def _search(self, movie, quality, results):
if self.isDisabled():
return []
url = self.urls['search'] % ( url = self.urls['search'] % (
self.getCatId(quality['identifier'])[0], self.getCatId(quality['identifier'])[0],
@@ -45,9 +41,7 @@ class SceneAccess(TorrentProvider):
# Do login for the cookies # Do login for the cookies
if not self.login_opener and not self.login(): if not self.login_opener and not self.login():
return [] return
results = ResultList(self, movie, quality, imdb_results = True)
data = self.getHTMLData(url, opener = self.login_opener) data = self.getHTMLData(url, opener = self.login_opener)
@@ -57,7 +51,7 @@ class SceneAccess(TorrentProvider):
try: try:
resultsTable = html.find('table', attrs = {'id' : 'torrents-table'}) resultsTable = html.find('table', attrs = {'id' : 'torrents-table'})
if resultsTable is None: if resultsTable is None:
return results return
entries = resultsTable.find_all('tr', attrs = {'class' : 'tt_row'}) entries = resultsTable.find_all('tr', attrs = {'class' : 'tt_row'})
for result in entries: for result in entries:
@@ -82,8 +76,6 @@ class SceneAccess(TorrentProvider):
except: except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
return results
def getLoginParams(self): def getLoginParams(self):
return tryUrlencode({ return tryUrlencode({
'username': self.conf('username'), 'username': self.conf('username'),
@@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import simplifyString, tryUrlencode from couchpotato.core.helpers.encoding import simplifyString, tryUrlencode
from couchpotato.core.helpers.variable import getTitle, tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentProvider from couchpotato.core.providers.torrent.base import TorrentProvider
import traceback import traceback
@@ -21,12 +20,9 @@ class SceneHD(TorrentProvider):
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled(): q = '"%s %s" %s' % (simplifyString(title), movie['library']['year'], quality.get('identifier'))
return []
q = '"%s %s" %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year'], quality.get('identifier'))
arguments = tryUrlencode({ arguments = tryUrlencode({
'search': q, 'search': q,
}) })
@@ -34,9 +30,7 @@ class SceneHD(TorrentProvider):
# Cookie login # Cookie login
if not self.login_opener and not self.login(): if not self.login_opener and not self.login():
return [] return
results = ResultList(self, movie, quality, imdb_results = True)
data = self.getHTMLData(url, opener = self.login_opener) data = self.getHTMLData(url, opener = self.login_opener)
@@ -74,8 +68,6 @@ class SceneHD(TorrentProvider):
except: except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
return results
def getLoginParams(self, params): def getLoginParams(self, params):
return tryUrlencode({ return tryUrlencode({
@@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
from couchpotato.core.helpers.variable import getTitle, tryInt, cleanHost from couchpotato.core.helpers.variable import tryInt, cleanHost
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentMagnetProvider from couchpotato.core.providers.torrent.base import TorrentMagnetProvider
from couchpotato.environment import Env from couchpotato.environment import Env
import re import re
@@ -44,43 +43,9 @@ class ThePirateBay(TorrentMagnetProvider):
self.domain = self.conf('domain') self.domain = self.conf('domain')
super(ThePirateBay, self).__init__() super(ThePirateBay, self).__init__()
def getDomain(self, url = ''): def _searchOnTitle(self, title, movie, quality, results):
if not self.domain: search_url = self.urls['search'] % (self.getDomain(), tryUrlencode(title + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0])
for proxy in self.proxy_list:
prop_name = 'tpb_proxy.%s' % proxy
last_check = float(Env.prop(prop_name, default = 0))
if last_check > time.time() - 1209600:
continue
data = ''
try:
data = self.urlopen(proxy, timeout = 3, show_error = False)
except:
log.debug('Failed tpb proxy %s', proxy)
if 'title="Pirate Search"' in data:
log.debug('Using proxy: %s', proxy)
self.domain = proxy
break
Env.prop(prop_name, time.time())
if not self.domain:
log.error('No TPB proxies left, please add one in settings, or let us know which one to add on the forum.')
return None
return cleanHost(self.domain).rstrip('/') + url
def search(self, movie, quality):
if self.isDisabled() or not self.getDomain():
return []
results = ResultList(self, movie, quality)
search_url = self.urls['search'] % (self.getDomain(), tryUrlencode(getTitle(movie['library']) + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0])
data = self.getHTMLData(search_url) data = self.getHTMLData(search_url)
@@ -90,7 +55,7 @@ class ThePirateBay(TorrentMagnetProvider):
results_table = soup.find('table', attrs = {'id': 'searchResult'}) results_table = soup.find('table', attrs = {'id': 'searchResult'})
if not results_table: if not results_table:
return [] return
entries = results_table.find_all('tr') entries = results_table.find_all('tr')
for result in entries[2:]: for result in entries[2:]:
@@ -127,7 +92,37 @@ class ThePirateBay(TorrentMagnetProvider):
except: except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
return [] def isEnabled(self):
return super(ThePirateBay, self).isEnabled() and self.getDomain()
def getDomain(self, url = ''):
if not self.domain:
for proxy in self.proxy_list:
prop_name = 'tpb_proxy.%s' % proxy
last_check = float(Env.prop(prop_name, default = 0))
if last_check > time.time() - 1209600:
continue
data = ''
try:
data = self.urlopen(proxy, timeout = 3, show_error = False)
except:
log.debug('Failed tpb proxy %s', proxy)
if 'title="Pirate Search"' in data:
log.debug('Using proxy: %s', proxy)
self.domain = proxy
break
Env.prop(prop_name, time.time())
if not self.domain:
log.error('No TPB proxies left, please add one in settings, or let us know which one to add on the forum.')
return None
return cleanHost(self.domain).rstrip('/') + url
def getMoreInfo(self, item): def getMoreInfo(self, item):
full_description = self.getCache('tpb.%s' % item['id'], item['detail_url'], cache_timeout = 25920000) full_description = self.getCache('tpb.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
@@ -1,11 +1,7 @@
from bs4 import BeautifulSoup from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.encoding import tryUrlencode, toUnicode from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.helpers.variable import tryInt, getTitle
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentProvider from couchpotato.core.providers.torrent.base import TorrentProvider
import time
import traceback
log = CPLog(__name__) log = CPLog(__name__)
@@ -29,14 +25,9 @@ class TorrentDay(TorrentProvider):
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled() or (not self.login_opener and not self.login()): q = '"%s %s"' % (title, movie['library']['year'])
return []
q = '"%s %s"' % (getTitle(movie['library']), movie['library']['year'])
results = ResultList(self, movie, quality, imdb_results = True)
params = { params = {
'/browse.php?': None, '/browse.php?': None,
@@ -48,10 +39,9 @@ class TorrentDay(TorrentProvider):
data = self.getJsonData(self.urls['search'], params = params, opener = self.login_opener) data = self.getJsonData(self.urls['search'], params = params, opener = self.login_opener)
try: torrents = data.get('Fs', [])[0].get('Cn', {}).get('torrents', []) try: torrents = data.get('Fs', [])[0].get('Cn', {}).get('torrents', [])
except: return [] except: return
for torrent in torrents: for torrent in torrents:
results.append({ results.append({
'id': torrent['id'], 'id': torrent['id'],
'name': torrent['name'], 'name': torrent['name'],
@@ -61,23 +51,11 @@ class TorrentDay(TorrentProvider):
'seeders': tryInt(torrent.get('seed')), 'seeders': tryInt(torrent.get('seed')),
'leechers': tryInt(torrent.get('leech')), 'leechers': tryInt(torrent.get('leech')),
'download': self.loginDownload, 'download': self.loginDownload,
'get_more_info': self.getMoreInfo,
}) })
return results
def getLoginParams(self): def getLoginParams(self):
return tryUrlencode({ return tryUrlencode({
'username': self.conf('username'), 'username': self.conf('username'),
'password': self.conf('password'), 'password': self.conf('password'),
'submit': 'submit', 'submit': 'submit',
}) })
def getMoreInfo(self, item):
full_description = self.getCache('sceneaccess.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description)
nfo_pre = html.find('div', attrs = {'id':'details_table'})
description = toUnicode(nfo_pre.text) if nfo_pre else ''
item['description'] = description
return item
@@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.variable import getTitle, tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import ResultList
from couchpotato.core.providers.torrent.base import TorrentProvider from couchpotato.core.providers.torrent.base import TorrentProvider
import traceback import traceback
@@ -33,18 +32,9 @@ class TorrentLeech(TorrentProvider):
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
cat_backup_id = None cat_backup_id = None
def search(self, movie, quality): def _searchOnTitle(self, title, movie, quality, results):
if self.isDisabled(): url = self.urls['search'] % (tryUrlencode(title.replace(':', '') + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0])
return []
# Cookie login
if not self.login_opener and not self.login():
return []
results = ResultList(self, movie, quality)
url = self.urls['search'] % (tryUrlencode(getTitle(movie['library']).replace(':', '') + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0])
data = self.getHTMLData(url, opener = self.login_opener) data = self.getHTMLData(url, opener = self.login_opener)
if data: if data:
@@ -53,7 +43,7 @@ class TorrentLeech(TorrentProvider):
try: try:
result_table = html.find('table', attrs = {'id' : 'torrenttable'}) result_table = html.find('table', attrs = {'id' : 'torrenttable'})
if not result_table: if not result_table:
return [] return
entries = result_table.find_all('tr') entries = result_table.find_all('tr')
@@ -77,8 +67,6 @@ class TorrentLeech(TorrentProvider):
except: except:
log.error('Failed to parsing %s: %s', (self.getName(), traceback.format_exc())) log.error('Failed to parsing %s: %s', (self.getName(), traceback.format_exc()))
return results
def getLoginParams(self): def getLoginParams(self):
return tryUrlencode({ return tryUrlencode({
'username': self.conf('username'), 'username': self.conf('username'),