140def fetch_traits(engine_traits: EngineTraits):
141 """Fetch languages and other search arguments from Anna's search form."""
142
143
144 import babel
147
148 engine_traits.all_locale = ''
149 engine_traits.custom['content'] = []
150 engine_traits.custom['ext'] = []
151 engine_traits.custom['sort'] = []
152
153 resp = get(base_url + '/search')
154 if not resp.ok:
155 raise RuntimeError("Response from Anna's search page is not OK.")
156 dom = html.fromstring(resp.text)
157
158
159
160 lang_map = {}
161 for x in eval_xpath_list(dom, "//form//input[@name='lang']"):
162 eng_lang = x.get("value")
163 if eng_lang in ('', '_empty', 'nl-BE', 'und'):
164 continue
165 try:
166 locale = babel.Locale.parse(lang_map.get(eng_lang, eng_lang), sep='-')
167 except babel.UnknownLocaleError:
168
169
170 continue
171 sxng_lang = language_tag(locale)
172 conflict = engine_traits.languages.get(sxng_lang)
173 if conflict:
174 if conflict != eng_lang:
175 print("CONFLICT: babel %s --> %s, %s" % (sxng_lang, conflict, eng_lang))
176 continue
177 engine_traits.languages[sxng_lang] = eng_lang
178
179 for x in eval_xpath_list(dom, "//form//input[@name='content']"):
180 engine_traits.custom['content'].append(x.get("value"))
181
182 for x in eval_xpath_list(dom, "//form//input[@name='ext']"):
183 engine_traits.custom['ext'].append(x.get("value"))
184
185 for x in eval_xpath_list(dom, "//form//select[@name='sort']//option"):
186 engine_traits.custom['sort'].append(x.get("value"))