randydev commited on
Commit
e4e3c00
·
verified ·
1 Parent(s): 942b6ab

Create kickass.py

Browse files
Files changed (1) hide show
  1. torrents/kickass.py +139 -0
torrents/kickass.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import re
3
+ import time
4
+ import aiohttp
5
+ from bs4 import BeautifulSoup
6
+ from helper.asyncioPoliciesFix import decorator_asyncio_fix
7
+ from helper.html_scraper import Scraper
8
+ from constants.base_url import KICKASS
9
+ from constants.headers import HEADER_AIO
10
+
11
+
12
+ class Kickass:
13
+ def __init__(self):
14
+ self.BASE_URL = KICKASS
15
+ self.LIMIT = None
16
+
17
+ @decorator_asyncio_fix
18
+ async def _individual_scrap(self, session, url, obj):
19
+ try:
20
+ async with session.get(url, headers=HEADER_AIO) as res:
21
+ html = await res.text(encoding="ISO-8859-1")
22
+ soup = BeautifulSoup(html, "html.parser")
23
+ try:
24
+ poster = soup.find("a", class_="movieCover")
25
+ if poster:
26
+ poster = poster.find("img")["src"]
27
+ obj["poster"] = self.BASE_URL + poster
28
+ imgs = (soup.find("div", class_="data")).find_all("img")
29
+ if imgs and len(imgs) > 0:
30
+ obj["screenshot"] = [img["src"] for img in imgs]
31
+ magnet_and_torrent = soup.find_all("a", class_="kaGiantButton")
32
+ magnet = magnet_and_torrent[0]["href"]
33
+ obj["hash"] = re.search(
34
+ r"([{a-f\d,A-F\d}]{32,40})\b", magnet
35
+ ).group(0)
36
+ obj["magnet"] = magnet
37
+ except:
38
+ ...
39
+ except:
40
+ return None
41
+
42
+ async def _get_torrent(self, result, session, urls):
43
+ tasks = []
44
+ for idx, url in enumerate(urls):
45
+ for obj in result["data"]:
46
+ if obj["url"] == url:
47
+ task = asyncio.create_task(
48
+ self._individual_scrap(session, url, result["data"][idx])
49
+ )
50
+ tasks.append(task)
51
+ await asyncio.gather(*tasks)
52
+ return result
53
+
54
+ def _parser(self, htmls):
55
+ try:
56
+ for html in htmls:
57
+ soup = BeautifulSoup(html, "html.parser")
58
+ list_of_urls = []
59
+ my_dict = {"data": []}
60
+ for tr in soup.select("tr.odd,tr.even"):
61
+ td = tr.find_all("td")
62
+ name = tr.find("a", class_="cellMainLink").text.strip()
63
+ url = self.BASE_URL + tr.find("a", class_="cellMainLink")["href"]
64
+ list_of_urls.append(url)
65
+ if name:
66
+ size = td[1].text.strip()
67
+ seeders = td[4].text.strip()
68
+ leechers = td[5].text.strip()
69
+ uploader = td[2].text.strip()
70
+ date = td[3].text.strip()
71
+
72
+ my_dict["data"].append(
73
+ {
74
+ "name": name,
75
+ "size": size,
76
+ "date": date,
77
+ "seeders": seeders,
78
+ "leechers": leechers,
79
+ "url": url,
80
+ "uploader": uploader,
81
+ }
82
+ )
83
+ if len(my_dict["data"]) == self.LIMIT:
84
+ break
85
+ try:
86
+ pages = soup.find("div", class_="pages")
87
+ current_page = int(pages.find("a", class_="active").text)
88
+ pages = pages.find_all("a")
89
+ total_page = pages[-1].text
90
+ if total_page == ">>":
91
+ total_page = pages[-2].text
92
+ my_dict["current_page"] = current_page
93
+ my_dict["total_pages"] = int(total_page)
94
+ except:
95
+ ...
96
+ return my_dict, list_of_urls
97
+ except:
98
+ return None, None
99
+
100
+ async def search(self, query, page, limit):
101
+ async with aiohttp.ClientSession() as session:
102
+ start_time = time.time()
103
+ self.LIMIT = limit
104
+ url = self.BASE_URL + "/usearch/{}/{}/".format(query, page)
105
+ return await self.parser_result(start_time, url, session)
106
+
107
+ async def parser_result(self, start_time, url, session):
108
+ htmls = await Scraper().get_all_results(session, url)
109
+ result, urls = self._parser(htmls)
110
+ if result is not None:
111
+ results = await self._get_torrent(result, session, urls)
112
+ results["time"] = time.time() - start_time
113
+ results["total"] = len(results["data"])
114
+ return results
115
+ return result
116
+
117
+ async def trending(self, category, page, limit):
118
+ async with aiohttp.ClientSession() as session:
119
+ start_time = time.time()
120
+ self.LIMIT = limit
121
+ if not category:
122
+ url = self.BASE_URL + "/top-100"
123
+ else:
124
+ if category == "tv":
125
+ category == "television"
126
+ elif category == "apps":
127
+ category = "applications"
128
+ url = self.BASE_URL + "/top-100-{}/".format(category)
129
+ return await self.parser_result(start_time, url, session)
130
+
131
+ async def recent(self, category, page, limit):
132
+ async with aiohttp.ClientSession() as session:
133
+ start_time = time.time()
134
+ self.LIMIT = limit
135
+ if not category:
136
+ url = self.BASE_URL + "/new/"
137
+ else:
138
+ url = self.BASE_URL + "/{}/".format(category)
139
+ return await self.parser_result(start_time, url, session)