This commit is contained in:
soraefir
2026-06-05 00:16:05 +02:00
parent be5582c79b
commit e521c481f7

View File

@@ -3,6 +3,7 @@ let
serverCfg = config.syscfg.server; serverCfg = config.syscfg.server;
mediaCfg = config.syscfg.media; mediaCfg = config.syscfg.media;
port = 8080; port = 8080;
assetSize = 64;
cacheControl = containerCfg.extra.cacheControl or "public, max-age=86400"; cacheControl = containerCfg.extra.cacheControl or "public, max-age=86400";
priority = toString (containerCfg.extra.priority or 2147482647); priority = toString (containerCfg.extra.priority or 2147482647);
logoSvgFileName = builtins.baseNameOf (toString mediaCfg.logo.svg); logoSvgFileName = builtins.baseNameOf (toString mediaCfg.logo.svg);
@@ -48,6 +49,7 @@ let
CACHE_DIR = Path(os.environ.get("FAVICON_CACHE_DIR", "/cache")) CACHE_DIR = Path(os.environ.get("FAVICON_CACHE_DIR", "/cache"))
LISTEN_HOST = os.environ.get("FAVICON_LISTEN_HOST", "0.0.0.0") LISTEN_HOST = os.environ.get("FAVICON_LISTEN_HOST", "0.0.0.0")
LISTEN_PORT = int(os.environ.get("FAVICON_PORT", "8080")) LISTEN_PORT = int(os.environ.get("FAVICON_PORT", "8080"))
ASSET_SIZE = int(os.environ.get("FAVICON_ASSET_SIZE", "${toString assetSize}"))
DEFAULT_CACHE_CONTROL = "public, max-age=86400" DEFAULT_CACHE_CONTROL = "public, max-age=86400"
with open(CONFIG_PATH, "r", encoding="utf-8") as fh: with open(CONFIG_PATH, "r", encoding="utf-8") as fh:
@@ -66,44 +68,31 @@ let
def _color(value, fallback): def _color(value, fallback):
return value if isinstance(value, str) and value else fallback return value if isinstance(value, str) and value else fallback
def _replace_svg_color(svg, attribute, color):
if attribute in {"fill", "stroke"}:
svg = re.sub(
rf'{attribute}="(?!none\\b)[^"]*"',
f'{attribute}="{color}"',
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
rf"{attribute}='(?!none\\b)[^']*'",
f"{attribute}='{color}'",
svg,
flags=re.IGNORECASE,
)
return re.sub(
rf"{attribute}\\s*:\\s*(?!none\\b)[^;\"\\']+",
f"{attribute}:{color}",
svg,
flags=re.IGNORECASE,
)
def _tinted_logo_data_uri(color): def _tinted_logo_data_uri(color):
svg = LOGO_BYTES.decode("utf-8") svg = LOGO_BYTES.decode("utf-8")
svg = re.sub( svg = _replace_svg_color(svg, "fill", color)
r'fill="(?!none\b)[^"]*"', svg = _replace_svg_color(svg, "stroke", color)
f'fill="{color}"',
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
r"fill='(?!none\b)[^']*'",
f"fill='{color}'",
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
r'stroke="(?!none\b)[^"]*"',
f'stroke="{color}"',
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
r"stroke='(?!none\b)[^']*'",
f"stroke='{color}'",
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
r'fill\s*:\s*(?!none\b)[^;"\']+',
f"fill:{color}",
svg,
flags=re.IGNORECASE,
)
svg = re.sub(
r'stroke\s*:\s*(?!none\b)[^;"\']+',
f"stroke:{color}",
svg,
flags=re.IGNORECASE,
)
return "data:image/svg+xml;base64," + base64.b64encode(svg.encode("utf-8")).decode("ascii") return "data:image/svg+xml;base64," + base64.b64encode(svg.encode("utf-8")).decode("ascii")
def _border_radius(): def _border_radius():
@@ -133,9 +122,9 @@ let
CACHE_DIR.mkdir(parents=True, exist_ok=True) CACHE_DIR.mkdir(parents=True, exist_ok=True)
svg = _render_svg(profile).encode("utf-8") svg = _render_svg(profile).encode("utf-8")
png_bytes = cairosvg.svg2png(bytestring=svg, output_width=64, output_height=64) png_bytes = cairosvg.svg2png(bytestring=svg, output_width=ASSET_SIZE, output_height=ASSET_SIZE)
image = Image.open(BytesIO(png_bytes)) image = Image.open(BytesIO(png_bytes))
image.save(target, format="ICO", sizes=[(64, 64)]) image.save(target, format="ICO", sizes=[(ASSET_SIZE, ASSET_SIZE)])
image.close() image.close()
return target return target
@@ -177,8 +166,6 @@ let
tag = "1"; tag = "1";
contents = [ contents = [
pythonEnv pythonEnv
pkgs.fontconfig
pkgs.dejavu_fonts
pkgs.cacert pkgs.cacert
pkgs.tzdata pkgs.tzdata
]; ];
@@ -207,8 +194,7 @@ in {
FAVICON_LOGO = logoSvgMount; FAVICON_LOGO = logoSvgMount;
FAVICON_CACHE_DIR = "/cache"; FAVICON_CACHE_DIR = "/cache";
FAVICON_PORT = toString port; FAVICON_PORT = toString port;
FONTCONFIG_FILE = "${pkgs.fontconfig.out}/etc/fonts/fonts.conf"; FAVICON_ASSET_SIZE = toString assetSize;
FONTCONFIG_PATH = "${pkgs.fontconfig.out}/etc/fonts";
}; };
extraLabels = { extraLabels = {
"traefik.enable" = "true"; "traefik.enable" = "true";