Some checks are pending
Python lint and test / linttest (push) Waiting to run
55 lines
1.3 KiB
Python
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()
|