Adding from custom fdroid repos is easier (name based)

This commit is contained in:
Imran Remtulla
2022-12-15 21:39:05 -05:00
parent f6ca5d42e8
commit 049b023e01
4 changed files with 36 additions and 24 deletions

View File

@@ -181,7 +181,8 @@
"removeAppQuestion": "Remove App?", "removeAppQuestion": "Remove App?",
"yesMarkUpdated": "Yes, Mark as Updated", "yesMarkUpdated": "Yes, Mark as Updated",
"fdroid": "F-Droid", "fdroid": "F-Droid",
"appId": "App ID", "appIdOrName": "App ID or Name",
"appWithIdOrNameNotFound": "No App was found with that ID or Name",
"reposHaveMultipleApps": "Repos may contain multiple Apps", "reposHaveMultipleApps": "Repos may contain multiple Apps",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {

View File

@@ -181,7 +181,8 @@
"removeAppQuestion": "Rimuovere App?", "removeAppQuestion": "Rimuovere App?",
"yesMarkUpdated": "Sì, contrassegna come aggiornato", "yesMarkUpdated": "Sì, contrassegna come aggiornato",
"fdroid": "F-Droid", "fdroid": "F-Droid",
"appId": "App ID", "appIdOrName": "App ID or Name",
"appWithIdOrNameNotFound": "No App was found with that ID or Name",
"reposHaveMultipleApps": "Repos may contain multiple Apps", "reposHaveMultipleApps": "Repos may contain multiple Apps",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {

View File

@@ -181,7 +181,8 @@
"removeAppQuestion": "Remove App?", "removeAppQuestion": "Remove App?",
"yesMarkUpdated": "Yes, Mark as Updated", "yesMarkUpdated": "Yes, Mark as Updated",
"fdroid": "F-Droid", "fdroid": "F-Droid",
"appId": "App ID", "appIdOrName": "App ID or Name",
"appWithIdOrNameNotFound": "No App was found with that ID or Name",
"reposHaveMultipleApps": "Repos may contain multiple Apps", "reposHaveMultipleApps": "Repos may contain multiple Apps",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {

View File

@@ -12,10 +12,10 @@ class FDroidRepo extends AppSource {
additionalSourceAppSpecificFormItems = [ additionalSourceAppSpecificFormItems = [
[ [
GeneratedFormItem( GeneratedFormItem(
label: tr('appId'), label: tr('appIdOrName'),
hint: tr('reposHaveMultipleApps'), hint: tr('reposHaveMultipleApps'),
required: true, required: true,
key: 'appId') key: 'appIdOrName')
] ]
]; ];
} }
@@ -31,37 +31,46 @@ class FDroidRepo extends AppSource {
return url.substring(0, match.end); return url.substring(0, match.end);
} }
@override
String? tryInferringAppId(String standardUrl,
{List<String> additionalData = const []}) {
return findGeneratedFormValueByKey(
additionalSourceAppSpecificFormItems
.reduce((value, element) => [...value, ...element]),
additionalData,
'appId');
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData, String standardUrl, List<String> additionalData,
{bool trackOnly = false}) async { {bool trackOnly = false}) async {
String? appId = String? appIdOrName = findGeneratedFormValueByKey(
tryInferringAppId(standardUrl, additionalData: additionalData); additionalSourceAppSpecificFormItems
if (appId == null) { .reduce((value, element) => [...value, ...element]),
additionalData,
'appIdOrName');
if (appIdOrName == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
var res = await get(Uri.parse('$standardUrl/index.xml')); var res = await get(Uri.parse('$standardUrl/index.xml'));
if (res.statusCode == 200) { if (res.statusCode == 200) {
var body = parse(res.body); var body = parse(res.body);
var foundApps = body var foundApps = body.querySelectorAll('application').where((element) {
.querySelectorAll('application') return element.attributes['id'] == appIdOrName;
.where((element) => element.attributes['id'] == appId) }).toList();
.toList();
if (foundApps.isEmpty) { if (foundApps.isEmpty) {
throw NoReleasesError(); foundApps = body.querySelectorAll('application').where((element) {
return element.querySelector('name')?.innerHtml.toLowerCase() ==
appIdOrName.toLowerCase();
}).toList();
}
if (foundApps.isEmpty) {
foundApps = body.querySelectorAll('application').where((element) {
return element
.querySelector('name')
?.innerHtml
.toLowerCase()
.contains(appIdOrName.toLowerCase()) ??
false;
}).toList();
}
if (foundApps.isEmpty) {
throw ObtainiumError(tr('appWithIdOrNameNotFound'));
} }
var authorName = body.querySelector('repo')?.attributes['name'] ?? name; var authorName = body.querySelector('repo')?.attributes['name'] ?? name;
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId; var appName =
foundApps[0].querySelector('name')?.innerHtml ?? appIdOrName;
var releases = foundApps[0].querySelectorAll('package'); var releases = foundApps[0].querySelectorAll('package');
String? latestVersion = releases[0].querySelector('version')?.innerHtml; String? latestVersion = releases[0].querySelector('version')?.innerHtml;
if (latestVersion == null) { if (latestVersion == null) {