mirror of
https://github.com/ReVanced/revanced-manager.git
synced 2024-11-10 01:01:56 +01:00
feat: add user agent (#1380)
Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
This commit is contained in:
parent
f334da95ff
commit
e960fcc303
6 changed files with 99 additions and 67 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:revanced_manager/services/download_manager.dart';
|
||||||
import 'package:revanced_manager/services/github_api.dart';
|
import 'package:revanced_manager/services/github_api.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
import 'package:revanced_manager/services/patcher_api.dart';
|
import 'package:revanced_manager/services/patcher_api.dart';
|
||||||
|
@ -41,6 +42,7 @@ import 'package:stacked_services/stacked_services.dart';
|
||||||
LazySingleton(classType: PatcherAPI),
|
LazySingleton(classType: PatcherAPI),
|
||||||
LazySingleton(classType: RevancedAPI),
|
LazySingleton(classType: RevancedAPI),
|
||||||
LazySingleton(classType: GithubAPI),
|
LazySingleton(classType: GithubAPI),
|
||||||
|
LazySingleton(classType: DownloadManager),
|
||||||
LazySingleton(classType: Toast),
|
LazySingleton(classType: Toast),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_i18n/flutter_i18n.dart';
|
import 'package:flutter_i18n/flutter_i18n.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
|
import 'package:revanced_manager/services/download_manager.dart';
|
||||||
import 'package:revanced_manager/services/github_api.dart';
|
import 'package:revanced_manager/services/github_api.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
import 'package:revanced_manager/services/revanced_api.dart';
|
import 'package:revanced_manager/services/revanced_api.dart';
|
||||||
|
@ -19,6 +20,7 @@ Future main() async {
|
||||||
await setupLocator();
|
await setupLocator();
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await locator<ManagerAPI>().initialize();
|
await locator<ManagerAPI>().initialize();
|
||||||
|
await locator<DownloadManager>().initialize();
|
||||||
final String apiUrl = locator<ManagerAPI>().getApiUrl();
|
final String apiUrl = locator<ManagerAPI>().getApiUrl();
|
||||||
await locator<RevancedAPI>().initialize(apiUrl);
|
await locator<RevancedAPI>().initialize(apiUrl);
|
||||||
final String repoUrl = locator<ManagerAPI>().getRepoUrl();
|
final String repoUrl = locator<ManagerAPI>().getRepoUrl();
|
||||||
|
|
75
lib/services/download_manager.dart
Normal file
75
lib/services/download_manager.dart
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter_cache_manager/file.dart';
|
||||||
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||||
|
import 'package:injectable/injectable.dart';
|
||||||
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
|
|
||||||
|
@lazySingleton
|
||||||
|
class DownloadManager {
|
||||||
|
final ManagerAPI _managerAPI = locator<ManagerAPI>();
|
||||||
|
late final String _userAgent;
|
||||||
|
|
||||||
|
final _cacheOptions = CacheOptions(
|
||||||
|
store: MemCacheStore(),
|
||||||
|
maxStale: const Duration(days: 1),
|
||||||
|
priority: CachePriority.high,
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<void> initialize() async {
|
||||||
|
_userAgent = 'ReVanced-Manager/${await _managerAPI.getCurrentManagerVersion()}';
|
||||||
|
}
|
||||||
|
|
||||||
|
Dio initDio(String url) {
|
||||||
|
var dio = Dio();
|
||||||
|
try {
|
||||||
|
dio = Dio(
|
||||||
|
BaseOptions(
|
||||||
|
baseUrl: url,
|
||||||
|
headers: {
|
||||||
|
'User-Agent': _userAgent,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} on Exception catch (e) {
|
||||||
|
if (kDebugMode) {
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions));
|
||||||
|
return dio;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> clearAllCache() async {
|
||||||
|
try {
|
||||||
|
await _cacheOptions.store!.clean();
|
||||||
|
} on Exception catch (e) {
|
||||||
|
if (kDebugMode) {
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<File> getSingleFile(String url) async {
|
||||||
|
return DefaultCacheManager().getSingleFile(
|
||||||
|
url,
|
||||||
|
headers: {
|
||||||
|
'User-Agent': _userAgent,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<FileResponse> getFileStream(String url) {
|
||||||
|
return DefaultCacheManager().getFileStream(
|
||||||
|
url,
|
||||||
|
withProgress: true,
|
||||||
|
headers: {
|
||||||
|
'User-Agent': _userAgent,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,48 +1,24 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
|
||||||
import 'package:injectable/injectable.dart';
|
import 'package:injectable/injectable.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
|
import 'package:revanced_manager/services/download_manager.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
|
|
||||||
@lazySingleton
|
@lazySingleton
|
||||||
class GithubAPI {
|
class GithubAPI {
|
||||||
late Dio _dio = Dio();
|
late final Dio _dio;
|
||||||
late final ManagerAPI _managerAPI = locator<ManagerAPI>();
|
late final ManagerAPI _managerAPI = locator<ManagerAPI>();
|
||||||
|
late final DownloadManager _downloadManager = locator<DownloadManager>();
|
||||||
final _cacheOptions = CacheOptions(
|
|
||||||
store: MemCacheStore(),
|
|
||||||
maxStale: const Duration(days: 1),
|
|
||||||
priority: CachePriority.high,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> initialize(String repoUrl) async {
|
Future<void> initialize(String repoUrl) async {
|
||||||
try {
|
_dio = _downloadManager.initDio(repoUrl);
|
||||||
_dio = Dio(
|
|
||||||
BaseOptions(
|
|
||||||
baseUrl: repoUrl,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
_dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions));
|
|
||||||
} on Exception catch (e) {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> clearAllCache() async {
|
Future<void> clearAllCache() async {
|
||||||
try {
|
await _downloadManager.clearAllCache();
|
||||||
await _cacheOptions.store!.clean();
|
|
||||||
} on Exception catch (e) {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, dynamic>?> getLatestRelease(
|
Future<Map<String, dynamic>?> getLatestRelease(
|
||||||
|
@ -104,7 +80,7 @@ class GithubAPI {
|
||||||
final Map<String, dynamic> releases = response.data[0];
|
final Map<String, dynamic> releases = response.data[0];
|
||||||
int updates = 0;
|
int updates = 0;
|
||||||
final String currentVersion =
|
final String currentVersion =
|
||||||
await ManagerAPI().getCurrentManagerVersion();
|
await _managerAPI.getCurrentManagerVersion();
|
||||||
while (response.data[updates]['tag_name'] != 'v$currentVersion') {
|
while (response.data[updates]['tag_name'] != 'v$currentVersion') {
|
||||||
updates++;
|
updates++;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +117,7 @@ class GithubAPI {
|
||||||
(asset) => (asset['name'] as String).endsWith(extension),
|
(asset) => (asset['name'] as String).endsWith(extension),
|
||||||
);
|
);
|
||||||
if (asset != null) {
|
if (asset != null) {
|
||||||
return await DefaultCacheManager().getSingleFile(
|
return await _downloadManager.getSingleFile(
|
||||||
asset['browser_download_url'],
|
asset['browser_download_url'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -162,7 +138,7 @@ class GithubAPI {
|
||||||
) async {
|
) async {
|
||||||
try {
|
try {
|
||||||
if (url.isNotEmpty) {
|
if (url.isNotEmpty) {
|
||||||
return await DefaultCacheManager().getSingleFile(
|
return await _downloadManager.getSingleFile(
|
||||||
url,
|
url,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +156,7 @@ class GithubAPI {
|
||||||
} else {
|
} else {
|
||||||
_managerAPI.setPatchesDownloadURL(downloadUrl);
|
_managerAPI.setPatchesDownloadURL(downloadUrl);
|
||||||
}
|
}
|
||||||
return await DefaultCacheManager().getSingleFile(
|
return await _downloadManager.getSingleFile(
|
||||||
downloadUrl,
|
downloadUrl,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,49 +3,27 @@ import 'dart:io';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||||
import 'package:injectable/injectable.dart';
|
import 'package:injectable/injectable.dart';
|
||||||
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
|
import 'package:revanced_manager/services/download_manager.dart';
|
||||||
import 'package:synchronized/synchronized.dart';
|
import 'package:synchronized/synchronized.dart';
|
||||||
import 'package:timeago/timeago.dart';
|
import 'package:timeago/timeago.dart';
|
||||||
|
|
||||||
@lazySingleton
|
@lazySingleton
|
||||||
class RevancedAPI {
|
class RevancedAPI {
|
||||||
late Dio _dio = Dio();
|
late final Dio _dio;
|
||||||
|
late final DownloadManager _downloadManager = locator<DownloadManager>();
|
||||||
|
|
||||||
final Lock getToolsLock = Lock();
|
final Lock getToolsLock = Lock();
|
||||||
|
|
||||||
final _cacheOptions = CacheOptions(
|
Future<void> initialize(String repoUrl) async {
|
||||||
store: MemCacheStore(),
|
_dio = _downloadManager.initDio(repoUrl);
|
||||||
maxStale: const Duration(days: 1),
|
|
||||||
priority: CachePriority.high,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> initialize(String apiUrl) async {
|
|
||||||
try {
|
|
||||||
_dio = Dio(
|
|
||||||
BaseOptions(
|
|
||||||
baseUrl: apiUrl,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
_dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions));
|
|
||||||
} on Exception catch (e) {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> clearAllCache() async {
|
Future<void> clearAllCache() async {
|
||||||
try {
|
await _downloadManager.clearAllCache();
|
||||||
await _cacheOptions.store!.clean();
|
|
||||||
} on Exception catch (e) {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, List<dynamic>>> getContributors() async {
|
Future<Map<String, List<dynamic>>> getContributors() async {
|
||||||
|
@ -120,7 +98,7 @@ class RevancedAPI {
|
||||||
);
|
);
|
||||||
if (release != null) {
|
if (release != null) {
|
||||||
final String url = release['browser_download_url'];
|
final String url = release['browser_download_url'];
|
||||||
return await DefaultCacheManager().getSingleFile(url);
|
return await _downloadManager.getSingleFile(url);
|
||||||
}
|
}
|
||||||
} on Exception catch (e) {
|
} on Exception catch (e) {
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
|
@ -152,9 +130,8 @@ class RevancedAPI {
|
||||||
'revanced/revanced-manager',
|
'revanced/revanced-manager',
|
||||||
);
|
);
|
||||||
File? outputFile;
|
File? outputFile;
|
||||||
await for (final result in DefaultCacheManager().getFileStream(
|
await for (final result in _downloadManager.getFileStream(
|
||||||
release!['browser_download_url'] as String,
|
release!['browser_download_url'] as String,
|
||||||
withProgress: true,
|
|
||||||
)) {
|
)) {
|
||||||
if (result is DownloadProgress) {
|
if (result is DownloadProgress) {
|
||||||
final totalSize = result.totalSize ?? 10000000;
|
final totalSize = result.totalSize ?? 10000000;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_cache_manager/file.dart';
|
import 'package:flutter_cache_manager/file.dart';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
|
||||||
import 'package:flutter_i18n/flutter_i18n.dart';
|
import 'package:flutter_i18n/flutter_i18n.dart';
|
||||||
|
import 'package:revanced_manager/services/download_manager.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/shared/custom_card.dart';
|
import 'package:revanced_manager/ui/widgets/shared/custom_card.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ class _ContributorsCardState extends State<ContributorsCard> {
|
||||||
mode: LaunchMode.externalApplication,
|
mode: LaunchMode.externalApplication,
|
||||||
),
|
),
|
||||||
child: FutureBuilder<File?>(
|
child: FutureBuilder<File?>(
|
||||||
future: DefaultCacheManager().getSingleFile(
|
future: DownloadManager().getSingleFile(
|
||||||
widget.contributors[index]['avatar_url'],
|
widget.contributors[index]['avatar_url'],
|
||||||
),
|
),
|
||||||
builder: (context, snapshot) => snapshot.hasData
|
builder: (context, snapshot) => snapshot.hasData
|
||||||
|
|
Loading…
Reference in a new issue