translated.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """
  2. MyMemory Translated
  3. @website https://mymemory.translated.net/
  4. @provide-api yes (https://mymemory.translated.net/doc/spec.php)
  5. @using-api yes
  6. @results JSON
  7. @stable yes
  8. @parse url, title, content
  9. """
  10. import re
  11. from urlparse import urljoin
  12. from lxml import html
  13. from cgi import escape
  14. from searx.engines.xpath import extract_text
  15. from searx.languages import language_codes
  16. categories = ['general']
  17. url = 'http://api.mymemory.translated.net/get?q={query}' \
  18. '&langpair={from_lang}|{to_lang}{key}'
  19. web_url = 'http://mymemory.translated.net/en/{from_lang}/{to_lang}/{query}'
  20. weight = 100
  21. parser_re = re.compile(u'.*?([a-z]+)-([a-z]+) (.{2,})$', re.I)
  22. api_key = ''
  23. def is_valid_lang(lang):
  24. is_abbr = (len(lang) == 2)
  25. if is_abbr:
  26. for l in language_codes:
  27. if l[0][:2] == lang.lower():
  28. return (True, l[0][:2], l[1].lower())
  29. return False
  30. else:
  31. for l in language_codes:
  32. if l[1].lower() == lang.lower():
  33. return (True, l[0][:2], l[1].lower())
  34. return False
  35. def request(query, params):
  36. m = parser_re.match(unicode(query, 'utf8'))
  37. if not m:
  38. return params
  39. from_lang, to_lang, query = m.groups()
  40. from_lang = is_valid_lang(from_lang)
  41. to_lang = is_valid_lang(to_lang)
  42. if not from_lang or not to_lang:
  43. return params
  44. if api_key:
  45. key_form = '&key=' + api_key
  46. else:
  47. key_form = ''
  48. params['url'] = url.format(from_lang=from_lang[1],
  49. to_lang=to_lang[1],
  50. query=query,
  51. key=key_form)
  52. params['query'] = query
  53. params['from_lang'] = from_lang
  54. params['to_lang'] = to_lang
  55. return params
  56. def response(resp):
  57. results = []
  58. results.append({
  59. 'url': escape(web_url.format(
  60. from_lang=resp.search_params['from_lang'][2],
  61. to_lang=resp.search_params['to_lang'][2],
  62. query=resp.search_params['query'])),
  63. 'title': escape('[{0}-{1}] {2}'.format(
  64. resp.search_params['from_lang'][1],
  65. resp.search_params['to_lang'][1],
  66. resp.search_params['query'])),
  67. 'content': escape(resp.json()['responseData']['translatedText'])
  68. })
  69. return results