Private GIT

Skip to content
Snippets Groups Projects
Commit 29e63959 authored by Labrys's avatar Labrys
Browse files

Standardize providers

parent f8092e35
Branches
No related tags found
No related merge requests found
......@@ -33,22 +33,30 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "ABNormal")
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# URLs
self.url = 'https://abnormal.ws'
self.urls = {
'login': self.url + '/login.php',
'search': self.url + '/torrents.php?'
}
# Proper Strings
self.proper_strings = ['PROPER']
# Cache
self.cache = tvcache.TVCache(self, min_time=30)
def login(self):
......@@ -76,6 +84,7 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
if not self.login():
return results
# Search Params
search_params = {
'cat[]': ['TV|SD|VOSTFR', 'TV|HD|VOSTFR', 'TV|SD|VF', 'TV|HD|VF', 'TV|PACK|FR', 'TV|PACK|VOSTFR', 'TV|EMISSIONS', 'ANIME'],
# Sorting: by time. Available parameters: ReleaseName, Seeders, Leechers, Snatched, Size
......@@ -84,9 +93,13 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
'way': 'DESC'
}
# Units
units = ['O', 'KO', 'MO', 'GO', 'TO', 'PO']
for mode in search_strings:
items = []
logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
for search_string in search_strings[mode]:
if mode != 'RSS':
......@@ -108,7 +121,7 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
torrent_table = html.find("table", class_="torrent_table cats")
torrent_rows = torrent_table.find_all('tr') if torrent_table else []
# Continue only if one Release is found
# Continue only if at least one Release is found
if len(torrent_rows) < 2:
logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG)
continue
......@@ -116,6 +129,7 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
# Catégorie, Release, Date, DL, Size, C, S, L
labels = [label.get_text(strip=True) for label in torrent_rows[0].find_all('td')]
# Skip column headers
for result in torrent_rows[1:]:
cells = result.find_all('td')
if len(cells) < len(labels):
......@@ -129,15 +143,15 @@ class ABNormalProvider(TorrentProvider): # pylint: disable=too-many-instance-at
seeders = try_int(cells[labels.index('S')].get_text(strip=True))
leechers = try_int(cells[labels.index('L')].get_text(strip=True))
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
continue
torrent_size = cells[labels.index('Size')].get_text(strip=True)
french_units = ['O', 'KO', 'MO', 'GO', 'TO', 'PO']
size = convert_size(torrent_size, units=french_units) or -1
torrent_size = cells[labels.index('Size')].get_text()
size = convert_size(torrent_size, units=units) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
......
......@@ -33,22 +33,30 @@ class AlphaRatioProvider(TorrentProvider): # pylint: disable=too-many-instance-
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "AlphaRatio")
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
self.url = 'http://alpharatio.cc/'
# URLs
self.url = 'http://alpharatio.cc'
self.urls = {
'login': self.url + 'login.php',
'search': self.url + 'torrents.php',
'login': self.url + '/login.php',
'search': self.url + '/torrents.php',
}
# Proper Strings
self.proper_strings = ['PROPER', 'REPACK']
# Cache
self.cache = tvcache.TVCache(self)
def login(self):
......@@ -79,6 +87,7 @@ class AlphaRatioProvider(TorrentProvider): # pylint: disable=too-many-instance-
if not self.login():
return results
# Search Params
search_params = {
'searchstr': '',
'filter_cat[1]': 1,
......@@ -88,9 +97,21 @@ class AlphaRatioProvider(TorrentProvider): # pylint: disable=too-many-instance-
'filter_cat[5]': 1
}
# Units
units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def process_column_header(td):
result = ''
if td.a and td.a.img:
result = td.a.img.get('title', td.a.get_text(strip=True))
if not result:
result = td.get_text(strip=True)
return result
for mode in search_strings:
items = []
logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
for search_string in search_strings[mode]:
if mode != 'RSS':
......@@ -108,19 +129,11 @@ class AlphaRatioProvider(TorrentProvider): # pylint: disable=too-many-instance-
torrent_table = html.find('table', id='torrent_table')
torrent_rows = torrent_table.find_all('tr') if torrent_table else []
# Continue only if one Release is found
# Continue only if at least one Release is found
if len(torrent_rows) < 2:
logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG)
continue
def process_column_header(td):
result = ''
if td.a and td.a.img:
result = td.a.img.get('title', td.a.get_text(strip=True))
if not result:
result = td.get_text(strip=True)
return result
# '', '', 'Name /Year', 'Files', 'Time', 'Size', 'Snatches', 'Seeders', 'Leechers'
labels = [process_column_header(label) for label in torrent_rows[0].find_all('td')]
......@@ -138,13 +151,15 @@ class AlphaRatioProvider(TorrentProvider): # pylint: disable=too-many-instance-
seeders = try_int(cells[labels.index('Seeders')].get_text(strip=True))
leechers = try_int(cells[labels.index('Leechers')].get_text(strip=True))
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
continue
torrent_size = cells[labels.index('Size')].get_text(strip=True)
size = convert_size(torrent_size) or -1
size = convert_size(torrent_size, units=units) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
......
......@@ -34,29 +34,36 @@ class TorrentBytesProvider(TorrentProvider): # pylint: disable=too-many-instanc
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "TorrentBytes")
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = False
# URLs
self.url = 'https://www.torrentbytes.net'
self.urls = {
'base_url': 'https://www.torrentbytes.net',
'base_url': self.url,
'login': 'https://www.torrentbytes.net/takelogin.php',
'detail': 'https://www.torrentbytes.net/details.php?id=%s',
'search': 'https://www.torrentbytes.net/browse.php?search=%s%s',
'download': 'https://www.torrentbytes.net/download.php?id=%s&name=%s'
}
self.url = self.urls['base_url']
# Categories
self.categories = "&c41=1&c33=1&c38=1&c32=1&c37=1"
# Proper Strings
self.proper_strings = ['PROPER', 'REPACK']
# Cache
self.cache = tvcache.TVCache(self)
def login(self):
......@@ -96,6 +103,7 @@ class TorrentBytesProvider(TorrentProvider): # pylint: disable=too-many-instanc
data = self.get_url(search_url)
if not data:
logger.log(u"No data returned from provider", logger.DEBUG)
continue
try:
......@@ -154,8 +162,10 @@ class TorrentBytesProvider(TorrentProvider): # pylint: disable=too-many-instanc
size = convert_size(torrent_size) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s with %s seeders and %s leechers" % (title, seeders, leechers), logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
......@@ -164,7 +174,6 @@ class TorrentBytesProvider(TorrentProvider): # pylint: disable=too-many-instanc
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
......@@ -31,35 +31,38 @@ class TorrentDayProvider(TorrentProvider): # pylint: disable=too-many-instance-
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "TorrentDay")
self._uid = None
self._hash = None
# Credentials
self.username = None
self.password = None
self._uid = None
self._hash = None
# Torrent Stats
self.ratio = None
self.freeleech = False
self.minseed = None
self.minleech = None
self.freeleech = False
self.cache = tvcache.TVCache(self, min_time=10) # Only poll IPTorrents every 10 minutes max
# URLs
self.url = 'https://classic.torrentday.com'
self.urls = {
'base_url': 'https://classic.torrentday.com',
'base_url': self.url,
'login': 'https://classic.torrentday.com/torrents/',
'search': 'https://classic.torrentday.com/V3/API/API.php',
'download': 'https://classic.torrentday.com/download.php/%s/%s'
}
self.url = self.urls['base_url']
self.cookies = None
self.categories = {'Season': {'c14': 1}, 'Episode': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1},
'RSS': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1, 'c14': 1}}
def login(self):
# Cache
self.cache = tvcache.TVCache(self, min_time=10) # Only poll IPTorrents every 10 minutes max
def login(self):
if any(dict_from_cookiejar(self.session.cookies).values()):
return True
......@@ -133,29 +136,32 @@ class TorrentDayProvider(TorrentProvider): # pylint: disable=too-many-instance-
title = re.sub(r"\[.*\=.*\].*\[/.*\]", "", torrent['name']) if torrent['name'] else None
download_url = self.urls['download'] % (torrent['id'], torrent['fname']) if torrent['id'] and torrent['fname'] else None
seeders = int(torrent['seed']) if torrent['seed'] else 1
leechers = int(torrent['leech']) if torrent['leech'] else 0
torrent_size = torrent['size']
size = convert_size(torrent_size) or -1
if not all([title, download_url]):
continue
seeders = int(torrent['seed']) if torrent['seed'] else 1
leechers = int(torrent['leech']) if torrent['leech'] else 0
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
continue
torrent_size = torrent['size']
size = convert_size(torrent_size) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s with %s seeders and %s leechers" % (title, seeders, leechers), logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
# For each search mode sort all the items by seeders if available if available
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
......@@ -33,22 +33,30 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "TorrentLeech")
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# URLs
self.url = 'https://torrentleech.org'
self.urls = {
'login': self.url + '/user/account/login/',
'search': self.url + '/torrents/browse',
}
# Proper Strings
self.proper_strings = ['PROPER', 'REPACK']
# Cache
self.cache = tvcache.TVCache(self)
def login(self):
......@@ -81,10 +89,24 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
# TV, Episodes, BoxSets, Episodes HD, Animation, Anime, Cartoons
# 2,26,27,32,7,34,35
# Units
units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def process_column_header(td):
result = ''
if td.a:
result = td.a.get('title')
if not result:
result = td.get_text(strip=True)
return result
for mode in search_strings:
items = []
logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
for search_string in search_strings[mode]:
if mode != 'RSS':
logger.log(u"Search string: %s " % search_string, logger.DEBUG)
......@@ -103,9 +125,9 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
search_url = "%s?%s" % (self.urls['search'], urlencode(search_params))
logger.log(u"Search URL: %s" % search_url, logger.DEBUG)
# returns top 15 results by default, expandable in user profile to 100
data = self.get_url(search_url)
if not data:
logger.log(u"No data returned from provider", logger.DEBUG)
continue
with BS4Parser(data, 'html5lib') as html:
......@@ -117,16 +139,9 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG)
continue
def process_column_header(td):
result = ''
if td.a:
result = td.a.get('title')
if not result:
result = td.get_text(strip=True)
return result
labels = [process_column_header(label) for label in torrent_rows[0].find_all('th')]
# Skip column headers
for result in torrent_rows[1:]:
try:
title = result.find('td', class_='name').find('a').get_text(strip=True)
......@@ -136,17 +151,23 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
seeders = try_int(result.find('td', class_='seeders').get_text(strip=True))
leechers = try_int(result.find('td', class_='leechers').get_text(strip=True))
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
logger.log(u"Discarding torrent because it doesn't meet the"
u" minimum seeders or leechers: {} (S:{} L:{})".format
(title, seeders, leechers), logger.DEBUG)
continue
torrent_size = result.find_all('td')[labels.index('Size')].get_text()
size = convert_size(torrent_size) or -1
size = convert_size(torrent_size, units=units) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s with %s seeders and %s leechers" % (title, seeders, leechers), logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
except StandardError:
......@@ -154,7 +175,6 @@ class TorrentLeechProvider(TorrentProvider): # pylint: disable=too-many-instanc
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
......@@ -32,16 +32,26 @@ class TorrentProjectProvider(TorrentProvider): # pylint: disable=too-many-insta
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "TorrentProject")
# Credentials
self.public = True
# Torrent Stats
self.ratio = 0
self.minseed = None
self.minleech = None
# URLs
self.urls = {'api': u'https://torrentproject.se/', }
self.url = self.urls['api']
self.custom_url = None
self.headers.update({'User-Agent': USER_AGENT})
self.minseed = None
self.minleech = None
# Proper Strings
# Cache
self.cache = tvcache.TVCache(self, search_params={'RSS': ['0day']})
def search(self, search_strings, age=0, ep_obj=None): # pylint: disable=too-many-locals
......@@ -49,7 +59,9 @@ class TorrentProjectProvider(TorrentProvider): # pylint: disable=too-many-insta
for mode in search_strings: # Mode = RSS, Season, Episode
items = []
logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
for search_string in search_strings[mode]:
if mode != 'RSS':
logger.log(u"Search string: %s " % search_string, logger.DEBUG)
......@@ -98,13 +110,13 @@ class TorrentProjectProvider(TorrentProvider): # pylint: disable=too-many-insta
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s" % title, logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
# For each search mode sort all the items by seeders
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
......@@ -34,22 +34,32 @@ class TorrentzProvider(TorrentProvider): # pylint: disable=too-many-instance-at
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "Torrentz")
# Credentials
self.public = True
self.confirmed = True
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.cache = tvcache.TVCache(self, min_time=15) # only poll Torrentz every 15 minutes max
self.headers.update({'User-Agent': USER_AGENT})
self.urls = {'verified': 'https://torrentz.eu/feed_verified',
# URLs
self.url = 'https://torrentz.eu/'
self.urls = {
'verified': 'https://torrentz.eu/feed_verified',
'feed': 'https://torrentz.eu/feed',
'base': 'https://torrentz.eu/'}
self.url = self.urls['base']
'base': self.url,
}
self.headers.update({'User-Agent': USER_AGENT})
def seed_ratio(self):
return self.ratio
# Proper Strings
# Cache
self.cache = tvcache.TVCache(self, min_time=15) # only poll Torrentz every 15 minutes max
@staticmethod
def _split_description(description):
......@@ -103,8 +113,7 @@ class TorrentzProvider(TorrentProvider): # pylint: disable=too-many-instance-at
continue
items.append((title, download_url, size, seeders, leechers))
except (AttributeError, TypeError, KeyError, ValueError):
except StandardError:
logger.log(u"Failed parsing provider. Traceback: %r" % traceback.format_exc(), logger.ERROR)
# For each search mode sort all the items by seeders if available
......@@ -113,4 +122,7 @@ class TorrentzProvider(TorrentProvider): # pylint: disable=too-many-instance-at
return results
def seed_ratio(self):
return self.ratio
provider = TorrentzProvider()
......@@ -19,8 +19,8 @@
import re
import traceback
from urllib import urlencode
from requests.utils import dict_from_cookiejar
from urllib import urlencode
from sickbeard import logger, tvcache
from sickbeard.bs4_parser import BS4Parser
......@@ -34,23 +34,30 @@ class TransmitTheNetProvider(TorrentProvider): # pylint: disable=too-many-insta
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "TransmitTheNet")
self.urls = {
'base_url': 'https://transmithe.net/',
'login': 'https://transmithe.net/login.php',
'search': 'https://transmithe.net/torrents.php',
}
self.url = self.urls['base_url']
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# URLs
self.url = 'https://transmithe.net/'
self.urls = {
'login': 'https://transmithe.net/login.php',
'search': 'https://transmithe.net/torrents.php',
'base_url': self.url,
}
# Proper Strings
# Cache
self.cache = tvcache.TVCache(self)
def _check_auth(self):
......@@ -120,6 +127,7 @@ class TransmitTheNetProvider(TorrentProvider): # pylint: disable=too-many-insta
continue
torrent_rows = torrent_table.findAll('tr', {'class': 'torrent'})
# Continue only if one Release is found
if not torrent_rows:
logger.log(u"Data returned from %s does not contain any torrents" % self.name, logger.DEBUG)
......@@ -142,34 +150,35 @@ class TransmitTheNetProvider(TorrentProvider): # pylint: disable=too-many-insta
title = torrent_row.find('a', onmouseout='return nd();').string
title = title.replace("[", "").replace("]", "").replace("/ ", "") if title else ''
torrent_size = temp_anchor['data-filesize']
size = convert_size(torrent_size) or -1
temp_anchor = torrent_row.find('span', class_='time').parent.find_next_sibling()
seeders = try_int(temp_anchor.text.strip())
leechers = try_int(temp_anchor.find_next_sibling().text.strip())
if not all([title, download_url]):
continue
seeders = try_int(temp_anchor.text.strip())
leechers = try_int(temp_anchor.find_next_sibling().text.strip())
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
logger.log(u"Discarding torrent because it doesn't meet the"
u" minimum seeders or leechers: {} (S:{} L:{})".format
(title, seeders, leechers), logger.DEBUG)
continue
torrent_size = temp_anchor['data-filesize']
size = convert_size(torrent_size) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s with %s seeders and %s leechers" % (title, seeders, leechers), logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
except Exception:
logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR)
# For each search mode sort all the items by seeders
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
# coding=utf-8
#
# URL: https://sickrage.github.io
#
# This file is part of SickRage.
#
# SickRage is free software: you can redistribute it and/or modify
......@@ -26,9 +29,23 @@ from sickrage.providers.torrent.TorrentProvider import TorrentProvider
class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-attributes
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, 'TvChaosUK')
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# URLs
self.url = 'https://tvchaosuk.com/'
self.urls = {
'login': self.url + 'takelogin.php',
......@@ -36,13 +53,9 @@ class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-a
'search': self.url + 'browse.php'
}
self.username = None
self.password = None
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# Proper Strings
# Cache
self.cache = tvcache.TVCache(self)
def _check_auth(self):
......@@ -81,6 +94,7 @@ class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-a
if not self.login():
return results
# Search Params
search_params = {
'do': 'search',
'search_type': 't_name',
......@@ -89,9 +103,13 @@ class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-a
'submit': 'search'
}
# Units
units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
for mode in search_strings:
items = []
logger.log(u"Search Mode: {}".format(mode), logger.DEBUG)
for search_string in search_strings[mode]:
if mode == 'Season':
......@@ -129,10 +147,12 @@ class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-a
seeders = try_int(torrent.find(title='Seeders').get_text(strip=True))
leechers = try_int(torrent.find(title='Leechers').get_text(strip=True))
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the"
"minimum seeders or leechers: {} (S:{} L:{})".format
u" minimum seeders or leechers: {} (S:{} L:{})".format
(title, seeders, leechers), logger.DEBUG)
continue
......@@ -151,20 +171,19 @@ class TVChaosUKProvider(TorrentProvider): # pylint: disable=too-many-instance-a
title = re.sub(ur'\s+', ur' ', title)
torrent_size = torrent.find_all('td')[labels.index('Size')].get_text(strip=True)
size = convert_size(torrent_size) or -1
size = convert_size(torrent_size, units=units) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
except Exception:
except StandardError:
continue
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
# -*- coding: latin-1 -*-
# coding=utf-8
# Author: adaur <adaur.underground@gmail.com>
# Rewrite: Dustyn Gibson (miigotu) <miigotu@gmail.com>
# URL: https://sickrage.github.io
......@@ -33,43 +33,53 @@ class XthorProvider(TorrentProvider): # pylint: disable=too-many-instance-attri
def __init__(self):
# Provider Init
TorrentProvider.__init__(self, "Xthor")
# Credentials
self.username = None
self.password = None
# Torrent Stats
self.ratio = None
self.minseed = None
self.minleech = None
self.freeleech = None
# URLs
self.url = 'https://xthor.bz'
self.urls = {
'login': self.url + '/takelogin.php',
'search': self.url + '/browse.php?'
}
self.ratio = None
self.minseed = None
self.minleech = None
self.username = None
self.password = None
self.freeleech = None
# Proper Strings
self.proper_strings = ['PROPER']
# Cache
self.cache = tvcache.TVCache(self, min_time=30)
def login(self):
if any(dict_from_cookiejar(self.session.cookies).values()):
return True
login_params = {'username': self.username,
login_params = {
'username': self.username,
'password': self.password,
'submitme': 'X'}
'submitme': 'X'
}
response = self.get_url(self.urls['login'], post_data=login_params, timeout=30)
if not response:
logger.log(u"Unable to connect to provider", logger.WARNING)
return False
if re.search('donate.php', response):
return True
else:
if not re.search('donate.php', response):
logger.log(u"Invalid username or password. Check your settings", logger.WARNING)
return False
return True
def search(self, search_strings, age=0, ep_obj=None): # pylint: disable=too-many-locals, too-many-branches
results = []
if not self.login():
......@@ -84,6 +94,8 @@ class XthorProvider(TorrentProvider): # pylint: disable=too-many-instance-attri
Mangas (Anime) 32
Sport 34
"""
# Search Params
search_params = {
'only_free': try_int(self.freeleech),
'searchin': 'title',
......@@ -93,21 +105,36 @@ class XthorProvider(TorrentProvider): # pylint: disable=too-many-instance-attri
'c16': 1, 'c17': 1, 'c32': 1
}
# Units
units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def process_column_header(td):
result = ''
if td.a:
result = td.a.get('title', td.a.get_text(strip=True))
if not result:
result = td.get_text(strip=True)
return result
for mode in search_strings:
items = []
logger.log(u"Search Mode: %s" % mode, logger.DEBUG)
# Sorting: 1: Name, 3: Comments, 5: Size, 6: Completed, 7: Seeders, 8: Leechers (4: Time ?)
search_params['sort'] = (7, 4)[mode == 'RSS']
for search_string in search_strings[mode]:
if mode != 'RSS':
logger.log(u"Search string: %s " % search_string, logger.DEBUG)
search_params['search'] = search_string
search_url = self.urls['search'] + urlencode(search_params)
logger.log(u"Search URL: %s" % search_url, logger.DEBUG)
data = self.get_url(search_url)
if not data:
logger.log(u"No data returned from provider", logger.DEBUG)
continue
with BS4Parser(data, 'html5lib') as html:
......@@ -121,21 +148,15 @@ class XthorProvider(TorrentProvider): # pylint: disable=too-many-instance-attri
logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG)
continue
def process_column_header(td):
result = ''
if td.a:
result = td.a.get('title', td.a.get_text(strip=True))
if not result:
result = td.get_text(strip=True)
return result
# Catégorie, Nom du Torrent, (Download), (Bookmark), Com., Taille, Compl�t�, Seeders, Leechers
labels = [process_column_header(label) for label in torrent_rows[0].find_all('td')]
# Skip column headers
for row in torrent_rows[1:]:
cells = row.find_all('td')
if len(cells) < len(labels):
continue
try:
title = cells[labels.index('Nom du Torrent')].get_text(strip=True)
download_url = self.url + '/' + row.find("a", href=re.compile("download.php"))['href']
......@@ -148,21 +169,26 @@ class XthorProvider(TorrentProvider): # pylint: disable=too-many-instance-attri
# Filter unseeded torrent
if seeders < self.minseed or leechers < self.minleech:
if mode != 'RSS':
logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG)
logger.log(u"Discarding torrent because it doesn't meet the"
u" minimum seeders or leechers: {} (S:{} L:{})".format
(title, seeders, leechers), logger.DEBUG)
continue
size = convert_size(cells[labels.index('Taille')].get_text(strip=True))
torrent_size = cells[labels.index('Taille')].get_text()
size = convert_size(torrent_size, units=units) or -1
item = title, download_url, size, seeders, leechers
if mode != 'RSS':
logger.log(u"Found result: %s with %s seeders and %s leechers" % (title, seeders, leechers), logger.DEBUG)
logger.log(u"Found result: {} with {} seeders and {} leechers".format
(title, seeders, leechers), logger.DEBUG)
items.append(item)
except StandardError:
continue
# For each search mode sort all the items by seeders if available if available
# For each search mode sort all the items by seeders if available
items.sort(key=lambda tup: tup[3], reverse=True)
results += items
return results
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment