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()