6from urllib.parse
import parse_qsl
8from flask_babel
import gettext
9from searx
import get_setting
15if typing.TYPE_CHECKING:
22ahmia_blacklist: list = []
25def filter_url_field(result:
"Result|LegacyResult", field_name: str, url_src: str) -> bool | str:
26 """Returns bool ``True`` to use URL unchanged (``False`` to ignore URL).
27 If URL should be modified, the returned string is the new URL to use."""
29 if field_name !=
"url":
33 if doi
and len(doi) < 50:
34 for suffix
in (
"/",
".pdf",
".xml",
"/full",
"/meta",
"/abstract"):
35 doi = doi.removesuffix(suffix)
37 if "doi" not in result:
39 log.debug(
"oa_doi_rewrite: [URL field: %s] %s -> %s", field_name, url_src, new_url)
46 """Avoid paywalls by redirecting to open-access."""
50 def __init__(self, plg_cfg:
"PluginCfg") ->
None:
54 name=gettext(
"Open Access DOI rewrite"),
55 description=gettext(
"Avoid paywalls by redirecting to open-access versions of publications when available"),
56 preference_section=
"general",
61 request:
"SXNG_Request",
62 search:
"SearchWithPlugins",
66 result.filter_urls(filter_url_field)
70regex = re.compile(
r'10\.\d{4,9}/[^\s]+')
74 m = regex.search(url.path)
77 for _, v
in parse_qsl(url.query):
86 selected_resolver = sxng_request.preferences.get_value(
'doi_resolver')[0]
87 if selected_resolver
not in doi_resolvers:
88 selected_resolver =
get_setting(
"default_doi_resolver")
89 return doi_resolvers[selected_resolver]
None __init__(self, "PluginCfg" plg_cfg)
bool on_result(self, "SXNG_Request" request, "SearchWithPlugins" search, "Result" result)
bool|str filter_url_field("Result|LegacyResult" result, str field_name, str url_src)
t.Any get_setting(str name, t.Any default=_unset)