90def request(query: str, params: dict[str, t.Any]) -> dict[str, t.Any]:
91 lang: str = traits.get_language(params[
"language"], traits.all_locale)
94 +
"/s/{search_query}/?page={pageno}"
95 +
"&yearFrom={zlib_year_from}"
96 +
"&yearTo={zlib_year_to}"
97 +
"&languages[]={lang}"
98 +
"&extensions[]={zlib_ext}"
100 params[
"url"] = search_url.format(
101 search_query=quote(query),
102 pageno=params[
"pageno"],
104 zlib_year_from=zlib_year_from,
105 zlib_year_to=zlib_year_to,
108 params[
"verify"] =
False
175 """Fetch languages and other search arguments from zlibrary's search form."""
184 def _use_old_values():
186 engine_traits.all_locale = ENGINE_TRAITS[
"z-library"][
"all_locale"]
187 engine_traits.custom = ENGINE_TRAITS[
"z-library"][
"custom"]
188 engine_traits.languages = ENGINE_TRAITS[
"z-library"][
"languages"]
191 resp = get(base_url, verify=
False)
192 except (SearxException, httpx.HTTPError)
as exc:
193 print(f
"ERROR: zlibrary domain '{base_url}' is seized?")
199 raise RuntimeError(
"Response from zlibrary's search page is not OK.")
200 dom = html.fromstring(resp.text)
203 print(f
"ERROR: zlibrary domain is seized: {base_url}")
207 engine_traits.all_locale =
""
208 engine_traits.custom[
"ext"] = []
209 engine_traits.custom[
"year_from"] = []
210 engine_traits.custom[
"year_to"] = []
212 for year
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_yearFrom']/option"):
213 engine_traits.custom[
"year_from"].append(year.get(
"value"))
215 for year
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_yearTo']/option"):
216 engine_traits.custom[
"year_to"].append(year.get(
"value"))
218 for ext
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_extensions']/option"):
219 value: str |
None = ext.get(
"value")
222 engine_traits.custom[
"ext"].append(value)
226 language_name_locale_map: dict[str, babel.Locale] = {}
227 for locale
in babel.core.localedata.locale_identifiers():
229 loc = babel.Locale.parse(locale)
230 if loc.english_name
is None:
232 language_name_locale_map[loc.english_name.lower()] = loc
234 for x
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_languages']/option"):
235 eng_lang = x.get(
"value")
239 locale = language_name_locale_map[eng_lang.lower()]
244 sxng_lang = language_tag(locale)
245 conflict = engine_traits.languages.get(sxng_lang)
247 if conflict != eng_lang:
248 print(
"CONFLICT: babel %s --> %s, %s" % (sxng_lang, conflict, eng_lang))
250 engine_traits.languages[sxng_lang] = eng_lang