import asyncio import json import logging import os import time from datetime import datetime import httpx import websockets from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import FileResponse, HTMLResponse, JSONResponse from fastapi.staticfiles import StaticFiles logging.basicConfig(level=logging.INFO) logger = logging.getLogger("btcprice") BTCDATA_URL = os.environ.get("BTCDATA_URL", "http://localhost:4100").rstrip("/") APP_VERSION = os.environ.get("APP_VERSION", "development") READINESS_TIMEOUT_SECONDS = 3.0 app = FastAPI() app.mount("/css", StaticFiles(directory="resources/public/css"), name="css") @app.get("/favicon.ico", include_in_schema=False) async def favicon(): return FileResponse("resources/public/favicon.svg", media_type="image/svg+xml") # --- HTML page --- HOME_HTML = """\
Connecting...
Loading Strike rates...
1h Candles (1m)
24h Candles (30m)
{formatted_price}
' ) if data.get("price_eur") is not None: p_eur = float(data["price_eur"]) p_dkk = float(data["price_dkk"]) eur_rate = p_eur / p dkk_rate = p_dkk / p html += ( 'Updated {ts}
' html += "' f'{da_fmt(",d", sats)} sats
' ) html += '