dart_off_server / lib /core.dart
David Li
fix: update dart off server
02ec2cc
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:http/http.dart' as http;
// ignore_for_file: constant_identifier_names
import 'package:beautiful_soup_dart/beautiful_soup.dart';
import './types.dart';
Future<SearchResult> search(Map<String, String> query) {
var parametersList = <Parameter>[];
// check for terms in query
if (query.containsKey('terms')) {
var terms = query['terms'];
if (terms != null && terms.isNotEmpty) {
parametersList.add(SearchTerms(terms: terms.split(',')));
}
}
// check for withoutAddictives
if (query.containsKey('withoutAdditives')) {
var withoutAdditives = query['withoutAdditives'];
if (withoutAdditives != null && withoutAdditives == "true") {
parametersList.add(WithoutAdditives());
}
}
if (query.containsKey('sort')) {
var sort = query['sort'];
if (sort != null && sort.isNotEmpty) {
var option = SortOption.values.firstWhere(
(e) => e.toString() == sort,
orElse: () => SortOption.PRODUCT_NAME);
parametersList.add(SortBy(option: option));
}
}
if (query.containsKey('pnnsGroup2')) {
// print('pnnsGroup2: ${query['pnnsGroup2']}');
var pnnsGroup2 = query['pnnsGroup2'];
if (pnnsGroup2 != null && pnnsGroup2.isNotEmpty) {
var option = PnnsGroup2.values.firstWhere(
(e) => e.toString() == pnnsGroup2,
orElse: () => PnnsGroup2.PIZZA_PIES_AND_QUICHE);
parametersList.add(PnnsGroup2Filter(pnnsGroup2: option));
}
}
// page size
if (query.containsKey('size')) {
var size = query['size'];
if (size != null && size.isNotEmpty) {
parametersList.add(PageSize(size: int.parse(size)));
}
}
// page number
if (query.containsKey('page')) {
var page = query['page'];
if (page != null && page.isNotEmpty) {
parametersList.add(PageNumber(page: int.parse(page)));
}
}
// by tags
if (query.containsKey('tags')) {
var rawTags = query['tags'];
if (rawTags != null && rawTags.isNotEmpty) {
var tags = rawTags.split(',');
// iterate over tags
for (var tag in tags) {
// check for tag with value
// check tag
if (tag.contains(':')) {
var tagParts = tag.split(':');
var tagName = tagParts[0];
var tagValue = tagParts[1];
var tagType = TagFilterType.values.firstWhere(
(e) => e.toString() == tagName,
orElse: () => TagFilterType.CATEGORIES);
parametersList.add(TagFilter.fromType(tagFilterType: tagType, tagName: tagValue));
}
}
}
}
ProductSearchQueryConfiguration configuration =
ProductSearchQueryConfiguration(
parametersList: parametersList,
version: ProductQueryVersion.v3,
);
return OpenFoodAPIClient.searchProducts(
User(userId: '', password: ''),
configuration,
);
}
void mkConfiguration() {
OpenFoodAPIConfiguration.userAgent = UserAgent(
name: 'dart_off_server',
url: 'https://friendlyuser-dart-off-server.hf.space/');
OpenFoodAPIConfiguration.globalLanguages = <OpenFoodFactsLanguage>[
OpenFoodFactsLanguage.ENGLISH
];
OpenFoodAPIConfiguration.globalCountry = OpenFoodFactsCountry.CANADA;
}
// function that scans for top steam charts
Future<List<SteamTopSeller>> findTopSteamSellers() async {
var url = Uri.https('store.steampowered.com', 'search/?filter=topsellers');
var html = await http.get(url);
return parseSteamTopSellers(html.body);
}
List<SteamTopSeller> parseSteamTopSellers(String rawHTML ) {
BeautifulSoup soup = BeautifulSoup(rawHTML);
var searchResultsDiv = soup.find('div', attrs: {'id': 'search_resultsRows'});
if (searchResultsDiv == null) {
return <SteamTopSeller>[];
}
var topSellers = searchResultsDiv.findAll('a');
if (topSellers.isEmpty) {
return <SteamTopSeller>[];
}
var topSellersList = <SteamTopSeller>[];
for (var topSeller in topSellers) {
var imageDiv = topSeller.find('img');
String? imageSrc = '';
if (imageDiv != null) {
imageSrc = imageDiv.attributes['src'];
}
var title = topSeller.find('span', attrs: {'class': 'title'})?.text;
var publishDate = topSeller.find('div', attrs: {'class': 'col search_released responsive_secondrow'})?.text;
// var publishDate = topSeller.find('div', attrs: {'class': 'tab_item_top_tags'}).text;
// get data-price-final
var price = topSeller.find('div', attrs: {'class': 'search_price_discount_combined'})?.attributes['data-price-final'];
var discountDiv = topSeller.find('div', attrs: {'class': 'search_discount'});
String discount = "";
if (discountDiv != null) {
var discountSpan = discountDiv.find("span");
if (discountSpan != null) {
discount = discountSpan.text;
}
}
topSellersList.add(SteamTopSeller(imageSrc, title, price, publishDate, discount));
}
return topSellersList;
}