2022-08-18 16:33:33 +02:00
|
|
|
import 'dart:io';
|
2022-09-11 03:01:06 +02:00
|
|
|
import 'package:collection/collection.dart';
|
|
|
|
import 'package:dio/dio.dart';
|
2023-03-05 10:12:46 +01:00
|
|
|
import 'package:flutter/foundation.dart';
|
2022-09-12 02:41:53 +02:00
|
|
|
import 'package:injectable/injectable.dart';
|
2023-08-11 03:11:19 +02:00
|
|
|
import 'package:revanced_manager/app/app.locator.dart';
|
2023-10-15 11:51:31 +02:00
|
|
|
import 'package:revanced_manager/services/download_manager.dart';
|
2023-07-01 01:41:03 +02:00
|
|
|
import 'package:revanced_manager/services/manager_api.dart';
|
|
|
|
|
2022-09-12 02:41:53 +02:00
|
|
|
@lazySingleton
|
2022-07-31 21:46:27 +02:00
|
|
|
class GithubAPI {
|
2023-10-15 11:51:31 +02:00
|
|
|
late final Dio _dio;
|
2023-08-11 03:11:19 +02:00
|
|
|
late final ManagerAPI _managerAPI = locator<ManagerAPI>();
|
2023-10-15 11:51:31 +02:00
|
|
|
late final DownloadManager _downloadManager = locator<DownloadManager>();
|
2023-04-18 09:57:26 +02:00
|
|
|
|
2023-01-30 13:35:06 +01:00
|
|
|
Future<void> initialize(String repoUrl) async {
|
2023-10-15 11:51:31 +02:00
|
|
|
_dio = _downloadManager.initDio(repoUrl);
|
2022-09-11 03:01:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> clearAllCache() async {
|
2023-10-15 11:51:31 +02:00
|
|
|
await _downloadManager.clearAllCache();
|
2022-08-18 18:32:58 +02:00
|
|
|
}
|
|
|
|
|
2023-04-18 16:15:29 +02:00
|
|
|
Future<Map<String, dynamic>?> getLatestRelease(
|
|
|
|
String repoName,
|
|
|
|
) async {
|
2023-07-08 18:41:31 +02:00
|
|
|
try {
|
|
|
|
final response = await _dio.get(
|
|
|
|
'/repos/$repoName/releases',
|
|
|
|
);
|
|
|
|
return response.data[0];
|
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-03 22:23:56 +02:00
|
|
|
Future<Map<String, dynamic>?> getPatchesRelease(
|
|
|
|
String repoName,
|
|
|
|
String version,
|
|
|
|
) async {
|
|
|
|
try {
|
|
|
|
final response = await _dio.get(
|
|
|
|
'/repos/$repoName/releases/tags/$version',
|
|
|
|
);
|
|
|
|
return response.data;
|
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<Map<String, dynamic>?> getLatestPatchesRelease(
|
|
|
|
String repoName,
|
|
|
|
) async {
|
|
|
|
try {
|
|
|
|
final response = await _dio.get(
|
|
|
|
'/repos/$repoName/releases/latest',
|
|
|
|
);
|
|
|
|
return response.data;
|
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-08 18:41:31 +02:00
|
|
|
Future<Map<String, dynamic>?> getLatestManagerRelease(
|
2023-07-10 14:36:50 +02:00
|
|
|
String repoName,
|
|
|
|
) async {
|
2022-08-09 02:16:33 +02:00
|
|
|
try {
|
2023-01-30 13:35:06 +01:00
|
|
|
final response = await _dio.get(
|
2022-12-09 13:10:43 +01:00
|
|
|
'/repos/$repoName/releases',
|
2022-08-09 02:16:33 +02:00
|
|
|
);
|
2023-07-01 01:41:03 +02:00
|
|
|
final Map<String, dynamic> releases = response.data[0];
|
|
|
|
int updates = 0;
|
2023-07-10 14:36:50 +02:00
|
|
|
final String currentVersion =
|
2023-10-15 11:51:31 +02:00
|
|
|
await _managerAPI.getCurrentManagerVersion();
|
2024-01-25 18:20:34 +01:00
|
|
|
while (response.data[updates]['tag_name'] != currentVersion) {
|
2023-07-01 01:41:03 +02:00
|
|
|
updates++;
|
|
|
|
}
|
2023-07-10 14:36:50 +02:00
|
|
|
for (int i = 1; i < updates; i++) {
|
2024-03-17 18:14:22 +01:00
|
|
|
if (response.data[i]['prerelease']) {
|
|
|
|
continue;
|
|
|
|
}
|
2023-07-10 14:36:50 +02:00
|
|
|
releases.update(
|
2023-07-10 14:45:50 +02:00
|
|
|
'body',
|
|
|
|
(value) =>
|
|
|
|
value +
|
|
|
|
'\n' +
|
|
|
|
'# ' +
|
|
|
|
response.data[i]['tag_name'] +
|
|
|
|
'\n' +
|
|
|
|
response.data[i]['body'],
|
|
|
|
);
|
2023-07-01 01:41:03 +02:00
|
|
|
}
|
|
|
|
return releases;
|
2023-03-05 10:12:46 +01:00
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-09-12 10:18:03 +02:00
|
|
|
return null;
|
2022-08-09 02:16:33 +02:00
|
|
|
}
|
2022-07-31 21:46:27 +02:00
|
|
|
}
|
2022-08-01 20:06:27 +02:00
|
|
|
|
2023-04-18 16:15:29 +02:00
|
|
|
Future<File?> getLatestReleaseFile(
|
|
|
|
String extension,
|
|
|
|
String repoName,
|
|
|
|
) async {
|
2022-09-11 03:01:06 +02:00
|
|
|
try {
|
2023-05-06 02:09:46 +02:00
|
|
|
final Map<String, dynamic>? release = await getLatestRelease(repoName);
|
2022-09-11 03:01:06 +02:00
|
|
|
if (release != null) {
|
2023-01-30 13:35:06 +01:00
|
|
|
final Map<String, dynamic>? asset =
|
2022-09-11 03:01:06 +02:00
|
|
|
(release['assets'] as List<dynamic>).firstWhereOrNull(
|
|
|
|
(asset) => (asset['name'] as String).endsWith(extension),
|
|
|
|
);
|
|
|
|
if (asset != null) {
|
2023-10-15 11:51:31 +02:00
|
|
|
return await _downloadManager.getSingleFile(
|
2022-09-11 03:01:06 +02:00
|
|
|
asset['browser_download_url'],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2023-03-05 10:12:46 +01:00
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-09-11 03:01:06 +02:00
|
|
|
}
|
|
|
|
return null;
|
2022-08-26 03:01:53 +02:00
|
|
|
}
|
|
|
|
|
2023-08-03 22:23:56 +02:00
|
|
|
Future<File?> getPatchesReleaseFile(
|
|
|
|
String extension,
|
|
|
|
String repoName,
|
|
|
|
String version,
|
2023-08-11 03:11:19 +02:00
|
|
|
String url,
|
2023-08-03 22:23:56 +02:00
|
|
|
) async {
|
2022-09-11 03:01:06 +02:00
|
|
|
try {
|
2023-08-11 03:11:19 +02:00
|
|
|
if (url.isNotEmpty) {
|
2023-10-15 11:51:31 +02:00
|
|
|
return await _downloadManager.getSingleFile(
|
2023-08-11 03:11:19 +02:00
|
|
|
url,
|
|
|
|
);
|
|
|
|
}
|
2023-08-03 22:23:56 +02:00
|
|
|
final Map<String, dynamic>? release =
|
|
|
|
await getPatchesRelease(repoName, version);
|
|
|
|
if (release != null) {
|
|
|
|
final Map<String, dynamic>? asset =
|
|
|
|
(release['assets'] as List<dynamic>).firstWhereOrNull(
|
|
|
|
(asset) => (asset['name'] as String).endsWith(extension),
|
|
|
|
);
|
|
|
|
if (asset != null) {
|
2023-08-11 03:11:19 +02:00
|
|
|
final String downloadUrl = asset['browser_download_url'];
|
|
|
|
if (extension == '.apk') {
|
|
|
|
_managerAPI.setIntegrationsDownloadURL(downloadUrl);
|
|
|
|
} else {
|
2023-09-21 00:35:32 +02:00
|
|
|
_managerAPI.setPatchesDownloadURL(downloadUrl);
|
2023-08-11 03:11:19 +02:00
|
|
|
}
|
2023-10-15 11:51:31 +02:00
|
|
|
return await _downloadManager.getSingleFile(
|
2023-08-11 03:11:19 +02:00
|
|
|
downloadUrl,
|
2023-08-03 22:23:56 +02:00
|
|
|
);
|
|
|
|
}
|
2022-09-11 03:01:06 +02:00
|
|
|
}
|
2023-03-05 10:12:46 +01:00
|
|
|
} on Exception catch (e) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-09-11 03:01:06 +02:00
|
|
|
}
|
2023-08-03 22:23:56 +02:00
|
|
|
return null;
|
2022-08-12 20:07:16 +02:00
|
|
|
}
|
2022-07-31 21:46:27 +02:00
|
|
|
}
|