From 71755763b9a50fade54de91c911e3ea086a0eb38 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 7 Oct 2023 13:15:22 -0400 Subject: [PATCH] Enabled WhatsApp Source (#357) --- lib/app_sources/whatsapp.dart | 48 ++++++++---------------------- lib/providers/source_provider.dart | 3 +- 2 files changed, 15 insertions(+), 36 deletions(-) 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/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(),