| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | # SPDX-License-Identifier: AGPL-3.0-or-later# lint: pylint"""Implement request processors used by engine-types."""__all__ = [    'EngineProcessor',    'OfflineProcessor',    'OnlineProcessor',    'OnlineDictionaryProcessor',    'OnlineCurrencyProcessor',    'OnlineUrlSearchProcessor',    'PROCESSORS',]import threadingfrom typing import Dictfrom searx import loggerfrom searx import enginesfrom .online import OnlineProcessorfrom .offline import OfflineProcessorfrom .online_dictionary import OnlineDictionaryProcessorfrom .online_currency import OnlineCurrencyProcessorfrom .online_url_search import OnlineUrlSearchProcessorfrom .abstract import EngineProcessorlogger = logger.getChild('search.processors')PROCESSORS: Dict[str, EngineProcessor] = {}"""Cache request processors, stored by *engine-name* (:py:func:`initialize`):meta hide-value:"""def get_processor_class(engine_type):    """Return processor class according to the ``engine_type``"""    for c in [        OnlineProcessor,        OfflineProcessor,        OnlineDictionaryProcessor,        OnlineCurrencyProcessor,        OnlineUrlSearchProcessor,    ]:        if c.engine_type == engine_type:            return c    return Nonedef get_processor(engine, engine_name):    """Return processor instance that fits to ``engine.engine.type``)"""    engine_type = getattr(engine, 'engine_type', 'online')    processor_class = get_processor_class(engine_type)    if processor_class:        return processor_class(engine, engine_name)    return Nonedef initialize_processor(processor):    """Initialize one processor    Call the init function of the engine    """    if processor.has_initialize_function:        t = threading.Thread(target=processor.initialize, daemon=True)        t.start()def initialize(engine_list):    """Initialize all engines and store a processor for each engine in :py:obj:`PROCESSORS`."""    for engine_data in engine_list:        engine_name = engine_data['name']        engine = engines.engines.get(engine_name)        if engine:            processor = get_processor(engine, engine_name)            initialize_processor(processor)            if processor is None:                engine.logger.error('Error get processor for engine %s', engine_name)            else:                PROCESSORS[engine_name] = processor
 |