__init__.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. 'OnlineUrlSearchProcessor',
  12. 'PROCESSORS',
  13. ]
  14. import threading
  15. from typing import Dict
  16. from searx import logger
  17. from searx import engines
  18. from .online import OnlineProcessor
  19. from .offline import OfflineProcessor
  20. from .online_dictionary import OnlineDictionaryProcessor
  21. from .online_currency import OnlineCurrencyProcessor
  22. from .online_url_search import OnlineUrlSearchProcessor
  23. from .abstract import EngineProcessor
  24. logger = logger.getChild('search.processors')
  25. PROCESSORS: Dict[str, EngineProcessor] = {}
  26. """Cache request processores, stored by *engine-name* (:py:func:`initialize`)
  27. :meta hide-value:
  28. """
  29. def get_processor_class(engine_type):
  30. """Return processor class according to the ``engine_type``"""
  31. for c in [
  32. OnlineProcessor,
  33. OfflineProcessor,
  34. OnlineDictionaryProcessor,
  35. OnlineCurrencyProcessor,
  36. OnlineUrlSearchProcessor,
  37. ]:
  38. if c.engine_type == engine_type:
  39. return c
  40. return None
  41. def get_processor(engine, engine_name):
  42. """Return processor instance that fits to ``engine.engine.type``)"""
  43. engine_type = getattr(engine, 'engine_type', 'online')
  44. processor_class = get_processor_class(engine_type)
  45. if processor_class:
  46. return processor_class(engine, engine_name)
  47. return None
  48. def initialize_processor(processor):
  49. """Initialize one processor
  50. Call the init function of the engine
  51. """
  52. if processor.has_initialize_function:
  53. t = threading.Thread(target=processor.initialize, daemon=True)
  54. t.start()
  55. def initialize(engine_list):
  56. """Initialize all engines and store a processor for each engine in :py:obj:`PROCESSORS`."""
  57. for engine_data in engine_list:
  58. engine_name = engine_data['name']
  59. engine = engines.engines.get(engine_name)
  60. if engine:
  61. processor = get_processor(engine, engine_name)
  62. initialize_processor(processor)
  63. if processor is None:
  64. engine.logger.error('Error get processor for engine %s', engine_name)
  65. else:
  66. PROCESSORS[engine_name] = processor