IzzyOnDroid now uses API (+ other minor tweaks)

This commit is contained in:
Imran Remtulla
2022-11-17 19:00:27 -05:00
parent 2059e4fd44
commit b04986622b
8 changed files with 26 additions and 62 deletions

View File

@@ -30,19 +30,12 @@ class FDroid extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => null; String? changeLogPageFromStandardUrl(String standardUrl) => null;
@override @override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl; String? tryInferringAppId(String standardUrl) {
@override
String? tryGettingAppIdFromURL(String standardUrl) {
return Uri.parse(standardUrl).pathSegments.last; return Uri.parse(standardUrl).pathSegments.last;
} }
@override APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
Future<APKDetails> getLatestAPKDetails( Response res, String apkUrlPrefix) {
String standardUrl, List<String> additionalData) async {
String? appId = tryGettingAppIdFromURL(standardUrl);
Response res =
await get(Uri.parse('https://f-droid.org/api/v1/packages/$appId'));
if (res.statusCode == 200) { if (res.statusCode == 200) {
List<dynamic> releases = jsonDecode(res.body)['packages'] ?? []; List<dynamic> releases = jsonDecode(res.body)['packages'] ?? [];
if (releases.isEmpty) { if (releases.isEmpty) {
@@ -54,8 +47,7 @@ class FDroid extends AppSource {
} }
List<String> apkUrls = releases List<String> apkUrls = releases
.where((element) => element['versionName'] == latestVersion) .where((element) => element['versionName'] == latestVersion)
.map((e) => .map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
'https://f-droid.org/repo/${appId}_${e['versionCode']}.apk')
.toList(); .toList();
if (apkUrls.isEmpty) { if (apkUrls.isEmpty) {
throw NoAPKError(); throw NoAPKError();
@@ -66,6 +58,15 @@ class FDroid extends AppSource {
} }
} }
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> 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 @override
AppNames getAppNames(String standardUrl) { AppNames getAppNames(String standardUrl) {
return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last); return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last);

View File

@@ -105,9 +105,6 @@ class GitHub extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => String? changeLogPageFromStandardUrl(String standardUrl) =>
'$standardUrl/releases'; '$standardUrl/releases';
@override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl;
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {

View File

@@ -23,9 +23,6 @@ class GitLab extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => String? changeLogPageFromStandardUrl(String standardUrl) =>
'$standardUrl/-/releases'; '$standardUrl/-/releases';
@override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl;
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {

View File

@@ -1,5 +1,6 @@
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/fdroid.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@@ -22,41 +23,18 @@ class IzzyOnDroid extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => null; String? changeLogPageFromStandardUrl(String standardUrl) => null;
@override @override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl; String? tryInferringAppId(String standardUrl) {
return FDroid().tryInferringAppId(standardUrl);
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {
Response res = await get(Uri.parse(standardUrl)); String? appId = tryInferringAppId(standardUrl);
if (res.statusCode == 200) { return FDroid().getAPKUrlsFromFDroidPackagesAPIResponse(
var parsedHtml = parse(res.body); await get(
var multipleVersionApkUrls = parsedHtml Uri.parse('https://apt.izzysoft.de/fdroid/api/v1/packages/$appId')),
.querySelectorAll('a') 'https://android.izzysoft.de/frepo/$appId');
.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();
}
} }
@override @override

View File

@@ -22,9 +22,6 @@ class Mullvad extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => String? changeLogPageFromStandardUrl(String standardUrl) =>
'https://github.com/mullvad/mullvadvpn-app/blob/master/CHANGELOG.md'; 'https://github.com/mullvad/mullvadvpn-app/blob/master/CHANGELOG.md';
@override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl;
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {

View File

@@ -16,9 +16,6 @@ class Signal extends AppSource {
@override @override
String? changeLogPageFromStandardUrl(String standardUrl) => null; String? changeLogPageFromStandardUrl(String standardUrl) => null;
@override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl;
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {

View File

@@ -21,9 +21,6 @@ class SourceForge extends AppSource {
@override @override
String? changeLogPageFromStandardUrl(String standardUrl) => null; String? changeLogPageFromStandardUrl(String standardUrl) => null;
@override
Future<String> apkUrlPrefetchModifier(String apkUrl) async => apkUrl;
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async { String standardUrl, List<String> additionalData) async {

View File

@@ -155,8 +155,8 @@ class AppSource {
throw NotImplementedError(); throw NotImplementedError();
} }
Future<String> apkUrlPrefetchModifier(String apkUrl) { Future<String> apkUrlPrefetchModifier(String apkUrl) async {
throw NotImplementedError(); return apkUrl;
} }
bool canSearch = false; bool canSearch = false;
@@ -164,7 +164,7 @@ class AppSource {
throw NotImplementedError(); throw NotImplementedError();
} }
String? tryGettingAppIdFromURL(String standardUrl) { String? tryInferringAppId(String standardUrl) {
return null; return null;
} }
} }
@@ -245,7 +245,7 @@ class SourceProvider {
await source.getLatestAPKDetails(standardUrl, additionalData); await source.getLatestAPKDetails(standardUrl, additionalData);
return App( return App(
id ?? id ??
source.tryGettingAppIdFromURL(standardUrl) ?? source.tryInferringAppId(standardUrl) ??
generateTempID(names, source), generateTempID(names, source),
standardUrl, standardUrl,
names.author[0].toUpperCase() + names.author.substring(1), names.author[0].toUpperCase() + names.author.substring(1),