diff options
Diffstat (limited to 'searx/plugins/tracker_url_remover.py')
| -rw-r--r-- | searx/plugins/tracker_url_remover.py | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/searx/plugins/tracker_url_remover.py b/searx/plugins/tracker_url_remover.py index f33f7fdfd..d9c767a36 100644 --- a/searx/plugins/tracker_url_remover.py +++ b/searx/plugins/tracker_url_remover.py @@ -2,12 +2,21 @@ # pylint: disable=missing-module-docstring from __future__ import annotations +import typing import re from urllib.parse import urlunparse, parse_qsl, urlencode from flask_babel import gettext +from searx.plugins import Plugin, PluginInfo + +if typing.TYPE_CHECKING: + from searx.search import SearchWithPlugins + from searx.extended_types import SXNG_Request + from searx.result_types import Result + from searx.plugins import PluginCfg + regexes = { re.compile(r'utm_[^&]+'), re.compile(r'(wkey|wemail)[^&]*'), @@ -15,30 +24,35 @@ regexes = { re.compile(r'&$'), } -name = gettext('Tracker URL remover') -description = gettext('Remove trackers arguments from the returned URL') -default_on = True -preference_section = 'privacy' - -def on_result(_request, _search, result) -> bool: +class SXNGPlugin(Plugin): + """Remove trackers arguments from the returned URL""" + + id = "tracker_url_remover" + + def __init__(self, plg_cfg: "PluginCfg") -> None: + super().__init__(plg_cfg) + self.info = PluginInfo( + id=self.id, + name=gettext("Tracker URL remover"), + description=gettext("Remove trackers arguments from the returned URL"), + preference_section="privacy", + ) + + def on_result( + self, request: "SXNG_Request", search: "SearchWithPlugins", result: Result + ) -> bool: # pylint: disable=unused-argument + if not result.parsed_url: + return True + + parsed_query: list[tuple[str, str]] = parse_qsl(result.parsed_url.query) + for name_value in list(parsed_query): + param_name = name_value[0] + for reg in regexes: + if reg.match(param_name): + parsed_query.remove(name_value) + result.parsed_url = result.parsed_url._replace(query=urlencode(parsed_query)) + result.url = urlunparse(result.parsed_url) + break - parsed_url = getattr(result, "parsed_url", None) - if not parsed_url: return True - - if parsed_url.query == "": - return True - - parsed_query = parse_qsl(parsed_url.query) - changes = 0 - for i, (param_name, _) in enumerate(list(parsed_query)): - for reg in regexes: - if reg.match(param_name): - parsed_query.pop(i - changes) - changes += 1 - result.parsed_url = result.parsed_url._replace(query=urlencode(parsed_query)) - result.url = urlunparse(result.parsed_url) - break - - return True |