randydev commited on
Commit
6f8cb9a
·
verified ·
1 Parent(s): b2166c3

Create yts.py

Browse files
Files changed (1) hide show
  1. torrents/yts.py +173 -0
torrents/yts.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 YTS
9
+ from constants.headers import HEADER_AIO
10
+
11
+
12
+ class Yts:
13
+ def __init__(self):
14
+ self.BASE_URL = YTS
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
+ name = soup.select_one("div.hidden-xs h1").text
25
+ div = soup.select("div.hidden-xs h2")
26
+ date = div[0].text
27
+ genre = div[1].text.split("/")
28
+ rating = soup.select_one("[itemprop=ratingValue]").text
29
+ poster = (
30
+ soup.find("div", id="movie-poster")
31
+ .find("img")["src"]
32
+ .split("/")
33
+ )
34
+ poster[-1] = poster[-1].replace("medium", "large")
35
+ poster = "/".join(poster)
36
+ description = soup.select("div#synopsis > p")[0].text.strip()
37
+ runtime = (
38
+ soup.select_one(".tech-spec-info")
39
+ .find_all("div", class_="row")[-1]
40
+ .find_all("div")[-3]
41
+ .text.strip()
42
+ )
43
+
44
+ screenshots = soup.find_all("a", class_="screenshot-group")
45
+ screenshots = [a["href"] for a in screenshots]
46
+ torrents = []
47
+ for div in soup.find_all("div", class_="modal-torrent"):
48
+ quality = (
49
+ div.find("div", class_="modal-quality").find("span").text
50
+ )
51
+ all_p = div.find_all("p", class_="quality-size")
52
+ quality_type = all_p[0].text
53
+ size = all_p[1].text
54
+ torrent_link = div.find("a", class_="download-torrent")["href"]
55
+ magnet = div.find("a", class_="magnet-download")["href"]
56
+ hash = re.search(r"([{a-f\d,A-F\d}]{32,40})\b", magnet).group(0)
57
+ torrents.append(
58
+ {
59
+ "quality": quality,
60
+ "type": quality_type,
61
+ "size": size,
62
+ "torrent": torrent_link,
63
+ "magnet": magnet,
64
+ "hash": hash,
65
+ }
66
+ )
67
+ obj["name"] = name
68
+ obj["date"] = date
69
+ obj["genre"] = genre
70
+ obj["rating"] = rating
71
+ obj["poster"] = poster
72
+ obj["description"] = description
73
+ obj["runtime"] = runtime
74
+ obj["screenshot"] = screenshots
75
+ obj["torrents"] = torrents
76
+ except:
77
+ ...
78
+ except:
79
+ return None
80
+
81
+ async def _get_torrent(self, result, session, urls):
82
+ tasks = []
83
+ for idx, url in enumerate(urls):
84
+ for obj in result["data"]:
85
+ if obj["url"] == url:
86
+ task = asyncio.create_task(
87
+ self._individual_scrap(session, url, result["data"][idx])
88
+ )
89
+ tasks.append(task)
90
+ await asyncio.gather(*tasks)
91
+ return result
92
+
93
+ def _parser(self, htmls):
94
+ try:
95
+ for html in htmls:
96
+ soup = BeautifulSoup(html, "html.parser")
97
+ list_of_urls = []
98
+ my_dict = {"data": []}
99
+ for div in soup.find_all("div", class_="browse-movie-wrap"):
100
+ url = div.find("a")["href"]
101
+ list_of_urls.append(url)
102
+ my_dict["data"].append({"url": url})
103
+ if len(my_dict["data"]) == self.LIMIT:
104
+ break
105
+ try:
106
+ ul = soup.find("ul", class_="tsc_pagination")
107
+ current_page = ul.find("a", class_="current").text
108
+ my_dict["current_page"] = int(current_page)
109
+ if current_page:
110
+ total_results = soup.select_one(
111
+ "body > div.main-content > div.browse-content > div > h2 > b"
112
+ ).text
113
+ if "," in total_results:
114
+ total_results = total_results.replace(",", "")
115
+ total_page = int(total_results) / 20
116
+ my_dict["total_pages"] = (
117
+ int(total_page) + 1
118
+ if type(total_page) == float
119
+ else int(total_page)
120
+ )
121
+
122
+ except:
123
+ ...
124
+ return my_dict, list_of_urls
125
+ except:
126
+ return None, None
127
+
128
+ async def search(self, query, page, limit):
129
+ async with aiohttp.ClientSession() as session:
130
+ start_time = time.time()
131
+ self.LIMIT = limit
132
+ if page != 1:
133
+ url = (
134
+ self.BASE_URL
135
+ + "/browse-movies/{}/all/all/0/latest/0/all?page={}".format(
136
+ query, page
137
+ )
138
+ )
139
+ else:
140
+ url = self.BASE_URL + "/browse-movies/{}/all/all/0/latest/0/all".format(
141
+ query
142
+ )
143
+ return await self.parser_result(start_time, url, session)
144
+
145
+ async def parser_result(self, start_time, url, session):
146
+ htmls = await Scraper().get_all_results(session, url)
147
+ result, urls = self._parser(htmls)
148
+ if result is not None:
149
+ results = await self._get_torrent(result, session, urls)
150
+ results["time"] = time.time() - start_time
151
+ results["total"] = len(results["data"])
152
+ return results
153
+ return result
154
+
155
+ async def trending(self, category, page, limit):
156
+ async with aiohttp.ClientSession() as session:
157
+ start_time = time.time()
158
+ self.LIMIT = limit
159
+ url = self.BASE_URL + "/trending-movies"
160
+ return await self.parser_result(start_time, url, session)
161
+
162
+ async def recent(self, category, page, limit):
163
+ async with aiohttp.ClientSession() as session:
164
+ start_time = time.time()
165
+ self.LIMIT = limit
166
+ if page != 1:
167
+ url = (
168
+ self.BASE_URL
169
+ + "/browse-movies/0/all/all/0/featured/0/all?page={}".format(page)
170
+ )
171
+ else:
172
+ url = self.BASE_URL + "/browse-movies/0/all/all/0/featured/0/all"
173
+ return await self.parser_result(start_time, url, session)