72 lines
2.1 KiB
Dart
72 lines
2.1 KiB
Dart
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<int?> 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<dynamic> results = data["query"]["prefixsearch"] ?? {};
|
|
final Map<String, int> 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<String> bestMatch = extractOne(
|
|
query: title,
|
|
choices: titlesAndIds.keys.toList(),
|
|
cutoff: 70,
|
|
);
|
|
return titlesAndIds[bestMatch.choice];
|
|
}
|
|
|
|
Future<String?> 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<String?> getImageUrlFromName(String title) async {
|
|
int? pageId = await bestPageMatch(title);
|
|
if (pageId == null) {
|
|
return null;
|
|
}
|
|
return await getImageUrl(pageId);
|
|
}
|
|
|
|
|
|
Future<String?> 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);
|
|
}
|