2 Commits

Author SHA1 Message Date
vojkovic
8892414dc3 [feat] add kagi favicon resolver 2026-08-01 11:09:50 +08:00
dependabot[bot]
6bfd82705a [upd] github-actions: Bump docker/login-action from 4.5.0 to 4.5.2 (#6478)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.5.0 to 4.5.2.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](06fb636fac...371161bbe7)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.5.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-31 17:03:08 +02:00
5 changed files with 26 additions and 6 deletions

View File

@@ -50,7 +50,7 @@ jobs:
steps:
- name: Login to GHCR
uses: docker/login-action@06fb636fac595d6fb4b28a5dfcb21a6f5091859c # v4.5.0
uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"
@@ -110,7 +110,7 @@ jobs:
steps:
- name: Login to GHCR
uses: docker/login-action@06fb636fac595d6fb4b28a5dfcb21a6f5091859c # v4.5.0
uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"
@@ -144,14 +144,14 @@ jobs:
steps:
- name: Login to Docker Hub
uses: docker/login-action@06fb636fac595d6fb4b28a5dfcb21a6f5091859c # v4.5.0
uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
with:
registry: "docker.io"
username: "${{ secrets.DOCKER_USER }}"
password: "${{ secrets.DOCKER_TOKEN }}"
- name: Login to GHCR
uses: docker/login-action@06fb636fac595d6fb4b28a5dfcb21a6f5091859c # v4.5.0
uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"

View File

@@ -29,6 +29,7 @@ By default and without any extensions, SearXNG serves these resolvers:
- ``duckduckgo``
- ``allesedv``
- ``google``
- ``kagi``
- ``yandex``
With the above setting favicons are displayed, the user has the option to
@@ -208,6 +209,7 @@ choose from, the following configuration could be used:
"duckduckgo" = "searx.favicons.resolvers.duckduckgo"
"allesedv" = "searx.favicons.resolvers.allesedv"
# "google" = "searx.favicons.resolvers.google"
# "kagi" = "searx.favicons.resolvers.kagi"
# "yandex" = "searx.favicons.resolvers.yandex"
.. note::
@@ -226,6 +228,7 @@ into the *proxy*:
- :py:obj:`searx.favicons.resolvers.duckduckgo`
- :py:obj:`searx.favicons.resolvers.allesedv`
- :py:obj:`searx.favicons.resolvers.google`
- :py:obj:`searx.favicons.resolvers.kagi`
- :py:obj:`searx.favicons.resolvers.yandex`

View File

@@ -13,6 +13,7 @@ cfg_schema = 1 # config's schema version no.
# "duckduckgo" = "searx.favicons.resolvers.duckduckgo"
# "allesedv" = "searx.favicons.resolvers.allesedv"
# "google" = "searx.favicons.resolvers.google"
# "kagi" = "searx.favicons.resolvers.kagi"
# "yandex" = "searx.favicons.resolvers.yandex"
[favicons.cache]

View File

@@ -7,7 +7,7 @@ timeout``) and returns a tuple ``(data, mime)``.
"""
__all__ = ["DEFAULT_RESOLVER_MAP", "allesedv", "duckduckgo", "google", "yandex"]
__all__ = ["DEFAULT_RESOLVER_MAP", "allesedv", "duckduckgo", "google", "kagi", "yandex"]
from typing import Callable
from searx import network
@@ -76,6 +76,21 @@ def google(domain: str, timeout: int) -> tuple[None | bytes, None | str]:
return data, mime
def kagi(domain: str, timeout: int) -> tuple[None | bytes, None | str]:
"""Favicon Resolver from kagi.com / https://news.kagi.com/api/favicon-proxy"""
data, mime = (None, None)
# quality can be either 'fast' or 'best', best is slower and can return svgs (e.g. github.com)
url = f"https://news.kagi.com/api/favicon-proxy?domain={domain}&quality=fast"
logger.debug("fetch favicon from: %s", url)
# will return a 404 if the favicon does not exist and a 200 if it does,
response = network.get(url, **_req_args(timeout=timeout))
if response and response.status_code == 200:
mime = response.headers['Content-Type']
data = response.content
return data, mime
def yandex(domain: str, timeout: int) -> tuple[None | bytes, None | str]:
"""Favicon Resolver from yandex.com"""
data, mime = (None, None)
@@ -95,5 +110,6 @@ DEFAULT_RESOLVER_MAP = {
"allesedv": allesedv,
"duckduckgo": duckduckgo,
"google": google,
"kagi": kagi,
"yandex": yandex,
}

View File

@@ -47,7 +47,7 @@ search:
# minimun characters to type before autocompleter starts
autocomplete_min: 4
# backend for the favicon near URL in search results.
# Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default.
# Available resolvers: "allesedv", "duckduckgo", "google", "kagi", "yandex" - leave blank to turn it off by default.
favicon_resolver: ""
# Default search language - leave blank to detect from browser information or
# use codes from 'languages.py'