mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-16 14:46:44 +02:00
Initial changes to support search
This commit is contained in:
@ -4,9 +4,10 @@ import 'package:obtainium/components/generated_form.dart';
|
|||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class FDroid implements AppSource {
|
class FDroid extends AppSource {
|
||||||
@override
|
FDroid() {
|
||||||
late String host = 'f-droid.org';
|
host = 'f-droid.org';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -77,13 +78,4 @@ class FDroid implements AppSource {
|
|||||||
AppNames getAppNames(String standardUrl) {
|
AppNames getAppNames(String standardUrl) {
|
||||||
return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last);
|
return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,52 @@ import 'package:obtainium/providers/settings_provider.dart';
|
|||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
class GitHub implements AppSource {
|
class GitHub extends AppSource {
|
||||||
@override
|
GitHub() {
|
||||||
late String host = 'github.com';
|
host = 'github.com';
|
||||||
|
|
||||||
|
additionalDataDefaults = ['true', 'true', ''];
|
||||||
|
|
||||||
|
moreSourceSettingsFormItems = [
|
||||||
|
GeneratedFormItem(
|
||||||
|
label: 'GitHub Personal Access Token (Increases Rate Limit)',
|
||||||
|
id: 'github-creds',
|
||||||
|
required: false,
|
||||||
|
additionalValidators: [
|
||||||
|
(value) {
|
||||||
|
if (value != null && value.trim().isNotEmpty) {
|
||||||
|
if (value
|
||||||
|
.split(':')
|
||||||
|
.where((element) => element.trim().isNotEmpty)
|
||||||
|
.length !=
|
||||||
|
2) {
|
||||||
|
return 'PAT must be in this format: username:token';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
],
|
||||||
|
hint: 'username:token',
|
||||||
|
belowWidgets: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
launchUrlString(
|
||||||
|
'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token',
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
child: const Text(
|
||||||
|
'About GitHub PATs',
|
||||||
|
style: TextStyle(
|
||||||
|
decoration: TextDecoration.underline, fontSize: 12),
|
||||||
|
))
|
||||||
|
])
|
||||||
|
];
|
||||||
|
|
||||||
|
canSearch = true;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -142,44 +185,7 @@ class GitHub implements AppSource {
|
|||||||
];
|
];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<String> additionalDataDefaults = ['true', 'true', ''];
|
Future<List<String>> search(String query) async {
|
||||||
|
return [];
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [
|
|
||||||
GeneratedFormItem(
|
|
||||||
label: 'GitHub Personal Access Token (Increases Rate Limit)',
|
|
||||||
id: 'github-creds',
|
|
||||||
required: false,
|
|
||||||
additionalValidators: [
|
|
||||||
(value) {
|
|
||||||
if (value != null && value.trim().isNotEmpty) {
|
|
||||||
if (value
|
|
||||||
.split(':')
|
|
||||||
.where((element) => element.trim().isNotEmpty)
|
|
||||||
.length !=
|
|
||||||
2) {
|
|
||||||
return 'PAT must be in this format: username:token';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
],
|
|
||||||
hint: 'username:token',
|
|
||||||
belowWidgets: [
|
|
||||||
const SizedBox(
|
|
||||||
height: 8,
|
|
||||||
),
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
launchUrlString(
|
|
||||||
'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token',
|
|
||||||
mode: LaunchMode.externalApplication);
|
|
||||||
},
|
|
||||||
child: const Text(
|
|
||||||
'About GitHub PATs',
|
|
||||||
style: TextStyle(
|
|
||||||
decoration: TextDecoration.underline, fontSize: 12),
|
|
||||||
))
|
|
||||||
])
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import 'package:html/parser.dart';
|
import 'package:html/parser.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/app_sources/github.dart';
|
import 'package:obtainium/app_sources/github.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class GitLab implements AppSource {
|
class GitLab extends AppSource {
|
||||||
@override
|
GitLab() {
|
||||||
late String host = 'gitlab.com';
|
host = 'gitlab.com';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -72,13 +72,4 @@ class GitLab implements AppSource {
|
|||||||
// Same as GitHub
|
// Same as GitHub
|
||||||
return GitHub().getAppNames(standardUrl);
|
return GitHub().getAppNames(standardUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import 'package:html/parser.dart';
|
import 'package:html/parser.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class IzzyOnDroid implements AppSource {
|
class IzzyOnDroid extends AppSource {
|
||||||
@override
|
IzzyOnDroid() {
|
||||||
late String host = 'android.izzysoft.de';
|
host = 'android.izzysoft.de';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -63,13 +63,4 @@ class IzzyOnDroid implements AppSource {
|
|||||||
AppNames getAppNames(String standardUrl) {
|
AppNames getAppNames(String standardUrl) {
|
||||||
return AppNames('IzzyOnDroid', Uri.parse(standardUrl).pathSegments.last);
|
return AppNames('IzzyOnDroid', Uri.parse(standardUrl).pathSegments.last);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import 'package:html/parser.dart';
|
import 'package:html/parser.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class Mullvad implements AppSource {
|
class Mullvad extends AppSource {
|
||||||
@override
|
Mullvad() {
|
||||||
late String host = 'mullvad.net';
|
host = 'mullvad.net';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -50,13 +50,4 @@ class Mullvad implements AppSource {
|
|||||||
AppNames getAppNames(String standardUrl) {
|
AppNames getAppNames(String standardUrl) {
|
||||||
return AppNames('Mullvad-VPN', 'Mullvad-VPN');
|
return AppNames('Mullvad-VPN', 'Mullvad-VPN');
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class Signal implements AppSource {
|
class Signal extends AppSource {
|
||||||
@override
|
Signal() {
|
||||||
late String host = 'signal.org';
|
host = 'signal.org';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -42,13 +42,4 @@ class Signal implements AppSource {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
AppNames getAppNames(String standardUrl) => AppNames('Signal', 'Signal');
|
AppNames getAppNames(String standardUrl) => AppNames('Signal', 'Signal');
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import 'package:html/parser.dart';
|
import 'package:html/parser.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class SourceForge implements AppSource {
|
class SourceForge extends AppSource {
|
||||||
@override
|
SourceForge() {
|
||||||
late String host = 'sourceforge.net';
|
host = 'sourceforge.net';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String standardizeURL(String url) {
|
String standardizeURL(String url) {
|
||||||
@ -66,13 +66,4 @@ class SourceForge implements AppSource {
|
|||||||
return AppNames(runtimeType.toString(),
|
return AppNames(runtimeType.toString(),
|
||||||
standardUrl.substring(standardUrl.lastIndexOf('/') + 1));
|
standardUrl.substring(standardUrl.lastIndexOf('/') + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<String> additionalDataDefaults = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,10 @@ class IDChangedError extends ObtainiumError {
|
|||||||
: super('Downloaded package ID does not match existing App ID');
|
: super('Downloaded package ID does not match existing App ID');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NotImplementedError extends ObtainiumError {
|
||||||
|
NotImplementedError() : super('This class has not implemented this function');
|
||||||
|
}
|
||||||
|
|
||||||
class MultiAppMultiError extends ObtainiumError {
|
class MultiAppMultiError extends ObtainiumError {
|
||||||
Map<String, List<String>> content = {};
|
Map<String, List<String>> content = {};
|
||||||
|
|
||||||
|
@ -128,17 +128,36 @@ List<String> getLinksFromParsedHTML(
|
|||||||
.map((e) => '$prependToLinks${e.attributes['href']!}')
|
.map((e) => '$prependToLinks${e.attributes['href']!}')
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
abstract class AppSource {
|
class AppSource {
|
||||||
late String host;
|
late String host;
|
||||||
String standardizeURL(String url);
|
String standardizeURL(String url) {
|
||||||
|
throw NotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
String standardUrl, List<String> additionalData);
|
String standardUrl, List<String> additionalData) {
|
||||||
AppNames getAppNames(String standardUrl);
|
throw NotImplementedError();
|
||||||
late List<List<GeneratedFormItem>> additionalDataFormItems;
|
}
|
||||||
late List<String> additionalDataDefaults;
|
|
||||||
late List<GeneratedFormItem> moreSourceSettingsFormItems;
|
AppNames getAppNames(String standardUrl) {
|
||||||
String? changeLogPageFromStandardUrl(String standardUrl);
|
throw NotImplementedError();
|
||||||
Future<String> apkUrlPrefetchModifier(String apkUrl);
|
}
|
||||||
|
|
||||||
|
List<List<GeneratedFormItem>> additionalDataFormItems = [];
|
||||||
|
List<String> additionalDataDefaults = [];
|
||||||
|
List<GeneratedFormItem> moreSourceSettingsFormItems = [];
|
||||||
|
String? changeLogPageFromStandardUrl(String standardUrl) {
|
||||||
|
throw NotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> apkUrlPrefetchModifier(String apkUrl) {
|
||||||
|
throw NotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool canSearch = false;
|
||||||
|
Future<List<String>> search(String query) {
|
||||||
|
throw NotImplementedError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class MassAppUrlSource {
|
abstract class MassAppUrlSource {
|
||||||
|
Reference in New Issue
Block a user