import 'dart:convert'; import 'package:http/http.dart'; import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; class GitHubStars implements MassAppUrlSource { @override late String name = 'GitHub Starred Repos'; @override late List requiredArgs = ['Username']; Future> getOnePageOfUserStarredUrlsWithDescriptions( String username, int page) async { Response res = await get(Uri.parse( 'https://${await GitHub().getCredentialPrefixIfAny()}api.github.com/users/$username/starred?per_page=100&page=$page')); if (res.statusCode == 200) { Map urlsWithDescriptions = {}; for (var e in (jsonDecode(res.body) as List)) { urlsWithDescriptions.addAll({ e['html_url'] as String: e['description'] != null ? e['description'] as String : 'No description' }); } return urlsWithDescriptions; } else { var gh = GitHub(); gh.rateLimitErrorCheck(res); throw getObtainiumHttpError(res); } } @override Future> getUrlsWithDescriptions(List args) async { if (args.length != requiredArgs.length) { throw ObtainiumError('Wrong number of arguments provided'); } Map urlsWithDescriptions = {}; var page = 1; while (true) { var pageUrls = await getOnePageOfUserStarredUrlsWithDescriptions(args[0], page++); urlsWithDescriptions.addAll(pageUrls); if (pageUrls.length < 100) { break; } } return urlsWithDescriptions; } }