diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index ecabc1c..9ace2e6 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -30,19 +30,12 @@ class FDroid extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => null; @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - - @override - String? tryGettingAppIdFromURL(String standardUrl) { + String? tryInferringAppId(String standardUrl) { return Uri.parse(standardUrl).pathSegments.last; } - @override - Future getLatestAPKDetails( - String standardUrl, List additionalData) async { - String? appId = tryGettingAppIdFromURL(standardUrl); - Response res = - await get(Uri.parse('https://f-droid.org/api/v1/packages/$appId')); + APKDetails getAPKUrlsFromFDroidPackagesAPIResponse( + Response res, String apkUrlPrefix) { if (res.statusCode == 200) { List releases = jsonDecode(res.body)['packages'] ?? []; if (releases.isEmpty) { @@ -54,8 +47,7 @@ class FDroid extends AppSource { } List apkUrls = releases .where((element) => element['versionName'] == latestVersion) - .map((e) => - 'https://f-droid.org/repo/${appId}_${e['versionCode']}.apk') + .map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk') .toList(); if (apkUrls.isEmpty) { throw NoAPKError(); @@ -66,6 +58,15 @@ class FDroid extends AppSource { } } + @override + Future getLatestAPKDetails( + String standardUrl, List additionalData) async { + String? appId = tryInferringAppId(standardUrl); + return getAPKUrlsFromFDroidPackagesAPIResponse( + await get(Uri.parse('https://f-droid.org/api/v1/packages/$appId')), + 'https://f-droid.org/repo/$appId'); + } + @override AppNames getAppNames(String standardUrl) { return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last); diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 98ba2e8..058f550 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -105,9 +105,6 @@ class GitHub extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => '$standardUrl/releases'; - @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 9fe7fad..546dd03 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -23,9 +23,6 @@ class GitLab extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => '$standardUrl/-/releases'; - @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart index b18b3ff..51407de 100644 --- a/lib/app_sources/izzyondroid.dart +++ b/lib/app_sources/izzyondroid.dart @@ -1,5 +1,6 @@ import 'package:html/parser.dart'; import 'package:http/http.dart'; +import 'package:obtainium/app_sources/fdroid.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; @@ -22,41 +23,18 @@ class IzzyOnDroid extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => null; @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; + String? tryInferringAppId(String standardUrl) { + return FDroid().tryInferringAppId(standardUrl); + } @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { - Response res = await get(Uri.parse(standardUrl)); - if (res.statusCode == 200) { - var parsedHtml = parse(res.body); - var multipleVersionApkUrls = parsedHtml - .querySelectorAll('a') - .where((element) => - element.attributes['href']?.toLowerCase().endsWith('.apk') ?? - false) - .map((e) => 'https://$host${e.attributes['href'] ?? ''}') - .toList(); - if (multipleVersionApkUrls.isEmpty) { - throw NoAPKError(); - } - var version = parsedHtml - .querySelector('#keydata') - ?.querySelectorAll('b') - .where( - (element) => element.innerHtml.toLowerCase().contains('version')) - .toList()[0] - .parentNode - ?.parentNode - ?.children[1] - .innerHtml; - if (version == null) { - throw NoVersionError(); - } - return APKDetails(version, [multipleVersionApkUrls[0]]); - } else { - throw NoReleasesError(); - } + String? appId = tryInferringAppId(standardUrl); + return FDroid().getAPKUrlsFromFDroidPackagesAPIResponse( + await get( + Uri.parse('https://apt.izzysoft.de/fdroid/api/v1/packages/$appId')), + 'https://android.izzysoft.de/frepo/$appId'); } @override diff --git a/lib/app_sources/mullvad.dart b/lib/app_sources/mullvad.dart index 660deb8..4e691ab 100644 --- a/lib/app_sources/mullvad.dart +++ b/lib/app_sources/mullvad.dart @@ -22,9 +22,6 @@ class Mullvad extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => 'https://github.com/mullvad/mullvadvpn-app/blob/master/CHANGELOG.md'; - @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/signal.dart b/lib/app_sources/signal.dart index 1b10a32..4d38130 100644 --- a/lib/app_sources/signal.dart +++ b/lib/app_sources/signal.dart @@ -16,9 +16,6 @@ class Signal extends AppSource { @override String? changeLogPageFromStandardUrl(String standardUrl) => null; - @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/sourceforge.dart b/lib/app_sources/sourceforge.dart index 1373e80..6d6e815 100644 --- a/lib/app_sources/sourceforge.dart +++ b/lib/app_sources/sourceforge.dart @@ -21,9 +21,6 @@ class SourceForge extends AppSource { @override String? changeLogPageFromStandardUrl(String standardUrl) => null; - @override - Future apkUrlPrefetchModifier(String apkUrl) async => apkUrl; - @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index b55dc9a..7641c68 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -155,8 +155,8 @@ class AppSource { throw NotImplementedError(); } - Future apkUrlPrefetchModifier(String apkUrl) { - throw NotImplementedError(); + Future apkUrlPrefetchModifier(String apkUrl) async { + return apkUrl; } bool canSearch = false; @@ -164,7 +164,7 @@ class AppSource { throw NotImplementedError(); } - String? tryGettingAppIdFromURL(String standardUrl) { + String? tryInferringAppId(String standardUrl) { return null; } } @@ -245,7 +245,7 @@ class SourceProvider { await source.getLatestAPKDetails(standardUrl, additionalData); return App( id ?? - source.tryGettingAppIdFromURL(standardUrl) ?? + source.tryInferringAppId(standardUrl) ?? generateTempID(names, source), standardUrl, names.author[0].toUpperCase() + names.author.substring(1),