mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 13:33:28 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:convert';
 | |
| 
 | |
| import 'package:obtainium/custom_errors.dart';
 | |
| import 'package:obtainium/providers/source_provider.dart';
 | |
| 
 | |
| class Tencent extends AppSource {
 | |
|   Tencent() {
 | |
|     name = 'Tencent App Store';
 | |
|     hosts = ['sj.qq.com'];
 | |
|     naiveStandardVersionDetection = true;
 | |
|     showReleaseDateAsVersionToggle = true;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
 | |
|     RegExp standardUrlRegEx = RegExp(
 | |
|         '^https?://${getSourceRegex(hosts)}/appdetail/[^/]+',
 | |
|         caseSensitive: false);
 | |
|     var match = standardUrlRegEx.firstMatch(url);
 | |
|     if (match == null) {
 | |
|       throw InvalidURLError(name);
 | |
|     }
 | |
|     return match.group(0)!;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Future<String?> tryInferringAppId(String standardUrl,
 | |
|       {Map<String, dynamic> additionalSettings = const {}}) async {
 | |
|     return Uri.parse(standardUrl).pathSegments.last;
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Future<APKDetails> getLatestAPKDetails(
 | |
|     String standardUrl,
 | |
|     Map<String, dynamic> additionalSettings,
 | |
|   ) async {
 | |
|     String appId = (await tryInferringAppId(standardUrl))!;
 | |
|     String baseHost = Uri.parse(standardUrl)
 | |
|         .host
 | |
|         .split('.')
 | |
|         .reversed
 | |
|         .toList()
 | |
|         .sublist(0, 2)
 | |
|         .reversed
 | |
|         .join('.');
 | |
| 
 | |
|     var res = await sourceRequest(
 | |
|         'https://upage.html5.$baseHost/wechat-apkinfo', additionalSettings,
 | |
|         followRedirects: false, postBody: {"packagename": appId});
 | |
| 
 | |
|     if (res.statusCode == 200) {
 | |
|       var json = jsonDecode(res.body);
 | |
|       if (json['app_detail_records'][appId] == null) {
 | |
|         throw NoReleasesError();
 | |
|       }
 | |
|       var version =
 | |
|           json['app_detail_records'][appId]['apk_all_data']['version_name'];
 | |
|       var apkUrl = json['app_detail_records'][appId]['apk_all_data']['url'];
 | |
|       if (apkUrl == null) {
 | |
|         throw NoAPKError();
 | |
|       }
 | |
|       var appName = json['app_detail_records'][appId]['app_info']['name'];
 | |
|       var author = json['app_detail_records'][appId]['app_info']['author'];
 | |
|       var releaseDate =
 | |
|           json['app_detail_records'][appId]['app_info']['update_time'];
 | |
| 
 | |
|       return APKDetails(
 | |
|           version,
 | |
|           [MapEntry(Uri.parse(apkUrl).queryParameters['fsname']!, apkUrl)],
 | |
|           AppNames(author, appName),
 | |
|           releaseDate: releaseDate != null
 | |
|               ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000)
 | |
|               : null);
 | |
|     } else {
 | |
|       throw getObtainiumHttpError(res);
 | |
|     }
 | |
|   }
 | |
| }
 |