mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 13:33:28 +01:00 
			
		
		
		
	Infer GitHub App ID where possible
This commit is contained in:
		| @@ -19,8 +19,8 @@ class APKCombo extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String? tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) { | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return Uri.parse(standardUrl).pathSegments.last; | ||||
|   } | ||||
|  | ||||
| @@ -83,7 +83,7 @@ class APKCombo extends AppSource { | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String appId = tryInferringAppId(standardUrl)!; | ||||
|     String appId = (await tryInferringAppId(standardUrl))!; | ||||
|     var preres = await sourceRequest(standardUrl); | ||||
|     if (preres.statusCode != 200) { | ||||
|       throw getObtainiumHttpError(preres); | ||||
|   | ||||
| @@ -24,8 +24,8 @@ class APKPure extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String? tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) { | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return Uri.parse(standardUrl).pathSegments.last; | ||||
|   } | ||||
|  | ||||
| @@ -34,7 +34,7 @@ class APKPure extends AppSource { | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String appId = tryInferringAppId(standardUrl)!; | ||||
|     String appId = (await tryInferringAppId(standardUrl))!; | ||||
|     String host = Uri.parse(standardUrl).host; | ||||
|     var res = await sourceRequest('$standardUrl/download'); | ||||
|     if (res.statusCode == 200) { | ||||
|   | ||||
| @@ -31,8 +31,8 @@ class FDroid extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String? tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) { | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return Uri.parse(standardUrl).pathSegments.last; | ||||
|   } | ||||
|  | ||||
| @@ -63,7 +63,7 @@ class FDroid extends AppSource { | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String? appId = tryInferringAppId(standardUrl); | ||||
|     String? appId = await tryInferringAppId(standardUrl); | ||||
|     String host = Uri.parse(standardUrl).host; | ||||
|     return getAPKUrlsFromFDroidPackagesAPIResponse( | ||||
|         await sourceRequest('https://$host/api/v1/packages/$appId'), | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/components/generated_form.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/apps_provider.dart'; | ||||
| import 'package:obtainium/providers/logs_provider.dart'; | ||||
| import 'package:obtainium/providers/settings_provider.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
| @@ -79,6 +80,44 @@ class GitHub extends AppSource { | ||||
|     canSearch = true; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     const possibleBuildGradleLocations = [ | ||||
|       '/app/build.gradle', | ||||
|       'android/app/build.gradle', | ||||
|       'src/app/build.gradle' | ||||
|     ]; | ||||
|     for (var path in possibleBuildGradleLocations) { | ||||
|       try { | ||||
|         var res = await sourceRequest( | ||||
|             '${await convertStandardUrlToAPIUrl(standardUrl)}/contents/$path'); | ||||
|         if (res.statusCode == 200) { | ||||
|           try { | ||||
|             var body = jsonDecode(res.body); | ||||
|             var appId = utf8 | ||||
|                 .decode(base64 | ||||
|                     .decode(body['content'].toString().split('\n').join(''))) | ||||
|                 .split('\n') | ||||
|                 .map((e) => e.trim()) | ||||
|                 .where((l) => l.startsWith('applicationId "')) | ||||
|                 .first | ||||
|                 .split('"')[1]; | ||||
|             if (appId.isNotEmpty) { | ||||
|               return appId; | ||||
|             } | ||||
|           } catch (err) { | ||||
|             LogsProvider().add( | ||||
|                 'Error parsing build.gradle from ${res.request!.url.toString()}: ${err.toString()}'); | ||||
|           } | ||||
|         } | ||||
|       } catch (err) { | ||||
|         // Ignore - ID will be extracted from the APK | ||||
|       } | ||||
|     } | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|     RegExp standardUrlRegEx = RegExp('^https?://$host/[^/]+/[^/]+'); | ||||
| @@ -97,6 +136,12 @@ class GitHub extends AppSource { | ||||
|     return creds != null && creds.isNotEmpty ? '$creds@' : ''; | ||||
|   } | ||||
|  | ||||
|   Future<String> getAPIHost() async => | ||||
|       'https://${await getCredentialPrefixIfAny()}api.$host'; | ||||
|  | ||||
|   Future<String> convertStandardUrlToAPIUrl(String standardUrl) async => | ||||
|       '${await getAPIHost()}/repos${standardUrl.substring('https://$host'.length)}'; | ||||
|  | ||||
|   @override | ||||
|   String? changeLogPageFromStandardUrl(String standardUrl) => | ||||
|       '$standardUrl/releases'; | ||||
| @@ -239,7 +284,7 @@ class GitHub extends AppSource { | ||||
|   ) async { | ||||
|     return await getLatestAPKDetailsCommon2(standardUrl, additionalSettings, | ||||
|         (bool useTagUrl) async { | ||||
|       return 'https://${await getCredentialPrefixIfAny()}api.$host/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; | ||||
|       return '${await convertStandardUrlToAPIUrl(standardUrl)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; | ||||
|     }, (Response res) { | ||||
|       rateLimitErrorCheck(res); | ||||
|     }); | ||||
| @@ -281,7 +326,7 @@ class GitHub extends AppSource { | ||||
|   Future<Map<String, List<String>>> search(String query) async { | ||||
|     return searchCommon( | ||||
|         query, | ||||
|         'https://${await getCredentialPrefixIfAny()}api.$host/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100', | ||||
|         '${await getAPIHost()}/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100', | ||||
|         'items', onHttpErrorCode: (Response res) { | ||||
|       rateLimitErrorCheck(res); | ||||
|     }); | ||||
|   | ||||
| @@ -18,8 +18,8 @@ class IzzyOnDroid extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String? tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) { | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return FDroid().tryInferringAppId(standardUrl); | ||||
|   } | ||||
|  | ||||
| @@ -28,7 +28,7 @@ class IzzyOnDroid extends AppSource { | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String? appId = tryInferringAppId(standardUrl); | ||||
|     String? appId = await tryInferringAppId(standardUrl); | ||||
|     return FDroid().getAPKUrlsFromFDroidPackagesAPIResponse( | ||||
|         await sourceRequest( | ||||
|             'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId'), | ||||
|   | ||||
| @@ -434,8 +434,8 @@ abstract class AppSource { | ||||
|     throw NotImplementedError(); | ||||
|   } | ||||
|  | ||||
|   String? tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) { | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return null; | ||||
|   } | ||||
| } | ||||
| @@ -592,7 +592,7 @@ class SourceProvider { | ||||
|         : apk.names.name[0].toUpperCase() + apk.names.name.substring(1); | ||||
|     return App( | ||||
|         currentApp?.id ?? | ||||
|             source.tryInferringAppId(standardUrl, | ||||
|             await source.tryInferringAppId(standardUrl, | ||||
|                 additionalSettings: additionalSettings) ?? | ||||
|             generateTempID(standardUrl, additionalSettings), | ||||
|         standardUrl, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user