| 
							
							# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						
						
						
						
							 | 
							
							""".. sidebar:: Further reading ..
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							   - :ref:`plugins admin`
 | 
						
						
						
						
							 | 
							
							   - :ref:`SearXNG settings <settings plugins>`
 | 
						
						
						
						
							 | 
							
							   - :ref:`builtin plugins`
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							Plugins can extend or replace functionality of various components of SearXNG.
 | 
						
						
						
						
							 | 
							
							Here is an example of a very simple plugin that adds a "Hello" into the answer
 | 
						
						
						
						
							 | 
							
							area:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							.. code:: python
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							   from flask_babel import gettext as _
 | 
						
						
						
						
							 | 
							
							   from searx.plugins import Plugin
 | 
						
						
						
						
							 | 
							
							   from searx.result_types import Answer
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							   class MyPlugin(Plugin):
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							       id = "self_info"
 | 
						
						
						
						
							 | 
							
							       default_on = True
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							       def __init__(self):
 | 
						
						
						
						
							 | 
							
							           super().__init__()
 | 
						
						
						
						
							 | 
							
							           info = PluginInfo(id=self.id, name=_("Hello"), description=_("demo plugin"))
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							       def post_search(self, request, search):
 | 
						
						
						
						
							 | 
							
							           return [ Answer(answer="Hello") ]
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							Entry points (hooks) define when a plugin runs.  Right now only three hooks are
 | 
						
						
						
						
							 | 
							
							implemented.  So feel free to implement a hook if it fits the behaviour of your
 | 
						
						
						
						
							 | 
							
							plugin / a plugin doesn't need to implement all the hooks.
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							- pre search: :py:obj:`Plugin.pre_search`
 | 
						
						
						
						
							 | 
							
							- post search: :py:obj:`Plugin.post_search`
 | 
						
						
						
						
							 | 
							
							- on each result item: :py:obj:`Plugin.on_result`
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							For a coding example have a look at :ref:`self_info plugin`.
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							----
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							.. autoclass:: Plugin
 | 
						
						
						
						
							 | 
							
							   :members:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							.. autoclass:: PluginInfo
 | 
						
						
						
						
							 | 
							
							   :members:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							.. autoclass:: PluginStorage
 | 
						
						
						
						
							 | 
							
							   :members:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							.. autoclass:: searx.plugins._core.ModulePlugin
 | 
						
						
						
						
							 | 
							
							   :members:
 | 
						
						
						
						
							 | 
							
							   :show-inheritance:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							"""
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from __future__ import annotations
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							__all__ = ["PluginInfo", "Plugin", "PluginStorage"]
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from ._core import PluginInfo, Plugin, PluginStorage
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							STORAGE: PluginStorage = PluginStorage()
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							def initialize(app):
 | 
						
						
						
						
							 | 
							
							    STORAGE.load_builtins()
 | 
						
						
						
						
							 | 
							
							    STORAGE.init(app)
 |