Added http response bridge to catch error

This commit is contained in:
kodjomoustapha 2023-10-25 19:04:57 +01:00
parent 243962c6bb
commit 9187d81c7a
14 changed files with 244 additions and 145 deletions

View file

@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/model/m_track.dart';
import 'package:mangayomi/eval/model/m_video.dart';
@ -679,8 +680,8 @@ class $MBridge extends MBridge with $Bridge {
isStatic: true),
'http': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future,
[BridgeTypeRef.type(RuntimeTypes.stringType)])),
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MHttpResponse.$type])),
params: [
BridgeParameter(
'method',
@ -1128,7 +1129,7 @@ class $MBridge extends MBridge with $Bridge {
static $Future $http(Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.http(args[0]!.$value, args[1]!.$value)
.then((value) => $String(value)));
.then((value) => $MHttpResponse.wrap(value)));
static $Future $httpMultiparFormData(
Runtime runtime, $Value? target, List<$Value?> args) =>
@ -1236,7 +1237,6 @@ class $MBridge extends MBridge with $Bridge {
void $bridgeSet(String identifier, $Value value) {}
}
$MVideo _toMVideo(Video e) => $MVideo.wrap(MVideo()
..headers = e.headers
..originalUrl = e.originalUrl
@ -1256,4 +1256,3 @@ $MVideo _toMVideo(Video e) => $MVideo.wrap(MVideo()
..file = t.file
..label = t.label))
.toList()));

View file

@ -0,0 +1,90 @@
import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/model/m_http_response.dart';
class $MHttpResponse implements MHttpResponse, $Instance {
$MHttpResponse.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MHttpResponse'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
))
},
// Specify class fields
fields: {
'body': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'statusCode': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.intType))),
'hasError': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MHttpResponse.wrap(MHttpResponse());
}
@override
final MHttpResponse $value;
@override
MHttpResponse get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'body':
return $String($value.body!);
case 'statusCode':
return $int($value.statusCode!);
case 'hasError':
return $bool($value.hasError!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'body':
$value.body = value.$reified;
case 'statusCode':
$value.statusCode = value.$reified;
case 'hasError':
$value.hasError = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get body => $value.body;
@override
int? get statusCode => $value.statusCode;
@override
bool? get hasError => $value.hasError;
@override
set body(String? body) {}
@override
set statusCode(int? statusCode) {}
@override
set hasError(bool? hasError) {}
}

View file

@ -274,6 +274,7 @@ class $MManga implements MManga, $Instance {
$value.images = value.$reified;
case 'hasNextPage':
$value.hasNextPage = value.$reified;
case 'hasError':
default:
_superclass.$setProperty(runtime, identifier, value);
}
@ -302,44 +303,31 @@ class $MManga implements MManga, $Instance {
@override
String? get lang => $value.lang;
@override
int? get sourceId => $value.sourceId;
@override
int? get status => $value.status;
@override
set author(String? author) {
// implement author
}
set author(String? author) {}
@override
set description(String? description) {
// implement description
}
set description(String? description) {}
@override
set imageUrl(String? imageUrl) {
// implement imageUrl
}
set imageUrl(String? imageUrl) {}
@override
set link(String? link) {
// implement link
}
set link(String? link) {}
@override
set name(String? name) {
// implement name
}
set name(String? name) {}
@override
set source(String? source) {
// implement source
}
set source(String? source) {}
@override
set hasNextPage(bool? hasNextPage) {
// implement hasNextPage
}
set hasNextPage(bool? hasNextPage) {}
@override
List<dynamic>? get chaptersDateUploads => $value.chaptersDateUploads;
@ -363,39 +351,25 @@ class $MManga implements MManga, $Instance {
List<dynamic>? get statusList => $value.statusList;
@override
set chaptersDateUploads(List? chaptersDateUploads) {
// implement chaptersDateUploads
}
set chaptersDateUploads(List? chaptersDateUploads) {}
@override
set names(List? names) {
// implement names
}
set names(List? names) {}
@override
set chaptersScanlators(List? chaptersScanlators) {
// implement chaptersScanlators
}
set chaptersScanlators(List? chaptersScanlators) {}
@override
set urls(List? urls) {
// implement urls
}
set urls(List? urls) {}
@override
set genre(List? genre) {
// implement genre
}
set genre(List? genre) {}
@override
set lang(String? lang) {
// implement lang
}
set lang(String? lang) {}
@override
set status(int? status) {
// implement status
}
set status(int? status) {}
@override
String? get apiUrl => $value.apiUrl;
@ -413,60 +387,38 @@ class $MManga implements MManga, $Instance {
bool? get hasNextPage => $value.hasNextPage;
@override
set apiUrl(String? apiUrl) {
// implement apiUrl
}
set apiUrl(String? apiUrl) {}
@override
set baseUrl(String? baseUrl) {
// implement baseUrl
}
set baseUrl(String? baseUrl) {}
@override
set dateFormat(String? dateFormat) {
// implement dateFormat
}
set dateFormat(String? dateFormat) {}
@override
set dateFormatLocale(String? dateFormatLocale) {
// implement dateFormatLocale
}
set dateFormatLocale(String? dateFormatLocale) {}
@override
int? get page => $value.page;
@override
set page(int? page) {
// implement page
}
set page(int? page) {}
@override
String? get query => $value.query;
@override
set query(String? query) {
// implement query
}
set query(String? query) {}
@override
set chaptersChaps(List? chaptersChaps) {
// implement chaptersChaps
}
set chaptersChaps(List? chaptersChaps) {}
@override
set chaptersVolumes(List? chaptersVolumes) {
// implement chaptersVolumes
}
set chaptersVolumes(List? chaptersVolumes) {}
@override
set images(List? images) {
// implement images
}
set images(List? images) {}
@override
set statusList(List? images) {
// implement images
}
set statusList(List? images) {}
@override
set sourceId(int? sourceId) {
// implement sourceId
}
set sourceId(int? sourceId) {}
}

View file

@ -1,5 +1,6 @@
import 'dart:typed_data';
import 'package:dart_eval/dart_eval.dart';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/bridge/m_status.dart';
import 'package:mangayomi/eval/bridge/m_track.dart';
@ -13,7 +14,8 @@ Uint8List compilerEval(String sourceCode) {
$MBridge.$declaration,
$MManga.$declaration,
$MVideo.$declaration,
$MTrack.$declaration
$MTrack.$declaration,
$MHttpResponse.$declaration
]);
compiler.defineBridgeEnum($MStatus.$declaration);
final program = compiler.compile({

View file

@ -10,6 +10,7 @@ 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/m_http_response.dart';
import 'package:mangayomi/services/anime_extractors/dood_extractor.dart';
import 'package:mangayomi/services/anime_extractors/filemoon.dart';
import 'package:mangayomi/services/anime_extractors/gogocdn_extractor.dart';
@ -575,10 +576,9 @@ class MBridge {
}
//http request and also webview
static Future<String> http(String method, String datas) async {
static Future<MHttpResponse> http(String method, String datas) async {
try {
hp.StreamedResponse? res;
String result = "";
//Get headers
final headersMap = jsonDecode(datas)["headers"] as Map?;
@ -606,13 +606,6 @@ class MBridge {
//Get the serie source
final source = sourceId != null ? isar.sources.getSync(sourceId) : null;
//Check the serie if has cloudflare
// if (source != null && source.hasCloudflare!) {
// final res = await cloudflareBypass(
// url: url, sourceId: source.id.toString(), method: method);
// return res;
// }
//Do the http request if the serie hasn't cloudflare
var request = hp.Request(method, Uri.parse(url));
@ -623,22 +616,25 @@ class MBridge {
request.headers.addAll(headers);
res = await request.send();
if (res.statusCode != 200 && source != null && source.hasCloudflare!) {
result = await cloudflareBypass(
url: url, sourceId: source.id.toString(), method: 0);
} else if (res.statusCode != 200) {
result = "400";
} else if (res.statusCode == 200) {
result = await res.stream.bytesToString();
MHttpResponse httpResponse = MHttpResponse();
if (res.statusCode != 200 && (source?.hasCloudflare ?? false)) {
final result = await cloudflareBypass(
url: url, sourceId: source!.id.toString(), method: 0);
httpResponse =
MHttpResponse(body: result, statusCode: 200, hasError: false);
} else {
result = res.reasonPhrase!;
httpResponse = MHttpResponse(
body: res.statusCode == 200
? await res.stream.bytesToString()
: res.reasonPhrase,
statusCode: res.statusCode,
hasError: res.statusCode != 200);
}
return result;
return httpResponse;
} catch (e) {
botToast(e.toString());
return "";
return MHttpResponse(body: e.toString(), statusCode: 0, hasError: true);
}
}

View file

@ -0,0 +1,7 @@
class MHttpResponse {
bool? hasError;
int? statusCode;
String? body;
MHttpResponse({this.body, this.hasError, this.statusCode});
}

View file

@ -1,6 +1,7 @@
import 'dart:typed_data';
import 'package:dart_eval/dart_eval.dart';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/bridge/m_status.dart';
import 'package:mangayomi/eval/bridge/m_track.dart';
import 'package:mangayomi/eval/bridge/m_video.dart';
@ -20,7 +21,8 @@ Runtime runtimeEval(Uint8List bytecode) {
'package:bridge_lib/bridge_lib.dart', 'MTrack.', $MTrack.$new);
runtime.registerBridgeEnumValues(
'package:bridge_lib/bridge_lib.dart', 'MStatus', $MStatus.$values);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MHttpResponse.', $MHttpResponse.$new);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.http', $MBridge.$http);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',

View file

@ -1,3 +1,4 @@
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
@ -14,10 +15,14 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
return;
}
final source = getSource(manga.lang!, manga.source!);
final getManga = await ref.watch(
getMangaDetailProvider(manga: manga.toMManga(source!), source: source)
.future);
MManga getManga;
try {
getManga = await ref.watch(
getMangaDetailProvider(manga: manga.toMManga(source!), source: source)
.future);
} catch (_) {
return;
}
manga
..imageUrl = getManga.imageUrl ?? manga.imageUrl

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/model/m_track.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
@ -37,35 +38,47 @@ Future<(List<Video>, bool)> getAnimeServers(
runtime.args = [$MManga.wrap(source.toMManga(link: episode.url!))];
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart', 'getVideoList');
if (res is $List) {
video = res.$reified.map(
(e) {
List<Track>? subtitles = [];
var subs = e.subtitles;
if (subs is $List) {
subtitles = subs.map((e) => Track(e.file, e.label)).toList();
} else {
try {
subtitles = (subs as List<MTrack>).map((e) {
return Track(e.file, e.label);
}).toList();
} catch (_) {}
}
List<Track>? audios = [];
var auds = e.audios;
if (auds is $List) {
audios = auds.map((e) => Track(e.file, e.label)).toList();
} else {
try {
audios = (subs as List<MTrack>).map((e) {
return Track(e.file, e.label);
}).toList();
} catch (_) {}
}
return Video(e.url, e.quality, e.originalUrl,
headers: e.headers, subtitles: subtitles, audios: audios);
},
).toList();
try {
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
if (res is $List) {
video = res.$reified.map(
(e) {
List<Track>? subtitles = [];
var subs = e.subtitles;
if (subs is $List) {
subtitles = subs.map((e) => Track(e.file, e.label)).toList();
} else {
try {
subtitles = (subs as List<MTrack>).map((e) {
return Track(e.file, e.label);
}).toList();
} catch (_) {}
}
List<Track>? audios = [];
var auds = e.audios;
if (auds is $List) {
audios = auds.map((e) => Track(e.file, e.label)).toList();
} else {
try {
audios = (subs as List<MTrack>).map((e) {
return Track(e.file, e.label);
}).toList();
} catch (_) {}
}
return Video(e.url, e.quality, e.originalUrl,
headers: e.headers, subtitles: subtitles, audios: audios);
},
).toList();
}
} catch (e) {
throw e.toString();
}
return (video, false);
}

View file

@ -3,6 +3,7 @@ import 'dart:io';
import 'dart:typed_data';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/main.dart';
@ -69,6 +70,13 @@ Future<GetChapterUrlModel> getChapterUrl(
runtime.args = [$MManga.wrap(source.toMManga(link: chapter.url!))];
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart', 'getChapterPages');
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
if (res is $List) {
for (var element in res.$reified) {
if (element is $Value) {

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
@ -25,6 +26,12 @@ Future<List<MManga?>> getLatestUpdatesManga(
'package:mangayomi/source_code.dart',
source.isManga! ? 'getLatestUpdatesManga' : 'getLatestUpdatesAnime',
);
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
if (res is $MManga) {
final value = res.$reified;
List<MManga> newManga = [];
@ -48,7 +55,7 @@ Future<List<MManga?>> getLatestUpdatesManga(
(res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
} catch (e) {
throw Exception(e);
throw e.toString();
}
return latestUpdatesManga;

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
@ -21,15 +22,17 @@ Future<MManga> getMangaDetail(
final runtime = runtimeEval(bytecode);
runtime.args = [$MManga.wrap(manga)];
var result = await runtime.executeLib('package:mangayomi/source_code.dart',
var res = await runtime.executeLib('package:mangayomi/source_code.dart',
source.isManga! ? 'getMangaDetail' : 'getAnimeDetail');
try {
if (result is $MManga) {
final value = result.$reified;
mangadetail = value;
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
} catch (_) {
return manga;
}
if (res is $MManga) {
final value = res.$reified;
mangadetail = value;
}
return mangadetail!;
}

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
@ -25,6 +26,13 @@ Future<List<MManga?>> getPopularManga(
source.isManga! ? 'getPopularManga' : 'getPopularAnime',
);
try {
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
if (res is $MManga) {
final value = res.$reified;
List<MManga> newManga = [];
@ -48,7 +56,7 @@ Future<List<MManga?>> getPopularManga(
(res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
} catch (e) {
throw Exception(e);
throw e.toString();
}
return popularManga;

View file

@ -1,3 +1,4 @@
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
@ -27,6 +28,12 @@ Future<List<MManga?>> searchManga(
source.isManga! ? 'searchManga' : 'searchAnime',
);
try {
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
if (res is $MManga) {
final value = res.$reified;
List<MManga> newManga = [];
@ -49,7 +56,7 @@ Future<List<MManga?>> searchManga(
manga = (res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
} catch (e) {
throw Exception(e);
throw e.toString();
}
return manga;
}