37from typing
import List, Dict, Any, Optional
94def request(query: str, params: Dict[str, Any]) -> Dict[str, Any]:
95 lang: str = traits.get_language(params[
"language"], traits.all_locale)
98 +
"/s/{search_query}/?page={pageno}"
99 +
"&yearFrom={zlib_year_from}"
100 +
"&yearTo={zlib_year_to}"
101 +
"&languages[]={lang}"
102 +
"&extensions[]={zlib_ext}"
104 params[
"url"] = search_url.format(
105 search_query=quote(query),
106 pageno=params[
"pageno"],
108 zlib_year_from=zlib_year_from,
109 zlib_year_to=zlib_year_to,
112 params[
"verify"] =
False
179 """Fetch languages and other search arguments from zlibrary's search form."""
188 def _use_old_values():
190 engine_traits.all_locale = ENGINE_TRAITS[
"z-library"][
"all_locale"]
191 engine_traits.custom = ENGINE_TRAITS[
"z-library"][
"custom"]
192 engine_traits.languages = ENGINE_TRAITS[
"z-library"][
"languages"]
195 resp = get(base_url, verify=
False)
196 except (SearxException, httpx.ConnectError)
as exc:
197 print(f
"ERROR: zlibrary domain '{base_url}' is seized?")
203 raise RuntimeError(
"Response from zlibrary's search page is not OK.")
204 dom = html.fromstring(resp.text)
207 print(f
"ERROR: zlibrary domain is seized: {base_url}")
211 engine_traits.all_locale =
""
212 engine_traits.custom[
"ext"] = []
213 engine_traits.custom[
"year_from"] = []
214 engine_traits.custom[
"year_to"] = []
216 for year
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_yearFrom']/option"):
217 engine_traits.custom[
"year_from"].append(year.get(
"value"))
219 for year
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_yearTo']/option"):
220 engine_traits.custom[
"year_to"].append(year.get(
"value"))
222 for ext
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_extensions']/option"):
223 value: Optional[str] = ext.get(
"value")
226 engine_traits.custom[
"ext"].append(value)
230 language_name_locale_map: Dict[str, babel.Locale] = {}
231 for locale
in babel.core.localedata.locale_identifiers():
233 loc = babel.Locale.parse(locale)
234 if loc.english_name
is None:
236 language_name_locale_map[loc.english_name.lower()] = loc
238 for x
in eval_xpath_list(dom,
"//div[@id='advSearch-noJS']//select[@id='sf_languages']/option"):
239 eng_lang = x.get(
"value")
243 locale = language_name_locale_map[eng_lang.lower()]
248 sxng_lang = language_tag(locale)
249 conflict = engine_traits.languages.get(sxng_lang)
251 if conflict != eng_lang:
252 print(
"CONFLICT: babel %s --> %s, %s" % (sxng_lang, conflict, eng_lang))
254 engine_traits.languages[sxng_lang] = eng_lang