bitstamp_metadata.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from __future__ import annotations
  2. import requests
  3. from .storage import get_connection
  4. BITSTAMP_BASE_URL = "https://www.bitstamp.net"
  5. METADATA_REFRESH_SECONDS = 24 * 60 * 60
  6. def fetch_currencies() -> list[dict]:
  7. response = requests.get(f"{BITSTAMP_BASE_URL}/api/v2/currencies/", timeout=30)
  8. response.raise_for_status()
  9. return response.json()
  10. def fetch_markets() -> list[dict]:
  11. response = requests.get(f"{BITSTAMP_BASE_URL}/api/v2/markets/", timeout=30)
  12. response.raise_for_status()
  13. return response.json()
  14. def save_metadata(kind: str, payload: list[dict]) -> None:
  15. with get_connection() as conn:
  16. conn.execute("DELETE FROM bitstamp_metadata WHERE kind = ?", (kind,))
  17. for item in payload:
  18. conn.execute(
  19. "INSERT INTO bitstamp_metadata (kind, item_key, payload_json) VALUES (?, ?, ?)",
  20. (kind, _item_key(kind, item), __import__("json").dumps(item)),
  21. )
  22. conn.commit()
  23. def load_metadata(kind: str) -> list[dict]:
  24. with get_connection() as conn:
  25. rows = conn.execute(
  26. "SELECT payload_json FROM bitstamp_metadata WHERE kind = ? ORDER BY item_key ASC",
  27. (kind,),
  28. ).fetchall()
  29. return [__import__("json").loads(row["payload_json"]) for row in rows]
  30. def refresh_metadata() -> dict:
  31. currencies = fetch_currencies()
  32. markets = fetch_markets()
  33. save_metadata("currencies", currencies)
  34. save_metadata("markets", markets)
  35. return {"currencies": len(currencies), "markets": len(markets)}
  36. def _item_key(kind: str, item: dict) -> str:
  37. if kind == "currencies":
  38. return str(item.get("code") or item.get("currency") or item.get("id") or "")
  39. if kind == "markets":
  40. return str(item.get("name") or item.get("pair") or item.get("url_symbol") or item.get("id") or "")
  41. return str(item.get("id") or item.get("name") or "")