Skip to content

Commit

Permalink
Added basic SourceForge support
Browse files Browse the repository at this point in the history
  • Loading branch information
Imran Remtulla committed Sep 25, 2022
1 parent 420cf48 commit a916167
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 35 deletions.
69 changes: 69 additions & 0 deletions lib/app_sources/sourceforge.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/providers/source_provider.dart';

class SourceForge implements AppSource {
@override
late String host = 'sourceforge.net';

@override
String standardizeURL(String url) {
RegExp standardUrlRegEx = RegExp('^https?://$host/projects/[^/]+');
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase());
if (match == null) {
throw notValidURL(runtimeType.toString());
}
return url.substring(0, match.end);
}

@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl, List<String> additionalData) async {
Response res = await get(Uri.parse('$standardUrl/rss?path=/'));
if (res.statusCode == 200) {
var parsedHtml = parse(res.body);
var allDownloadLinks =
parsedHtml.querySelectorAll('guid').map((e) => e.innerHtml).toList();
getVersion(String url) {
try {
var tokens = url.split('/');
return tokens[tokens.length - 3];
} catch (e) {
return null;
}
}

String? version = getVersion(allDownloadLinks[0]);
if (version == null) {
throw couldNotFindLatestVersion;
}
var apkUrlListAllReleases = allDownloadLinks
.where((element) => element.toLowerCase().endsWith('.apk/download'))
.toList();
var apkUrlList =
apkUrlListAllReleases // This can be used skipped for fallback support later
.where((element) => getVersion(element) == version)
.toList();
if (apkUrlList.isEmpty) {
throw noAPKFound;
}
return APKDetails(version, apkUrlList);
} else {
throw couldNotFindReleases;
}
}

@override
AppNames getAppNames(String standardUrl) {
return AppNames(runtimeType.toString(),
standardUrl.substring(standardUrl.lastIndexOf('/') + 1));
}

@override
List<List<GeneratedFormItem>> additionalDataFormItems = [];

@override
List<String> additionalDataDefaults = [];
}
66 changes: 32 additions & 34 deletions lib/pages/add_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,7 @@ class _AddAppPageState extends State<AddAppPage> {
child: const Text('Add'))
],
),
if (pickedSource != null &&
(pickedSource!.additionalDataFormItems.isNotEmpty))
if (pickedSource != null)
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expand All @@ -158,39 +157,38 @@ class _AddAppPageState extends State<AddAppPage> {
const SizedBox(
height: 16,
),
GeneratedForm(
items: pickedSource!.additionalDataFormItems,
onValueChanges: (values, valid) {
setState(() {
additionalData = values;
validAdditionalData = valid;
});
},
defaultValues:
pickedSource!.additionalDataDefaults),
if (pickedSource!
.additionalDataFormItems.isNotEmpty)
GeneratedForm(
items: pickedSource!.additionalDataFormItems,
onValueChanges: (values, valid) {
setState(() {
additionalData = values;
validAdditionalData = valid;
});
},
defaultValues:
pickedSource!.additionalDataDefaults),
if (pickedSource!
.additionalDataFormItems.isNotEmpty)
const SizedBox(
height: 8,
),
if (pickedSource != null)
Column(
crossAxisAlignment:
CrossAxisAlignment.stretch,
children: [
const SizedBox(
height: 8,
),
GeneratedForm(
items: [
[
GeneratedFormItem(
label: 'Custom App Name',
required: false)
]
],
onValueChanges: (values, valid) {
setState(() {
customName = values[0];
});
},
defaultValues: [customName])
]),
GeneratedForm(
items: [
[
GeneratedFormItem(
label: 'Custom App Name',
required: false)
]
],
onValueChanges: (values, valid) {
setState(() {
customName = values[0];
});
},
defaultValues: [customName])
],
)
else
Expand Down
4 changes: 3 additions & 1 deletion lib/providers/source_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:obtainium/app_sources/gitlab.dart';
import 'package:obtainium/app_sources/izzyondroid.dart';
import 'package:obtainium/app_sources/mullvad.dart';
import 'package:obtainium/app_sources/signal.dart';
import 'package:obtainium/app_sources/sourceforge.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/mass_app_sources/githubstars.dart';

Expand Down Expand Up @@ -144,7 +145,8 @@ class SourceProvider {
FDroid(),
IzzyOnDroid(),
Mullvad(),
Signal()
Signal(),
SourceForge()
];

// Add more mass source classes here so they are available via the service
Expand Down

0 comments on commit a916167

Please sign in to comment.