Merge remote-tracking branch 'upstream/main' into Correct-directory

This commit is contained in:
NBA2K1 2025-10-29 18:30:50 +01:00
commit a307e9d049
345 changed files with 14034 additions and 19801 deletions

View file

@ -30,7 +30,7 @@ if (flutterVersionName == null) {
android {
namespace "com.kodjodevf.mangayomi"
compileSdkVersion 35
compileSdkVersion 36
ndkVersion flutter.ndkVersion
compileOptions {

View file

@ -12,7 +12,7 @@ subprojects {
if (project.plugins.hasPlugin("com.android.application") ||
project.plugins.hasPlugin("com.android.library")) {
project.android {
compileSdkVersion 35
compileSdkVersion 36
buildToolsVersion "34.0.0"
}
}

View file

@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip

View file

@ -19,8 +19,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.7.3" apply false
id "org.jetbrains.kotlin.android" version "1.9.0" apply false
id "com.android.application" version "8.12.1" apply false
id "org.jetbrains.kotlin.android" version "2.2.0" apply false
}
include ":app"

View file

@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
<string>13.0</string>
</dict>
</plist>

View file

@ -1,5 +1,5 @@
PODS:
- app_links (0.0.2):
- app_links (6.4.1):
- Flutter
- audio_session (0.0.1):
- Flutter
@ -42,6 +42,8 @@ PODS:
- DKImagePickerController/PhotoGallery
- Flutter
- Flutter (1.0.0)
- flutter_discord_rpc_fork (0.0.1):
- Flutter
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
@ -53,7 +55,7 @@ PODS:
- Flutter
- flutter_web_auth_2 (3.0.0):
- Flutter
- isar_flutter_libs (1.0.0):
- isar_community_flutter_libs (1.0.0):
- Flutter
- just_audio (0.0.1):
- Flutter
@ -103,10 +105,11 @@ DEPENDENCIES:
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- flutter_discord_rpc_fork (from `.symlinks/plugins/flutter_discord_rpc_fork/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_qjs (from `.symlinks/plugins/flutter_qjs/ios`)
- flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`)
- isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`)
- isar_community_flutter_libs (from `.symlinks/plugins/isar_community_flutter_libs/ios`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
- media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`)
- media_kit_video (from `.symlinks/plugins/media_kit_video/ios`)
@ -144,14 +147,16 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/file_picker/ios"
Flutter:
:path: Flutter
flutter_discord_rpc_fork:
:path: ".symlinks/plugins/flutter_discord_rpc_fork/ios"
flutter_inappwebview_ios:
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
flutter_qjs:
:path: ".symlinks/plugins/flutter_qjs/ios"
flutter_web_auth_2:
:path: ".symlinks/plugins/flutter_web_auth_2/ios"
isar_flutter_libs:
:path: ".symlinks/plugins/isar_flutter_libs/ios"
isar_community_flutter_libs:
:path: ".symlinks/plugins/isar_community_flutter_libs/ios"
just_audio:
:path: ".symlinks/plugins/just_audio/darwin"
media_kit_libs_ios_video:
@ -184,18 +189,19 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
app_links: 3dbc685f76b1693c66a6d9dd1e9ab6f73d97dc0a
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_discord_rpc_fork: 970cf2beca17870caf8645556de01ae2b8587bb6
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
flutter_qjs: 1d5918f42171154e88dd545dd45f126c0291976f
flutter_web_auth_2: 3464a7c16dc6480b6194fc89913bae6e82f28405
isar_flutter_libs: 9fc2cfb928c539e1b76c481ba5d143d556d94920
isar_community_flutter_libs: bede843185a61a05ff364a05c9b23209523f7e0d
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
@ -204,7 +210,7 @@ SPEC CHECKSUMS:
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
rust_lib_mangayomi: 360a904274b47351a0f7c26d3ce5aa6392bb8db3
screen_brightness_ios: 28c5fbdb40634de44f86025d84470158ad4df48c
screen_brightness_ios: 9953fd7da5bd480f1a93990daeec2eb42d4f3b52
SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
@ -213,7 +219,7 @@ SPEC CHECKSUMS:
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
PODFILE CHECKSUM: a57f30d18f102dd3ce366b1d62a55ecbef2158e5

View file

@ -483,7 +483,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -610,7 +610,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -659,7 +659,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;

View file

@ -19,10 +19,12 @@ class JsExtensionService implements ExtensionService {
late JavascriptRuntime runtime;
@override
late Source source;
bool _isInitialized = false;
JsExtensionService(this.source);
void _init() {
if (_isInitialized) return;
runtime = getJavascriptRuntime();
JsHttpClient(runtime).init();
JsDomSelector(runtime).init();
@ -79,6 +81,7 @@ async function jsonStringify(fn) {
runtime.evaluate('''${source.sourceCode}
var extention = new DefaultExtension();
''');
_isInitialized = true;
}
@override

View file

@ -4,11 +4,13 @@ import 'package:mangayomi/models/source.dart';
import 'dart/service.dart';
import 'javascript/service.dart';
import 'mihon/service.dart';
import 'lnreader/service.dart';
ExtensionService getExtensionService(Source source, String androidProxyServer) {
return switch (source.sourceCodeLanguage) {
SourceCodeLanguage.dart => DartExtensionService(source),
SourceCodeLanguage.javascript => JsExtensionService(source),
SourceCodeLanguage.mihon => MihonExtensionService(source, androidProxyServer),
SourceCodeLanguage.lnreader => LNReaderExtensionService(source),
};
}

184
lib/eval/lnreader/http.dart Normal file
View file

@ -0,0 +1,184 @@
import 'dart:convert';
import 'dart:io';
import 'package:d4rt/d4rt.dart';
import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:http/http.dart' as http;
class JsHttpClient {
late JavascriptRuntime runtime;
JsHttpClient(this.runtime);
void init() {
InterceptedClient client() {
return MClient.init();
}
runtime.onMessage('http_head', (dynamic args) async {
return await _toHttpResponse(client(), "HEAD", args);
});
runtime.onMessage('http_get', (dynamic args) async {
return await _toHttpResponse(client(), "GET", args);
});
runtime.onMessage('http_post', (dynamic args) async {
return await _toHttpResponse(client(), "POST", args);
});
runtime.onMessage('http_put', (dynamic args) async {
return await _toHttpResponse(client(), "PUT", args);
});
runtime.onMessage('http_delete', (dynamic args) async {
return await _toHttpResponse(client(), "DELETE", args);
});
runtime.onMessage('http_patch', (dynamic args) async {
return await _toHttpResponse(client(), "PATCH", args);
});
runtime.evaluate('''
class Response {
constructor(url, result) {
this.url = url;
this.response = JSON.parse(result);
}
get status() {
return this.response.statusCode;
}
get statusText() {
return this.response.reasonPhrase;
}
get ok() {
return this.status >= 200 && this.status <= 299;
}
get redirected() {
return this.response.isRedirect;
}
get headers() {
return this.response.headers;
}
get body() {
return this.response.body;
}
json() {
const val = JSON.parse(this.body);
return new Promise(function(resolve, reject) {
resolve(val);
});
}
text() {
const val = this.body;
return new Promise(function(resolve, reject) {
resolve(val);
});
}
}
async function fetchApi(url, init) {
const method = init?.method ? init.method.toLowerCase() : "get";
const result = await sendMessage(
"http_" + method,
JSON.stringify([url, init?.headers, init?.body])
);
return new Response(url, result);
}
''');
}
}
Future<String> _toHttpResponse(Client client, String method, List args) async {
final url = args[0] as String;
final headers = (args[1] as Map?)?.toMapStringString ?? {};
final body = args.length >= 3
? args[2] is List
? args[2] as List
: args[2] is String
? args[2] as String
: (args[2] as Map?)?.toMapStringDynamic
: null;
var request = http.Request(method, Uri.parse(url));
request.headers.addAll(headers);
if ((request.headers[HttpHeaders.contentTypeHeader]?.contains(
"application/json",
)) ??
false) {
request.body = json.encode(body);
request.headers.addAll(headers);
http.StreamedResponse response = await client.send(request);
final res = Response(
"",
response.statusCode,
request: response.request,
headers: response.headers,
isRedirect: response.isRedirect,
persistentConnection: response.persistentConnection,
reasonPhrase: response.reasonPhrase,
);
Map<String, dynamic> resMap = res.toJson();
resMap["body"] = await response.stream.bytesToString();
return jsonEncode(resMap);
}
String? formData;
if (body is Map && body.containsKey("_data")) {
formData = (body.get("_data") as List<dynamic>)
.map(
(e) =>
"${Uri.encodeQueryComponent(e[0])}"
"=${Uri.encodeQueryComponent(e[1])}",
)
.join("&");
headers["content-type"] =
"application/x-www-form-urlencoded; charset=UTF-8";
}
final future = switch (method) {
"HEAD" => client.head(Uri.parse(url), headers: headers),
"GET" => client.get(Uri.parse(url), headers: headers),
"POST" => client.post(
Uri.parse(url),
headers: headers,
body: formData ?? body,
),
"PUT" => client.put(
Uri.parse(url),
headers: headers,
body: formData ?? body,
),
"DELETE" => client.delete(
Uri.parse(url),
headers: headers,
body: formData ?? body,
),
_ => client.patch(Uri.parse(url), headers: headers, body: formData ?? body),
};
return jsonEncode((await future).toJson());
}
extension ResponseExtexsion on Response {
Map<String, dynamic> toJson() => {
'body': body,
'headers': headers,
'isRedirect': isRedirect,
'persistentConnection': persistentConnection,
'reasonPhrase': reasonPhrase,
'statusCode': statusCode,
'request': {
'contentLength': request?.contentLength,
'finalized': request?.finalized,
'followRedirects': request?.followRedirects,
'headers': request?.headers,
'maxRedirects': request?.maxRedirects,
'method': request?.method,
'persistentConnection': request?.persistentConnection,
'url': request?.url.toString(),
},
};
}
extension ToMapExtension on Map? {
Map<String, dynamic>? get toMapStringDynamic {
return this?.map((key, value) => MapEntry(key.toString(), value));
}
Map<String, String>? get toMapStringString {
return this?.map(
(key, value) => MapEntry(key.toString(), value.toString()),
);
}
}

View file

@ -0,0 +1,414 @@
import 'dart:convert';
import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:html/dom.dart';
import 'package:html/parser.dart';
import 'package:mangayomi/utils/extensions/dom_extensions.dart';
class JsCheerio {
late JavascriptRuntime runtime;
final Map<int, Element?> _elements = {};
int _elementKey = 0;
JsCheerio(this.runtime);
void init() {
runtime.onMessage('load', (dynamic args) {
final html = args[0];
final doc = parse(html);
_elementKey++;
_elements[_elementKey] = doc.body;
return _elementKey;
});
runtime.onMessage('element_call', (dynamic args) {
final method = args[0] as String;
final key = args[1] as int;
final element = _elements[key];
if (element == null) return null;
final methodArgs = args.length > 2 ? args[2] : [];
dynamic result;
switch (method) {
case 'text':
result = element.text;
break;
case 'html':
case 'innerHtml':
result = element.innerHtml;
break;
case 'outerHtml':
result = element.outerHtml;
break;
case 'addClass':
element.classes.add(methodArgs[0]);
break;
case 'removeClass':
element.classes.remove(methodArgs[0]);
break;
case 'hasClass':
result = element.classes.contains(methodArgs[0]);
break;
case 'attr':
result = element.attributes[methodArgs[0]] ?? '';
break;
case 'setAttr':
element.attributes[methodArgs[0]] = methodArgs[1];
break;
case 'removeAttr':
element.attributes.remove(methodArgs[0]);
break;
case 'val':
result = element.attributes['value'] ?? '';
break;
case 'setVal':
element.attributes['value'] = methodArgs[0];
break;
case 'children':
final children = element.children;
List<int> keys = [];
for (var child in children) {
_elementKey++;
_elements[_elementKey] = child;
keys.add(_elementKey);
}
result = jsonEncode(keys);
break;
case 'parent':
final parent = element.parent;
if (parent != null) {
_elementKey++;
_elements[_elementKey] = parent;
result = _elementKey;
}
break;
case 'find':
final selector = methodArgs[0];
final elements = element.select(selector);
List<int> keys = [];
for (var el in elements ?? []) {
_elementKey++;
_elements[_elementKey] = el;
keys.add(_elementKey);
}
result = jsonEncode(keys);
break;
case 'first':
final first = element.children.firstOrNull;
if (first != null) {
_elementKey++;
_elements[_elementKey] = first;
result = _elementKey;
}
break;
case 'last':
final last = element.children.lastOrNull;
if (last != null) {
_elementKey++;
_elements[_elementKey] = last;
result = _elementKey;
}
break;
case 'next':
final next = element.nextElementSibling;
if (next != null) {
_elementKey++;
_elements[_elementKey] = next;
result = _elementKey;
}
break;
case 'prev':
final prev = element.previousElementSibling;
if (prev != null) {
_elementKey++;
_elements[_elementKey] = prev;
result = _elementKey;
}
break;
case 'append':
final htmlToAppend = methodArgs[0];
final newNodes = parse(htmlToAppend).children;
for (var node in newNodes) {
element.append(node);
}
break;
case 'prepend':
final htmlToPrepend = methodArgs[0];
final newNodes = parse(htmlToPrepend).children;
for (var node in newNodes.reversed) {
element.insertBefore(node, element.firstChild);
}
break;
case 'empty':
element.children.clear();
break;
case 'remove':
element.remove();
break;
default:
result = 'Unsupported method: $method';
}
return result;
});
runtime.evaluate('''
class Element {
constructor(key) {
this._key = key;
}
_call(method, args = []) {
return sendMessage("element_call", JSON.stringify([method, this._key, args]));
}
text() { return this._call("text"); }
html() { return this._call("html"); }
outerHtml() { return this._call("outerHtml"); }
val() { return this._call("val"); }
attr(name) { return this._call("attr", [name]); }
hasClass(cls) { return this._call("hasClass", [cls]); }
addClass(cls) { this._call("addClass", [cls]); return this; }
removeClass(cls) { this._call("removeClass", [cls]); return this; }
setAttr(name, value) { this._call("setAttr", [name, value]); return this; }
removeAttr(name) { this._call("removeAttr", [name]); return this; }
setVal(value) { this._call("setVal", [value]); return this; }
append(html) { this._call("append", [html]); return this; }
prepend(html) { this._call("prepend", [html]); return this; }
empty() { this._call("empty"); return this; }
remove() { this._call("remove"); return this; }
children() {
const keys = JSON.parse(this._call("children"));
return new ElementCollection(keys.map(k => new Element(k)));
}
find(selector) {
const keys = JSON.parse(this._call("find", [selector]));
return new ElementCollection(keys.map(k => new Element(k)));
}
parent() {
return new Element(this._call("parent"));
}
next() {
return new Element(this._call("next"));
}
prev() {
return new Element(this._call("prev"));
}
first() {
return new Element(this._call("first"));
}
last() {
return new Element(this._call("last"));
}
}
class ElementCollection {
constructor(elements) {
this.elements = elements;
}
text() {
return this.map(function(i, el) {
return el.text();
}).toArray().join("\\n") ?? "";
}
html() {
return this.first()?.html();
}
outerHtml() {
return this.first()?.outerHtml();
}
attr(name) {
return this.first()?.attr(name);
}
hasClass(cls) {
return this.first()?.hasClass(cls);
}
each(fn) {
this.elements.forEach((el, i) => fn(i, el));
return this;
}
map(fn) {
return new ElementCollection(this.elements.map((el, i) => fn(i, el)));
}
filter(fn) {
return new ElementCollection(this.elements.filter(function (el, i) {
try {
return fn(i, el);
} catch (_) {
return false;
}
}));
}
addClass(cls) {
this.elements.forEach(el => el.addClass(cls));
return this;
}
removeClass(cls) {
this.elements.forEach(el => el.removeClass(cls));
return this;
}
setAttr(name, value) {
this.elements.forEach(el => el.setAttr(name, value));
return this;
}
removeAttr(name) {
this.elements.forEach(el => el.removeAttr(name));
return this;
}
setVal(value) {
this.elements.forEach(el => el.setVal(value));
return this;
}
append(html) {
this.elements.forEach(el => el.append(html));
return this;
}
prepend(html) {
this.elements.forEach(el => el.prepend(html));
return this;
}
empty() {
this.elements.forEach(el => el.empty());
return this;
}
remove() {
this.elements.forEach(el => el.remove());
return this;
}
find(selector) {
const found = this.elements.flatMap(el => {
const keys = JSON.parse(el._call("find", [selector]));
return keys.map(k => new Element(k));
});
return new ElementCollection(found);
}
children() {
const children = this.elements.flatMap(el => {
const keys = JSON.parse(el._call("children"));
return keys.map(k => new Element(k));
});
return new ElementCollection(children);
}
parent() {
const parents = this.elements.map(el => new Element(el._call("parent")));
return new ElementCollection(parents);
}
next() {
const nextEls = this.elements.map(el => new Element(el._call("next")));
return new ElementCollection(nextEls);
}
prev() {
const prevEls = this.elements.map(el => new Element(el._call("prev")));
return new ElementCollection(prevEls);
}
first() {
return this.get(0);
}
last() {
return this.get(this.elements.length - 1);
}
get(index) {
return this.elements[index] || new Stub();
}
length() {
return this.elements.length;
}
toArray() {
return this.elements;
}
[Symbol.iterator]() {
return this.elements[Symbol.iterator]();
}
}
class Stub {
text() {
return null;
}
html() {
return null;
}
outerHtml() {
return null;
}
val() {
return null;
}
attr(name) {
return null;
}
hasClass(cls) {
return false;
}
}
function load(html) {
const rootKey = sendMessage("load", JSON.stringify([html]));
const root = new Element(rootKey);
const \$ = function(input) {
if (input instanceof ElementCollection) {
return input;
} else if (input instanceof Element) {
return input;
} else if (typeof input === "string") {
return root.find(input); // returns ElementCollection
} else if (input && input._key) {
return new ElementCollection([new Element(input._key)]);
} else {
return new ElementCollection([new Element(input)]);
}
};
\$.html = function() {
return root.html();
};
\$.root = root;
\$.Element = Element;
\$.Collection = ElementCollection;
return \$;
}
''');
}
}

View file

@ -0,0 +1,202 @@
import 'package:flutter_qjs/flutter_qjs.dart';
class JsHtmlParser {
late JavascriptRuntime runtime;
JsHtmlParser(this.runtime);
void init() {
runtime.evaluate('''
class Parser {
constructor(options = {}) {
this.options = options;
this.buffer = '';
}
isVoidElement(name) {
return [
"area",
"base",
"basefont",
"br",
"col",
"command",
"embed",
"frame",
"hr",
"img",
"input",
"isindex",
"keygen",
"link",
"meta",
"param",
"source",
"track",
"wbr",
].includes(name);
}
write(html) {
this.buffer += html;
let i = 0;
let textStart = 0;
const len = this.buffer.length;
let insideQuote = null;
while (i < len) {
const ch = this.buffer[i];
// Track string literals
if ((ch === '"' || ch === "'")) {
if (insideQuote === ch) {
insideQuote = null;
} else if (insideQuote === null) {
insideQuote = ch;
}
i++;
continue;
}
if (ch === '<' && insideQuote === null) {
// Emit any text before the tag
if (i > textStart && this.options.ontext) {
const text = this.buffer.slice(textStart, i);
this.options.ontext(text);
}
const tagStart = i;
i++;
const isClosing = this.buffer[i] === '/';
if (isClosing) i++;
// Parse tag name
const nameStart = i;
while (i < len && /[a-zA-Z0-9:-]/.test(this.buffer[i])) i++;
const nameEnd = i;
const tagName = this.buffer.slice(nameStart, nameEnd);
if (isClosing) {
if (this.options.onclosetag) {
this.options.onclosetag(tagName);
}
} else {
if (this.options.onopentagname) {
this.options.onopentagname(tagName);
}
}
// Parse attributes
let attrs = {};
let attrName = '';
let attrValue = '';
let readingAttrName = true;
let inAttrQuote = null;
while (i < len && this.buffer[i] !== '>') {
const c = this.buffer[i];
// Skip over whitespace
if (/\\s/.test(c)) {
i++;
continue;
}
// Handle self-closing tag
if (c === '/' && this.buffer[i + 1] === '>') {
if (!isClosing && this.options.onselfclosingtag) {
this.options.onselfclosingtag();
}
i += 2;
textStart = i;
if (this.options.onopentag) {
this.options.onopentag(tagName, attrs);
}
if (this.options.onopentagend) {
this.options.onopentagend();
}
continue;
}
// Parse attribute name
let attrStart = i;
while (i < len && /[^\\s=>]/.test(this.buffer[i])) i++;
attrName = this.buffer.slice(attrStart, i);
// Skip whitespace after name
while (i < len && /\\s/.test(this.buffer[i])) i++;
// Expect '='
if (this.buffer[i] === '=') {
i++; // skip '='
// Skip whitespace after '='
while (i < len && /\\s/.test(this.buffer[i])) i++;
const quote = this.buffer[i];
if (quote === '"' || quote === "'") {
inAttrQuote = quote;
i++; // skip quote
const valStart = i;
while (i < len && this.buffer[i] !== inAttrQuote) i++;
attrValue = this.buffer.slice(valStart, i);
i++; // skip closing quote
} else {
// Unquoted value
const valStart = i;
while (i < len && /[^\\s>]/.test(this.buffer[i])) i++;
attrValue = this.buffer.slice(valStart, i);
}
// Emit merged attribute callback
if (this.options.onattribute) {
this.options.onattribute(attrName, attrValue);
}
attrs[attrName] = attrValue;
attrName = '';
attrValue = '';
} else {
// attribute without value (e.g. `disabled`)
if (this.options.onattribute) {
this.options.onattribute(attrName, null);
}
attrs[attrName] = null;
attrName = '';
}
}
// Closing normal tag '>'
i++; // skip '>'
if (!isClosing && this.options.onopentag) {
this.options.onopentag(tagName, attrs);
}
if (this.options.onopentagend) {
this.options.onopentagend();
}
textStart = i;
} else {
i++;
}
}
// Emit any remaining text
if (textStart < len && this.options.ontext) {
const text = this.buffer.slice(textStart, len);
this.options.ontext(text);
}
}
end() {
if (this.options.onend) {
this.options.onend();
}
}
}
''');
}
}

View file

@ -0,0 +1,159 @@
import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:mangayomi/utils/log/log.dart';
class JsLibs {
late JavascriptRuntime runtime;
JsLibs(this.runtime);
void init() {
runtime.onMessage('log', (dynamic args) {
Logger.add(LoggerLevel.warning, "${args[0]}");
return null;
});
runtime.onMessage('urlencode', (dynamic args) {
return Uri.encodeComponent(args[0]);
});
runtime.onMessage('urldecode', (dynamic args) {
return Uri.decodeComponent(args[0]);
});
runtime.evaluate('''
console.log = function (message) {
if (typeof message === "object") {
message = JSON.stringify(message);
}
sendMessage("log", JSON.stringify([message.toString()]));
};
console.warn = function (message) {
if (typeof message === "object") {
message = JSON.stringify(message);
}
sendMessage("log", JSON.stringify([message.toString()]));
};
console.error = function (message) {
if (typeof message === "object") {
message = JSON.stringify(message);
}
sendMessage("log", JSON.stringify([message.toString()]));
};
String.prototype.substringAfter = function(pattern) {
const startIndex = this.indexOf(pattern);
if (startIndex === -1) return this.substring(0);
const start = startIndex + pattern.length;
return this.substring(start);
}
String.prototype.substringAfterLast = function(pattern) {
return this.split(pattern).pop();
}
String.prototype.substringBefore = function(pattern) {
const endIndex = this.indexOf(pattern);
if (endIndex === -1) return this.substring(0);
return this.substring(0, endIndex);
}
String.prototype.substringBeforeLast = function(pattern) {
const endIndex = this.lastIndexOf(pattern);
if (endIndex === -1) return this.substring(0);
return this.substring(0, endIndex);
}
String.prototype.substringBetween = function(left, right) {
let startIndex = 0;
let index = this.indexOf(left, startIndex);
if (index === -1) return "";
let leftIndex = index + left.length;
let rightIndex = this.indexOf(right, leftIndex);
if (rightIndex === -1) return "";
startIndex = rightIndex + right.length;
return this.substring(leftIndex, rightIndex);
}
async function jsonStringify(fn) {
return JSON.stringify(await fn());
}
const isUrlAbsolute = url => {
if (url) {
if (url.indexOf("//") === 0) {
return true
} // URL is protocol-relative (= absolute)
if (url.indexOf("://") === -1) {
return false
} // URL has no protocol (= relative)
if (url.indexOf(".") === -1) {
return false
} // URL does not contain a dot, i.e. no TLD (= relative, possibly REST)
if (url.indexOf("/") === -1) {
return false
} // URL does not contain a single slash (= relative)
if (url.indexOf(":") > url.indexOf("/")) {
return false
} // The first colon comes after the first slash (= relative)
if (url.indexOf("://") < url.indexOf(".")) {
return true
} // Protocol is defined before first dot (= absolute)
}
return false // Anything else must be relative
}
const NovelStatus = {
"Unknown": "Unknown",
"Ongoing": "Ongoing",
"Completed": "Completed",
"Licensed": "Licensed",
"PublishingFinished": "Publishing Finished",
"Cancelled": "Cancelled",
"OnHiatus": "On Hiatus"
};
const FilterTypes = {
"TextInput": "Text",
"Picker": "Picker",
"CheckboxGroup": "Checkbox",
"Switch": "Switch",
"ExcludableCheckboxGroup": "XCheckbox"
};
const isPickerValue = q => {
return q.type === FilterTypes.Picker && typeof q.value === "string"
}
const isCheckboxValue = q => {
return q.type === FilterTypes.CheckboxGroup && Array.isArray(q.value)
}
const isSwitchValue = q => {
return q.type === FilterTypes.Switch && typeof q.value === "boolean"
}
const isTextValue = q => {
return q.type === FilterTypes.TextInput && typeof q.value === "string"
}
const isXCheckboxValue = q => {
return (
q.type === FilterTypes.ExcludableCheckboxGroup &&
typeof q.value === "object" &&
!Array.isArray(q.value)
)
}
function urlencode(input) {
return sendMessage(
"urlencode",
JSON.stringify([input])
);
}
function urldecode(input) {
return sendMessage(
"urldecode",
JSON.stringify([input])
);
}
''');
}
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,139 @@
class ChapterItem {
String name;
String path;
String? releaseTime;
int? chapterNumber;
String? page;
ChapterItem({
required this.name,
required this.path,
this.releaseTime,
this.chapterNumber,
this.page,
});
factory ChapterItem.fromJson(Map<String, dynamic> json) {
return ChapterItem(
name: json['name'],
path: json['path'],
releaseTime: json['releaseTime'],
chapterNumber: json['chapterNumber'] != null
? (json['chapterNumber'] as num?)?.toInt() ??
int.tryParse(json['chapterNumber'])
: null,
page: json['page'],
);
}
Map<String, dynamic> toJson() {
return {
'name': name,
'path': path,
'releaseTime': releaseTime,
'chapterNumber': chapterNumber,
'page': page,
};
}
}
class NovelItem {
String name;
String path;
String? cover;
NovelItem({required this.name, required this.path, this.cover});
factory NovelItem.fromJson(Map<String, dynamic> json) {
return NovelItem(
name: json['name'],
path: json['path'],
cover: json['cover'],
);
}
Map<String, dynamic> toJson() {
return {'name': name, 'path': path, 'cover': cover};
}
}
class SourceNovel extends NovelItem {
String? genres;
String? summary;
String? author;
String? artist;
String? status;
double? rating;
List<ChapterItem>? chapters;
SourceNovel({
required super.name,
required super.path,
super.cover,
this.genres,
this.summary,
this.author,
this.artist,
this.status,
this.rating,
this.chapters,
});
factory SourceNovel.fromJson(Map<String, dynamic> json) {
if (json['path'] == null) {
throw 'path is null';
}
return SourceNovel(
name: json['name'] ?? '',
path: json['path'],
cover: json['cover'],
genres: json['genres'],
summary: json['summary'],
author: json['author'],
artist: json['artist'],
status: json['status'],
rating: json['rating'] is double
? json['rating']
: json['rating']?.toDouble(),
chapters: (json['chapters'] as List<dynamic>?)
?.map((item) => ChapterItem.fromJson(item))
.toList(),
);
}
@override
Map<String, dynamic> toJson() {
return {
'name': name,
'path': path,
'cover': cover,
'genres': genres,
'summary': summary,
'author': author,
'artist': artist,
'status': status,
'rating': rating,
'chapters': chapters?.map((item) => item.toJson()).toList(),
};
}
}
class SourcePage {
List<ChapterItem> chapters;
SourcePage({required this.chapters});
factory SourcePage.fromJson(Map<String, dynamic> json) {
return SourcePage(
chapters:
(json['chapters'] as List<dynamic>?)
?.map((item) => ChapterItem.fromJson(item))
.toList() ??
[],
);
}
Map<String, dynamic> toJson() {
return {'chapters': chapters.map((item) => item.toJson()).toList()};
}
}

View file

@ -0,0 +1,283 @@
import 'dart:convert';
import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:mangayomi/eval/lnreader/http.dart';
import 'package:mangayomi/eval/lnreader/m_plugin.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart';
import '../interface.dart';
import 'js_cheerio.dart';
import 'js_htmlparser.dart';
import 'js_libs.dart';
import 'js_polyfills.dart';
JavascriptRuntime getJavascriptRuntime({
Map<String, dynamic>? extraArgs = const {},
}) {
JavascriptRuntime runtime;
runtime = QuickJsRuntime2(stackSize: 1024 * 1024 * 4);
runtime.enableHandlePromises();
return runtime;
}
class LNReaderExtensionService implements ExtensionService {
late JavascriptRuntime runtime;
@override
late Source source;
bool _isInitialized = false;
LNReaderExtensionService(this.source);
void _init() {
if (_isInitialized) return;
runtime = getJavascriptRuntime();
runtime.evaluate('''
module={},exports=Function("return this")(),Object.defineProperties(module,{namespace:{set:function(a){exports=a}},exports:{set:function(a){for(var b in a)a.hasOwnProperty(b)&&(exports[b]=a[b])},get:function(){return exports}}});
''');
JsPolyfills(runtime).init();
JsHttpClient(runtime).init();
JsLibs(runtime).init();
JsHtmlParser(runtime).init();
JsCheerio(runtime).init();
runtime.evaluate('''
const require = (package) => {
switch (package) {
case "htmlparser2":
return {Parser: Parser};
case "cheerio":
return {load: load};
case "dayjs":
return module.exports.dayjs;
case "urlencode":
return {encode: urlencode, decode: urldecode};
case "@libs/fetch":
return {fetchApi: fetchApi};
case "@libs/novelStatus":
return {NovelStatus: NovelStatus};
case "@libs/isAbsoluteUrl":
return {isUrlAbsolute: isUrlAbsolute};
case "@libs/filterInputs":
return {
FilterTypes: FilterTypes,
isPickerValue: isPickerValue,
isCheckboxValue: isCheckboxValue,
isSwitchValue: isSwitchValue,
isTextValue: isTextValue,
isXCheckboxValue: isXCheckboxValue
};
case "@libs/defaultCover":
return {defaultCover: 'https://raw.githubusercontent.com/LNReader/lnreader-plugins/refs/heads/master/public/static/coverNotAvailable.webp'};
case "@libs/storage":
return {storage: {get: () => null}};
default:
return {};
}
};
''');
runtime.evaluate('''
${source.sourceCode}
const extension = exports.default;
''');
_isInitialized = true;
}
@override
Map<String, String> getHeaders() {
return {};
}
@override
bool get supportsLatest {
return true;
}
@override
String get sourceBaseUrl {
return source.baseUrl!;
}
@override
Future<MPages> getPopular(int page) async {
final items =
((await _extensionCallAsync(
'popularNovels($page, {showLatestNovels: false, filters: extension.filters})',
[],
)))
.map((e) => NovelItem.fromJson(e))
.map(
(e) => MManga(
name: e.name,
imageUrl: e.cover,
link: e.path,
chapters: [],
),
)
.toList();
return MPages(list: items, hasNextPage: true);
}
@override
Future<MPages> getLatestUpdates(int page) async {
final items =
((await _extensionCallAsync(
'popularNovels($page, {showLatestNovels: true, filters: extension.filters})',
[],
)))
.map((e) => NovelItem.fromJson(e))
.map(
(e) => MManga(
name: e.name,
imageUrl: e.cover,
link: e.path,
chapters: [],
),
)
.toList();
return MPages(list: items, hasNextPage: true);
}
@override
Future<MPages> search(String query, int page, List<dynamic> filters) async {
final items =
((await _extensionCallAsync('searchNovels("$query",$page)', [])))
.map((e) => NovelItem.fromJson(e))
.map(
(e) => MManga(
name: e.name,
imageUrl: e.cover,
link: e.path,
chapters: [],
),
)
.toList();
return MPages(list: items, hasNextPage: true);
}
@override
Future<MManga> getDetail(String url) async {
final item = SourceNovel.fromJson(
await _extensionCallAsync('parseNovel(`$url`)', {}),
);
final chapters = SourcePage.fromJson(
await _extensionCallAsync('parsePage(`${item.path}`, `1`)', {}),
);
final chaps =
((chapters.chapters.isNotEmpty ? chapters.chapters : item.chapters)
?.map(
(e) => MChapter(
name: e.name,
url: e.path,
dateUpload: e.releaseTime != null
? DateTime.tryParse(
e.releaseTime!,
)?.millisecondsSinceEpoch.toString() ??
int.tryParse(e.releaseTime!)?.toString() ??
DateTime.now().millisecondsSinceEpoch.toString()
: DateTime.now().millisecondsSinceEpoch.toString(),
),
)
.toList() ??
[]);
return MManga(
name: item.name,
imageUrl: item.cover,
link: item.path,
artist: item.artist,
author: item.author,
description: item.summary,
status: switch (item.status) {
"Ongoing" => Status.ongoing,
"Completed" => Status.completed,
_ => Status.unknown,
},
genre: item.genres?.split(","),
chapters: chaps.reversed.toList(),
);
}
@override
Future<List<PageUrl>> getPageList(String url) async {
return [];
}
@override
Future<List<Video>> getVideoList(String url) async {
return [];
}
@override
Future<String> getHtmlContent(String name, String url) async {
_init();
final res = (await runtime.handlePromise(
await runtime.evaluateAsync(
'jsonStringify(() => extension.parseChapter(`$url`))',
),
)).stringResult;
return res;
}
@override
Future<String> cleanHtmlContent(String html) async {
return html;
}
@override
FilterList getFilterList() {
List<dynamic> list;
try {
list = fromJsonFilterValuesToList(_extensionCall('filters', []));
} catch (_) {
list = [];
}
return FilterList(list);
}
@override
List<SourcePreference> getSourcePreferences() {
return _extensionCall(
'pluginSettings',
[],
).map((e) => SourcePreference.fromJson(e)..sourceId = source.id).toList();
}
T _extensionCall<T>(String call, T def) {
_init();
try {
final res = runtime.evaluate('JSON.stringify(extension.$call)');
return jsonDecode(res.stringResult) as T;
} catch (_) {
if (def != null) {
return def;
}
rethrow;
}
}
Future<T> _extensionCallAsync<T>(String call, T def) async {
_init();
try {
final promised = await runtime.handlePromise(
await runtime.evaluateAsync('jsonStringify(() => extension.$call)'),
);
return jsonDecode(promised.stringResult) as T;
} catch (e) {
if (def != null) {
return def;
}
rethrow;
}
}
}

View file

@ -1,6 +1,6 @@
import 'dart:math';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
part 'source_preference.g.dart';
@collection

View file

@ -74,7 +74,7 @@ const SourcePreferenceSchema = CollectionSchema(
getId: _sourcePreferenceGetId,
getLinks: _sourcePreferenceGetLinks,
attach: _sourcePreferenceAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _sourcePreferenceEstimateSize(
@ -993,7 +993,7 @@ const SourcePreferenceStringValueSchema = CollectionSchema(
getId: _sourcePreferenceStringValueGetId,
getLinks: _sourcePreferenceStringValueGetLinks,
attach: _sourcePreferenceStringValueAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _sourcePreferenceStringValueEstimateSize(

View file

@ -452,6 +452,7 @@
"custom_dns": "Custom DNS (leave blank to use system DNS)",
"android_proxy_server": "Android Proxy Server (ApkBridge)",
"get_apk_bridge": "Get ApkBridge",
"get_sync_server": "Get Sync Server here",
"undefined": "undefined",
"empty_extensions_repo": "You don't have any repository urls here. Click on the plus button to add one!",
"add_extensions_repo": "Add repo URL",

View file

@ -2787,6 +2787,12 @@ abstract class AppLocalizations {
/// **'Get ApkBridge'**
String get get_apk_bridge;
/// No description provided for @get_sync_server.
///
/// In en, this message translates to:
/// **'Get Sync Server here'**
String get get_sync_server;
/// No description provided for @undefined.
///
/// In en, this message translates to:

View file

@ -1430,6 +1430,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'غير محدد';

View file

@ -1432,6 +1432,9 @@ class AppLocalizationsAs extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'undefined';

View file

@ -1441,6 +1441,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Nicht definiert';

View file

@ -1431,6 +1431,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'undefined';

View file

@ -1445,6 +1445,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Indefinido';

View file

@ -1448,6 +1448,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Indéfini';

View file

@ -1433,6 +1433,9 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'undefined';

View file

@ -1437,6 +1437,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Tidak terdefinisi';

View file

@ -1445,6 +1445,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Non definito';

View file

@ -1442,6 +1442,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Indefinido';

View file

@ -1444,6 +1444,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Не определено';

View file

@ -1431,6 +1431,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'ไม่ได้กำหนด';

View file

@ -1437,6 +1437,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => 'Tanımsız';

View file

@ -1405,6 +1405,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get get_sync_server => 'Get Sync Server here';
@override
String get undefined => '未定义';

View file

@ -12,7 +12,7 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_flutter/adapters.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/custom_button.dart';
import 'package:mangayomi/models/manga.dart';
@ -73,7 +73,7 @@ void main(List<String> args) async {
await storage.requestPermission();
await _migrateOldLayout();
isar = await storage.initDB(null, inspector: kDebugMode);
runApp(const ProviderScope(child: MyApp()));
runApp(ProviderScope(child: MyApp(), retry: (retryCount, error) => null));
unawaited(_postLaunchInit(storage)); // Defer non-essential async operations
}
@ -404,7 +404,13 @@ class _MyAppState extends ConsumerState<MyApp> {
status: track.TrackStatus.completed,
);
ref
.read(trackStateProvider(track: temp, itemType: null).notifier)
.read(
trackStateProvider(
track: temp,
itemType: null,
widgetRef: ref,
).notifier,
)
.checkRefresh();
}
}

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/manga.dart';
part 'category.g.dart';

View file

@ -46,7 +46,7 @@ const CategorySchema = CollectionSchema(
getId: _categoryGetId,
getLinks: _categoryGetLinks,
attach: _categoryAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _categoryEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
part 'changed.g.dart';
@collection

View file

@ -44,7 +44,7 @@ const ChangedPartSchema = CollectionSchema(
getId: _changedPartGetId,
getLinks: _changedPartGetLinks,
attach: _changedPartAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _changedPartEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/manga.dart';
part 'chapter.g.dart';

View file

@ -93,7 +93,7 @@ const ChapterSchema = CollectionSchema(
getId: _chapterGetId,
getLinks: _chapterGetLinks,
attach: _chapterAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _chapterEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
part 'custom_button.g.dart';
@collection

View file

@ -58,7 +58,7 @@ const CustomButtonSchema = CollectionSchema(
getId: _customButtonGetId,
getLinks: _customButtonGetLinks,
attach: _customButtonAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _customButtonEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/chapter.dart';
part 'download.g.dart';

View file

@ -55,7 +55,7 @@ const DownloadSchema = CollectionSchema(
getId: _downloadGetId,
getLinks: _downloadGetLinks,
attach: _downloadAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _downloadEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
part 'history.g.dart';

View file

@ -57,7 +57,7 @@ const HistorySchema = CollectionSchema(
getId: _historyGetId,
getLinks: _historyGetLinks,
attach: _historyAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _historyEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/chapter.dart';
part 'manga.g.dart';

View file

@ -112,7 +112,7 @@ const MangaSchema = CollectionSchema(
getId: _mangaGetId,
getLinks: _mangaGetLinks,
attach: _mangaAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _mangaEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/utils/constant.dart';
part 'settings.g.dart';
@ -281,7 +281,7 @@ class Settings {
late AudioChannel audioChannels;
int? volumeBoostCap;
bool? downloadedOnlyMode;
late AlgorithmWeights? algorithmWeights;

View file

@ -777,7 +777,7 @@ const SettingsSchema = CollectionSchema(
getId: _settingsGetId,
getLinks: _settingsGetLinks,
attach: _settingsAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _settingsEstimateSize(

View file

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/models/manga.dart';
@ -135,7 +135,7 @@ class Source {
filterList = json['filterList'];
preferenceList = json['preferenceList'];
iconUrl = json['iconUrl'];
id = json['id'];
id = json['id'] is int ? json['id'] : null;
isActive = json['isActive'];
isAdded = json['isAdded'];
isFullData = json['isFullData'];
@ -216,4 +216,4 @@ class Source {
}
}
enum SourceCodeLanguage { dart, javascript, mihon }
enum SourceCodeLanguage { dart, javascript, mihon, lnreader }

View file

@ -145,7 +145,7 @@ const SourceSchema = CollectionSchema(
getId: _sourceGetId,
getLinks: _sourceGetLinks,
attach: _sourceAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _sourceEstimateSize(
@ -475,11 +475,13 @@ const _SourcesourceCodeLanguageEnumValueMap = {
'dart': 0,
'javascript': 1,
'mihon': 2,
'lnreader': 3,
};
const _SourcesourceCodeLanguageValueEnumMap = {
0: SourceCodeLanguage.dart,
1: SourceCodeLanguage.javascript,
2: SourceCodeLanguage.mihon,
3: SourceCodeLanguage.lnreader,
};
Id _sourceGetId(Source object) {

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
part 'sync_preference.g.dart';
@collection

View file

@ -74,7 +74,7 @@ const SyncPreferenceSchema = CollectionSchema(
getId: _syncPreferenceGetId,
getLinks: _syncPreferenceGetLinks,
attach: _syncPreferenceAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _syncPreferenceEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/manga.dart';
part 'track.g.dart';

View file

@ -84,7 +84,7 @@ const TrackSchema = CollectionSchema(
getId: _trackGetId,
getLinks: _trackGetLinks,
attach: _trackAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _trackEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
part 'track_preference.g.dart';
@collection

View file

@ -43,7 +43,7 @@ const TrackPreferenceSchema = CollectionSchema(
getId: _trackPreferenceGetId,
getLinks: _trackPreferenceGetLinks,
attach: _trackPreferenceAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _trackPreferenceEstimateSize(

View file

@ -1,4 +1,4 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/chapter.dart';
part 'update.g.dart';

View file

@ -50,7 +50,7 @@ const UpdateSchema = CollectionSchema(
getId: _updateGetId,
getLinks: _updateGetLinks,
attach: _updateAttach,
version: '3.1.0+1',
version: '3.3.0-dev.3',
);
int _updateEstimateSize(

View file

@ -986,6 +986,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo
_currentPosition.dispose();
_subDelayController.dispose();
_subSpeedController.dispose();
_streamController.keepAliveLink?.close();
super.dispose();
}
@ -2260,17 +2261,19 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo
if (context.mounted) {
final box =
context.findRenderObject() as RenderBox?;
await Share.shareXFiles(
[
XFile.fromData(
imageBytes!,
name: name,
mimeType: 'image/png',
),
],
sharePositionOrigin:
box!.localToGlobal(Offset.zero) &
box.size,
await SharePlus.instance.share(
ShareParams(
files: [
XFile.fromData(
imageBytes!,
name: name,
mimeType: 'image/png',
),
],
sharePositionOrigin:
box!.localToGlobal(Offset.zero) &
box.size,
),
);
}
},

View file

@ -1,5 +1,5 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:flutter_riverpod/misc.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/history.dart';
@ -10,16 +10,23 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi
import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart';
import 'package:mangayomi/services/aniskip.dart';
import 'package:mangayomi/utils/chapter_recognition.dart';
import 'package:mangayomi/utils/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'anime_player_controller_provider.g.dart';
final fullscreenProvider = StateProvider<bool>((ref) => false);
final fullscreenProvider = StateProvider<bool>(() => false);
@riverpod
class AnimeStreamController extends _$AnimeStreamController {
@override
void build({required Chapter episode}) {}
KeepAliveLink build({required Chapter episode}) {
_keepAliveLink = ref.keepAlive();
return _keepAliveLink!;
}
KeepAliveLink? _keepAliveLink;
KeepAliveLink? get keepAliveLink => _keepAliveLink;
Manga getAnime() {
return episode.manga.value!;
}

View file

@ -6,159 +6,104 @@ part of 'anime_player_controller_provider.dart';
// RiverpodGenerator
// **************************************************************************
String _$animeStreamControllerHash() =>
r'46cc71afefa3b3c060f7a28c61dc13e1d0b94999';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$AnimeStreamController
extends BuildlessAutoDisposeNotifier<void> {
late final Chapter episode;
void build({required Chapter episode});
}
/// See also [AnimeStreamController].
@ProviderFor(AnimeStreamController)
const animeStreamControllerProvider = AnimeStreamControllerFamily();
const animeStreamControllerProvider = AnimeStreamControllerFamily._();
/// See also [AnimeStreamController].
class AnimeStreamControllerFamily extends Family<void> {
/// See also [AnimeStreamController].
const AnimeStreamControllerFamily();
final class AnimeStreamControllerProvider
extends $NotifierProvider<AnimeStreamController, KeepAliveLink> {
const AnimeStreamControllerProvider._({
required AnimeStreamControllerFamily super.from,
required Chapter super.argument,
}) : super(
retry: null,
name: r'animeStreamControllerProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
/// See also [AnimeStreamController].
AnimeStreamControllerProvider call({required Chapter episode}) {
return AnimeStreamControllerProvider(episode: episode);
@override
String debugGetCreateSourceHash() => _$animeStreamControllerHash();
@override
String toString() {
return r'animeStreamControllerProvider'
''
'($argument)';
}
@$internal
@override
AnimeStreamControllerProvider getProviderOverride(
covariant AnimeStreamControllerProvider provider,
) {
return call(episode: provider.episode);
}
AnimeStreamController create() => AnimeStreamController();
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'animeStreamControllerProvider';
}
/// See also [AnimeStreamController].
class AnimeStreamControllerProvider
extends AutoDisposeNotifierProviderImpl<AnimeStreamController, void> {
/// See also [AnimeStreamController].
AnimeStreamControllerProvider({required Chapter episode})
: this._internal(
() => AnimeStreamController()..episode = episode,
from: animeStreamControllerProvider,
name: r'animeStreamControllerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$animeStreamControllerHash,
dependencies: AnimeStreamControllerFamily._dependencies,
allTransitiveDependencies:
AnimeStreamControllerFamily._allTransitiveDependencies,
episode: episode,
);
AnimeStreamControllerProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.episode,
}) : super.internal();
final Chapter episode;
@override
void runNotifierBuild(covariant AnimeStreamController notifier) {
return notifier.build(episode: episode);
}
@override
Override overrideWith(AnimeStreamController Function() create) {
return ProviderOverride(
/// {@macro riverpod.override_with_value}
Override overrideWithValue(KeepAliveLink value) {
return $ProviderOverride(
origin: this,
override: AnimeStreamControllerProvider._internal(
() => create()..episode = episode,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
episode: episode,
),
providerOverride: $SyncValueProvider<KeepAliveLink>(value),
);
}
@override
AutoDisposeNotifierProviderElement<AnimeStreamController, void>
createElement() {
return _AnimeStreamControllerProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is AnimeStreamControllerProvider && other.episode == episode;
return other is AnimeStreamControllerProvider && other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, episode.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin AnimeStreamControllerRef on AutoDisposeNotifierProviderRef<void> {
/// The parameter `episode` of this provider.
Chapter get episode;
}
String _$animeStreamControllerHash() =>
r'486889b2b9f71759e4d9ff147b039436572cc01e';
class _AnimeStreamControllerProviderElement
extends AutoDisposeNotifierProviderElement<AnimeStreamController, void>
with AnimeStreamControllerRef {
_AnimeStreamControllerProviderElement(super.provider);
final class AnimeStreamControllerFamily extends $Family
with
$ClassFamilyOverride<
AnimeStreamController,
KeepAliveLink,
KeepAliveLink,
KeepAliveLink,
Chapter
> {
const AnimeStreamControllerFamily._()
: super(
retry: null,
name: r'animeStreamControllerProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
AnimeStreamControllerProvider call({required Chapter episode}) =>
AnimeStreamControllerProvider._(argument: episode, from: this);
@override
Chapter get episode => (origin as AnimeStreamControllerProvider).episode;
String toString() => r'animeStreamControllerProvider';
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
abstract class _$AnimeStreamController extends $Notifier<KeepAliveLink> {
late final _$args = ref.$arg as Chapter;
Chapter get episode => _$args;
KeepAliveLink build({required Chapter episode});
@$mustCallSuper
@override
void runBuild() {
final created = build(episode: _$args);
final ref = this.ref as $Ref<KeepAliveLink, KeepAliveLink>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<KeepAliveLink, KeepAliveLink>,
KeepAliveLink,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}

View file

@ -6,25 +6,61 @@ part of 'state_provider.dart';
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(SubtitleSettingsState)
const subtitleSettingsStateProvider = SubtitleSettingsStateProvider._();
final class SubtitleSettingsStateProvider
extends $NotifierProvider<SubtitleSettingsState, PlayerSubtitleSettings> {
const SubtitleSettingsStateProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'subtitleSettingsStateProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$subtitleSettingsStateHash();
@$internal
@override
SubtitleSettingsState create() => SubtitleSettingsState();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(PlayerSubtitleSettings value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<PlayerSubtitleSettings>(value),
);
}
}
String _$subtitleSettingsStateHash() =>
r'410485b55561b7a307c7a55f6798bca225f39830';
/// See also [SubtitleSettingsState].
@ProviderFor(SubtitleSettingsState)
final subtitleSettingsStateProvider =
AutoDisposeNotifierProvider<
SubtitleSettingsState,
PlayerSubtitleSettings
>.internal(
SubtitleSettingsState.new,
name: r'subtitleSettingsStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$subtitleSettingsStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$SubtitleSettingsState = AutoDisposeNotifier<PlayerSubtitleSettings>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
abstract class _$SubtitleSettingsState
extends $Notifier<PlayerSubtitleSettings> {
PlayerSubtitleSettings build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref =
this.ref as $Ref<PlayerSubtitleSettings, PlayerSubtitleSettings>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<PlayerSubtitleSettings, PlayerSubtitleSettings>,
PlayerSubtitleSettings,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}

View file

@ -47,7 +47,7 @@ class _SubtitlesWidgetSearchState extends ConsumerState<SubtitlesWidgetSearch> {
_init();
}
_init() async {
Future<void> _init() async {
await Future.delayed(const Duration(microseconds: 100));
try {
titles = await fetchImdbTitles(query);
@ -392,7 +392,7 @@ class _SubtitlesWidgetSearchState extends ConsumerState<SubtitlesWidgetSearch> {
}
}
subtitlesSearchraggableMenu(
Future<dynamic> subtitlesSearchraggableMenu(
BuildContext context, {
required Chapter chapter,
required bool isLocal,

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
@ -48,7 +48,7 @@ class _BrowseScreenState extends ConsumerState<BrowseScreen>
});
}
_chekPermission() async {
Future<void> _chekPermission() async {
await StorageProvider().requestPermission();
}

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';

View file

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
@ -37,7 +37,7 @@ void setPreferenceSetting(SourcePreference sourcePreference, Source source) {
});
}
getPreferenceValue(int sourceId, String key) {
dynamic getPreferenceValue(int sourceId, String key) {
final sourcePreference = getSourcePreferenceEntry(key, sourceId);
if (sourcePreference.listPreference != null) {

View file

@ -1,10 +1,9 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'extensions_provider.g.dart';
@riverpod

View file

@ -6,148 +6,81 @@ part of 'extensions_provider.dart';
// RiverpodGenerator
// **************************************************************************
String _$getExtensionsStreamHash() =>
r'18790d3d4a7f52e5e7239c8726dcd09bb51d803a';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [getExtensionsStream].
@ProviderFor(getExtensionsStream)
const getExtensionsStreamProvider = GetExtensionsStreamFamily();
const getExtensionsStreamProvider = GetExtensionsStreamFamily._();
/// See also [getExtensionsStream].
class GetExtensionsStreamFamily extends Family<AsyncValue<List<Source>>> {
/// See also [getExtensionsStream].
const GetExtensionsStreamFamily();
final class GetExtensionsStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Source>>,
List<Source>,
Stream<List<Source>>
>
with $FutureModifier<List<Source>>, $StreamProvider<List<Source>> {
const GetExtensionsStreamProvider._({
required GetExtensionsStreamFamily super.from,
required ItemType super.argument,
}) : super(
retry: null,
name: r'getExtensionsStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
/// See also [getExtensionsStream].
GetExtensionsStreamProvider call(ItemType itemType) {
return GetExtensionsStreamProvider(itemType);
@override
String debugGetCreateSourceHash() => _$getExtensionsStreamHash();
@override
String toString() {
return r'getExtensionsStreamProvider'
''
'($argument)';
}
@$internal
@override
GetExtensionsStreamProvider getProviderOverride(
covariant GetExtensionsStreamProvider provider,
) {
return call(provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
$StreamProviderElement<List<Source>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getExtensionsStreamProvider';
}
/// See also [getExtensionsStream].
class GetExtensionsStreamProvider
extends AutoDisposeStreamProvider<List<Source>> {
/// See also [getExtensionsStream].
GetExtensionsStreamProvider(ItemType itemType)
: this._internal(
(ref) => getExtensionsStream(ref as GetExtensionsStreamRef, itemType),
from: getExtensionsStreamProvider,
name: r'getExtensionsStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getExtensionsStreamHash,
dependencies: GetExtensionsStreamFamily._dependencies,
allTransitiveDependencies:
GetExtensionsStreamFamily._allTransitiveDependencies,
itemType: itemType,
);
GetExtensionsStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.itemType,
}) : super.internal();
final ItemType itemType;
@override
Override overrideWith(
Stream<List<Source>> Function(GetExtensionsStreamRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetExtensionsStreamProvider._internal(
(ref) => create(ref as GetExtensionsStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
itemType: itemType,
),
);
}
@override
AutoDisposeStreamProviderElement<List<Source>> createElement() {
return _GetExtensionsStreamProviderElement(this);
Stream<List<Source>> create(Ref ref) {
final argument = this.argument as ItemType;
return getExtensionsStream(ref, argument);
}
@override
bool operator ==(Object other) {
return other is GetExtensionsStreamProvider && other.itemType == itemType;
return other is GetExtensionsStreamProvider && other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetExtensionsStreamRef on AutoDisposeStreamProviderRef<List<Source>> {
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
String _$getExtensionsStreamHash() =>
r'18790d3d4a7f52e5e7239c8726dcd09bb51d803a';
class _GetExtensionsStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Source>>
with GetExtensionsStreamRef {
_GetExtensionsStreamProviderElement(super.provider);
final class GetExtensionsStreamFamily extends $Family
with $FunctionalFamilyOverride<Stream<List<Source>>, ItemType> {
const GetExtensionsStreamFamily._()
: super(
retry: null,
name: r'getExtensionsStreamProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetExtensionsStreamProvider call(ItemType itemType) =>
GetExtensionsStreamProvider._(argument: itemType, from: this);
@override
ItemType get itemType => (origin as GetExtensionsStreamProvider).itemType;
String toString() => r'getExtensionsStreamProvider';
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -26,7 +26,11 @@ class _CreateExtensionState extends State<CreateExtension> {
int _languageIndex = 0;
final List<String> _sourceTypes = ["single", "multi", "torrent"];
final List<String> _itemTypes = ["Manga", "Anime", "Novel"];
final List<String> _languages = ["Dart", "JavaScript"];
final List<String> _languages = [
"Dart",
"JavaScript",
"LNReader compiled JS",
];
SourceCodeLanguage _sourceCodeLanguage = SourceCodeLanguage.dart;
@override
Widget build(BuildContext context) {
@ -67,9 +71,11 @@ class _CreateExtensionState extends State<CreateExtension> {
setState(() {
if (v == 0) {
_sourceCodeLanguage = SourceCodeLanguage.dart;
} else {
} else if (v == 1) {
_sourceCodeLanguage =
SourceCodeLanguage.javascript;
} else {
_sourceCodeLanguage = SourceCodeLanguage.lnreader;
}
_languageIndex = v!;
});

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/changed.dart';

View file

@ -1,7 +1,7 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/main.dart';
@ -143,7 +143,7 @@ class _SourceSearchScreenState extends ConsumerState<SourceSearchScreen> {
String _errorMessage = "";
bool _isLoading = true;
MPages? pages;
_init() async {
Future<void> _init() async {
try {
_errorMessage = "";
pages = await ref.read(

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';

View file

@ -3,7 +3,7 @@ import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/calendar/providers/calendar_provider.dart';

View file

@ -1,8 +1,7 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'calendar_provider.g.dart';
@riverpod

View file

@ -6,147 +6,80 @@ part of 'calendar_provider.dart';
// RiverpodGenerator
// **************************************************************************
String _$getCalendarStreamHash() => r'850d81742f8ac5ce88175732c0edf57a7a9295d4';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [getCalendarStream].
@ProviderFor(getCalendarStream)
const getCalendarStreamProvider = GetCalendarStreamFamily();
const getCalendarStreamProvider = GetCalendarStreamFamily._();
/// See also [getCalendarStream].
class GetCalendarStreamFamily extends Family<AsyncValue<List<Manga>>> {
/// See also [getCalendarStream].
const GetCalendarStreamFamily();
final class GetCalendarStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Manga>>,
List<Manga>,
Stream<List<Manga>>
>
with $FutureModifier<List<Manga>>, $StreamProvider<List<Manga>> {
const GetCalendarStreamProvider._({
required GetCalendarStreamFamily super.from,
required ItemType? super.argument,
}) : super(
retry: null,
name: r'getCalendarStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
/// See also [getCalendarStream].
GetCalendarStreamProvider call({ItemType? itemType}) {
return GetCalendarStreamProvider(itemType: itemType);
@override
String debugGetCreateSourceHash() => _$getCalendarStreamHash();
@override
String toString() {
return r'getCalendarStreamProvider'
''
'($argument)';
}
@$internal
@override
GetCalendarStreamProvider getProviderOverride(
covariant GetCalendarStreamProvider provider,
) {
return call(itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
$StreamProviderElement<List<Manga>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getCalendarStreamProvider';
}
/// See also [getCalendarStream].
class GetCalendarStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
/// See also [getCalendarStream].
GetCalendarStreamProvider({ItemType? itemType})
: this._internal(
(ref) =>
getCalendarStream(ref as GetCalendarStreamRef, itemType: itemType),
from: getCalendarStreamProvider,
name: r'getCalendarStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getCalendarStreamHash,
dependencies: GetCalendarStreamFamily._dependencies,
allTransitiveDependencies:
GetCalendarStreamFamily._allTransitiveDependencies,
itemType: itemType,
);
GetCalendarStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.itemType,
}) : super.internal();
final ItemType? itemType;
@override
Override overrideWith(
Stream<List<Manga>> Function(GetCalendarStreamRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetCalendarStreamProvider._internal(
(ref) => create(ref as GetCalendarStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
itemType: itemType,
),
);
}
@override
AutoDisposeStreamProviderElement<List<Manga>> createElement() {
return _GetCalendarStreamProviderElement(this);
Stream<List<Manga>> create(Ref ref) {
final argument = this.argument as ItemType?;
return getCalendarStream(ref, itemType: argument);
}
@override
bool operator ==(Object other) {
return other is GetCalendarStreamProvider && other.itemType == itemType;
return other is GetCalendarStreamProvider && other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetCalendarStreamRef on AutoDisposeStreamProviderRef<List<Manga>> {
/// The parameter `itemType` of this provider.
ItemType? get itemType;
}
String _$getCalendarStreamHash() => r'850d81742f8ac5ce88175732c0edf57a7a9295d4';
class _GetCalendarStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Manga>>
with GetCalendarStreamRef {
_GetCalendarStreamProviderElement(super.provider);
final class GetCalendarStreamFamily extends $Family
with $FunctionalFamilyOverride<Stream<List<Manga>>, ItemType?> {
const GetCalendarStreamFamily._()
: super(
retry: null,
name: r'getCalendarStreamProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetCalendarStreamProvider call({ItemType? itemType}) =>
GetCalendarStreamProvider._(argument: itemType, from: this);
@override
ItemType? get itemType => (origin as GetCalendarStreamProvider).itemType;
String toString() => r'getCalendarStreamProvider';
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -5,7 +5,7 @@ import 'package:go_router/go_router.dart';
import 'package:mangayomi/l10n/generated/app_localizations.dart';
import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/changed.dart';
import 'package:mangayomi/models/chapter.dart';

View file

@ -1,11 +1,10 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/update.dart';
import 'package:mangayomi/models/history.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'isar_providers.g.dart';
@riverpod

View file

@ -6,308 +6,183 @@ part of 'isar_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$getAllHistoryStreamHash() =>
r'1ce5bd0046fbbec46e91b7a486523945699d95f3';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [getAllHistoryStream].
@ProviderFor(getAllHistoryStream)
const getAllHistoryStreamProvider = GetAllHistoryStreamFamily();
const getAllHistoryStreamProvider = GetAllHistoryStreamFamily._();
/// See also [getAllHistoryStream].
class GetAllHistoryStreamFamily extends Family<AsyncValue<List<History>>> {
/// See also [getAllHistoryStream].
const GetAllHistoryStreamFamily();
final class GetAllHistoryStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<History>>,
List<History>,
Stream<List<History>>
>
with $FutureModifier<List<History>>, $StreamProvider<List<History>> {
const GetAllHistoryStreamProvider._({
required GetAllHistoryStreamFamily super.from,
required ({ItemType itemType, String search}) super.argument,
}) : super(
retry: null,
name: r'getAllHistoryStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
/// See also [getAllHistoryStream].
GetAllHistoryStreamProvider call({
required ItemType itemType,
String search = "",
}) {
return GetAllHistoryStreamProvider(itemType: itemType, search: search);
@override
String debugGetCreateSourceHash() => _$getAllHistoryStreamHash();
@override
String toString() {
return r'getAllHistoryStreamProvider'
''
'$argument';
}
@$internal
@override
GetAllHistoryStreamProvider getProviderOverride(
covariant GetAllHistoryStreamProvider provider,
) {
return call(itemType: provider.itemType, search: provider.search);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
$StreamProviderElement<List<History>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getAllHistoryStreamProvider';
}
/// See also [getAllHistoryStream].
class GetAllHistoryStreamProvider
extends AutoDisposeStreamProvider<List<History>> {
/// See also [getAllHistoryStream].
GetAllHistoryStreamProvider({required ItemType itemType, String search = ""})
: this._internal(
(ref) => getAllHistoryStream(
ref as GetAllHistoryStreamRef,
itemType: itemType,
search: search,
),
from: getAllHistoryStreamProvider,
name: r'getAllHistoryStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllHistoryStreamHash,
dependencies: GetAllHistoryStreamFamily._dependencies,
allTransitiveDependencies:
GetAllHistoryStreamFamily._allTransitiveDependencies,
itemType: itemType,
search: search,
);
GetAllHistoryStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.itemType,
required this.search,
}) : super.internal();
final ItemType itemType;
final String search;
@override
Override overrideWith(
Stream<List<History>> Function(GetAllHistoryStreamRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetAllHistoryStreamProvider._internal(
(ref) => create(ref as GetAllHistoryStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
itemType: itemType,
search: search,
),
Stream<List<History>> create(Ref ref) {
final argument = this.argument as ({ItemType itemType, String search});
return getAllHistoryStream(
ref,
itemType: argument.itemType,
search: argument.search,
);
}
@override
AutoDisposeStreamProviderElement<List<History>> createElement() {
return _GetAllHistoryStreamProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is GetAllHistoryStreamProvider &&
other.itemType == itemType &&
other.search == search;
return other is GetAllHistoryStreamProvider && other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
hash = _SystemHash.combine(hash, search.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef<List<History>> {
/// The parameter `itemType` of this provider.
ItemType get itemType;
String _$getAllHistoryStreamHash() =>
r'1ce5bd0046fbbec46e91b7a486523945699d95f3';
/// The parameter `search` of this provider.
String get search;
final class GetAllHistoryStreamFamily extends $Family
with
$FunctionalFamilyOverride<
Stream<List<History>>,
({ItemType itemType, String search})
> {
const GetAllHistoryStreamFamily._()
: super(
retry: null,
name: r'getAllHistoryStreamProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetAllHistoryStreamProvider call({
required ItemType itemType,
String search = '',
}) => GetAllHistoryStreamProvider._(
argument: (itemType: itemType, search: search),
from: this,
);
@override
String toString() => r'getAllHistoryStreamProvider';
}
class _GetAllHistoryStreamProviderElement
extends AutoDisposeStreamProviderElement<List<History>>
with GetAllHistoryStreamRef {
_GetAllHistoryStreamProviderElement(super.provider);
@ProviderFor(getAllUpdateStream)
const getAllUpdateStreamProvider = GetAllUpdateStreamFamily._();
final class GetAllUpdateStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Update>>,
List<Update>,
Stream<List<Update>>
>
with $FutureModifier<List<Update>>, $StreamProvider<List<Update>> {
const GetAllUpdateStreamProvider._({
required GetAllUpdateStreamFamily super.from,
required ({ItemType itemType, String search}) super.argument,
}) : super(
retry: null,
name: r'getAllUpdateStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
ItemType get itemType => (origin as GetAllHistoryStreamProvider).itemType;
String debugGetCreateSourceHash() => _$getAllUpdateStreamHash();
@override
String get search => (origin as GetAllHistoryStreamProvider).search;
String toString() {
return r'getAllUpdateStreamProvider'
''
'$argument';
}
@$internal
@override
$StreamProviderElement<List<Update>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Stream<List<Update>> create(Ref ref) {
final argument = this.argument as ({ItemType itemType, String search});
return getAllUpdateStream(
ref,
itemType: argument.itemType,
search: argument.search,
);
}
@override
bool operator ==(Object other) {
return other is GetAllUpdateStreamProvider && other.argument == argument;
}
@override
int get hashCode {
return argument.hashCode;
}
}
String _$getAllUpdateStreamHash() =>
r'43369b20d702d12aeae627fcd04ceb61caf0dc74';
/// See also [getAllUpdateStream].
@ProviderFor(getAllUpdateStream)
const getAllUpdateStreamProvider = GetAllUpdateStreamFamily();
/// See also [getAllUpdateStream].
class GetAllUpdateStreamFamily extends Family<AsyncValue<List<Update>>> {
/// See also [getAllUpdateStream].
const GetAllUpdateStreamFamily();
/// See also [getAllUpdateStream].
GetAllUpdateStreamProvider call({
required ItemType itemType,
String search = "",
}) {
return GetAllUpdateStreamProvider(itemType: itemType, search: search);
}
@override
GetAllUpdateStreamProvider getProviderOverride(
covariant GetAllUpdateStreamProvider provider,
) {
return call(itemType: provider.itemType, search: provider.search);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getAllUpdateStreamProvider';
}
/// See also [getAllUpdateStream].
class GetAllUpdateStreamProvider
extends AutoDisposeStreamProvider<List<Update>> {
/// See also [getAllUpdateStream].
GetAllUpdateStreamProvider({required ItemType itemType, String search = ""})
: this._internal(
(ref) => getAllUpdateStream(
ref as GetAllUpdateStreamRef,
itemType: itemType,
search: search,
),
from: getAllUpdateStreamProvider,
final class GetAllUpdateStreamFamily extends $Family
with
$FunctionalFamilyOverride<
Stream<List<Update>>,
({ItemType itemType, String search})
> {
const GetAllUpdateStreamFamily._()
: super(
retry: null,
name: r'getAllUpdateStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllUpdateStreamHash,
dependencies: GetAllUpdateStreamFamily._dependencies,
allTransitiveDependencies:
GetAllUpdateStreamFamily._allTransitiveDependencies,
itemType: itemType,
search: search,
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetAllUpdateStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.itemType,
required this.search,
}) : super.internal();
final ItemType itemType;
final String search;
GetAllUpdateStreamProvider call({
required ItemType itemType,
String search = '',
}) => GetAllUpdateStreamProvider._(
argument: (itemType: itemType, search: search),
from: this,
);
@override
Override overrideWith(
Stream<List<Update>> Function(GetAllUpdateStreamRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetAllUpdateStreamProvider._internal(
(ref) => create(ref as GetAllUpdateStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
itemType: itemType,
search: search,
),
);
}
@override
AutoDisposeStreamProviderElement<List<Update>> createElement() {
return _GetAllUpdateStreamProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is GetAllUpdateStreamProvider &&
other.itemType == itemType &&
other.search == search;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
hash = _SystemHash.combine(hash, search.hashCode);
return _SystemHash.finish(hash);
}
String toString() => r'getAllUpdateStreamProvider';
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef<List<Update>> {
/// The parameter `itemType` of this provider.
ItemType get itemType;
/// The parameter `search` of this provider.
String get search;
}
class _GetAllUpdateStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Update>>
with GetAllUpdateStreamRef {
_GetAllUpdateStreamProviderElement(super.provider);
@override
ItemType get itemType => (origin as GetAllUpdateStreamProvider).itemType;
@override
String get search => (origin as GetAllUpdateStreamProvider).search;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -6,7 +6,7 @@ import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/changed.dart';
@ -43,6 +43,7 @@ import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
import 'package:mangayomi/utils/global_style.dart';
import 'package:path/path.dart' as p;
import 'package:riverpod_annotation/riverpod_annotation.dart';
class LibraryScreen extends ConsumerStatefulWidget {
final ItemType itemType;

View file

@ -4,7 +4,6 @@ import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/services/torrent_server.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'add_torrent.g.dart';
@riverpod

View file

@ -6,183 +6,92 @@ part of 'add_torrent.dart';
// RiverpodGenerator
// **************************************************************************
String _$addTorrentFromUrlOrFromFileHash() =>
r'a54f90b6708b13eeb8fed098691f9a79dbab50fd';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [addTorrentFromUrlOrFromFile].
@ProviderFor(addTorrentFromUrlOrFromFile)
const addTorrentFromUrlOrFromFileProvider = AddTorrentFromUrlOrFromFileFamily();
const addTorrentFromUrlOrFromFileProvider =
AddTorrentFromUrlOrFromFileFamily._();
/// See also [addTorrentFromUrlOrFromFile].
class AddTorrentFromUrlOrFromFileFamily extends Family<AsyncValue> {
/// See also [addTorrentFromUrlOrFromFile].
const AddTorrentFromUrlOrFromFileFamily();
/// See also [addTorrentFromUrlOrFromFile].
AddTorrentFromUrlOrFromFileProvider call(
Manga? mManga, {
required bool init,
String? url,
}) {
return AddTorrentFromUrlOrFromFileProvider(mManga, init: init, url: url);
}
@override
AddTorrentFromUrlOrFromFileProvider getProviderOverride(
covariant AddTorrentFromUrlOrFromFileProvider provider,
) {
return call(provider.mManga, init: provider.init, url: provider.url);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'addTorrentFromUrlOrFromFileProvider';
}
/// See also [addTorrentFromUrlOrFromFile].
class AddTorrentFromUrlOrFromFileProvider
extends AutoDisposeFutureProvider<Object?> {
/// See also [addTorrentFromUrlOrFromFile].
AddTorrentFromUrlOrFromFileProvider(
Manga? mManga, {
required bool init,
String? url,
}) : this._internal(
(ref) => addTorrentFromUrlOrFromFile(
ref as AddTorrentFromUrlOrFromFileRef,
mManga,
init: init,
url: url,
),
from: addTorrentFromUrlOrFromFileProvider,
final class AddTorrentFromUrlOrFromFileProvider
extends $FunctionalProvider<AsyncValue<dynamic>, dynamic, FutureOr<dynamic>>
with $FutureModifier<dynamic>, $FutureProvider<dynamic> {
const AddTorrentFromUrlOrFromFileProvider._({
required AddTorrentFromUrlOrFromFileFamily super.from,
required (Manga?, {bool init, String? url}) super.argument,
}) : super(
retry: null,
name: r'addTorrentFromUrlOrFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$addTorrentFromUrlOrFromFileHash,
dependencies: AddTorrentFromUrlOrFromFileFamily._dependencies,
allTransitiveDependencies:
AddTorrentFromUrlOrFromFileFamily._allTransitiveDependencies,
mManga: mManga,
init: init,
url: url,
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
AddTorrentFromUrlOrFromFileProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.mManga,
required this.init,
required this.url,
}) : super.internal();
final Manga? mManga;
final bool init;
final String? url;
@override
String debugGetCreateSourceHash() => _$addTorrentFromUrlOrFromFileHash();
@override
Override overrideWith(
FutureOr<Object?> Function(AddTorrentFromUrlOrFromFileRef provider) create,
) {
return ProviderOverride(
origin: this,
override: AddTorrentFromUrlOrFromFileProvider._internal(
(ref) => create(ref as AddTorrentFromUrlOrFromFileRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
mManga: mManga,
init: init,
url: url,
),
);
String toString() {
return r'addTorrentFromUrlOrFromFileProvider'
''
'$argument';
}
@$internal
@override
AutoDisposeFutureProviderElement<Object?> createElement() {
return _AddTorrentFromUrlOrFromFileProviderElement(this);
$FutureProviderElement<dynamic> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<dynamic> create(Ref ref) {
final argument = this.argument as (Manga?, {bool init, String? url});
return addTorrentFromUrlOrFromFile(
ref,
argument.$1,
init: argument.init,
url: argument.url,
);
}
@override
bool operator ==(Object other) {
return other is AddTorrentFromUrlOrFromFileProvider &&
other.mManga == mManga &&
other.init == init &&
other.url == url;
other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, mManga.hashCode);
hash = _SystemHash.combine(hash, init.hashCode);
hash = _SystemHash.combine(hash, url.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin AddTorrentFromUrlOrFromFileRef on AutoDisposeFutureProviderRef<Object?> {
/// The parameter `mManga` of this provider.
Manga? get mManga;
String _$addTorrentFromUrlOrFromFileHash() =>
r'a54f90b6708b13eeb8fed098691f9a79dbab50fd';
/// The parameter `init` of this provider.
bool get init;
final class AddTorrentFromUrlOrFromFileFamily extends $Family
with
$FunctionalFamilyOverride<
FutureOr<dynamic>,
(Manga?, {bool init, String? url})
> {
const AddTorrentFromUrlOrFromFileFamily._()
: super(
retry: null,
name: r'addTorrentFromUrlOrFromFileProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
/// The parameter `url` of this provider.
String? get url;
AddTorrentFromUrlOrFromFileProvider call(
Manga? mManga, {
required bool init,
String? url,
}) => AddTorrentFromUrlOrFromFileProvider._(
argument: (mManga, init: init, url: url),
from: this,
);
@override
String toString() => r'addTorrentFromUrlOrFromFileProvider';
}
class _AddTorrentFromUrlOrFromFileProviderElement
extends AutoDisposeFutureProviderElement<Object?>
with AddTorrentFromUrlOrFromFileRef {
_AddTorrentFromUrlOrFromFileProviderElement(super.provider);
@override
Manga? get mManga => (origin as AddTorrentFromUrlOrFromFileProvider).mManga;
@override
bool get init => (origin as AddTorrentFromUrlOrFromFileProvider).init;
@override
String? get url => (origin as AddTorrentFromUrlOrFromFileProvider).url;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -1,7 +1,7 @@
import 'dart:convert';
import 'dart:io'; // For I/O-operations
import 'package:epubx/epubx.dart';
import 'package:isar/isar.dart'; // Isar database package for local storage
import 'package:isar_community/isar.dart'; // Isar database package for local storage
import 'package:mangayomi/main.dart'; // Exposes the global `isar` instance
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/utils/extensions/others.dart';
@ -9,7 +9,6 @@ import 'package:path/path.dart' as p; // For manipulating file system paths
import 'package:bot_toast/bot_toast.dart'; // For Exceptions
import 'package:mangayomi/models/manga.dart'; // Has Manga model and ItemType enum
import 'package:mangayomi/models/chapter.dart'; // Has Chapter model with archivePath
import 'package:flutter_riverpod/flutter_riverpod.dart'; // Riverpod state management
import 'package:mangayomi/providers/storage_provider.dart'; // Provides storage directory selection
import 'package:riverpod_annotation/riverpod_annotation.dart'; // Annotations for code generation
part 'file_scanner.g.dart';
@ -387,7 +386,7 @@ Future<Directory?> getLocalLibrary() async {
/// becomes:
/// "Manga 1/chapter1.zip"
/// ```
String _getRelativePath(dir) {
String _getRelativePath(dynamic dir) {
String relativePath;
if (dir is Directory) {

View file

@ -6,7 +6,61 @@ part of 'file_scanner.dart';
// RiverpodGenerator
// **************************************************************************
String _$scanLocalLibraryHash() => r'7fdedaa37917728d9f3b9d8f15090c94bdb34238';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(LocalFoldersState)
const localFoldersStateProvider = LocalFoldersStateProvider._();
final class LocalFoldersStateProvider
extends $NotifierProvider<LocalFoldersState, List<String>> {
const LocalFoldersStateProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'localFoldersStateProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$localFoldersStateHash();
@$internal
@override
LocalFoldersState create() => LocalFoldersState();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(List<String> value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<List<String>>(value),
);
}
}
String _$localFoldersStateHash() => r'7cf7902ad34ee5ae018b2c9ac3849e822bc5f0b7';
abstract class _$LocalFoldersState extends $Notifier<List<String>> {
List<String> build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<List<String>, List<String>>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<List<String>, List<String>>,
List<String>,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}
/// Scans `Mangayomi/local` folder (if exists) for Mangas/Animes and imports in library.
///
@ -25,37 +79,71 @@ String _$scanLocalLibraryHash() => r'7fdedaa37917728d9f3b9d8f15090c94bdb34238';
/// Archivetypes: cbz, zip, cbt, tar
/// Other types: epub
/// ```
///
/// Copied from [scanLocalLibrary].
@ProviderFor(scanLocalLibrary)
final scanLocalLibraryProvider = AutoDisposeFutureProvider<void>.internal(
scanLocalLibrary,
name: r'scanLocalLibraryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$scanLocalLibraryHash,
dependencies: null,
allTransitiveDependencies: null,
);
const scanLocalLibraryProvider = ScanLocalLibraryProvider._();
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef ScanLocalLibraryRef = AutoDisposeFutureProviderRef<void>;
String _$localFoldersStateHash() => r'7cf7902ad34ee5ae018b2c9ac3849e822bc5f0b7';
/// Scans `Mangayomi/local` folder (if exists) for Mangas/Animes and imports in library.
///
/// **Folder structure:**
/// ```
/// Mangayomi/local/MangaName/CustomCover.jpg (optional)
/// Mangayomi/local/MangaName/Chapter1/Page1.jpg
/// Mangayomi/local/MangaName/Chapter2.cbz
/// Mangayomi/local/AnimeName/Episode1.mp4
/// Mangayomi/local/NovelName/NovelName.epub
/// ```
/// **Supported filetypes:** (taken from lib/modules/library/providers/local_archive.dart, line 98)
/// ```
/// Videotypes: mp4, mov, avi, flv, wmv, mpeg, mkv
/// Imagetypes: jpg, jpeg, png, webp
/// Archivetypes: cbz, zip, cbt, tar
/// Other types: epub
/// ```
/// See also [LocalFoldersState].
@ProviderFor(LocalFoldersState)
final localFoldersStateProvider =
AutoDisposeNotifierProvider<LocalFoldersState, List<String>>.internal(
LocalFoldersState.new,
name: r'localFoldersStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$localFoldersStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
final class ScanLocalLibraryProvider
extends $FunctionalProvider<AsyncValue<void>, void, FutureOr<void>>
with $FutureModifier<void>, $FutureProvider<void> {
/// Scans `Mangayomi/local` folder (if exists) for Mangas/Animes and imports in library.
///
/// **Folder structure:**
/// ```
/// Mangayomi/local/MangaName/CustomCover.jpg (optional)
/// Mangayomi/local/MangaName/Chapter1/Page1.jpg
/// Mangayomi/local/MangaName/Chapter2.cbz
/// Mangayomi/local/AnimeName/Episode1.mp4
/// Mangayomi/local/NovelName/NovelName.epub
/// ```
/// **Supported filetypes:** (taken from lib/modules/library/providers/local_archive.dart, line 98)
/// ```
/// Videotypes: mp4, mov, avi, flv, wmv, mpeg, mkv
/// Imagetypes: jpg, jpeg, png, webp
/// Archivetypes: cbz, zip, cbt, tar
/// Other types: epub
/// ```
const ScanLocalLibraryProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'scanLocalLibraryProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
typedef _$LocalFoldersState = AutoDisposeNotifier<List<String>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@override
String debugGetCreateSourceHash() => _$scanLocalLibraryHash();
@$internal
@override
$FutureProviderElement<void> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<void> create(Ref ref) {
return scanLocalLibrary(ref);
}
}
String _$scanLocalLibraryHash() => r'7fdedaa37917728d9f3b9d8f15090c94bdb34238';

View file

@ -1,9 +1,8 @@
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'isar_providers.g.dart';
@riverpod

View file

@ -6,321 +6,215 @@ part of 'isar_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$getAllMangaStreamHash() => r'5e86a22a68ca1a52aefa9c0bc675d284369beac5';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [getAllMangaStream].
@ProviderFor(getAllMangaStream)
const getAllMangaStreamProvider = GetAllMangaStreamFamily();
const getAllMangaStreamProvider = GetAllMangaStreamFamily._();
/// See also [getAllMangaStream].
class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
/// See also [getAllMangaStream].
const GetAllMangaStreamFamily();
/// See also [getAllMangaStream].
GetAllMangaStreamProvider call({
required int? categoryId,
required ItemType itemType,
}) {
return GetAllMangaStreamProvider(
categoryId: categoryId,
itemType: itemType,
);
}
@override
GetAllMangaStreamProvider getProviderOverride(
covariant GetAllMangaStreamProvider provider,
) {
return call(categoryId: provider.categoryId, itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getAllMangaStreamProvider';
}
/// See also [getAllMangaStream].
class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
/// See also [getAllMangaStream].
GetAllMangaStreamProvider({
required int? categoryId,
required ItemType itemType,
}) : this._internal(
(ref) => getAllMangaStream(
ref as GetAllMangaStreamRef,
categoryId: categoryId,
itemType: itemType,
),
from: getAllMangaStreamProvider,
final class GetAllMangaStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Manga>>,
List<Manga>,
Stream<List<Manga>>
>
with $FutureModifier<List<Manga>>, $StreamProvider<List<Manga>> {
const GetAllMangaStreamProvider._({
required GetAllMangaStreamFamily super.from,
required ({int? categoryId, ItemType itemType}) super.argument,
}) : super(
retry: null,
name: r'getAllMangaStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllMangaStreamHash,
dependencies: GetAllMangaStreamFamily._dependencies,
allTransitiveDependencies:
GetAllMangaStreamFamily._allTransitiveDependencies,
categoryId: categoryId,
itemType: itemType,
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
GetAllMangaStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.categoryId,
required this.itemType,
}) : super.internal();
final int? categoryId;
final ItemType itemType;
@override
String debugGetCreateSourceHash() => _$getAllMangaStreamHash();
@override
Override overrideWith(
Stream<List<Manga>> Function(GetAllMangaStreamRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetAllMangaStreamProvider._internal(
(ref) => create(ref as GetAllMangaStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
categoryId: categoryId,
itemType: itemType,
),
);
String toString() {
return r'getAllMangaStreamProvider'
''
'$argument';
}
@$internal
@override
AutoDisposeStreamProviderElement<List<Manga>> createElement() {
return _GetAllMangaStreamProviderElement(this);
$StreamProviderElement<List<Manga>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Stream<List<Manga>> create(Ref ref) {
final argument = this.argument as ({int? categoryId, ItemType itemType});
return getAllMangaStream(
ref,
categoryId: argument.categoryId,
itemType: argument.itemType,
);
}
@override
bool operator ==(Object other) {
return other is GetAllMangaStreamProvider &&
other.categoryId == categoryId &&
other.itemType == itemType;
return other is GetAllMangaStreamProvider && other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, categoryId.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetAllMangaStreamRef on AutoDisposeStreamProviderRef<List<Manga>> {
/// The parameter `categoryId` of this provider.
int? get categoryId;
String _$getAllMangaStreamHash() => r'5e86a22a68ca1a52aefa9c0bc675d284369beac5';
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
class _GetAllMangaStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Manga>>
with GetAllMangaStreamRef {
_GetAllMangaStreamProviderElement(super.provider);
@override
int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId;
@override
ItemType get itemType => (origin as GetAllMangaStreamProvider).itemType;
}
String _$getAllMangaWithoutCategoriesStreamHash() =>
r'61ea54070c7e87a45aeabce5fd21366faaf4ae6d';
/// See also [getAllMangaWithoutCategoriesStream].
@ProviderFor(getAllMangaWithoutCategoriesStream)
const getAllMangaWithoutCategoriesStreamProvider =
GetAllMangaWithoutCategoriesStreamFamily();
/// See also [getAllMangaWithoutCategoriesStream].
class GetAllMangaWithoutCategoriesStreamFamily
extends Family<AsyncValue<List<Manga>>> {
/// See also [getAllMangaWithoutCategoriesStream].
const GetAllMangaWithoutCategoriesStreamFamily();
/// See also [getAllMangaWithoutCategoriesStream].
GetAllMangaWithoutCategoriesStreamProvider call({
required ItemType itemType,
}) {
return GetAllMangaWithoutCategoriesStreamProvider(itemType: itemType);
}
@override
GetAllMangaWithoutCategoriesStreamProvider getProviderOverride(
covariant GetAllMangaWithoutCategoriesStreamProvider provider,
) {
return call(itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'getAllMangaWithoutCategoriesStreamProvider';
}
/// See also [getAllMangaWithoutCategoriesStream].
class GetAllMangaWithoutCategoriesStreamProvider
extends AutoDisposeStreamProvider<List<Manga>> {
/// See also [getAllMangaWithoutCategoriesStream].
GetAllMangaWithoutCategoriesStreamProvider({required ItemType itemType})
: this._internal(
(ref) => getAllMangaWithoutCategoriesStream(
ref as GetAllMangaWithoutCategoriesStreamRef,
itemType: itemType,
),
from: getAllMangaWithoutCategoriesStreamProvider,
name: r'getAllMangaWithoutCategoriesStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllMangaWithoutCategoriesStreamHash,
dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies,
allTransitiveDependencies:
GetAllMangaWithoutCategoriesStreamFamily._allTransitiveDependencies,
itemType: itemType,
final class GetAllMangaStreamFamily extends $Family
with
$FunctionalFamilyOverride<
Stream<List<Manga>>,
({int? categoryId, ItemType itemType})
> {
const GetAllMangaStreamFamily._()
: super(
retry: null,
name: r'getAllMangaStreamProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetAllMangaWithoutCategoriesStreamProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.itemType,
}) : super.internal();
final ItemType itemType;
GetAllMangaStreamProvider call({
required int? categoryId,
required ItemType itemType,
}) => GetAllMangaStreamProvider._(
argument: (categoryId: categoryId, itemType: itemType),
from: this,
);
@override
Override overrideWith(
Stream<List<Manga>> Function(GetAllMangaWithoutCategoriesStreamRef provider)
create,
) {
return ProviderOverride(
origin: this,
override: GetAllMangaWithoutCategoriesStreamProvider._internal(
(ref) => create(ref as GetAllMangaWithoutCategoriesStreamRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
itemType: itemType,
),
);
String toString() => r'getAllMangaStreamProvider';
}
@ProviderFor(getAllMangaWithoutCategoriesStream)
const getAllMangaWithoutCategoriesStreamProvider =
GetAllMangaWithoutCategoriesStreamFamily._();
final class GetAllMangaWithoutCategoriesStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Manga>>,
List<Manga>,
Stream<List<Manga>>
>
with $FutureModifier<List<Manga>>, $StreamProvider<List<Manga>> {
const GetAllMangaWithoutCategoriesStreamProvider._({
required GetAllMangaWithoutCategoriesStreamFamily super.from,
required ItemType super.argument,
}) : super(
retry: null,
name: r'getAllMangaWithoutCategoriesStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() =>
_$getAllMangaWithoutCategoriesStreamHash();
@override
String toString() {
return r'getAllMangaWithoutCategoriesStreamProvider'
''
'($argument)';
}
@$internal
@override
AutoDisposeStreamProviderElement<List<Manga>> createElement() {
return _GetAllMangaWithoutCategoriesStreamProviderElement(this);
$StreamProviderElement<List<Manga>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Stream<List<Manga>> create(Ref ref) {
final argument = this.argument as ItemType;
return getAllMangaWithoutCategoriesStream(ref, itemType: argument);
}
@override
bool operator ==(Object other) {
return other is GetAllMangaWithoutCategoriesStreamProvider &&
other.itemType == itemType;
other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetAllMangaWithoutCategoriesStreamRef
on AutoDisposeStreamProviderRef<List<Manga>> {
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
String _$getAllMangaWithoutCategoriesStreamHash() =>
r'61ea54070c7e87a45aeabce5fd21366faaf4ae6d';
class _GetAllMangaWithoutCategoriesStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Manga>>
with GetAllMangaWithoutCategoriesStreamRef {
_GetAllMangaWithoutCategoriesStreamProviderElement(super.provider);
final class GetAllMangaWithoutCategoriesStreamFamily extends $Family
with $FunctionalFamilyOverride<Stream<List<Manga>>, ItemType> {
const GetAllMangaWithoutCategoriesStreamFamily._()
: super(
retry: null,
name: r'getAllMangaWithoutCategoriesStreamProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
GetAllMangaWithoutCategoriesStreamProvider call({
required ItemType itemType,
}) => GetAllMangaWithoutCategoriesStreamProvider._(
argument: itemType,
from: this,
);
@override
ItemType get itemType =>
(origin as GetAllMangaWithoutCategoriesStreamProvider).itemType;
String toString() => r'getAllMangaWithoutCategoriesStreamProvider';
}
@ProviderFor(getSettingsStream)
const getSettingsStreamProvider = GetSettingsStreamProvider._();
final class GetSettingsStreamProvider
extends
$FunctionalProvider<
AsyncValue<List<Settings>>,
List<Settings>,
Stream<List<Settings>>
>
with $FutureModifier<List<Settings>>, $StreamProvider<List<Settings>> {
const GetSettingsStreamProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'getSettingsStreamProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$getSettingsStreamHash();
@$internal
@override
$StreamProviderElement<List<Settings>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Stream<List<Settings>> create(Ref ref) {
return getSettingsStream(ref);
}
}
String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27';
/// See also [getSettingsStream].
@ProviderFor(getSettingsStream)
final getSettingsStreamProvider =
AutoDisposeStreamProvider<List<Settings>>.internal(
getSettingsStream,
name: r'getSettingsStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getSettingsStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef GetSettingsStreamRef = AutoDisposeStreamProviderRef<List<Settings>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -146,7 +146,7 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState {
state = type;
}
update() {
void update() {
if (state == 0) {
setType(1);
} else if (state == 1) {
@ -228,7 +228,7 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
}
}
update() {
List<Manga> update() {
if (state == 0) {
final data = mangaList.where((element) {
List list = [];

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,6 @@ import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/manga/archive_reader/models/models.dart';
import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'local_archive.g.dart';
@riverpod

View file

@ -6,191 +6,91 @@ part of 'local_archive.dart';
// RiverpodGenerator
// **************************************************************************
String _$importArchivesFromFileHash() =>
r'784b9d45958695faffdf04ee7c105c9b486122de';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [importArchivesFromFile].
@ProviderFor(importArchivesFromFile)
const importArchivesFromFileProvider = ImportArchivesFromFileFamily();
const importArchivesFromFileProvider = ImportArchivesFromFileFamily._();
/// See also [importArchivesFromFile].
class ImportArchivesFromFileFamily extends Family<AsyncValue> {
/// See also [importArchivesFromFile].
const ImportArchivesFromFileFamily();
/// See also [importArchivesFromFile].
ImportArchivesFromFileProvider call(
Manga? mManga, {
required ItemType itemType,
required bool init,
}) {
return ImportArchivesFromFileProvider(
mManga,
itemType: itemType,
init: init,
);
}
@override
ImportArchivesFromFileProvider getProviderOverride(
covariant ImportArchivesFromFileProvider provider,
) {
return call(
provider.mManga,
itemType: provider.itemType,
init: provider.init,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'importArchivesFromFileProvider';
}
/// See also [importArchivesFromFile].
class ImportArchivesFromFileProvider
extends AutoDisposeFutureProvider<Object?> {
/// See also [importArchivesFromFile].
ImportArchivesFromFileProvider(
Manga? mManga, {
required ItemType itemType,
required bool init,
}) : this._internal(
(ref) => importArchivesFromFile(
ref as ImportArchivesFromFileRef,
mManga,
itemType: itemType,
init: init,
),
from: importArchivesFromFileProvider,
final class ImportArchivesFromFileProvider
extends $FunctionalProvider<AsyncValue<dynamic>, dynamic, FutureOr<dynamic>>
with $FutureModifier<dynamic>, $FutureProvider<dynamic> {
const ImportArchivesFromFileProvider._({
required ImportArchivesFromFileFamily super.from,
required (Manga?, {ItemType itemType, bool init}) super.argument,
}) : super(
retry: null,
name: r'importArchivesFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$importArchivesFromFileHash,
dependencies: ImportArchivesFromFileFamily._dependencies,
allTransitiveDependencies:
ImportArchivesFromFileFamily._allTransitiveDependencies,
mManga: mManga,
itemType: itemType,
init: init,
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
ImportArchivesFromFileProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.mManga,
required this.itemType,
required this.init,
}) : super.internal();
final Manga? mManga;
final ItemType itemType;
final bool init;
@override
String debugGetCreateSourceHash() => _$importArchivesFromFileHash();
@override
Override overrideWith(
FutureOr<Object?> Function(ImportArchivesFromFileRef provider) create,
) {
return ProviderOverride(
origin: this,
override: ImportArchivesFromFileProvider._internal(
(ref) => create(ref as ImportArchivesFromFileRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
mManga: mManga,
itemType: itemType,
init: init,
),
);
String toString() {
return r'importArchivesFromFileProvider'
''
'$argument';
}
@$internal
@override
AutoDisposeFutureProviderElement<Object?> createElement() {
return _ImportArchivesFromFileProviderElement(this);
$FutureProviderElement<dynamic> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<dynamic> create(Ref ref) {
final argument = this.argument as (Manga?, {ItemType itemType, bool init});
return importArchivesFromFile(
ref,
argument.$1,
itemType: argument.itemType,
init: argument.init,
);
}
@override
bool operator ==(Object other) {
return other is ImportArchivesFromFileProvider &&
other.mManga == mManga &&
other.itemType == itemType &&
other.init == init;
other.argument == argument;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, mManga.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
hash = _SystemHash.combine(hash, init.hashCode);
return _SystemHash.finish(hash);
return argument.hashCode;
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin ImportArchivesFromFileRef on AutoDisposeFutureProviderRef<Object?> {
/// The parameter `mManga` of this provider.
Manga? get mManga;
String _$importArchivesFromFileHash() =>
r'784b9d45958695faffdf04ee7c105c9b486122de';
/// The parameter `itemType` of this provider.
ItemType get itemType;
final class ImportArchivesFromFileFamily extends $Family
with
$FunctionalFamilyOverride<
FutureOr<dynamic>,
(Manga?, {ItemType itemType, bool init})
> {
const ImportArchivesFromFileFamily._()
: super(
retry: null,
name: r'importArchivesFromFileProvider',
dependencies: null,
$allTransitiveDependencies: null,
isAutoDispose: true,
);
/// The parameter `init` of this provider.
bool get init;
ImportArchivesFromFileProvider call(
Manga? mManga, {
required ItemType itemType,
required bool init,
}) => ImportArchivesFromFileProvider._(
argument: (mManga, itemType: itemType, init: init),
from: this,
);
@override
String toString() => r'importArchivesFromFileProvider';
}
class _ImportArchivesFromFileProviderElement
extends AutoDisposeFutureProviderElement<Object?>
with ImportArchivesFromFileRef {
_ImportArchivesFromFileProviderElement(super.provider);
@override
Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga;
@override
ItemType get itemType => (origin as ImportArchivesFromFileProvider).itemType;
@override
bool get init => (origin as ImportArchivesFromFileProvider).init;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -1,7 +1,7 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/download.dart';

View file

@ -1,7 +1,7 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/download.dart';

View file

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:isar/isar.dart';
import 'package:isar_community/isar.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
@ -121,7 +121,7 @@ class _MainScreenState extends ConsumerState<MainScreen> {
ref.read(checkForUpdateProvider(context: context));
for (var type in ItemType.values) {
ref.read(
FetchItemSourcesListProvider(
fetchItemSourcesListProvider(
id: null,
reFresh: false,
itemType: type,

View file

@ -1,73 +1,72 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/history.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/track.dart';
// import 'package:isar_community/isar.dart';
// import 'package:mangayomi/main.dart';
// import 'package:mangayomi/models/category.dart';
// import 'package:mangayomi/models/history.dart';
// import 'package:mangayomi/models/manga.dart';
// import 'package:mangayomi/models/source.dart';
// import 'package:mangayomi/models/track.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'migration.g.dart';
@riverpod
Future<void> migration(Ref ref) async {
final mangas = isar.mangas
.filter()
.idIsNotNull()
.isMangaIsNotNull()
.findAllSync();
final categories = isar.categorys
.filter()
.idIsNotNull()
.forMangaIsNotNull()
.findAllSync();
// final mangas = isar.mangas
// .filter()
// .idIsNotNull()
// .isMangaIsNotNull()
// .findAllSync();
// final categories = isar.categorys
// .filter()
// .idIsNotNull()
// .forMangaIsNotNull()
// .findAllSync();
final histories = isar.historys
.filter()
.idIsNotNull()
.chapterIdIsNull()
.isMangaIsNotNull()
.or()
.idIsNotNull()
.isMangaIsNotNull()
.findAllSync();
// final histories = isar.historys
// .filter()
// .idIsNotNull()
// .chapterIdIsNull()
// .isMangaIsNotNull()
// .or()
// .idIsNotNull()
// .isMangaIsNotNull()
// .findAllSync();
final sources = isar.sources
.filter()
.idIsNotNull()
.isMangaIsNotNull()
.findAllSync();
final tracks = isar.tracks
.filter()
.idIsNotNull()
.isMangaIsNotNull()
.findAllSync();
// final sources = isar.sources
// .filter()
// .idIsNotNull()
// .isMangaIsNotNull()
// .findAllSync();
// final tracks = isar.tracks
// .filter()
// .idIsNotNull()
// .isMangaIsNotNull()
// .findAllSync();
isar.writeTxnSync(() {
for (var history in histories) {
isar.historys.putSync(
history..itemType = _convertToItemType(history.isManga!),
);
}
for (var source in sources) {
isar.sources.putSync(
source..itemType = _convertToItemType(source.isManga!),
);
}
for (var track in tracks) {
isar.tracks.putSync(track..itemType = _convertToItemType(track.isManga!));
}
for (var manga in mangas) {
isar.mangas.putSync(manga..itemType = _convertToItemType(manga.isManga!));
}
for (var category in categories) {
isar.categorys.putSync(
category..forItemType = _convertToItemType(category.forManga!),
);
}
});
// isar.writeTxnSync(() {
// for (var history in histories) {
// isar.historys.putSync(
// history..itemType = _convertToItemType(history.isManga!),
// );
// }
// for (var source in sources) {
// isar.sources.putSync(
// source..itemType = _convertToItemType(source.isManga!),
// );
// }
// for (var track in tracks) {
// isar.tracks.putSync(track..itemType = _convertToItemType(track.isManga!));
// }
// for (var manga in mangas) {
// isar.mangas.putSync(manga..itemType = _convertToItemType(manga.isManga!));
// }
// for (var category in categories) {
// isar.categorys.putSync(
// category..forItemType = _convertToItemType(category.forManga!),
// );
// }
// });
}
ItemType _convertToItemType(bool isManga) {
return isManga ? ItemType.manga : ItemType.anime;
}
// ItemType _convertToItemType(bool isManga) {
// return isManga ? ItemType.manga : ItemType.anime;
// }

View file

@ -6,22 +6,38 @@ part of 'migration.dart';
// RiverpodGenerator
// **************************************************************************
String _$migrationHash() => r'2a82120544e693a3162da887a3ca1b3066f3799f';
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// See also [migration].
@ProviderFor(migration)
final migrationProvider = AutoDisposeFutureProvider<void>.internal(
migration,
name: r'migrationProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$migrationHash,
dependencies: null,
allTransitiveDependencies: null,
);
const migrationProvider = MigrationProvider._();
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef MigrationRef = AutoDisposeFutureProviderRef<void>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
final class MigrationProvider
extends $FunctionalProvider<AsyncValue<void>, void, FutureOr<void>>
with $FutureModifier<void>, $FutureProvider<void> {
const MigrationProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'migrationProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$migrationHash();
@$internal
@override
$FutureProviderElement<void> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<void> create(Ref ref) {
return migration(ref);
}
}
String _$migrationHash() => r'2a82120544e693a3162da887a3ca1b3066f3799f';

Some files were not shown because too many files have changed in this diff Show more