Compare commits
5
Commits
old
...
b4b0ccdac6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4b0ccdac6 | ||
|
|
32664c3a10 | ||
|
|
41ce94c85c | ||
|
|
397eddf299 | ||
|
|
8affb90308 |
No files matched your search
@@ -9,6 +9,7 @@ __pycache__/
|
||||
*.sqlite3
|
||||
*.log
|
||||
poetry.lock
|
||||
uv.lock
|
||||
bin/build/
|
||||
.zip
|
||||
snippet.py
|
||||
|
||||
+7
-10
@@ -2,12 +2,10 @@
|
||||
name = "edderkop"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = [
|
||||
{name = "CF", email = "chris-forst@pm.me"}
|
||||
]
|
||||
license = {text = "MIT"}
|
||||
readme = "README.md"
|
||||
authors = [{ name = "CF", email = "ph0sgene@pm.me" }]
|
||||
requires-python = ">=3.13,<3.14"
|
||||
readme = "README.md"
|
||||
license = { text = "MIT" }
|
||||
dependencies = [
|
||||
"aiohttp (>=3.12.13,<4.0.0)",
|
||||
"dotenv (>=0.9.9,<0.10.0)",
|
||||
@@ -20,13 +18,12 @@ dependencies = [
|
||||
"aiosqlite (>=0.21.0,<0.22.0)",
|
||||
]
|
||||
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[tool.poetry]
|
||||
package-mode = false
|
||||
[tool.uv]
|
||||
package = false
|
||||
|
||||
[tool.bricksetapi]
|
||||
version = "0.1.0"
|
||||
|
||||
+26
-4
@@ -17,7 +17,7 @@ dotenv.load_dotenv()
|
||||
class AsyncBricksetAPI:
|
||||
"""Asynchronous client for the Brickset API"""
|
||||
|
||||
def __init__(self, debug: bool = False):
|
||||
def __init__(self, debug: bool = False, logger=None):
|
||||
self.username = os.getenv("BRICKSET_USERNAME")
|
||||
self.password = os.getenv("BRICKSET_PASS")
|
||||
self.api_key = os.getenv("BRICKSET_API_KEY")
|
||||
@@ -25,6 +25,7 @@ class AsyncBricksetAPI:
|
||||
self.headers = {"UserAgent": "Edderkop/0.1"}
|
||||
self.throttler = Throttler(rate_limit=500, period=60)
|
||||
self.user_hash = None
|
||||
self.logger = logger
|
||||
|
||||
async def login(self) -> Dict[str, Any]:
|
||||
"""Asynchronously authenticate with Brickset API"""
|
||||
@@ -41,10 +42,15 @@ class AsyncBricksetAPI:
|
||||
) as response:
|
||||
if self.debug:
|
||||
print(f"[@DEBUG] Login response status: {response.status}")
|
||||
if self.logger:
|
||||
self.logger.debug(f"Login response status: {response.status}")
|
||||
|
||||
data = await response.read()
|
||||
result = json.loads(data.decode("utf-8"))
|
||||
self.user_hash = result.get("hash")
|
||||
|
||||
if self.logger:
|
||||
self.logger.info("Successfully authenticated with Brickset API")
|
||||
return result
|
||||
|
||||
async def get_set(self, set_number: str) -> Dict[str, Any]:
|
||||
@@ -73,13 +79,23 @@ class AsyncBricksetAPI:
|
||||
) as response:
|
||||
if self.debug:
|
||||
print(f"[@DEBUG] Get set response status: {response.status}")
|
||||
if self.logger:
|
||||
self.logger.debug(f"Get set response status: {response.status}")
|
||||
|
||||
if response.status == 200:
|
||||
data = await response.read()
|
||||
result = json.loads(data.decode("utf-8"))
|
||||
|
||||
if not result.get("sets"):
|
||||
raise ValueError(f"No data found for set {set_number}")
|
||||
error_msg = f"No data found for set {set_number}"
|
||||
if self.logger:
|
||||
self.logger.error(error_msg)
|
||||
raise ValueError(error_msg)
|
||||
|
||||
if self.logger:
|
||||
self.logger.info(
|
||||
f"Successfully retrieved data for set {set_number}"
|
||||
)
|
||||
|
||||
set_data = result["sets"][0]
|
||||
our_set = {
|
||||
@@ -111,11 +127,17 @@ class AsyncBricksetAPI:
|
||||
return our_set
|
||||
|
||||
elif response.status == 500:
|
||||
raise Exception(
|
||||
error_msg = (
|
||||
"Internal Server Error: Please check API key and parameters."
|
||||
)
|
||||
if self.logger:
|
||||
self.logger.error(error_msg)
|
||||
raise Exception(error_msg)
|
||||
else:
|
||||
raise Exception(f"Unexpected response: {response.status}")
|
||||
error_msg = f"Unexpected response: {response.status}"
|
||||
if self.logger:
|
||||
self.logger.error(error_msg)
|
||||
raise Exception(error_msg)
|
||||
|
||||
async def throttled_get_set(self, set_number: str) -> Dict[str, Any]:
|
||||
"""Get set information with rate limiting"""
|
||||
|
||||
+13
-6
@@ -9,6 +9,7 @@ import dotenv
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
from logging.handlers import RotatingFileHandler
|
||||
from pathlib import Path
|
||||
|
||||
Path("./logs/").mkdir(parents=True, exist_ok=True)
|
||||
@@ -18,7 +19,6 @@ import get_sq_env
|
||||
import asquare as sq
|
||||
from abricksetapi import AsyncBricksetAPI
|
||||
|
||||
lego = AsyncBricksetAPI(debug=True)
|
||||
|
||||
dotenv.load_dotenv()
|
||||
SQUARE_LEGO_CAT_ID = os.environ.get("SQUARE_LEGO_CAT_ID")
|
||||
@@ -26,16 +26,23 @@ SQUARE_LEGO_CAT_ID = os.environ.get("SQUARE_LEGO_CAT_ID")
|
||||
|
||||
from asyncio_throttle.throttler import Throttler
|
||||
|
||||
logger = logging.getLogger("aiohttp.access")
|
||||
logging.basicConfig(
|
||||
filename="./logs/edderkop.log", encoding="utf-8", level=logging.DEBUG
|
||||
)
|
||||
# set up logger
|
||||
logger = logging.getLogger("edderkop")
|
||||
logger.setLevel(logging.DEBUG)
|
||||
handler = RotatingFileHandler("./logs/", maxBytes=1024, backupCount=5)
|
||||
logger.addHandler(handler)
|
||||
|
||||
lego = AsyncBricksetAPI(debug=True, logger=logger)
|
||||
|
||||
# logging.basicConfig(
|
||||
# filename="./logs/edderkop.log", encoding="utf-8", level=logging.DEBUG
|
||||
# )
|
||||
|
||||
UA = re.compile(r"^kopling\/?", re.IGNORECASE)
|
||||
|
||||
|
||||
async def run_update():
|
||||
set_list = await sq.acat2id(SQUARE_LEGO_CAT_ID)
|
||||
set_list = await sq.acat2id(SQUARE_LEGO_CAT_ID) # type: ignore
|
||||
for l_set in set_list:
|
||||
print(f"[@DEBUG]{l_set}")
|
||||
l_setinfo = await lego.throttled_get_set(l_set["number"])
|
||||
|
||||
Reference in new issue
Block a user