diff --git a/lib/app_sources/whatsapp.dart b/lib/app_sources/whatsapp.dart index f17d8a0..ff295b4 100644 --- a/lib/app_sources/whatsapp.dart +++ b/lib/app_sources/whatsapp.dart @@ -16,14 +16,13 @@ class WhatsApp extends AppSource { @override Future apkUrlPrefetchModifier( String apkUrl, String standardUrl) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); + Response res = await sourceRequest('$standardUrl/android'); if (res.statusCode == 200) { var targetLinks = parse(res.body) .querySelectorAll('a') .map((e) => e.attributes['href'] ?? '') .where((e) => e.isNotEmpty) - .where((e) => - e.contains('content.whatsapp.net') && e.contains('WhatsApp.apk')) + .where((e) => e.contains('WhatsApp.apk')) .toList(); if (targetLinks.isEmpty) { throw NoAPKError(); @@ -39,37 +38,16 @@ class WhatsApp extends AppSource { String standardUrl, Map additionalSettings, ) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); - if (res.statusCode == 200) { - var targetElements = parse(res.body) - .querySelectorAll('p') - .where((element) => element.innerHtml.contains('Version ')) - .toList(); - if (targetElements.isEmpty) { - throw NoVersionError(); - } - var vLines = targetElements[0] - .innerHtml - .split('\n') - .where((element) => element.contains('Version ')) - .toList(); - if (vLines.isEmpty) { - throw NoVersionError(); - } - var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(vLines[0]); - if (versionMatch == null) { - throw NoVersionError(); - } - String version = - vLines[0].substring(versionMatch.start, versionMatch.end); - return APKDetails( - version, - getApkUrlsFromUrls([ - 'https://www.whatsapp.com/android?v=$version&=thisIsaPlaceholder&a=realURLPrefetchedAtDownloadTime' - ]), - AppNames('Meta', 'WhatsApp')); - } else { - throw getObtainiumHttpError(res); - } + // This is a CDN link that is consistent per version + // But it has query params that change constantly + Uri apkUri = + Uri.parse(await apkUrlPrefetchModifier(standardUrl, standardUrl)); + var unusableApkUrl = '${apkUri.origin}/${apkUri.path}'; + // So we use the param-less URL is a pseudo-version to add the app and check for updates + // See #357 for why we can't scrape the version number directly + // But we re-fetch the URL again with its latest query params at the actual download time + String version = unusableApkUrl.hashCode.toString(); + return APKDetails(version, getApkUrlsFromUrls([unusableApkUrl]), + AppNames('Meta', 'WhatsApp')); } } diff --git a/lib/main.dart b/lib/main.dart index d3343ea..76fb6c2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.23'; +const String currentVersion = '0.14.24'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index b4b732f..958f8e9 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -28,6 +28,7 @@ import 'package:obtainium/app_sources/steammobile.dart'; import 'package:obtainium/app_sources/telegramapp.dart'; import 'package:obtainium/app_sources/uptodown.dart'; import 'package:obtainium/app_sources/vlc.dart'; +import 'package:obtainium/app_sources/whatsapp.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/mass_app_sources/githubstars.dart'; @@ -557,7 +558,7 @@ class SourceProvider { Mullvad(), Signal(), VLC(), - // WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date + WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date TelegramApp(), SteamMobile(), NeutronCode(), diff --git a/pubspec.yaml b/pubspec.yaml index 5c82b0f..4b672df 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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 # 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. -version: 0.14.23+215 # When changing this, update the tag in main() accordingly +version: 0.14.24+216 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0'