SoulofSukuna commited on
Commit
48c7ef6
·
verified ·
1 Parent(s): 77c14b6

Update torrents/x1337.py

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