randydev commited on
Commit
b9a9892
·
verified ·
1 Parent(s): 5549460

Create torrentfunk.py

Browse files
Files changed (1) hide show
  1. torrents/torrentfunk.py +123 -0
torrents/torrentfunk.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import time
3
+ import aiohttp
4
+ from bs4 import BeautifulSoup
5
+ from helper.asyncioPoliciesFix import decorator_asyncio_fix
6
+ from helper.html_scraper import Scraper
7
+ from constants.base_url import TORRENTFUNK
8
+ from constants.headers import HEADER_AIO
9
+
10
+
11
+ class TorrentFunk:
12
+ def __init__(self):
13
+ self.BASE_URL = TORRENTFUNK
14
+ self.LIMIT = None
15
+
16
+ @decorator_asyncio_fix
17
+ async def _individual_scrap(self, session, url, obj):
18
+ try:
19
+ async with session.get(url, headers=HEADER_AIO) as res:
20
+ html = await res.text(encoding="ISO-8859-1")
21
+ soup = BeautifulSoup(html, "html.parser")
22
+ try:
23
+ obj["torrent"] = soup.select_one(
24
+ "#right > main > div.content > table:nth-child(3) > tr > td:nth-child(2) > a"
25
+ )["href"]
26
+ obj["category"] = soup.select_one(
27
+ "#right > main > div.content > table:nth-child(7) > tr> td:nth-child(2) > a"
28
+ ).text
29
+ obj["hash"] = soup.select_one(
30
+ "#right > main > div.content > table:nth-child(7) > tr:nth-child(3) > td:nth-child(2)"
31
+ ).text
32
+ except:
33
+ ...
34
+ except:
35
+ return None
36
+
37
+ async def _get_torrent(self, result, session, urls):
38
+ tasks = []
39
+ for idx, url in enumerate(urls):
40
+ for obj in result["data"]:
41
+ if obj["url"] == url:
42
+ task = asyncio.create_task(
43
+ self._individual_scrap(session, url, result["data"][idx])
44
+ )
45
+ tasks.append(task)
46
+ await asyncio.gather(*tasks)
47
+ return result
48
+
49
+ def _parser(self, htmls, idx=1):
50
+ try:
51
+ for html in htmls:
52
+ soup = BeautifulSoup(html, "html.parser")
53
+ list_of_urls = []
54
+ my_dict = {"data": []}
55
+
56
+ for tr in soup.select(".tmain tr")[idx:]:
57
+ td = tr.find_all("td")
58
+ if len(td) == 0:
59
+ continue
60
+ name = td[0].find("a").text
61
+ date = td[1].text
62
+ size = td[2].text
63
+ seeders = td[3].text
64
+ leechers = td[4].text
65
+ uploader = td[5].text
66
+ url = self.BASE_URL + td[0].find("a")["href"]
67
+ list_of_urls.append(url)
68
+ my_dict["data"].append(
69
+ {
70
+ "name": name,
71
+ "size": size,
72
+ "date": date,
73
+ "seeders": seeders,
74
+ "leechers": leechers,
75
+ "uploader": uploader if uploader else None,
76
+ "url": url,
77
+ }
78
+ )
79
+ if len(my_dict["data"]) == self.LIMIT:
80
+ break
81
+ return my_dict, list_of_urls
82
+ except:
83
+ return None, None
84
+
85
+ async def search(self, query, page, limit):
86
+ async with aiohttp.ClientSession() as session:
87
+ start_time = time.time()
88
+ self.LIMIT = limit
89
+ url = self.BASE_URL + "/all/torrents/{}/{}.html".format(query, page)
90
+ return await self.parser_result(start_time, url, session, idx=6)
91
+
92
+ async def parser_result(self, start_time, url, session, idx=1):
93
+ htmls = await Scraper().get_all_results(session, url)
94
+ result, urls = self._parser(htmls, idx)
95
+ if result:
96
+ results = await self._get_torrent(result, session, urls)
97
+ results["time"] = time.time() - start_time
98
+ results["total"] = len(results["data"])
99
+ return results
100
+ return result
101
+
102
+ async def trending(self, category, page, limit):
103
+ async with aiohttp.ClientSession() as session:
104
+ start_time = time.time()
105
+ self.LIMIT = limit
106
+ url = self.BASE_URL
107
+ return await self.parser_result(start_time, url, session)
108
+
109
+ async def recent(self, category, page, limit):
110
+ async with aiohttp.ClientSession() as session:
111
+ start_time = time.time()
112
+ self.LIMIT = limit
113
+ if not category:
114
+ url = self.BASE_URL + "/movies/recent.html"
115
+ else:
116
+ if category == "apps":
117
+ category = "software"
118
+ elif category == "tv":
119
+ category = "television"
120
+ elif category == "books":
121
+ category = "ebooks"
122
+ url = self.BASE_URL + "/{}/recent.html".format(category)
123
+ return await self.parser_result(start_time, url, session)