import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; class VLC extends AppSource { VLC() { host = 'videolan.org'; } @override String sourceSpecificStandardizeURL(String url) { return 'https://$host'; } @override Future getLatestAPKDetails( String standardUrl, Map additionalSettings, ) async { Response res = await sourceRequest( 'https://www.videolan.org/vlc/download-android.html'); if (res.statusCode == 200) { var dwUrlBase = 'get.videolan.org/vlc-android'; var dwLinks = parse(res.body) .querySelectorAll('a') .where((element) => element.attributes['href']?.contains(dwUrlBase) ?? false) .toList(); String? version = dwLinks.isNotEmpty ? dwLinks.first.attributes['href'] ?.split('/') .where((s) => s.isNotEmpty) .last : null; if (version == null) { throw NoVersionError(); } String? targetUrl = 'https://$dwUrlBase/$version/'; Response res2 = await sourceRequest(targetUrl); List apkUrls = []; if (res2.statusCode == 200) { apkUrls = parse(res2.body) .querySelectorAll('a') .map((e) => e.attributes['href']?.split('/').last) .where((h) => h != null && h.isNotEmpty && h.toLowerCase().endsWith('.apk')) .map((e) => targetUrl + e!) .toList(); } else { throw getObtainiumHttpError(res2); } return APKDetails( version, getApkUrlsFromUrls(apkUrls), AppNames('VideoLAN', 'VLC')); } else { throw getObtainiumHttpError(res); } } @override Future apkUrlPrefetchModifier( String apkUrl, String standardUrl) async { Response res = await sourceRequest(apkUrl); if (res.statusCode == 200) { String? apkUrl = parse(res.body).querySelector('#alt_link')?.attributes['href']; if (apkUrl == null) { throw NoAPKError(); } return apkUrl; } else { throw getObtainiumHttpError(res); } } }