mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-11 17:40:15 +02:00
Better IzzyOnDroid support (#926)
This commit is contained in:
@@ -57,81 +57,6 @@ class FDroid extends AppSource {
|
|||||||
return Uri.parse(standardUrl).pathSegments.last;
|
return Uri.parse(standardUrl).pathSegments.last;
|
||||||
}
|
}
|
||||||
|
|
||||||
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
|
|
||||||
Response res, String apkUrlPrefix, String standardUrl,
|
|
||||||
{bool autoSelectHighestVersionCode = false,
|
|
||||||
bool trySelectingSuggestedVersionCode = false,
|
|
||||||
String? filterVersionsByRegEx}) {
|
|
||||||
if (res.statusCode == 200) {
|
|
||||||
var response = jsonDecode(res.body);
|
|
||||||
List<dynamic> releases = response['packages'] ?? [];
|
|
||||||
if (releases.isEmpty) {
|
|
||||||
throw NoReleasesError();
|
|
||||||
}
|
|
||||||
String? version;
|
|
||||||
Iterable<dynamic> releaseChoices = [];
|
|
||||||
// Grab the versionCode suggested if the user chose to do that
|
|
||||||
// Only do so at this stage if the user has no release filter
|
|
||||||
if (trySelectingSuggestedVersionCode &&
|
|
||||||
response['suggestedVersionCode'] != null &&
|
|
||||||
filterVersionsByRegEx == null) {
|
|
||||||
var suggestedReleases = releases.where((element) =>
|
|
||||||
element['versionCode'] == response['suggestedVersionCode']);
|
|
||||||
if (suggestedReleases.isNotEmpty) {
|
|
||||||
releaseChoices = suggestedReleases;
|
|
||||||
version = suggestedReleases.first['versionName'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Apply the release filter if any
|
|
||||||
if (filterVersionsByRegEx != null) {
|
|
||||||
version = null;
|
|
||||||
releaseChoices = [];
|
|
||||||
for (var i = 0; i < releases.length; i++) {
|
|
||||||
if (RegExp(filterVersionsByRegEx)
|
|
||||||
.hasMatch(releases[i]['versionName'])) {
|
|
||||||
version = releases[i]['versionName'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (version == null) {
|
|
||||||
throw NoVersionError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Default to the highest version
|
|
||||||
version ??= releases[0]['versionName'];
|
|
||||||
if (version == null) {
|
|
||||||
throw NoVersionError();
|
|
||||||
}
|
|
||||||
// If a suggested release was not already picked, pick all those with the selected version
|
|
||||||
if (releaseChoices.isEmpty) {
|
|
||||||
releaseChoices =
|
|
||||||
releases.where((element) => element['versionName'] == version);
|
|
||||||
}
|
|
||||||
// For the remaining releases, use the toggles to auto-select one if possible
|
|
||||||
if (releaseChoices.length > 1) {
|
|
||||||
if (autoSelectHighestVersionCode) {
|
|
||||||
releaseChoices = [releaseChoices.first];
|
|
||||||
} else if (trySelectingSuggestedVersionCode &&
|
|
||||||
response['suggestedVersionCode'] != null) {
|
|
||||||
var suggestedReleases = releaseChoices.where((element) =>
|
|
||||||
element['versionCode'] == response['suggestedVersionCode']);
|
|
||||||
if (suggestedReleases.isNotEmpty) {
|
|
||||||
releaseChoices = suggestedReleases;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (releaseChoices.isEmpty) {
|
|
||||||
throw NoReleasesError();
|
|
||||||
}
|
|
||||||
List<String> apkUrls = releaseChoices
|
|
||||||
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
|
|
||||||
.toList();
|
|
||||||
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
|
|
||||||
AppNames(name, Uri.parse(standardUrl).pathSegments.last));
|
|
||||||
} else {
|
|
||||||
throw getObtainiumHttpError(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
@@ -143,6 +68,7 @@ class FDroid extends AppSource {
|
|||||||
await sourceRequest('https://$host/api/v1/packages/$appId'),
|
await sourceRequest('https://$host/api/v1/packages/$appId'),
|
||||||
'https://$host/repo/$appId',
|
'https://$host/repo/$appId',
|
||||||
standardUrl,
|
standardUrl,
|
||||||
|
name,
|
||||||
autoSelectHighestVersionCode:
|
autoSelectHighestVersionCode:
|
||||||
additionalSettings['autoSelectHighestVersionCode'] == true,
|
additionalSettings['autoSelectHighestVersionCode'] == true,
|
||||||
trySelectingSuggestedVersionCode:
|
trySelectingSuggestedVersionCode:
|
||||||
@@ -185,3 +111,78 @@ class FDroid extends AppSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
|
||||||
|
Response res, String apkUrlPrefix, String standardUrl, String sourceName,
|
||||||
|
{bool autoSelectHighestVersionCode = false,
|
||||||
|
bool trySelectingSuggestedVersionCode = false,
|
||||||
|
String? filterVersionsByRegEx}) {
|
||||||
|
if (res.statusCode == 200) {
|
||||||
|
var response = jsonDecode(res.body);
|
||||||
|
List<dynamic> releases = response['packages'] ?? [];
|
||||||
|
if (releases.isEmpty) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
|
String? version;
|
||||||
|
Iterable<dynamic> releaseChoices = [];
|
||||||
|
// Grab the versionCode suggested if the user chose to do that
|
||||||
|
// Only do so at this stage if the user has no release filter
|
||||||
|
if (trySelectingSuggestedVersionCode &&
|
||||||
|
response['suggestedVersionCode'] != null &&
|
||||||
|
filterVersionsByRegEx == null) {
|
||||||
|
var suggestedReleases = releases.where((element) =>
|
||||||
|
element['versionCode'] == response['suggestedVersionCode']);
|
||||||
|
if (suggestedReleases.isNotEmpty) {
|
||||||
|
releaseChoices = suggestedReleases;
|
||||||
|
version = suggestedReleases.first['versionName'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Apply the release filter if any
|
||||||
|
if (filterVersionsByRegEx != null) {
|
||||||
|
version = null;
|
||||||
|
releaseChoices = [];
|
||||||
|
for (var i = 0; i < releases.length; i++) {
|
||||||
|
if (RegExp(filterVersionsByRegEx)
|
||||||
|
.hasMatch(releases[i]['versionName'])) {
|
||||||
|
version = releases[i]['versionName'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version == null) {
|
||||||
|
throw NoVersionError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Default to the highest version
|
||||||
|
version ??= releases[0]['versionName'];
|
||||||
|
if (version == null) {
|
||||||
|
throw NoVersionError();
|
||||||
|
}
|
||||||
|
// If a suggested release was not already picked, pick all those with the selected version
|
||||||
|
if (releaseChoices.isEmpty) {
|
||||||
|
releaseChoices =
|
||||||
|
releases.where((element) => element['versionName'] == version);
|
||||||
|
}
|
||||||
|
// For the remaining releases, use the toggles to auto-select one if possible
|
||||||
|
if (releaseChoices.length > 1) {
|
||||||
|
if (autoSelectHighestVersionCode) {
|
||||||
|
releaseChoices = [releaseChoices.first];
|
||||||
|
} else if (trySelectingSuggestedVersionCode &&
|
||||||
|
response['suggestedVersionCode'] != null) {
|
||||||
|
var suggestedReleases = releaseChoices.where((element) =>
|
||||||
|
element['versionCode'] == response['suggestedVersionCode']);
|
||||||
|
if (suggestedReleases.isNotEmpty) {
|
||||||
|
releaseChoices = suggestedReleases;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (releaseChoices.isEmpty) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
|
List<String> apkUrls = releaseChoices
|
||||||
|
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
|
||||||
|
.toList();
|
||||||
|
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
|
||||||
|
AppNames(sourceName, Uri.parse(standardUrl).pathSegments.last));
|
||||||
|
} else {
|
||||||
|
throw getObtainiumHttpError(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -6,16 +6,22 @@ class IzzyOnDroid extends AppSource {
|
|||||||
late FDroid fd;
|
late FDroid fd;
|
||||||
|
|
||||||
IzzyOnDroid() {
|
IzzyOnDroid() {
|
||||||
host = 'android.izzysoft.de';
|
host = 'izzysoft.de';
|
||||||
fd = FDroid();
|
fd = FDroid();
|
||||||
additionalSourceAppSpecificSettingFormItems =
|
additionalSourceAppSpecificSettingFormItems =
|
||||||
fd.additionalSourceAppSpecificSettingFormItems;
|
fd.additionalSourceAppSpecificSettingFormItems;
|
||||||
|
allowSubDomains = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url) {
|
||||||
RegExp standardUrlRegEx = RegExp('^https?://$host/repo/apk/[^/]+');
|
RegExp standardUrlRegExA = RegExp('^https?://android.$host/repo/apk/[^/]+');
|
||||||
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase());
|
RegExpMatch? match = standardUrlRegExA.firstMatch(url.toLowerCase());
|
||||||
|
if (match == null) {
|
||||||
|
RegExp standardUrlRegExB =
|
||||||
|
RegExp('^https?://apt.$host/fdroid/index/apk/[^/]+');
|
||||||
|
match = standardUrlRegExB.firstMatch(url.toLowerCase());
|
||||||
|
}
|
||||||
if (match == null) {
|
if (match == null) {
|
||||||
throw InvalidURLError(name);
|
throw InvalidURLError(name);
|
||||||
}
|
}
|
||||||
@@ -34,11 +40,12 @@ class IzzyOnDroid extends AppSource {
|
|||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
String? appId = await tryInferringAppId(standardUrl);
|
String? appId = await tryInferringAppId(standardUrl);
|
||||||
return fd.getAPKUrlsFromFDroidPackagesAPIResponse(
|
return getAPKUrlsFromFDroidPackagesAPIResponse(
|
||||||
await sourceRequest(
|
await sourceRequest(
|
||||||
'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId'),
|
'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId'),
|
||||||
'https://android.izzysoft.de/frepo/$appId',
|
'https://android.izzysoft.de/frepo/$appId',
|
||||||
standardUrl,
|
standardUrl,
|
||||||
|
name,
|
||||||
autoSelectHighestVersionCode:
|
autoSelectHighestVersionCode:
|
||||||
additionalSettings['autoSelectHighestVersionCode'] == true,
|
additionalSettings['autoSelectHighestVersionCode'] == true,
|
||||||
trySelectingSuggestedVersionCode:
|
trySelectingSuggestedVersionCode:
|
||||||
|
Reference in New Issue
Block a user