bitstamp_metadata.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 load_market_by_symbol(market_symbol: str) -> dict | None:
  31. symbol = market_symbol.lower()
  32. for item in load_metadata("markets"):
  33. if str(item.get("market_symbol", "")).lower() == symbol:
  34. return item
  35. return None
  36. def list_markets() -> list[dict]:
  37. return load_metadata("markets")
  38. def list_currencies() -> list[dict]:
  39. return load_metadata("currencies")
  40. def refresh_metadata() -> dict:
  41. currencies = fetch_currencies()
  42. markets = fetch_markets()
  43. save_metadata("currencies", currencies)
  44. save_metadata("markets", markets)
  45. return {"currencies": len(currencies), "markets": len(markets)}
  46. def _item_key(kind: str, item: dict) -> str:
  47. if kind == "currencies":
  48. return str(item.get("code") or item.get("currency") or item.get("id") or "")
  49. if kind == "markets":
  50. return str(item.get("name") or item.get("pair") or item.get("url_symbol") or item.get("id") or "")
  51. return str(item.get("id") or item.get("name") or "")