diff --git a/assets/translations/en.json b/assets/translations/en.json index 9456b96..0c28603 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -181,7 +181,8 @@ "removeAppQuestion": "Remove App?", "yesMarkUpdated": "Yes, Mark as Updated", "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", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/it.json b/assets/translations/it.json index ef6b41d..8cdb3df 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -181,7 +181,8 @@ "removeAppQuestion": "Rimuovere App?", "yesMarkUpdated": "Sì, contrassegna come aggiornato", "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", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 0afdd9e..057d568 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -181,7 +181,8 @@ "removeAppQuestion": "Remove App?", "yesMarkUpdated": "Yes, Mark as Updated", "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", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "tooManyRequestsTryAgainInMinutes": { diff --git a/lib/app_sources/fdroidRepo.dart b/lib/app_sources/fdroidRepo.dart index fa43feb..c13a51d 100644 --- a/lib/app_sources/fdroidRepo.dart +++ b/lib/app_sources/fdroidRepo.dart @@ -12,10 +12,10 @@ class FDroidRepo extends AppSource { additionalSourceAppSpecificFormItems = [ [ GeneratedFormItem( - label: tr('appId'), + label: tr('appIdOrName'), hint: tr('reposHaveMultipleApps'), required: true, - key: 'appId') + key: 'appIdOrName') ] ]; } @@ -31,37 +31,46 @@ class FDroidRepo extends AppSource { return url.substring(0, match.end); } - @override - String? tryInferringAppId(String standardUrl, - {List additionalData = const []}) { - return findGeneratedFormValueByKey( - additionalSourceAppSpecificFormItems - .reduce((value, element) => [...value, ...element]), - additionalData, - 'appId'); - } - @override Future getLatestAPKDetails( String standardUrl, List additionalData, {bool trackOnly = false}) async { - String? appId = - tryInferringAppId(standardUrl, additionalData: additionalData); - if (appId == null) { + String? appIdOrName = findGeneratedFormValueByKey( + additionalSourceAppSpecificFormItems + .reduce((value, element) => [...value, ...element]), + additionalData, + 'appIdOrName'); + if (appIdOrName == null) { throw NoReleasesError(); } var res = await get(Uri.parse('$standardUrl/index.xml')); if (res.statusCode == 200) { var body = parse(res.body); - var foundApps = body - .querySelectorAll('application') - .where((element) => element.attributes['id'] == appId) - .toList(); + var foundApps = body.querySelectorAll('application').where((element) { + return element.attributes['id'] == appIdOrName; + }).toList(); 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 appName = foundApps[0].querySelector('name')?.innerHtml ?? appId; + var appName = + foundApps[0].querySelector('name')?.innerHtml ?? appIdOrName; var releases = foundApps[0].querySelectorAll('package'); String? latestVersion = releases[0].querySelector('version')?.innerHtml; if (latestVersion == null) {