diff --git a/NyaaPy/nyaa.py b/NyaaPy/nyaa.py index 550985f..8e1dd81 100644 --- a/NyaaPy/nyaa.py +++ b/NyaaPy/nyaa.py @@ -1,54 +1,54 @@ -import requests -import urllib.parse -from bs4 import BeautifulSoup -from NyaaPy.utils import utils - -class Nyaa: - - def __init__(self): - self.URI = "http://nyaa.si" - - def search(self, keyword, **kwargs): - user = kwargs.get('user', None) - category = kwargs.get('category', 0) - subcategory = kwargs.get('subcategory', 0) - filters = kwargs.get('filters', 0) - page = kwargs.get('page', 0) - - if user: - user_uri = "user/{}".format(user) - else: - user_uri = "" - - if page > 0: - r = requests.get("{}/{}?f={}&c={}_{}&q={}&p={}".format( - self.URI, user_uri, filters, category, subcategory, keyword, - page)) - else: - r = requests.get("{}/{}?f={}&c={}_{}&q={}".format( - self.URI, user_uri, filters, category, subcategory, keyword)) - - soup = BeautifulSoup(r.text, 'html.parser') - rows = soup.select('table tr') - - return utils.parse_nyaa(rows, limit=None) - - def get(self, id): - r = requests.get("{}/view/{}".format(self.URI, id)) - soup = BeautifulSoup(r.text, 'html.parser') - content = soup.findAll("div", {"class": "panel", "id": None}) - - return utils.parse_single(content) - - def get_user(self, username): - r = requests.get("{}/user/{}".format(self.URI, username)) - soup = BeautifulSoup(r.text, 'html.parser') - - return utils.parse_nyaa(soup.select('table tr'), limit=None) - - def news(self, number_of_results): - r = requests.get(self.URI) - soup = BeautifulSoup(r.text, 'html.parser') - rows = soup.select('table tr') - - return utils.parse_nyaa(rows, limit=number_of_results + 1) +import requests +import urllib.parse +from bs4 import BeautifulSoup +from NyaaPy import utils + +class Nyaa: + + def __init__(self): + self.URI = "http://nyaa.si" + + def search(self, keyword, **kwargs): + user = kwargs.get('user', None) + category = kwargs.get('category', 0) + subcategory = kwargs.get('subcategory', 0) + filters = kwargs.get('filters', 0) + page = kwargs.get('page', 0) + + if user: + user_uri = "user/{}".format(user) + else: + user_uri = "" + + if page > 0: + r = requests.get("{}/{}?f={}&c={}_{}&q={}&p={}".format( + self.URI, user_uri, filters, category, subcategory, keyword, + page)) + else: + r = requests.get("{}/{}?f={}&c={}_{}&q={}".format( + self.URI, user_uri, filters, category, subcategory, keyword)) + + soup = BeautifulSoup(r.text, 'html.parser') + rows = soup.select('table tr') + + return utils.parse_nyaa(rows, limit=None) + + def get(self, id): + r = requests.get("{}/view/{}".format(self.URI, id)) + soup = BeautifulSoup(r.text, 'html.parser') + content = soup.findAll("div", {"class": "panel", "id": None}) + + return utils.parse_single(content) + + def get_user(self, username): + r = requests.get("{}/user/{}".format(self.URI, username)) + soup = BeautifulSoup(r.text, 'html.parser') + + return utils.parse_nyaa(soup.select('table tr'), limit=None) + + def news(self, number_of_results): + r = requests.get(self.URI) + soup = BeautifulSoup(r.text, 'html.parser') + rows = soup.select('table tr') + + return utils.parse_nyaa(rows, limit=number_of_results + 1) diff --git a/NyaaPy/pantsu.py b/NyaaPy/pantsu.py index 3caf98a..7557774 100644 --- a/NyaaPy/pantsu.py +++ b/NyaaPy/pantsu.py @@ -1,40 +1,40 @@ -import requests -from NyaaPy.utils import utils - -class Pantsu: - - def __init__(self): - self.BASE_URL = "https://nyaa.pantsu.cat/api" - - # Torrents - GET - def search(self, keyword, **kwargs): - request = requests.get("{}/search{}".format( - self.BASE_URL, utils.query_builder(keyword, kwargs))) - return request.json() - - def view(self, item_id): - request = requests.get("{}/view/{}".format(self.BASE_URL, item_id)) - - return request.json() - - # Torrents - POST - - def upload(self): - return "Work in progress!" - - def update(self): - return "Work in progress!" - - # Users - - def login(self, username, password): - login = requests.post("{}/login/".format( - self.BASE_URL), data={'username': username, 'password': password}) - - return login.json() - - def profile(self, user_id): - profile = requests.post("{}/profile/".format( - self.BASE_URL), data={'id': user_id}) - - return profile.json() +import requests +from NyaaPy import utils + +class Pantsu: + + def __init__(self): + self.BASE_URL = "https://nyaa.pantsu.cat/api" + + # Torrents - GET + def search(self, keyword, **kwargs): + request = requests.get("{}/search{}".format( + self.BASE_URL, utils.query_builder(keyword, kwargs))) + return request.json() + + def view(self, item_id): + request = requests.get("{}/view/{}".format(self.BASE_URL, item_id)) + + return request.json() + + # Torrents - POST + + def upload(self): + return "Work in progress!" + + def update(self): + return "Work in progress!" + + # Users + + def login(self, username, password): + login = requests.post("{}/login/".format( + self.BASE_URL), data={'username': username, 'password': password}) + + return login.json() + + def profile(self, user_id): + profile = requests.post("{}/profile/".format( + self.BASE_URL), data={'id': user_id}) + + return profile.json() diff --git a/NyaaPy/sukebei.py b/NyaaPy/sukebei.py index 7f03b45..6984ebd 100644 --- a/NyaaPy/sukebei.py +++ b/NyaaPy/sukebei.py @@ -1,84 +1,84 @@ -import requests -from bs4 import BeautifulSoup -from NyaaPy.utils import utils - -class SukebeiNyaa: - def search(self, keyword, **kwargs): - category = kwargs.get('category', 0) - subcategory = kwargs.get('subcategory', 0) - filters = kwargs.get('filters', 0) - page = kwargs.get('page', 0) - - if page > 0: - r = requests.get("{}/?f={}&c={}_{}&q={}&p={}".format( - "http://sukebei.nyaa.si", filters, category, subcategory, - keyword, page)) - else: - r = requests.get("{}/?f={}&c={}_{}&q={}".format( - "http://sukebei.nyaa.si", filters, category, subcategory, - keyword)) - - soup = BeautifulSoup(r.text, 'html.parser') - rows = soup.select('table tr') - - return utils.parse_nyaa(rows, limit=None) - - def get(self, id): - r = requests.get("http://sukebei.nyaa.si/view/{}".format(id)) - soup = BeautifulSoup(r.text, 'html.parser') - content = soup.findAll("div", {"class": "panel", "id": None}) - - return utils.parse_single(content) - - def get_user(self, username): - r = requests.get("http://sukebei.nyaa.si/user/{}".format(username)) - soup = BeautifulSoup(r.text, 'html.parser') - - return utils.parse_nyaa(soup.select('table tr'), limit=None) - - def news(self, number_of_results): - r = requests.get("http://sukebei.nyaa.si/") - soup = BeautifulSoup(r.text, 'html.parser') - rows = soup.select('table tr') - - return utils.parse_sukebei(rows, limit=number_of_results + 1) - - -class SukebeiPantsu: - BASE_URL = "https://sukebei.pantsu.cat/api" - - # Torrents - GET - def search(self, keyword, **kwargs): - request = requests.get("{}/search{}".format( - SukebeiPantsu.BASE_URL, utils.query_builder(keyword, kwargs))) - - return request.json() - - def view(self, item_id): - request = requests.get("{}/view/{}".format( - SukebeiPantsu.BASE_URL, item_id)) - - return request.json() - - # Torrents - POST - - def upload(self): - return "Work in progress!" - - def update(self): - return "Work in progress!" - - # Users - - def login(self, username, password): - login = requests.post("{}/login/".format( - SukebeiPantsu.BASE_URL), data={'username': username, - 'password': password}) - - return login.json() - - def profile(self, user_id): - profile = requests.post("{}/profile/".format( - SukebeiPantsu.BASE_URL), data={'id': user_id}) - - return profile.json() +import requests +from bs4 import BeautifulSoup +from NyaaPy import utils + +class SukebeiNyaa: + def search(self, keyword, **kwargs): + category = kwargs.get('category', 0) + subcategory = kwargs.get('subcategory', 0) + filters = kwargs.get('filters', 0) + page = kwargs.get('page', 0) + + if page > 0: + r = requests.get("{}/?f={}&c={}_{}&q={}&p={}".format( + "http://sukebei.nyaa.si", filters, category, subcategory, + keyword, page)) + else: + r = requests.get("{}/?f={}&c={}_{}&q={}".format( + "http://sukebei.nyaa.si", filters, category, subcategory, + keyword)) + + soup = BeautifulSoup(r.text, 'html.parser') + rows = soup.select('table tr') + + return utils.parse_nyaa(rows, limit=None) + + def get(self, id): + r = requests.get("http://sukebei.nyaa.si/view/{}".format(id)) + soup = BeautifulSoup(r.text, 'html.parser') + content = soup.findAll("div", {"class": "panel", "id": None}) + + return utils.parse_single(content) + + def get_user(self, username): + r = requests.get("http://sukebei.nyaa.si/user/{}".format(username)) + soup = BeautifulSoup(r.text, 'html.parser') + + return utils.parse_nyaa(soup.select('table tr'), limit=None) + + def news(self, number_of_results): + r = requests.get("http://sukebei.nyaa.si/") + soup = BeautifulSoup(r.text, 'html.parser') + rows = soup.select('table tr') + + return utils.parse_sukebei(rows, limit=number_of_results + 1) + + +class SukebeiPantsu: + BASE_URL = "https://sukebei.pantsu.cat/api" + + # Torrents - GET + def search(self, keyword, **kwargs): + request = requests.get("{}/search{}".format( + SukebeiPantsu.BASE_URL, utils.query_builder(keyword, kwargs))) + + return request.json() + + def view(self, item_id): + request = requests.get("{}/view/{}".format( + SukebeiPantsu.BASE_URL, item_id)) + + return request.json() + + # Torrents - POST + + def upload(self): + return "Work in progress!" + + def update(self): + return "Work in progress!" + + # Users + + def login(self, username, password): + login = requests.post("{}/login/".format( + SukebeiPantsu.BASE_URL), data={'username': username, + 'password': password}) + + return login.json() + + def profile(self, user_id): + profile = requests.post("{}/profile/".format( + SukebeiPantsu.BASE_URL), data={'id': user_id}) + + return profile.json() diff --git a/NyaaPy/utils.py b/NyaaPy/utils.py index 0f418b2..de46e4b 100644 --- a/NyaaPy/utils.py +++ b/NyaaPy/utils.py @@ -1,253 +1,253 @@ -''' - Module utils -''' - -import re - -def nyaa_categories(b): - c = b.replace('/?c=', '') - cats = c.split('_') - - cat = cats[0] - subcat = cats[1] - - categories = { - "1": { - "name": "Anime", - "subcats": { - "1": "Anime Music Video", - "2": "English-translated", - "3": "Non-English-translated", - "4": "Raw" - } - }, - "2": { - "name": "Audio", - "subcats": { - "1": "Lossless", - "2": "Lossy" - } - }, - "3": { - "name": "Literature", - "subcats": { - "1": "English-translated", - "2": "Non-English-translated", - "3": "Raw" - } - }, - "4": { - "name": "Live Action", - "subcats": { - "1": "English-translated", - "2": "Idol/Promotional Video", - "3": "Non-English-translated", - "4": "Raw" - } - }, - "5": { - "name": "Pictures", - "subcats": { - "1": "Graphics", - "2": "Photos" - } - }, - "6": { - "name": "Software", - "subcats": { - "1": "Applications", - "2": "Games" - } - } - } - - try: - category_name = "{} - {}".format( - categories[cat]['name'], categories[cat]['subcats'][subcat]) - except Exception: - pass - - return category_name - -def parse_nyaa(table_rows, limit): - if limit == 0: - limit = len(table_rows) - - torrents = [] - - for row in table_rows[:limit]: - block = [] - - for td in row.find_all('td'): - if td.find_all('a'): - for link in td.find_all('a'): - if link.get('href')[-9:] != '#comments': - block.append(link.get('href')) - if link.text.rstrip(): - block.append(link.text) - - if td.text.rstrip(): - block.append(td.text.rstrip()) - - if row.has_attr('class'): - if row['class'][0] == 'danger': - block.append("remake") - elif row['class'][0] == 'success': - block.append("trusted") - else: - block.append("default") - - try: - torrent = { - 'id': block[1].replace("/view/", ""), - 'category': nyaa_categories(block[0]), - 'url': "http://nyaa.si{}".format(block[1]), - 'name': block[2], - 'download_url': "http://nyaa.si{}".format(block[4]), - 'magnet': block[5], - 'size': block[6], - 'date': block[7], - 'seeders': block[8], - 'leechers': block[9], - 'completed_downloads': block[10], - 'type': block[11], - } - - torrents.append(torrent) - except IndexError as ie: - pass - - return torrents - -def parse_single(content): - torrent = {} - data = [] - torrent_files = [] - - for row in content[0].find_all('div', {'class': 'row'}): - for div in row.find_all('div', {'class': 'col-md-5'}): - data.append(div.text.replace("\n", "")) - - files = content[2].find('div', - {'class', 'torrent-file-list'}).find_all('li') - - for file in files: - torrent_files.append(file.text) - - torrent['title'] = re.sub('\n|\r|\t', '', content[0].find('h3', { - "class": "panel-title"}).text.replace("\n", "")) - torrent['category'] = data[0] - torrent['uploader'] = data[2] - torrent['uploader_profile'] = "https://nyaa.si/user/{}".format(data[2]) - torrent['website'] = re.sub('\t', '', data[4]) - torrent['size'] = data[6] - torrent['date'] = data[1] - torrent['seeders'] = data[3] - torrent['leechers'] = data[5] - torrent['completed'] = data[7] - torrent['hash'] = data[8] - torrent['description'] = re.sub('\t', '', content[1].find('div', { - 'id': 'torrent-description'}).text) - torrent['files'] = torrent_files - - return torrent - -def parse_sukebei(table_rows, limit): - if limit == 0: - limit = len(table_rows) - - torrents = [] - - for row in table_rows[:limit]: - block = [] - - for td in row.find_all('td'): - for link in td.find_all('a'): - if link.get('href')[-9:] != '#comments': - block.append(link.get('href')) - block.append(link.text.rstrip()) - - if td.text.rstrip(): - block.append(td.text.rstrip()) - - try: - torrent = { - 'id': block[1].replace("/view/", ""), - 'category': sukebei_categories(block[0]), - 'url': "http://sukebei.nyaa.si{}".format(block[1]), - 'name': block[2], - 'download_url': "http://sukebei.nyaa.si{}".format( - block[4]), - 'magnet': block[5], - 'size': block[6], - 'date': block[7], - 'seeders': block[8], - 'leechers': block[9], - 'completed_downloads': block[10], - } - except IndexError as ie: - pass - - torrents.append(torrent) - - return torrents - -def sukebei_categories(b): - c = b.replace('/?c=', '') - cats = c.split('_') - - cat = cats[0] - subcat = cats[1] - - categories = { - "1": { - "name": "Art", - "subcats": { - "1": "Anime", - "2": "Doujinshi", - "3": "Games", - "4": "Manga", - "5": "Pictures", - } - }, - "2": { - "name": "Real Life", - "subcats": { - "1": "Photobooks & Pictures", - "2": "Videos" - } - } - } - - try: - category_name = "{} - {}".format( - categories[cat]['name'], categories[cat]['subcats'][subcat]) - except Exception: - pass - - return category_name - -# Pantsu Utils -def query_builder(q, params): - available_params = ["category", "page", "limit", "userID", "fromID", - "status", "maxage", "toDate", "fromDate", - "dateType", "minSize", "maxSize", "sizeType", - "sort", "order", "lang"] - query = "?q={}".format(q.replace(" ", "+")) - - for param, value in params.items(): - if param in available_params: - if (param != "category" and param != "status" and - param != "lang"): - query += "&{}={}".format(param, value) - elif param == "category": - query += "&c={}_{}".format(value[0], value[1]) - - elif param == "status": - query += "&s={}".format(value) - - elif param == "lang": - for lang in value: - query += "&lang={}".format(lang) - - return query +''' + Module utils +''' + +import re + +def nyaa_categories(b): + c = b.replace('/?c=', '') + cats = c.split('_') + + cat = cats[0] + subcat = cats[1] + + categories = { + "1": { + "name": "Anime", + "subcats": { + "1": "Anime Music Video", + "2": "English-translated", + "3": "Non-English-translated", + "4": "Raw" + } + }, + "2": { + "name": "Audio", + "subcats": { + "1": "Lossless", + "2": "Lossy" + } + }, + "3": { + "name": "Literature", + "subcats": { + "1": "English-translated", + "2": "Non-English-translated", + "3": "Raw" + } + }, + "4": { + "name": "Live Action", + "subcats": { + "1": "English-translated", + "2": "Idol/Promotional Video", + "3": "Non-English-translated", + "4": "Raw" + } + }, + "5": { + "name": "Pictures", + "subcats": { + "1": "Graphics", + "2": "Photos" + } + }, + "6": { + "name": "Software", + "subcats": { + "1": "Applications", + "2": "Games" + } + } + } + + try: + category_name = "{} - {}".format( + categories[cat]['name'], categories[cat]['subcats'][subcat]) + except Exception: + pass + + return category_name + +def parse_nyaa(table_rows, limit): + if limit == 0: + limit = len(table_rows) + + torrents = [] + + for row in table_rows[:limit]: + block = [] + + for td in row.find_all('td'): + if td.find_all('a'): + for link in td.find_all('a'): + if link.get('href')[-9:] != '#comments': + block.append(link.get('href')) + if link.text.rstrip(): + block.append(link.text) + + if td.text.rstrip(): + block.append(td.text.rstrip()) + + if row.has_attr('class'): + if row['class'][0] == 'danger': + block.append("remake") + elif row['class'][0] == 'success': + block.append("trusted") + else: + block.append("default") + + try: + torrent = { + 'id': block[1].replace("/view/", ""), + 'category': nyaa_categories(block[0]), + 'url': "http://nyaa.si{}".format(block[1]), + 'name': block[2], + 'download_url': "http://nyaa.si{}".format(block[4]), + 'magnet': block[5], + 'size': block[6], + 'date': block[7], + 'seeders': block[8], + 'leechers': block[9], + 'completed_downloads': block[10], + 'type': block[11], + } + + torrents.append(torrent) + except IndexError as ie: + pass + + return torrents + +def parse_single(content): + torrent = {} + data = [] + torrent_files = [] + + for row in content[0].find_all('div', {'class': 'row'}): + for div in row.find_all('div', {'class': 'col-md-5'}): + data.append(div.text.replace("\n", "")) + + files = content[2].find('div', + {'class', 'torrent-file-list'}).find_all('li') + + for file in files: + torrent_files.append(file.text) + + torrent['title'] = re.sub('\n|\r|\t', '', content[0].find('h3', { + "class": "panel-title"}).text.replace("\n", "")) + torrent['category'] = data[0] + torrent['uploader'] = data[2] + torrent['uploader_profile'] = "https://nyaa.si/user/{}".format(data[2]) + torrent['website'] = re.sub('\t', '', data[4]) + torrent['size'] = data[6] + torrent['date'] = data[1] + torrent['seeders'] = data[3] + torrent['leechers'] = data[5] + torrent['completed'] = data[7] + torrent['hash'] = data[8] + torrent['description'] = re.sub('\t', '', content[1].find('div', { + 'id': 'torrent-description'}).text) + torrent['files'] = torrent_files + + return torrent + +def parse_sukebei(table_rows, limit): + if limit == 0: + limit = len(table_rows) + + torrents = [] + + for row in table_rows[:limit]: + block = [] + + for td in row.find_all('td'): + for link in td.find_all('a'): + if link.get('href')[-9:] != '#comments': + block.append(link.get('href')) + block.append(link.text.rstrip()) + + if td.text.rstrip(): + block.append(td.text.rstrip()) + + try: + torrent = { + 'id': block[1].replace("/view/", ""), + 'category': sukebei_categories(block[0]), + 'url': "http://sukebei.nyaa.si{}".format(block[1]), + 'name': block[2], + 'download_url': "http://sukebei.nyaa.si{}".format( + block[4]), + 'magnet': block[5], + 'size': block[6], + 'date': block[7], + 'seeders': block[8], + 'leechers': block[9], + 'completed_downloads': block[10], + } + except IndexError as ie: + pass + + torrents.append(torrent) + + return torrents + +def sukebei_categories(b): + c = b.replace('/?c=', '') + cats = c.split('_') + + cat = cats[0] + subcat = cats[1] + + categories = { + "1": { + "name": "Art", + "subcats": { + "1": "Anime", + "2": "Doujinshi", + "3": "Games", + "4": "Manga", + "5": "Pictures", + } + }, + "2": { + "name": "Real Life", + "subcats": { + "1": "Photobooks & Pictures", + "2": "Videos" + } + } + } + + try: + category_name = "{} - {}".format( + categories[cat]['name'], categories[cat]['subcats'][subcat]) + except Exception: + pass + + return category_name + +# Pantsu Utils +def query_builder(q, params): + available_params = ["category", "page", "limit", "userID", "fromID", + "status", "maxage", "toDate", "fromDate", + "dateType", "minSize", "maxSize", "sizeType", + "sort", "order", "lang"] + query = "?q={}".format(q.replace(" ", "+")) + + for param, value in params.items(): + if param in available_params: + if (param != "category" and param != "status" and + param != "lang"): + query += "&{}={}".format(param, value) + elif param == "category": + query += "&c={}_{}".format(value[0], value[1]) + + elif param == "status": + query += "&s={}".format(value) + + elif param == "lang": + for lang in value: + query += "&lang={}".format(lang) + + return query diff --git a/tests/test.py b/tests/test.py index 0455e34..bed0c60 100644 --- a/tests/test.py +++ b/tests/test.py @@ -1,8 +1,7 @@ -from NyaaPy import Pantsu, Nyaa - -pantsu = Pantsu() -nyaa = Nyaa() - -# print(pantsu.search(keyword='koe no katachi', -# lang=["es", "ja"], category=[1, 3])) -print(nyaa.search(keyword='yuru camp')) +from NyaaPy import Pantsu, Nyaa + +pantsu = Pantsu() +nyaa = Nyaa() + +print(pantsu.search(keyword='koe no katachi', + lang=["es", "ja"], category=[1, 3])) \ No newline at end of file