voyagehandbook/lib/api/wikimedia.dart

35 lines
1.2 KiB
Dart
Raw Normal View History

2023-03-18 16:55:08 +01:00
import 'dart:convert';
2023-03-16 14:57:15 +01:00
import 'package:dio/dio.dart';
2023-03-18 16:55:08 +01:00
import 'package:voyagehandbook/api/classes.dart';
2023-03-16 14:57:15 +01:00
2023-03-18 16:55:08 +01:00
class WikiApi {
static final _dio = Dio(
BaseOptions(baseUrl: "https://api.wikimedia.org/core/v1/wikivoyage/en/"));
2023-03-16 14:57:15 +01:00
2023-03-18 16:55:08 +01:00
static Future<Response> _getRequest(String endpoint) async {
2023-03-24 23:48:55 +01:00
return await _dio.get(
endpoint,
options: Options(
headers: {"User-Agent": "VoyageHandbook/1.0.0"},
validateStatus: (_) => true,
responseType: ResponseType.plain),
);
2023-03-18 16:55:08 +01:00
}
2023-03-16 14:57:15 +01:00
2023-03-18 16:55:08 +01:00
/// Searches for pages using the WikiMedia API
static Future<List<SearchResponse>> search(String q, {int limit = 5}) async {
var r = await _getRequest("search/page?q=$q&limit=$limit");
if (r.statusCode! > 399) return Future.error("API error ${r.statusCode}");
var json = jsonDecode(r.data)["pages"];
return List<SearchResponse>.generate(
json.length, (index) => SearchResponse.fromJson(json[index]));
}
2023-03-24 23:48:55 +01:00
static Future<RawPage> getRawPage(String key) async {
var r = await _getRequest("page/$key/with_html");
if (r.statusCode! > 399) return Future.error("API error ${r.statusCode}");
return RawPage.fromJson(jsonDecode(r.data));
}
2023-03-16 14:57:15 +01:00
}