From 1a68b8abe6c3f7d586f73f6447722e15d52a095d Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 28 Sep 2022 21:36:21 -0400 Subject: [PATCH] Improved GitHub starred import + other tweaks --- lib/custom_errors.dart | 2 +- lib/mass_app_sources/githubstars.dart | 32 +++++++++++++++++++++------ lib/providers/settings_provider.dart | 2 +- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 732668b..d0c738e 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -4,5 +4,5 @@ class RateLimitError { @override String toString() => - 'Rate limit reached - try again in $remainingMinutes minutes'; + 'Too many requests (rate limited) - try again in $remainingMinutes minutes'; } diff --git a/lib/mass_app_sources/githubstars.dart b/lib/mass_app_sources/githubstars.dart index d344f58..389d446 100644 --- a/lib/mass_app_sources/githubstars.dart +++ b/lib/mass_app_sources/githubstars.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:http/http.dart'; +import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; class GitHubStars implements MassAppSource { @@ -10,23 +11,40 @@ class GitHubStars implements MassAppSource { @override late List requiredArgs = ['Username']; - @override - Future> getUrls(List args) async { - if (args.length != requiredArgs.length) { - throw 'Wrong number of arguments provided'; - } + Future> getOnePageOfUserStarredUrls( + String username, int page) async { Response res = await get(Uri.parse( - 'https://api.github.com/users/${args[0]}/starred?per_page=100')); //TODO: Make requests for more pages until you run out + 'https://api.github.com/users/$username/starred?per_page=100&page=$page')); if (res.statusCode == 200) { return (jsonDecode(res.body) as List) .map((e) => e['html_url'] as String) .toList(); } else { if (res.headers['x-ratelimit-remaining'] == '0') { - throw 'Rate limit reached - try again in ${(int.parse(res.headers['x-ratelimit-reset'] ?? '1800000000') / 60000000).toString()} minutes'; + throw RateLimitError( + (int.parse(res.headers['x-ratelimit-reset'] ?? '1800000000') / + 60000000) + .round()); } throw 'Unable to find user\'s starred repos'; } } + + @override + Future> getUrls(List args) async { + if (args.length != requiredArgs.length) { + throw 'Wrong number of arguments provided'; + } + List urls = []; + var page = 1; + while (true) { + var pageUrls = await getOnePageOfUserStarredUrls(args[0], page++); + urls.addAll(pageUrls); + if (pageUrls.length < 100) { + break; + } + } + return urls; + } } diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 33b6e3b..f5b353f 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -115,7 +115,7 @@ class SettingsProvider with ChangeNotifier { } bool get showAppWebpage { - return prefs?.getBool('showAppWebpage') ?? true; + return prefs?.getBool('showAppWebpage') ?? false; } set showAppWebpage(bool show) {