From 0fc8f99ecc94232302b6b196eccf3ea9b132ec43 Mon Sep 17 00:00:00 2001 From: Emilien Devos <4016501+unixfox@users.noreply.github.com> Date: Fri, 4 Aug 2023 18:15:13 +0200 Subject: [PATCH] [feat] new engine: bt4g added & enabled and disable by default btdigg Disable btdigg because on most SearXNG instances, SearXNG is blocked by btdigg due to cloudflare too many requests. This impementation did not parse the HTML page because there is an API in XML (RSS). The RSS feed provides fewer data like amount of seeders/leechers and the files in the torrent file. It's a tradeoff for a "stable" engine as the XML from RSS content will change way less than the HTML page. Closes: https://github.com/searxng/searxng/issues/2553 --- searx/engines/bt4g.py | 80 +++++++++++++++++++++++++++++++++++++++++++ searx/settings.yml | 5 +++ 2 files changed, 85 insertions(+) create mode 100644 searx/engines/bt4g.py diff --git a/searx/engines/bt4g.py b/searx/engines/bt4g.py new file mode 100644 index 000000000..a952e618d --- /dev/null +++ b/searx/engines/bt4g.py @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +""" + BT4G (Videos, Music, Files) +""" + +import re +from datetime import datetime +from urllib.parse import quote + +from lxml import etree + +from searx.utils import get_torrent_size + +# about +about = { + "website": 'https://bt4gprx.com', + "use_official_api": False, + "require_api_key": False, + "results": 'XML', +} + +# engine dependent config +categories = ['files'] +paging = True +time_range_support = True + +# search-url +url = 'https://bt4gprx.com' +search_url = url + '/search?q={search_term}&orderby={order_by}&category={category}&p={pageno}&page=rss' +bt4g_order_by = 'relevance' # relevance, size, seeders, time +bt4g_category = 'all' # all, audio, movie, doc, app, other + + +def request(query, params): + + order_by = bt4g_order_by + if params['time_range']: + order_by = 'time' + + params['url'] = search_url.format( + search_term=quote(query), + order_by=order_by, + category=bt4g_category, + pageno=params['pageno'], + ) + return params + + +def response(resp): + results = [] + + search_results = etree.XML(resp.content) + + # return empty array if nothing is found + if len(search_results) == 0: + return [] + + for entry in search_results.xpath('./channel/item'): + title = entry.find("title").text + link = entry.find("guid").text + fullDescription = entry.find("description").text.split('
') + filesize = fullDescription[1] + filesizeParsed = re.split(r"([A-Z]+)", filesize) + magnetlink = entry.find("link").text + pubDate = entry.find("pubDate").text + results.append( + { + 'url': link, + 'title': title, + 'magnetlink': magnetlink, + 'seed': 'N/A', + 'leech': 'N/A', + 'filesize': get_torrent_size(filesizeParsed[0], filesizeParsed[1]), + 'publishedDate': datetime.strptime(pubDate, '%a,%d %b %Y %H:%M:%S %z'), + 'template': 'torrent.html', + } + ) + + return results diff --git a/searx/settings.yml b/searx/settings.yml index 3a6ba3e17..ce8b366e1 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -415,6 +415,7 @@ engines: - name: btdigg engine: btdigg shortcut: bt + disabled: true - name: ccc-tv engine: xpath @@ -1926,6 +1927,10 @@ engines: results: HTML language: ja + - name: bt4g + engine: bt4g + shortcut: bt4g + # Doku engine lets you access to any Doku wiki instance: # A public one or a privete/corporate one. # - name: ubuntuwiki