Skip to content

Commit f4a7f10

Browse files
authored
Merge pull request #2668 from divinezmuz/main
Added moddroid as a source
2 parents d341d7c + d141101 commit f4a7f10

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

lib/app_sources/moddroid.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'package:html/parser.dart';
2+
import 'package:obtainium/custom_errors.dart';
3+
import 'package:obtainium/providers/source_provider.dart';
4+
5+
class Moddroid extends AppSource {
6+
Moddroid() {
7+
hosts = ['moddroid.com'];
8+
}
9+
10+
@override
11+
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
12+
var match = RegExp(r'moddroid\.com/(apps|games)/([^/]+)/([^/]+)').firstMatch(url);
13+
if (match != null) return 'https://moddroid.com/${match.group(1)}/${match.group(2)}/${match.group(3)}/';
14+
throw ObtainiumError('Invalid URL');
15+
}
16+
17+
@override
18+
Future<APKDetails> getLatestAPKDetails(String standardUrl, Map<String, dynamic> additionalSettings) async {
19+
try {
20+
var mainRes = await sourceRequest(standardUrl, additionalSettings);
21+
if (mainRes.statusCode != 200) throw getObtainiumHttpError(mainRes);
22+
23+
var baseUrl = Uri.parse(standardUrl);
24+
var intermediateUrl = parse(mainRes.body).querySelectorAll('a')
25+
.map((e) => e.attributes['href'])
26+
.where((href) => href != null)
27+
.map((href) => baseUrl.resolve(href!).toString())
28+
.firstWhere((url) => RegExp(r'moddroid\.com/(apps|games)/.+/[A-Za-z0-9]+/$').hasMatch(url),
29+
orElse: () => throw NoReleasesError(note: 'No download page found'));
30+
31+
var intRes = await sourceRequest(intermediateUrl, additionalSettings);
32+
if (intRes.statusCode != 200) throw getObtainiumHttpError(intRes);
33+
34+
var apkUrl = parse(intRes.body).querySelectorAll('a')
35+
.map((e) => e.attributes['href'])
36+
.firstWhere((href) => href != null && RegExp(r'cdn\.topmongo\.com/.*\.apk$').hasMatch(href),
37+
orElse: () => throw NoReleasesError(note: 'No APK link found'));
38+
39+
var version = RegExp(r'\d+\.\d+(\.\d+)?').firstMatch(apkUrl!)?.group(0) ?? apkUrl.hashCode.abs().toString();
40+
var name = (parse(mainRes.body).querySelector('title')?.text ?? 'App')
41+
.replaceAll(' MOD APK', '').replaceAll(RegExp(r' v?[\d\.]+.*'), '').trim();
42+
43+
return APKDetails(version, [MapEntry(apkUrl, apkUrl)], AppNames(name, name));
44+
} catch (e) {
45+
if (e is ObtainiumError) rethrow;
46+
throw ObtainiumError('Moddroid Error: $e');
47+
}
48+
}
49+
}

lib/providers/source_provider.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import 'package:obtainium/app_sources/izzyondroid.dart';
2626
import 'package:obtainium/app_sources/html.dart';
2727
import 'package:obtainium/app_sources/jenkins.dart';
2828
import 'package:obtainium/app_sources/liteapks.dart';
29+
import 'package:obtainium/app_sources/moddroid.dart';
2930
import 'package:obtainium/app_sources/neutroncode.dart';
3031
import 'package:obtainium/app_sources/rustore.dart';
3132
import 'package:obtainium/app_sources/sourceforge.dart';
@@ -1128,6 +1129,7 @@ class SourceProvider {
11281129
Tencent(),
11291130
CoolApk(),
11301131
LiteAPKs(),
1132+
Moddroid(),
11311133
VivoAppStore(),
11321134
Jenkins(),
11331135
APKMirror(),

0 commit comments

Comments
 (0)