on master help sign in
Merge pull request #623 from a01200356/duckduckgo

[fix] multilingual duckduckgo

commit8f2a3d241f51c3da8fdd31014d5569ac11c18021 authorAdam Tauber <asciimoo@gmail.com> dateFri 15 Jul 2016, 12:56 (10 years ago) parent3fd405daac4ed6
2 files changed+24−14
searx/engines/duckduckgo.py+22−8 tests/unit/engines/test_duckduckgo.py+2−6
searx/engines/duckduckgo.py+22−8
@@ -11,13 +11,12 @@
1111 @parse url, title, content
1212
1313 @todo rewrite to api
14− @todo language support
15− (the current used site does not support language-change)
1614"""
1715
1816from urllib import urlencode
1917from lxml.html import fromstring
2018from searx.engines.xpath import extract_text
19+from searx.languages import language_codes
2120
2221# engine dependent config
2322categories = ['general']
@@ -39,13 +38,28 @@ def request(query, params):
3938 offset = (params['pageno'] - 1) * 30
4039
4140 if params['language'] == 'all':
42− locale = 'en-us'
41+ locale = None
4342 else:
44− locale = params['language'].replace('_', '-').lower()
45−
46− params['url'] = url.format(
47− query=urlencode({'q': query, 'kl': locale}),
48− offset=offset)
43+ locale = params['language'].split('_')
44+ if len(locale) == 2:
45+ # country code goes first
46+ locale = locale[1].lower() + '-' + locale[0].lower()
47+ else:
48+ # tries to get a country code from language
49+ locale = locale[0].lower()
50+ lang_codes = [x[0] for x in language_codes]
51+ for lc in lang_codes:
52+ lc = lc.split('_')
53+ if locale == lc[0]:
54+ locale = lc[1].lower() + '-' + lc[0].lower()
55+ break
56+
57+ if locale:
58+ params['url'] = url.format(
59+ query=urlencode({'q': query, 'kl': locale}), offset=offset)
60+ else:
61+ params['url'] = url.format(
62+ query=urlencode({'q': query}), offset=offset)
4963
5064 return params
5165
tests/unit/engines/test_duckduckgo.py+2−6
@@ -11,16 +11,12 @@ class TestDuckduckgoEngine(SearxTestCase):
1111 query = 'test_query'
1212 dicto = defaultdict(dict)
1313 dicto['pageno'] = 1
14− dicto['language'] = 'fr_FR'
14+ dicto['language'] = 'de_CH'
1515 params = duckduckgo.request(query, dicto)
1616 self.assertIn('url', params)
1717 self.assertIn(query, params['url'])
1818 self.assertIn('duckduckgo.com', params['url'])
19− self.assertIn('fr-fr', params['url'])
20−
21− dicto['language'] = 'all'
22− params = duckduckgo.request(query, dicto)
23− self.assertIn('en-us', params['url'])
19+ self.assertIn('ch-de', params['url'])
2420
2521 def test_response(self):
2622 self.assertRaises(AttributeError, duckduckgo.response, None)