__init__.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Implement request processores used by engine-types.
  4. """
  5. __all__ = [
  6. 'EngineProcessor',
  7. 'OfflineProcessor',
  8. 'OnlineProcessor',
  9. 'OnlineDictionaryProcessor',
  10. 'OnlineCurrencyProcessor',
  11. 'PROCESSORS',
  12. ]
  13. import threading
  14. from searx import logger
  15. from searx import engines
  16. from .online import OnlineProcessor
  17. from .offline import OfflineProcessor
  18. from .online_dictionary import OnlineDictionaryProcessor
  19. from .online_currency import OnlineCurrencyProcessor
  20. from .abstract import EngineProcessor
  21. logger = logger.getChild('search.processors')
  22. PROCESSORS = {}
  23. """Cache request processores, stored by *engine-name* (:py:func:`initialize`)"""
  24. def get_processor_class(engine_type):
  25. """Return processor class according to the ``engine_type``"""
  26. for c in [OnlineProcessor, OfflineProcessor, OnlineDictionaryProcessor, OnlineCurrencyProcessor]:
  27. if c.engine_type == engine_type:
  28. return c
  29. return None
  30. def get_processor(engine, engine_name):
  31. """Return processor instance that fits to ``engine.engine.type``)"""
  32. engine_type = getattr(engine, 'engine_type', 'online')
  33. processor_class = get_processor_class(engine_type)
  34. if processor_class:
  35. return processor_class(engine, engine_name)
  36. return None
  37. def initialize_processor(processor):
  38. """Initialize one processor
  39. Call the init function of the engine
  40. """
  41. if processor.has_initialize_function:
  42. t = threading.Thread(target=processor.initialize, daemon=True)
  43. t.start()
  44. def initialize(engine_list):
  45. """Initialize all engines and store a processor for each engine in :py:obj:`PROCESSORS`."""
  46. for engine_data in engine_list:
  47. engine_name = engine_data['name']
  48. engine = engines.engines.get(engine_name)
  49. if engine:
  50. processor = get_processor(engine, engine_name)
  51. initialize_processor(processor)
  52. if processor is None:
  53. logger.error('Error get processor for engine %s', engine_name)
  54. else:
  55. PROCESSORS[engine_name] = processor