import 'dart:developer'; import 'package:dio/dio.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'dart:convert'; import 'package:fuzzywuzzy/model/extracted_result.dart'; const String baseUrl = "https://en.wikipedia.org/w/api.php"; final Dio dio = Dio(); Future bestPageMatch(String title) async { final response = await dio.get(baseUrl, queryParameters: { "action": "query", "format": "json", "list": "prefixsearch", "pssearch": title, }); final data = jsonDecode(response.toString()); log(data.toString()); final List results = data["query"]["prefixsearch"] ?? {}; final Map titlesAndIds = { for (var d in results) d["title"]: d["pageid"] }; if (titlesAndIds.isEmpty) { log("No pages found for $title"); return null; } // after the empty check, we can safely assume that there is a best match final ExtractedResult bestMatch = extractOne( query: title, choices: titlesAndIds.keys.toList(), cutoff: 70, ); return titlesAndIds[bestMatch.choice]; } Future getImageUrl(int pageId) async { final response = await dio.get(baseUrl, queryParameters: { "action": "query", "format": "json", "prop": "pageimages", "pageids": pageId, "pithumbsize": 500, }); final data = jsonDecode(response.toString()); final pageData = data["query"]["pages"][pageId.toString()]; return pageData["thumbnail"]?["source"]; } Future getImageUrlFromName(String title) async { int? pageId = await bestPageMatch(title); if (pageId == null) { return null; } return await getImageUrl(pageId); } Future getImageUrlFromGooglePhotos(String url) async { // this is a very simple implementation that just gets the image behind the link // it is not guaranteed to work for all google photos links final response = await dio.get(url); final data = response.toString(); final int start = data.indexOf("https://lh3.googleusercontent.com"); final int end = data.indexOf('"', start); return data.substring(start, end); }