WIP
This commit is contained in:
parent
c3f1cb37d0
commit
9569a261bd
48 changed files with 1258 additions and 1451 deletions
File diff suppressed because it is too large
Load diff
128
lib/eval/bridge/m_chapter.dart
Normal file
128
lib/eval/bridge/m_chapter.dart
Normal 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) {}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {}
|
||||
}
|
||||
|
|
|
|||
87
lib/eval/bridge/m_pages.dart
Normal file
87
lib/eval/bridge/m_pages.dart
Normal 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) {}
|
||||
}
|
||||
160
lib/eval/bridge/m_source.dart
Normal file
160
lib/eval/bridge/m_source.dart
Normal 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) {}
|
||||
}
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {}
|
||||
|
|
|
|||
182
lib/eval/bridge/source_provider.dart
Normal file
182
lib/eval/bridge/source_provider.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
10
lib/eval/model/m_chapter.dart
Normal file
10
lib/eval/model/m_chapter.dart
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
class MChapter {
|
||||
String? name;
|
||||
|
||||
String? url;
|
||||
|
||||
String? dateUpload;
|
||||
|
||||
String? scanlator;
|
||||
MChapter({this.name, this.url, this.dateUpload, this.scanlator});
|
||||
}
|
||||
|
|
@ -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);
|
||||
// }
|
||||
}
|
||||
|
|
|
|||
7
lib/eval/model/m_pages.dart
Normal file
7
lib/eval/model/m_pages.dart
Normal 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});
|
||||
}
|
||||
30
lib/eval/model/m_source.dart
Normal file
30
lib/eval/model/m_source.dart
Normal 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});
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
class MTrack {
|
||||
String? file;
|
||||
String? label;
|
||||
|
||||
MTrack({this.file, this.label});
|
||||
}
|
||||
|
|
@ -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});
|
||||
}
|
||||
|
|
|
|||
22
lib/eval/model/source_provider.dart
Normal file
22
lib/eval/model/source_provider.dart
Normal 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();
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: () {
|
||||
|
|
|
|||
|
|
@ -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: () {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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!));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue