From 0eba67f7685b267037ea414d6b2147d2d3afdc2b Mon Sep 17 00:00:00 2001 From: Patrick Toft Steffensen <17211264+PTST@users.noreply.github.com> Date: Thu, 30 May 2024 13:24:46 +0200 Subject: [PATCH] add region_support --- LibreView/LibreView.py | 9 +++++++-- LibreView/utils/API.py | 28 ++++++++++++++++++---------- Tests/test_client.py | 3 +++ setup.py | 4 ++-- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/LibreView/LibreView.py b/LibreView/LibreView.py index 1d49ec6..039c987 100644 --- a/LibreView/LibreView.py +++ b/LibreView/LibreView.py @@ -1,4 +1,5 @@ -from typing import List +from typing import Dict, List +from uuid import UUID from LibreView.models import Connection from LibreView.utils import API @@ -6,8 +7,12 @@ class LibreView: client: API + connections_dict: Dict[UUID, Connection] + def __init__(self, username: str, password: str): self.client = API(username, password) def get_connections(self) -> List[Connection]: - return self.client.get_connections() + cons = self.client.get_connections() + self.connections_dict = {x.id: x for x in cons} + return cons diff --git a/LibreView/utils/API.py b/LibreView/utils/API.py index 7396020..7aae789 100644 --- a/LibreView/utils/API.py +++ b/LibreView/utils/API.py @@ -1,4 +1,4 @@ -from typing import List +from typing import Optional import requests from LibreView.models import User, Connection @@ -18,14 +18,13 @@ def wrapper(*args): class API: - username: str - password: str - base_url = "https://api.libreview.io" - client = requests.session() - product = "llu.android" - version = "4.7" - - def __init__(self, username: str, password: str): + def __init__(self, username: str, password: str, region: Optional[str] = None): + self.base_url = "https://api.libreview.io" + if region: + self.base_url = f"https://api-{region}.libreview.io" + self.client = requests.session() + self.product = "llu.android" + self.version = "4.7" self.username = username self.password = password self.client.headers["product"] = self.product @@ -39,10 +38,16 @@ def authenticate(self): "email": self.username, "password": self.password, }, + verify=False ) r.raise_for_status() content = r.json() + if content and content.get("status") == 0 and content["data"].get("redirect", False): + region = content["data"]["region"] + self.base_url = f"https://api-{region}.libreview.io" + return self.authenticate() + # status 0 == login successfull if content and content.get("status") == 0: self.set_token(content["data"]["authTicket"]["token"]) @@ -68,6 +73,7 @@ def accept_terms(self, token): headers={ "Authorization": f"Bearer {token}", }, + verify=False ) r.raise_for_status() content = r.json() @@ -79,14 +85,16 @@ def accept_terms(self, token): def get_user(self) -> User: r = self.client.get( f"{self.base_url}/user", + verify=False ) r.raise_for_status() return User.from_dict(r.json()["data"]["user"]) @reauth_on_fail - def get_connections(self) -> List[Connection]: + def get_connections(self) -> list[Connection]: r = self.client.get( f"{self.base_url}/llu/connections", + verify=False ) r.raise_for_status() return Connection.from_list(r.json()["data"]) diff --git a/Tests/test_client.py b/Tests/test_client.py index 9491b05..7bf0f6a 100644 --- a/Tests/test_client.py +++ b/Tests/test_client.py @@ -48,3 +48,6 @@ def test_connections(): assert isinstance(gm.factory_timestamp, datetime) assert isinstance(gm.timestamp, datetime) assert isinstance(gm.trend_message, str) or gm.trend_message is None + + assert libre.connections_dict is not None + assert len(libre.connections_dict) > 0 diff --git a/setup.py b/setup.py index 0855087..e6e732b 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="LibreView", - version="0.0.5", + version="0.1.2", author="PTST", author_email="patrick@steffensen.io", description="API interface for LibreView / LibreLinkUp glucose readings", @@ -13,7 +13,7 @@ long_description_content_type="text/markdown", url="https://github.com/PTST/LibreView_Py", packages=setuptools.find_packages(), - install_requires=["requests >= 2.31.0"], + install_requires=["requests >= 2.31.0", "dataclass-wizard >= 0.22.3"], classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License",