.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
solidtorrents.py
Go to the documentation of this file.
1# SPDX-License-Identifier: AGPL-3.0-or-later
2"""SolidTorrents
3
4"""
5
6from datetime import datetime
7from urllib.parse import urlencode
8import random
9
10from lxml import html
11
12from searx.utils import (
13 extract_text,
14 eval_xpath,
15 eval_xpath_getindex,
16 eval_xpath_list,
17 get_torrent_size,
18)
19
20about = {
21 "website": 'https://www.solidtorrents.to/',
22 "wikidata_id": None,
23 "official_api_documentation": None,
24 "use_official_api": False,
25 "require_api_key": False,
26 "results": 'HTML',
27}
28
29categories = ['files']
30paging = True
31
32# base_url can be overwritten by a list of URLs in the settings.yml
33base_url = 'https://solidtorrents.to'
34
35
36def request(query, params):
37 if isinstance(base_url, list):
38 params['base_url'] = random.choice(base_url)
39 else:
40 params['base_url'] = base_url
41 search_url = params['base_url'] + '/search?{query}'
42 query = urlencode({'q': query, 'page': params['pageno']})
43 params['url'] = search_url.format(query=query)
44 return params
45
46
47def response(resp):
48 results = []
49 dom = html.fromstring(resp.text)
50
51 for result in eval_xpath(dom, '//li[contains(@class, "search-result")]'):
52 torrentfile = eval_xpath_getindex(result, './/a[contains(@class, "dl-torrent")]/@href', 0, None)
53 magnet = eval_xpath_getindex(result, './/a[contains(@class, "dl-magnet")]/@href', 0, None)
54 if torrentfile is None or magnet is None:
55 continue # ignore anime results that which aren't actually torrents
56 title = eval_xpath_getindex(result, './/h5[contains(@class, "title")]', 0, None)
57 url = eval_xpath_getindex(result, './/h5[contains(@class, "title")]/a/@href', 0, None)
58 categ = eval_xpath(result, './/a[contains(@class, "category")]')
59 stats = eval_xpath_list(result, './/div[contains(@class, "stats")]/div', min_len=5)
60
61 params = {
62 'seed': extract_text(stats[3]),
63 'leech': extract_text(stats[2]),
64 'title': extract_text(title),
65 'url': resp.search_params['base_url'] + url,
66 'filesize': get_torrent_size(*extract_text(stats[1]).split()),
67 'magnetlink': magnet,
68 'torrentfile': torrentfile,
69 'metadata': extract_text(categ),
70 'template': "torrent.html",
71 }
72
73 try:
74 params['publishedDate'] = datetime.strptime(extract_text(stats[4]), '%b %d, %Y')
75 except ValueError:
76 pass
77
78 results.append(params)
79
80 return results