kemono_client.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:convert';
  2. import 'package:dio/dio.dart';
  3. import 'package:veloe_kemono_party_flutter/models/creator.dart';
  4. import 'package:veloe_kemono_party_flutter/models/post.dart';
  5. class KemonoClient {
  6. KemonoClient(String sourceUrl) :_dio = Dio(BaseOptions(baseUrl: sourceUrl, headers:
  7. {
  8. 'Accept': 'text/css',
  9. 'Accept-Encoding': 'gzip, deflate, br',
  10. 'Accept-Language': 'en-US,en;q=0.5',
  11. 'Cache-Control': 'no-cache',
  12. 'Connection': 'keep-alive',
  13. 'Pragma': 'no-cache',
  14. 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/116.0'
  15. }));
  16. final Dio _dio;
  17. String sourceUrl() => _dio.options.baseUrl;
  18. Future<List<Creator>> getCreators() async {
  19. try {
  20. final response = await _dio.get('/api/v1/creators');
  21. if (response.statusCode != 200) {
  22. throw DioException(
  23. requestOptions: response.requestOptions,
  24. response: response,
  25. error: 'Unexpected status code: ${response.statusCode}'
  26. );
  27. }
  28. final parsedData = switch(response.data) {
  29. String s => jsonDecode(s),
  30. List<dynamic> list => list,
  31. Map<String,dynamic> map => [map],
  32. _ => throw FormatException('Unprocessable data')
  33. };
  34. return (parsedData as List).map((x) => Creator.fromJson(x,_dio.options.baseUrl)).toList();
  35. } on DioException catch (e) {
  36. throw Exception('Network error: ${e.message} ${e.response?.data as String}');
  37. } on FormatException catch (e) {
  38. throw Exception('Data format error: ${e.message}');
  39. }
  40. }
  41. Future<List<Post>> getPosts(String creatorId, String service, int start, String query) async {
  42. try {
  43. final response = await _dio.get(
  44. '/api/v1/$service/user/$creatorId/posts',
  45. queryParameters: query.isEmpty ? {'o': start} : {'o':start, 'q': query},
  46. options: Options(
  47. validateStatus: (status) => true,
  48. ), // Accept all status codes
  49. );
  50. final parsedData = switch(response.data) {
  51. String s => jsonDecode(s),
  52. List<dynamic> list => list,
  53. Map<String,dynamic> map => [map],
  54. _ => throw FormatException('Unprocessable data')
  55. };
  56. if (parsedData is Map<String,dynamic> && (parsedData).containsKey("error"))
  57. {
  58. return List<Post>.empty();
  59. }
  60. return (parsedData as List).map((x) => Post.fromJson(x,_dio.options.baseUrl)).toList();
  61. } on DioException catch (e) {
  62. throw Exception('Posts load failed: ${e.message} ${e.stackTrace}');
  63. } on Exception {
  64. throw Exception('Oops something go wrong}');
  65. }
  66. }
  67. }