2024-03-25 18:22:18 +01:00
|
|
|
import requests as r
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from logging import getLogger
|
|
|
|
|
|
|
|
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class NotFound(Exception):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
class ParseError(Exception):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class Product:
|
|
|
|
name: str
|
|
|
|
kcal: float
|
|
|
|
fat: float
|
|
|
|
protein: float
|
|
|
|
carb: float
|
|
|
|
fiber: float
|
|
|
|
|
|
|
|
|
|
|
|
def find(bar_code: str) -> Product:
|
|
|
|
url = f"https://world.openfoodfacts.org/api/v2/product/{bar_code}.json"
|
|
|
|
response = r.get(url)
|
|
|
|
|
|
|
|
if response.status_code == 404:
|
|
|
|
raise NotFound()
|
|
|
|
|
|
|
|
try:
|
|
|
|
data = response.json()
|
|
|
|
|
|
|
|
name = data["product"]["product_name"]
|
|
|
|
|
|
|
|
if data["product"]["brands"]:
|
|
|
|
name = data["product"]["brands"] + " " + name
|
|
|
|
|
|
|
|
return Product(
|
|
|
|
name=name,
|
|
|
|
kcal=data["product"]["nutriments"]["energy-kcal_100g"],
|
|
|
|
fat=data["product"]["nutriments"]["fat_100g"],
|
|
|
|
protein=data["product"]["nutriments"]["proteins_100g"],
|
|
|
|
carb=data["product"]["nutriments"]["carbohydrates_100g"],
|
|
|
|
fiber=data["product"]["nutriments"].get("fiber_100g", 0.0),
|
|
|
|
)
|
|
|
|
except Exception as e:
|
2024-05-20 12:10:17 +02:00
|
|
|
raise e
|
2024-03-25 18:22:18 +01:00
|
|
|
logger.error(e)
|
|
|
|
raise ParseError()
|