2023-07-06 17:18:41 +03:30
|
|
|
import 'package:hiddify/utils/validators.dart';
|
|
|
|
|
|
|
|
|
|
typedef ProfileLink = ({String url, String name});
|
|
|
|
|
|
|
|
|
|
// TODO: test and improve
|
|
|
|
|
abstract class LinkParser {
|
2023-08-27 10:49:34 +03:30
|
|
|
static const protocols = ['clash', 'clashmeta', 'sing-box', 'hiddify'];
|
|
|
|
|
|
|
|
|
|
static ProfileLink? parse(String link) {
|
|
|
|
|
return simple(link) ?? deep(link);
|
|
|
|
|
}
|
2023-07-06 17:18:41 +03:30
|
|
|
|
|
|
|
|
static ProfileLink? simple(String link) {
|
|
|
|
|
if (!isUrl(link)) return null;
|
2023-08-26 16:26:32 +03:30
|
|
|
final uri = Uri.parse(link.trim());
|
2023-07-06 17:18:41 +03:30
|
|
|
final params = uri.queryParameters;
|
|
|
|
|
return (
|
2023-09-15 16:47:18 +02:00
|
|
|
url: uri.toString(),
|
|
|
|
|
// .replace(queryParameters: {})
|
|
|
|
|
// .toString()
|
|
|
|
|
// .removeSuffix('?')
|
|
|
|
|
// .split('&')
|
|
|
|
|
// .first,
|
2023-07-06 17:18:41 +03:30
|
|
|
name: params['name'] ?? '',
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static ProfileLink? deep(String link) {
|
2023-08-26 23:35:17 +03:30
|
|
|
final uri = Uri.tryParse(link.trim());
|
|
|
|
|
if (uri == null || !uri.hasScheme || !uri.hasAuthority) return null;
|
|
|
|
|
final queryParams = uri.queryParameters;
|
|
|
|
|
switch (uri.scheme) {
|
|
|
|
|
case 'clash' || 'clashmeta':
|
|
|
|
|
if (uri.authority != 'install-config' ||
|
|
|
|
|
!queryParams.containsKey('url')) return null;
|
|
|
|
|
return (url: queryParams['url']!, name: queryParams['name'] ?? '');
|
|
|
|
|
case 'sing-box':
|
|
|
|
|
if (uri.authority != 'import-remote-profile' ||
|
|
|
|
|
!queryParams.containsKey('url')) return null;
|
|
|
|
|
return (url: queryParams['url']!, name: queryParams['name'] ?? '');
|
2023-08-27 10:49:34 +03:30
|
|
|
case 'hiddify':
|
|
|
|
|
if ((uri.authority != 'install-config' &&
|
|
|
|
|
uri.authority != 'install-sub') ||
|
|
|
|
|
!queryParams.containsKey('url')) return null;
|
|
|
|
|
return (url: queryParams['url']!, name: queryParams['name'] ?? '');
|
2023-08-26 23:35:17 +03:30
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2023-07-06 17:18:41 +03:30
|
|
|
}
|
|
|
|
|
}
|