import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/app_sources/html.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; class Mullvad extends AppSource { Mullvad() { host = 'mullvad.net'; } @override String standardizeURL(String url) { RegExp standardUrlRegEx = RegExp('^https?://$host'); RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); if (match == null) { throw InvalidURLError(name); } return url.substring(0, match.end); } @override String? changeLogPageFromStandardUrl(String standardUrl) => 'https://github.com/mullvad/mullvadvpn-app/blob/master/CHANGELOG.md'; @override Future getLatestAPKDetails( String standardUrl, Map additionalSettings, ) async { var details = await HTML().getLatestAPKDetails( '$standardUrl/en/download/android', additionalSettings); var fileName = details.apkUrls[0].split('/').last; var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(fileName); if (versionMatch == null) { throw NoVersionError(); } details.version = fileName.substring(versionMatch.start, versionMatch.end); details.names = AppNames(name, 'Mullvad-VPN'); try { details.changeLog = (await GitHub().getLatestAPKDetails( 'https://github.com/mullvad/mullvadvpn-app', {'fallbackToOlderReleases': true})) .changeLog; } catch (e) { print(e); // Ignore } return details; } }