SoulofSukuna commited on
Commit
1e49f72
·
verified ·
1 Parent(s): e968dc8

Update torrents/x1337.py

Browse files
Files changed (1) hide show
  1. torrents/x1337.py +71 -83
torrents/x1337.py CHANGED
@@ -1,67 +1,59 @@
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 AsyncCloudscraper # Changed import
8
  from constants.base_url import X1337
9
  from constants.headers import HEADER_AIO
10
 
11
-
12
  class x1337:
13
  def __init__(self):
14
  self.BASE_URL = X1337
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
- magnet = soup.select_one(".no-top-radius > div > ul > li > a")["href"]
25
- uls = soup.find_all("ul", class_="list")[1]
26
- lis = uls.find_all("li")[0]
27
- imgs = [
28
- img["data-original"]
29
- for img in (soup.find("div", id="description")).find_all("img")
30
- if img["data-original"].endswith((".png", ".jpg", ".jpeg"))
31
- ]
32
- files = [
33
- f.text for f in soup.find("div", id="files").find_all("li")
34
- ]
35
- if len(imgs) > 0:
36
- obj["screenshot"] = imgs
37
- obj["category"] = lis.find("span").text
38
- obj["files"] = files
39
- try:
40
- poster = soup.select_one("div.torrent-image img")["src"]
41
- if str(poster).startswith("//"):
42
- obj["poster"] = "https:" + poster
43
- elif str(poster).startswith("/"):
44
- obj["poster"] = self.BASE_URL + poster
45
- except:
46
- ...
47
- obj["magnet"] = magnet
48
-
49
- obj["hash"] = re.search(
50
- r"([{a-f\d,A-F\d}]{32,40})\b", magnet
51
- ).group(0)
52
- except IndexError:
53
- ...
54
  except:
55
  return None
56
 
57
- async def _get_torrent(self, result, session, urls):
58
  tasks = []
59
  for idx, url in enumerate(urls):
60
  for obj in result["data"]:
61
  if obj["url"] == url:
62
- task = asyncio.create_task(
63
- self._individual_scrap(session, url, result["data"][idx])
64
- )
65
  tasks.append(task)
66
  await asyncio.gather(*tasks)
67
  return result
@@ -107,48 +99,47 @@ class x1337:
107
  else:
108
  my_dict["total_pages"] = int(pages[-1].text)
109
  except:
110
- ...
111
  return my_dict, list_of_urls
112
  except:
113
  return None, None
114
 
115
  async def search(self, query, page, limit):
116
- async with aiohttp.ClientSession() as session:
117
- self.LIMIT = limit
118
- start_time = time.time()
119
- url = self.BASE_URL + "/search/{}/{}/".format(query, page)
120
- return await self.parser_result(
121
- start_time, url, session, query=query, page=page
122
- )
123
 
124
- async def parser_result(self, start_time, url, session, page, query=None):
125
- # Use AsyncCloudscraper instead of Scraper
126
- htmls = await AsyncCloudscraper().get_all_results(url)
 
127
  result, urls = self._parser(htmls)
128
  if result is not None:
129
- results = await self._get_torrent(result, session, urls)
130
  results["time"] = time.time() - start_time
131
  results["total"] = len(results["data"])
132
  if query is None:
133
  return results
134
  while True:
135
  if len(results["data"]) >= self.LIMIT:
136
- results["data"] = results["data"][0 : self.LIMIT]
137
  results["total"] = len(results["data"])
138
  return results
139
- page = page + 1
140
  url = self.BASE_URL + "/search/{}/{}/".format(query, page)
141
- htmls = await AsyncCloudscraper().get_all_results(url) # Changed Scraper
 
142
  result, urls = self._parser(htmls)
143
  if result is not None:
144
  if len(result["data"]) > 0:
145
- res = await self._get_torrent(result, session, urls)
146
  for obj in res["data"]:
147
  results["data"].append(obj)
148
  try:
149
  results["current_page"] = res["current_page"]
150
  except:
151
- ...
152
  results["time"] = time.time() - start_time
153
  results["total"] = len(results["data"])
154
  else:
@@ -159,32 +150,29 @@ class x1337:
159
  return result
160
 
161
  async def trending(self, category, page, limit):
162
- async with aiohttp.ClientSession() as session:
163
- start_time = time.time()
164
- self.LIMIT = limit
165
- if not category:
166
- url = self.BASE_URL + "/home/"
167
- else:
168
- url = self.BASE_URL + "/popular-{}".format(category.lower())
169
- return await self.parser_result(start_time, url, session, page)
170
 
171
  async def recent(self, category, page, limit):
172
- async with aiohttp.ClientSession() as session:
173
- start_time = time.time()
174
- self.LIMIT = limit
175
- if not category:
176
- url = self.BASE_URL + "/trending"
177
- else:
178
- url = self.BASE_URL + "/cat/{}/{}/".format(
179
- str(category).capitalize(), page
180
- )
181
- return await self.parser_result(start_time, url, session, page)
182
 
183
  async def search_by_category(self, query, category, page, limit):
184
- async with aiohttp.ClientSession() as session:
185
- start_time = time.time()
186
- self.LIMIT = limit
187
- url = self.BASE_URL + "/category-search/{}/{}/{}/".format(
188
- query, category.capitalize(), page
189
- )
190
- return await self.parser_result(start_time, url, session, page, query)
 
1
  import asyncio
2
  import re
3
  import time
4
+ import cloudscraper
5
  from bs4 import BeautifulSoup
6
  from helper.asyncioPoliciesFix import decorator_asyncio_fix
 
7
  from constants.base_url import X1337
8
  from constants.headers import HEADER_AIO
9
 
 
10
  class x1337:
11
  def __init__(self):
12
  self.BASE_URL = X1337
13
  self.LIMIT = None
14
+ self.scraper = cloudscraper.create_scraper()
15
 
16
  @decorator_asyncio_fix
17
+ async def _individual_scrap(self, url, obj):
18
  try:
19
+ html = await asyncio.to_thread(self.scraper.get, url, headers=HEADER_AIO)
20
+ html = html.text
21
+ soup = BeautifulSoup(html, "html.parser")
22
+ try:
23
+ magnet = soup.select_one(".no-top-radius > div > ul > li > a")["href"]
24
+ uls = soup.find_all("ul", class_="list")[1]
25
+ lis = uls.find_all("li")[0]
26
+ imgs = [
27
+ img["data-original"]
28
+ for img in (soup.find("div", id="description")).find_all("img")
29
+ if img["data-original"].endswith((".png", ".jpg", ".jpeg"))
30
+ ]
31
+ files = [f.text for f in soup.find("div", id="files").find_all("li")]
32
+ if len(imgs) > 0:
33
+ obj["screenshot"] = imgs
34
+ obj["category"] = lis.find("span").text
35
+ obj["files"] = files
36
  try:
37
+ poster = soup.select_one("div.torrent-image img")["src"]
38
+ if str(poster).startswith("//"):
39
+ obj["poster"] = "https:" + poster
40
+ elif str(poster).startswith("/"):
41
+ obj["poster"] = self.BASE_URL + poster
42
+ except:
43
+ pass
44
+ obj["magnet"] = magnet
45
+ obj["hash"] = re.search(r"([{a-f\d,A-F\d}]{32,40})\b", magnet).group(0)
46
+ except IndexError:
47
+ pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  except:
49
  return None
50
 
51
+ async def _get_torrent(self, result, urls):
52
  tasks = []
53
  for idx, url in enumerate(urls):
54
  for obj in result["data"]:
55
  if obj["url"] == url:
56
+ task = asyncio.create_task(self._individual_scrap(url, result["data"][idx]))
 
 
57
  tasks.append(task)
58
  await asyncio.gather(*tasks)
59
  return result
 
99
  else:
100
  my_dict["total_pages"] = int(pages[-1].text)
101
  except:
102
+ pass
103
  return my_dict, list_of_urls
104
  except:
105
  return None, None
106
 
107
  async def search(self, query, page, limit):
108
+ self.LIMIT = limit
109
+ start_time = time.time()
110
+ url = self.BASE_URL + "/search/{}/{}/".format(query, page)
111
+ return await self.parser_result(start_time, url, query=query, page=page)
 
 
 
112
 
113
+ @decorator_asyncio_fix
114
+ async def parser_result(self, start_time, url, page, query=None):
115
+ html = await asyncio.to_thread(self.scraper.get, url, headers=HEADER_AIO)
116
+ htmls = [html.text]
117
  result, urls = self._parser(htmls)
118
  if result is not None:
119
+ results = await self._get_torrent(result, urls)
120
  results["time"] = time.time() - start_time
121
  results["total"] = len(results["data"])
122
  if query is None:
123
  return results
124
  while True:
125
  if len(results["data"]) >= self.LIMIT:
126
+ results["data"] = results["data"][: self.LIMIT]
127
  results["total"] = len(results["data"])
128
  return results
129
+ page += 1
130
  url = self.BASE_URL + "/search/{}/{}/".format(query, page)
131
+ html = await asyncio.to_thread(self.scraper.get, url, headers=HEADER_AIO)
132
+ htmls = [html.text]
133
  result, urls = self._parser(htmls)
134
  if result is not None:
135
  if len(result["data"]) > 0:
136
+ res = await self._get_torrent(result, urls)
137
  for obj in res["data"]:
138
  results["data"].append(obj)
139
  try:
140
  results["current_page"] = res["current_page"]
141
  except:
142
+ pass
143
  results["time"] = time.time() - start_time
144
  results["total"] = len(results["data"])
145
  else:
 
150
  return result
151
 
152
  async def trending(self, category, page, limit):
153
+ start_time = time.time()
154
+ self.LIMIT = limit
155
+ if not category:
156
+ url = self.BASE_URL + "/home/"
157
+ else:
158
+ url = self.BASE_URL + "/popular-{}".format(category.lower())
159
+ return await self.parser_result(start_time, url, page)
 
160
 
161
  async def recent(self, category, page, limit):
162
+ start_time = time.time()
163
+ self.LIMIT = limit
164
+ if not category:
165
+ url = self.BASE_URL + "/trending"
166
+ else:
167
+ url = self.BASE_URL + "/cat/{}/{}/".format(
168
+ str(category).capitalize(), page
169
+ )
170
+ return await self.parser_result(start_time, url, page)
 
171
 
172
  async def search_by_category(self, query, category, page, limit):
173
+ start_time = time.time()
174
+ self.LIMIT = limit
175
+ url = self.BASE_URL + "/category-search/{}/{}/{}/".format(
176
+ query, category.capitalize(), page
177
+ )
178
+ return await self.parser_result(start_time, url, page, query)