From 849a5651773014c5f2d33645a777fec6e000f088 Mon Sep 17 00:00:00 2001
From: iKirby <6316115+iKirby@users.noreply.github.com>
Date: Tue, 29 Apr 2025 17:01:11 +0800
Subject: [PATCH 1/5] Add support for vivo App Store
---
README.md | 1 +
assets/translations/en.json | 1 +
assets/translations/zh.json | 1 +
.../android/en-US/full_description.txt | 1 +
.../metadata/android/ru/full_description.txt | 1 +
lib/app_sources/vivoappstore.dart | 105 ++++++++++++++++++
lib/providers/source_provider.dart | 2 +
7 files changed, 112 insertions(+)
create mode 100644 lib/app_sources/vivoappstore.dart
diff --git a/README.md b/README.md
index 6518041..686b646 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ Currently supported App sources:
- [Huawei AppGallery](https://appgallery.huawei.com/)
- [Tencent App Store](https://sj.qq.com/)
- [CoolApk](https://coolapk.com/)
+ - [vivo App Store](https://h5.appstore.vivo.com.cn/)
- [RuStore](https://rustore.ru/)
- Jenkins Jobs
- [APKMirror](https://apkmirror.com/) (Track-Only)
diff --git a/assets/translations/en.json b/assets/translations/en.json
index acc31b7..d5c431e 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -321,6 +321,7 @@
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "Tencent App Store",
"coolApk": "CoolApk",
+ "vivoAppStore": "vivo App Store",
"name": "Name",
"smartname": "Name (smart)",
"sortMethod": "Sort method",
diff --git a/assets/translations/zh.json b/assets/translations/zh.json
index 4e617a0..bb36a17 100644
--- a/assets/translations/zh.json
+++ b/assets/translations/zh.json
@@ -321,6 +321,7 @@
"refreshBeforeDownload": "下载前刷新应用程序详细信息",
"tencentAppStore": "腾讯应用宝",
"coolApk": "酷安",
+ "vivoAppStore": "vivo 应用商店",
"name": "名称",
"smartname": "姓名(智能)",
"sortMethod": "排序方法",
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index d620444..7fed3cf 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -26,6 +26,7 @@
Huawei AppGallery
Tencent App Store
CoolApk
+ vivo App Store
Jenkins Jobs
RuStore
diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt
index 7249abd..d67a272 100644
--- a/fastlane/metadata/android/ru/full_description.txt
+++ b/fastlane/metadata/android/ru/full_description.txt
@@ -26,6 +26,7 @@
Huawei AppGallery
Tencent App Store
CoolApk
+ vivo App Store
Jenkins Jobs
RuStore
diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart
new file mode 100644
index 0000000..6006746
--- /dev/null
+++ b/lib/app_sources/vivoappstore.dart
@@ -0,0 +1,105 @@
+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;
+ }
+
+ @override
+ String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
+ var vivoAppId =
+ Uri.parse(url.replaceAll('/#', '')).queryParameters['appId'];
+ if (vivoAppId == null) {
+ throw InvalidURLError(name);
+ }
+ return '$appDetailUrl$vivoAppId';
+ }
+
+ @override
+ Future tryInferringAppId(String standardUrl,
+ {Map additionalSettings = const {}}) async {
+ var json = await getDetailJson(standardUrl, additionalSettings);
+ return json['package_name'];
+ }
+
+ @override
+ Future getLatestAPKDetails(
+ String standardUrl, Map 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