This commit is contained in:
kodjomoustapha 2024-02-09 13:24:36 +01:00
parent 910524d9bf
commit afb09d3f7e
16 changed files with 104 additions and 28 deletions

View file

@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
import 'package:html/dom.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:js_packer/js_packer.dart';
import 'package:json_path/json_path.dart';
import 'package:mangayomi/eval/model/document.dart';
import 'package:mangayomi/models/manga.dart';
@ -27,6 +26,7 @@ import 'package:mangayomi/services/anime_extractors/voe_extractor.dart';
import 'package:mangayomi/services/anime_extractors/your_upload_extractor.dart';
import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart';
import 'package:mangayomi/utils/cryptoaes/deobfuscator.dart';
import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
import 'package:xpath_selector_html_parser/xpath_selector_html_parser.dart';
@ -124,8 +124,7 @@ class MBridge {
static $Value? _unpackJs(_, __, List<$Value?> args) {
String code = args[0]!.$reified;
try {
final jsPacker = JSPacker(code);
return $String(jsPacker.unpack() ?? "");
return $String(JsUnpacker.unpackAndCombine(code) ?? "");
} catch (_) {
return $String("");
}

View file

@ -660,7 +660,7 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
List<BoxFit> fitList = [
BoxFit.contain,
BoxFit.cover,
BoxFit.fill,
BoxFit.cover,
BoxFit.fitHeight,
BoxFit.fitWidth,
BoxFit.none

View file

@ -282,7 +282,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
: getMangaDetail.imageUrl!),
width: 110,
height: 150,
fit: BoxFit.fill));
fit: BoxFit.cover));
},
),
BottomTextWidget(

View file

@ -266,7 +266,7 @@ class _HistoryTabState extends ConsumerState<HistoryTab> {
manga.imageUrl!),
width: 60,
height: 90,
fit: BoxFit.fill),
fit: BoxFit.cover),
),
),
),

View file

@ -274,7 +274,7 @@ class MainScreen extends ConsumerWidget {
child: Image.asset(
"assets/app_icons/icon.png",
color: Colors.black,
fit: BoxFit.fill,
fit: BoxFit.cover,
height: 100,
),
),
@ -286,7 +286,7 @@ class MainScreen extends ConsumerWidget {
child: Image.asset(
"assets/app_icons/icon.png",
color: Colors.black,
fit: BoxFit.fill,
fit: BoxFit.cover,
height: 100,
),
),

View file

@ -1439,7 +1439,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
borderRadius: const BorderRadius.all(Radius.circular(5)),
image: DecorationImage(
image: imageProvider,
fit: BoxFit.fill,
fit: BoxFit.cover,
),
),
),
@ -1698,6 +1698,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
..customCoverImage = null
..customCoverFromTracker = null);
});
Navigator.pop(context);
} else if (value == 1) {
FilePickerResult? result =
await FilePicker.platform.pickFiles(

View file

@ -39,7 +39,7 @@ BoxFit getBoxFit(ScaleType scaleType) {
ScaleType.fitScreen => BoxFit.contain,
ScaleType.originalSize => BoxFit.cover,
ScaleType.smartFit => BoxFit.contain,
_ => BoxFit.fill
_ => BoxFit.cover
};
}

View file

@ -64,7 +64,7 @@ class _AboutScreenState extends ConsumerState<AboutScreen> {
color: Theme.of(context).brightness == Brightness.light
? Colors.black
: Colors.white,
fit: BoxFit.fill,
fit: BoxFit.cover,
height: 100,
),
),

View file

@ -24,7 +24,7 @@ class MoreScreen extends StatelessWidget {
color: Theme.of(context).brightness == Brightness.light
? Colors.black
: Colors.white,
fit: BoxFit.fill,
fit: BoxFit.cover,
height: 100,
),
),

View file

@ -47,7 +47,7 @@ class CoverViewWidget extends StatelessWidget {
)
: Ink.image(
height: 200,
fit: BoxFit.fill,
fit: BoxFit.cover,
image: image!,
child: Stack(
children: children,

View file

@ -1,7 +1,7 @@
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
@ -18,7 +18,7 @@ class FilemoonExtractor {
.queryXPath('//script[contains(text(), "eval")]/text()')
.attr;
final unpacked = JSPacker(jsEval!).unpack() ?? "";
final unpacked = JsUnpacker.unpackAndCombine(jsEval!) ?? "";
final masterUrl = unpacked.isNotEmpty
? unpacked.substringAfter('{file:"').substringBefore('"}')

View file

@ -1,7 +1,7 @@
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
@ -23,7 +23,7 @@ class Mp4uploadExtractor {
.attrs;
if (scriptElementWithEval.isNotEmpty) {
script = JSPacker(script).unpack() ?? "";
script = JsUnpacker.unpackAndCombine(script) ?? "";
} else {
final scriptElementWithSrc = xpathSelector(response.body)
.queryXPath('//script[contains(text(), "player.src")]/text()')

View file

@ -1,7 +1,7 @@
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart';
import 'package:mangayomi/utils/extensions/others.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
@ -26,7 +26,7 @@ class StreamWishExtractor {
.let(
(script) {
if (script.contains("function(p,a,c")) {
return JSPacker(script).unpack() ?? "";
return JsUnpacker.unpackAndCombine(script) ?? "";
}
return script;
},

View file

@ -0,0 +1,85 @@
import 'dart:math';
class JsUnpacker {
static final RegExp _packedRegex = RegExp(
r"eval[(]function[(]p,a,c,k,e,[r|d]?",
caseSensitive: false,
multiLine: true);
static final RegExp _packedExtractRegex = RegExp(
r"[}][(]'(.*)', *(\d+), *(\d+), *'(.*?)'[.]split[(]'[|]'[)]",
caseSensitive: false,
multiLine: true);
static final RegExp _unpackReplaceRegex =
RegExp(r"\b\w+\b", caseSensitive: false, multiLine: true);
static bool detect(String scriptBlock) {
return _packedRegex.hasMatch(scriptBlock);
}
static List<String> detectMultiple(List<String> scriptBlocks) {
return scriptBlocks.where(detect).toList();
}
static List<String> unpack(String scriptBlock) {
return detect(scriptBlock) ? _unpacking(scriptBlock).toList() : <String>[];
}
static String? unpackAndCombine(String scriptBlock) {
final unpacked = unpack(scriptBlock);
return unpacked.isEmpty ? null : unpacked.join(' ');
}
static Iterable<String> _unpacking(String scriptBlock) sync* {
final matches = _packedExtractRegex.allMatches(scriptBlock);
for (final match in matches) {
final payload = match.group(1);
final symtab = match.group(4)?.split('|');
final radix = int.tryParse(match.group(2)!) ?? 10;
final count = int.tryParse(match.group(3)!) ?? 0;
final unbaser = Unbaser(radix);
if (symtab != null && symtab.length == count) {
final unpackedPayload =
payload!.replaceAllMapped(_unpackReplaceRegex, (match) {
final word = match.group(0)!;
final unbased = symtab[unbaser.unbase(word)];
return unbased.isEmpty ? word : unbased;
});
yield unpackedPayload;
}
}
}
}
class Unbaser {
final int base;
static const Map<int, String> _alphabet = {
52: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP",
54: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR",
62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
95: " !\"#\$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
};
Unbaser(this.base);
int unbase(String value) {
if (base >= 2 && base <= 36) {
return int.tryParse(value, radix: base) ?? 0;
} else {
final dict = _alphabet[base]
?.split('')
.asMap()
.map((index, c) => MapEntry(c, index));
var returnVal = 0;
final valArray = value.runes.toList().reversed.toList();
for (var i = 0; i < valArray.length; i++) {
final cipher = String.fromCharCode(valArray[i]);
returnVal += pow(base, i).toInt() * (dict?[cipher] ?? 0).toInt();
}
return returnVal;
}
}
}

View file

@ -734,14 +734,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.7"
js_packer:
dependency: "direct main"
description:
name: js_packer
sha256: f45ffa90165a810d7134f0b96b54068e4aac9d80a8b181eafa3978ec6dbc66a3
url: "https://pub.dev"
source: hosted
version: "0.0.5"
json_annotation:
dependency: transitive
description:

View file

@ -51,7 +51,6 @@ dependencies:
flutter_web_auth_2: ^3.1.1
numberpicker: ^2.1.2
encrypt: ^5.0.3
js_packer: ^0.0.5
media_kit: ^1.1.10+1
media_kit_video:
git: