diff --git a/sickbeard/providers/yggtorrent.py b/sickbeard/providers/yggtorrent.py index 01d7986baffdd108ae960434e1ff16c18f5265ba..55d15161f6f9f535f90ed11617fc54f702eb8f00 100644 --- a/sickbeard/providers/yggtorrent.py +++ b/sickbeard/providers/yggtorrent.py @@ -48,7 +48,7 @@ class YggTorrentProvider(TorrentProvider): # pylint: disable=too-many-instance- self.minleech = None # URLs - self.url = 'https://yggtorrent.com/' + self.url = 'https://yggtorrent.is/' self.urls = { 'login': urljoin(self.url, 'user/login'), 'search': urljoin(self.url, 'engine/search') @@ -69,16 +69,25 @@ class YggTorrentProvider(TorrentProvider): # pylint: disable=too-many-instance- 'pass': self.password, } - response = self.get_url(self.urls['login'], post_data=login_params, returns='text') - if not response: # When you call /login if it's OK, it's return 200 with no body, i retry in main if it's logged ! - response = self.get_url(self.url, returns='text') - if not response: # The provider is dead !!! - logger.log('Unable to connect to provider', logger.WARNING) - return False + response = self.get_url(self.urls['login'], post_data=login_params, returns='response') - if 'logout' not in response: + # The login is now an AJAX call (401 : Bad credentials, 200 : Logged in, other : server failure) + if response.status_code == 401: logger.log('Invalid username or password. Check your settings', logger.WARNING) return False + elif response.status_code == 200: + # It seems we are logged, let's verify that ! + response = self.get_url(self.url, returns='response') + + if response.status_code != 200: + logger.log('Unable to connect to provider', logger.WARNING) + return False + if 'logout' not in response.text: + logger.log('Invalid username or password. Check your settings', logger.WARNING) + return False + else: + logger.log('Unable to connect to provider', logger.WARNING) + return False return True @@ -112,15 +121,16 @@ class YggTorrentProvider(TorrentProvider): # pylint: disable=too-many-instance- try: search_params = { 'category': "2145", - 'subcategory' : "2184", - 'q': re.sub(r'[()]', '', search_string) + 'sub_category' : "2184", + 'name': re.sub(r'[()]', '', search_string), + 'do': 'search' } data = self.get_url(self.urls['search'], params=search_params, returns='text') if not data: continue with BS4Parser(data, 'html5lib') as html: - torrent_table = html.find(class_='table table-striped') + torrent_table = html.find(class_='table') torrent_rows = torrent_table('tr') if torrent_table else [] # Continue only if at least one Release is found @@ -131,23 +141,20 @@ class YggTorrentProvider(TorrentProvider): # pylint: disable=too-many-instance- # Skip column headers for result in torrent_rows[1:]: cells = result('td') - if len(cells) < 5: + if len(cells) < 9: continue - download_url = "" - title = cells[0].find('a', class_='torrent-name').get_text(strip=True) - for download_img in cells[0].select('a[href] img'): - if download_img['src'] == urljoin(self.url,"static/icons/icon_download.gif"): - download_url = urljoin(self.url, download_img.parent['href']) - break + title = cells[1].find('a').get_text(strip=True) + id = cells[2].find('a')['target'] + download_url = urljoin(self.url, 'engine/download_torrent?id=' + id) if not (title and download_url): continue - seeders = try_int(cells[4].get_text(strip=True)) - leechers = try_int(cells[5].get_text(strip=True)) + seeders = try_int(cells[7].get_text(strip=True)) + leechers = try_int(cells[8].get_text(strip=True)) - torrent_size = cells[2].get_text() + torrent_size = cells[5].get_text() size = convert_size(torrent_size) or -1 # Filter unseeded torrent