This commit is contained in:
kodjomoustapha 2023-10-30 19:02:17 +01:00
parent c3f1cb37d0
commit 9569a261bd
48 changed files with 1258 additions and 1451 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,128 @@
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_chapter.dart';
class $MChapter implements MChapter, $Instance {
$MChapter.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MChapter'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter(
'name',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string)),
false),
BridgeParameter(
'url',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string)),
false),
BridgeParameter(
'dateUpload',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string)),
false),
BridgeParameter(
'scanlator',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string)),
true),
]))
},
// Specify class fields
fields: {
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'url': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'dateUpload': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'scanlator': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MChapter.wrap(MChapter(
name: args[0]?.$reified,
url: args[1]?.$reified,
dateUpload: args[2]?.$reified,
scanlator: args[3]?.$reified,
));
}
@override
final MChapter $value;
@override
MChapter get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'name':
return $String($value.name!);
case 'url':
return $String($value.url!);
case 'dateUpload':
return $String($value.dateUpload!);
case 'scanlator':
return $String($value.scanlator!);
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 'name':
$value.name = value.$reified;
case 'url':
$value.url = value.$reified;
case 'dateUpload':
$value.dateUpload = value.$reified;
case 'scanlator':
$value.scanlator = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get name => $value.name;
@override
String? get url => $value.url;
@override
String? get dateUpload => $value.dateUpload;
@override
String? get scanlator => $value.scanlator;
@override
set name(String? name) {}
@override
set url(String? url) {}
@override
set dateUpload(String? dateUpload) {}
@override
set scanlator(String? scanlator) {}
}

View file

@ -7,7 +7,7 @@ class $MHttpResponse implements MHttpResponse, $Instance {
$MHttpResponse.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MHttpResponse'));
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MHttpResponse'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
@ -18,11 +18,11 @@ class $MHttpResponse implements MHttpResponse, $Instance {
// 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))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'statusCode':
BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int))),
'hasError':
BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool))),
},
wrap: true);

View file

@ -1,105 +1,43 @@
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_chapter.dart';
import 'package:mangayomi/eval/bridge/m_status.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/manga.dart';
class $MManga implements MManga, $Instance {
$MManga.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MManga'));
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MManga'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
))
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: []))
},
// Specify class fields
fields: {
'source': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'author': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'status': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.intType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'status': BridgeFieldDef(BridgeTypeAnnotation($MStatus.$type)),
'genre': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]),
),
),
'imageUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'lang': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'link': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'description': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'baseUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'dateFormat': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'dateFormatLocale': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'apiUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'page': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.intType))),
'query': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'sourceId': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.intType))),
'names': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'urls': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'chaptersScanlators': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'chaptersDateUploads': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'chaptersVolumes': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'chaptersChaps': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'images': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef.type(RuntimeTypes.stringType)]),
),
),
'hasNextPage': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef.type(RuntimeTypes.boolType),
),
),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'chapters': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MChapter.$type]))),
},
wrap: true);
@ -118,103 +56,25 @@ class $MManga implements MManga, $Instance {
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'source':
return $String($value.source!);
case 'author':
return $String($value.author!);
case 'status':
return $int($value.status!);
return $MStatus.wrap($value.status!);
case 'genre':
return $List.wrap($value.genre!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
return $List.wrap($value.genre!);
case 'imageUrl':
return $String($value.imageUrl!);
case 'lang':
return $String($value.lang!);
case 'name':
return $String($value.name!);
case 'link':
return $String($value.link!);
case 'description':
return $String($value.description!);
case 'baseUrl':
return $String($value.baseUrl!);
case 'dateFormat':
return $String($value.dateFormat!);
case 'dateFormatLocale':
return $String($value.dateFormatLocale!);
case 'apiUrl':
return $String($value.apiUrl!);
case 'page':
return $int($value.page!);
case 'query':
return $String($value.query!);
case 'sourceId':
return $int($value.sourceId!);
case 'names':
return $List.wrap($value.names!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'chaptersDateUploads':
return $List.wrap($value.chaptersDateUploads!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'chaptersScanlators':
return $List.wrap($value.chaptersScanlators!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'urls':
return $List.wrap($value.urls!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'chaptersVolumes':
return $List.wrap($value.chaptersVolumes!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'chaptersChaps':
return $List.wrap($value.chaptersChaps!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'images':
return $List.wrap($value.images!.map((e) {
if (e is String) {
return $String(e);
} else {
return e;
}
}).toList());
case 'chapters':
return $List
.wrap($value.chapters!.map((e) => $MChapter.wrap(e)).toList());
case 'hasNextPage':
return $bool($value.hasNextPage!);
default:
return _superclass.$getProperty(runtime, identifier);
}
@ -226,55 +86,30 @@ class $MManga implements MManga, $Instance {
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'source':
$value.source = value.$reified;
case 'author':
$value.author = value.$reified;
case 'status':
$value.status = value.$reified;
case 'genre':
$value.genre = value.$reified;
$value.genre =
(value.$reified as List).map((e) => e.toString()).toList();
case 'imageUrl':
$value.imageUrl = value.$reified;
case 'lang':
$value.lang = value.$reified;
case 'name':
$value.name = value.$reified;
case 'link':
$value.link = value.$reified;
case 'description':
$value.description = value.$reified;
case 'baseUrl':
$value.baseUrl = value.$reified;
case 'dateFormat':
$value.dateFormat = value.$reified;
case 'dateFormatLocale':
$value.dateFormatLocale = value.$reified;
case 'apiUrl':
$value.apiUrl = value.$reified;
case 'page':
$value.page = value.$reified;
case 'query':
$value.query = value.$reified;
case 'sourceId':
$value.sourceId = value.$reified;
case 'names':
$value.names = value.$reified;
case 'chaptersDateUploads':
$value.chaptersDateUploads = value.$reified;
case 'chaptersScanlators':
$value.chaptersScanlators = value.$reified;
case 'urls':
$value.urls = value.$reified;
case 'chaptersVolumes':
$value.chaptersVolumes = value.$reified;
case 'chaptersChaps':
$value.chaptersChaps = value.$reified;
case 'images':
$value.images = value.$reified;
case 'hasNextPage':
$value.hasNextPage = value.$reified;
case 'hasError':
case 'chapters':
$value.chapters = (value.$reified as List)
.map((e) => MChapter(
dateUpload: e.dateUpload,
url: e.url,
name: e.name,
scanlator: e.scanlator))
.toList();
default:
_superclass.$setProperty(runtime, identifier, value);
}
@ -292,133 +127,53 @@ class $MManga implements MManga, $Instance {
@override
String? get name => $value.name;
@override
String? get source => $value.source;
@override
String? get link => $value.link;
@override
List<dynamic>? get genre => $value.genre;
Status? get status => $value.status;
@override
String? get lang => $value.lang;
List<MChapter>? get chapters => $value.chapters;
@override
int? get sourceId => $value.sourceId;
@override
int? get status => $value.status;
List<String>? get genre => $value.genre;
@override
set author(String? author) {}
set author(String? author) {
// implement author
}
@override
set description(String? description) {}
set description(String? description) {
// implement description
}
@override
set imageUrl(String? imageUrl) {}
set imageUrl(String? imageUrl) {
// implement imageUrl
}
@override
set link(String? link) {}
set link(String? link) {
// implement link
}
@override
set name(String? name) {}
set name(String? name) {
// implement name
}
@override
set source(String? source) {}
@override
set hasNextPage(bool? hasNextPage) {}
set genre(List<String>? genre) {
// implement genre
}
@override
List<dynamic>? get chaptersDateUploads => $value.chaptersDateUploads;
set status(Status? status) {
// implement status
}
@override
List<dynamic>? get names => $value.names;
@override
List<dynamic>? get chaptersScanlators => $value.chaptersScanlators;
@override
List<dynamic>? get urls => $value.urls;
@override
List<dynamic>? get chaptersVolumes => $value.chaptersVolumes;
@override
List<dynamic>? get chaptersChaps => $value.chaptersChaps;
@override
List<dynamic>? get images => $value.images;
@override
List<dynamic>? get statusList => $value.statusList;
@override
set chaptersDateUploads(List? chaptersDateUploads) {}
@override
set names(List? names) {}
@override
set chaptersScanlators(List? chaptersScanlators) {}
@override
set urls(List? urls) {}
@override
set genre(List? genre) {}
@override
set lang(String? lang) {}
@override
set status(int? status) {}
@override
String? get apiUrl => $value.apiUrl;
@override
String? get baseUrl => $value.baseUrl;
@override
String? get dateFormat => $value.dateFormat;
@override
String? get dateFormatLocale => $value.dateFormatLocale;
@override
bool? get hasNextPage => $value.hasNextPage;
@override
set apiUrl(String? apiUrl) {}
@override
set baseUrl(String? baseUrl) {}
@override
set dateFormat(String? dateFormat) {}
@override
set dateFormatLocale(String? dateFormatLocale) {}
@override
int? get page => $value.page;
@override
set page(int? page) {}
@override
String? get query => $value.query;
@override
set query(String? query) {}
@override
set chaptersChaps(List? chaptersChaps) {}
@override
set chaptersVolumes(List? chaptersVolumes) {}
@override
set images(List? images) {}
@override
set statusList(List? images) {}
@override
set sourceId(int? sourceId) {}
set chapters(List<MChapter>? chapters) {}
}

View file

@ -0,0 +1,87 @@
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_manga.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
class $MPages implements MPages, $Instance {
$MPages.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MPages'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: [
BridgeParameter(
'list',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MManga.$type])),
false),
BridgeParameter(
'hasNextPage',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool),
nullable: true),
true),
]))
},
fields: {
'list': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, [$MManga.$type])),
),
'hasNextPage': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.bool),
nullable: true)),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
List<$Value> list = args[0]!.$value;
return $MPages.wrap(MPages(
list: list.map((e) => e as MManga).toList(),
hasNextPage: args[1]?.$value ?? false));
}
@override
final MPages $value;
@override
MPages get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'list':
return $List.wrap($value.list);
case 'hasNextPage':
return $bool($value.hasNextPage);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
return _superclass.$setProperty(runtime, identifier, value);
}
@override
List<MManga> get list => $value.list;
@override
bool get hasNextPage => $value.hasNextPage;
@override
set hasNextPage(bool hasNextPage) {}
@override
set list(List<MManga> list) {}
}

View file

@ -0,0 +1,160 @@
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_source.dart';
class $MSource implements MSource, $Instance {
$MSource.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MSource'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: []))
},
fields: {
'id': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int))),
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'baseUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'lang': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'isFullData': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool))),
'hasCloudflare': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool))),
'dateFormat': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'dateFormatLocale': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'apiUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MSource.wrap(MSource());
}
@override
final MSource $value;
@override
MSource get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'id':
return $int($value.id!);
case 'name':
return $String($value.name!);
case 'baseUrl':
return $String($value.baseUrl!);
case 'lang':
return $String($value.lang!);
case 'isFullData':
return $bool($value.isFullData!);
case 'hasCloudflare':
return $bool($value.hasCloudflare!);
case 'dateFormat':
return $String($value.dateFormat!);
case 'dateFormatLocale':
return $String($value.dateFormatLocale!);
case 'apiUrl':
return $String($value.apiUrl!);
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 'id':
$value.id = value.$reified;
case 'name':
$value.name = value.$reified;
case 'baseUrl':
$value.baseUrl = value.$reified;
case 'lang':
$value.lang = value.$reified;
case 'isFullData':
$value.isFullData = value.$reified;
case 'hasCloudflare':
$value.hasCloudflare = value.$reified;
case 'dateFormat':
$value.dateFormat = value.$reified;
case 'dateFormatLocale':
$value.dateFormatLocale = value.$reified;
case 'apiUrl':
$value.apiUrl = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get apiUrl => $value.apiUrl;
@override
String? get baseUrl => $value.baseUrl;
@override
String? get dateFormat => $value.dateFormat;
@override
String? get dateFormatLocale => $value.dateFormatLocale;
@override
bool? get hasCloudflare => $value.hasCloudflare;
@override
int? get id => $value.id;
@override
bool? get isFullData => $value.isFullData;
@override
String? get lang => $value.lang;
@override
String? get name => $value.name;
@override
set apiUrl(String? apiUrl) {}
@override
set baseUrl(String? baseUrl) {}
@override
set dateFormat(String? dateFormat) {}
@override
set dateFormatLocale(String? dateFormatLocale) {}
@override
set hasCloudflare(bool? hasCloudflare) {}
@override
set id(int? id) {}
@override
set isFullData(bool? isFullData) {}
@override
set lang(String? lang) {}
@override
set name(String? name) {}
}

View file

@ -7,7 +7,7 @@ class $MStatus implements $Instance {
static $MStatus $wrap(Runtime runtime, $Value? target, List<$Value?> args) =>
$MStatus.wrap(args[0]!.$value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MStatus'));
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MStatus'));
static const $declaration = BridgeEnumDef($type, values: [
'ongoing',
'completed',

View file

@ -1,13 +1,13 @@
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_track.dart';
import 'package:mangayomi/models/video.dart';
class $MTrack implements MTrack, $Instance {
class $MTrack implements Track, $Instance {
$MTrack.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MTrack'));
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MTrack'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
@ -18,21 +18,21 @@ class $MTrack implements MTrack, $Instance {
// Specify class fields
fields: {
'file': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'label': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MTrack.wrap(MTrack());
return $MTrack.wrap(Track());
}
@override
final MTrack $value;
final Track $value;
@override
MTrack get $reified => $value;
Track get $reified => $value;
final $Instance _superclass;

View file

@ -1,15 +1,14 @@
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_track.dart';
import 'package:mangayomi/eval/model/m_video.dart';
import 'package:mangayomi/eval/bridge/m_track.dart';
import 'package:mangayomi/models/video.dart';
class $MVideo implements MVideo, $Instance {
class $MVideo implements Video, $Instance {
$MVideo.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'MVideo'));
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MVideo'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
@ -20,16 +19,17 @@ class $MVideo implements MVideo, $Instance {
// Specify class fields
fields: {
'url': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'quality': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'originalUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
'headers': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.mapType, [
BridgeTypeRef.type(RuntimeTypes.stringType),
BridgeTypeRef.type(RuntimeTypes.stringType)
]))),
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'headers': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.map, [
BridgeTypeRef(CoreTypes.string),
BridgeTypeRef(CoreTypes.string)
]),
nullable: true)),
'subtitles': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MTrack.$type]))),
'audios': BridgeFieldDef(BridgeTypeAnnotation(
@ -38,14 +38,14 @@ class $MVideo implements MVideo, $Instance {
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MVideo.wrap(MVideo());
return $MVideo.wrap(Video("", "", ""));
}
@override
final MVideo $value;
final Video $value;
@override
MVideo get $reified => $value;
Video get $reified => $value;
final $Instance _superclass;
@ -53,22 +53,20 @@ class $MVideo implements MVideo, $Instance {
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'url':
return $String($value.url!);
return $String($value.url);
case 'quality':
return $String($value.quality!);
return $String($value.quality);
case 'originalUrl':
return $String($value.originalUrl!);
return $String($value.originalUrl);
case 'headers':
return $Map.wrap($value.headers!);
return $Map.wrap($value.headers ?? {});
case 'subtitles':
return $List.wrap($value.subtitles!
.map((e) =>
$MTrack.wrap(MTrack(file: e.file, label: e.label)))
.map((e) => $MTrack.wrap(Track(file: e.file, label: e.label)))
.toList());
case 'audios':
return $List.wrap($value.audios!
.map((e) =>
$MTrack.wrap(MTrack(file: e.file, label: e.label)))
.map((e) => $MTrack.wrap(Track(file: e.file, label: e.label)))
.toList());
default:
@ -89,26 +87,17 @@ class $MVideo implements MVideo, $Instance {
case 'originalUrl':
$value.originalUrl = value.$reified;
case 'headers':
$value.headers = (value.$reified as Map).isNotEmpty
? (value.$reified as Map)
.map((key, value) => MapEntry(key.toString(), value.toString()))
: {};
$value.headers = (value.$reified as Map)
.map((key, value) => MapEntry(key.toString(), value.toString()));
case 'subtitles':
$value.subtitles = (value.$reified as List).isNotEmpty
? (value.$reified as List)
.map((e) => MTrack()
..file = e.file
..label = e.label)
.toList()
: [];
$value.subtitles = (value.$reified as List)
.map((e) => Track(file: e.file, label: e.label))
.toList();
case 'audios':
$value.audios = (value.$reified as List).isNotEmpty
? (value.$reified as List)
.map((e) => MTrack()
..file = e.file
..label = e.label)
.toList()
: [];
$value.audios = (value.$reified as List)
.map((e) => Track(file: e.file, label: e.label))
.toList();
default:
_superclass.$setProperty(runtime, identifier, value);
@ -116,22 +105,22 @@ class $MVideo implements MVideo, $Instance {
}
@override
String? get url => $value.url;
String get url => $value.url;
@override
List<MTrack>? get subtitles => $value.subtitles;
List<Track>? get subtitles => $value.subtitles;
@override
List<MTrack>? get audios => $value.audios;
List<Track>? get audios => $value.audios;
@override
String? get quality => $value.quality;
String get quality => $value.quality;
@override
Map<String, String>? get headers => $value.headers;
@override
String? get originalUrl => $value.originalUrl;
String get originalUrl => $value.originalUrl;
@override
set url(String? url) {}

View file

@ -0,0 +1,182 @@
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_source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/bridge/m_pages.dart';
import 'package:mangayomi/eval/bridge/m_video.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/source_provider.dart';
import 'package:mangayomi/models/video.dart';
class $MSourceProvider
with $Bridge<MSourceProvider>
implements MSourceProvider {
static $MSourceProvider $construct(
Runtime runtime, $Value? target, List<$Value?> args) =>
$MSourceProvider();
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MSourceProvider'));
static const $declaration = BridgeClassDef(
BridgeClassType($type, isAbstract: true),
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type)))
},
methods: {
'getLatestUpdates': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
false,
),
])),
'getPopular': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
false,
),
])),
'search': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'query',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
false,
),
])),
'getDetail': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MManga.$type])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
])),
'getPageList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])
])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
])),
'getVideoList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [
BridgeTypeRef(CoreTypes.list, [$MVideo.$type])
])),
params: [
BridgeParameter(
'sourceInfo',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
])),
},
bridge: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MSourceProvider();
}
@override
$Value? $bridgeGet(String identifier) {
throw UnimplementedError();
}
@override
void $bridgeSet(String identifier, $Value value) {
throw UnimplementedError();
}
@override
Future<MManga> getDetail(MSource sourceInfo, String url) async =>
await $_invoke('getDetail', [$MSource.wrap(sourceInfo), $String(url)]);
@override
Future<MPages> getLatestUpdates(MSource sourceInfo, int page) async =>
await $_invoke(
'getLatestUpdates', [$MSource.wrap(sourceInfo), $int(page)]);
@override
Future<MPages> getPopular(MSource sourceInfo, int page) async =>
await $_invoke('getPopular', [$MSource.wrap(sourceInfo), $int(page)]);
@override
Future<MPages> search(MSource sourceInfo, String query, int page) async =>
await $_invoke(
'search', [$MSource.wrap(sourceInfo), $String(query), $int(page)]);
@override
Future<List<String>> getPageList(MSource sourceInfo, String url) async {
final res = await $_invoke(
'getPageList', [$MSource.wrap(sourceInfo), $String(url)]);
if (res is $List) {
return res.$reified.map((e) => e as String).toList();
}
return res;
}
@override
Future<List<Video>> getVideoList(MSource sourceInfo, String url) async {
final res = await $_invoke(
'getVideoList', [$MSource.wrap(sourceInfo), $String(url)]);
if (res is $List) {
return res.$reified.map((e) => e as Video).toList();
}
return res;
}
}

View file

@ -1,25 +1,31 @@
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_bridge.dart';
import 'package:mangayomi/eval/bridge/m_chapter.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/bridge/m_pages.dart';
import 'package:mangayomi/eval/bridge/m_source.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';
import 'package:mangayomi/eval/bridge/m_bridge.dart';
import 'package:mangayomi/eval/bridge/source_provider.dart';
import 'package:mangayomi/eval/utils.dart';
Uint8List compilerEval(String sourceCode) {
final compiler = Compiler();
Uint8List compilerEval(String code) {
late Compiler compiler = Compiler();
compiler.defineBridgeClasses([
$MBridge.$declaration,
$MManga.$declaration,
$MSourceProvider.$declaration,
$MPages.$declaration,
$MSource.$declaration,
$MVideo.$declaration,
$MTrack.$declaration,
$MHttpResponse.$declaration
$MChapter.$declaration,
$MManga.$declaration,
]);
compiler.defineBridgeEnum($MStatus.$declaration);
final program = compiler.compile({
'mangayomi': {'source_code.dart': sourceCode, 'utils.dart': utils}
'mangayomi': {'main.dart': code, 'utils.dart': utils}
});
final bytecode = program.write();

View file

@ -10,7 +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/models/manga.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';
@ -206,36 +206,10 @@ class MBridge {
}
}
///A list utility function
static List listParse(List value, int type) {
List<dynamic> val = [];
for (var element in value) {
if (element is $Value) {
val.add(element.$reified.toString());
} else {
val.add(element);
}
}
if (type == 3) {
return val.toSet().toList();
} else if (type == 1) {
return [val.first];
} else if (type == 2) {
return [val.last];
} else if (type == 4) {
return val.where((element) => element.toString().isNotEmpty).toList();
} else if (type == 5) {
return val.reversed.toList();
} else if (type == 6) {
return [val.join()];
}
return val;
}
///Convert serie status to int
///[status] contains the current status of the serie
///[statusList] contains a list of map of many static status
static int parseStatus(String status, List statusList) {
static Status parseStatus(String status, List statusList) {
for (var element in statusList) {
Map statusMap = {};
if (element is $Map<$Value, $Value>) {
@ -248,11 +222,18 @@ class MBridge {
.toString()
.toLowerCase()
.contains(status.toLowerCase().trim().trimLeft().trimRight())) {
return element.value as int;
return switch (element.value as int) {
0 => Status.ongoing,
1 => Status.completed,
2 => Status.onHiatus,
3 => Status.canceled,
4 => Status.publishingFinished,
_ => Status.unknown,
};
}
}
}
return 5;
return Status.unknown;
}
///Get Html content via webview when http request not working
@ -468,7 +449,7 @@ class MBridge {
}
//Parse a list of dates to millisecondsSinceEpoch
static List listParseDateTime(
static List parseDates(
List value, String dateFormat, String dateFormatLocale) {
List<dynamic> val = [];
for (var element in value) {
@ -512,73 +493,11 @@ class MBridge {
return regCustomMatcher(expression, source, group);
}
//Utility to parse $int to int
static int intParse(String value) {
return int.parse(value);
}
//Utility to check if list contains a value
static bool listContain(List value, String element) {
List<dynamic> val = [];
for (var element in value) {
val.add(element.$reified);
}
return val.contains(element);
}
//Http request for MultiparFormData
static Future<String> httpMultiparFormData(String url, int method) async {
//http request and also webview
static Future<String> http(String method, String datas) async {
try {
hp.StreamedResponse? res;
String result = "";
final headersMap = jsonDecode(url)["headers"] as Map?;
final fieldsMap = jsonDecode(url)["fields"] as Map?;
Map<String, String> fields = {};
if (fieldsMap != null) {
fields = fieldsMap
.map((key, value) => MapEntry(key.toString(), value.toString()));
}
Map<String, String> headers = {};
if (headersMap != null) {
headers = headersMap
.map((key, value) => MapEntry(key.toString(), value.toString()));
}
var request = hp.MultipartRequest(
method == 0
? 'GET'
: method == 1
? 'POST'
: method == 2
? 'PUT'
: 'DELETE',
Uri.parse(url));
request.fields.addAll(fields);
request.headers.addAll(headers);
res = await request.send();
if (res.statusCode != 200) {
result = "400";
} else if (res.statusCode == 200) {
result = await res.stream.bytesToString();
} else {
result = res.reasonPhrase!;
}
return result;
} catch (e) {
botToast(e.toString());
return "";
}
}
//http request and also webview
static Future<MHttpResponse> http(String method, String datas) async {
try {
hp.StreamedResponse? res;
//Get headers
final headersMap = jsonDecode(datas)["headers"] as Map?;
@ -606,6 +525,13 @@ 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));
@ -616,25 +542,22 @@ class MBridge {
request.headers.addAll(headers);
res = await request.send();
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 {
httpResponse = MHttpResponse(
body: res.statusCode == 200
? await res.stream.bytesToString()
: res.reasonPhrase,
statusCode: res.statusCode,
hasError: res.statusCode != 200);
}
return httpResponse;
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();
} else {
result = res.reasonPhrase!;
}
// log(result);
return result;
} catch (e) {
botToast(e.toString());
return MHttpResponse(body: e.toString(), statusCode: 0, hasError: true);
return "";
}
}
@ -969,6 +892,7 @@ final List<String> _dateFormats = [
"MMMM d, yyyy",
"MMM dd,yyyy"
];
void botToast(String title) {
BotToast.showSimpleNotification(
onlyOne: true,

View file

@ -0,0 +1,10 @@
class MChapter {
String? name;
String? url;
String? dateUpload;
String? scanlator;
MChapter({this.name, this.url, this.dateUpload, this.scanlator});
}

View file

@ -1,3 +1,6 @@
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/models/manga.dart';
class MManga {
String? name;
@ -9,62 +12,32 @@ class MManga {
String? author;
int? status;
Status? status;
List<dynamic>? genre = [];
List<String>? genre;
String? source;
List<MChapter>? chapters;
String? lang;
String? baseUrl;
String? dateFormat;
String? dateFormatLocale;
String? apiUrl;
int? page;
String? query;
int? sourceId;
bool? hasNextPage;
List<dynamic>? names;
List<dynamic>? urls;
List<dynamic>? chaptersScanlators;
List<dynamic>? chaptersDateUploads;
List<dynamic>? chaptersVolumes;
List<dynamic>? chaptersChaps;
List<dynamic>? images;
List<dynamic>? statusList;
MManga(
{this.source = "",
this.author = "",
{this.author,
this.genre,
this.imageUrl = "",
this.lang = "",
this.link = "",
this.name = "",
this.status = 0,
this.description = "",
this.apiUrl = "",
this.baseUrl = "",
this.dateFormat = "",
this.dateFormatLocale = "",
this.page = 1,
this.query = "",
this.sourceId = 0,
this.names,
this.chaptersDateUploads,
this.chaptersScanlators,
this.urls,
this.chaptersVolumes,
this.chaptersChaps,
this.images,
this.statusList,
this.hasNextPage = true});
this.imageUrl,
this.link,
this.name,
this.status = Status.unknown,
this.description,
this.chapters});
// Manga toManga(Manga? manga, String source) {
// return Manga(
// source: manga?.source ?? source,
// author: author,
// genre: genre,
// imageUrl: imageUrl,
// lang: "lang",
// link: link,
// name: name,
// status: status!,
// description: description);
// }
}

View file

@ -0,0 +1,7 @@
import 'package:mangayomi/eval/model/m_manga.dart';
class MPages {
List<MManga> list;
bool hasNextPage;
MPages({required this.list, this.hasNextPage = false});
}

View file

@ -0,0 +1,30 @@
class MSource {
int? id;
String? name;
String? baseUrl;
String? lang;
bool? isFullData;
bool? hasCloudflare;
String? dateFormat;
String? dateFormatLocale;
String? apiUrl;
MSource(
{this.id,
this.name,
this.baseUrl,
this.lang,
this.isFullData,
this.hasCloudflare,
this.dateFormat,
this.dateFormatLocale,
this.apiUrl});
}

View file

@ -1,6 +0,0 @@
class MTrack {
String? file;
String? label;
MTrack({this.file, this.label});
}

View file

@ -1,17 +1,18 @@
import 'package:mangayomi/eval/model/m_track.dart';
class MVideo {
String? url;
String? quality;
String? originalUrl;
String url;
String quality;
String originalUrl;
Map<String, String>? headers;
List<MTrack>? subtitles;
List<MTrack>? audios;
MVideo(
{this.url,
this.quality,
this.originalUrl,
this.headers,
this.subtitles,
this.audios});
MVideo(this.url, this.quality, this.originalUrl,
{this.headers, this.subtitles, this.audios});
}
class MTrack {
String? file;
String? label;
MTrack({this.file, this.label});
}

View file

@ -0,0 +1,22 @@
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/video.dart';
abstract class MSourceProvider {
MSourceProvider();
Future<MPages> getLatestUpdates(MSource sourceInfo, int page);
Future<MPages> getPopular(MSource sourceInfo, int page);
Future<MPages> search(MSource sourceInfo, String query, int page);
Future<MManga> getDetail(MSource sourceInfo, String url);
Future<List<String>> getPageList(MSource sourceInfo, String url);
Future<List<Video>> getVideoList(MSource sourceInfo, String url);
// FilterList getFilterList();
}

View file

@ -1,115 +1,118 @@
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_bridge.dart';
import 'package:mangayomi/eval/bridge/m_chapter.dart';
import 'package:mangayomi/eval/bridge/m_pages.dart';
import 'package:mangayomi/eval/bridge/m_status.dart';
import 'package:mangayomi/eval/bridge/source_provider.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/bridge/m_track.dart';
import 'package:mangayomi/eval/bridge/m_video.dart';
import 'package:mangayomi/eval/bridge/m_bridge.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
Runtime runtimeEval(Uint8List bytecode) {
final runtime = Runtime(bytecode.buffer.asByteData());
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.', $MBridge.$construct,
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MSourceProvider.', $MSourceProvider.$construct,
isBridge: true);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MManga.', $MManga.$new);
'package:mangayomi/bridge_lib.dart', 'MBridge.', $MBridge.$construct,
isBridge: true);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MVideo.', $MVideo.$new);
'package:mangayomi/bridge_lib.dart', 'MChapter.', $MChapter.$new);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MTrack.', $MTrack.$new);
'package:mangayomi/bridge_lib.dart', 'MManga.', $MManga.$new);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart', 'MPages.', $MPages.$new);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart', 'MSource.', $MSource.$new);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart', 'MVideo.', $MVideo.$new);
runtime.registerBridgeFunc(
'package:mangayomi/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);
'package:mangayomi/bridge_lib.dart', 'MStatus', $MStatus.$values);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.http', $MBridge.$http);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.listParseDateTime', $MBridge.$listParseDateTime);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.httpMultiparFormData', $MBridge.$httpMultiparFormData);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'package:mangayomi/bridge_lib.dart', 'MBridge.http', $MBridge.$http);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.parseDates', $MBridge.$parseDates);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.gogoCdnExtractor', $MBridge.$gogoCdnExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.doodExtractor', $MBridge.$doodExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.rapidCloudExtractor', $MBridge.$rapidCloudExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.encryptAESCryptoJS', $MBridge.$encryptAESCryptoJS);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.decryptAESCryptoJS', $MBridge.$decryptAESCryptoJS);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.streamTapeExtractor', $MBridge.$streamTapeExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.streamWishExtractor', $MBridge.$streamWishExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.filemoonExtractor', $MBridge.$filemoonExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.mp4UploadExtractor', $MBridge.$mp4UploadExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.myTvExtractor', $MBridge.$myTvExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.sendVidExtractor', $MBridge.$sendVidExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.sibnetExtractor', $MBridge.$sibnetExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.okruExtractor', $MBridge.$okruExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.yourUploadExtractor', $MBridge.$yourUploadExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.voeExtractor', $MBridge.$voeExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.vidBomExtractor', $MBridge.$vidBomExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.streamlareExtractor', $MBridge.$streamlareExtractor);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.jsonPathToString', $MBridge.$jsonPathToString);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.toVideo', $MBridge.$toVideo);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.jsonPathToList', $MBridge.$jsonPathToList);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.jsonDecodeToList', $MBridge.$jsonDecodeToList);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.jsonPathToMap', $MBridge.$jsonPathToMap);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.parseStatus', $MBridge.$parseStatus);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.getMapValue', $MBridge.$getMapValue);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.regExp', $MBridge.$regExp);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'package:mangayomi/bridge_lib.dart', 'MBridge.regExp', $MBridge.$regExp);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.parseChapterDate', $MBridge.$parseChapterDate);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.substringAfter', $MBridge.$substringAfter);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.substringAfterLast', $MBridge.$substringAfterLast);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.substringBeforeLast', $MBridge.$substringBeforeLast);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.substringBefore', $MBridge.$substringBefore);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.evalJs', $MBridge.$evalJs);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.intParse', $MBridge.$intParse);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.listParse', $MBridge.$listParse);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'package:mangayomi/bridge_lib.dart', 'MBridge.evalJs', $MBridge.$evalJs);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.getHtmlViaWebview', $MBridge.$getHtmlViaWebview);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'MBridge.listContain', $MBridge.$listContain);
runtime.registerBridgeFunc(
'package:bridge_lib/bridge_lib.dart', 'MBridge.xpath', $MBridge.$xpath);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
'package:mangayomi/bridge_lib.dart', 'MBridge.xpath', $MBridge.$xpath);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.querySelector', $MBridge.$querySelector);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.deobfuscateJsPassword', $MBridge.$deobfuscateJsPassword);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.querySelectorAll', $MBridge.$querySelectorAll);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.cryptoHandler', $MBridge.$cryptoHandler);
runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MBridge.sortMapList', $MBridge.$sortMapList);
runtime.setup();
return runtime;

View file

@ -1,5 +1,5 @@
const utils = r'''
import 'package:bridge_lib/bridge_lib.dart';
import 'package:mangayomi/bridge_lib.dart';
class Substring {
final String _text;
@ -9,6 +9,10 @@ class Substring {
return Substring(MBridge.substringAfter(_text,pattern));
}
Substring substringAfterLast(String pattern) {
return Substring(MBridge.substringAfterLast(_text,pattern));
}
Substring substringBefore(String pattern) {
return Substring(MBridge.substringBefore(_text,pattern));
}

View file

@ -1,7 +1,5 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/source.dart';
part 'manga.g.dart';
@collection
@ -66,30 +64,6 @@ class Manga {
this.lastRead = 0,
this.isLocalArchive = false,
this.customCoverImage});
MManga toMManga(Source source) {
return MManga(
name: name,
link: link,
genre: genre,
author: author,
status: switch (status) {
Status.ongoing => 0,
Status.completed => 1,
Status.onHiatus => 2,
Status.canceled => 3,
Status.publishingFinished => 4,
_ => 5,
},
description: description,
imageUrl: imageUrl,
baseUrl: source.baseUrl,
apiUrl: source.apiUrl,
lang: lang,
dateFormat: source.dateFormat,
source: source.name,
dateFormatLocale: source.dateFormatLocale);
}
}
enum Status {

View file

@ -1,5 +1,5 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_source.dart';
part 'source.g.dart';
@collection
@ -93,16 +93,15 @@ class Source {
isFullData = json['isFullData'] ?? false;
appMinVerReq = json['appMinVerReq'];
}
MManga toMManga({int page = 1, String? query = "", String link = ""}) {
return MManga(
page: page,
query: query,
link: link,
MSource toMSource() {
return MSource(
id: id,
name: name,
hasCloudflare: hasCloudflare,
isFullData: isFullData,
lang: lang,
baseUrl: baseUrl,
apiUrl: apiUrl,
sourceId: id,
source: name,
dateFormat: dateFormat,
dateFormatLocale: dateFormatLocale);
}

View file

@ -1,18 +1,18 @@
class Video {
final String url;
final String quality;
final String originalUrl;
final Map<String, String>? headers;
final List<Track>? subtitles;
final List<Track>? audios;
String url;
String quality;
String originalUrl;
Map<String, String>? headers;
List<Track>? subtitles;
List<Track>? audios;
Video(this.url, this.quality, this.originalUrl,
{this.headers, this.subtitles, this.audios});
}
class Track {
final String? file;
final String? label;
String? file;
String? label;
Track(this.file, this.label);
Track({this.file, this.label});
}

View file

@ -2,9 +2,9 @@ import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/modules/manga/home/manga_home_screen.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/router/router.dart';
@ -149,13 +149,13 @@ class SourceSearchScreen extends ConsumerWidget {
error: (error, stackTrace) =>
Center(child: Text(error.toString())),
data: (data) {
if (data.isNotEmpty) {
if (data!.list.isNotEmpty) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: data.length,
itemCount: data.list.length,
itemBuilder: (context, index) {
return MangaGlobalImageCard(
manga: data[index]!,
manga: data.list[index],
source: source,
);
},
@ -192,9 +192,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
@override
Widget build(BuildContext context) {
super.build(context);
final getMangaDetail = widget.manga
..lang = widget.source.lang
..source = widget.source.name;
final getMangaDetail = widget.manga;
final l10n = l10nLocalizations(context)!;
return GestureDetector(
onTap: () async {
@ -203,14 +201,15 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
getManga: getMangaDetail,
lang: widget.source.lang!,
isManga: widget.source.isManga ?? true,
useMaterialRoute: true);
useMaterialRoute: true,
source: widget.source.name!);
},
child: StreamBuilder(
stream: isar.mangas
.filter()
.langEqualTo(widget.source.lang)
.nameEqualTo(getMangaDetail.name)
.sourceEqualTo(getMangaDetail.source)
.sourceEqualTo(widget.source.name)
.watch(fireImmediately: true),
builder: (context, snapshot) {
return Padding(
@ -229,8 +228,8 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
borderRadius: BorderRadius.circular(5),
child: cachedNetworkImage(
headers: ref.watch(headersProvider(
source: getMangaDetail.source!,
lang: getMangaDetail.lang!)),
source: widget.source.name!,
lang: widget.source.lang!)),
imageUrl: snapshot.hasData &&
snapshot.data!.isNotEmpty &&
snapshot.data!.first.imageUrl != null

View file

@ -1671,7 +1671,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
: null,
context: context,
lang: randomManga.lang!,
mangaM: randomManga);
mangaM: randomManga,
source: randomManga.source!);
});
} else {
_importLocal(context, widget.isManga);
@ -1730,7 +1731,8 @@ _importLocal(BuildContext context, bool isManga) {
MainAxisAlignment.spaceEvenly,
children: [
const Icon(Icons.archive_outlined),
Text("${l10n.import_files} ( ${isManga?".zip, .cbz":".mp4, .mkv, .avi, and more"} )",
Text(
"${l10n.import_files} ( ${isManga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )",
style: TextStyle(
color: Theme.of(context)
.textTheme

View file

@ -76,7 +76,8 @@ class LibraryGridViewWidget extends StatelessWidget {
archiveId: isLocalArchive ? entry.id : null,
context: context,
lang: entry.lang!,
mangaM: entry);
mangaM: entry,
source: entry.source!);
}
},
onLongPress: () {

View file

@ -56,7 +56,8 @@ class LibraryListViewWidget extends StatelessWidget {
archiveId: isLocalArchive ? entry.id : null,
context: context,
lang: entry.lang!,
mangaM: entry);
mangaM: entry,
source: entry.source!);
}
},
onLongPress: () {

View file

@ -18,12 +18,10 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
MManga getManga;
try {
getManga = await ref.watch(
getMangaDetailProvider(manga: manga.toMManga(source!), source: source)
.future);
getMangaDetailProvider(url: manga.link!, source: source!).future);
} catch (_) {
return;
}
manga
..imageUrl = getManga.imageUrl ?? manga.imageUrl
..name = getManga.name?.trim().trimLeft().trimRight() ?? manga.name
@ -36,19 +34,13 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
[]
..author =
getManga.author?.trim().trimLeft().trimRight() ?? manga.author ?? ""
..status = switch (getManga.status) {
0 => Status.ongoing,
1 => Status.completed,
2 => Status.onHiatus,
3 => Status.canceled,
4 => Status.publishingFinished,
_ => Status.unknown,
}
..status =
getManga.status == Status.unknown ? manga.status : getManga.status!
..description = getManga.description?.trim().trimLeft().trimRight() ??
manga.description ??
""
..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link
..source = getManga.source?.trim().trimLeft().trimRight() ?? manga.source
..source = manga.source
..lang = manga.lang
..isManga = source.isManga
..lastUpdate = DateTime.now().millisecondsSinceEpoch;
@ -61,36 +53,21 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
manga.lastUpdate = DateTime.now().millisecondsSinceEpoch;
List<Chapter> chapters = [];
if (getManga.names!.isNotEmpty &&
getManga.names!.length > manga.chapters.length) {
int newChapsIndex = getManga.names!.length - manga.chapters.length;
final chaps = getManga.chapters;
if (chaps!.isNotEmpty && chaps.length > manga.chapters.length) {
int newChapsIndex = chaps.length - manga.chapters.length;
manga.lastUpdate = DateTime.now().millisecondsSinceEpoch;
for (var i = 0; i < newChapsIndex; i++) {
String title = "";
String scanlator = "";
if (getManga.chaptersChaps != null &&
getManga.chaptersVolumes != null) {
title = beautifyChapterName(getManga.chaptersVolumes![i],
getManga.chaptersChaps![i], getManga.names![i], getManga.lang!);
} else {
title = getManga.names![i].trim().trimLeft().trimRight();
}
if (getManga.chaptersScanlators != null) {
scanlator = getManga.chaptersScanlators![i]
.toString()
.replaceAll(']', "")
.replaceAll("[", "");
}
final chapter = Chapter(
name: title,
url: getManga.urls![i].trim().trimLeft().trimRight(),
dateUpload: getManga.chaptersDateUploads!.isEmpty
name: chaps[i].name!,
url: chaps[i].url!.trim().trimLeft().trimRight(),
dateUpload: chaps[i].dateUpload == null
? DateTime.now().millisecondsSinceEpoch.toString()
: getManga.chaptersDateUploads![i],
scanlator: scanlator,
: chaps[i].dateUpload.toString(),
scanlator: chaps[i].scanlator ?? '',
)..manga.value = manga;
chapters.add(chapter);
chapters.add(chapter);
}
}
if (chapters.isNotEmpty) {
@ -101,40 +78,3 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
}
});
}
String beautifyChapterName(String vol, String chap, String title, String lang) {
String result = "";
vol = vol.trim().trimLeft().trimRight();
chap = chap.trim().trimLeft().trimRight();
title = title.trim().trimLeft().trimRight();
if (vol != "null" && vol.isNotEmpty) {
if (chap != "null" && chap.isEmpty) {
result += "Volume $vol ";
} else {
result += "Vol. $vol ";
}
}
if (chap != "null" && chap.isNotEmpty) {
if (vol != "null" && vol.isEmpty) {
if (lang != "null" && lang == "fr") {
result += "Chapitre $chap";
} else {
result += "Chapter $chap";
}
} else {
result += "Ch. $chap ";
}
}
if (title != "null" && title.isNotEmpty) {
if (chap != "null" && chap.isEmpty) {
result += title;
} else {
result += " : $title";
}
}
return result;
}

View file

@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$updateMangaDetailHash() => r'3433a9fed78f2e288244dc46485bbeeda644ae93';
String _$updateMangaDetailHash() => r'1e436b150c789357686ac93d90a3bf83f6044ab8';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -2,8 +2,9 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/get_latest_updates_manga.dart';
import 'package:mangayomi/services/get_popular_manga.dart';
@ -53,8 +54,8 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
];
}
Future<List<MManga?>> _loadMore() async {
List<MManga?> mangaResList = [];
Future<MPages?> _loadMore() async {
MPages? mangaResList;
if (_isLoading) {
if (widget.source.isFullData!) {
@ -91,7 +92,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
late final _textEditingController = TextEditingController(text: widget.query);
late String _query = widget.query;
late bool _isSearch = widget.isSearch;
AsyncValue<List<MManga?>>? _getManga;
AsyncValue<MPages?>? _getManga;
int _length = 0;
@override
Widget build(BuildContext context) {
@ -215,7 +216,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
child: _getManga!.when(
data: (data) {
Widget buildProgressIndicator() {
return !(data.isNotEmpty && (data.last!.hasNextPage ?? true))
return !(data!.list.isNotEmpty && (data.hasNextPage))
? Container()
: _isLoading
? const Center(
@ -244,7 +245,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
_loadMore().then((value) {
if (mounted) {
setState(() {
data.addAll(value);
data.list.addAll(value!.list);
_isLoading = false;
});
}
@ -266,13 +267,13 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
: Container();
}
if (data.isEmpty) {
if (data!.list.isEmpty) {
return Center(child: Text(l10n.no_result));
}
_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
if (data.isNotEmpty && (data.last!.hasNextPage ?? true)) {
if (data.list.isNotEmpty && (data.hasNextPage)) {
if (mounted) {
setState(() {
_isLoading = true;
@ -281,7 +282,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
_loadMore().then((value) {
if (mounted) {
setState(() {
data.addAll(value);
data.list.addAll(value!.list);
_isLoading = false;
});
}
@ -290,9 +291,11 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
}
});
_length = widget.source.isFullData!
? _fullDataLength
: data.list.length;
_length =
widget.source.isFullData! ? _fullDataLength : data.length;
_length = (data.length < _length ? data.length : _length);
(data.list.length < _length ? data.list.length : _length);
return Padding(
padding: const EdgeInsets.only(top: 10),
child: Column(
@ -307,7 +310,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
}
return MangaHomeImageCard(
isManga: widget.source.isManga ?? true,
manga: data[index]!,
manga: data.list[index],
source: widget.source,
);
},
@ -419,10 +422,8 @@ class _MangaHomeImageCardState extends ConsumerState<MangaHomeImageCard>
super.build(context);
return MangaImageCardWidget(
getMangaDetail: widget.manga
..lang = widget.source.lang
..source = widget.source.name,
lang: widget.source.lang!,
getMangaDetail: widget.manga,
source: widget.source,
isManga: widget.isManga,
);
}

View file

@ -4,10 +4,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/manga/detail/manga_detail_main.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/router/router.dart';
@ -18,13 +19,13 @@ import 'package:mangayomi/modules/widgets/bottom_text_widget.dart';
import 'package:mangayomi/modules/widgets/cover_view_widget.dart';
class MangaImageCardWidget extends ConsumerWidget {
final String lang;
final Source source;
final bool isManga;
final MManga? getMangaDetail;
const MangaImageCardWidget(
{required this.lang,
{required this.source,
super.key,
required this.getMangaDetail,
required this.isManga});
@ -35,9 +36,9 @@ class MangaImageCardWidget extends ConsumerWidget {
return StreamBuilder(
stream: isar.mangas
.filter()
.langEqualTo(lang)
.langEqualTo(source.lang)
.nameEqualTo(getMangaDetail!.name)
.sourceEqualTo(getMangaDetail!.source)
.sourceEqualTo(source.name)
.watch(fireImmediately: true),
builder: (context, snapshot) {
return CoverViewWidget(
@ -54,14 +55,14 @@ class MangaImageCardWidget extends ConsumerWidget {
? toImgUrl(snapshot.data!.first.imageUrl!)
: toImgUrl(getMangaDetail!.imageUrl!),
headers: ref.watch(headersProvider(
source: getMangaDetail!.source!,
lang: getMangaDetail!.lang!)),
source: source.name!, lang: source.lang!)),
),
onTap: () {
pushToMangaReaderDetail(
context: context,
getManga: getMangaDetail!,
lang: lang,
lang: source.lang!,
source: source.name!,
isManga: isManga);
},
children: [
@ -106,6 +107,7 @@ void pushToMangaReaderDetail(
{MManga? getManga,
required String lang,
required BuildContext context,
required String source,
int? archiveId,
Manga? mangaM,
bool? isManga,
@ -116,23 +118,12 @@ void pushToMangaReaderDetail(
Manga(
imageUrl: getManga!.imageUrl,
name: getManga.name!.trim().trimLeft().trimRight(),
genre: getManga.genre == null
? []
: getManga.genre!.map((e) => e.toString()).toList(),
genre: getManga.genre?.map((e) => e.toString()).toList() ?? [],
author: getManga.author ?? "",
status: getManga.status == null
? Status.unknown
: switch (getManga.status) {
0 => Status.ongoing,
1 => Status.completed,
2 => Status.onHiatus,
3 => Status.canceled,
4 => Status.publishingFinished,
_ => Status.unknown,
},
status: getManga.status ?? Status.unknown,
description: getManga.description ?? "",
link: getManga.link,
source: getManga.source,
source: source,
lang: lang,
lastUpdate: 0,
isManga: isManga ?? true);

View file

@ -77,7 +77,8 @@ class RapidCloudExtractor {
subtitles: data.tracks != null && data.tracks!.isEmpty
? []
: data.tracks!
.map((e) => Track(e.file ?? "", e.label ?? ""))
.map((e) =>
Track(file: e.file ?? "", label: e.label ?? ""))
.toList()));
}
} else {
@ -85,7 +86,7 @@ class RapidCloudExtractor {
subtitles: data.tracks != null && data.tracks!.isEmpty
? []
: data.tracks!
.map((e) => Track(e.file ?? "", e.label ?? ""))
.map((e) => Track(file: e.file ?? "", label: e.label ?? ""))
.toList()));
}
return videoList;

View file

@ -1,9 +1,6 @@
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/model/source_provider.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/video.dart';
@ -22,7 +19,6 @@ Future<(List<Video>, bool)> getAnimeServers(
final storageProvider = StorageProvider();
final mangaDirectory = await storageProvider.getMangaMainDirectory(episode);
final isLocalArchive = episode.manga.value!.isLocalArchive!;
List<Video> video = [];
final mp4animePath = "${mangaDirectory!.path}${episode.name}.mp4";
if (await File(mp4animePath).exists() || isLocalArchive) {
final path = isLocalArchive ? episode.archivePath : mp4animePath;
@ -35,50 +31,9 @@ Future<(List<Video>, bool)> getAnimeServers(
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [$MManga.wrap(source.toMManga(link: episode.url!))];
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart', 'getVideoList');
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);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
final dd = (await (res as MSourceProvider)
.getVideoList(source.toMSource(), episode.url!));
return (dd, false);
}

View file

@ -6,7 +6,7 @@ part of 'get_anime_servers.dart';
// RiverpodGenerator
// **************************************************************************
String _$getAnimeServersHash() => r'9bac62e3b98438831ac0331a7725fee7127b5f60';
String _$getAnimeServersHash() => r'52f2430695b5d250be23d18725ae21ca5753376c';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,11 +1,8 @@
import 'dart:async';
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/eval/model/source_provider.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/settings.dart';
@ -67,33 +64,10 @@ Future<GetChapterUrlModel> getChapterUrl(
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
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) {
pageUrls.add(element.$reified);
} else {
pageUrls.add(element);
}
}
} else {
for (var element in res) {
if (element is $Value) {
pageUrls.add(element.$reified);
} else {
pageUrls.add(element);
}
}
}
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
pageUrls = (await (res as MSourceProvider)
.getPageList(source.toMSource(), chapter.url!));
}
}

View file

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

View file

@ -1,61 +1,32 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/source_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_latest_updates_manga.g.dart';
@riverpod
Future<List<MManga?>> getLatestUpdatesManga(
Future<MPages?> getLatestUpdatesManga(
GetLatestUpdatesMangaRef ref, {
required Source source,
required int page,
}) async {
List<MManga?>? latestUpdatesManga = [];
MPages? latestUpdatesManga;
try {
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [$MManga.wrap(source.toMManga(page: page))];
var res = await runtime.executeLib(
'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 = [];
for (var i = 0; i < value.names!.length; i++) {
MManga newMangaa = MManga(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images!.isEmpty ? "" : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,
sourceId: value.sourceId,
dateFormat: value.dateFormat,
hasNextPage: value.hasNextPage ?? true,
dateFormatLocale: value.dateFormatLocale);
newManga.add(newMangaa);
}
latestUpdatesManga = newManga;
} else {
latestUpdatesManga =
(res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
latestUpdatesManga = await (res as MSourceProvider)
.getLatestUpdates(source.toMSource(), 1);
} catch (e) {
throw e.toString();
throw Exception(e);
}
return latestUpdatesManga;

View file

@ -7,7 +7,7 @@ part of 'get_latest_updates_manga.dart';
// **************************************************************************
String _$getLatestUpdatesMangaHash() =>
r'1d73d374c00305d86e3a62ea762367391a01b093';
r'18b028e5a9dd359c19f1850819f0a46e50c0f27d';
/// Copied from Dart SDK
class _SystemHash {
@ -35,7 +35,7 @@ class _SystemHash {
const getLatestUpdatesMangaProvider = GetLatestUpdatesMangaFamily();
/// See also [getLatestUpdatesManga].
class GetLatestUpdatesMangaFamily extends Family<AsyncValue<List<MManga?>>> {
class GetLatestUpdatesMangaFamily extends Family<AsyncValue<MPages?>> {
/// See also [getLatestUpdatesManga].
const GetLatestUpdatesMangaFamily();
@ -76,8 +76,7 @@ class GetLatestUpdatesMangaFamily extends Family<AsyncValue<List<MManga?>>> {
}
/// See also [getLatestUpdatesManga].
class GetLatestUpdatesMangaProvider
extends AutoDisposeFutureProvider<List<MManga?>> {
class GetLatestUpdatesMangaProvider extends AutoDisposeFutureProvider<MPages?> {
/// See also [getLatestUpdatesManga].
GetLatestUpdatesMangaProvider({
required Source source,
@ -117,7 +116,7 @@ class GetLatestUpdatesMangaProvider
@override
Override overrideWith(
FutureOr<List<MManga?>> Function(GetLatestUpdatesMangaRef provider) create,
FutureOr<MPages?> Function(GetLatestUpdatesMangaRef provider) create,
) {
return ProviderOverride(
origin: this,
@ -135,7 +134,7 @@ class GetLatestUpdatesMangaProvider
}
@override
AutoDisposeFutureProviderElement<List<MManga?>> createElement() {
AutoDisposeFutureProviderElement<MPages?> createElement() {
return _GetLatestUpdatesMangaProviderElement(this);
}
@ -156,7 +155,7 @@ class GetLatestUpdatesMangaProvider
}
}
mixin GetLatestUpdatesMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
mixin GetLatestUpdatesMangaRef on AutoDisposeFutureProviderRef<MPages?> {
/// The parameter `source` of this provider.
Source get source;
@ -165,7 +164,7 @@ mixin GetLatestUpdatesMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
}
class _GetLatestUpdatesMangaProviderElement
extends AutoDisposeFutureProviderElement<List<MManga?>>
extends AutoDisposeFutureProviderElement<MPages?>
with GetLatestUpdatesMangaRef {
_GetLatestUpdatesMangaProviderElement(super.provider);

View file

@ -1,9 +1,8 @@
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';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/source_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -12,7 +11,7 @@ part 'get_manga_detail.g.dart';
@riverpod
Future<MManga> getMangaDetail(
GetMangaDetailRef ref, {
required MManga manga,
required String url,
required Source source,
}) async {
MManga? mangadetail;
@ -20,19 +19,13 @@ Future<MManga> getMangaDetail(
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [$MManga.wrap(manga)];
var res = await runtime.executeLib('package:mangayomi/source_code.dart',
source.isManga! ? 'getMangaDetail' : 'getAnimeDetail');
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
try {
mangadetail =
await (res as MSourceProvider).getDetail(source.toMSource(), url);
} catch (e) {
throw Exception(e);
}
if (res is $MManga) {
final value = res.$reified;
mangadetail = value;
}
return mangadetail!;
return mangadetail;
}

View file

@ -6,7 +6,7 @@ part of 'get_manga_detail.dart';
// RiverpodGenerator
// **************************************************************************
String _$getMangaDetailHash() => r'33da4cfb298929d814fdda8ebece1a0f3474c5d2';
String _$getMangaDetailHash() => r'eb7a5bd7ba691d3bac1edc50c5d1e3edc8be89f8';
/// Copied from Dart SDK
class _SystemHash {
@ -40,11 +40,11 @@ class GetMangaDetailFamily extends Family<AsyncValue<MManga>> {
/// See also [getMangaDetail].
GetMangaDetailProvider call({
required MManga manga,
required String url,
required Source source,
}) {
return GetMangaDetailProvider(
manga: manga,
url: url,
source: source,
);
}
@ -54,7 +54,7 @@ class GetMangaDetailFamily extends Family<AsyncValue<MManga>> {
covariant GetMangaDetailProvider provider,
) {
return call(
manga: provider.manga,
url: provider.url,
source: provider.source,
);
}
@ -78,12 +78,12 @@ class GetMangaDetailFamily extends Family<AsyncValue<MManga>> {
class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
/// See also [getMangaDetail].
GetMangaDetailProvider({
required MManga manga,
required String url,
required Source source,
}) : this._internal(
(ref) => getMangaDetail(
ref as GetMangaDetailRef,
manga: manga,
url: url,
source: source,
),
from: getMangaDetailProvider,
@ -95,7 +95,7 @@ class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
dependencies: GetMangaDetailFamily._dependencies,
allTransitiveDependencies:
GetMangaDetailFamily._allTransitiveDependencies,
manga: manga,
url: url,
source: source,
);
@ -106,11 +106,11 @@ class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.manga,
required this.url,
required this.source,
}) : super.internal();
final MManga manga;
final String url;
final Source source;
@override
@ -126,7 +126,7 @@ class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
manga: manga,
url: url,
source: source,
),
);
@ -140,14 +140,14 @@ class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
@override
bool operator ==(Object other) {
return other is GetMangaDetailProvider &&
other.manga == manga &&
other.url == url &&
other.source == source;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, manga.hashCode);
hash = _SystemHash.combine(hash, url.hashCode);
hash = _SystemHash.combine(hash, source.hashCode);
return _SystemHash.finish(hash);
@ -155,8 +155,8 @@ class GetMangaDetailProvider extends AutoDisposeFutureProvider<MManga> {
}
mixin GetMangaDetailRef on AutoDisposeFutureProviderRef<MManga> {
/// The parameter `manga` of this provider.
MManga get manga;
/// The parameter `url` of this provider.
String get url;
/// The parameter `source` of this provider.
Source get source;
@ -167,7 +167,7 @@ class _GetMangaDetailProviderElement
_GetMangaDetailProviderElement(super.provider);
@override
MManga get manga => (origin as GetMangaDetailProvider).manga;
String get url => (origin as GetMangaDetailProvider).url;
@override
Source get source => (origin as GetMangaDetailProvider).source;
}

View file

@ -1,62 +1,32 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/source_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_popular_manga.g.dart';
@riverpod
Future<List<MManga?>> getPopularManga(
Future<MPages?> getPopularManga(
GetPopularMangaRef ref, {
required Source source,
required int page,
}) async {
List<MManga> popularManga = [];
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
MPages? popularManga;
final runtime = runtimeEval(bytecode);
runtime.args = [$MManga.wrap(source.toMManga(page: page))];
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart',
source.isManga! ? 'getPopularManga' : 'getPopularAnime',
);
try {
if (res is $MHttpResponse) {
final value = res.$reified;
if (value.hasError!) {
throw value.body!;
}
}
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
if (res is $MManga) {
final value = res.$reified;
List<MManga> newManga = [];
for (var i = 0; i < value.names!.length; i++) {
MManga newMangaa = MManga(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images!.isEmpty ? "" : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,
status: value.status,
dateFormat: value.dateFormat,
hasNextPage: value.hasNextPage ?? true,
dateFormatLocale: value.dateFormatLocale);
newManga.add(newMangaa);
}
popularManga = newManga;
} else {
popularManga =
(res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
popularManga = await (res as MSourceProvider)
.getPopular(source.toMSource(), page);
} catch (e) {
throw e.toString();
throw Exception(e);
}
return popularManga;

View file

@ -6,7 +6,7 @@ part of 'get_popular_manga.dart';
// RiverpodGenerator
// **************************************************************************
String _$getPopularMangaHash() => r'68fcd40dfff14b97e19592e611098b1634e5e17c';
String _$getPopularMangaHash() => r'6dbb566dffd311195e5e98b2c49470435a6da8dd';
/// Copied from Dart SDK
class _SystemHash {
@ -34,7 +34,7 @@ class _SystemHash {
const getPopularMangaProvider = GetPopularMangaFamily();
/// See also [getPopularManga].
class GetPopularMangaFamily extends Family<AsyncValue<List<MManga?>>> {
class GetPopularMangaFamily extends Family<AsyncValue<MPages?>> {
/// See also [getPopularManga].
const GetPopularMangaFamily();
@ -75,7 +75,7 @@ class GetPopularMangaFamily extends Family<AsyncValue<List<MManga?>>> {
}
/// See also [getPopularManga].
class GetPopularMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
class GetPopularMangaProvider extends AutoDisposeFutureProvider<MPages?> {
/// See also [getPopularManga].
GetPopularMangaProvider({
required Source source,
@ -115,7 +115,7 @@ class GetPopularMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
@override
Override overrideWith(
FutureOr<List<MManga?>> Function(GetPopularMangaRef provider) create,
FutureOr<MPages?> Function(GetPopularMangaRef provider) create,
) {
return ProviderOverride(
origin: this,
@ -133,7 +133,7 @@ class GetPopularMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
}
@override
AutoDisposeFutureProviderElement<List<MManga?>> createElement() {
AutoDisposeFutureProviderElement<MPages?> createElement() {
return _GetPopularMangaProviderElement(this);
}
@ -154,7 +154,7 @@ class GetPopularMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
}
}
mixin GetPopularMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
mixin GetPopularMangaRef on AutoDisposeFutureProviderRef<MPages?> {
/// The parameter `source` of this provider.
Source get source;
@ -163,8 +163,7 @@ mixin GetPopularMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
}
class _GetPopularMangaProviderElement
extends AutoDisposeFutureProviderElement<List<MManga?>>
with GetPopularMangaRef {
extends AutoDisposeFutureProviderElement<MPages?> with GetPopularMangaRef {
_GetPopularMangaProviderElement(super.provider);
@override

View file

@ -1,62 +1,29 @@
import 'package:mangayomi/eval/bridge/m_http_response.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/source_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'search_manga.g.dart';
@riverpod
Future<List<MManga?>> searchManga(
Future<MPages?> searchManga(
SearchMangaRef ref, {
required Source source,
required String query,
required int page,
}) async {
List<MManga?>? manga = [];
MPages? manga;
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [
$MManga.wrap(source.toMManga(query: query.trim(), page: page))
];
var res = await runtime.executeLib(
'package:mangayomi/source_code.dart',
source.isManga! ? 'searchManga' : 'searchAnime',
);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
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 = [];
for (var i = 0; i < value.names!.length; i++) {
MManga newMangaa = MManga(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images!.isEmpty ? "" : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,
sourceId: value.sourceId,
hasNextPage: value.hasNextPage ?? true,
dateFormat: value.dateFormat,
dateFormatLocale: value.dateFormatLocale);
newManga.add(newMangaa);
}
manga = newManga;
} else {
manga = (res.$reified as List<dynamic>).map((e) => e as MManga).toList();
}
manga = await (res as MSourceProvider)
.search(source.toMSource(), query, page);
} catch (e) {
throw e.toString();
throw Exception(e);
}
return manga;
}

View file

@ -6,7 +6,7 @@ part of 'search_manga.dart';
// RiverpodGenerator
// **************************************************************************
String _$searchMangaHash() => r'0b909c6f3e6d9f0ff7eb01432019b58fece0fbeb';
String _$searchMangaHash() => r'f1a2af2f06c967c647ed803f8199de711a84bb49';
/// Copied from Dart SDK
class _SystemHash {
@ -34,7 +34,7 @@ class _SystemHash {
const searchMangaProvider = SearchMangaFamily();
/// See also [searchManga].
class SearchMangaFamily extends Family<AsyncValue<List<MManga?>>> {
class SearchMangaFamily extends Family<AsyncValue<MPages?>> {
/// See also [searchManga].
const SearchMangaFamily();
@ -78,7 +78,7 @@ class SearchMangaFamily extends Family<AsyncValue<List<MManga?>>> {
}
/// See also [searchManga].
class SearchMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
class SearchMangaProvider extends AutoDisposeFutureProvider<MPages?> {
/// See also [searchManga].
SearchMangaProvider({
required Source source,
@ -123,7 +123,7 @@ class SearchMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
@override
Override overrideWith(
FutureOr<List<MManga?>> Function(SearchMangaRef provider) create,
FutureOr<MPages?> Function(SearchMangaRef provider) create,
) {
return ProviderOverride(
origin: this,
@ -142,7 +142,7 @@ class SearchMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
}
@override
AutoDisposeFutureProviderElement<List<MManga?>> createElement() {
AutoDisposeFutureProviderElement<MPages?> createElement() {
return _SearchMangaProviderElement(this);
}
@ -165,7 +165,7 @@ class SearchMangaProvider extends AutoDisposeFutureProvider<List<MManga?>> {
}
}
mixin SearchMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
mixin SearchMangaRef on AutoDisposeFutureProviderRef<MPages?> {
/// The parameter `source` of this provider.
Source get source;
@ -177,8 +177,7 @@ mixin SearchMangaRef on AutoDisposeFutureProviderRef<List<MManga?>> {
}
class _SearchMangaProviderElement
extends AutoDisposeFutureProviderElement<List<MManga?>>
with SearchMangaRef {
extends AutoDisposeFutureProviderElement<MPages?> with SearchMangaRef {
_SearchMangaProviderElement(super.provider);
@override

View file

@ -15,14 +15,14 @@
* This reference is generated from the header include/dart_api.h.
*/
/* __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to
/* __STDC_FORMAT_MACROS has to be defined before including <ints.h> to
* enable platform independent printf format specifiers. */
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <assert.h>
#include <inttypes.h>
#include <ints.h>
#include <stdbool.h>
#ifdef __cplusplus

View file

@ -284,10 +284,11 @@ packages:
dart_eval:
dependency: "direct main"
description:
name: dart_eval
sha256: "2b94cab3b22cccb5ea0c3241e1ddbfd57a62fc28c3af855cb2b3cbec7c7a5212"
url: "https://pub.dev"
source: hosted
path: "."
ref: f40fb94
resolved-ref: f40fb942f9a3a9d5fd6ca8393e753ed820f5bfed
url: "https://github.com/ethanblake4/dart_eval.git"
source: git
version: "0.6.5"
dart_style:
dependency: transitive

View file

@ -42,7 +42,10 @@ dependencies:
file_picker: ^5.3.3
path_provider: ^2.1.0
scrollable_positioned_list: ^0.3.5
dart_eval: ^0.6.5
dart_eval:
git:
url: https://github.com/ethanblake4/dart_eval.git
ref: f40fb94
json_path: ^0.6.2
bot_toast: ^4.1.3
flutter_web_auth_2: ^3.0.2