mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-03-11 17:25:32 +00:00
Refactor
This commit is contained in:
parent
d5cfd1f25f
commit
64b1f91dce
17 changed files with 146 additions and 629 deletions
|
|
@ -18,7 +18,7 @@ import 'package:mangayomi/eval/model/m_manga.dart';
|
|||
import 'package:mangayomi/eval/model/m_provider.dart';
|
||||
import 'package:mangayomi/models/video.dart';
|
||||
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
|
||||
import 'package:mangayomi/services/eval_js.dart';
|
||||
import 'package:mangayomi/services/boa_js.dart';
|
||||
|
||||
class $MProvider extends MProvider with $Bridge<MProvider> {
|
||||
static $MProvider $construct(
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ import 'package:mangayomi/services/anime_extractors/streamwish_extractor.dart';
|
|||
import 'package:mangayomi/services/anime_extractors/vidbom_extractor.dart';
|
||||
import 'package:mangayomi/services/anime_extractors/voe_extractor.dart';
|
||||
import 'package:mangayomi/services/anime_extractors/your_upload_extractor.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/cloudflare_bypass.dart';
|
||||
import 'package:mangayomi/services/cloudflare/cloudflare.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart';
|
||||
import 'package:mangayomi/utils/cryptoaes/deobfuscator.dart';
|
||||
|
|
@ -434,7 +434,7 @@ class MBridge {
|
|||
if (res.statusCode == 403 && (source?.hasCloudflare ?? false)) {
|
||||
log("Http request: ${res.statusCode}, Cloudflare");
|
||||
return await cloudflareBypass(
|
||||
url: url, sourceId: source!.id.toString(), method: 0);
|
||||
url: url, sourceId: source!.id.toString());
|
||||
} else if (res.statusCode == 200) {
|
||||
log("Http request: ${res.statusCode}");
|
||||
return await res.stream.bytesToString();
|
||||
|
|
|
|||
|
|
@ -6,12 +6,8 @@ import 'package:desktop_webview_window/desktop_webview_window.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/cookie.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/providers/cookie_providers.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/services/cloudflare/cookie.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
|
@ -57,7 +53,6 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
);
|
||||
webview!
|
||||
..setBrightness(Brightness.dark)
|
||||
..setApplicationNameForUserAgent(defaultUserAgent)
|
||||
..launch(widget.url)
|
||||
..onClose.whenComplete(() {
|
||||
Navigator.pop(context);
|
||||
|
|
@ -70,7 +65,6 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
late String _title = widget.title;
|
||||
bool _canGoback = false;
|
||||
bool _canGoForward = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final l10n = l10nLocalizations(context);
|
||||
|
|
@ -220,9 +214,10 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
},
|
||||
onUpdateVisitedHistory:
|
||||
(controller, url, isReload) async {
|
||||
await ref.watch(
|
||||
setCookieProvider(widget.sourceId, url.toString())
|
||||
.future);
|
||||
final ua = await controller.evaluateJavascript(
|
||||
source: "navigator.userAgent") ??
|
||||
"";
|
||||
await addCookie(widget.sourceId, url.toString(), ua);
|
||||
final canGoback = await controller.canGoBack();
|
||||
final canGoForward = await controller.canGoForward();
|
||||
final title = await controller.getTitle();
|
||||
|
|
@ -233,10 +228,6 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
_canGoForward = canGoForward;
|
||||
});
|
||||
},
|
||||
initialOptions: InAppWebViewGroupOptions(
|
||||
crossPlatform: InAppWebViewOptions(
|
||||
userAgent: isar.settings.getSync(227)!.userAgent!),
|
||||
),
|
||||
initialUrlRequest: URLRequest(url: Uri.parse(widget.url)),
|
||||
),
|
||||
),
|
||||
|
|
@ -259,9 +250,12 @@ Future<String?> decodeHtml(Webview webview, {String? sourceId}) async {
|
|||
try {
|
||||
final html = await webview
|
||||
.evaluateJavaScript("window.document.documentElement.outerHTML;");
|
||||
final cookie = await webview.evaluateJavaScript("window.document.cookie;");
|
||||
if (cookie != null && sourceId != null) {
|
||||
setCookieBA(cookie, sourceId);
|
||||
final ua = await webview.evaluateJavaScript("navigator.userAgent") ?? "";
|
||||
final newCookie =
|
||||
await webview.evaluateJavaScript("window.document.cookie;");
|
||||
if (newCookie != null && sourceId != null) {
|
||||
CookieState(idSource: sourceId)
|
||||
.set(jsonDecode(newCookie), ua.isNotEmpty ? jsonDecode(ua) : "");
|
||||
}
|
||||
|
||||
final res = jsonDecode(html!) as String;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:mangayomi/messages/rust_js.pb.dart' as rust_js;
|
||||
import 'package:mangayomi/messages/boa_js.pb.dart' as rust_js;
|
||||
import 'package:rinf/rinf.dart';
|
||||
|
||||
Future<String> evalJs(String script) async {
|
||||
73
lib/services/cloudflare/cloudflare.dart
Normal file
73
lib/services/cloudflare/cloudflare.dart
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
import 'dart:io';
|
||||
import 'package:desktop_webview_window/desktop_webview_window.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:mangayomi/modules/webview/webview.dart';
|
||||
import 'package:mangayomi/services/cloudflare/cookie.dart';
|
||||
|
||||
Future<String> cloudflareBypass(
|
||||
{required String url, required String sourceId}) async {
|
||||
String ua = "";
|
||||
bool isOk = false;
|
||||
String? html;
|
||||
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
|
||||
final webview = await WebviewWindow.create(
|
||||
configuration: CreateConfiguration(
|
||||
windowHeight: 500,
|
||||
windowWidth: 500,
|
||||
userDataFolderWindows: await getWebViewPath(),
|
||||
),
|
||||
);
|
||||
webview
|
||||
..setBrightness(Brightness.dark)
|
||||
..launch(url);
|
||||
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
html = await decodeHtml(webview, sourceId: sourceId);
|
||||
if (html == null ||
|
||||
html!.contains("Just a moment") ||
|
||||
html!.contains("challenges.cloudflare.com")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
isOk = true;
|
||||
webview.close();
|
||||
} else {
|
||||
HeadlessInAppWebView? headlessWebView;
|
||||
headlessWebView = HeadlessInAppWebView(
|
||||
onLoadStop: (controller, u) async {
|
||||
html = await controller.getHtml();
|
||||
await Future.doWhile(() async {
|
||||
if (html == null ||
|
||||
html!.contains("Just a moment") ||
|
||||
html!.contains("challenges.cloudflare.com")) {
|
||||
html = await controller.getHtml();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
html = await controller.getHtml();
|
||||
ua = await controller.evaluateJavascript(
|
||||
source: "navigator.userAgent") ??
|
||||
"";
|
||||
isOk = true;
|
||||
headlessWebView!.dispose();
|
||||
},
|
||||
initialUrlRequest: URLRequest(url: Uri.parse(url)),
|
||||
);
|
||||
|
||||
headlessWebView.run();
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (isOk == true) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
await addCookie(sourceId, url, ua);
|
||||
}
|
||||
return html!;
|
||||
}
|
||||
49
lib/services/cloudflare/cookie.dart
Normal file
49
lib/services/cloudflare/cookie.dart
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart'
|
||||
as flutter_inappwebview;
|
||||
|
||||
class CookieState {
|
||||
String? idSource;
|
||||
CookieState({required String idSource});
|
||||
|
||||
String get() {
|
||||
final cookiesList = isar.settings.getSync(227)!.cookiesList ?? [];
|
||||
return cookiesList
|
||||
.firstWhere(
|
||||
(element) => element.idSource == idSource,
|
||||
orElse: () => Cookie(cookie: ""),
|
||||
)
|
||||
.cookie!;
|
||||
}
|
||||
|
||||
void set(String newCookie, String ua) {
|
||||
final settings = isar.settings.getSync(227);
|
||||
List<Cookie>? cookieList = [];
|
||||
for (var cookie in settings!.cookiesList ?? []) {
|
||||
if (cookie.idSource != idSource) {
|
||||
cookieList.add(cookie);
|
||||
}
|
||||
}
|
||||
|
||||
cookieList.add(Cookie()
|
||||
..idSource = idSource
|
||||
..cookie = newCookie);
|
||||
isar.writeTxnSync(() => isar.settings.putSync(settings
|
||||
..cookiesList = cookieList
|
||||
..userAgent = ua));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> addCookie(String sourceId, String url, String ua) async {
|
||||
flutter_inappwebview.CookieManager cookieManager =
|
||||
flutter_inappwebview.CookieManager.instance();
|
||||
|
||||
final cookie = (await cookieManager.getCookie(
|
||||
url: Uri.parse(url), name: "cf_clearance"));
|
||||
if (cookie != null) {
|
||||
final newCookie = "${cookie.name}=${cookie.value}";
|
||||
|
||||
CookieState(idSource: sourceId).set(newCookie, ua);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:desktop_webview_window/desktop_webview_window.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/modules/webview/webview.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/cookie.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
|
||||
Future<String> cloudflareBypass(
|
||||
{required String url,
|
||||
required String sourceId,
|
||||
required int method}) async {
|
||||
final ua = isar.settings.getSync(227)!.userAgent!;
|
||||
bool isOk = false;
|
||||
String? html;
|
||||
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
|
||||
final webview = await WebviewWindow.create(
|
||||
configuration: CreateConfiguration(
|
||||
windowHeight: 500,
|
||||
windowWidth: 500,
|
||||
userDataFolderWindows: await getWebViewPath(),
|
||||
),
|
||||
);
|
||||
webview
|
||||
..setBrightness(Brightness.dark)
|
||||
..setApplicationNameForUserAgent(ua)
|
||||
..launch(url);
|
||||
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
html = await decodeHtml(webview, sourceId: sourceId);
|
||||
if (html == null ||
|
||||
html!.contains("Just a moment") ||
|
||||
html!.contains("challenges.cloudflare.com")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
isOk = true;
|
||||
webview.close();
|
||||
} else {
|
||||
HeadlessInAppWebView? headlessWebView;
|
||||
headlessWebView = HeadlessInAppWebView(
|
||||
onLoadStop: (controller, u) async {
|
||||
html = await controller.evaluateJavascript(
|
||||
source:
|
||||
"window.document.getElementsByTagName('html')[0].outerHTML;");
|
||||
await Future.doWhile(() async {
|
||||
if (html == null ||
|
||||
html!.contains("Just a moment") ||
|
||||
html!.contains("challenges.cloudflare.com")) {
|
||||
html = await controller.evaluateJavascript(
|
||||
source:
|
||||
"window.document.getElementsByTagName('html')[0].outerHTML;");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
html = await controller.evaluateJavascript(
|
||||
source:
|
||||
"window.document.getElementsByTagName('html')[0].outerHTML;");
|
||||
isOk = true;
|
||||
headlessWebView!.dispose();
|
||||
},
|
||||
initialOptions: InAppWebViewGroupOptions(
|
||||
crossPlatform: InAppWebViewOptions(
|
||||
userAgent: defaultUserAgent,
|
||||
),
|
||||
),
|
||||
initialUrlRequest: URLRequest(
|
||||
headers: headers(sourceId: sourceId),
|
||||
method: method == 0
|
||||
? 'GET'
|
||||
: method == 1
|
||||
? 'POST'
|
||||
: method == 2
|
||||
? 'PUT'
|
||||
: 'DELETE',
|
||||
url: Uri.parse(url),
|
||||
),
|
||||
);
|
||||
|
||||
headlessWebView.run();
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (isOk == true) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
await setCookieB(sourceId, url);
|
||||
}
|
||||
return html!;
|
||||
}
|
||||
|
||||
Map<String, String> headers({required String sourceId}) {
|
||||
final source = isar.sources.getSync(int.parse(sourceId))!;
|
||||
if (source.headers!.isEmpty) {
|
||||
return {};
|
||||
}
|
||||
|
||||
Map<String, String> newHeaders = {};
|
||||
final headers = jsonDecode(source.headers!) as Map;
|
||||
newHeaders =
|
||||
headers.map((key, value) => MapEntry(key.toString(), value.toString()));
|
||||
|
||||
return newHeaders;
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/providers/cookie_providers.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'cookie.g.dart';
|
||||
|
||||
@riverpod
|
||||
Future setCookie(SetCookieRef ref, String sourceId, String url) async {
|
||||
CookieManager cookie = CookieManager.instance();
|
||||
|
||||
final cookies = await cookie.getCookies(url: Uri.parse(url.toString()));
|
||||
final newCookie = cookies.map((e) => "${e.name}=${e.value}").join("; ");
|
||||
setCookieBA(newCookie, sourceId);
|
||||
}
|
||||
|
||||
Future setCookieB(String sourceId, String url) async {
|
||||
CookieManager cookie = CookieManager.instance();
|
||||
|
||||
final cookies = await cookie.getCookies(url: Uri.parse(url.toString()));
|
||||
final newCookie = cookies.map((e) => "${e.name}=${e.value}").join("; ");
|
||||
setCookieBA(newCookie, sourceId);
|
||||
}
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'cookie.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$setCookieHash() => r'd10ac9b2e839e2a5c369900c65c557723c8f2d37';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
/// See also [setCookie].
|
||||
@ProviderFor(setCookie)
|
||||
const setCookieProvider = SetCookieFamily();
|
||||
|
||||
/// See also [setCookie].
|
||||
class SetCookieFamily extends Family<AsyncValue> {
|
||||
/// See also [setCookie].
|
||||
const SetCookieFamily();
|
||||
|
||||
/// See also [setCookie].
|
||||
SetCookieProvider call(
|
||||
String sourceId,
|
||||
String url,
|
||||
) {
|
||||
return SetCookieProvider(
|
||||
sourceId,
|
||||
url,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
SetCookieProvider getProviderOverride(
|
||||
covariant SetCookieProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.sourceId,
|
||||
provider.url,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'setCookieProvider';
|
||||
}
|
||||
|
||||
/// See also [setCookie].
|
||||
class SetCookieProvider extends AutoDisposeFutureProvider<Object?> {
|
||||
/// See also [setCookie].
|
||||
SetCookieProvider(
|
||||
String sourceId,
|
||||
String url,
|
||||
) : this._internal(
|
||||
(ref) => setCookie(
|
||||
ref as SetCookieRef,
|
||||
sourceId,
|
||||
url,
|
||||
),
|
||||
from: setCookieProvider,
|
||||
name: r'setCookieProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$setCookieHash,
|
||||
dependencies: SetCookieFamily._dependencies,
|
||||
allTransitiveDependencies: SetCookieFamily._allTransitiveDependencies,
|
||||
sourceId: sourceId,
|
||||
url: url,
|
||||
);
|
||||
|
||||
SetCookieProvider._internal(
|
||||
super._createNotifier, {
|
||||
required super.name,
|
||||
required super.dependencies,
|
||||
required super.allTransitiveDependencies,
|
||||
required super.debugGetCreateSourceHash,
|
||||
required super.from,
|
||||
required this.sourceId,
|
||||
required this.url,
|
||||
}) : super.internal();
|
||||
|
||||
final String sourceId;
|
||||
final String url;
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
FutureOr<Object?> Function(SetCookieRef provider) create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: SetCookieProvider._internal(
|
||||
(ref) => create(ref as SetCookieRef),
|
||||
from: from,
|
||||
name: null,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
debugGetCreateSourceHash: null,
|
||||
sourceId: sourceId,
|
||||
url: url,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
AutoDisposeFutureProviderElement<Object?> createElement() {
|
||||
return _SetCookieProviderElement(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is SetCookieProvider &&
|
||||
other.sourceId == sourceId &&
|
||||
other.url == url;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, sourceId.hashCode);
|
||||
hash = _SystemHash.combine(hash, url.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
mixin SetCookieRef on AutoDisposeFutureProviderRef<Object?> {
|
||||
/// The parameter `sourceId` of this provider.
|
||||
String get sourceId;
|
||||
|
||||
/// The parameter `url` of this provider.
|
||||
String get url;
|
||||
}
|
||||
|
||||
class _SetCookieProviderElement
|
||||
extends AutoDisposeFutureProviderElement<Object?> with SetCookieRef {
|
||||
_SetCookieProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
String get sourceId => (origin as SetCookieProvider).sourceId;
|
||||
@override
|
||||
String get url => (origin as SetCookieProvider).url;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'cookie_providers.g.dart';
|
||||
|
||||
@riverpod
|
||||
class CookieState extends _$CookieState {
|
||||
@override
|
||||
String build(String idSource) {
|
||||
final cookiesList = isar.settings.getSync(227)!.cookiesList ?? [];
|
||||
final cookieList =
|
||||
cookiesList.where((element) => element.idSource == idSource).toList();
|
||||
String cookie = "";
|
||||
if (cookieList.isNotEmpty) {
|
||||
cookie = cookieList.first.cookie!.toString();
|
||||
}
|
||||
|
||||
return cookie;
|
||||
}
|
||||
|
||||
void setCookie(String newCookie) {
|
||||
final settings = isar.settings.getSync(227);
|
||||
List<Cookie>? cookieList = [];
|
||||
for (var cookie in settings!.cookiesList ?? []) {
|
||||
if (cookie.idSource != idSource) {
|
||||
cookieList.add(cookie);
|
||||
}
|
||||
}
|
||||
|
||||
cookieList.add(Cookie()
|
||||
..idSource = idSource
|
||||
..cookie = newCookie);
|
||||
isar.writeTxnSync(
|
||||
() => isar.settings.putSync(settings..cookiesList = cookieList));
|
||||
}
|
||||
}
|
||||
|
||||
void setCookieBA(String newCookie, String idSource) {
|
||||
final settings = isar.settings.getSync(227);
|
||||
List<Cookie>? cookieList = [];
|
||||
for (var cookie in settings!.cookiesList ?? []) {
|
||||
if (cookie.idSource != idSource) {
|
||||
cookieList.add(cookie);
|
||||
}
|
||||
}
|
||||
|
||||
cookieList.add(Cookie()
|
||||
..idSource = idSource
|
||||
..cookie = newCookie);
|
||||
isar.writeTxnSync(
|
||||
() => isar.settings.putSync(settings..cookiesList = cookieList));
|
||||
}
|
||||
|
||||
String getCookie(String idSource) {
|
||||
final cookiesList = isar.settings.getSync(227)!.cookiesList ?? [];
|
||||
final cookieList =
|
||||
cookiesList.where((element) => element.idSource == idSource).toList();
|
||||
String cookie = "";
|
||||
if (cookieList.isNotEmpty) {
|
||||
cookie = cookieList.first.cookie!.toString();
|
||||
}
|
||||
return cookie;
|
||||
}
|
||||
|
|
@ -1,172 +0,0 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'cookie_providers.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$cookieStateHash() => r'42286f51989b6f65eed9787ca2390a96854395a8';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _$CookieState extends BuildlessAutoDisposeNotifier<String> {
|
||||
late final String idSource;
|
||||
|
||||
String build(
|
||||
String idSource,
|
||||
);
|
||||
}
|
||||
|
||||
/// See also [CookieState].
|
||||
@ProviderFor(CookieState)
|
||||
const cookieStateProvider = CookieStateFamily();
|
||||
|
||||
/// See also [CookieState].
|
||||
class CookieStateFamily extends Family<String> {
|
||||
/// See also [CookieState].
|
||||
const CookieStateFamily();
|
||||
|
||||
/// See also [CookieState].
|
||||
CookieStateProvider call(
|
||||
String idSource,
|
||||
) {
|
||||
return CookieStateProvider(
|
||||
idSource,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
CookieStateProvider getProviderOverride(
|
||||
covariant CookieStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.idSource,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'cookieStateProvider';
|
||||
}
|
||||
|
||||
/// See also [CookieState].
|
||||
class CookieStateProvider
|
||||
extends AutoDisposeNotifierProviderImpl<CookieState, String> {
|
||||
/// See also [CookieState].
|
||||
CookieStateProvider(
|
||||
String idSource,
|
||||
) : this._internal(
|
||||
() => CookieState()..idSource = idSource,
|
||||
from: cookieStateProvider,
|
||||
name: r'cookieStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$cookieStateHash,
|
||||
dependencies: CookieStateFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
CookieStateFamily._allTransitiveDependencies,
|
||||
idSource: idSource,
|
||||
);
|
||||
|
||||
CookieStateProvider._internal(
|
||||
super._createNotifier, {
|
||||
required super.name,
|
||||
required super.dependencies,
|
||||
required super.allTransitiveDependencies,
|
||||
required super.debugGetCreateSourceHash,
|
||||
required super.from,
|
||||
required this.idSource,
|
||||
}) : super.internal();
|
||||
|
||||
final String idSource;
|
||||
|
||||
@override
|
||||
String runNotifierBuild(
|
||||
covariant CookieState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
idSource,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Override overrideWith(CookieState Function() create) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: CookieStateProvider._internal(
|
||||
() => create()..idSource = idSource,
|
||||
from: from,
|
||||
name: null,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
debugGetCreateSourceHash: null,
|
||||
idSource: idSource,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
AutoDisposeNotifierProviderElement<CookieState, String> createElement() {
|
||||
return _CookieStateProviderElement(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is CookieStateProvider && other.idSource == idSource;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, idSource.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
mixin CookieStateRef on AutoDisposeNotifierProviderRef<String> {
|
||||
/// The parameter `idSource` of this provider.
|
||||
String get idSource;
|
||||
}
|
||||
|
||||
class _CookieStateProviderElement
|
||||
extends AutoDisposeNotifierProviderElement<CookieState, String>
|
||||
with CookieStateRef {
|
||||
_CookieStateProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
String get idSource => (origin as CookieStateProvider).idSource;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
// import 'package:html/dom.dart';
|
||||
// import 'package:mangayomi/services/http_service/cloudflare/cloudflare_bypass.dart';
|
||||
// import 'package:http/http.dart' as http;
|
||||
// import 'package:mangayomi/sources/utils/utils.dart';
|
||||
// import 'package:mangayomi/utils/headers.dart';
|
||||
// import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
// part 'http_service.g.dart';
|
||||
|
||||
// @riverpod
|
||||
// Future<dynamic> httpGet(HttpGetRef ref,
|
||||
// {required String url,
|
||||
// required String source,
|
||||
// required String lang,
|
||||
// required bool resDom,
|
||||
// Map<String, String>? headers,
|
||||
// bool useUserAgent = false}) async {
|
||||
// bool hasCloudflaree = hasCloudflare(source);
|
||||
// if (resDom) {
|
||||
// Document? dom;
|
||||
// if (hasCloudflaree) {
|
||||
// dom = await ref.read(cloudflareBypassDomProvider(
|
||||
// url: url, source: source, useUserAgent: useUserAgent)
|
||||
// .future);
|
||||
// } else {
|
||||
// dom = await httpResToDom(
|
||||
// url: url,
|
||||
// headers: headers ??
|
||||
// ref.watch(headersProvider(source: source, lang: lang)));
|
||||
// }
|
||||
// return dom;
|
||||
// } else {
|
||||
// String? resHtml;
|
||||
// if (hasCloudflaree) {
|
||||
// resHtml = await ref.read(cloudflareBypassHtmlProvider(
|
||||
// url: url, source: source, useUserAgent: useUserAgent)
|
||||
// .future);
|
||||
// } else {
|
||||
// try {
|
||||
// final response = await http.get(Uri.parse(url),
|
||||
// headers: headers ??
|
||||
// ref.watch(headersProvider(source: source, lang: lang)));
|
||||
// resHtml = response.body;
|
||||
// } catch (e) {
|
||||
// rethrow;
|
||||
// }
|
||||
// }
|
||||
// return resHtml;
|
||||
// }
|
||||
// }
|
||||
|
||||
// Future<Document> httpResToDom(
|
||||
// {required String url, required Map<String, String>? headers}) async {
|
||||
// final response = await http.get(Uri.parse(url), headers: headers);
|
||||
// return Document.html(response.body);
|
||||
// }
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/providers/cookie_providers.dart';
|
||||
import 'package:mangayomi/services/cloudflare/cookie.dart';
|
||||
import 'package:mangayomi/sources/utils/utils.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'headers.g.dart';
|
||||
|
|
@ -25,7 +24,7 @@ Map<String, String> headers(HeadersRef ref,
|
|||
|
||||
if (sourceM.hasCloudflare!) {
|
||||
final userAgent = isar.settings.getSync(227)!.userAgent!;
|
||||
final cookie = ref.watch(cookieStateProvider(sourceM.id.toString()));
|
||||
final cookie = CookieState(idSource: sourceM.id.toString()).get();
|
||||
|
||||
newHeaders.addAll({'User-Agent': userAgent, "Cookie": cookie});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
syntax = "proto3";
|
||||
package rust_js;
|
||||
package boa_js;
|
||||
|
||||
message ReadRequest {
|
||||
string code_script = 1;
|
||||
|
|
@ -2,8 +2,8 @@ use crate::bridge::{RustOperation, RustRequest, RustResponse};
|
|||
use boa_engine::{Context, Source};
|
||||
use prost::Message;
|
||||
|
||||
pub async fn eval_js_sync(rust_request: RustRequest) -> RustResponse {
|
||||
use crate::messages::rust_js::{ReadRequest, ReadResponse};
|
||||
pub async fn eval_js(rust_request: RustRequest) -> RustResponse {
|
||||
use crate::messages::boa_js::{ReadRequest, ReadResponse};
|
||||
|
||||
match rust_request.operation {
|
||||
RustOperation::Create => RustResponse::default(),
|
||||
|
|
@ -6,7 +6,7 @@ mod bridge;
|
|||
mod imagecrop;
|
||||
mod messages;
|
||||
mod with_request;
|
||||
mod js;
|
||||
mod boa_js;
|
||||
|
||||
/// This `hub` crate is the entry point for the Rust logic.
|
||||
/// Always use non-blocking async functions such as `tokio::fs::File::open`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
use crate::bridge::{RustRequestUnique, RustResponse, RustResponseUnique};
|
||||
use crate::imagecrop;
|
||||
use crate::js;
|
||||
use crate::boa_js;
|
||||
use crate::messages;
|
||||
|
||||
pub async fn handle_request(request_unique: RustRequestUnique) -> RustResponseUnique {
|
||||
|
|
@ -18,8 +18,8 @@ pub async fn handle_request(request_unique: RustRequestUnique) -> RustResponseUn
|
|||
messages::crop_borders::ID => {
|
||||
imagecrop::start_croping(rust_request).await // ADD THIS BLOCK
|
||||
}
|
||||
messages::rust_js::ID => {
|
||||
js::eval_js_sync(rust_request).await // ADD THIS BLOCK
|
||||
messages::boa_js::ID => {
|
||||
boa_js::eval_js(rust_request).await // ADD THIS BLOCK
|
||||
}
|
||||
_ => RustResponse::default(),
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue