randydev commited on
Commit
28577cd
·
verified ·
1 Parent(s): fe38f2a

Create magnet_dl.py

Browse files
Files changed (1) hide show
  1. torrents/magnet_dl.py +124 -0
torrents/magnet_dl.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import re
3
+ import time
4
+ import aiohttp
5
+ import cloudscraper
6
+ import requests
7
+ from bs4 import BeautifulSoup
8
+ from constants.base_url import MAGNETDL
9
+
10
+
11
+ class Magnetdl:
12
+ def __init__(self):
13
+ self.BASE_URL = MAGNETDL
14
+ self.LIMIT = None
15
+
16
+ def _parser(self, htmls):
17
+ try:
18
+ for html in htmls:
19
+ soup = BeautifulSoup(html, "html.parser")
20
+
21
+ my_dict = {"data": []}
22
+ table = soup.find("table", class_="download")
23
+ for tr in soup.find_all("tr"):
24
+ td = tr.find_all("td")
25
+ if len(td) > 1:
26
+ name = td[1].find("a").get_text(strip=True)
27
+ if name != "":
28
+ magnet = td[0].find("a")["href"]
29
+ try:
30
+ size = td[5].get_text(strip=True)
31
+ except IndexError:
32
+ size = None
33
+ url = td[1].find("a")["href"]
34
+ date = td[2].get_text(strip=True)
35
+ seeders = td[6].get_text(strip=True)
36
+ leechers = td[7].get_text(strip=True)
37
+ category = td[3].text
38
+ my_dict["data"].append(
39
+ {
40
+ "name": name,
41
+ "size": size,
42
+ "seeders": seeders,
43
+ "leechers": leechers,
44
+ "category": category,
45
+ "hash": re.search(
46
+ r"([{a-f\d,A-F\d}]{32,40})\b", magnet
47
+ ).group(0),
48
+ "magnet": magnet,
49
+ "url": self.BASE_URL + url,
50
+ "date": date,
51
+ }
52
+ )
53
+ if len(my_dict["data"]) == self.LIMIT:
54
+ break
55
+ total_results = soup.find("div", id="footer").text.replace(",", "")
56
+ current_page = int(
57
+ (re.search(r"Page\s\d*", total_results).group(0)).replace(
58
+ "Page ", ""
59
+ )
60
+ )
61
+ total_pages = (
62
+ int(
63
+ (
64
+ (re.search(r"Found\s\d*", total_results).group(0)).replace(
65
+ "Found ", ""
66
+ )
67
+ )
68
+ )
69
+ // 40
70
+ )
71
+ my_dict["current_page"] = current_page
72
+ my_dict["total_pages"] = (
73
+ 30
74
+ if total_pages > 30
75
+ else total_pages
76
+ if total_pages != 0
77
+ else total_pages + 1
78
+ )
79
+ return my_dict
80
+ except:
81
+ return None
82
+
83
+ async def _get_html(self, session, url):
84
+ session = cloudscraper.create_scraper(sess=session)
85
+ try:
86
+ return session.get(url).text
87
+ except:
88
+ return None
89
+
90
+ async def _get_all_results(self, session, url):
91
+ return await asyncio.gather(asyncio.create_task(self._get_html(session, url)))
92
+
93
+ async def search(self, query, page, limit):
94
+ async with aiohttp.ClientSession() as session:
95
+ start_time = time.time()
96
+ self.LIMIT = limit
97
+ query = requests.utils.unquote(query)
98
+ query = query.split(" ")
99
+ query = "-".join(query)
100
+ url = self.BASE_URL + "/{}/{}/se/desc/{}/".format(query[0], query, page)
101
+ return await self.parser_result(start_time, url, session)
102
+
103
+ async def parser_result(self, start_time, url, session):
104
+ data = await self._get_all_results(session, url)
105
+ results = self._parser(data)
106
+ if results is not None:
107
+ results["time"] = time.time() - start_time
108
+ results["total"] = len(results["data"])
109
+ return results
110
+ return results
111
+
112
+ async def recent(self, category, page, limit):
113
+ async with aiohttp.ClientSession() as session:
114
+ start_time = time.time()
115
+ self.LIMIT = limit
116
+ if not category:
117
+ url = self.BASE_URL + "/download/movies/{}".format(page)
118
+ else:
119
+ if category == "books":
120
+ category = "e-books"
121
+ url = self.BASE_URL + "/download/{}/{}/".format(category, page)
122
+ return await self.parser_result(start_time, url, session)
123
+
124
+ #! maximum page in category is 30