Skip to content

Commit fff3b22

Browse files
committed
Merge remote-tracking branch 'origin/dev'
2 parents e5db702 + 46354e6 commit fff3b22

File tree

5 files changed

+93
-24
lines changed

5 files changed

+93
-24
lines changed

README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ Currently supported App sources:
2929
- [Uptodown](https://uptodown.com/)
3030
- [Huawei AppGallery](https://appgallery.huawei.com/)
3131
- [Tencent App Store](https://sj.qq.com/)
32+
- [RuStore](https://rustore.ru/)
3233
- Jenkins Jobs
3334
- [APKMirror](https://apkmirror.com/) (Track-Only)
3435
- Other - App-Specific:
35-
- [Telegram App](https://telegram.org)
36-
- [Neutron Code](https://neutroncode.com)
36+
- [Telegram App](https://telegram.org/)
37+
- [Neutron Code](https://neutroncode.com/)
3738
- Direct APK Link
3839
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files
3940

fastlane/metadata/android/en-US/full_description.txt

+3-11
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<li>F-Droid</li>
1414
<li>Third Party F-Droid Repos</li>
1515
<li>IzzyOnDroid</li>
16-
<li>SourceForge</li>
1716
<li>SourceHut</li>
1817
</ul>
1918
</li>
@@ -22,24 +21,17 @@
2221
<ul>
2322
<li>APKPure</li>
2423
<li>Aptoide</li>
25-
<li>Uptodowng</li>
24+
<li>Uptodown</li>
2625
<li>APKMirror (Track-Only)</li>
2726
<li>Huawei AppGallery</li>
27+
<li>Tencent App Store</li>
2828
<li>Jenkins Jobs</li>
29-
</ul>
30-
</li>
31-
<li>
32-
<p>Open Source - App-Specific:</p>
33-
<ul>
34-
<li>Mullvad</li>
35-
<li>Signal</li>
36-
<li>VLC</li>
29+
<li>RuStore</li>
3730
</ul>
3831
</li>
3932
<li>
4033
<p>Other - App-Specific:</p>
4134
<ul>
42-
<li>WhatsApp</li>
4335
<li>Telegram App</li>
4436
<li>Neutron Code</li>
4537
</ul>

fastlane/metadata/android/ru/full_description.txt

+3-11
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<li>F-Droid</li>
1414
<li>Third Party F-Droid Repos</li>
1515
<li>IzzyOnDroid</li>
16-
<li>SourceForge</li>
1716
<li>SourceHut</li>
1817
</ul>
1918
</li>
@@ -22,24 +21,17 @@
2221
<ul>
2322
<li>APKPure</li>
2423
<li>Aptoide</li>
25-
<li>Uptodowng</li>
24+
<li>Uptodown</li>
2625
<li>APKMirror (Track-Only)</li>
2726
<li>Huawei AppGallery</li>
27+
<li>Tencent App Store</li>
2828
<li>Jenkins Jobs</li>
29-
</ul>
30-
</li>
31-
<li>
32-
<p>Свободное ПО - Для отдельных приложений:</p>
33-
<ul>
34-
<li>Mullvad</li>
35-
<li>Signal</li>
36-
<li>VLC</li>
29+
<li>RuStore</li>
3730
</ul>
3831
</li>
3932
<li>
4033
<p>Другие - Для отдельных приложений:</p>
4134
<ul>
42-
<li>WhatsApp</li>
4335
<li>Telegram App</li>
4436
<li>Neutron Code</li>
4537
</ul>

lib/app_sources/rustore.dart

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import 'dart:convert';
2+
3+
import 'package:easy_localization/easy_localization.dart';
4+
import 'package:http/http.dart';
5+
import 'package:obtainium/custom_errors.dart';
6+
import 'package:obtainium/providers/source_provider.dart';
7+
8+
class RuStore extends AppSource {
9+
RuStore() {
10+
hosts = ['rustore.ru'];
11+
name = 'RuStore';
12+
naiveStandardVersionDetection = true;
13+
showReleaseDateAsVersionToggle = true;
14+
}
15+
16+
@override
17+
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
18+
RegExp standardUrlRegEx = RegExp(
19+
'^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+',
20+
caseSensitive: false);
21+
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
22+
if (match == null) {
23+
throw InvalidURLError(name);
24+
}
25+
return match.group(0)!;
26+
}
27+
28+
@override
29+
Future<String?> tryInferringAppId(String standardUrl,
30+
{Map<String, dynamic> additionalSettings = const {}}) async {
31+
return Uri.parse(standardUrl).pathSegments.last;
32+
}
33+
34+
@override
35+
Future<APKDetails> getLatestAPKDetails(
36+
String standardUrl,
37+
Map<String, dynamic> additionalSettings,
38+
) async {
39+
String? appId = await tryInferringAppId(standardUrl);
40+
Response res0 = await sourceRequest(
41+
'https://backapi.rustore.ru/applicationData/overallInfo/$appId',
42+
additionalSettings);
43+
if (res0.statusCode != 200) {
44+
throw getObtainiumHttpError(res0);
45+
}
46+
var appDetails = jsonDecode(res0.body)['body'];
47+
if (appDetails['appId'] == null) {
48+
throw NoReleasesError();
49+
}
50+
51+
String appName = appDetails['appName'] ?? tr('app');
52+
String author = appDetails['companyName'] ?? name;
53+
String? dateStr = appDetails['updatedAt'];
54+
String? version = appDetails['versionName'];
55+
if (version == null) {
56+
throw NoVersionError();
57+
}
58+
DateTime? relDate;
59+
if (dateStr != null) {
60+
relDate = DateTime.parse(dateStr);
61+
}
62+
63+
Response res1 = await sourceRequest(
64+
'https://backapi.rustore.ru/applicationData/download-link',
65+
additionalSettings,
66+
followRedirects: false,
67+
postBody: {"appId": appDetails['appId'], "firstInstall": true});
68+
var downloadDetails = jsonDecode(res1.body)['body'];
69+
if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) {
70+
throw NoAPKError();
71+
}
72+
73+
return APKDetails(
74+
version,
75+
getApkUrlsFromUrls([
76+
(downloadDetails['apkUrl'] as String)
77+
.replaceAll(RegExp('\\.zip\$'), '.apk')
78+
]),
79+
AppNames(author, appName),
80+
releaseDate: relDate);
81+
}
82+
}

lib/providers/source_provider.dart

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import 'package:obtainium/app_sources/izzyondroid.dart';
2323
import 'package:obtainium/app_sources/html.dart';
2424
import 'package:obtainium/app_sources/jenkins.dart';
2525
import 'package:obtainium/app_sources/neutroncode.dart';
26+
import 'package:obtainium/app_sources/rustore.dart';
2627
import 'package:obtainium/app_sources/sourceforge.dart';
2728
import 'package:obtainium/app_sources/sourcehut.dart';
2829
import 'package:obtainium/app_sources/telegramapp.dart';
@@ -864,6 +865,7 @@ class SourceProvider {
864865
Tencent(),
865866
Jenkins(),
866867
APKMirror(),
868+
RuStore(),
867869
TelegramApp(),
868870
NeutronCode(),
869871
DirectAPKLink(),

0 commit comments

Comments
 (0)