Revert "code refactor , deobfuscator method , extension preferences"

This reverts commit 3ff647bb01.
This commit is contained in:
kodjomoustapha 2023-09-11 18:04:49 +01:00
parent 9e54108872
commit 530763dafe
32 changed files with 141 additions and 457 deletions

View file

@ -41,11 +41,6 @@ class $VideoModel implements VideoModel, $Instance {
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list,
[BridgeTypeRef.type(RuntimeTypes.dynamicType)])), [BridgeTypeRef.type(RuntimeTypes.dynamicType)])),
false), false),
BridgeParameter(
'audios',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list,
[BridgeTypeRef.type(RuntimeTypes.dynamicType)])),
false),
])) ]))
}, },
// Specify class fields // Specify class fields

View file

@ -36,7 +36,6 @@ import 'package:mangayomi/services/anime_extractors/your_upload_extractor.dart';
import 'package:mangayomi/services/http_service/cloudflare/cloudflare_bypass.dart'; import 'package:mangayomi/services/http_service/cloudflare/cloudflare_bypass.dart';
import 'package:mangayomi/utils/constant.dart'; import 'package:mangayomi/utils/constant.dart';
import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart'; import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart';
import 'package:mangayomi/utils/cryptoaes/deobfuscator.dart';
import 'package:mangayomi/utils/extensions.dart'; import 'package:mangayomi/utils/extensions.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart';
import 'package:mangayomi/utils/xpath_selector.dart'; import 'package:mangayomi/utils/xpath_selector.dart';
@ -111,7 +110,7 @@ class MBridge {
.trimLeft() .trimLeft()
.trimRight(); .trimRight();
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
@ -199,7 +198,7 @@ class MBridge {
//return last element of the resRegExp list //return last element of the resRegExp list
return resRegExp.last.trim().trimLeft().trimRight(); return resRegExp.last.trim().trimLeft().trimRight();
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
@ -226,7 +225,7 @@ class MBridge {
return attr; return attr;
} }
} catch (e) { } catch (e) {
// botToast(e.toString()); // _botToast(e.toString());
return ""; return "";
} }
} }
@ -297,11 +296,9 @@ class MBridge {
..launch(url); ..launch(url);
await Future.doWhile(() async { await Future.doWhile(() async {
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 10));
html = await decodeHtml( html = await decodeHtml(webview);
webview, if (xpathSelector(html!).query(rule).attrs.isEmpty) {
);
if (html == null || xpathSelector(html!).query(rule).attrs.isEmpty) {
html = await decodeHtml(webview); html = await decodeHtml(webview);
return true; return true;
} }
@ -377,7 +374,7 @@ class MBridge {
final jsPacker = JSPacker(code); final jsPacker = JSPacker(code);
return jsPacker.unpack() ?? ""; return jsPacker.unpack() ?? "";
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
@ -426,7 +423,7 @@ class MBridge {
}).toList(); }).toList();
} }
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
@ -487,7 +484,7 @@ class MBridge {
} }
return listRg.first; return listRg.first;
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
@ -611,7 +608,7 @@ class MBridge {
return result; return result;
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
return ""; return "";
} }
} }
@ -685,7 +682,7 @@ class MBridge {
return result; return result;
} catch (e) { } catch (e) {
botToast(e.toString()); _botToast(e.toString());
return ""; return "";
} }
} }
@ -781,7 +778,7 @@ class MBridge {
["menit", "dakika", "min", "minute", "minuto", "นาที", "دقائق"]) ["menit", "dakika", "min", "minute", "minuto", "นาที", "دقائق"])
.anyWordIn(date)) { .anyWordIn(date)) {
return cal.subtract(Duration(minutes: number)).millisecondsSinceEpoch; return cal.subtract(Duration(minutes: number)).millisecondsSinceEpoch;
} else if (WordSet(["detik", "segundo", "second", "วินาที", "sec"]) } else if (WordSet(["detik", "segundo", "second", "วินาที"])
.anyWordIn(date)) { .anyWordIn(date)) {
return cal.subtract(Duration(seconds: number)).millisecondsSinceEpoch; return cal.subtract(Duration(seconds: number)).millisecondsSinceEpoch;
} else if (WordSet(["week", "semana"]).anyWordIn(date)) { } else if (WordSet(["week", "semana"]).anyWordIn(date)) {
@ -875,15 +872,11 @@ class MBridge {
} catch (_) {} } catch (_) {}
} }
} }
botToast(e.toString()); _botToast(e.toString());
throw Exception(e); throw Exception(e);
} }
} }
static String deobfuscateJsPassword(String inputString) {
return Deobfuscator.deobfuscateJsPassword(inputString);
}
static Future<List<Video>> sibnetExtractor(String url) async { static Future<List<Video>> sibnetExtractor(String url) async {
return await SibnetExtractor().videosFromUrl( return await SibnetExtractor().videosFromUrl(
url, url,
@ -1104,19 +1097,6 @@ class $MBridge extends MBridge with $Bridge {
], ],
namedParams: []), namedParams: []),
isStatic: true), isStatic: true),
'deobfuscateJsPassword': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef.type(RuntimeTypes.stringType)),
params: [
BridgeParameter(
'inputString',
BridgeTypeAnnotation(
BridgeTypeRef.type(RuntimeTypes.stringType)),
false),
],
namedParams: []),
isStatic: true),
'sibnetExtractor': BridgeMethodDef( 'sibnetExtractor': BridgeMethodDef(
BridgeFunctionDef( BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future,
@ -2053,10 +2033,6 @@ class $MBridge extends MBridge with $Bridge {
$String(MBridge.parseChapterDate( $String(MBridge.parseChapterDate(
args[0]!.$value, args[1]!.$value, args[2]!.$value)); args[0]!.$value, args[1]!.$value, args[2]!.$value));
static $String $deobfuscateJsPassword(
Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.deobfuscateJsPassword(args[0]!.$value));
static $String $querySelectorAll( static $String $querySelectorAll(
Runtime runtime, $Value? target, List<$Value?> args) => Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.querySelectorAll( $String(MBridge.querySelectorAll(
@ -2184,7 +2160,7 @@ class $MBridge extends MBridge with $Bridge {
void $bridgeSet(String identifier, $Value value) {} void $bridgeSet(String identifier, $Value value) {}
} }
void botToast(String title) { void _botToast(String title) {
BotToast.showSimpleNotification( BotToast.showSimpleNotification(
onlyOne: true, onlyOne: true,
dismissDirections: [DismissDirection.horizontal, DismissDirection.down], dismissDirections: [DismissDirection.horizontal, DismissDirection.down],

View file

@ -99,8 +99,6 @@ Runtime runtimeEval(Uint8List bytecode) {
'package:bridge_lib/bridge_lib.dart', 'MBridge.xpath', $MBridge.$xpath); 'package:bridge_lib/bridge_lib.dart', 'MBridge.xpath', $MBridge.$xpath);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart', runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.querySelector', $MBridge.$querySelector); 'MBridge.querySelector', $MBridge.$querySelector);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.deobfuscateJsPassword', $MBridge.$deobfuscateJsPassword);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart', runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.querySelectorAll', $MBridge.$querySelectorAll); 'MBridge.querySelectorAll', $MBridge.$querySelectorAll);
runtime.setup(); runtime.setup();

View file

@ -1,7 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:archive/archive_io.dart'; import 'package:archive/archive_io.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:mangayomi/modules/manga/archive_reader/models/models.dart'; import 'package:mangayomi/modules/archive_reader/models/models.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'archive_reader_providers.g.dart'; part 'archive_reader_providers.g.dart';

View file

@ -3,24 +3,17 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/utils/colors.dart'; import 'package:mangayomi/utils/colors.dart';
import 'package:mangayomi/utils/language.dart'; import 'package:mangayomi/utils/language.dart';
import 'package:mangayomi/utils/media_query.dart'; import 'package:mangayomi/utils/media_query.dart';
class ExtensionDetail extends ConsumerStatefulWidget { class ExtensionDetail extends ConsumerWidget {
final Source source; final Source source;
const ExtensionDetail({super.key, required this.source}); const ExtensionDetail({super.key, required this.source});
@override @override
ConsumerState<ExtensionDetail> createState() => _ExtensionDetailState(); Widget build(BuildContext context, WidgetRef ref) {
}
class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
late Source source = widget.source;
@override
Widget build(BuildContext context) {
final l10n = l10nLocalizations(context)!; final l10n = l10nLocalizations(context)!;
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
@ -35,10 +28,10 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
color: color:
Theme.of(context).secondaryHeaderColor.withOpacity(0.5), Theme.of(context).secondaryHeaderColor.withOpacity(0.5),
borderRadius: BorderRadius.circular(10)), borderRadius: BorderRadius.circular(10)),
child: widget.source.iconUrl!.isEmpty child: source.iconUrl!.isEmpty
? const Icon(Icons.source_outlined, size: 140) ? const Icon(Icons.source_outlined, size: 140)
: CachedNetworkImage( : CachedNetworkImage(
imageUrl: widget.source.iconUrl!, imageUrl: source.iconUrl!,
fit: BoxFit.contain, fit: BoxFit.contain,
width: 140, width: 140,
height: 140, height: 140,
@ -57,7 +50,7 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
Padding( Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Text( child: Text(
widget.source.name!, source.name!,
style: const TextStyle(fontSize: 23, fontWeight: FontWeight.bold), style: const TextStyle(fontSize: 23, fontWeight: FontWeight.bold),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@ -76,7 +69,7 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
Column( Column(
children: [ children: [
Text( Text(
widget.source.version!, source.version!,
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.bold), fontSize: 16, fontWeight: FontWeight.bold),
), ),
@ -86,7 +79,7 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
), ),
], ],
), ),
if (widget.source.isNsfw!) if (source.isNsfw!)
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.red.withOpacity(0.7), color: Colors.red.withOpacity(0.7),
@ -103,7 +96,7 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
Column( Column(
children: [ children: [
Text( Text(
completeLanguageName(widget.source.lang!), completeLanguageName(source.lang!),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.bold), fontSize: 16, fontWeight: FontWeight.bold),
), ),
@ -138,10 +131,10 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
builder: (ctx) { builder: (ctx) {
return AlertDialog( return AlertDialog(
title: Text( title: Text(
widget.source.name!, source.name!,
), ),
content: Text( content:
l10n.uninstall_extension(widget.source.name!)), Text(l10n.uninstall_extension(source.name!)),
actions: [ actions: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
@ -156,8 +149,8 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
), ),
TextButton( TextButton(
onPressed: () { onPressed: () {
isar.writeTxnSync(() => isar.writeTxnSync(
isar.sources.putSync(widget.source () => isar.sources.putSync(source
..sourceCode = "" ..sourceCode = ""
..isAdded = false ..isAdded = false
..isPinned = false)); ..isPinned = false));
@ -177,86 +170,7 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
fontSize: 20, fontWeight: FontWeight.bold), fontSize: 20, fontWeight: FontWeight.bold),
)), )),
), ),
), )
ref.watch(getMirrorPrefProvider(widget.source.sourceCode!)).when(
data: (data) => data != null
? ListTile(
onTap: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
l10n.relative_timestamp,
),
content: SizedBox(
width: mediaWidth(context, 0.8),
child: ListView.builder(
shrinkWrap: true,
itemCount: data.entries.length,
itemBuilder: (context, index) {
return RadioListTile(
dense: true,
contentPadding:
const EdgeInsets.all(0),
value: data.entries
.toList()[index]
.value,
groupValue: widget.source.baseUrl!,
onChanged: (value) {
isar.writeTxnSync(() => isar
.sources
.putSync(widget.source
..baseUrl = data.entries
.toList()[index]
.value));
setState(() {
source = isar.sources
.getSync(source.id!)!;
});
Navigator.pop(context);
},
title: Row(
children: [
Text(data.entries
.toList()[index]
.key)
],
),
);
},
)),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
l10n.cancel,
style: TextStyle(
color: primaryColor(context)),
)),
],
)
],
);
});
},
title: Text(l10n.relative_timestamp),
subtitle: Text(
widget.source.baseUrl!,
style: TextStyle(
fontSize: 11, color: secondaryColor(context)),
),
)
: Container(),
error: (error, stackTrace) => Text(error.toString()),
loading: () => Container(),
)
], ],
), ),
); );

View file

@ -1,26 +0,0 @@
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'extension_preferences_providers.g.dart';
@riverpod
Future<Map<String, String>?> getMirrorPref(
GetMirrorPrefRef ref, String codeSource) async {
try {
final bytecode = compilerEval(codeSource);
final runtime = runtimeEval(bytecode);
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart',
'getMirrorPref',
);
Map<String, String> headers = {};
if (res is $Map) {
headers = res.$reified
.map((key, value) => MapEntry(key.toString(), value.toString()));
}
return headers;
} catch (_) {
return null;
}
}

View file

@ -1,114 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'extension_preferences_providers.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$getMirrorPrefHash() => r'87d8329eabbe702d2e612a04cfe6fc719519194c';
/// 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));
}
}
typedef GetMirrorPrefRef = AutoDisposeFutureProviderRef<Map<String, String>?>;
/// See also [getMirrorPref].
@ProviderFor(getMirrorPref)
const getMirrorPrefProvider = GetMirrorPrefFamily();
/// See also [getMirrorPref].
class GetMirrorPrefFamily extends Family<AsyncValue<Map<String, String>?>> {
/// See also [getMirrorPref].
const GetMirrorPrefFamily();
/// See also [getMirrorPref].
GetMirrorPrefProvider call(
String codeSource,
) {
return GetMirrorPrefProvider(
codeSource,
);
}
@override
GetMirrorPrefProvider getProviderOverride(
covariant GetMirrorPrefProvider provider,
) {
return call(
provider.codeSource,
);
}
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'getMirrorPrefProvider';
}
/// See also [getMirrorPref].
class GetMirrorPrefProvider
extends AutoDisposeFutureProvider<Map<String, String>?> {
/// See also [getMirrorPref].
GetMirrorPrefProvider(
this.codeSource,
) : super.internal(
(ref) => getMirrorPref(
ref,
codeSource,
),
from: getMirrorPrefProvider,
name: r'getMirrorPrefProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getMirrorPrefHash,
dependencies: GetMirrorPrefFamily._dependencies,
allTransitiveDependencies:
GetMirrorPrefFamily._allTransitiveDependencies,
);
final String codeSource;
@override
bool operator ==(Object other) {
return other is GetMirrorPrefProvider && other.codeSource == codeSource;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, codeSource.hashCode);
return _SystemHash.finish(hash);
}
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member

View file

@ -3,8 +3,8 @@ import 'package:file_picker/file_picker.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/manga/archive_reader/models/models.dart'; import 'package:mangayomi/modules/archive_reader/models/models.dart';
import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart'; import 'package:mangayomi/modules/archive_reader/providers/archive_reader_providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'local_archive.g.dart'; part 'local_archive.g.dart';

View file

@ -7,7 +7,7 @@ part of 'local_archive.dart';
// ************************************************************************** // **************************************************************************
String _$importArchivesFromFileHash() => String _$importArchivesFromFileHash() =>
r'f911dfd50c20ebbfec97322dd0bf44261a025341'; r'25ff2ca889a31d482a95af7cb9be8ebd9cf0dc89';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -76,19 +76,17 @@ class MainScreen extends ConsumerWidget {
children: [ children: [
AnimatedContainer( AnimatedContainer(
duration: const Duration(milliseconds: 0), duration: const Duration(milliseconds: 0),
width: switch (isLongPressed) { width: isLongPressed
true => 0, ? 0
_ => switch (location) { : location == null
null => 100, ? 100
!= '/MangaLibrary' && : location != '/MangaLibrary' &&
!= '/AnimeLibrary' && location != '/AnimeLibrary' &&
!= '/history' && location != '/history' &&
!= '/browse' && location != '/browse' &&
!= '/more' => location != '/more'
0, ? 0
_ => 100, : 100,
},
},
child: NavigationRailTheme( child: NavigationRailTheme(
data: NavigationRailThemeData( data: NavigationRailThemeData(
indicatorShape: RoundedRectangleBorder( indicatorShape: RoundedRectangleBorder(
@ -178,19 +176,17 @@ class MainScreen extends ConsumerWidget {
: AnimatedContainer( : AnimatedContainer(
duration: const Duration(milliseconds: 0), duration: const Duration(milliseconds: 0),
width: mediaWidth(context, 1), width: mediaWidth(context, 1),
height: switch (isLongPressed) { height: isLongPressed
true => 0, ? 0
_ => switch (location) { : location == null
null => null, ? null
!= '/MangaLibrary' && : location != '/MangaLibrary' &&
!= '/AnimeLibrary' && location != '/AnimeLibrary' &&
!= '/history' && location != '/history' &&
!= '/browse' && location != '/browse' &&
!= '/more' => location != '/more'
0, ? 0
_ => null, : null,
},
},
child: NavigationBarTheme( child: NavigationBarTheme(
data: NavigationBarThemeData( data: NavigationBarThemeData(
indicatorShape: RoundedRectangleBorder( indicatorShape: RoundedRectangleBorder(

View file

@ -10,7 +10,6 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/http_service/cloudflare/cookie.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/utils/constant.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
@ -183,6 +182,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
_url = url.toString(); _url = url.toString();
}); });
}, },
shouldOverrideUrlLoading: shouldOverrideUrlLoading:
(controller, navigationAction) async { (controller, navigationAction) async {
var uri = navigationAction.request.url!; var uri = navigationAction.request.url!;
@ -213,6 +213,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
_url = url.toString(); _url = url.toString();
}); });
}, },
onProgressChanged: (controller, progress) async { onProgressChanged: (controller, progress) async {
setState(() { setState(() {
this.progress = progress / 100; this.progress = progress / 100;
@ -232,12 +233,12 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
_canGoback = canGoback; _canGoback = canGoback;
_canGoForward = canGoForward; _canGoForward = canGoForward;
}); });
}, },initialOptions: InAppWebViewGroupOptions(
initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions(userAgent: isar.settings.getSync(227)!.userAgent!),
crossPlatform: InAppWebViewOptions( ),
userAgent: isar.settings.getSync(227)!.userAgent!),
), initialUrlRequest:
initialUrlRequest: URLRequest(url: Uri.parse(widget.url)), URLRequest(url: Uri.parse(widget.url)),
), ),
), ),
], ],
@ -255,17 +256,10 @@ Future<String> getWebViewPath() async {
); );
} }
Future<String?> decodeHtml(Webview webview, {String? sourceId}) async { decodeHtml(Webview webview) async {
final html = await webview final html = await webview
.evaluateJavaScript("window.document.documentElement.outerHTML;"); .evaluateJavaScript("window.document.documentElement.outerHTML;");
final cookie = await webview.evaluateJavaScript("window.document.cookie;"); // final cookie = await webview.evaluateJavaScript("window.document.cookie;");
if (cookie != null && sourceId != null) { // log(cookie!);
setCookieBA(cookie, sourceId); return jsonDecode(html!) as String;
}
final res = jsonDecode(html!) as String;
return res == "<html><head></head><body></body></html>" || res.isEmpty
? null
: res;
} }

View file

@ -43,6 +43,7 @@ Future<(List<Video>, bool)> getAnimeServers(
]; ];
var res = await runtime.executeLib( var res = await runtime.executeLib(
'package:mangayomi/source_code.dart', 'getVideoList'); 'package:mangayomi/source_code.dart', 'getVideoList');
// await Future.delayed(Duration(days: 1));
if (res is $List) { if (res is $List) {
video = res.$reified.map( video = res.$reified.map(
(e) { (e) {

View file

@ -9,7 +9,7 @@ import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart'; import 'package:mangayomi/modules/archive_reader/providers/archive_reader_providers.dart';
import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/modules/manga/reader/reader_view.dart';
import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/eval/runtime/runtime.dart'; import 'package:mangayomi/eval/runtime/runtime.dart';

View file

@ -6,7 +6,7 @@ part of 'get_chapter_url.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getChapterUrlHash() => r'6a8b0eb3869519b75787d8d4a876f536a517e849'; String _$getChapterUrlHash() => r'330c495774b22fc1fdedb0fa64969cd17e4635f8';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -7,7 +7,7 @@ part of 'get_latest_updates_manga.dart';
// ************************************************************************** // **************************************************************************
String _$getLatestUpdatesMangaHash() => String _$getLatestUpdatesMangaHash() =>
r'5bae855778ae63dd954705adab9b9bdb3432065e'; r'b4de1c71b935893780b02be6a4fa1980651a833d';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'get_manga_detail.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getMangaDetailHash() => r'9ac46d56d3492b3a61ff159873762f579415fb36'; String _$getMangaDetailHash() => r'025ccc11f94f9b69bd85d86833bc261f66b74f7f';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'get_popular_manga.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getPopularMangaHash() => r'6c9face3040220071430e814a12da83201692310'; String _$getPopularMangaHash() => r'f5a1f5a66bad652cb461ef0ed9d30f60ff7a000a';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -31,11 +31,9 @@ Future<String> cloudflareBypass(
..launch(url); ..launch(url);
await Future.doWhile(() async { await Future.doWhile(() async {
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 5));
html = await decodeHtml(webview, sourceId: sourceId); if (html == null) {
if (html == null || html = await decodeHtml(webview);
html!.contains("Just a moment") ||
html!.contains("challenges.cloudflare.com")) {
return true; return true;
} }
return false; return false;

View file

@ -8,14 +8,22 @@ Future setCookie(SetCookieRef ref, String sourceId, String url) async {
CookieManager cookie = CookieManager.instance(); CookieManager cookie = CookieManager.instance();
final cookies = await cookie.getCookies(url: Uri.parse(url.toString())); final cookies = await cookie.getCookies(url: Uri.parse(url.toString()));
final newCookie = cookies.join("; "); final newCookie =
setCookieBA(newCookie, sourceId); cookies.where((element) => element.name == "cf_clearance").toList();
if (newCookie.isNotEmpty) {
ref
.read(cookieStateProvider(sourceId).notifier)
.setCookie("cf_clearance=${newCookie.first.value};");
}
} }
Future setCookieB(String sourceId, String url) async { Future setCookieB(String sourceId, String url) async {
CookieManager cookie = CookieManager.instance(); CookieManager cookie = CookieManager.instance();
final cookies = await cookie.getCookies(url: Uri.parse(url.toString())); final cookies = await cookie.getCookies(url: Uri.parse(url.toString()));
final newCookie = cookies.join("; "); final newCookie =
setCookieBA(newCookie, sourceId); cookies.where((element) => element.name == "cf_clearance").toList();
if (newCookie.isNotEmpty) {
setCookieB("cf_clearance=${newCookie.first.value};", sourceId);
}
} }

View file

@ -6,7 +6,7 @@ part of 'cookie.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$setCookieHash() => r'55073d2aceae6ce9bf03d61d390dfb84150d272e'; String _$setCookieHash() => r'4beff910b58df98a7b5019a5375f9fb5c84a580c';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -35,7 +35,7 @@ class CookieState extends _$CookieState {
} }
} }
void setCookieBA(String newCookie, String idSource) { void setCookieB(String newCookie, String idSource) {
final settings = isar.settings.getSync(227); final settings = isar.settings.getSync(227);
List<Cookie>? cookieList = []; List<Cookie>? cookieList = [];
for (var cookie in settings!.cookiesList ?? []) { for (var cookie in settings!.cookiesList ?? []) {

View file

@ -6,7 +6,7 @@ part of 'cookie_providers.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$cookieStateHash() => r'a3e0c52a396c7b9072c2b1e948399f2e4e4728d5'; String _$cookieStateHash() => r'42286f51989b6f65eed9787ca2390a96854395a8';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'search_manga.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$searchMangaHash() => r'0c16725a47f5ad9b7ec7f128a5c1c03e4868fcf0'; String _$searchMangaHash() => r'9bbf3d7b3cb8f1aa92201200e6a4616721cd3037';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -2,7 +2,6 @@ import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:mangayomi/eval/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track.dart';
import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_preference.dart';
@ -73,7 +72,8 @@ class Anilist extends _$Anilist {
Future<Track> addLibManga(Track track) async { Future<Track> addLibManga(Track track) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
mutation AddManga(\$mangaId: Int, \$progress: Int, \$status: MediaListStatus) { mutation AddManga(\$mangaId: Int, \$progress: Int, \$status: MediaListStatus) {
SaveMediaListEntry(mediaId: \$mangaId, progress: \$progress, status: \$status) { SaveMediaListEntry(mediaId: \$mangaId, progress: \$progress, status: \$status) {
id id
@ -107,7 +107,8 @@ class Anilist extends _$Anilist {
Future<Track> addLibAnime(Track track) async { Future<Track> addLibAnime(Track track) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
mutation AddAnime(\$animeId: Int, \$progress: Int, \$status: MediaListStatus) { mutation AddAnime(\$animeId: Int, \$progress: Int, \$status: MediaListStatus) {
SaveMediaListEntry(mediaId: \$animeId, progress: \$progress, status: \$status) { SaveMediaListEntry(mediaId: \$animeId, progress: \$progress, status: \$status) {
id id
@ -140,7 +141,8 @@ class Anilist extends _$Anilist {
Future<Track> updateLibManga(Track track) async { Future<Track> updateLibManga(Track track) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
mutation UpdateManga(\$listId: Int, \$progress: Int, \$status: MediaListStatus, \$score: Int, \$startedAt: FuzzyDateInput, \$completedAt: FuzzyDateInput) { mutation UpdateManga(\$listId: Int, \$progress: Int, \$status: MediaListStatus, \$score: Int, \$startedAt: FuzzyDateInput, \$completedAt: FuzzyDateInput) {
SaveMediaListEntry( SaveMediaListEntry(
id: \$listId, id: \$listId,
@ -183,7 +185,8 @@ class Anilist extends _$Anilist {
Future<Track> updateLibAnime(Track track) async { Future<Track> updateLibAnime(Track track) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
mutation UpdateAnime(\$listId: Int, \$progress: Int, \$status: MediaListStatus, \$score: Int, \$startedAt: FuzzyDateInput, \$completedAt: FuzzyDateInput) { mutation UpdateAnime(\$listId: Int, \$progress: Int, \$status: MediaListStatus, \$score: Int, \$startedAt: FuzzyDateInput, \$completedAt: FuzzyDateInput) {
SaveMediaListEntry( SaveMediaListEntry(
id: \$listId, id: \$listId,
@ -224,7 +227,8 @@ class Anilist extends _$Anilist {
Future<List<TrackSearch>> search(String search) async { Future<List<TrackSearch>> search(String search) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
query Search(\$query: String) { query Search(\$query: String) {
Page(perPage: 50) { Page(perPage: 50) {
media(search: \$query, type: MANGA, format_not_in: [NOVEL]) { media(search: \$query, type: MANGA, format_not_in: [NOVEL]) {
@ -290,7 +294,8 @@ class Anilist extends _$Anilist {
Future<List<TrackSearch>> searchAnime(String search) async { Future<List<TrackSearch>> searchAnime(String search) async {
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
query Search(\$query: String) { query Search(\$query: String) {
Page(perPage: 50) { Page(perPage: 50) {
media(search: \$query, type: ANIME) { media(search: \$query, type: ANIME) {
@ -360,7 +365,8 @@ class Anilist extends _$Anilist {
final userId = ref.watch(tracksProvider(syncId: syncId))!.username; final userId = ref.watch(tracksProvider(syncId: syncId))!.username;
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
query(\$id: Int!, \$manga_id: Int!) { query(\$id: Int!, \$manga_id: Int!) {
Page { Page {
mediaList(userId: \$id, type: MANGA, mediaId: \$manga_id) { mediaList(userId: \$id, type: MANGA, mediaId: \$manga_id) {
@ -442,7 +448,8 @@ class Anilist extends _$Anilist {
final userId = ref.watch(tracksProvider(syncId: syncId))!.username; final userId = ref.watch(tracksProvider(syncId: syncId))!.username;
final accessToken = await _getAccesToken(); final accessToken = await _getAccesToken();
const query = ''' const query =
'''
query(\$id: Int!, \$anime_id: Int!) { query(\$id: Int!, \$anime_id: Int!) {
Page { Page {
mediaList(userId: \$id, type: ANIME, mediaId: \$anime_id) { mediaList(userId: \$id, type: ANIME, mediaId: \$anime_id) {
@ -519,7 +526,8 @@ class Anilist extends _$Anilist {
} }
Future<(String, String)> _getCurrentUser(String accessToken) async { Future<(String, String)> _getCurrentUser(String accessToken) async {
const query = ''' const query =
'''
query User { query User {
Viewer { Viewer {
id id
@ -558,7 +566,6 @@ class Anilist extends _$Anilist {
final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!);
if (DateTime.now().isAfter(expiresIn)) { if (DateTime.now().isAfter(expiresIn)) {
ref.read(tracksProvider(syncId: syncId).notifier).logout(); ref.read(tracksProvider(syncId: syncId).notifier).logout();
botToast("Anilist Token expired");
throw Exception("Token expired"); throw Exception("Token expired");
} }
return mALOAuth.accessToken!; return mALOAuth.accessToken!;
@ -570,20 +577,24 @@ class Anilist extends _$Anilist {
return switch (scoreFormat) { return switch (scoreFormat) {
"POINT_10" => (score / 10).toString(), "POINT_10" => (score / 10).toString(),
"POINT_100" => score.toString(), "POINT_100" => score.toString(),
"POINT_5" => switch (score) { "POINT_5" => score == 0
0 => "0", ? "0"
< 30 => "1", : score < 30
< 50 => "2", ? "1"
< 70 => "3", : score < 50
< 90 => "4", ? "2"
_ => "5" : score < 70
}, ? "3"
"POINT_3" => switch (score) { : score < 90
0 => "0", ? "4"
<= 35 => ":(", : "5",
<= 60 => ":|", "POINT_3" => score == 0
_ => ":)" ? "0"
}, : score <= 35
? ":("
: score <= 60
? ":|"
: ":)",
"POINT_10_DECIMAL" => (score / 10).toString(), "POINT_10_DECIMAL" => (score / 10).toString(),
_ => throw ("Unknown score type") _ => throw ("Unknown score type")
}; };
@ -672,16 +683,14 @@ class Anilist extends _$Anilist {
final prefs = isar.trackPreferences.getSync(syncId)!.prefs; final prefs = isar.trackPreferences.getSync(syncId)!.prefs;
final scoreFormat = jsonDecode(prefs!)['scoreFormat']; final scoreFormat = jsonDecode(prefs!)['scoreFormat'];
return switch (scoreFormat) { return switch (scoreFormat) {
'POINT_5' => switch (score) { 'POINT_5' => score == 0 ? "0 ★" : "${(score + 10) ~/ 20}",
0 => "0 ★", 'POINT_3' => score == 0
_ => "${(score + 10) ~/ 20}" ? "-"
}, : score <= 35
'POINT_3' => switch (score) { ? "😦"
0 => "-", : score <= 60
<= 35 => "😦", ? "😐"
<= 60 => "😐", : "😊",
_ => "😊"
},
_ => _toAnilistScore(score), _ => _toAnilistScore(score),
}; };
} }

View file

@ -25,7 +25,7 @@ class CryptoAES {
static String decryptAESCryptoJS(String encrypted, String passphrase) { static String decryptAESCryptoJS(String encrypted, String passphrase) {
try { try {
Uint8List encryptedBytesWithSalt = base64.decode(encrypted.trim()); Uint8List encryptedBytesWithSalt = base64.decode(encrypted);
Uint8List encryptedBytes = Uint8List encryptedBytes =
encryptedBytesWithSalt.sublist(16, encryptedBytesWithSalt.length); encryptedBytesWithSalt.sublist(16, encryptedBytesWithSalt.length);

View file

@ -1,65 +0,0 @@
class Deobfuscator {
static String deobfuscateJsPassword(String inputString) {
int idx = 0;
final brackets = ['[', '('];
final evaluatedString = StringBuffer();
while (idx < inputString.length) {
final chr = inputString[idx];
if (!brackets.contains(chr)) {
idx++;
continue;
}
final closingIndex = getMatchingBracketIndex(idx, inputString);
if (chr == '[') {
final digit = calculateDigit(inputString.substring(idx, closingIndex));
evaluatedString.write(digit);
} else {
evaluatedString.write('.');
if (inputString[closingIndex + 1] == '[') {
final skippingIndex = getMatchingBracketIndex(closingIndex + 1, inputString);
idx = skippingIndex + 1;
continue;
}
}
idx = closingIndex + 1;
}
return evaluatedString.toString();
}
static int getMatchingBracketIndex(int openingIndex, String inputString) {
final openingBracket = inputString[openingIndex];
final closingBracket = openingBracket == '[' ? ']' : ')';
var counter = 0;
for (var idx = openingIndex; idx < inputString.length; idx++) {
if (inputString[idx] == openingBracket) counter++;
if (inputString[idx] == closingBracket) counter--;
if (counter == 0) return idx; // found matching bracket
if (counter < 0) return -1; // unbalanced brackets
}
return -1; // matching bracket not found
}
static String calculateDigit(String inputSubString) {
final digit = RegExp(r"\!\+\[\]").allMatches(inputSubString).length;
if (digit == 0) {
if (RegExp(r"\+\[\]").allMatches(inputSubString).length == 1) {
return '0';
}
} else if (digit >= 1 && digit <= 9) {
return digit.toString();
}
return '-'; // Illegal digit
}
}

View file

@ -25,7 +25,7 @@ Map<String, String> headers(HeadersRef ref,
if (sourceM.hasCloudflare!) { if (sourceM.hasCloudflare!) {
final userAgent = isar.settings.getSync(227)!.userAgent!; final userAgent = isar.settings.getSync(227)!.userAgent!;
final cookie = ref.watch(cookieStateProvider(sourceM.id.toString())); final cookie = ref.watch(cookieStateProvider(source));
newHeaders.addAll({'User-Agent': userAgent, "Cookie": cookie}); newHeaders.addAll({'User-Agent': userAgent, "Cookie": cookie});
} }

View file

@ -6,7 +6,7 @@ part of 'headers.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$headersHash() => r'36e19ced66a55af45ef31bb3b342505246745ebe'; String _$headersHash() => r'072a5ed2f4253378506a5fc1f9095531f252450e';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1579,5 +1579,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.1.1 <4.0.0" dart: ">=3.1.0 <4.0.0"
flutter: ">=3.13.0" flutter: ">=3.13.0"

View file

@ -1,10 +1,10 @@
name: mangayomi name: mangayomi
description: Free and open source manga reader multi plateform app inspired by Tachiyomi. description: Free and open source manga reader multi plateform app inspired by Tachiyomi.
version: 0.0.43+17 version: 0.0.42+16
environment: environment:
sdk: '>=3.1.1 <4.0.0' sdk: '>=3.1.0 <4.0.0'
dependencies: dependencies: