from cairosvg import svg2png from django.http import HttpResponse, HttpResponseServerError from django.views.decorators.cache import cache_page favicon = """ """ colors = { "base": { "light": "#eff1f5", "dark": "#1e1e2e" }, "accent": { "light": { "rosewater": "#dc8a78", "flamingo": "#dd7878", "pink": "#ea76cb", "mauve": "#8839ef", "red": "#d20f39", "maroon": "#e64553", "peach": "#fe640b", "yellow": "#df8e1d", "green": "#40a02b", "teal": "#179299", "sky": "#04a5e5", "sapphire": "#209fb5", "blue": "#1e66f5", "lavender": "#7287fd" }, "dark": { "rosewater": "#f5e0dc", "flamingo": "#f2cdcd", "pink": "#f5c2e7", "mauve": "#cba6f7", "red": "#f38ba8", "maroon": "#eba0ac", "peach": "#fab387", "yellow": "#f9e2af", "green": "#a6e3a1", "teal": "#94e2d5", "sky": "#89dceb", "sapphire": "#74c7ec", "blue": "#89b4fa", "lavender": "#b4befe" } } } @cache_page(60 * 60 * 2) def generate_favicon(request, theme, accent) -> HttpResponse | HttpResponseServerError: png_data: bytes | None = svg2png( favicon.replace("{{ BASE }}", colors["base"][theme]).replace("{{ ACCENT }}", colors["accent"][theme][accent]), output_width=64, output_height=64 ) if not isinstance(png_data, bytes): return HttpResponseServerError("500 Internal Server Error") return HttpResponse(png_data, content_type="image/png")