diff --git a/README.md b/README.md
index 6518041..b0b3bd9 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 (CN)](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 9c5f43a..3565d0a 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 (CN)",
     "name": "Name",
     "smartname": "Name (smart)",
     "sortMethod": "Sort method",
diff --git a/assets/translations/zh.json b/assets/translations/zh.json
index f4f408f..eb07843 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..ecdd345 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 (CN)
 			Jenkins Jobs
 			RuStore
 		
diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt
index 7249abd..61e9331 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 (CN)
 			Jenkins Jobs
 			RuStore
 		
diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart
index 982c409..8894422 100644
--- a/lib/app_sources/apkpure.dart
+++ b/lib/app_sources/apkpure.dart
@@ -128,7 +128,21 @@ class APKPure extends AppSource {
               .toList() ??
           [];
       if (apkUrls.isEmpty) {
-        throw NoAPKError();
+        var link =
+            html.querySelector("a.download-start-btn")?.attributes['href'];
+        RegExp downloadLinkRegEx = RegExp(
+            r'^https:\/\/d\.[^/]+\/b\/([^/]+)\/[^/?]+\?versionCode=([0-9]+).$',
+            caseSensitive: false);
+        RegExpMatch? match = downloadLinkRegEx.firstMatch(link ?? '');
+        if (match == null) {
+          throw NoAPKError();
+        }
+        String type = match.group(1)!;
+        String versionCode = match.group(2)!;
+        apkUrls = [
+          MapEntry('$appId-$versionCode-.${type.toLowerCase()}',
+              'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode')
+        ];
       }
       String version = Uri.parse(link).pathSegments.last;
       String? author;
diff --git a/lib/app_sources/coolapk.dart b/lib/app_sources/coolapk.dart
index 01027da..741ec26 100644
--- a/lib/app_sources/coolapk.dart
+++ b/lib/app_sources/coolapk.dart
@@ -13,6 +13,7 @@ class CoolApk extends AppSource {
     hosts = ['www.coolapk.com', 'api2.coolapk.com'];
     allowSubDomains = true;
     naiveStandardVersionDetection = true;
+    allowOverride = false;
   }
 
   @override
@@ -170,4 +171,4 @@ class CoolApk extends AppSource {
 
     return {'deviceCode': deviceCode, 'token': finalToken};
   }
-}
\ No newline at end of file
+}
diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart
new file mode 100644
index 0000000..9b55ce2
--- /dev/null
+++ b/lib/app_sources/vivoappstore.dart
@@ -0,0 +1,97 @@
+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 = parseVivoAppId(url);
+    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