155def fetch_traits(engine_traits: EngineTraits):
156 """Fetch languages and other search arguments from Anna's search form."""
157
158
159 import babel
162
163 engine_traits.all_locale = ''
164 engine_traits.custom['content'] = []
165 engine_traits.custom['ext'] = []
166 engine_traits.custom['sort'] = []
167
168 resp = get(base_url + '/search')
169 if not resp.ok:
170 raise RuntimeError("Response from Anna's search page is not OK.")
171 dom = html.fromstring(resp.text)
172
173
174
175 lang_map = {}
176 for x in eval_xpath_list(dom, "//form//input[@name='lang']"):
177 eng_lang = x.get("value")
178 if eng_lang in ('', '_empty', 'nl-BE', 'und') or eng_lang.startswith('anti__'):
179 continue
180 try:
181 locale = babel.Locale.parse(lang_map.get(eng_lang, eng_lang), sep='-')
182 except babel.UnknownLocaleError:
183
184
185 continue
186 sxng_lang = language_tag(locale)
187 conflict = engine_traits.languages.get(sxng_lang)
188 if conflict:
189 if conflict != eng_lang:
190 print("CONFLICT: babel %s --> %s, %s" % (sxng_lang, conflict, eng_lang))
191 continue
192 engine_traits.languages[sxng_lang] = eng_lang
193
194 for x in eval_xpath_list(dom, "//form//input[@name='content']"):
195 if not x.get("value").startswith("anti__"):
196 engine_traits.custom['content'].append(x.get("value"))
197
198 for x in eval_xpath_list(dom, "//form//input[@name='ext']"):
199 if not x.get("value").startswith("anti__"):
200 engine_traits.custom['ext'].append(x.get("value"))
201
202 for x in eval_xpath_list(dom, "//form//select[@name='sort']//option"):
203 engine_traits.custom['sort'].append(x.get("value"))
204
205
206 engine_traits.custom['content'].sort()
207 engine_traits.custom['ext'].sort()
208 engine_traits.custom['sort'].sort()