fooder-api/fooder/utils/product_finder.py
Piotr Domański 9792b0feb3
Some checks are pending
Python lint and test / linttest (push) Waiting to run
bar
2026-04-02 11:59:07 +02:00

55 lines
1.3 KiB
Python

from dataclasses import dataclass
from logging import getLogger
import requests as r
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, headers={"User-Agent": "fooder/1.0"})
if response.status_code == 404:
raise NotFound()
try:
data = response.json()
product_data = data["product"]
name = product_data.get("product_name_pl") or product_data.get("product_name")
brands = product_data.get("brands")
if brands:
name = brands + " " + name
nutriments = product_data["nutriments"]
return Product(
name=name,
kcal=nutriments.get("energy-kcal_100g") or 0.0,
fat=nutriments.get("fat_100g") or 0.0,
protein=nutriments.get("proteins_100g") or 0.0,
carb=nutriments.get("carbohydrates_100g") or 0.0,
fiber=nutriments.get("fiber_100g") or 0.0,
)
except Exception as e:
logger.error(e)
raise ParseError()