Revert "code refactor , deobfuscator method , extension preferences"
This reverts commit 3ff647bb01.
This commit is contained in:
parent
9e54108872
commit
530763dafe
32 changed files with 141 additions and 457 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
@ -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(),
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 ?? []) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue