calorimeter/lib/food_scan/food_fact_lookup.dart

113 lines
2.8 KiB
Dart
Raw Normal View History

2024-12-07 12:29:34 +00:00
/* SPDX-License-Identifier: GPL-3.0-or-later */
2024-12-07 12:39:11 +00:00
/* Copyright (C) 2024 Marco Groß <mgross@sw-gross.de> */
2024-09-06 16:51:24 +00:00
import 'dart:convert';
import 'dart:developer';
2024-09-06 16:51:24 +00:00
import 'dart:io';
class FoodFactLookupClient {
FoodFactLookupClient();
static const String url = "https://world.openfoodfacts.org/api/v3/product/";
String getProductUrl(String ean) {
return "$url$ean.json";
}
Future<FoodFactResponse> retrieveFoodInfo(String ean) async {
2024-09-06 16:51:24 +00:00
HttpClient client = HttpClient();
String asString = "";
try {
var request = await client.getUrl(Uri.parse(getProductUrl(ean)));
var response = await request.close();
if (response.statusCode != HttpStatus.ok) {
return FoodFactResponse(
food: null, status: FoodFactResponseStatus.barcodeNotFound);
}
asString = await response.transform(utf8.decoder).join();
} on SocketException {
return FoodFactResponse(
food: null,
status: FoodFactResponseStatus.foodFactServerNotReachable);
} catch (e) {
log(e.toString());
} finally {
client.close();
}
return FoodFactResponse(
food: FoodFactModel.fromJson(jsonDecode(asString)),
status: FoodFactResponseStatus.ok);
2024-09-06 16:51:24 +00:00
}
}
class FoodFactModel {
final String name;
final int kcalPer100g;
final int mass;
2024-09-06 16:51:24 +00:00
FoodFactModel({
required this.name,
required this.mass,
required this.kcalPer100g,
});
2024-09-06 16:51:24 +00:00
factory FoodFactModel.fromJson(Map<String, dynamic> json) {
int kcalPer100gForModel = 0;
int kcalPer100g = 0;
int kcalPer100gPrepared = 0;
try {
kcalPer100g = (json['product']['nutriments']['energy-kcal_100g'] as num)
.toDouble()
.ceil();
kcalPer100gForModel = kcalPer100g;
} catch (e) {
try {
kcalPer100gPrepared =
(json['product']['nutriments']['energy-kcal_prepared_100g'] as num)
.toDouble()
.ceil();
kcalPer100gForModel = kcalPer100gPrepared;
} catch (e) {
kcalPer100gForModel = 0;
}
}
2024-12-22 17:13:29 +00:00
int quantityForModel = 0;
try {
String quantityString = json['product']['product_quantity'] ?? "0";
quantityForModel = double.parse(quantityString).ceil();
} catch (e) {
try {
quantityForModel =
(json['product']['product_quantity'] as num).toDouble().ceil();
} catch (e) {
quantityForModel = 0;
}
}
return FoodFactModel(
name: json['product']['product_name'] ?? "",
kcalPer100g: kcalPer100gForModel,
mass: quantityForModel,
);
2024-09-06 16:51:24 +00:00
}
}
enum FoodFactResponseStatus {
foodFactServerNotReachable,
barcodeNotFound,
ok,
}
class FoodFactResponse {
final FoodFactModel? food;
final FoodFactResponseStatus status;
FoodFactResponse({required this.food, required this.status});
}