refactor & some fix

This commit is contained in:
kodjomoustapha 2024-02-03 17:58:11 +01:00
parent 1e98eadee7
commit ca81405f43
59 changed files with 1526 additions and 866 deletions

View file

@ -3,27 +3,32 @@ import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/services/http/interceptor.dart';
/// dart_eval wrapper for [Client]
/// dart_eval wrapper for [InterceptedClient]
class $Client implements $Instance {
$Client.wrap(this.$value);
@override
final Client $value;
final InterceptedClient $value;
late final $Instance _superclass = $Object($value);
/// Compile-time bridged type reference for [$Client]
/// Compile-time bridged type reference for [$InterceptedClient]
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'Client'));
/// Compile-time bridged class declaration for [$Client]
/// Compile-time bridged class declaration for [$InterceptedClient]
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type), params: [], namedParams: []))
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
], namedParams: []))
},
methods: {
'get': BridgeMethodDef(BridgeFunctionDef(
@ -207,7 +212,9 @@ class $Client implements $Instance {
wrap: true);
static $Client $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $Client.wrap(Client());
return $Client.wrap(
MInterceptor.init(source: args[0]?.$value),
);
}
@override
@ -240,10 +247,10 @@ class $Client implements $Instance {
final url = args[0]!.$value as Uri;
final headers = _toMapString(args[1]?.$value);
final request = (target!.$value as Client).get(url, headers: headers);
return $Future.wrap(request
.then((value) => $Response.wrap(value.message()))
.onErrorMessage());
final request =
(target!.$value as InterceptedClient).get(url, headers: headers);
return $Future
.wrap(request.then((value) => $Response.wrap(value)).onErrorMessage());
}
static const $Function __post = $Function(_post);
@ -254,11 +261,10 @@ class $Client implements $Instance {
final body = _toBodyObject(args[2]?.$value);
final encoding = args[3]?.$value as Encoding?;
final request = (target!.$value as Client)
final request = (target!.$value as InterceptedClient)
.post(url, headers: headers, body: body, encoding: encoding);
return $Future.wrap(request
.then((value) => $Response.wrap(value.message()))
.onErrorMessage());
return $Future
.wrap(request.then((value) => $Response.wrap(value)).onErrorMessage());
}
static const $Function __put = $Function(_put);
@ -269,11 +275,10 @@ class $Client implements $Instance {
final body = _toBodyObject(args[2]?.$value);
final encoding = args[3]?.$value as Encoding?;
final request = (target!.$value as Client)
final request = (target!.$value as InterceptedClient)
.put(url, headers: headers, body: body, encoding: encoding);
return $Future.wrap(request
.then((value) => $Response.wrap(value.message()))
.onErrorMessage());
return $Future
.wrap(request.then((value) => $Response.wrap(value)).onErrorMessage());
}
static const $Function __delete = $Function(_delete);
@ -284,11 +289,10 @@ class $Client implements $Instance {
final body = _toBodyObject(args[2]?.$value);
final encoding = args[3]?.$value as Encoding?;
final request = (target!.$value as Client)
final request = (target!.$value as InterceptedClient)
.delete(url, headers: headers, body: body, encoding: encoding);
return $Future.wrap(request
.then((value) => $Response.wrap(value.message()))
.onErrorMessage());
return $Future
.wrap(request.then((value) => $Response.wrap(value)).onErrorMessage());
}
static const $Function __patch = $Function(_patch);
@ -299,7 +303,7 @@ class $Client implements $Instance {
final body = _toBodyObject(args[2]?.$value);
final encoding = args[3]?.$value as Encoding?;
final request = (target!.$value as Client)
final request = (target!.$value as InterceptedClient)
.patch(url, headers: headers, body: body, encoding: encoding);
return $Future
.wrap(request.then((value) => $Response.wrap(value)).onErrorMessage());
@ -311,7 +315,8 @@ class $Client implements $Instance {
final url = args[0]!.$value as Uri;
final headers = _toMapString(args[1]?.$value);
final request = (target!.$value as Client).read(url, headers: headers);
final request =
(target!.$value as InterceptedClient).read(url, headers: headers);
return $Future
.wrap(request.then((value) => $String(value)).onErrorMessage());
}
@ -325,7 +330,8 @@ class $Client implements $Instance {
(key, value) =>
MapEntry((key.$reified).toString(), (value.$reified).toString()));
final request = (target!.$value as Client).readBytes(url, headers: headers);
final request =
(target!.$value as InterceptedClient).readBytes(url, headers: headers);
return $Future
.wrap(request.then((value) => $List.wrap(value)).onErrorMessage());
}
@ -333,7 +339,7 @@ class $Client implements $Instance {
static const $Function __close = $Function(_close);
static $Value? _close(Runtime runtime, $Value? target, List<$Value?> args) {
(target!.$value as Client).close();
(target!.$value as InterceptedClient).close();
return null;
}
@ -711,19 +717,3 @@ extension FutureResponseExtension<T> on Future<T> {
return this;
}
}
extension ResponseExtension on Response {
Response message() {
final cloudflare = [403, 503].contains(statusCode) &&
["cloudflare-nginx", "cloudflare"].contains(headers["server"]);
if (kDebugMode) {
print(
"${request?.method}: ${request?.url}, statusCode: $statusCode ${cloudflare ? "Failed to bypass Cloudflare" : ""}");
}
if (cloudflare) {
botToast("$statusCode Failed to bypass Cloudflare");
}
return this;
}
}

View file

@ -4,7 +4,6 @@ import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/bridge/document.dart';
import 'package:mangayomi/eval/bridge/filter.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_status.dart';
@ -13,7 +12,6 @@ import 'package:mangayomi/eval/bridge/m_video.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_bridge.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/m_provider.dart';
import 'package:mangayomi/models/video.dart';
@ -44,8 +42,6 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
])),
@ -53,8 +49,6 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
])),
@ -62,8 +56,6 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('query',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter(
@ -76,8 +68,6 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MManga.$type])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
@ -86,8 +76,6 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])
])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
@ -96,25 +84,17 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeTypeRef(CoreTypes.list, [$MVideo.$type])
])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getFilterList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false)
])),
params: [])),
'getSourcePreferences': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])),
params: [
BridgeParameter(
'source', BridgeTypeAnnotation($MSource.$type), false)
])),
params: [])),
'getPreferenceValue': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.dynamic)),
params: [
@ -123,6 +103,26 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getPrefStringValue': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
params: [
BridgeParameter('sourceId',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('value',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'setPrefStringValue': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)),
params: [
BridgeParameter('sourceId',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('value',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'cryptoHandler': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
@ -782,6 +782,16 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
}
return $List.wrap(value.map((e) => $String(e)).toList());
}),
'getPrefStringValue' => $Function((_, __, List<$Value?> args) {
final value = getSourcePreferenceStringValue(
args[0]!.$reified, args[1]!.$reified, args[2]!.$reified);
return $String(value);
}),
'setPrefStringValue' => $Function((_, __, List<$Value?> args) {
setSourcePreferenceStringValue(
args[0]!.$reified, args[1]!.$reified, args[2]!.$reified);
return;
}),
"cryptoHandler" => $Function((_, __, List<$Value?> args) {
return $String(MBridge.cryptoHandler(args[0]!.$value, args[1]!.$value,
args[2]!.$value, args[3]!.$value));
@ -951,31 +961,28 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
bool get supportsLatest => $_get('supportsLatest');
@override
Future<MManga> getDetail(MSource source, String url) async =>
await $_invoke('getDetail', [$MSource.wrap(source), $String(url)]);
Future<MManga> getDetail(String url) async =>
await $_invoke('getDetail', [$String(url)]);
@override
Future<MPages> getLatestUpdates(MSource source, int page) async =>
await $_invoke('getLatestUpdates', [$MSource.wrap(source), $int(page)]);
Future<MPages> getLatestUpdates(int page) async =>
await $_invoke('getLatestUpdates', [$int(page)]);
@override
Future<MPages> getPopular(MSource source, int page) async =>
await $_invoke('getPopular', [$MSource.wrap(source), $int(page)]);
Future<MPages> getPopular(int page) async =>
await $_invoke('getPopular', [$int(page)]);
@override
Future<MPages> search(MSource source, String query, int page,
FilterList filterList) async =>
Future<MPages> search(String query, int page, FilterList filterList) async =>
await $_invoke('search', [
$MSource.wrap(source),
$String(query),
$int(page),
$FilterList.wrap(FilterList(_toValueList(filterList.filters)))
]);
@override
Future<List<String>> getPageList(MSource source, String url) async {
final res =
await $_invoke('getPageList', [$MSource.wrap(source), $String(url)]);
Future<List<String>> getPageList(String url) async {
final res = await $_invoke('getPageList', [$String(url)]);
if (res is $List) {
return res.$reified.map((e) => e as String).toList();
}
@ -983,8 +990,8 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
}
@override
List getFilterList(MSource source) {
final res = $_invoke('getFilterList', [$MSource.wrap(source)]);
List getFilterList() {
final res = $_invoke('getFilterList', []);
if (res is $List) {
return res.$reified;
}
@ -992,8 +999,8 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
}
@override
List getSourcePreferences(MSource source) {
final res = $_invoke('getSourcePreferences', [$MSource.wrap(source)]);
List getSourcePreferences() {
final res = $_invoke('getSourcePreferences', []);
if (res is $List) {
return res.$reified;
}
@ -1001,9 +1008,8 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
}
@override
Future<List<Video>> getVideoList(MSource source, String url) async {
final res =
await $_invoke('getVideoList', [$MSource.wrap(source), $String(url)]);
Future<List<Video>> getVideoList(String url) async {
final res = await $_invoke('getVideoList', [$String(url)]);
if (res is $List) {
return res.$reified.map((e) => e as Video).toList();
}

View file

@ -32,7 +32,7 @@ import 'package:mangayomi/services/anime_extractors/streamwish_extractor.dart';
import 'package:mangayomi/services/anime_extractors/vidbom_extractor.dart';
import 'package:mangayomi/services/anime_extractors/voe_extractor.dart';
import 'package:mangayomi/services/anime_extractors/your_upload_extractor.dart';
import 'package:mangayomi/services/cloudflare/cloudflare.dart';
import 'package:mangayomi/services/http/cloudflare.dart';
import 'package:mangayomi/utils/constant.dart';
import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart';
import 'package:mangayomi/utils/cryptoaes/deobfuscator.dart';

View file

@ -1,6 +1,5 @@
import 'package:mangayomi/eval/model/filter.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/models/video.dart';
@ -9,20 +8,19 @@ abstract class MProvider {
bool get supportsLatest => true;
Future<MPages> getLatestUpdates(MSource source, int page);
Future<MPages> getLatestUpdates(int page);
Future<MPages> getPopular(MSource source, int page);
Future<MPages> getPopular(int page);
Future<MPages> search(
MSource source, String query, int page, FilterList filterList);
Future<MPages> search(String query, int page, FilterList filterList);
Future<MManga> getDetail(MSource source, String url);
Future<MManga> getDetail(String url);
Future<List<String>> getPageList(MSource source, String url);
Future<List<String>> getPageList(String url);
Future<List<Video>> getVideoList(MSource source, String url);
Future<List<Video>> getVideoList(String url);
List<dynamic> getFilterList(MSource source);
List<dynamic> getFilterList();
List<dynamic> getSourcePreferences(MSource source);
List<dynamic> getSourcePreferences();
}

View file

@ -194,3 +194,15 @@ class EditTextPreference {
text: json['text']);
}
}
@collection
@Name("SourcePreferenceStringValue")
class SourcePreferenceStringValue {
Id id;
int? sourceId;
String? key;
String? value;
SourcePreferenceStringValue(
{this.id = Isar.autoIncrement, this.sourceId, this.key, this.value});
}

View file

@ -933,6 +933,824 @@ extension SourcePreferenceQueryProperty
}
}
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
extension GetSourcePreferenceStringValueCollection on Isar {
IsarCollection<SourcePreferenceStringValue>
get sourcePreferenceStringValues => this.collection();
}
const SourcePreferenceStringValueSchema = CollectionSchema(
name: r'SourcePreferenceStringValue',
id: 8063295595066322236,
properties: {
r'key': PropertySchema(
id: 0,
name: r'key',
type: IsarType.string,
),
r'sourceId': PropertySchema(
id: 1,
name: r'sourceId',
type: IsarType.long,
),
r'value': PropertySchema(
id: 2,
name: r'value',
type: IsarType.string,
)
},
estimateSize: _sourcePreferenceStringValueEstimateSize,
serialize: _sourcePreferenceStringValueSerialize,
deserialize: _sourcePreferenceStringValueDeserialize,
deserializeProp: _sourcePreferenceStringValueDeserializeProp,
idName: r'id',
indexes: {},
links: {},
embeddedSchemas: {},
getId: _sourcePreferenceStringValueGetId,
getLinks: _sourcePreferenceStringValueGetLinks,
attach: _sourcePreferenceStringValueAttach,
version: '3.1.0+1',
);
int _sourcePreferenceStringValueEstimateSize(
SourcePreferenceStringValue object,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
var bytesCount = offsets.last;
{
final value = object.key;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.value;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
return bytesCount;
}
void _sourcePreferenceStringValueSerialize(
SourcePreferenceStringValue object,
IsarWriter writer,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
writer.writeString(offsets[0], object.key);
writer.writeLong(offsets[1], object.sourceId);
writer.writeString(offsets[2], object.value);
}
SourcePreferenceStringValue _sourcePreferenceStringValueDeserialize(
Id id,
IsarReader reader,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
final object = SourcePreferenceStringValue(
id: id,
key: reader.readStringOrNull(offsets[0]),
sourceId: reader.readLongOrNull(offsets[1]),
value: reader.readStringOrNull(offsets[2]),
);
return object;
}
P _sourcePreferenceStringValueDeserializeProp<P>(
IsarReader reader,
int propertyId,
int offset,
Map<Type, List<int>> allOffsets,
) {
switch (propertyId) {
case 0:
return (reader.readStringOrNull(offset)) as P;
case 1:
return (reader.readLongOrNull(offset)) as P;
case 2:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
}
Id _sourcePreferenceStringValueGetId(SourcePreferenceStringValue object) {
return object.id;
}
List<IsarLinkBase<dynamic>> _sourcePreferenceStringValueGetLinks(
SourcePreferenceStringValue object) {
return [];
}
void _sourcePreferenceStringValueAttach(
IsarCollection<dynamic> col, Id id, SourcePreferenceStringValue object) {
object.id = id;
}
extension SourcePreferenceStringValueQueryWhereSort on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QWhere> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhere> anyId() {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(const IdWhereClause.any());
});
}
}
extension SourcePreferenceStringValueQueryWhere on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QWhereClause> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhereClause> idNotEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: false),
)
.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: false),
);
} else {
return query
.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: false),
)
.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: false),
);
}
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhereClause> idGreaterThan(Id id, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhereClause> idLessThan(Id id, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterWhereClause> idBetween(
Id lowerId,
Id upperId, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
});
}
}
extension SourcePreferenceStringValueQueryFilter on QueryBuilder<
SourcePreferenceStringValue,
SourcePreferenceStringValue,
QFilterCondition> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> idEqualTo(Id value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> idGreaterThan(
Id value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> idLessThan(
Id value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> idBetween(
Id lower,
Id upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'key',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'key',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'key',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition>
keyContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'key',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition>
keyMatches(String pattern, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'key',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'key',
value: '',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> keyIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'key',
value: '',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'sourceId',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'sourceId',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdEqualTo(int? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'sourceId',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdGreaterThan(
int? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'sourceId',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdLessThan(
int? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'sourceId',
value: value,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> sourceIdBetween(
int? lower,
int? upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'sourceId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'value',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'value',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'value',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition>
valueContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'value',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition>
valueMatches(String pattern, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'value',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'value',
value: '',
));
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterFilterCondition> valueIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'value',
value: '',
));
});
}
}
extension SourcePreferenceStringValueQueryObject on QueryBuilder<
SourcePreferenceStringValue,
SourcePreferenceStringValue,
QFilterCondition> {}
extension SourcePreferenceStringValueQueryLinks on QueryBuilder<
SourcePreferenceStringValue,
SourcePreferenceStringValue,
QFilterCondition> {}
extension SourcePreferenceStringValueQuerySortBy on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QSortBy> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortByKey() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'key', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortByKeyDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'key', Sort.desc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortBySourceId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sourceId', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortBySourceIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sourceId', Sort.desc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortByValue() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'value', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> sortByValueDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'value', Sort.desc);
});
}
}
extension SourcePreferenceStringValueQuerySortThenBy on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QSortThenBy> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.desc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenByKey() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'key', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenByKeyDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'key', Sort.desc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenBySourceId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sourceId', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenBySourceIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sourceId', Sort.desc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenByValue() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'value', Sort.asc);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QAfterSortBy> thenByValueDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'value', Sort.desc);
});
}
}
extension SourcePreferenceStringValueQueryWhereDistinct on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QDistinct> {
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QDistinct> distinctByKey({bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'key', caseSensitive: caseSensitive);
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QDistinct> distinctBySourceId() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'sourceId');
});
}
QueryBuilder<SourcePreferenceStringValue, SourcePreferenceStringValue,
QDistinct> distinctByValue({bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'value', caseSensitive: caseSensitive);
});
}
}
extension SourcePreferenceStringValueQueryProperty on QueryBuilder<
SourcePreferenceStringValue, SourcePreferenceStringValue, QQueryProperty> {
QueryBuilder<SourcePreferenceStringValue, int, QQueryOperations>
idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'id');
});
}
QueryBuilder<SourcePreferenceStringValue, String?, QQueryOperations>
keyProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'key');
});
}
QueryBuilder<SourcePreferenceStringValue, int?, QQueryOperations>
sourceIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'sourceId');
});
}
QueryBuilder<SourcePreferenceStringValue, String?, QQueryOperations>
valueProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'value');
});
}
}
// **************************************************************************
// IsarEmbeddedGenerator
// **************************************************************************

View file

@ -61,8 +61,6 @@ class Settings {
String? userAgent;
List<Cookie>? cookiesList;
@enumerated
late ReaderMode defaultReaderMode;
@ -165,6 +163,8 @@ class Settings {
bool? fullScreenReader;
String? defaultAppStoragePath;
Settings(
{this.id = 227,
this.displayType = DisplayType.compactGrid,
@ -190,7 +190,6 @@ class Settings {
this.showPagesNumber = true,
this.chapterPageIndexList,
this.userAgent = defaultUserAgent,
this.cookiesList,
this.defaultReaderMode = ReaderMode.vertical,
this.personalReaderModeList,
this.animatePageTransitions = true,
@ -237,7 +236,8 @@ class Settings {
this.aniSkipTimeoutLength,
this.btServerAddress = "127.0.0.1",
this.btServerPort,
this.fullScreenReader = true});
this.fullScreenReader = true,
this.defaultAppStoragePath});
Settings.fromJson(Map<String, dynamic> json) {
animatePageTransitions = json['animatePageTransitions'];
@ -279,10 +279,6 @@ class Settings {
.toList();
}
checkForExtensionUpdates = json['checkForExtensionUpdates'];
if (json['cookiesList'] != null) {
cookiesList =
(json['cookiesList'] as List).map((e) => Cookie.fromJson(e)).toList();
}
cropBorders = json['cropBorders'];
dateFormat = json['dateFormat'];
defaultReaderMode = ReaderMode.values[json['defaultReaderMode']];
@ -366,6 +362,7 @@ class Settings {
btServerAddress = json['btServerAddress'];
btServerPort = json['btServerPort'];
fullScreenReader = json['fullScreenReader'];
defaultAppStoragePath = json['defaultAppStoragePath'];
}
Map<String, dynamic> toJson() => {
@ -396,7 +393,6 @@ class Settings {
'chapterPageUrlsList':
chapterPageUrlsList!.map((v) => v.toJson()).toList(),
'checkForExtensionUpdates': checkForExtensionUpdates,
'cookiesList': cookiesList,
'cropBorders': cropBorders,
'dateFormat': dateFormat,
'defaultReaderMode': defaultReaderMode.index,
@ -462,7 +458,8 @@ class Settings {
'aniSkipTimeoutLength': aniSkipTimeoutLength,
'btServerAddress': btServerAddress,
'btServerPort': btServerPort,
'fullScreenReader': fullScreenReader
'fullScreenReader': fullScreenReader,
'defaultAppStoragePath': defaultAppStoragePath
};
}
@ -580,20 +577,6 @@ class ChapterPageIndex {
Map<String, dynamic> toJson() => {'chapterId': chapterId, 'index': index};
}
@embedded
class Cookie {
String? idSource;
String? cookie;
Cookie({this.idSource, this.cookie});
Cookie.fromJson(Map<String, dynamic> json) {
idSource = json['idSource'];
cookie = json['cookie'];
}
Map<String, dynamic> toJson() => {'idSource': idSource, 'cookie': cookie};
}
@embedded
class PersonalReaderMode {
int? mangaId;

View file

@ -140,22 +140,21 @@ const SettingsSchema = CollectionSchema(
name: r'checkForExtensionUpdates',
type: IsarType.bool,
),
r'cookiesList': PropertySchema(
id: 23,
name: r'cookiesList',
type: IsarType.objectList,
target: r'Cookie',
),
r'cropBorders': PropertySchema(
id: 24,
id: 23,
name: r'cropBorders',
type: IsarType.bool,
),
r'dateFormat': PropertySchema(
id: 25,
id: 24,
name: r'dateFormat',
type: IsarType.string,
),
r'defaultAppStoragePath': PropertySchema(
id: 25,
name: r'defaultAppStoragePath',
type: IsarType.string,
),
r'defaultDoubleTapToSkipLength': PropertySchema(
id: 26,
name: r'defaultDoubleTapToSkipLength',
@ -434,7 +433,6 @@ const SettingsSchema = CollectionSchema(
r'ChapterFilterBookmarked': ChapterFilterBookmarkedSchema,
r'ChapterPageurls': ChapterPageurlsSchema,
r'ChapterPageIndex': ChapterPageIndexSchema,
r'Cookie': CookieSchema,
r'PersonalReaderMode': PersonalReaderModeSchema,
r'FilterScanlator': FilterScanlatorSchema,
r'L10nLocale': L10nLocaleSchema,
@ -556,20 +554,13 @@ int _settingsEstimateSize(
}
}
{
final list = object.cookiesList;
if (list != null) {
bytesCount += 3 + list.length * 3;
{
final offsets = allOffsets[Cookie]!;
for (var i = 0; i < list.length; i++) {
final value = list[i];
bytesCount += CookieSchema.estimateSize(value, offsets, allOffsets);
}
}
final value = object.dateFormat;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.dateFormat;
final value = object.defaultAppStoragePath;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
@ -728,14 +719,9 @@ void _settingsSerialize(
object.chapterPageUrlsList,
);
writer.writeBool(offsets[22], object.checkForExtensionUpdates);
writer.writeObjectList<Cookie>(
offsets[23],
allOffsets,
CookieSchema.serialize,
object.cookiesList,
);
writer.writeBool(offsets[24], object.cropBorders);
writer.writeString(offsets[25], object.dateFormat);
writer.writeBool(offsets[23], object.cropBorders);
writer.writeString(offsets[24], object.dateFormat);
writer.writeString(offsets[25], object.defaultAppStoragePath);
writer.writeLong(offsets[26], object.defaultDoubleTapToSkipLength);
writer.writeDouble(offsets[27], object.defaultPlayBackSpeed);
writer.writeByte(offsets[28], object.defaultReaderMode.index);
@ -874,14 +860,9 @@ Settings _settingsDeserialize(
ChapterPageurls(),
),
checkForExtensionUpdates: reader.readBoolOrNull(offsets[22]),
cookiesList: reader.readObjectList<Cookie>(
offsets[23],
CookieSchema.deserialize,
allOffsets,
Cookie(),
),
cropBorders: reader.readBoolOrNull(offsets[24]),
dateFormat: reader.readStringOrNull(offsets[25]),
cropBorders: reader.readBoolOrNull(offsets[23]),
dateFormat: reader.readStringOrNull(offsets[24]),
defaultAppStoragePath: reader.readStringOrNull(offsets[25]),
defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[26]),
defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[27]),
defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[
@ -1075,14 +1056,9 @@ P _settingsDeserializeProp<P>(
case 22:
return (reader.readBoolOrNull(offset)) as P;
case 23:
return (reader.readObjectList<Cookie>(
offset,
CookieSchema.deserialize,
allOffsets,
Cookie(),
)) as P;
case 24:
return (reader.readBoolOrNull(offset)) as P;
case 24:
return (reader.readStringOrNull(offset)) as P;
case 25:
return (reader.readStringOrNull(offset)) as P;
case 26:
@ -3077,111 +3053,6 @@ extension SettingsQueryFilter
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition> cookiesListIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'cookiesList',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'cookiesList',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListLengthEqualTo(int length) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
length,
true,
length,
true,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition> cookiesListIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
0,
true,
0,
true,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
0,
false,
999999,
true,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListLengthLessThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
0,
true,
length,
include,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListLengthGreaterThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
length,
include,
999999,
true,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
cookiesListLengthBetween(
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'cookiesList',
lower,
includeLower,
upper,
includeUpper,
);
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition> cropBordersIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -3357,6 +3228,161 @@ extension SettingsQueryFilter
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'defaultAppStoragePath',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'defaultAppStoragePath',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'defaultAppStoragePath',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'defaultAppStoragePath',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathMatches(String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'defaultAppStoragePath',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'defaultAppStoragePath',
value: '',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultAppStoragePathIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'defaultAppStoragePath',
value: '',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
defaultDoubleTapToSkipLengthIsNull() {
return QueryBuilder.apply(this, (query) {
@ -6297,13 +6323,6 @@ extension SettingsQueryObject
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition> cookiesListElement(
FilterQuery<Cookie> q) {
return QueryBuilder.apply(this, (query) {
return query.object(q, r'cookiesList');
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
filterScanlatorListElement(FilterQuery<FilterScanlator> q) {
return QueryBuilder.apply(this, (query) {
@ -6652,6 +6671,19 @@ extension SettingsQuerySortBy on QueryBuilder<Settings, Settings, QSortBy> {
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> sortByDefaultAppStoragePath() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'defaultAppStoragePath', Sort.asc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy>
sortByDefaultAppStoragePathDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'defaultAppStoragePath', Sort.desc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy>
sortByDefaultDoubleTapToSkipLength() {
return QueryBuilder.apply(this, (query) {
@ -7439,6 +7471,19 @@ extension SettingsQuerySortThenBy
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> thenByDefaultAppStoragePath() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'defaultAppStoragePath', Sort.asc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy>
thenByDefaultAppStoragePathDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'defaultAppStoragePath', Sort.desc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy>
thenByDefaultDoubleTapToSkipLength() {
return QueryBuilder.apply(this, (query) {
@ -8130,6 +8175,14 @@ extension SettingsQueryWhereDistinct
});
}
QueryBuilder<Settings, Settings, QDistinct> distinctByDefaultAppStoragePath(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'defaultAppStoragePath',
caseSensitive: caseSensitive);
});
}
QueryBuilder<Settings, Settings, QDistinct>
distinctByDefaultDoubleTapToSkipLength() {
return QueryBuilder.apply(this, (query) {
@ -8571,13 +8624,6 @@ extension SettingsQueryProperty
});
}
QueryBuilder<Settings, List<Cookie>?, QQueryOperations>
cookiesListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'cookiesList');
});
}
QueryBuilder<Settings, bool?, QQueryOperations> cropBordersProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'cropBorders');
@ -8590,6 +8636,13 @@ extension SettingsQueryProperty
});
}
QueryBuilder<Settings, String?, QQueryOperations>
defaultAppStoragePathProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'defaultAppStoragePath');
});
}
QueryBuilder<Settings, int?, QQueryOperations>
defaultDoubleTapToSkipLengthProperty() {
return QueryBuilder.apply(this, (query) {
@ -10670,386 +10723,6 @@ extension ChapterPageIndexQueryObject
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
const CookieSchema = Schema(
name: r'Cookie',
id: -4750069831156363626,
properties: {
r'cookie': PropertySchema(
id: 0,
name: r'cookie',
type: IsarType.string,
),
r'idSource': PropertySchema(
id: 1,
name: r'idSource',
type: IsarType.string,
)
},
estimateSize: _cookieEstimateSize,
serialize: _cookieSerialize,
deserialize: _cookieDeserialize,
deserializeProp: _cookieDeserializeProp,
);
int _cookieEstimateSize(
Cookie object,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
var bytesCount = offsets.last;
{
final value = object.cookie;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.idSource;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
return bytesCount;
}
void _cookieSerialize(
Cookie object,
IsarWriter writer,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
writer.writeString(offsets[0], object.cookie);
writer.writeString(offsets[1], object.idSource);
}
Cookie _cookieDeserialize(
Id id,
IsarReader reader,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
final object = Cookie(
cookie: reader.readStringOrNull(offsets[0]),
idSource: reader.readStringOrNull(offsets[1]),
);
return object;
}
P _cookieDeserializeProp<P>(
IsarReader reader,
int propertyId,
int offset,
Map<Type, List<int>> allOffsets,
) {
switch (propertyId) {
case 0:
return (reader.readStringOrNull(offset)) as P;
case 1:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
}
extension CookieQueryFilter on QueryBuilder<Cookie, Cookie, QFilterCondition> {
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'cookie',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'cookie',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'cookie',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'cookie',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'cookie',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'cookie',
value: '',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> cookieIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'cookie',
value: '',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'idSource',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'idSource',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'idSource',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'idSource',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'idSource',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'idSource',
value: '',
));
});
}
QueryBuilder<Cookie, Cookie, QAfterFilterCondition> idSourceIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'idSource',
value: '',
));
});
}
}
extension CookieQueryObject on QueryBuilder<Cookie, Cookie, QFilterCondition> {}
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
const PersonalReaderModeSchema = Schema(
name: r'PersonalReaderMode',
id: -1072936262658804338,

View file

@ -152,7 +152,6 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
language: _firstVid.audios?.first.label));
final ValueNotifier<double> _playbackSpeed = ValueNotifier(1.0);
bool _seekToCurrentPosition = true;
bool _initSubtitle = true;
final ValueNotifier<bool> _enterFullScreen = ValueNotifier(false);
late final ValueNotifier<Duration> _currentPosition =
@ -166,19 +165,14 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
final bool _isDesktop =
Platform.isWindows || Platform.isMacOS || Platform.isLinux;
late StreamSubscription<Duration> _currentPositionSub =
late final StreamSubscription<Duration> _currentPositionSub =
_player.stream.position.listen(
(position) async {
if (_seekToCurrentPosition && _currentPosition.value != Duration.zero) {
await _player.stream.buffer.first;
_player.seek(_currentPosition.value);
_isCompleted.value = _player.state.duration.inSeconds -
_currentPosition.value.inSeconds <=
10;
_seekToCurrentPosition = false;
} else {
_currentPosition.value = position;
}
_isCompleted.value =
_player.state.duration.inSeconds - _currentPosition.value.inSeconds <=
10;
_currentPosition.value = position;
if ((_firstVid.subtitles ?? []).isNotEmpty) {
if (_initSubtitle) {
try {
@ -205,6 +199,7 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
@override
void initState() {
_setCurrentPosition(true);
_seekToCurrentPosition();
_currentPositionSub;
_currentTotalDurationSub;
_player.open(Media(_video.value!.videoTrack!.id,
@ -214,6 +209,15 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
super.initState();
}
void _seekToCurrentPosition({Duration? duration}) async {
await Future.doWhile(() async {
await Future.delayed(const Duration(milliseconds: 300));
await _player.stream.buffer.first;
_player.seek(duration ?? _streamController.geTCurrentPosition());
return false;
});
}
void _initAniSkip() async {
await _player.stream.buffer.first;
_streamController.getAniSkipResults((result) {
@ -327,23 +331,7 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage> {
_player.open(
Media(quality.videoTrack!.id, httpHeaders: quality.headers));
}
_seekToCurrentPosition = true;
_currentPositionSub = _player.stream.position.listen(
(position) async {
if (_seekToCurrentPosition &&
_currentPosition.value != Duration.zero) {
await _player.stream.buffer.first;
_player.seek(_currentPosition.value);
try {
_player.setSubtitleTrack(_subtitle.value!);
} catch (_) {}
_seekToCurrentPosition = false;
} else {
_currentPosition.value = position;
}
},
);
_seekToCurrentPosition(duration: _currentPosition.value);
Navigator.pop(context);
},
);

View file

@ -1,4 +1,3 @@
import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:flutter/material.dart';
@ -105,12 +104,6 @@ class CustomSeekBarState extends State<CustomSeekBar> {
widget.onSeekEnd?.call(Duration(
milliseconds: value.toInt() - position.inMilliseconds));
widget.player.seek(Duration(milliseconds: value.toInt()));
await Future.delayed(const Duration(milliseconds: 500));
if (mounted) {
setState(() {
tempPosition = null;
});
}
},
),
),

View file

@ -51,3 +51,37 @@ SourcePreference getSourcePreferenceEntry(String key, int sourceId) {
return sourcePreference;
}
String getSourcePreferenceStringValue(
int sourceId, String key, String defaultValue) {
SourcePreferenceStringValue? sourcePreferenceStringValue = isar
.sourcePreferenceStringValues
.filter()
.sourceIdEqualTo(sourceId)
.keyEqualTo(key)
.findFirstSync();
if (sourcePreferenceStringValue == null) {
setSourcePreferenceStringValue(sourceId, key, defaultValue);
return defaultValue;
}
return sourcePreferenceStringValue.value ?? "";
}
void setSourcePreferenceStringValue(int sourceId, String key, String value) {
final sourcePref = isar.sourcePreferenceStringValues
.filter()
.sourceIdEqualTo(sourceId)
.keyEqualTo(key)
.findFirstSync();
isar.writeTxnSync(() {
if (sourcePref != null) {
isar.sourcePreferenceStringValues.putSync(sourcePref..value = value);
} else {
isar.sourcePreferenceStringValues.putSync(SourcePreferenceStringValue()
..key = key
..sourceId = sourceId
..value = value);
}
});
}

View file

@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart';
// **************************************************************************
String _$fetchAnimeSourcesListHash() =>
r'3f9cf47efce8e6e207c59e0d936727959c1fe982';
r'fce156ad85528a46bf28390f783a04ca2768e92c';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart';
// **************************************************************************
String _$fetchMangaSourcesListHash() =>
r'a74557098c49877942a296abe110fb6ef1dce580';
r'ec5b2fa05b41e73485460fbe1456f33d40c8fda8';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,4 +1,5 @@
// import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart';
@ -22,7 +23,7 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
getManga = await ref
.watch(getDetailProvider(url: manga.link!, source: source!).future);
} catch (e) {
// botToast(e.toString());
botToast(e.toString());
return;
}
manga

View file

@ -6,7 +6,7 @@ part of 'auto_backup.dart';
// RiverpodGenerator
// **************************************************************************
String _$checkAndBackupHash() => r'fad714bbc0d37442d4f72fd98d91fcaf72166284';
String _$checkAndBackupHash() => r'8d15908fe42ebd4d64ed4cc309fb4b0918ee14ac';
/// See also [checkAndBackup].
@ProviderFor(checkAndBackup)
@ -56,7 +56,7 @@ final backupFrequencyOptionsStateProvider = AutoDisposeNotifierProvider<
typedef _$BackupFrequencyOptionsState = AutoDisposeNotifier<List<int>>;
String _$autoBackupLocationStateHash() =>
r'87feb5475d47a77da4e87fa62e551b785fa1e7ba';
r'db6d5a8a0b74ea61cd8569e0486d3a4720393ed1';
/// See also [AutoBackupLocationState].
@ProviderFor(AutoBackupLocationState)

View file

@ -6,7 +6,7 @@ part of 'backup.dart';
// RiverpodGenerator
// **************************************************************************
String _$doBackUpHash() => r'44abdf2cffcd6c6470234cd378f5b802a2aff7ba';
String _$doBackUpHash() => r'5680593f7d0c457c9f4ae9ab26b94f3b9fb974f0';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,13 +1,13 @@
// ignore_for_file: depend_on_referenced_packages
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/cloudflare/cookie.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:share_plus/share_plus.dart';
import 'package:path/path.dart' as p;
@ -54,6 +54,11 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
webview!
..setBrightness(Brightness.dark)
..launch(widget.url)
..addOnUrlRequestCallback((url) async {
final newCookie =
await webview!.evaluateJavaScript("window.document.cookie;");
log(newCookie.toString());
})
..onClose.whenComplete(() {
Navigator.pop(context);
});
@ -217,7 +222,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
final ua = await controller.evaluateJavascript(
source: "navigator.userAgent") ??
"";
await addCookie(widget.sourceId, url.toString(), ua);
await MInterceptor.setCookie(url.toString(), ua);
final canGoback = await controller.canGoBack();
final canGoForward = await controller.canGoForward();
final title = await controller.getTitle();
@ -246,16 +251,16 @@ Future<String> getWebViewPath() async {
);
}
Future<String?> decodeHtml(Webview webview, {String? sourceId}) async {
Future<String?> decodeHtml(Webview webview) async {
try {
final html = await webview
.evaluateJavaScript("window.document.documentElement.outerHTML;");
final ua = await webview.evaluateJavaScript("navigator.userAgent") ?? "";
final newCookie =
await webview.evaluateJavaScript("window.document.cookie;");
if (newCookie != null && sourceId != null) {
CookieState(idSource: sourceId)
.set(jsonDecode(newCookie), ua.isNotEmpty ? jsonDecode(ua) : "");
if (newCookie != null) {
await MInterceptor.setCookie(
jsonDecode(newCookie), ua.isNotEmpty ? jsonDecode(ua) : "");
}
final res = jsonDecode(html!) as String;

View file

@ -123,7 +123,8 @@ class StorageProvider {
SettingsSchema,
TrackPreferenceSchema,
TrackSchema,
SourcePreferenceSchema
SourcePreferenceSchema,
SourcePreferenceStringValueSchema
], directory: dir!.path, name: "mangayomiDb", inspector: inspector!);
if (isar.settings.filter().idEqualTo(227).isEmptySync()) {
@ -133,6 +134,16 @@ class StorageProvider {
},
);
}
final settings = isar.settings.getSync(227);
final getDefaultAppStoragePath = settings?.defaultAppStoragePath;
if (getDefaultAppStoragePath == null) {
final path = (await getDefaultDirectory())!.path;
isar.writeTxnSync(
() {
isar.settings.putSync(settings!..defaultAppStoragePath = path);
},
);
}
return isar;
}
}

View file

@ -1,6 +1,7 @@
import 'dart:math';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class DoodExtractor {
@ -9,7 +10,7 @@ class DoodExtractor {
String? quality,
bool redirect = true,
}) async {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
final newQuality = quality ?? ('Doodstream ${redirect ? ' mirror' : ''}');
try {

View file

@ -1,11 +1,12 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class FilemoonExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(
String url, String prefix, String suffix) async {

View file

@ -1,13 +1,14 @@
import 'dart:convert';
import 'package:html/dom.dart';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/video.dart';
import 'package:html/parser.dart' as parser;
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class GogoCdnExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
final JsonCodec json = const JsonCodec();
Future<List<Video>> videosFromUrl(String serverUrl) async {

View file

@ -1,19 +1,20 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class Mp4uploadExtractor {
static final RegExp qualityRegex = RegExp(r'\WHEIGHT=(\d+)');
static const String referer = "https://mp4upload.com/";
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url, Map<String, String> headers,
{String prefix = '', String suffix = ''}) async {
final newHeaders = Map<String, String>.from(headers)
..addAll({'referer': referer});
try {
final response = await http.get(Uri.parse(url), headers: newHeaders);
final response = await client.get(Uri.parse(url), headers: newHeaders);
String script = "";
final scriptElementWithEval = xpathSelector(response.body)

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class MyStreamExtractor {
@ -8,7 +9,7 @@ class MyStreamExtractor {
String url, Map<String, String> headers) async {
final host = url.substringBefore("/watch");
final client = http.Client();
final InterceptedClient client = MInterceptor.init();
try {
final response = await client.get(Uri.parse(url), headers: headers);

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' show parse;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class MytvExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url) async {
try {

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' show parse;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class OkruExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
String fixQuality(String quality) {
final qualities = {

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as parser;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class SendvidExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
final Map<String, String> headers;
SendvidExtractor(this.headers);

View file

@ -1,9 +1,10 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class SibnetExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url, {String prefix = ""}) async {
List<Video> videoList = [];

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/others.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class StreamlareExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url,
{String prefix = "", String suffix = ""}) async {

View file

@ -1,17 +1,19 @@
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:html/parser.dart' show parse;
import 'package:http/http.dart' as http;
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class StreamTapeExtractor {
Future<List<Video>> videosFromUrl(String url,
{String quality = "StreamTape"}) async {
final InterceptedClient client = MInterceptor.init();
try {
const baseUrl = "https://streamtape.com/e/";
final newUrl =
!url.startsWith(baseUrl) ? "$baseUrl${url.split("/")[4]}" : url;
final response = await http.Client().get(Uri.parse(newUrl));
final response = await client.get(Uri.parse(newUrl));
final document = parse(response.body);
const targetLine = "document.getElementById('robotlink')";

View file

@ -1,12 +1,13 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/others.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class StreamWishExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
final Map<String, String> headers = {};
Future<List<Video>> videosFromUrl(String url, String prefix) async {

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class VidBomExtractor {
final http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url) async {
try {

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class VoeExtractor {
http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url, String? quality) async {
try {

View file

@ -1,10 +1,11 @@
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/interceptor.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/xpath_selector.dart';
class YourUploadExtractor {
http.Client client = http.Client();
final InterceptedClient client = MInterceptor.init();
Future<List<Video>> videosFromUrl(String url, Map<String, String> headers,
{String name = "YourUpload", String prefix = ""}) async {

View file

@ -1,49 +0,0 @@
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'
as flutter_inappwebview;
class CookieState {
String? idSource;
CookieState({required String idSource});
String get() {
final cookiesList = isar.settings.getSync(227)!.cookiesList ?? [];
return cookiesList
.firstWhere(
(element) => element.idSource == idSource,
orElse: () => Cookie(cookie: ""),
)
.cookie!;
}
void set(String newCookie, String ua) {
final settings = isar.settings.getSync(227);
List<Cookie>? cookieList = [];
for (var cookie in settings!.cookiesList ?? []) {
if (cookie.idSource != idSource) {
cookieList.add(cookie);
}
}
cookieList.add(Cookie()
..idSource = idSource
..cookie = newCookie);
isar.writeTxnSync(() => isar.settings.putSync(settings
..cookiesList = cookieList
..userAgent = ua));
}
}
Future<void> addCookie(String sourceId, String url, String ua) async {
flutter_inappwebview.CookieManager cookieManager =
flutter_inappwebview.CookieManager.instance();
final cookie = (await cookieManager.getCookie(
url: Uri.parse(url), name: "cf_clearance"));
if (cookie != null) {
final newCookie = "${cookie.name}=${cookie.value}";
CookieState(idSource: sourceId).set(newCookie, ua);
}
}

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/main.dart';
@ -68,9 +69,9 @@ Future<GetChapterPagesModel> getChapterPages(
final runtime = runtimeEval(bytecode);
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
pageUrls = (await (res as MProvider)
.getPageList(source.toMSource(), chapter.url!));
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
pageUrls = (await (res as MProvider).getPageList(chapter.url!));
}
}

View file

@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart';
// RiverpodGenerator
// **************************************************************************
String _$getChapterPagesHash() => r'ebd047f73e22df675982127c901b2d386873e208';
String _$getChapterPagesHash() => r'843f224e365aafe2f3ca124a07254a1ff1d153ae';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
@ -25,9 +26,10 @@ Future<MManga> getDetail(
final runtime = runtimeEval(bytecode);
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
try {
mangadetail = await (res as MProvider).getDetail(source.toMSource(), url);
mangadetail = await (res as MProvider).getDetail(url);
} catch (e) {
throw Exception(e);
}

View file

@ -6,7 +6,7 @@ part of 'get_detail.dart';
// RiverpodGenerator
// **************************************************************************
String _$getDetailHash() => r'683f6a473aca093cc35d5d9756ae9cbdfb302f88';
String _$getDetailHash() => r'003f3f5c25352c114ba768c88eea6656964fd715';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,4 +1,5 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/models/source.dart';
@ -14,9 +15,10 @@ List<dynamic> getFilterList({required Source source}) {
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
filterList = (res as MProvider)
.getFilterList(source.toMSource())
.getFilterList()
.map((e) => e is $Value ? e.$reified : e)
.toList();
} catch (_) {

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
@ -22,9 +23,9 @@ Future<MPages?> getLatestUpdates(
final runtime = runtimeEval(bytecode);
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main');
latestUpdatesManga =
await (res as MProvider).getLatestUpdates(source.toMSource(), page);
var res = await runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
latestUpdatesManga = await (res as MProvider).getLatestUpdates(page);
} catch (e) {
throw Exception(e);
}

View file

@ -6,7 +6,7 @@ part of 'get_latest_updates.dart';
// RiverpodGenerator
// **************************************************************************
String _$getLatestUpdatesHash() => r'19ccde133a23148dd90f29110b5f9804cd2cb942';
String _$getLatestUpdatesHash() => r'288b2ce3b2e79c1924c8e2a312282900fd9e645f';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
@ -22,9 +23,9 @@ Future<MPages?> getPopular(
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
popularManga =
await (res as MProvider).getPopular(source.toMSource(), page);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
popularManga = await (res as MProvider).getPopular(page);
} catch (e) {
throw Exception(e);
}

View file

@ -6,7 +6,7 @@ part of 'get_popular.dart';
// RiverpodGenerator
// **************************************************************************
String _$getPopularHash() => r'9eb971f8ca52854efe7431010b93a998e425f9da';
String _$getPopularHash() => r'd78a01ea5854ad3f592e713e4f4052929774e78e';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,4 +1,5 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
@ -13,9 +14,10 @@ List<SourcePreference> getSourcePreference({required Source source}) {
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
sourcePreference = (res as MProvider)
.getSourcePreferences(source.toMSource())
.getSourcePreferences()
.map((e) => (e is $Value ? e.$reified : e) as SourcePreference)
.toList();
} catch (_) {

View file

@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:io';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/messages/generated.dart';
@ -38,13 +39,13 @@ Future<(List<Video>, bool, String?)> getVideoList(
}
await Rinf.finalize();
await Rinf.initialize();
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
final dd = (await (res as MProvider)
.getVideoList(source.toMSource(), episode.url!));
return (dd, false, null);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
final dd = (await (res as MProvider).getVideoList(episode.url!));
return (dd, false, null);
}

View file

@ -6,7 +6,7 @@ part of 'get_video_list.dart';
// RiverpodGenerator
// **************************************************************************
String _$getVideoListHash() => r'd1e21cd01a2d2eda2050c199f255eb0502d67fad';
String _$getVideoListHash() => r'c7e36c244ebbac9dad01945be0e2ed5712236855';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -3,7 +3,7 @@ import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:mangayomi/modules/webview/webview.dart';
import 'package:mangayomi/services/cloudflare/cookie.dart';
import 'package:mangayomi/services/http/interceptor.dart';
Future<String> cloudflareBypass(
{required String url, required String sourceId}) async {
@ -24,7 +24,7 @@ Future<String> cloudflareBypass(
await Future.doWhile(() async {
await Future.delayed(const Duration(seconds: 1));
html = await decodeHtml(webview, sourceId: sourceId);
html = await decodeHtml(webview);
if (html == null ||
html!.contains("Just a moment") ||
html!.contains("challenges.cloudflare.com")) {
@ -67,7 +67,7 @@ Future<String> cloudflareBypass(
}
return true;
});
await addCookie(sourceId, url, ua);
await MInterceptor.setCookie(url, ua);
}
return html!;
}
}

View file

@ -0,0 +1,150 @@
import 'package:flutter/foundation.dart';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'dart:async';
import 'dart:io';
import 'package:cookie_jar/cookie_jar.dart' as cookie_jar;
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/main.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'
as flutter_inappwebview;
import 'package:mangayomi/models/settings.dart';
class MInterceptor {
static final _cookieJar = cookie_jar.PersistCookieJar(
ignoreExpires: true,
storage: cookie_jar.FileStorage(
"${isar.settings.getSync(227)!.defaultAppStoragePath}.cookies/"));
MInterceptor({required String idSource});
static InterceptedClient init({MSource? source}) {
return InterceptedClient.build(interceptors: [
if (source?.hasCloudflare ?? false) ...[MCookieManager(_cookieJar)],
LoggerInterceptor()
]);
}
static Future<void> setCookie(String url, String ua) async {
flutter_inappwebview.CookieManager cookieManager =
flutter_inappwebview.CookieManager.instance();
final cookies = (await cookieManager.getCookies(url: Uri.parse(url)))
.map((e) => "${e.name}=${e.value}")
.toList();
if (cookies.isNotEmpty) {
for (final cookie in cookies) {
await _cookieJar.saveFromResponse(
Uri.parse(url),
[Cookie.fromSetCookieValue(cookie)],
);
}
final settings = isar.settings.getSync(227);
isar.writeTxnSync(() => isar.settings.putSync(settings!..userAgent = ua));
}
}
}
class MCookieManager extends InterceptorContract {
MCookieManager(this.cookieJar);
final cookie_jar.CookieJar cookieJar;
static String getCookies(List<Cookie> cookies) {
cookies.sort((a, b) {
if (a.path == null && b.path == null) {
return 0;
} else if (a.path == null) {
return -1;
} else if (b.path == null) {
return 1;
} else {
return b.path!.length.compareTo(a.path!.length);
}
});
return cookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; ');
}
@override
Future<BaseRequest> interceptRequest({
required BaseRequest request,
}) async {
final cookies = await cookieJar.loadForRequest(request.url);
final previousCookies = request.headers[HttpHeaders.cookieHeader];
final userAgent = isar.settings.getSync(227)!.userAgent!;
final newCookies = getCookies([
...?previousCookies
?.split(';')
.where((e) => e.isNotEmpty)
.map((c) => Cookie.fromSetCookieValue(c)),
...cookies,
]);
request.headers[HttpHeaders.cookieHeader] =
newCookies.isNotEmpty ? newCookies : "";
request.headers[HttpHeaders.userAgentHeader] = userAgent;
return request;
}
@override
Future<BaseResponse> interceptResponse({
required BaseResponse response,
}) async {
await _saveCookies(response);
return response;
}
Future<void> _saveCookies(BaseResponse response) async {
final setCookies = response.headers[HttpHeaders.setCookieHeader];
if (setCookies == null || setCookies.isEmpty) {
return;
}
final List<Cookie> cookies = setCookies
.split(RegExp('(?<=)(,)(?=[^;]+?=)'))
.where((cookie) => cookie.isNotEmpty)
.map((str) => Cookie.fromSetCookieValue(str))
.toList();
final statusCode = response.statusCode;
final isRedirectRequest = statusCode >= 300 && statusCode < 400;
final location = response.headers[HttpHeaders.locationHeader] ?? "";
final originalUri = response.request!.url;
final realUri = originalUri
.resolveUri(isRedirectRequest ? Uri.parse(location) : originalUri);
await cookieJar.saveFromResponse(realUri, cookies);
if (isRedirectRequest && location.isNotEmpty) {
await Future.wait(
[cookieJar.saveFromResponse(originalUri.resolve(location), cookies)],
);
}
}
}
class LoggerInterceptor extends InterceptorContract {
@override
Future<BaseRequest> interceptRequest({
required BaseRequest request,
}) async {
if (kDebugMode) {
print('----- Request -----');
print(request.toString());
print(request.headers.toString());
}
return request;
}
@override
Future<BaseResponse> interceptResponse({
required BaseResponse response,
}) async {
final cloudflare = [403, 503].contains(response.statusCode) &&
["cloudflare-nginx", "cloudflare"].contains(response.headers["server"]);
if (kDebugMode) {
print('----- Response -----');
print(
"${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}");
}
if (cloudflare) {
botToast("${response.statusCode} Failed to bypass Cloudflare");
}
return response;
}
}

View file

@ -1,3 +1,4 @@
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
@ -18,10 +19,11 @@ Future<MPages?> search(SearchRef ref,
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
try {
manga = await (res as MProvider)
.search(source.toMSource(), query, page, FilterList(filterList));
manga =
await (res as MProvider).search(query, page, FilterList(filterList));
} catch (e) {
throw Exception(e);
}

View file

@ -6,7 +6,7 @@ part of 'search.dart';
// RiverpodGenerator
// **************************************************************************
String _$searchHash() => r'b2683242cc45e83f3946339d3490cad6488dd847';
String _$searchHash() => r'685e379023d83ede702d76696d64fccb803e5549';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
@ -20,10 +21,11 @@ Future<MPages?> search(
final bytecode =
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
try {
manga = await (res as MProvider)
.search(source.toMSource(), query, page, FilterList(filterList));
manga =
await (res as MProvider).search(query, page, FilterList(filterList));
} catch (e) {
throw Exception(e);
}

View file

@ -1,3 +1,4 @@
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/models/source.dart';
@ -16,7 +17,8 @@ bool supportsLatest(SupportsLatestRef ref, {required Source source}) {
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
supportsLatest = (res as MProvider).supportsLatest;
} catch (e) {
supportsLatest = true;

View file

@ -6,7 +6,7 @@ part of 'supports_latest.dart';
// RiverpodGenerator
// **************************************************************************
String _$supportsLatestHash() => r'affdd0558a86dcdf8c40a9dba0fe6f4d053e9709';
String _$supportsLatestHash() => r'96669da97ba75756371c0c1c50541ecfd68dd13e';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'myanimelist.dart';
// RiverpodGenerator
// **************************************************************************
String _$myAnimeListHash() => r'ab694820166610c5ec7bb1c936527b4da73fb6d5';
String _$myAnimeListHash() => r'bdbe57c0071039f20aa929fc9f320f130b4a4ae3';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -21,57 +21,60 @@ import 'package:mangayomi/bridge_lib.dart';
import 'dart:convert';
class TestSource extends MProvider {
TestSource();
TestSource({required this.source});
MSource source;
final Client client = Client(source);
@override
bool get supportsLatest => true;
@override
Future<MPages> getPopular(MSource source, int page) async {
Future<MPages> getPopular(int page) async {
// TODO: implement
}
@override
Future<MPages> getLatestUpdates(MSource source, int page) async {
Future<MPages> getLatestUpdates(int page) async {
// TODO: implement
}
@override
Future<MPages> search(
MSource source, String query, int page, FilterList filterList) async {
Future<MPages> search(String query, int page, FilterList filterList) async {
// TODO: implement
}
@override
Future<MManga> getDetail(MSource source, String url) async {
Future<MManga> getDetail(String url) async {
// TODO: implement
}
// For anime episode video list
@override
Future<List<MVideo>> getVideoList(MSource source, String url) async {
Future<List<MVideo>> getVideoList(String url) async {
// TODO: implement
}
// For manga chapter pages
@override
Future<List<String>> getPageList(MSource source, String url) {
Future<List<String>> getPageList(String url) {
// TODO: implement
}
@override
List<dynamic> getFilterList(MSource source) {
List<dynamic> getFilterList() {
// TODO: implement
}
@override
List<dynamic> getSourcePreferences(MSource source) {
List<dynamic> getSourcePreferences() {
// TODO: implement
}
}
TestSource main() {
return TestSource();
TestSource main(MSource source) {
return TestSource(source:source);
}
''';

View file

@ -1,7 +1,4 @@
import 'dart:convert';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/services/cloudflare/cookie.dart';
import 'package:mangayomi/sources/utils/utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'headers.g.dart';
@ -9,24 +6,13 @@ part 'headers.g.dart';
@riverpod
Map<String, String> headers(HeadersRef ref,
{required String source, required String lang}) {
final sourceM = getSource(lang, source);
final mSource = getSource(lang, source);
if (sourceM == null) return {};
if (sourceM.headers!.isEmpty && !sourceM.hasCloudflare!) return {};
Map<String, String> newHeaders = {};
if (sourceM.headers!.isNotEmpty) {
final headers = jsonDecode(sourceM.headers!) as Map;
newHeaders =
headers.map((key, value) => MapEntry(key.toString(), value.toString()));
Map<String, String> headers = {};
if (mSource?.headers?.isNotEmpty ?? false) {
headers = (jsonDecode(mSource!.headers!) as Map)
.map((key, value) => MapEntry(key.toString(), value.toString()));
}
if (sourceM.hasCloudflare!) {
final userAgent = isar.settings.getSync(227)!.userAgent!;
final cookie = CookieState(idSource: sourceM.id.toString()).get();
newHeaders.addAll({'User-Agent': userAgent, "Cookie": cookie});
}
return newHeaders;
return headers;
}

View file

@ -6,7 +6,7 @@ part of 'headers.dart';
// RiverpodGenerator
// **************************************************************************
String _$headersHash() => r'2075121328277856708a7f61718d22c409f915e0';
String _$headersHash() => r'cabe2e8d0241df2a9741f4f738c52a0f6ce2ab10';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -234,6 +234,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.1"
cookie_jar:
dependency: "direct main"
description:
name: cookie_jar
sha256: a6ac027d3ed6ed756bfce8f3ff60cb479e266f3b0fdabd6242b804b6765e52de
url: "https://pub.dev"
source: hosted
version: "4.0.8"
cross_file:
dependency: transitive
description:
@ -630,6 +638,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.0"
http_interceptor:
dependency: "direct main"
description:
name: http_interceptor
sha256: "7fe0863f734dcc8286875d2f074f8dd91c47fef95cd219b34282d71930a4895f"
url: "https://pub.dev"
source: hosted
version: "2.0.0-beta.7"
http_multi_server:
dependency: transitive
description:
@ -1404,6 +1420,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
universal_io:
dependency: transitive
description:
name: universal_io
sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
universal_platform:
dependency: transitive
description:

View file

@ -66,6 +66,8 @@ dependencies:
window_manager: ^0.3.7
ffi: ^2.1.0
ffigen: ^11.0.0
http_interceptor: ^2.0.0-beta.7
cookie_jar: ^4.0.0
dependency_overrides: