mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-11-04 15:23:28 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'dart:convert';
 | 
						|
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:obtainium/custom_errors.dart';
 | 
						|
import 'package:obtainium/providers/source_provider.dart';
 | 
						|
 | 
						|
class VivoAppStore extends AppSource {
 | 
						|
  static const appDetailUrl =
 | 
						|
      'https://h5coml.vivo.com.cn/h5coml/appdetail_h5/browser_v2/index.html?appId=';
 | 
						|
 | 
						|
  VivoAppStore() {
 | 
						|
    name = tr('vivoAppStore');
 | 
						|
    hosts = ['h5.appstore.vivo.com.cn', 'h5coml.vivo.com.cn'];
 | 
						|
    naiveStandardVersionDetection = true;
 | 
						|
    canSearch = true;
 | 
						|
    allowOverride = false;
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
 | 
						|
    var vivoAppId = parseVivoAppId(url);
 | 
						|
    return '$appDetailUrl$vivoAppId';
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Future<String?> tryInferringAppId(
 | 
						|
    String standardUrl, {
 | 
						|
    Map<String, dynamic> additionalSettings = const {},
 | 
						|
  }) async {
 | 
						|
    var json = await getDetailJson(standardUrl, additionalSettings);
 | 
						|
    return json['package_name'];
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Future<APKDetails> getLatestAPKDetails(
 | 
						|
    String standardUrl,
 | 
						|
    Map<String, dynamic> additionalSettings,
 | 
						|
  ) async {
 | 
						|
    var json = await getDetailJson(standardUrl, additionalSettings);
 | 
						|
    var appName = json['title_zh'].toString();
 | 
						|
    var packageName = json['package_name'].toString();
 | 
						|
    var versionName = json['version_name'].toString();
 | 
						|
    var versionCode = json['version_code'].toString();
 | 
						|
    var developer = json['developer'].toString();
 | 
						|
    var uploadTime = json['upload_time'].toString();
 | 
						|
    var apkUrl = json['download_url'].toString();
 | 
						|
    var apkName = '${packageName}_$versionCode.apk';
 | 
						|
    return APKDetails(
 | 
						|
      versionName,
 | 
						|
      [MapEntry(apkName, apkUrl)],
 | 
						|
      AppNames(developer, appName),
 | 
						|
      releaseDate: DateTime.parse(uploadTime),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Future<Map<String, List<String>>> search(
 | 
						|
    String query, {
 | 
						|
    Map<String, dynamic> querySettings = const {},
 | 
						|
  }) async {
 | 
						|
    var apiBaseUrl =
 | 
						|
        'https://h5-api.appstore.vivo.com.cn/h5appstore/search/result-list?app_version=2100&page_index=1&apps_per_page=20&target=local&cfrom=2&key=';
 | 
						|
    var searchUrl = '$apiBaseUrl${Uri.encodeQueryComponent(query)}';
 | 
						|
    var response = await sourceRequest(searchUrl, {});
 | 
						|
    if (response.statusCode != 200) {
 | 
						|
      throw getObtainiumHttpError(response);
 | 
						|
    }
 | 
						|
    var json = jsonDecode(response.body);
 | 
						|
    if (json['code'] != 0 || !json['data']['appSearchResponse']['result']) {
 | 
						|
      throw NoReleasesError();
 | 
						|
    }
 | 
						|
    Map<String, List<String>> results = {};
 | 
						|
    var resultsJson = json['data']['appSearchResponse']['value'];
 | 
						|
    for (var item in (resultsJson as List<dynamic>)) {
 | 
						|
      results['$appDetailUrl${item['id']}'] = [
 | 
						|
        item['title_zh'].toString(),
 | 
						|
        item['developer'].toString(),
 | 
						|
      ];
 | 
						|
    }
 | 
						|
    return results;
 | 
						|
  }
 | 
						|
 | 
						|
  Future<Map<String, dynamic>> getDetailJson(
 | 
						|
    String standardUrl,
 | 
						|
    Map<String, dynamic> additionalSettings,
 | 
						|
  ) async {
 | 
						|
    var vivoAppId = parseVivoAppId(standardUrl);
 | 
						|
    var apiBaseUrl = 'https://h5-api.appstore.vivo.com.cn/detail/';
 | 
						|
    var params = '?frompage=messageh5&app_version=2100';
 | 
						|
    var detailUrl = '$apiBaseUrl$vivoAppId$params';
 | 
						|
    var response = await sourceRequest(detailUrl, additionalSettings);
 | 
						|
    if (response.statusCode != 200) {
 | 
						|
      throw getObtainiumHttpError(response);
 | 
						|
    }
 | 
						|
    var json = jsonDecode(response.body);
 | 
						|
    if (json['id'] == null) {
 | 
						|
      throw NoReleasesError();
 | 
						|
    }
 | 
						|
    return json;
 | 
						|
  }
 | 
						|
 | 
						|
  String parseVivoAppId(String url) {
 | 
						|
    var appId = Uri.parse(url.replaceAll('/#', '')).queryParameters['appId'];
 | 
						|
    if (appId == null || appId.isEmpty) {
 | 
						|
      throw InvalidURLError(name);
 | 
						|
    }
 | 
						|
    return appId;
 | 
						|
  }
 | 
						|
}
 |