mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-10-25 11:53:45 +02:00
Merge pull request #927 from ImranR98/dev
- Change a default F-Droid Source option - Add GitHub "don't sort" toggle (#925) - Better IzzyOnDroid support (#926) - Allow 'm.' subdomain for APKPure - Added HTML reverse sorting (#915)
This commit is contained in:
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Želite li ukloniti aplikaciju?",
|
"one": "Želite li ukloniti aplikaciju?",
|
||||||
"other": "Želite li ukloniti aplikacije?"
|
"other": "Želite li ukloniti aplikacije?"
|
||||||
|
|||||||
@@ -258,6 +258,11 @@
|
|||||||
"autoExportOnChanges": "Automatický export při změnách",
|
"autoExportOnChanges": "Automatický export při změnách",
|
||||||
"filterVersionsByRegEx": "Filtrovat verze podle regulárního výrazu",
|
"filterVersionsByRegEx": "Filtrovat verze podle regulárního výrazu",
|
||||||
"trySelectingSuggestedVersionCode": "Zkusit vybrat navrhovaný kód verze APK",
|
"trySelectingSuggestedVersionCode": "Zkusit vybrat navrhovaný kód verze APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Odstranit Apku?",
|
"one": "Odstranit Apku?",
|
||||||
"other": "Odstranit Apky?"
|
"other": "Odstranit Apky?"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Automatischer Export bei Änderung",
|
"autoExportOnChanges": "Automatischer Export bei Änderung",
|
||||||
"filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern",
|
"filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern",
|
||||||
"trySelectingSuggestedVersionCode": "Versuchen, die vorgeschlagene APK-Code-Version auszuwählen",
|
"trySelectingSuggestedVersionCode": "Versuchen, die vorgeschlagene APK-Code-Version auszuwählen",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App entfernen?",
|
"one": "App entfernen?",
|
||||||
"other": "Apps entfernen?"
|
"other": "Apps entfernen?"
|
||||||
|
|||||||
@@ -258,6 +258,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove App?",
|
"one": "Remove App?",
|
||||||
"other": "Remove Apps?"
|
"other": "Remove Apps?"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Eliminar Aplicación?",
|
"one": "¿Eliminar Aplicación?",
|
||||||
"other": "¿Eliminar Aplicaciones?"
|
"other": "¿Eliminar Aplicaciones?"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Supprimer l'application ?",
|
"one": "Supprimer l'application ?",
|
||||||
"other": "Supprimer les applications ?"
|
"other": "Supprimer les applications ?"
|
||||||
|
|||||||
@@ -254,6 +254,11 @@
|
|||||||
"autoExportOnChanges": "Auto-exportálás a változások után",
|
"autoExportOnChanges": "Auto-exportálás a változások után",
|
||||||
"filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel",
|
"filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel",
|
||||||
"trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t",
|
"trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Eltávolítja az alkalmazást?",
|
"one": "Eltávolítja az alkalmazást?",
|
||||||
"other": "Eltávolítja az alkalmazást?"
|
"other": "Eltávolítja az alkalmazást?"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Rimuovere l'app?",
|
"one": "Rimuovere l'app?",
|
||||||
"other": "Rimuovere le app?"
|
"other": "Rimuovere le app?"
|
||||||
|
|||||||
@@ -258,6 +258,11 @@
|
|||||||
"autoExportOnChanges": "変更があった際に自動でエクスポートする",
|
"autoExportOnChanges": "変更があった際に自動でエクスポートする",
|
||||||
"filterVersionsByRegEx": "正規表現でバージョンをフィルタリングする",
|
"filterVersionsByRegEx": "正規表現でバージョンをフィルタリングする",
|
||||||
"trySelectingSuggestedVersionCode": "提案されたバージョンコードのAPKを選択する",
|
"trySelectingSuggestedVersionCode": "提案されたバージョンコードのAPKを選択する",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
|
|||||||
@@ -261,6 +261,11 @@
|
|||||||
"autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian",
|
"autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian",
|
||||||
"filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego",
|
"filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego",
|
||||||
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
|
|||||||
@@ -258,6 +258,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover App?",
|
"one": "Remover App?",
|
||||||
"other": "Remover Apps?"
|
"other": "Remover Apps?"
|
||||||
|
|||||||
@@ -255,6 +255,11 @@
|
|||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
|
|||||||
@@ -258,6 +258,11 @@
|
|||||||
"autoExportOnChanges": "修改时自动导出",
|
"autoExportOnChanges": "修改时自动导出",
|
||||||
"filterVersionsByRegEx": "使用正则表达式筛选版本",
|
"filterVersionsByRegEx": "使用正则表达式筛选版本",
|
||||||
"trySelectingSuggestedVersionCode": "尝试选择推荐版本 APK",
|
"trySelectingSuggestedVersionCode": "尝试选择推荐版本 APK",
|
||||||
|
"dontSortReleasesList": "Retain release order from API",
|
||||||
|
"reverseSort": "Reverse sorting",
|
||||||
|
"debugMenu": "Debug Menu",
|
||||||
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ parseDateTimeMMMddCommayyyy(String? dateString) {
|
|||||||
class APKPure extends AppSource {
|
class APKPure extends AppSource {
|
||||||
APKPure() {
|
APKPure() {
|
||||||
host = 'apkpure.com';
|
host = 'apkpure.com';
|
||||||
|
allowSubDomains = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -28,7 +29,7 @@ class APKPure extends AppSource {
|
|||||||
RegExp standardUrlRegExB = RegExp('^https?://m.$host/+[^/]+/+[^/]+');
|
RegExp standardUrlRegExB = RegExp('^https?://m.$host/+[^/]+/+[^/]+');
|
||||||
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase());
|
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase());
|
||||||
if (match != null) {
|
if (match != null) {
|
||||||
url = 'https://$host/${Uri.parse(url).path}';
|
url = 'https://$host${Uri.parse(url).path}';
|
||||||
}
|
}
|
||||||
RegExp standardUrlRegExA = RegExp('^https?://$host/+[^/]+/+[^/]+');
|
RegExp standardUrlRegExA = RegExp('^https?://$host/+[^/]+/+[^/]+');
|
||||||
match = standardUrlRegExA.firstMatch(url.toLowerCase());
|
match = standardUrlRegExA.firstMatch(url.toLowerCase());
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class FDroid extends AppSource {
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('trySelectingSuggestedVersionCode',
|
GeneratedFormSwitch('trySelectingSuggestedVersionCode',
|
||||||
label: tr('trySelectingSuggestedVersionCode'), defaultValue: true)
|
label: tr('trySelectingSuggestedVersionCode'))
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('autoSelectHighestVersionCode',
|
GeneratedFormSwitch('autoSelectHighestVersionCode',
|
||||||
@@ -57,8 +57,63 @@ class FDroid extends AppSource {
|
|||||||
return Uri.parse(standardUrl).pathSegments.last;
|
return Uri.parse(standardUrl).pathSegments.last;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
|
String standardUrl,
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
) async {
|
||||||
|
String? appId = await tryInferringAppId(standardUrl);
|
||||||
|
String host = Uri.parse(standardUrl).host;
|
||||||
|
return getAPKUrlsFromFDroidPackagesAPIResponse(
|
||||||
|
await sourceRequest('https://$host/api/v1/packages/$appId'),
|
||||||
|
'https://$host/repo/$appId',
|
||||||
|
standardUrl,
|
||||||
|
name,
|
||||||
|
autoSelectHighestVersionCode:
|
||||||
|
additionalSettings['autoSelectHighestVersionCode'] == true,
|
||||||
|
trySelectingSuggestedVersionCode:
|
||||||
|
additionalSettings['trySelectingSuggestedVersionCode'] == true,
|
||||||
|
filterVersionsByRegEx:
|
||||||
|
(additionalSettings['filterVersionsByRegEx'] as String?)
|
||||||
|
?.isNotEmpty ==
|
||||||
|
true
|
||||||
|
? additionalSettings['filterVersionsByRegEx']
|
||||||
|
: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Map<String, List<String>>> search(String query,
|
||||||
|
{Map<String, dynamic> querySettings = const {}}) async {
|
||||||
|
Response res = await sourceRequest(
|
||||||
|
'https://search.$host/?q=${Uri.encodeQueryComponent(query)}');
|
||||||
|
if (res.statusCode == 200) {
|
||||||
|
Map<String, List<String>> urlsWithDescriptions = {};
|
||||||
|
parse(res.body).querySelectorAll('.package-header').forEach((e) {
|
||||||
|
String? url = e.attributes['href'];
|
||||||
|
if (url != null) {
|
||||||
|
try {
|
||||||
|
standardizeUrl(url);
|
||||||
|
} catch (e) {
|
||||||
|
url = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (url != null) {
|
||||||
|
urlsWithDescriptions[url] = [
|
||||||
|
e.querySelector('.package-name')?.text.trim() ?? '',
|
||||||
|
e.querySelector('.package-summary')?.text.trim() ??
|
||||||
|
tr('noDescription')
|
||||||
|
];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return urlsWithDescriptions;
|
||||||
|
} else {
|
||||||
|
throw getObtainiumHttpError(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
|
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
|
||||||
Response res, String apkUrlPrefix, String standardUrl,
|
Response res, String apkUrlPrefix, String standardUrl, String sourceName,
|
||||||
{bool autoSelectHighestVersionCode = false,
|
{bool autoSelectHighestVersionCode = false,
|
||||||
bool trySelectingSuggestedVersionCode = false,
|
bool trySelectingSuggestedVersionCode = false,
|
||||||
String? filterVersionsByRegEx}) {
|
String? filterVersionsByRegEx}) {
|
||||||
@@ -126,62 +181,8 @@ class FDroid extends AppSource {
|
|||||||
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
|
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
|
||||||
.toList();
|
.toList();
|
||||||
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
|
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
|
||||||
AppNames(name, Uri.parse(standardUrl).pathSegments.last));
|
AppNames(sourceName, Uri.parse(standardUrl).pathSegments.last));
|
||||||
} else {
|
} else {
|
||||||
throw getObtainiumHttpError(res);
|
throw getObtainiumHttpError(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
|
||||||
String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings,
|
|
||||||
) async {
|
|
||||||
String? appId = await tryInferringAppId(standardUrl);
|
|
||||||
String host = Uri.parse(standardUrl).host;
|
|
||||||
return getAPKUrlsFromFDroidPackagesAPIResponse(
|
|
||||||
await sourceRequest('https://$host/api/v1/packages/$appId'),
|
|
||||||
'https://$host/repo/$appId',
|
|
||||||
standardUrl,
|
|
||||||
autoSelectHighestVersionCode:
|
|
||||||
additionalSettings['autoSelectHighestVersionCode'] == true,
|
|
||||||
trySelectingSuggestedVersionCode:
|
|
||||||
additionalSettings['trySelectingSuggestedVersionCode'] == true,
|
|
||||||
filterVersionsByRegEx:
|
|
||||||
(additionalSettings['filterVersionsByRegEx'] as String?)
|
|
||||||
?.isNotEmpty ==
|
|
||||||
true
|
|
||||||
? additionalSettings['filterVersionsByRegEx']
|
|
||||||
: null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<Map<String, List<String>>> search(String query,
|
|
||||||
{Map<String, dynamic> querySettings = const {}}) async {
|
|
||||||
Response res = await sourceRequest(
|
|
||||||
'https://search.$host/?q=${Uri.encodeQueryComponent(query)}');
|
|
||||||
if (res.statusCode == 200) {
|
|
||||||
Map<String, List<String>> urlsWithDescriptions = {};
|
|
||||||
parse(res.body).querySelectorAll('.package-header').forEach((e) {
|
|
||||||
String? url = e.attributes['href'];
|
|
||||||
if (url != null) {
|
|
||||||
try {
|
|
||||||
standardizeUrl(url);
|
|
||||||
} catch (e) {
|
|
||||||
url = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (url != null) {
|
|
||||||
urlsWithDescriptions[url] = [
|
|
||||||
e.querySelector('.package-name')?.text.trim() ?? '',
|
|
||||||
e.querySelector('.package-summary')?.text.trim() ??
|
|
||||||
tr('noDescription')
|
|
||||||
];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return urlsWithDescriptions;
|
|
||||||
} else {
|
|
||||||
throw getObtainiumHttpError(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -72,9 +72,10 @@ class GitHub extends AppSource {
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
],
|
],
|
||||||
|
[GeneratedFormSwitch('verifyLatestTag', label: tr('verifyLatestTag'))],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('verifyLatestTag',
|
GeneratedFormSwitch('dontSortReleasesList',
|
||||||
label: tr('verifyLatestTag'), defaultValue: false)
|
label: tr('dontSortReleasesList'))
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -230,6 +231,8 @@ class GitHub extends AppSource {
|
|||||||
? additionalSettings['filterReleaseNotesByRegEx']
|
? additionalSettings['filterReleaseNotesByRegEx']
|
||||||
: null;
|
: null;
|
||||||
bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true;
|
bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true;
|
||||||
|
bool dontSortReleasesList =
|
||||||
|
additionalSettings['dontSortReleasesList'] == true;
|
||||||
String? latestTag;
|
String? latestTag;
|
||||||
if (verifyLatestTag) {
|
if (verifyLatestTag) {
|
||||||
var temp = requestUrl.split('?');
|
var temp = requestUrl.split('?');
|
||||||
@@ -265,6 +268,7 @@ class GitHub extends AppSource {
|
|||||||
rel?['published_at'] != null
|
rel?['published_at'] != null
|
||||||
? DateTime.parse(rel['published_at'])
|
? DateTime.parse(rel['published_at'])
|
||||||
: null;
|
: null;
|
||||||
|
if (dontSortReleasesList) {
|
||||||
releases.sort((a, b) {
|
releases.sort((a, b) {
|
||||||
// See #478 and #534
|
// See #478 and #534
|
||||||
if (a == b) {
|
if (a == b) {
|
||||||
@@ -291,6 +295,7 @@ class GitHub extends AppSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
if (latestTag != null &&
|
if (latestTag != null &&
|
||||||
releases.isNotEmpty &&
|
releases.isNotEmpty &&
|
||||||
latestTag !=
|
latestTag !=
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ class HTML extends AppSource {
|
|||||||
GeneratedFormSwitch('sortByFileNamesNotLinks',
|
GeneratedFormSwitch('sortByFileNamesNotLinks',
|
||||||
label: tr('sortByFileNamesNotLinks'))
|
label: tr('sortByFileNamesNotLinks'))
|
||||||
],
|
],
|
||||||
|
[GeneratedFormSwitch('reverseSort', label: tr('reverseSort'))],
|
||||||
[
|
[
|
||||||
GeneratedFormTextField('customLinkFilterRegex',
|
GeneratedFormTextField('customLinkFilterRegex',
|
||||||
label: tr('customLinkFilterRegex'),
|
label: tr('customLinkFilterRegex'),
|
||||||
@@ -107,7 +108,7 @@ class HTML extends AppSource {
|
|||||||
[
|
[
|
||||||
GeneratedFormTextField('intermediateLinkRegex',
|
GeneratedFormTextField('intermediateLinkRegex',
|
||||||
label: tr('intermediateLinkRegex'),
|
label: tr('intermediateLinkRegex'),
|
||||||
hint: '([0-9]+\.)*[0-9]+/\$',
|
hint: '([0-9]+.)*[0-9]+/\$',
|
||||||
required: false,
|
required: false,
|
||||||
additionalValidators: [(value) => regExValidator(value)])
|
additionalValidators: [(value) => regExValidator(value)])
|
||||||
],
|
],
|
||||||
@@ -195,6 +196,9 @@ class HTML extends AppSource {
|
|||||||
? compareAlphaNumeric(a.split('/').where((e) => e.isNotEmpty).last,
|
? compareAlphaNumeric(a.split('/').where((e) => e.isNotEmpty).last,
|
||||||
b.split('/').where((e) => e.isNotEmpty).last)
|
b.split('/').where((e) => e.isNotEmpty).last)
|
||||||
: compareAlphaNumeric(a, b));
|
: compareAlphaNumeric(a, b));
|
||||||
|
if (additionalSettings['reverseSort'] == true) {
|
||||||
|
links = links.reversed.toList();
|
||||||
|
}
|
||||||
if ((additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty ==
|
if ((additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty ==
|
||||||
true) {
|
true) {
|
||||||
var reg = RegExp(additionalSettings['apkFilterRegEx']);
|
var reg = RegExp(additionalSettings['apkFilterRegEx']);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart';
|
|||||||
// ignore: implementation_imports
|
// ignore: implementation_imports
|
||||||
import 'package:easy_localization/src/localization.dart';
|
import 'package:easy_localization/src/localization.dart';
|
||||||
|
|
||||||
const String currentVersion = '0.14.18';
|
const String currentVersion = '0.14.19';
|
||||||
const String currentReleaseTag =
|
const String currentReleaseTag =
|
||||||
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
||||||
|
|
||||||
|
|||||||
@@ -558,7 +558,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
const Flexible(child: Text('Debug Menu')),
|
Flexible(child: Text(tr('debugMenu'))),
|
||||||
Switch(
|
Switch(
|
||||||
value: settingsProvider.showDebugOpts,
|
value: settingsProvider.showDebugOpts,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
@@ -577,12 +577,9 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
const Duration(seconds: 0),
|
const Duration(seconds: 0),
|
||||||
bgUpdateCheckAlarmId + 200,
|
bgUpdateCheckAlarmId + 200,
|
||||||
bgUpdateCheck);
|
bgUpdateCheck);
|
||||||
showError(
|
showError(tr('bgTaskStarted'), context);
|
||||||
'Background task started - check logs.',
|
|
||||||
context);
|
|
||||||
},
|
},
|
||||||
child:
|
child: Text(tr('runBgCheckNow')))
|
||||||
const Text('Run Background Update Check Now'))
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
|
|||||||
24
pubspec.lock
24
pubspec.lock
@@ -46,10 +46,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e
|
sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.3.9"
|
version: "3.4.2"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -386,10 +386,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf
|
sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.17"
|
version: "4.1.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -546,10 +546,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f
|
sha256: f2543a236584a5e8be79076f858022f100ce690e31530e6fa4c32ac94f276d3a
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.0.1"
|
version: "11.0.3"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -903,26 +903,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: d2f7241849582da80b79acb03bb936422412ce5c0c79fb5f6a1de5421a5aecc4
|
sha256: "485af05f2c5f83c7f78c20e236b170ad02df7153b299ae9917345be43871d29f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.7.4"
|
version: "3.8.0"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa"
|
sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.7"
|
version: "5.0.8"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32_registry
|
name: win32_registry
|
||||||
sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9
|
sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 0.14.18+210 # When changing this, update the tag in main() accordingly
|
version: 0.14.19+211 # When changing this, update the tag in main() accordingly
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
|
|||||||
Reference in New Issue
Block a user