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

This commit is contained in:
NBA2K1 2025-08-30 00:33:31 +02:00
commit e6b6fd6a92
369 changed files with 52407 additions and 24495 deletions

View file

@ -52,7 +52,7 @@ android {
applicationId "com.kodjodevf.mangayomi"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
minSdkVersion flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
@ -84,4 +84,4 @@ flutter {
dependencies {
implementation(name: 'libmtorrentserver', ext: 'aar')
}
}

View file

@ -36,6 +36,12 @@
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mangayomi" android:host="add-repo" />
</intent-filter>
<intent-filter android:label="Add custom button">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mangayomi" android:host="add-button" />
</intent-filter>
</activity>
<activity
android:name="com.linusu.flutter_web_auth_2.CallbackActivity"

BIN
assets/mangayomi_mpv.zip Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -1,5 +1,4 @@
# Run with `flutter gen-l10n`.
synthetic-package: false
arb-dir: lib/l10n
template-arb-file: app_en.arb
untranslated-messages-file: untranslated_messages.txt

View file

@ -3,7 +3,7 @@ import 'package:html/dom.dart';
import 'package:mangayomi/eval/model/document.dart';
class MDocumentBridge {
final documentBridgedClass = BridgedClassDefinition(
final documentBridgedClass = BridgedClass(
nativeType: MDocument,
name: 'MDocument',
constructors: {

View file

@ -3,7 +3,7 @@ import 'package:html/dom.dart';
import 'package:mangayomi/eval/model/element.dart';
class MElementBridge {
final elementBridgedClass = BridgedClassDefinition(
final elementBridgedClass = BridgedClass(
nativeType: MElement,
name: 'MElement',
constructors: {

View file

@ -2,7 +2,7 @@ import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/filter.dart';
class FilterBridge {
final filterBridgedClass = BridgedClassDefinition(
final filterBridgedClass = BridgedClass(
nativeType: FilterList,
name: 'FilterList',
constructors: {
@ -19,7 +19,7 @@ class FilterBridge {
(target as FilterList).filters = value as List,
},
);
final selectFilterBridgedClass = BridgedClassDefinition(
final selectFilterBridgedClass = BridgedClass(
nativeType: SelectFilter,
name: 'SelectFilter',
constructors: {
@ -53,7 +53,7 @@ class FilterBridge {
(target as SelectFilter).typeName = value as String?,
},
);
final selectFilterOptionBridgedClass = BridgedClassDefinition(
final selectFilterOptionBridgedClass = BridgedClass(
nativeType: SelectFilterOption,
name: 'SelectFilterOption',
constructors: {
@ -80,7 +80,7 @@ class FilterBridge {
},
);
final separatorFilterBridgedClass = BridgedClassDefinition(
final separatorFilterBridgedClass = BridgedClass(
nativeType: SeparatorFilter,
name: 'SeparatorFilter',
constructors: {
@ -103,7 +103,7 @@ class FilterBridge {
},
);
final headerFilterBridgedClass = BridgedClassDefinition(
final headerFilterBridgedClass = BridgedClass(
nativeType: HeaderFilter,
name: 'HeaderFilter',
constructors: {
@ -130,7 +130,7 @@ class FilterBridge {
},
);
final textFilterBridgedClass = BridgedClassDefinition(
final textFilterBridgedClass = BridgedClass(
nativeType: TextFilter,
name: 'TextFilter',
constructors: {
@ -161,7 +161,7 @@ class FilterBridge {
},
);
final sortFilterBridgedClass = BridgedClassDefinition(
final sortFilterBridgedClass = BridgedClass(
nativeType: SortFilter,
name: 'SortFilter',
constructors: {
@ -193,7 +193,7 @@ class FilterBridge {
(target as SortFilter).values = value as List,
},
);
final sortStateBridgedClass = BridgedClassDefinition(
final sortStateBridgedClass = BridgedClass(
nativeType: SortState,
name: 'SortState',
constructors: {
@ -220,7 +220,7 @@ class FilterBridge {
},
);
final triStateFilterBridgedClass = BridgedClassDefinition(
final triStateFilterBridgedClass = BridgedClass(
nativeType: TriStateFilter,
name: 'TriStateFilter',
constructors: {
@ -253,7 +253,7 @@ class FilterBridge {
},
);
final groupFilterBridgedClass = BridgedClassDefinition(
final groupFilterBridgedClass = BridgedClass(
nativeType: GroupFilter,
name: 'GroupFilter',
constructors: {
@ -284,7 +284,7 @@ class FilterBridge {
},
);
final checkBoxFilterBridgedClass = BridgedClassDefinition(
final checkBoxFilterBridgedClass = BridgedClass(
nativeType: CheckBoxFilter,
name: 'CheckBoxFilter',
constructors: {

View file

@ -5,7 +5,7 @@ import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/services/http/m_client.dart';
class HttpBridge {
final clientBridgedClass = BridgedClassDefinition(
final clientBridgedClass = BridgedClass(
nativeType: InterceptedClient,
name: 'Client',
constructors: {
@ -76,7 +76,7 @@ class HttpBridge {
(target as Client).send(positionalArgs[0] as BaseRequest),
},
);
final baseRequestBridgedClass = BridgedClassDefinition(
final baseRequestBridgedClass = BridgedClass(
nativeType: BaseRequest,
name: 'BaseRequest',
nativeNames: ['Request'],
@ -99,7 +99,7 @@ class HttpBridge {
'finalized': (visitor, target) => (target as BaseRequest).finalized,
},
);
final responseBridgedClass = BridgedClassDefinition(
final responseBridgedClass = BridgedClass(
nativeType: Response,
name: 'Response',
constructors: {
@ -120,7 +120,7 @@ class HttpBridge {
'request': (visitor, target) => (target as Response).request,
},
);
final streamedResponseBridgedClass = BridgedClassDefinition(
final streamedResponseBridgedClass = BridgedClass(
nativeType: StreamedResponse,
name: 'StreamedResponse',
constructors: {
@ -144,7 +144,7 @@ class HttpBridge {
'request': (visitor, target) => (target as StreamedResponse).request,
},
);
final byteStreamBridgedClass = BridgedClassDefinition(
final byteStreamBridgedClass = BridgedClass(
nativeType: ByteStream,
name: 'ByteStream',
constructors: {

View file

@ -2,7 +2,7 @@ import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
class MChapterBridge {
final mChapterBridgedClass = BridgedClassDefinition(
final mChapterBridgedClass = BridgedClass(
nativeType: MChapter,
name: 'MChapter',
constructors: {
@ -12,6 +12,11 @@ class MChapterBridge {
url: namedArgs.get<String?>('url'),
dateUpload: namedArgs.get<String?>('dateUpload'),
scanlator: namedArgs.get<String?>('scanlator'),
isFiller: namedArgs.get<bool?>('isFiller'),
thumbnailUrl: namedArgs.get<String?>('scanlator'),
description: namedArgs.get<String?>('scanlator'),
downloadSize: namedArgs.get<String?>('scanlator'),
duration: namedArgs.get<String?>('scanlator'),
);
},
},
@ -20,6 +25,11 @@ class MChapterBridge {
'url': (visitor, target) => (target as MChapter).url,
'dateUpload': (visitor, target) => (target as MChapter).dateUpload,
'scanlator': (visitor, target) => (target as MChapter).scanlator,
'isFiller': (visitor, target) => (target as MChapter).isFiller,
'thumbnailUrl': (visitor, target) => (target as MChapter).thumbnailUrl,
'description': (visitor, target) => (target as MChapter).description,
'downloadSize': (visitor, target) => (target as MChapter).downloadSize,
'duration': (visitor, target) => (target as MChapter).duration,
},
setters: {
'name': (visitor, target, value) =>
@ -30,6 +40,16 @@ class MChapterBridge {
(target as MChapter).dateUpload = value as String?,
'scanlator': (visitor, target, value) =>
(target as MChapter).scanlator = value as String?,
'isFiller': (visitor, target, value) =>
(target as MChapter).isFiller = value as bool?,
'thumbnailUrl': (visitor, target, value) =>
(target as MChapter).thumbnailUrl = value as String?,
'description': (visitor, target, value) =>
(target as MChapter).description = value as String?,
'downloadSize': (visitor, target, value) =>
(target as MChapter).downloadSize = value as String?,
'duration': (visitor, target, value) =>
(target as MChapter).duration = value as String?,
},
);
void registerBridgedClasses(D4rt interpreter) {

View file

@ -3,7 +3,7 @@ import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/manga.dart';
class MMangaBridge {
final mMangaBridgedClass = BridgedClassDefinition(
final mMangaBridgedClass = BridgedClass(
nativeType: MManga,
name: 'MManga',
constructors: {

View file

@ -3,7 +3,7 @@ import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
class MPagesBridge {
final mPageBridgedClass = BridgedClassDefinition(
final mPageBridgedClass = BridgedClass(
nativeType: MPages,
name: 'MPages',
constructors: {

View file

@ -7,7 +7,7 @@ import 'package:mangayomi/modules/browse/extension/providers/extension_preferenc
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class MProviderBridged {
final mProviderBridged = BridgedClassDefinition(
final mProviderBridged = BridgedClass(
nativeType: MProvider,
name: 'MProvider',
constructors: {

View file

@ -2,7 +2,7 @@ import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_source.dart';
class MSourceBridge {
final mSourceBridgedClass = BridgedClassDefinition(
final mSourceBridgedClass = BridgedClass(
nativeType: MSource,
name: 'MSource',
constructors: {

View file

@ -2,7 +2,7 @@ import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/models/video.dart';
class MTrackBridge {
final mTrackBridgedClass = BridgedClassDefinition(
final mTrackBridgedClass = BridgedClass(
nativeType: Track,
name: 'MTrack',
constructors: {

View file

@ -2,7 +2,7 @@ import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/models/video.dart';
class MVideoBridge {
final mVideoBridgedClass = BridgedClassDefinition(
final mVideoBridgedClass = BridgedClass(
nativeType: Video,
name: 'MVideo',
constructors: {

View file

@ -3,7 +3,7 @@ import 'package:mangayomi/eval/model/source_preference.dart';
// EditTextPreference
class SourcePreferenceBridge {
final checkBoxPreferenceBridgedClass = BridgedClassDefinition(
final checkBoxPreferenceBridgedClass = BridgedClass(
nativeType: CheckBoxPreference,
name: 'CheckBoxPreference',
constructors: {
@ -28,7 +28,7 @@ class SourcePreferenceBridge {
(target as SourcePreference).checkBoxPreference?.value,
},
);
final switchPreferenceCompatBridgedClass = BridgedClassDefinition(
final switchPreferenceCompatBridgedClass = BridgedClass(
nativeType: SwitchPreferenceCompat,
name: 'SwitchPreferenceCompat',
constructors: {
@ -53,7 +53,7 @@ class SourcePreferenceBridge {
(target as SourcePreference).switchPreferenceCompat?.value,
},
);
final listPreferenceBridgedClass = BridgedClassDefinition(
final listPreferenceBridgedClass = BridgedClass(
nativeType: ListPreference,
name: 'ListPreference',
constructors: {
@ -85,7 +85,7 @@ class SourcePreferenceBridge {
},
);
final multiSelectListPreferenceBridgedClass = BridgedClassDefinition(
final multiSelectListPreferenceBridgedClass = BridgedClass(
nativeType: MultiSelectListPreference,
name: 'MultiSelectListPreference',
constructors: {
@ -116,7 +116,7 @@ class SourcePreferenceBridge {
(target as SourcePreference).multiSelectListPreference?.entryValues,
},
);
final editTextPreferenceBridgedClass = BridgedClassDefinition(
final editTextPreferenceBridgedClass = BridgedClass(
nativeType: EditTextPreference,
name: 'EditTextPreference',
constructors: {

View file

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

View file

@ -0,0 +1,85 @@
import 'package:mangayomi/models/manga.dart';
class MangaPages {
List<SManga> list;
bool hasNextPage;
MangaPages({required this.list, this.hasNextPage = false});
factory MangaPages.fromJson(Map<String, dynamic> json, ItemType itemType) {
final name = itemType == ItemType.anime ? "animes" : "mangas";
return MangaPages(
list: json[name] != null
? (json[name] as List).map((e) => SManga.fromJson(e)).toList()
: [],
hasNextPage: json['hasNextPage'],
);
}
Map<String, dynamic> toJson(ItemType itemType) => {
itemType == ItemType.anime ? "animes" : "mangas": list
.map((v) => v.toJson())
.toList(),
'hasNextPage': hasNextPage,
};
}
class SManga {
String? url;
String? title;
String? artist;
String? author;
String? description;
List<String>? genre;
Status? status;
String? thumbnailUrl;
SManga({
this.url,
this.title,
this.artist,
this.author,
this.description,
this.genre,
this.status = Status.unknown,
this.thumbnailUrl,
});
factory SManga.fromJson(Map<String, dynamic> json) {
return SManga(
url: json['url'],
title: json['title'],
artist: json['artist'],
author: json['author'],
description: json['description'],
genre: (json['genres'] as List?)?.map((e) => e.toString()).toList() ?? [],
status: switch (json['status'] as int?) {
1 => Status.ongoing,
2 => Status.completed,
4 => Status.publishingFinished,
5 => Status.canceled,
6 => Status.onHiatus,
_ => Status.unknown,
},
thumbnailUrl: json['thumbnail_url'],
);
}
Map<String, dynamic> toJson() {
return {
'url': url,
'title': title,
'artist': artist,
'author': author,
'description': description,
'genre': genre?.join(", "),
'status': status,
'thumbnail_url': thumbnailUrl,
};
}
}

339
lib/eval/mihon/service.dart Normal file
View file

@ -0,0 +1,339 @@
import 'dart:convert';
import 'dart:math';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/javascript/http.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/page.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/services/http/m_client.dart';
import '../../models/manga.dart';
import '../interface.dart';
import 'models.dart';
class MihonExtensionService implements ExtensionService {
late String androidProxyServer;
@override
late Source source;
late InterceptedClient client;
MihonExtensionService(this.source, this.androidProxyServer) {
client = MClient.init();
}
@override
Map<String, String> getHeaders() {
return source.headers != null && source.headers!.isNotEmpty
? (jsonDecode(source.headers!) as Map?)?.toMapStringString ?? {}
: {};
}
@override
bool get supportsLatest {
return source.supportLatest ?? false;
}
@override
String get sourceBaseUrl {
return source.baseUrl!;
}
@override
Future<MPages> getPopular(int page) async {
final name = source.itemType == ItemType.anime ? "Anime" : "Manga";
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getPopular$name",
"page": page + 1,
"search": "",
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as Map<String, dynamic>;
final pages = MangaPages.fromJson(data, source.itemType);
return MPages(
list: pages.list
.map(
(e) => MManga(
name: e.title,
link: e.url,
artist: e.artist,
author: e.author,
description: e.description,
genre: e.genre,
status: e.status,
imageUrl: e.thumbnailUrl,
chapters: [],
),
)
.toList(),
hasNextPage: pages.hasNextPage,
);
}
@override
Future<MPages> getLatestUpdates(int page) async {
final name = source.itemType == ItemType.anime ? "Anime" : "Manga";
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getLatest$name",
"page": page + 1,
"search": "",
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as Map<String, dynamic>;
final pages = MangaPages.fromJson(data, source.itemType);
return MPages(
list: pages.list
.map(
(e) => MManga(
name: e.title,
link: e.url,
artist: e.artist,
author: e.author,
description: e.description,
genre: e.genre,
status: e.status,
imageUrl: e.thumbnailUrl,
chapters: [],
),
)
.toList(),
hasNextPage: pages.hasNextPage,
);
}
@override
Future<MPages> search(String query, int page, List<dynamic> filters) async {
final name = source.itemType == ItemType.anime ? "Anime" : "Manga";
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getSearch$name",
"page": max(1, page),
"search": query,
"filterList": _convertFilters(filters),
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as Map<String, dynamic>;
final pages = MangaPages.fromJson(data, source.itemType);
return MPages(
list: pages.list
.map(
(e) => MManga(
name: e.title,
link: e.url,
artist: e.artist,
author: e.author,
description: e.description,
genre: e.genre,
status: e.status,
imageUrl: e.thumbnailUrl,
chapters: [],
),
)
.toList(),
hasNextPage: pages.hasNextPage,
);
}
@override
Future<MManga> getDetail(String url) async {
final name = source.itemType == ItemType.anime ? "Anime" : "Manga";
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getDetails$name",
if (source.itemType == ItemType.manga) "mangaData": {"url": url},
if (source.itemType == ItemType.anime) "animeData": {"url": url},
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as Map<String, dynamic>;
final chapters = await getChapterList(url);
return MManga(
name: data['title'],
link: data['url'],
artist: data['artist'],
author: data['author'],
description: data['description'],
genre: (data['genres'] as List?)?.map((e) => e.toString()).toList() ?? [],
status: switch (data['status'] as int?) {
1 => Status.ongoing,
2 => Status.completed,
4 => Status.publishingFinished,
5 => Status.canceled,
6 => Status.onHiatus,
_ => Status.unknown,
},
imageUrl: data['thumbnail_url'],
chapters: chapters,
);
}
Future<List<MChapter>> getChapterList(String url) async {
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": source.itemType == ItemType.anime
? "getEpisodeList"
: "getChapterList",
if (source.itemType == ItemType.manga) "mangaData": {"url": url},
if (source.itemType == ItemType.anime) "animeData": {"url": url},
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as List;
return data
.map(
(e) => MChapter(
name: e['name'],
url: e['url'],
dateUpload:
(e['date_upload'] as int?)?.toString() ??
DateTime.now().millisecondsSinceEpoch.toString(),
scanlator: e['scanlator'],
),
)
.toList();
}
@override
Future<List<PageUrl>> getPageList(String url) async {
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getPageList",
"chapterData": {"url": url},
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as List;
return data.map((e) => PageUrl(e['imageUrl'])).toList();
}
@override
Future<List<Video>> getVideoList(String url) async {
final res = await client.post(
Uri.parse("$androidProxyServer/dalvik"),
body: jsonEncode({
"method": "getVideoList",
"episodeData": {"url": url},
"preferences": getSourcePreferences(),
"data": source.sourceCode,
}),
);
final data = jsonDecode(res.body) as List;
return data.map((e) {
final tempHeaders =
e['headers']?['namesAndValues\$okhttp'] as List<dynamic>?;
final Map<String, String> headers = {};
if (tempHeaders != null) {
for (var i = 0; i + 1 < tempHeaders.length; i += 2) {
headers[tempHeaders[i]] = tempHeaders[i + 1];
}
}
return Video(
e['videoUrl'],
e['quality'],
e['url'],
headers: headers,
audios:
(e['audioTracks'] as List?)
?.map(
(e) => Track(
file: e['file'] ?? e['url'],
label: e['label'] ?? e['lang'],
),
)
.toList() ??
[],
subtitles:
(e['subtitleTracks'] as List?)
?.map(
(e) => Track(
file: e['file'] ?? e['url'],
label: e['label'] ?? e['lang'],
),
)
.toList() ??
[],
);
}).toList();
}
@override
Future<String> getHtmlContent(String name, String url) async {
return "";
}
@override
Future<String> cleanHtmlContent(String html) async {
return html;
}
@override
FilterList getFilterList() {
return source.getFilterList() ?? FilterList([]);
}
@override
List<SourcePreference> getSourcePreferences() {
if (source.preferenceList == null) {
return [];
}
final data = jsonDecode(source.preferenceList!) as List;
return data.map((e) => SourcePreference.fromJson(e)).toList();
}
List<dynamic> _convertFilters(List<dynamic> filters) {
return filters.expand((e) sync* {
if (e is TextFilter) {
yield {"name": e.name, "stateString": e.state, "type": "TextFilter"};
} else if (e is GroupFilter) {
yield {
"name": e.name,
"stateList": e.state.expand((e) sync* {
if (e is CheckBoxFilter) {
yield {
"name": e.name,
"stateBoolean": e.state,
"type": "CheckBoxFilter",
};
} else if (e is TriStateFilter) {
yield {
"name": e.name,
"stateInt": e.state,
"type": "TriStateFilter",
};
}
}).toList(),
"type": "GroupFilter",
};
} else if (e is SelectFilter) {
yield {"name": e.name, "stateInt": e.state, "type": "SelectFilter"};
} else if (e is SortFilter) {
yield {
"name": e.name,
"stateSort": {"ascending": e.state.ascending, "index": e.state.index},
"type": "SortFilter",
};
}
}).toList();
}
}

View file

@ -690,6 +690,7 @@ void Function() botToast(
],
bool onlyOne = true,
bool? themeDark,
bool showIcon = true,
}) {
final context = navigatorKey.currentState?.context;
final assets = [
@ -703,12 +704,14 @@ void Function() botToast(
duration: Duration(seconds: second),
animationDuration: Duration(milliseconds: animationDuration),
animationReverseDuration: Duration(milliseconds: animationDuration),
leading: (_) => Image.asset(
(themeDark == null
? (assets..shuffle()).first
: assets[themeDark ? 0 : 1]),
height: 25,
),
leading: showIcon
? (_) => Image.asset(
(themeDark == null
? (assets..shuffle()).first
: assets[themeDark ? 0 : 1]),
height: 25,
)
: null,
title: (_) => Text(title, style: TextStyle(fontSize: fontSize)),
trailing: hasCloudFlare
? (_) => OutlinedButton.icon(

View file

@ -6,13 +6,41 @@ class MChapter {
String? dateUpload;
String? scanlator;
MChapter({this.name, this.url, this.dateUpload, this.scanlator});
bool? isFiller;
String? thumbnailUrl;
String? description;
/// video size
String? downloadSize;
/// video duration
String? duration;
MChapter({
this.name,
this.url,
this.dateUpload,
this.scanlator,
this.isFiller = false,
this.thumbnailUrl,
this.description,
this.downloadSize,
this.duration,
});
factory MChapter.fromJson(Map<String, dynamic> json) {
return MChapter(
name: json['name'],
url: json['url'],
dateUpload: json['dateUpload'],
scanlator: json['scanlator'],
isFiller: json['isFiller'] ?? false,
thumbnailUrl: json['thumbnailUrl'],
description: json['description'],
downloadSize: json['downloadSize'],
duration: json['duration'],
);
}
Map<String, dynamic> toJson() => {
@ -20,5 +48,10 @@ class MChapter {
'url': url,
'dateUpload': dateUpload,
'scanlator': scanlator,
'isFiller': isFiller,
'thumbnailUrl': thumbnailUrl,
'description': description,
'downloadSize': downloadSize,
'duration': duration,
};
}

View file

@ -1,3 +1,5 @@
import 'dart:math';
import 'package:isar/isar.dart';
part 'source_preference.g.dart';
@ -139,7 +141,9 @@ class ListPreference {
return ListPreference(
title: json['title'],
summary: json['summary'],
valueIndex: json['valueIndex'],
valueIndex: json['valueIndex'] != null
? max(0, json['valueIndex'])
: null,
entries: json['entries']?.cast<String>(),
entryValues: json['entryValues']?.cast<String>(),
);

File diff suppressed because it is too large Load diff

279
lib/l10n/app_as.arb Normal file
View file

@ -0,0 +1,279 @@
{
"@@locale": "as",
"library": "পুথিভঁৰাল",
"updates": "আপডেট",
"history": "ইতিহাস",
"browse": "ব্ৰাউজ",
"more": "অধিক",
"open_random_entry": "যিকোনো এণ্ট্ৰি খোলক",
"import": "আমদানি",
"filter": "ফিল্টাৰ",
"downloaded": "ডাউনলোড কৰা",
"unread": "নপঢ়া",
"started": "আৰম্ভ কৰা",
"bookmarked": "বুকমাৰ্ক কৰা",
"sort": "শাৰী কৰক",
"alphabetically": "বৰ্ণানুক্ৰমে",
"last_read": "শেষত পঢ়া",
"last_update_check": "শেষ আপডেট পৰীক্ষা",
"unread_count": "নপঢ়াৰ সংখ্যা",
"latest_chapter": "শেষৰ অধ্যায়",
"date_added": "তাৰিখ যোগ কৰা",
"display": "প্ৰদৰ্শন",
"display_mode": "প্ৰদৰ্শন মোড",
"compact_grid": "সংক্ষিপ্ত গ্ৰিড",
"comfortable_grid": "আৰামদায়ক গ্ৰিড",
"cover_only_grid": "মাত্ৰ কভাৰৰ গ্ৰিড",
"list": "তালিকা",
"badges": "বেজ",
"downloaded_chapters": "ডাউনলোড কৰা অধ্যায়",
"language": "ভাষা",
"local_source": "স্থানীয় উৎস",
"tabs": "টেব",
"show_category_tabs": "শ্ৰেণীৰ টেব দেখুৱাওক",
"show_numbers_of_items": "বস্তুৰ সংখ্যা দেখুৱাওক",
"other": "অন্যান্য",
"show_continue_reading_buttons": "পঢ়া অব্যাহত ৰখাৰ বুটাম দেখুৱাওক",
"empty_library": "খালী পুথিভঁৰাল",
"search": "সন্ধান...",
"no_recent_updates": "শেহতীয়া আপডেট নাই",
"remove_everything": "সকলো আঁতৰাওক",
"remove_everything_msg": "আপুনি নিশ্চিত নে? সকলো ইতিহাস হেৰাই যাব",
"ok": "ঠিক আছে",
"cancel": "বাতিল",
"remove": "আঁতৰাওক",
"remove_history_msg": "ইয়ে এই অধ্যায়ৰ পঢ়া তাৰিখ আঁতৰাব। আপুনি নিশ্চিত নে?",
"last_used": "শেষবাৰ ব্যৱহৃত",
"pinned": "পিন কৰা",
"sources": "উৎস",
"install": "ইনষ্টল",
"update": "আপডেট",
"latest": "শেষৰ",
"extensions": "এক্সটেনশন",
"migrate": "স্থানান্তৰ",
"incognito_mode": "গোপন মোড",
"incognito_mode_description": "পঢ়াৰ ইতিহাস স্থগিত কৰে",
"download_queue": "ডাউনলোড শাৰী",
"categories": "শ্ৰেণী",
"settings": "ছেটিং",
"about": "বিষয়ে",
"help": "সহায়",
"no_downloads": "কোনো ডাউনলোড নাই",
"edit_categories": "শ্ৰেণী সম্পাদনা",
"edit_categories_description": "আপোনাৰ কোনো শ্ৰেণী নাই। পুথিভঁৰাল সংগঠিত কৰিবলৈ প্লাছ বুটামত টেপ কৰক",
"add": "যোগ কৰক",
"add_category": "শ্ৰেণী যোগ কৰক",
"name": "নাম",
"category_name_required": "*প্ৰয়োজনীয়",
"add_category_error_exist": "এই নামৰ শ্ৰেণী ইতিমধ্যে আছে!",
"delete_category": "শ্ৰেণী মচক",
"delete_category_msg": "আপুনি {name} শ্ৰেণী মচিব বিচাৰে নে?",
"rename_category": "শ্ৰেণীৰ নাম সলনি কৰক",
"general": "সাধাৰণ",
"general_subtitle": "এপৰ ভাষা",
"app_language": "এপৰ ভাষা",
"appearance": "চেহেৰা",
"appearance_subtitle": "থীম, তাৰিখ আৰু সময়ৰ ফৰ্মেট",
"theme": "থীম",
"dark_mode": "ডাৰ্ক মোড",
"on": "অন",
"off": "অফ",
"pure_black_dark_mode": "পিউৰ ব্লেক ডাৰ্ক মোড",
"timestamp": "টাইমষ্টেম্প",
"relative_timestamp": "আপেক্ষিক টাইমষ্টেম্প",
"relative_timestamp_short": "চমু (আজি, কালি)",
"relative_timestamp_long": "দীঘল (চমু+, n দিনৰ আগতে)",
"date_format": "তাৰিখৰ ফৰ্মেট",
"reader": "পাঠক",
"refresh": "ৰিফ্ৰেছ",
"reader_subtitle": "পঢ়াৰ মোড, প্ৰদৰ্শন, নেভিগেশন",
"default_reading_mode": "ডিফল্ট পঢ়াৰ মোড",
"reading_mode_vertical": "উলম্ব",
"reading_mode_horizontal": "অনুভূমিক",
"reading_mode_left_to_right": "বাওঁফালৰ পৰা সোঁফাললৈ",
"reading_mode_right_to_left": "সোঁফালৰ পৰা বাওঁফাললৈ",
"reading_mode_vertical_continuous": "উলম্ব অবিৰত",
"reading_mode_webtoon": "ৱেবটুন",
"double_tap_animation_speed": "ডাবল টেপ এনিমেশনৰ গতি",
"normal": "সাধাৰণ",
"fast": "দ্ৰুত",
"no_animation": "কোনো এনিমেশন নাই",
"animate_page_transitions": "পৃষ্ঠা স্থানান্তৰ এনিমেট কৰক",
"crop_borders": "সীমা কাটক",
"downloads": "ডাউনলোড",
"downloads_subtitle": "ডাউনলোড ছেটিং",
"download_location": "ডাউনলোডৰ স্থান",
"custom_location": "কাষ্টম স্থান",
"only_on_wifi": "কেৱল ৱাই-ফাইত",
"save_as_cbz_archive": "CBZ আৰ্কাইভ হিচাপে সাঁচক",
"browse_subtitle": "উৎস, গ্ল’বেল সন্ধান",
"only_include_pinned_sources": "কেৱল পিন কৰা উৎস অন্তৰ্ভুক্ত কৰক",
"nsfw_sources": "NSFW (+18) উৎস",
"nsfw_sources_show": "উৎস আৰু এক্সটেনশন তালিকাত দেখুৱাওক",
"nsfw_sources_info": "ইয়ে অফিচিয়েল নহোৱা বা সম্ভৱতঃ ভুলকৈ ফ্লেগ কৰা এক্সটেনশনৰ পৰা NSFW (18+) বিষয়বস্তু এপত দেখা দিয়াৰ পৰা ৰক্ষা নকৰে",
"version": "সংস্কৰণ",
"check_for_update": "আপডেটৰ বাবে পৰীক্ষা কৰক",
"n_days_ago": "{days} দিনৰ আগতে",
"today": "আজি",
"yesterday": "কালি",
"a_week_ago": "এসপ্তাহৰ আগতে",
"add_to_library": "পুথিভঁৰালত যোগ কৰক",
"completed": "সম্পূৰ্ণ",
"ongoing": "চলি আছে",
"on_hiatus": "বিৰতিত",
"canceled": "বাতিল কৰা",
"publishing_finished": "প্ৰকাশ সমাপ্ত",
"unknown": "অজ্ঞাত",
"set_categories": "শ্ৰেণী নিৰ্ধাৰণ কৰক",
"edit": "সম্পাদনা",
"in_library": "পুথিভঁৰালত",
"filter_scanlator_groups": "স্কেনলেটৰ গ্ৰুপ ফিল্টাৰ কৰক",
"reset": "ৰিছেট",
"by_source": "উৎস অনুসৰি",
"by_chapter_number": "অধ্যায়ৰ সংখ্যা অনুসৰি",
"by_upload_date": "আপলোডৰ তাৰিখ অনুসৰি",
"source_title": "উৎসৰ শিৰোনাম",
"chapter_number": "অধ্যায়ৰ সংখ্যা",
"share": "শ্বেয়াৰ",
"n_chapters": "{number} অধ্যায়",
"no_description": "কোনো বিৱৰণ নাই",
"resume": "পুনৰ আৰম্ভ",
"read": "পঢ়ক",
"popular": "জনপ্ৰিয়",
"open_in_browser": "ব্ৰাউজাৰত খোলক",
"clear_cookie": "কুকী আঁতৰাওক",
"show_page_number": "পৃষ্ঠাৰ সংখ্যা দেখুৱাওক",
"from_library": "পুথিভঁৰালৰ পৰা",
"downloaded_chapter": "ডাউনলোড কৰা অধ্যায়",
"page": "পৃষ্ঠা {page}",
"global_search": "গ্ল’বেল সন্ধান",
"color_blend_level": "ৰংৰ মিশ্ৰণ স্তৰ",
"current": "বৰ্তমান {char}",
"finished": "শেষ {char}",
"next": "পৰৱৰ্তী {char}",
"previous": "পূৰ্বৰ {char}",
"no_more_chapter": "আৰু কোনো অধ্যায় নাই",
"no_result": "কোনো ফলাফল নাই",
"send": "পঠিয়াওক",
"delete": "মচক",
"start_downloading": "এতিয়া ডাউনলোড আৰম্ভ কৰক",
"retry": "পুনৰ চেষ্টা কৰক",
"add_chapters": "অধ্যায় যোগ কৰক",
"delete_chapters": "অধ্যায় মচক?",
"default0": "ডিফল্ট",
"total_chapters": "মুঠ অধ্যায়",
"import_local_file": "স্থানীয় ফাইল আমদানি কৰক",
"import_files": "ফাইল",
"nothing_read_recently": "শেহতীয়াকৈ একো পঢ়া নাই",
"status": "স্থিতি",
"not_started": "আৰম্ভ হোৱা নাই",
"score": "স্ক’ৰ",
"start_date": "আৰম্ভৰ তাৰিখ",
"finish_date": "শেষৰ তাৰিখ",
"reading": "পঢ়ি আছে",
"on_hold": "ৰখা আছে",
"dropped": "বাদ দিয়া",
"plan_to_read": "পঢ়াৰ পৰিকল্পনা",
"re_reading": "পুনৰ পঢ়ি আছে",
"chapters": "অধ্যায়",
"add_tracker": "ট্ৰেকাৰ যোগ কৰক",
"one_tracker": "১ টা ট্ৰেকাৰ",
"n_tracker": "{n} টা ট্ৰেকাৰ",
"tracking": "ট্ৰেকিং",
"description": "বিৱৰণ",
"episode_progress": "প্ৰগতি: {n}",
"n_episodes": "{n} খণ্ড",
"manga_sources": "মাংগা উৎস",
"anime_sources": "এনিমে উৎস",
"anime_extensions": "এনিমে এক্সটেনশন",
"manga_extensions": "মাংগা এক্সটেনশন",
"anime": "এনিমে",
"manga": "মাংগা",
"library_no_category_exist": "আপোনাৰ এতিয়াও কোনো শ্ৰেণী নাই",
"watching": "চাই আছে",
"plan_to_watch": "চোৱাৰ পৰিকল্পনা",
"re_watching": "পুনৰ চাই আছে",
"episodes": "খণ্ড",
"download": "ডাউনলোড",
"new_update_available": "নতুন আপডেট উপলব্ধ",
"app_version": "এপৰ সংস্কৰণ: v{v}",
"searching_for_updates": "আপডেটৰ বাবে সন্ধান কৰি আছে...",
"no_new_updates_available": "কোনো নতুন আপডেট উপলব্ধ নাই",
"uninstall": "আনইনষ্টল",
"uninstall_extension": "{ext} এক্সটেনশন আনইনষ্টল কৰিব নে?",
"langauage": "ভাষা",
"extension_detail": "এক্সটেনশনৰ বিৱৰণ",
"scale_type": "স্কেলৰ ধৰণ",
"scale_type_fit_screen": "স্ক্ৰীণৰ সৈতে মিলাওক",
"scale_type_stretch": "প্ৰসাৰিত",
"scale_type_fit_width": "প্ৰস্থৰ সৈতে মিলাওক",
"scale_type_fit_height": "উচ্চতাৰ সৈতে মিলাওক",
"scale_type_original_size": "মূল আকাৰ",
"scale_type_smart_fit": "স্মাৰ্ট ফিট",
"page_preload_amount": "পৃষ্ঠা প্ৰিলোডৰ পৰিমাণ",
"page_preload_amount_subtitle": "পঢ়াৰ সময়ত প্ৰিলোড কৰিবলগীয়া পৃষ্ঠাৰ পৰিমাণ। অধিক মানে মসৃণ পঢ়াৰ অভিজ্ঞতা, কিন্তু কেশ্ব আৰু নেটৱৰ্কৰ ব্যৱহাৰ বেছি হ’ব।",
"image_loading_error": "এই ছবি লোড কৰিব পৰা নগ’ল",
"add_episodes": "খণ্ড যোগ কৰক",
"video_quality": "গুণ",
"video_subtitle": "উপশিৰোনাম",
"check_for_extension_updates": "এক্সটেনশন আপডেটৰ বাবে পৰীক্ষা কৰক",
"auto_extensions_updates": "স্বয়ংক্ৰিয় এক্সটেনশন আপডেট",
"auto_extensions_updates_subtitle": "নতুন সংস্কৰণ উপলব্ধ হ’লে এক্সটেনশন স্বয়ংক্ৰিয়ভাৱে আপডেট কৰিব।",
"reading_mode": "পঢ়াৰ মোড",
"custom_filter": "কাষ্টম ফিল্টাৰ",
"background_color": "পটভূমিৰ ৰং",
"white": "বগা",
"black": "ক’লা",
"grey": "ধূসৰ",
"automaic": "স্বয়ংক্ৰিয়",
"preferred_domain": "পছন্দৰ ড’মেইন",
"load_more": "অধিক লোড কৰক",
"cancel_all_for_this_series": "এই শৃংখলাৰ সকলো বাতিল কৰক",
"login": "লগইন",
"login_into": "{tracker} ত লগইন কৰক",
"email_adress": "ইমেইল ঠিকনা",
"password": "পাছৱৰ্ড",
"log_out_from": "{tracker} ৰ পৰা লগ আউট কৰিব নে?",
"log_out": "লগ আউট",
"update_pending": "আপডেট বাকী আছে",
"update_all": "সকলো আপডেট কৰক",
"backup_and_restore": "বেকআপ আৰু পুনৰুদ্ধাৰ",
"create_backup": "বেকআপ সৃষ্টি কৰক",
"create_backup_dialog_title": "আপুনি কি বেকআপ কৰিব বিচাৰে?",
"create_backup_subtitle": "বৰ্তমানৰ পুথিভঁৰাল পুনৰুদ্ধাৰৰ বাবে ব্যৱহাৰ কৰিব পাৰি",
"restore_backup": "বেকআপ পুনৰুদ্ধাৰ",
"restore_backup_subtitle": "বেকআপ ফাইলৰ পৰা পুথিভঁৰাল পুনৰুদ্ধাৰ কৰক",
"automatic_backups": "স্বয়ংক্ৰিয় বেকআপ",
"backup_frequency": "বেকআপৰ কম্পাঙ্ক",
"backup_location": "বেকআপৰ স্থান",
"backup_options": "বেকআপৰ বিকল্প",
"backup_options_dialog_title": "আপুনি কি বেকআপ কৰিব বিচাৰে?",
"backup_options_subtitle": "বেকআপ ফাইলত কি তথ্য অন্তৰ্ভুক্ত কৰিব",
"backup_and_restore_warning_info": "আপুনি বেকআপৰ কপি অন্য ঠাইতো ৰাখিব লাগে",
"library_entries": "পুথিভঁৰালৰ এণ্ট্ৰি",
"chapters_and_episode": "অধ্যায় আৰু খণ্ড",
"every_6_hours": "প্ৰতি ৬ ঘণ্টা",
"every_12_hours": "প্ৰতি ১২ ঘণ্টা",
"daily": "দৈনিক",
"every_2_days": "প্ৰতি ২ দিন",
"weekly": "সাপ্তাহিক",
"restore_backup_warning_title": "বেকআপ পুনৰুদ্ধাৰে সকলো বিদ্যমান তথ্য ওভাৰৰাইট কৰিব।\n\nপুনৰুদ্ধাৰ অব্যাহত ৰাখিব নে?",
"services": "সেৱা",
"tracking_warning_info": "ট্ৰেকিং সেৱাত অধ্যায়ৰ প্ৰগতি আপডেট কৰিবলৈ একমুখী ছিংক। পৃথক এণ্ট্ৰিৰ বাবে ট্ৰেকিং তেওঁলোকৰ ট্ৰেকিং বুটামৰ পৰা ছেট আপ কৰক।",
"use_page_tap_zones": "পৃষ্ঠা টেপ জ’ন ব্যৱহাৰ কৰক",
"manage_trackers": "ট্ৰেকাৰ পৰিচালনা কৰক",
"restore": "পুনৰুদ্ধাৰ",
"backups": "বেকআপ",
"by_scanlator": "স্কেনলেটৰ অনুসৰি",
"by_name": "নাম অনুসৰি",
"installed": "ইনষ্টল কৰা",
"auto_scroll": "স্বয়ংক্ৰিয় স্ক্ৰ’ল",
"video_audio": "অডিঅ’",
"player": "প্লেয়াৰ",
"markEpisodeAsSeenSetting": "খণ্ডটো কেতিয়া দেখা বুলি চিহ্নিত কৰিব",
"default_skip_intro_length": "ডিফল্ট ইনট্ৰ’ এৰি দিয়াৰ দৈৰ্ঘ্য",
"default_playback_speed_length": "ডিফল্ট প্লেবেক গতিৰ দৈৰ্ঘ্য",
"updateProgressAfterReading": "পঢ়াৰ পিছত প্ৰগতি আপডেট কৰক",
"no_sources_installed": "কোনো উৎস ইনষ্টল কৰা নাই!",
"show_extensions": "এক্সটেনশন দেখুৱাওক"
}

View file

@ -77,6 +77,8 @@
"clean_database_desc": "This will remove all items that are not added to the library!",
"incognito_mode": "Incognito Mode",
"incognito_mode_description": "Pauses reading history",
"downloaded_only": "Downloaded only",
"downloaded_only_description": "Only show downloaded entries in your library",
"download_queue": "Download Queue",
"categories": "Categories",
"statistics": "Statistics",
@ -141,10 +143,14 @@
"nsfw_sources_info": "This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app",
"version": "Version",
"check_for_update": "Check for update",
"share_app_logs": "Share app logs",
"no_app_logs": "No log.txt available!",
"failed": "Failed!",
"n_days_ago": "{days} days ago",
"today": "Today",
"yesterday": "Yesterday",
"a_week_ago": "A week ago",
"next_week": "Next week",
"add_to_library": "Add to library",
"completed": "Completed",
"ongoing": "Ongoing",
@ -225,6 +231,10 @@
"sync_finished": "Sync finished",
"sync_failed": "Sync failed",
"sync_button_sync": "Sync progress",
"sync_button_upload": "Upload only",
"sync_button_upload_info": "This operation will fully replace the remote data with local data!",
"sync_button_download": "Download only",
"sync_button_download_info": "This operation will fully replace the local data with remote data!",
"sync_on": "Enable sync",
"sync_auto": "Auto Sync",
"sync_auto_warning": "Auto Sync is currently an experimental feature!",
@ -251,6 +261,7 @@
"anime_extensions": "Anime Extensions",
"manga_extensions": "Manga Extensions",
"novel_extensions": "Novel Extensions",
"extension_settings": "Extension settings",
"anime": "Anime",
"manga": "Manga",
"novel": "Novel",
@ -335,6 +346,7 @@
"installed": "Installed",
"auto_scroll": "Auto scroll",
"video_audio": "Audio",
"video_audio_info": "Preferred languages, pitch correction, audio channels",
"player": "Player",
"markEpisodeAsSeenSetting": "At what point to mark the episode as seen",
"default_skip_intro_length": "Default Skip intro length",
@ -406,6 +418,7 @@
"torrent_url": "Torrent url",
"or": "OR",
"advanced": "Advanced",
"advanced_info": "mpv config",
"use_native_http_client": "Use native http client",
"use_native_http_client_info": "it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling",
"n_hour_ago": "{hour} hour ago",
@ -426,9 +439,19 @@
"include_sensitive_settings": "Include sensitive settings (e.g., tracker login tokens)",
"create": "Create",
"downloads_are_limited_to_wifi": "Downloads are limited to Wi-Fi only",
"recommendations": "Recommendations",
"recommendations_similar": "similar",
"recommendations_weights": "Recommendation Weights",
"recommendations_weights_genre": "Genre Similarity",
"recommendations_weights_setting": "Setting Similarity",
"recommendations_weights_synopsis": "Story Similarity",
"recommendations_weights_theme": "Theme Similarity",
"manga_extensions_repo": "Manga extensions repo",
"anime_extensions_repo": "Anime extensions repo",
"novel_extensions_repo": "Novel extensions repo",
"custom_dns": "Custom DNS (leave blank to use system DNS)",
"android_proxy_server": "Android Proxy Server (ApkBridge)",
"get_apk_bridge": "Get ApkBridge",
"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",
@ -449,6 +472,7 @@
"genre_search_source": "Browse in source",
"source_not_added": "Source is not installed!",
"load_own_subtitles": "Load your own subtitles...",
"search_subtitles": "Search subtitles online...",
"extension_notes": "Notes: {notes}",
"unsupported_repo": "You've tried to add an unsupported repository. Please check the discord server for support!",
"end_of_chapter": "End of chapter",
@ -458,6 +482,9 @@
"you_have_finished_reading": "You have finished reading",
"return_to_the_list_of_chapters": "Return to the list of chapters",
"hwdec": "Hardware Decoder",
"enable_hardware_accel": "Hardware Acceleration",
"enable_hardware_accel_info": "Turn it on/off if you are experiencing bugs or crashes",
"track_library_navigate": "Go to existing local entry",
"track_library_add": "Add to local library",
"track_library_add_confirm": "Add tracked item to local library",
"track_library_not_logged": "Login to the corresponding tracker to use this feature!",
@ -471,5 +498,53 @@
"rpc_show_cover_image": "Show current cover image in Discord",
"sync_enable_histories": "Sync history data",
"sync_enable_updates": "Sync update data",
"sync_enable_settings": "Sync settings"
"sync_enable_settings": "Sync settings",
"enable_mpv": "Enable mpv shaders / scripts",
"mpv_info": "Supports .js scripts under mpv/scripts/",
"mpv_redownload": "Redownload mpv config files",
"mpv_redownload_info": "Replaces old config files with new one!",
"mpv_download": "MPV config files are required!\nDownload now?",
"custom_buttons": "Custom buttons",
"custom_buttons_info": "Execute lua code with custom buttons",
"custom_buttons_edit": "Edit custom buttons",
"custom_buttons_add": "Add custom button",
"custom_buttons_added": "Custom button added!",
"custom_buttons_delete": "Delete custom button",
"custom_buttons_text": "Button text",
"custom_buttons_text_req": "Button text required",
"custom_buttons_js_code": "lua code",
"custom_buttons_js_code_req": "lua code required",
"custom_buttons_js_code_long": "lua code (on long press)",
"custom_buttons_startup": "lua code (on startup)",
"n_days": "{n} days",
"decoder": "Decoder",
"decoder_info": "Hardware decoding, pixel format, debanding",
"enable_gpu_next": "Enable gpu-next (Android only)",
"enable_gpu_next_info": "A new video rendering backend",
"debanding": "Debanding",
"use_yuv420p": "Use YUV420P pixel format",
"use_yuv420p_info": "May fix black screens on some video codecs, can also improve performance at the cost of quality",
"audio_preferred_languages": "Preferred langauages",
"audio_preferred_languages_info": "Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.",
"enable_audio_pitch_correction": "Enable audio pitch correction",
"enable_audio_pitch_correction_info": "Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds",
"audio_channels": "Audio channels",
"volume_boost_cap": "Volume boost cap",
"internal_player": "Internal player",
"internal_player_info": "Progress, controls, orientation",
"subtitle_delay_text": "Subtitle delay",
"subtitle_delay": "Delay (ms)",
"subtitle_speed": "Speed",
"calendar": "Calendar",
"calendar_no_data": "No data yet.",
"calendar_info": "The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!",
"in_n_day": "in {days} day",
"in_n_days": "in {days} days",
"clear_library": "Clear library",
"clear_library_desc": "Choose to clear all manga, anime and/or novel entries",
"clear_library_input": "Type 'manga', 'anime' and/or 'novel' (separated by a comma) to remove all related entries",
"watch_order": "Watch order",
"sequels": "Sequels",
"recommendations": "Recommendations",
"recommendations_similarity": "Similarity:"
}

279
lib/l10n/app_hi.arb Normal file
View file

@ -0,0 +1,279 @@
{
"@@locale": "hi",
"library": "पुस्तकालय",
"updates": "अपडेट",
"history": "इतिहास",
"browse": "ब्राउज़",
"more": "और",
"open_random_entry": "कोई भी प्रविष्टि खोलें",
"import": "आयात",
"filter": "फ़िल्टर",
"downloaded": "डाउनलोड किया गया",
"unread": "अपठित",
"started": "शुरू किया",
"bookmarked": "बुकमार्क किया",
"sort": "छाँटें",
"alphabetically": "वर्णानुक्रम",
"last_read": "आखिरी बार पढ़ा",
"last_update_check": "आखिरी अपडेट जांच",
"unread_count": "अपठित गिनती",
"latest_chapter": "नवीनतम अध्याय",
"date_added": "जोड़ा गया तारीख",
"display": "प्रदर्शन",
"display_mode": "प्रदर्शन मोड",
"compact_grid": "संक्षिप्त ग्रिड",
"comfortable_grid": "आरामदायक ग्रिड",
"cover_only_grid": "केवल कवर ग्रिड",
"list": "सूची",
"badges": "बैज",
"downloaded_chapters": "डाउनलोड किए गए अध्याय",
"language": "भाषा",
"local_source": "स्थानीय स्रोत",
"tabs": "टैब",
"show_category_tabs": "श्रेणी टैब दिखाएँ",
"show_numbers_of_items": "आइटम की संख्या दिखाएँ",
"other": "अन्य",
"show_continue_reading_buttons": "पढ़ना जारी रखें बटन दिखाएँ",
"empty_library": "खाली पुस्तकालय",
"search": "खोजें...",
"no_recent_updates": "कोई हालिया अपडेट नहीं",
"remove_everything": "सब कुछ हटाएँ",
"remove_everything_msg": "क्या आप निश्चित हैं? सारा इतिहास खो जाएगा",
"ok": "ठीक है",
"cancel": "रद्द करें",
"remove": "हटाएँ",
"remove_history_msg": "यह इस अध्याय की पढ़ने की तारीख को हटा देगा। क्या आप निश्चित हैं?",
"last_used": "आखिरी बार उपयोग",
"pinned": "पिन किया गया",
"sources": "स्रोत",
"install": "स्थापित करें",
"update": "अपडेट करें",
"latest": "नवीनतम",
"extensions": "एक्सटेंशन",
"migrate": "स्थानांतरण",
"incognito_mode": "गुप्त मोड",
"incognito_mode_description": "पढ़ने का इतिहास रोकता है",
"download_queue": "डाउनलोड कतार",
"categories": "श्रेणियाँ",
"settings": "सेटिंग्स",
"about": "के बारे में",
"help": "मदद",
"no_downloads": "कोई डाउनलोड नहीं",
"edit_categories": "श्रेणियाँ संपादित करें",
"edit_categories_description": "आपके पास कोई श्रेणी नहीं है। अपनी लाइब्रेरी को व्यवस्थित करने के लिए प्लस बटन दबाएँ",
"add": "जोड़ें",
"add_category": "श्रेणी जोड़ें",
"name": "नाम",
"category_name_required": "*आवश्यक",
"add_category_error_exist": "इस नाम की श्रेणी पहले से मौजूद है!",
"delete_category": "श्रेणी हटाएँ",
"delete_category_msg": "क्या आप श्रेणी {name} को हटाना चाहते हैं?",
"rename_category": "श्रेणी का नाम बदलें",
"general": "सामान्य",
"general_subtitle": "ऐप की भाषा",
"app_language": "ऐप की भाषा",
"appearance": "दिखावट",
"appearance_subtitle": "थीम, तारीख और समय प्रारूप",
"theme": "थीम",
"dark_mode": "डार्क मोड",
"on": "चालू",
"off": "बंद",
"pure_black_dark_mode": "पूर्ण काला डार्क मोड",
"timestamp": "समय चिह्न",
"relative_timestamp": "सापेक्ष समय चिह्न",
"relative_timestamp_short": "संक्षिप्त (आज, कल)",
"relative_timestamp_long": "लंबा (संक्षिप्त+, n दिन पहले)",
"date_format": "तारीख प्रारूप",
"reader": "पढ़ने वाला",
"refresh": "ताज़ा करें",
"reader_subtitle": "पढ़ने का मोड, प्रदर्शन, नेविगेशन",
"default_reading_mode": "डिफ़ॉल्ट पढ़ने का मोड",
"reading_mode_vertical": "लंबवत",
"reading_mode_horizontal": "क्षैतिज",
"reading_mode_left_to_right": "बाएँ से दाएँ",
"reading_mode_right_to_left": "दाएँ से बाएँ",
"reading_mode_vertical_continuous": "लंबवत निरंतर",
"reading_mode_webtoon": "वेबटून",
"double_tap_animation_speed": "डबल टैप एनिमेशन गति",
"normal": "सामान्य",
"fast": "तेज़",
"no_animation": "कोई एनिमेशन नहीं",
"animate_page_transitions": "पेज ट्रांज़िशन को एनिमेट करें",
"crop_borders": "किनारों को काटें",
"downloads": "डाउनलोड",
"downloads_subtitle": "डाउनलोड सेटिंग्स",
"download_location": "डाउनलोड स्थान",
"custom_location": "कस्टम स्थान",
"only_on_wifi": "केवल वाईफाई पर",
"save_as_cbz_archive": "सीबीजेड आर्काइव के रूप में सहेजें",
"browse_subtitle": "स्रोत, वैश्विक खोज",
"only_include_pinned_sources": "केवल पिन किए गए स्रोत शामिल करें",
"nsfw_sources": "एनएसएफडब्ल्यू (+18) स्रोत",
"nsfw_sources_show": "स्रोत और एक्सटेंशन सूची में दिखाएँ",
"nsfw_sources_info": "यह अनौपचारिक या संभावित रूप से गलत तरीके से चिह्नित एक्सटेंशन को ऐप के भीतर एनएसएफडब्ल्यू (18+) सामग्री को सामने लाने से नहीं रोकता",
"version": "संस्करण",
"check_for_update": "अपडेट के लिए जांचें",
"n_days_ago": "{days} दिन पहले",
"today": "आज",
"yesterday": "कल",
"a_week_ago": "एक सप्ताह पहले",
"add_to_library": "पुस्तकालय में जोड़ें",
"completed": "पूरा हुआ",
"ongoing": "चल रहा है",
"on_hiatus": "विराम पर",
"canceled": "रद्द",
"publishing_finished": "प्रकाशन समाप्त",
"unknown": "अज्ञात",
"set_categories": "श्रेणियाँ सेट करें",
"edit": "संपादित करें",
"in_library": "पुस्तकालय में",
"filter_scanlator_groups": "स्कैनलेटर समूहों को फ़िल्टर करें",
"reset": "रीसेट",
"by_source": "स्रोत के अनुसार",
"by_chapter_number": "अध्याय संख्या के अनुसार",
"by_upload_date": "अपलोड तारीख के अनुसार",
"source_title": "स्रोत शीर्षक",
"chapter_number": "अध्याय संख्या",
"share": "साझा करें",
"n_chapters": "{number} अध्याय",
"no_description": "कोई विवरण नहीं",
"resume": "जारी रखें",
"read": "पढ़ें",
"popular": "लोकप्रिय",
"open_in_browser": "ब्राउज़र में खोलें",
"clear_cookie": "कुकी साफ़ करें",
"show_page_number": "पेज नंबर दिखाएँ",
"from_library": "पुस्तकालय से",
"downloaded_chapter": "डाउनलोड किया गया अध्याय",
"page": "पेज {page}",
"global_search": "वैश्विक खोज",
"color_blend_level": "रंग मिश्रण स्तर",
"current": "वर्तमान {char}",
"finished": "समाप्त {char}",
"next": "अगला {char}",
"previous": "पिछला {char}",
"no_more_chapter": "कोई और अध्याय नहीं है",
"no_result": "कोई परिणाम नहीं",
"send": "भेजें",
"delete": "हटाएँ",
"start_downloading": "अब डाउनलोड शुरू करें",
"retry": "पुनः प्रयास करें",
"add_chapters": "अध्याय जोड़ें",
"delete_chapters": "अध्याय हटाएँ?",
"default0": "डिफ़ॉल्ट",
"total_chapters": "कुल अध्याय",
"import_local_file": "स्थानीय फ़ाइल आयात करें",
"import_files": "फ़ाइलें",
"nothing_read_recently": "हाल ही में कुछ भी नहीं पढ़ा",
"status": "स्थिति",
"not_started": "शुरू नहीं हुआ",
"score": "स्कोर",
"start_date": "शुरू की तारीख",
"finish_date": "समाप्ति की तारीख",
"reading": "पढ़ रहा है",
"on_hold": "रोक पर",
"dropped": "छोड़ दिया",
"plan_to_read": "पढ़ने की योजना",
"re_reading": "पुनः पढ़ रहा है",
"chapters": "अध्याय",
"add_tracker": "ट्रैकर जोड़ें",
"one_tracker": "1 ट्रैकर",
"n_tracker": "{n} ट्रैकर",
"tracking": "ट्रैकिंग",
"description": "विवरण",
"episode_progress": "प्रगति: {n}",
"n_episodes": "{n} एपिसोड",
"manga_sources": "मंगा स्रोत",
"anime_sources": "एनीमे स्रोत",
"anime_extensions": "एनीमे एक्सटेंशन",
"manga_extensions": "मंगा एक्सटेंशन",
"anime": "एनीमे",
"manga": "मंगा",
"library_no_category_exist": "आपके पास अभी कोई श्रेणी नहीं है",
"watching": "देख रहा है",
"plan_to_watch": "देखने की योजना",
"re_watching": "पुनः देख रहा है",
"episodes": "एपिसोड",
"download": "डाउनलोड",
"new_update_available": "नया अपडेट उपलब्ध",
"app_version": "ऐप संस्करण: v{v}",
"searching_for_updates": "अपडेट की खोज हो रही है...",
"no_new_updates_available": "कोई नया अपडेट उपलब्ध नहीं",
"uninstall": "हटाएँ",
"uninstall_extension": "{ext} एक्सटेंशन हटाएँ?",
"langauage": "भाषा",
"extension_detail": "एक्सटेंशन विवरण",
"scale_type": "स्केल प्रकार",
"scale_type_fit_screen": "स्क्रीन पर फिट",
"scale_type_stretch": "खींचें",
"scale_type_fit_width": "चौड़ाई पर फिट",
"scale_type_fit_height": "ऊँचाई पर फिट",
"scale_type_original_size": "मूल आकार",
"scale_type_smart_fit": "स्मार्ट फिट",
"page_preload_amount": "पेज प्रीलोड मात्रा",
"page_preload_amount_subtitle": "पढ़ते समय प्रीलोड करने वाले पेजों की मात्रा। उच्च मानों से पढ़ने का अनुभव बेहतर होगा, लेकिन कैश और नेटवर्क उपयोग अधिक होगा।",
"image_loading_error": "यह छवि लोड नहीं हो सकी",
"add_episodes": "एपिसोड जोड़ें",
"video_quality": "गुणवत्ता",
"video_subtitle": "उपशीर्षक",
"check_for_extension_updates": "एक्सटेंशन अपडेट की जाँच करें",
"auto_extensions_updates": "स्वचालित एक्सटेंशन अपडेट",
"auto_extensions_updates_subtitle": "जब नया संस्करण उपलब्ध होगा तो एक्सटेंशन स्वचालित रूप से अपडेट हो जाएगा।",
"reading_mode": "पढ़ने का मोड",
"custom_filter": "कस्टम फ़िल्टर",
"background_color": "पृष्ठभूमि रंग",
"white": "सफेद",
"black": "काला",
"grey": "ग्रे",
"automaic": "स्वचालित",
"preferred_domain": "पसंदीदा डोमेन",
"load_more": "और लोड करें",
"cancel_all_for_this_series": "इस सीरीज़ के लिए सभी रद्द करें",
"login": "लॉगिन",
"login_into": "{tracker} में लॉगिन करें",
"email_adress": "ईमेल पता",
"password": "पासवर्ड",
"log_out_from": "{tracker} से लॉग आउट करें?",
"log_out": "लॉग आउट",
"update_pending": "अपडेट लंबित",
"update_all": "सभी अपडेट करें",
"backup_and_restore": "बैकअप और पुनर्स्थापना",
"create_backup": "बैकअप बनाएँ",
"create_backup_dialog_title": "आप क्या बैकअप करना चाहते हैं?",
"create_backup_subtitle": "वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है",
"restore_backup": "बैकअप पुनर्स्थापित करें",
"restore_backup_subtitle": "बैकअप फ़ाइल से पुस्तकालय पुनर्स्थापित करें",
"automatic_backups": "स्वचालित बैकअप",
"backup_frequency": "बैकअप आवृत्ति",
"backup_location": "बैकअप स्थान",
"backup_options": "बैकअप विकल्प",
"backup_options_dialog_title": "आप क्या बैकअप करना चाहते हैं?",
"backup_options_subtitle": "बैकअप फ़ाइल में क्या जानकारी शामिल करनी है",
"backup_and_restore_warning_info": "आपको बैकअप की प्रतियां अन्य स्थानों पर भी रखनी चाहिए",
"library_entries": "पुस्तकालय प्रविष्टियाँ",
"chapters_and_episode": "अध्याय और एपिसोड",
"every_6_hours": "हर 6 घंटे",
"every_12_hours": "हर 12 घंटे",
"daily": "दैनिक",
"every_2_days": "हर 2 दिन",
"weekly": "साप्ताहिक",
"restore_backup_warning_title": "बैकअप पुनर्स्थापित करने से सभी मौजूदा डेटा अधिलेखित हो जाएगा।\n\nपुनर्स्थापना जारी रखें?",
"services": "सेवाएँ",
"tracking_warning_info": "ट्रैकिंग सेवाओं में अध्याय प्रगति को अपडेट करने के लिए एकतरफा समन्वय। व्यक्तिगत प्रविष्टियों के लिए ट्रैकिंग सेट करें।",
"use_page_tap_zones": "पेज टैप ज़ोन का उपयोग करें",
"manage_trackers": "ट्रैकर्स प्रबंधित करें",
"restore": "पुनर्स्थापित करें",
"backups": "बैकअप",
"by_scanlator": "स्कैनलेटर के अनुसार",
"by_name": "नाम के अनुसार",
"installed": "स्थापित",
"auto_scroll": "स्वचालित स्क्रॉल",
"video_audio": "ऑडियो",
"player": "प्लेयर",
"markEpisodeAsSeenSetting": "एपिसोड को कब देखा गया के रूप में चिह्नित करना है",
"default_skip_intro_length": "डिफ़ॉल्ट परिचय छोड़ने की अवधि",
"default_playback_speed_length": "डिफ़ॉल्ट प्लेबैक गति अवधि",
"updateProgressAfterReading": "पढ़ने के बाद प्रगति अपडेट करें",
"no_sources_installed": "कोई स्रोत स्थापित नहीं है!",
"show_extensions": "एक्सटेंशन दिखाएँ"
}

View file

@ -6,10 +6,12 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
import 'app_localizations_ar.dart';
import 'app_localizations_as.dart';
import 'app_localizations_de.dart';
import 'app_localizations_en.dart';
import 'app_localizations_es.dart';
import 'app_localizations_fr.dart';
import 'app_localizations_hi.dart';
import 'app_localizations_id.dart';
import 'app_localizations_it.dart';
import 'app_localizations_pt.dart';
@ -105,11 +107,13 @@ abstract class AppLocalizations {
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
Locale('ar'),
Locale('as'),
Locale('de'),
Locale('en'),
Locale('es'),
Locale('es', '419'),
Locale('fr'),
Locale('hi'),
Locale('id'),
Locale('it'),
Locale('pt'),
@ -533,6 +537,18 @@ abstract class AppLocalizations {
/// **'Pauses reading history'**
String get incognito_mode_description;
/// No description provided for @downloaded_only.
///
/// In en, this message translates to:
/// **'Downloaded only'**
String get downloaded_only;
/// No description provided for @downloaded_only_description.
///
/// In en, this message translates to:
/// **'Only show downloaded entries in your library'**
String get downloaded_only_description;
/// No description provided for @download_queue.
///
/// In en, this message translates to:
@ -917,6 +933,24 @@ abstract class AppLocalizations {
/// **'Check for update'**
String get check_for_update;
/// No description provided for @share_app_logs.
///
/// In en, this message translates to:
/// **'Share app logs'**
String get share_app_logs;
/// No description provided for @no_app_logs.
///
/// In en, this message translates to:
/// **'No log.txt available!'**
String get no_app_logs;
/// No description provided for @failed.
///
/// In en, this message translates to:
/// **'Failed!'**
String get failed;
/// No description provided for @n_days_ago.
///
/// In en, this message translates to:
@ -941,6 +975,12 @@ abstract class AppLocalizations {
/// **'A week ago'**
String get a_week_ago;
/// No description provided for @next_week.
///
/// In en, this message translates to:
/// **'Next week'**
String get next_week;
/// No description provided for @add_to_library.
///
/// In en, this message translates to:
@ -1421,6 +1461,30 @@ abstract class AppLocalizations {
/// **'Sync progress'**
String get sync_button_sync;
/// No description provided for @sync_button_upload.
///
/// In en, this message translates to:
/// **'Upload only'**
String get sync_button_upload;
/// No description provided for @sync_button_upload_info.
///
/// In en, this message translates to:
/// **'This operation will fully replace the remote data with local data!'**
String get sync_button_upload_info;
/// No description provided for @sync_button_download.
///
/// In en, this message translates to:
/// **'Download only'**
String get sync_button_download;
/// No description provided for @sync_button_download_info.
///
/// In en, this message translates to:
/// **'This operation will fully replace the local data with remote data!'**
String get sync_button_download_info;
/// No description provided for @sync_on.
///
/// In en, this message translates to:
@ -1577,6 +1641,12 @@ abstract class AppLocalizations {
/// **'Novel Extensions'**
String get novel_extensions;
/// No description provided for @extension_settings.
///
/// In en, this message translates to:
/// **'Extension settings'**
String get extension_settings;
/// No description provided for @anime.
///
/// In en, this message translates to:
@ -2081,6 +2151,12 @@ abstract class AppLocalizations {
/// **'Audio'**
String get video_audio;
/// No description provided for @video_audio_info.
///
/// In en, this message translates to:
/// **'Preferred languages, pitch correction, audio channels'**
String get video_audio_info;
/// No description provided for @player.
///
/// In en, this message translates to:
@ -2507,6 +2583,12 @@ abstract class AppLocalizations {
/// **'Advanced'**
String get advanced;
/// No description provided for @advanced_info.
///
/// In en, this message translates to:
/// **'mpv config'**
String get advanced_info;
/// No description provided for @use_native_http_client.
///
/// In en, this message translates to:
@ -2627,6 +2709,48 @@ abstract class AppLocalizations {
/// **'Downloads are limited to Wi-Fi only'**
String get downloads_are_limited_to_wifi;
/// No description provided for @recommendations.
///
/// In en, this message translates to:
/// **'Recommendations'**
String get recommendations;
/// No description provided for @recommendations_similar.
///
/// In en, this message translates to:
/// **'similar'**
String get recommendations_similar;
/// No description provided for @recommendations_weights.
///
/// In en, this message translates to:
/// **'Recommendation Weights'**
String get recommendations_weights;
/// No description provided for @recommendations_weights_genre.
///
/// In en, this message translates to:
/// **'Genre Similarity'**
String get recommendations_weights_genre;
/// No description provided for @recommendations_weights_setting.
///
/// In en, this message translates to:
/// **'Setting Similarity'**
String get recommendations_weights_setting;
/// No description provided for @recommendations_weights_synopsis.
///
/// In en, this message translates to:
/// **'Story Similarity'**
String get recommendations_weights_synopsis;
/// No description provided for @recommendations_weights_theme.
///
/// In en, this message translates to:
/// **'Theme Similarity'**
String get recommendations_weights_theme;
/// No description provided for @manga_extensions_repo.
///
/// In en, this message translates to:
@ -2645,6 +2769,24 @@ abstract class AppLocalizations {
/// **'Novel extensions repo'**
String get novel_extensions_repo;
/// No description provided for @custom_dns.
///
/// In en, this message translates to:
/// **'Custom DNS (leave blank to use system DNS)'**
String get custom_dns;
/// No description provided for @android_proxy_server.
///
/// In en, this message translates to:
/// **'Android Proxy Server (ApkBridge)'**
String get android_proxy_server;
/// No description provided for @get_apk_bridge.
///
/// In en, this message translates to:
/// **'Get ApkBridge'**
String get get_apk_bridge;
/// No description provided for @undefined.
///
/// In en, this message translates to:
@ -2765,6 +2907,12 @@ abstract class AppLocalizations {
/// **'Load your own subtitles...'**
String get load_own_subtitles;
/// No description provided for @search_subtitles.
///
/// In en, this message translates to:
/// **'Search subtitles online...'**
String get search_subtitles;
/// No description provided for @extension_notes.
///
/// In en, this message translates to:
@ -2819,6 +2967,24 @@ abstract class AppLocalizations {
/// **'Hardware Decoder'**
String get hwdec;
/// No description provided for @enable_hardware_accel.
///
/// In en, this message translates to:
/// **'Hardware Acceleration'**
String get enable_hardware_accel;
/// No description provided for @enable_hardware_accel_info.
///
/// In en, this message translates to:
/// **'Turn it on/off if you are experiencing bugs or crashes'**
String get enable_hardware_accel_info;
/// No description provided for @track_library_navigate.
///
/// In en, this message translates to:
/// **'Go to existing local entry'**
String get track_library_navigate;
/// No description provided for @track_library_add.
///
/// In en, this message translates to:
@ -2902,6 +3068,288 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Sync settings'**
String get sync_enable_settings;
/// No description provided for @enable_mpv.
///
/// In en, this message translates to:
/// **'Enable mpv shaders / scripts'**
String get enable_mpv;
/// No description provided for @mpv_info.
///
/// In en, this message translates to:
/// **'Supports .js scripts under mpv/scripts/'**
String get mpv_info;
/// No description provided for @mpv_redownload.
///
/// In en, this message translates to:
/// **'Redownload mpv config files'**
String get mpv_redownload;
/// No description provided for @mpv_redownload_info.
///
/// In en, this message translates to:
/// **'Replaces old config files with new one!'**
String get mpv_redownload_info;
/// No description provided for @mpv_download.
///
/// In en, this message translates to:
/// **'MPV config files are required!\nDownload now?'**
String get mpv_download;
/// No description provided for @custom_buttons.
///
/// In en, this message translates to:
/// **'Custom buttons'**
String get custom_buttons;
/// No description provided for @custom_buttons_info.
///
/// In en, this message translates to:
/// **'Execute lua code with custom buttons'**
String get custom_buttons_info;
/// No description provided for @custom_buttons_edit.
///
/// In en, this message translates to:
/// **'Edit custom buttons'**
String get custom_buttons_edit;
/// No description provided for @custom_buttons_add.
///
/// In en, this message translates to:
/// **'Add custom button'**
String get custom_buttons_add;
/// No description provided for @custom_buttons_added.
///
/// In en, this message translates to:
/// **'Custom button added!'**
String get custom_buttons_added;
/// No description provided for @custom_buttons_delete.
///
/// In en, this message translates to:
/// **'Delete custom button'**
String get custom_buttons_delete;
/// No description provided for @custom_buttons_text.
///
/// In en, this message translates to:
/// **'Button text'**
String get custom_buttons_text;
/// No description provided for @custom_buttons_text_req.
///
/// In en, this message translates to:
/// **'Button text required'**
String get custom_buttons_text_req;
/// No description provided for @custom_buttons_js_code.
///
/// In en, this message translates to:
/// **'lua code'**
String get custom_buttons_js_code;
/// No description provided for @custom_buttons_js_code_req.
///
/// In en, this message translates to:
/// **'lua code required'**
String get custom_buttons_js_code_req;
/// No description provided for @custom_buttons_js_code_long.
///
/// In en, this message translates to:
/// **'lua code (on long press)'**
String get custom_buttons_js_code_long;
/// No description provided for @custom_buttons_startup.
///
/// In en, this message translates to:
/// **'lua code (on startup)'**
String get custom_buttons_startup;
/// No description provided for @n_days.
///
/// In en, this message translates to:
/// **'{n} days'**
String n_days(Object n);
/// No description provided for @decoder.
///
/// In en, this message translates to:
/// **'Decoder'**
String get decoder;
/// No description provided for @decoder_info.
///
/// In en, this message translates to:
/// **'Hardware decoding, pixel format, debanding'**
String get decoder_info;
/// No description provided for @enable_gpu_next.
///
/// In en, this message translates to:
/// **'Enable gpu-next (Android only)'**
String get enable_gpu_next;
/// No description provided for @enable_gpu_next_info.
///
/// In en, this message translates to:
/// **'A new video rendering backend'**
String get enable_gpu_next_info;
/// No description provided for @debanding.
///
/// In en, this message translates to:
/// **'Debanding'**
String get debanding;
/// No description provided for @use_yuv420p.
///
/// In en, this message translates to:
/// **'Use YUV420P pixel format'**
String get use_yuv420p;
/// No description provided for @use_yuv420p_info.
///
/// In en, this message translates to:
/// **'May fix black screens on some video codecs, can also improve performance at the cost of quality'**
String get use_yuv420p_info;
/// No description provided for @audio_preferred_languages.
///
/// In en, this message translates to:
/// **'Preferred langauages'**
String get audio_preferred_languages;
/// No description provided for @audio_preferred_languages_info.
///
/// In en, this message translates to:
/// **'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'**
String get audio_preferred_languages_info;
/// No description provided for @enable_audio_pitch_correction.
///
/// In en, this message translates to:
/// **'Enable audio pitch correction'**
String get enable_audio_pitch_correction;
/// No description provided for @enable_audio_pitch_correction_info.
///
/// In en, this message translates to:
/// **'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'**
String get enable_audio_pitch_correction_info;
/// No description provided for @audio_channels.
///
/// In en, this message translates to:
/// **'Audio channels'**
String get audio_channels;
/// No description provided for @volume_boost_cap.
///
/// In en, this message translates to:
/// **'Volume boost cap'**
String get volume_boost_cap;
/// No description provided for @internal_player.
///
/// In en, this message translates to:
/// **'Internal player'**
String get internal_player;
/// No description provided for @internal_player_info.
///
/// In en, this message translates to:
/// **'Progress, controls, orientation'**
String get internal_player_info;
/// No description provided for @subtitle_delay_text.
///
/// In en, this message translates to:
/// **'Subtitle delay'**
String get subtitle_delay_text;
/// No description provided for @subtitle_delay.
///
/// In en, this message translates to:
/// **'Delay (ms)'**
String get subtitle_delay;
/// No description provided for @subtitle_speed.
///
/// In en, this message translates to:
/// **'Speed'**
String get subtitle_speed;
/// No description provided for @calendar.
///
/// In en, this message translates to:
/// **'Calendar'**
String get calendar;
/// No description provided for @calendar_no_data.
///
/// In en, this message translates to:
/// **'No data yet.'**
String get calendar_no_data;
/// No description provided for @calendar_info.
///
/// In en, this message translates to:
/// **'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!'**
String get calendar_info;
/// No description provided for @in_n_day.
///
/// In en, this message translates to:
/// **'in {days} day'**
String in_n_day(Object days);
/// No description provided for @in_n_days.
///
/// In en, this message translates to:
/// **'in {days} days'**
String in_n_days(Object days);
/// No description provided for @clear_library.
///
/// In en, this message translates to:
/// **'Clear library'**
String get clear_library;
/// No description provided for @clear_library_desc.
///
/// In en, this message translates to:
/// **'Choose to clear all manga, anime and/or novel entries'**
String get clear_library_desc;
/// No description provided for @clear_library_input.
///
/// In en, this message translates to:
/// **'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'**
String get clear_library_input;
/// No description provided for @watch_order.
///
/// In en, this message translates to:
/// **'Watch order'**
String get watch_order;
/// No description provided for @sequels.
///
/// In en, this message translates to:
/// **'Sequels'**
String get sequels;
/// No description provided for @recommendations_similarity.
///
/// In en, this message translates to:
/// **'Similarity:'**
String get recommendations_similarity;
}
class _AppLocalizationsDelegate
@ -2916,10 +3364,12 @@ class _AppLocalizationsDelegate
@override
bool isSupported(Locale locale) => <String>[
'ar',
'as',
'de',
'en',
'es',
'fr',
'hi',
'id',
'it',
'pt',
@ -2958,6 +3408,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
switch (locale.languageCode) {
case 'ar':
return AppLocalizationsAr();
case 'as':
return AppLocalizationsAs();
case 'de':
return AppLocalizationsDe();
case 'en':
@ -2966,6 +3418,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
return AppLocalizationsEs();
case 'fr':
return AppLocalizationsFr();
case 'hi':
return AppLocalizationsHi();
case 'id':
return AppLocalizationsId();
case 'it':

View file

@ -231,6 +231,13 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get incognito_mode_description => 'يوقف سجل القراءة';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'قائمة الانتظار للتحميل';
@ -427,6 +434,15 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get check_for_update => 'التحقق من التحديثات';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return 'منذ $days أيام';
@ -441,6 +457,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get a_week_ago => 'منذ أسبوع';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'إضافة إلى المكتبة';
@ -696,6 +715,20 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get sync_button_sync => 'مزامنة التقدم';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'تمكين المزامنة';
@ -780,6 +813,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get novel_extensions => 'إضافات الروايات';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'أنمي';
@ -1050,6 +1086,10 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get video_audio => 'الصوت';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'لاعب';
@ -1272,6 +1312,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get advanced => 'متقدم';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'استخدام عميل HTTP الأصلي';
@ -1348,6 +1391,27 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get downloads_are_limited_to_wifi => 'التنزيلات مقتصرة على Wi-Fi فقط';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'مستودع إضافات المانجا';
@ -1357,6 +1421,15 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get novel_extensions_repo => 'مستودع إضافات الروايات';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'غير محدد';
@ -1419,6 +1492,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get load_own_subtitles => 'تحميل الترجمة الخاصة بك...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1450,6 +1526,16 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1494,4 +1580,157 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

File diff suppressed because it is too large Load diff

View file

@ -233,6 +233,13 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get incognito_mode_description => 'Pausiert den Leseverlauf';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Download-Warteschlange';
@ -431,6 +438,15 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get check_for_update => 'Auf Aktualisierung prüfen';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return 'Vor $days Tagen';
@ -445,6 +461,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get a_week_ago => 'Vor einer Woche';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Zur Bibliothek hinzufügen';
@ -700,6 +719,20 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get sync_button_sync => 'Jetzt synchronisieren';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Sync aktivieren';
@ -785,6 +818,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get novel_extensions => 'Novel-Erweiterungen';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1055,6 +1091,10 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Player';
@ -1282,6 +1322,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get advanced => 'Erweitert';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Nativen HTTP-Client verwenden';
@ -1359,6 +1402,27 @@ class AppLocalizationsDe extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Downloads sind nur über WLAN verfügbar';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Manga-Erweiterungs-Repository';
@ -1368,6 +1432,15 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get novel_extensions_repo => 'Roman-Erweiterungs-Repository';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Nicht definiert';
@ -1430,6 +1503,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get load_own_subtitles => 'Deine eigene Untertiteln laden...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Hinweis: $notes';
@ -1462,6 +1538,16 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Zur lokalen Bibliothek hinzufügen';
@ -1507,4 +1593,157 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -232,6 +232,13 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get incognito_mode_description => 'Pauses reading history';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Download Queue';
@ -429,6 +436,15 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get check_for_update => 'Check for update';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days days ago';
@ -443,6 +459,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get a_week_ago => 'A week ago';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Add to library';
@ -698,6 +717,20 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get sync_button_sync => 'Sync progress';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Enable sync';
@ -783,6 +816,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get novel_extensions => 'Novel Extensions';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1049,6 +1085,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Player';
@ -1272,6 +1312,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get advanced => 'Advanced';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Use native http client';
@ -1349,6 +1392,27 @@ class AppLocalizationsEn extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Downloads are limited to Wi-Fi only';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Manga extensions repo';
@ -1358,6 +1422,15 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get novel_extensions_repo => 'Novel extensions repo';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'undefined';
@ -1420,6 +1493,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get load_own_subtitles => 'Load your own subtitles...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1451,6 +1527,16 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1495,4 +1581,157 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -235,6 +235,13 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get incognito_mode_description => 'Pausa el historial de lectura';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Cola de descarga';
@ -433,6 +440,15 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get check_for_update => 'Buscar actualizaciones';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return 'hace $days días';
@ -447,6 +463,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get a_week_ago => 'Hace una semana';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Agregar a la biblioteca';
@ -702,6 +721,20 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get sync_button_sync => 'Sincronizar progreso';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Habilitar sincronización';
@ -787,6 +820,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get novel_extensions => 'Extensiones de novelas';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1059,6 +1095,10 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Jugador';
@ -1286,6 +1326,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get advanced => 'Avanzado';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Utilizar cliente HTTP nativo';
@ -1363,6 +1406,27 @@ class AppLocalizationsEs extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Las descargas están limitadas solo a Wi-Fi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Repositorio de extensiones de manga';
@ -1372,6 +1436,15 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get novel_extensions_repo => 'Repositorio de extensiones de novelas';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Indefinido';
@ -1437,6 +1510,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get load_own_subtitles => 'Cargar tus propios subtítulos...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1468,6 +1544,16 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1512,6 +1598,159 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}
/// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`).

View file

@ -235,6 +235,13 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get incognito_mode_description => 'Suspend l\'historique de lecture';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'File de téléchargement';
@ -435,6 +442,15 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get check_for_update => 'Rechercher des mises à jour';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return 'Il y a $days jours';
@ -449,6 +465,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get a_week_ago => 'Il y a une semaine';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Ajouter à la bibliothèque';
@ -705,6 +724,20 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get sync_button_sync => 'Synchroniser les progrès';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Activer la synchronisation';
@ -790,6 +823,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get novel_extensions => 'Extensions de romans';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Animé';
@ -1061,6 +1097,10 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Lecteur';
@ -1288,6 +1328,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get advanced => 'Avancé';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Utiliser le client HTTP natif';
@ -1366,6 +1409,27 @@ class AppLocalizationsFr extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Les téléchargements sont limités au Wi-Fi uniquement';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Dépôt d\'extensions de mangas';
@ -1375,6 +1439,15 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get novel_extensions_repo => 'Dépôt d\'extensions de romans';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Indéfini';
@ -1437,6 +1510,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get load_own_subtitles => 'Charger vos propres sous-titres...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1469,6 +1545,16 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1513,4 +1599,157 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

File diff suppressed because it is too large Load diff

View file

@ -235,6 +235,13 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get incognito_mode_description => 'Menghentikan catatan bacaan';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Antrian Unduhan';
@ -433,6 +440,15 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get check_for_update => 'Periksa Pembaruan';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days Hari yang Lalu';
@ -447,6 +463,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get a_week_ago => 'Seminggu yang Lalu';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Tambahkan ke Perpustakaan';
@ -702,6 +721,20 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get sync_button_sync => 'Sinkronkan progres';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Aktifkan sinkronisasi';
@ -787,6 +820,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get novel_extensions => 'Ekstensi Novel';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1055,6 +1091,10 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Pemain';
@ -1279,6 +1319,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get advanced => 'Lanjutan';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Gunakan klien http asli';
@ -1355,6 +1398,27 @@ class AppLocalizationsId extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Unduhan dibatasi hanya untuk Wi-Fi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Repositori ekstensi manga';
@ -1364,6 +1428,15 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get novel_extensions_repo => 'Repositori ekstensi novel';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Tidak terdefinisi';
@ -1426,6 +1499,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get load_own_subtitles => 'Muat subtitle Anda sendiri...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1457,6 +1533,16 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1501,4 +1587,157 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -235,6 +235,13 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get incognito_mode_description => 'Sospende la cronologia di lettura';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Coda di download';
@ -433,6 +440,15 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get check_for_update => 'Controlla aggiornamenti';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days giorni fa';
@ -447,6 +463,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get a_week_ago => 'Una settimana fa';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Aggiungi alla biblioteca';
@ -702,6 +721,20 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get sync_button_sync => 'Sincronizza progressi';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Abilita sincronizzazione';
@ -787,6 +820,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get novel_extensions => 'Estensioni romanzo';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1058,6 +1094,10 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get video_audio => 'Audio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Giocatore';
@ -1286,6 +1326,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get advanced => 'Avanzate';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Usa il client HTTP nativo';
@ -1363,6 +1406,27 @@ class AppLocalizationsIt extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'I download sono limitati solo al Wi-Fi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Repository delle estensioni manga';
@ -1372,6 +1436,15 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get novel_extensions_repo => 'Repository delle estensioni romanzi';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Non definito';
@ -1435,6 +1508,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get load_own_subtitles => 'Carica i tuoi sottotitoli...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1466,6 +1542,16 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1510,4 +1596,157 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -235,6 +235,13 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get incognito_mode_description => 'Pausa o histórico de leitura';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Fila de download';
@ -433,6 +440,15 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get check_for_update => 'Verificar atualização';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days dias atrás';
@ -447,6 +463,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get a_week_ago => 'Uma semana atrás';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Adicionar à biblioteca';
@ -702,6 +721,20 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get sync_button_sync => 'Sincronizar progresso';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Ativar sincronização';
@ -787,6 +820,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get novel_extensions => 'Extensões de novels';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1057,6 +1093,10 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get video_audio => 'Áudio';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Jogador';
@ -1283,6 +1323,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get advanced => 'Avançado';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Usar cliente HTTP nativo';
@ -1360,6 +1403,27 @@ class AppLocalizationsPt extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Os downloads estão limitados apenas ao Wi-Fi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Repositório de extensões de mangás';
@ -1369,6 +1433,15 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get novel_extensions_repo => 'Repositório de extensões de romances';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Indefinido';
@ -1434,6 +1507,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get load_own_subtitles => 'Carregar suas próprias legendas...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1465,6 +1541,16 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1509,6 +1595,159 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}
/// The translations for Portuguese, as used in Brazil (`pt_BR`).

View file

@ -234,6 +234,13 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get incognito_mode_description => 'Пауза в истории чтения';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'Очередь загрузки';
@ -434,6 +441,15 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get check_for_update => 'Проверить обновления';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days дней назад';
@ -448,6 +464,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get a_week_ago => 'Неделю назад';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Добавить в библиотеку';
@ -704,6 +723,20 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get sync_button_sync => 'Синхронизировать прогресс';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Включить синхронизацию';
@ -789,6 +822,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get novel_extensions => 'Расширения для романов';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Аниме';
@ -1060,6 +1096,10 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get video_audio => 'Аудио';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Игрок';
@ -1286,6 +1326,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get advanced => 'Продвинутые';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Использовать нативный HTTP-клиент';
@ -1362,6 +1405,27 @@ class AppLocalizationsRu extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'Загрузки ограничены только Wi-Fi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Репозиторий расширений манги';
@ -1371,6 +1435,15 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get novel_extensions_repo => 'Репозиторий расширений новелл';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Не определено';
@ -1436,6 +1509,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get load_own_subtitles => 'Загрузить свои собственные субтитры...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1467,6 +1543,16 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1511,4 +1597,157 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -232,6 +232,13 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get incognito_mode_description => 'หยุดประวัติการอ่านชั่วคราว';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'คิวดาวน์โหลด';
@ -429,6 +436,15 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get check_for_update => 'ตรวจสอบการอัพเดท';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days วันที่แล้ว';
@ -443,6 +459,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get a_week_ago => 'สัปดาห์ที่แล้ว';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'เพิ่มไปที่ชั้นหนังสือ';
@ -698,6 +717,20 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get sync_button_sync => 'ซิงค์ความคืบหน้า';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'เปิดการซิงค์';
@ -782,6 +815,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get novel_extensions => 'ส่วนขยายของนวนิยาย';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'อนิเมะ';
@ -1049,6 +1085,10 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get video_audio => 'เสียง';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'ตัวเล่น';
@ -1273,6 +1313,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get advanced => 'ขั้นสูง';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'ใช้ไคลเอนต์ HTTP พื้นเมือง';
@ -1349,6 +1392,27 @@ class AppLocalizationsTh extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'การดาวน์โหลดจำกัดเฉพาะ Wi-Fi เท่านั้น';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'ที่เก็บส่วนขยายมังงะ';
@ -1358,6 +1422,15 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get novel_extensions_repo => 'ที่เก็บส่วนขยายโนเวล';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'ไม่ได้กำหนด';
@ -1420,6 +1493,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get load_own_subtitles => 'โหลดคำบรรยายของคุณเอง...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1451,6 +1527,16 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1495,4 +1581,157 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -232,6 +232,13 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get incognito_mode_description => 'Okuma geçmişini duraklatır';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => 'İndirme Kuyruğu';
@ -429,6 +436,15 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get check_for_update => 'Güncelleme Kontrol Et';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days gün önce';
@ -443,6 +459,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get a_week_ago => 'Bir Hafta Önce';
@override
String get next_week => 'Next week';
@override
String get add_to_library => 'Kütüphaneye Ekle';
@ -698,6 +717,20 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get sync_button_sync => 'İlerlemeyi senkronize et';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => 'Senkronizasyonu etkinleştir';
@ -783,6 +816,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get novel_extensions => 'Hikaye Uzantıları';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => 'Anime';
@ -1053,6 +1089,10 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get video_audio => 'Ses';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => 'Oyuncu';
@ -1278,6 +1318,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get advanced => 'Gelişmiş';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => 'Yerel http istemcisini kullan';
@ -1355,6 +1398,27 @@ class AppLocalizationsTr extends AppLocalizations {
String get downloads_are_limited_to_wifi =>
'İndirmeler yalnızca Wi-Fi ile sınırlıdır';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => 'Manga uzantıları deposu';
@ -1364,6 +1428,15 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get novel_extensions_repo => 'Roman uzantıları deposu';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => 'Tanımsız';
@ -1426,6 +1499,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get load_own_subtitles => 'Kendi altyazılarınızı yükleyin...';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1457,6 +1533,16 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1501,4 +1587,157 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -227,6 +227,13 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get incognito_mode_description => '暂停阅读历史';
@override
String get downloaded_only => 'Downloaded only';
@override
String get downloaded_only_description =>
'Only show downloaded entries in your library';
@override
String get download_queue => '下载队列';
@ -421,6 +428,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get check_for_update => '检查更新';
@override
String get share_app_logs => 'Share app logs';
@override
String get no_app_logs => 'No log.txt available!';
@override
String get failed => 'Failed!';
@override
String n_days_ago(Object days) {
return '$days天前';
@ -435,6 +451,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get a_week_ago => '一周前';
@override
String get next_week => 'Next week';
@override
String get add_to_library => '添加到图书馆';
@ -690,6 +709,20 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get sync_button_sync => '同步进度';
@override
String get sync_button_upload => 'Upload only';
@override
String get sync_button_upload_info =>
'This operation will fully replace the remote data with local data!';
@override
String get sync_button_download => 'Download only';
@override
String get sync_button_download_info =>
'This operation will fully replace the local data with remote data!';
@override
String get sync_on => '启用同步';
@ -772,6 +805,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get novel_extensions => '小说扩展';
@override
String get extension_settings => 'Extension settings';
@override
String get anime => '动画';
@ -1033,6 +1069,10 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get video_audio => '音频';
@override
String get video_audio_info =>
'Preferred languages, pitch correction, audio channels';
@override
String get player => '播放器';
@ -1250,6 +1290,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get advanced => '高级';
@override
String get advanced_info => 'mpv config';
@override
String get use_native_http_client => '使用本地 HTTP 客户端';
@ -1323,6 +1366,27 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get downloads_are_limited_to_wifi => '下载仅限于WiFi';
@override
String get recommendations => 'Recommendations';
@override
String get recommendations_similar => 'similar';
@override
String get recommendations_weights => 'Recommendation Weights';
@override
String get recommendations_weights_genre => 'Genre Similarity';
@override
String get recommendations_weights_setting => 'Setting Similarity';
@override
String get recommendations_weights_synopsis => 'Story Similarity';
@override
String get recommendations_weights_theme => 'Theme Similarity';
@override
String get manga_extensions_repo => '漫画扩展库';
@ -1332,6 +1396,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get novel_extensions_repo => '小说扩展库';
@override
String get custom_dns => 'Custom DNS (leave blank to use system DNS)';
@override
String get android_proxy_server => 'Android Proxy Server (ApkBridge)';
@override
String get get_apk_bridge => 'Get ApkBridge';
@override
String get undefined => '未定义';
@ -1392,6 +1465,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get load_own_subtitles => '加载自定义字幕';
@override
String get search_subtitles => 'Search subtitles online...';
@override
String extension_notes(Object notes) {
return 'Notes: $notes';
@ -1422,6 +1498,16 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get hwdec => 'Hardware Decoder';
@override
String get enable_hardware_accel => 'Hardware Acceleration';
@override
String get enable_hardware_accel_info =>
'Turn it on/off if you are experiencing bugs or crashes';
@override
String get track_library_navigate => 'Go to existing local entry';
@override
String get track_library_add => 'Add to local library';
@ -1466,4 +1552,157 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get sync_enable_settings => 'Sync settings';
@override
String get enable_mpv => 'Enable mpv shaders / scripts';
@override
String get mpv_info => 'Supports .js scripts under mpv/scripts/';
@override
String get mpv_redownload => 'Redownload mpv config files';
@override
String get mpv_redownload_info => 'Replaces old config files with new one!';
@override
String get mpv_download => 'MPV config files are required!\nDownload now?';
@override
String get custom_buttons => 'Custom buttons';
@override
String get custom_buttons_info => 'Execute lua code with custom buttons';
@override
String get custom_buttons_edit => 'Edit custom buttons';
@override
String get custom_buttons_add => 'Add custom button';
@override
String get custom_buttons_added => 'Custom button added!';
@override
String get custom_buttons_delete => 'Delete custom button';
@override
String get custom_buttons_text => 'Button text';
@override
String get custom_buttons_text_req => 'Button text required';
@override
String get custom_buttons_js_code => 'lua code';
@override
String get custom_buttons_js_code_req => 'lua code required';
@override
String get custom_buttons_js_code_long => 'lua code (on long press)';
@override
String get custom_buttons_startup => 'lua code (on startup)';
@override
String n_days(Object n) {
return '$n days';
}
@override
String get decoder => 'Decoder';
@override
String get decoder_info => 'Hardware decoding, pixel format, debanding';
@override
String get enable_gpu_next => 'Enable gpu-next (Android only)';
@override
String get enable_gpu_next_info => 'A new video rendering backend';
@override
String get debanding => 'Debanding';
@override
String get use_yuv420p => 'Use YUV420P pixel format';
@override
String get use_yuv420p_info =>
'May fix black screens on some video codecs, can also improve performance at the cost of quality';
@override
String get audio_preferred_languages => 'Preferred langauages';
@override
String get audio_preferred_languages_info =>
'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.';
@override
String get enable_audio_pitch_correction => 'Enable audio pitch correction';
@override
String get enable_audio_pitch_correction_info =>
'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds';
@override
String get audio_channels => 'Audio channels';
@override
String get volume_boost_cap => 'Volume boost cap';
@override
String get internal_player => 'Internal player';
@override
String get internal_player_info => 'Progress, controls, orientation';
@override
String get subtitle_delay_text => 'Subtitle delay';
@override
String get subtitle_delay => 'Delay (ms)';
@override
String get subtitle_speed => 'Speed';
@override
String get calendar => 'Calendar';
@override
String get calendar_no_data => 'No data yet.';
@override
String get calendar_info =>
'The calendar is only able to predict the next chapter upload based on the older uploads. Some data might not be 100% accurate!';
@override
String in_n_day(Object days) {
return 'in $days day';
}
@override
String in_n_days(Object days) {
return 'in $days days';
}
@override
String get clear_library => 'Clear library';
@override
String get clear_library_desc =>
'Choose to clear all manga, anime and/or novel entries';
@override
String get clear_library_input =>
'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries';
@override
String get watch_order => 'Watch order';
@override
String get sequels => 'Sequels';
@override
String get recommendations_similarity => 'Similarity:';
}

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:app_links/app_links.dart';
import 'package:archive/archive.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:flutter/foundation.dart';
@ -13,12 +14,17 @@ import 'package:hive_flutter/adapters.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/custom_button.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/track.dart' as track;
import 'package:mangayomi/models/track_preference.dart';
import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart';
import 'package:mangayomi/modules/more/data_and_storage/providers/storage_usage.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/modules/more/settings/general/providers/general_state_provider.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/router/router.dart';
@ -27,6 +33,7 @@ import 'package:mangayomi/l10n/generated/app_localizations.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/src/rust/frb_generated.dart';
import 'package:mangayomi/utils/discord_rpc.dart';
import 'package:mangayomi/utils/log/logger.dart';
import 'package:mangayomi/utils/url_protocol/api.dart';
import 'package:mangayomi/modules/more/settings/appearance/providers/theme_provider.dart';
import 'package:mangayomi/modules/library/providers/file_scanner.dart';
@ -34,10 +41,12 @@ import 'package:media_kit/media_kit.dart';
import 'package:path_provider/path_provider.dart';
import 'package:window_manager/window_manager.dart';
import 'package:path/path.dart' as p;
import 'package:flutter/services.dart' show rootBundle;
late Isar isar;
DiscordRPC? discordRpc;
WebViewEnvironment? webViewEnvironment;
String? customDns;
void main(List<String> args) async {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isLinux && runWebViewTitleBarWidget(args)) return;
@ -69,6 +78,7 @@ void main(List<String> args) async {
}
Future<void> _postLaunchInit(StorageProvider storage) async {
await AppLogger.init();
final hivePath = (Platform.isIOS || Platform.isMacOS)
? "databases"
: p.join("Mangayomi", "databases");
@ -141,7 +151,10 @@ class _MyAppState extends ConsumerState<MyApp> {
void initState() {
super.initState();
initializeDateFormatting();
customDns = ref.read(customDnsStateProvider);
_checkTrackerRefresh();
_initDeepLinks();
_setupMpvConfig();
unawaited(ref.read(scanLocalLibraryProvider.future));
WidgetsBinding.instance.addPostFrameCallback((_) {
@ -184,12 +197,13 @@ class _MyAppState extends ConsumerState<MyApp> {
void dispose() {
_linkSubscription?.cancel();
discordRpc?.destroy();
AppLogger.dispose();
super.dispose();
}
Future<void> _initDeepLinks() async {
_appLinks = AppLinks();
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
if (uri == lastUri) return; // Debouncing Deep Links
lastUri = uri;
switch (uri.host) {
@ -268,6 +282,62 @@ class _MyAppState extends ConsumerState<MyApp> {
},
);
break;
case "add-button":
final buttonDataRaw = uri.queryParametersAll["button"];
final context = navigatorKey.currentContext;
if (context == null || !context.mounted || buttonDataRaw == null) {
return;
}
final l10n = context.l10n;
for (final buttonRaw in buttonDataRaw) {
final buttonData = jsonDecode(
utf8.decode(base64.decode(buttonRaw)),
);
if (buttonData is Map<String, dynamic>) {
final customButton = CustomButton.fromJson(buttonData);
await showDialog(
context: navigatorKey.currentContext!,
builder: (BuildContext context) {
return AlertDialog(
title: Text(l10n.custom_buttons_add),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${l10n.name}: ${customButton.title ?? 'Unknown'}",
),
],
),
actions: [
TextButton(
child: Text(l10n.cancel),
onPressed: () => Navigator.of(context).pop(),
),
FilledButton(
child: Text(l10n.add),
onPressed: () async {
if (context.mounted) Navigator.of(context).pop();
await isar.writeTxn(() async {
await isar.customButtons.put(
customButton
..pos = await isar.customButtons.count()
..isFavourite = false
..id = null
..updatedAt =
DateTime.now().millisecondsSinceEpoch,
);
});
botToast(l10n.custom_buttons_added);
},
),
],
);
},
);
}
}
break;
default:
}
});
@ -290,6 +360,54 @@ class _MyAppState extends ConsumerState<MyApp> {
}
return true;
}
Future<void> _setupMpvConfig() async {
final provider = StorageProvider();
final dir = await provider.getMpvDirectory();
final mpvFile = File('${dir!.path}/mpv.conf');
final inputFile = File('${dir.path}/input.conf');
final filesMissing =
!(await mpvFile.exists()) && !(await inputFile.exists());
if (filesMissing) {
final bytes = await rootBundle.load("assets/mangayomi_mpv.zip");
final archive = ZipDecoder().decodeBytes(bytes.buffer.asUint8List());
String shadersDir = p.join(dir.path, 'shaders');
await Directory(shadersDir).create(recursive: true);
String scriptsDir = p.join(dir.path, 'scripts');
await Directory(scriptsDir).create(recursive: true);
for (final file in archive.files) {
if (file.name == "mpv.conf") {
await mpvFile.writeAsBytes(file.content);
} else if (file.name == "input.conf") {
await inputFile.writeAsBytes(file.content);
} else if (file.name.startsWith("shaders/") &&
file.name.endsWith(".glsl")) {
final shaderFile = File('$shadersDir/${file.name.split("/").last}');
await shaderFile.writeAsBytes(file.content);
} else if (file.name.startsWith("scripts/") &&
(file.name.endsWith(".js") || file.name.endsWith(".lua"))) {
final scriptFile = File('$scriptsDir/${file.name.split("/").last}');
await scriptFile.writeAsBytes(file.content);
}
}
}
}
Future<void> _checkTrackerRefresh() async {
final prefs = await isar.trackPreferences
.filter()
.syncIdIsNotNull()
.findAll();
for (final pref in prefs) {
final temp = track.Track(
syncId: pref.syncId,
status: track.TrackStatus.completed,
);
ref
.read(trackStateProvider(track: temp, itemType: null).notifier)
.checkRefresh();
}
}
}
class AllowScrollBehavior extends MaterialScrollBehavior {

View file

@ -23,32 +23,17 @@ const CategorySchema = CollectionSchema(
type: IsarType.byte,
enumMap: _CategoryforItemTypeEnumValueMap,
),
r'forManga': PropertySchema(
id: 1,
name: r'forManga',
type: IsarType.bool,
),
r'hide': PropertySchema(
id: 2,
name: r'hide',
type: IsarType.bool,
),
r'name': PropertySchema(
id: 3,
name: r'name',
type: IsarType.string,
),
r'pos': PropertySchema(
id: 4,
name: r'pos',
type: IsarType.long,
),
r'forManga': PropertySchema(id: 1, name: r'forManga', type: IsarType.bool),
r'hide': PropertySchema(id: 2, name: r'hide', type: IsarType.bool),
r'name': PropertySchema(id: 3, name: r'name', type: IsarType.string),
r'pos': PropertySchema(id: 4, name: r'pos', type: IsarType.long),
r'updatedAt': PropertySchema(
id: 5,
name: r'updatedAt',
type: IsarType.long,
)
),
},
estimateSize: _categoryEstimateSize,
serialize: _categorySerialize,
deserialize: _categoryDeserialize,
@ -57,6 +42,7 @@ const CategorySchema = CollectionSchema(
indexes: {},
links: {},
embeddedSchemas: {},
getId: _categoryGetId,
getLinks: _categoryGetLinks,
attach: _categoryAttach,
@ -101,7 +87,7 @@ Category _categoryDeserialize(
final object = Category(
forItemType:
_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ??
ItemType.manga,
ItemType.manga,
hide: reader.readBoolOrNull(offsets[2]),
id: id,
name: reader.readStringOrNull(offsets[3]),
@ -121,7 +107,8 @@ P _categoryDeserializeProp<P>(
switch (propertyId) {
case 0:
return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
ItemType.manga) as P;
ItemType.manga)
as P;
case 1:
return (reader.readBoolOrNull(offset)) as P;
case 2:
@ -137,11 +124,7 @@ P _categoryDeserializeProp<P>(
}
}
const _CategoryforItemTypeEnumValueMap = {
'manga': 0,
'anime': 1,
'novel': 2,
};
const _CategoryforItemTypeEnumValueMap = {'manga': 0, 'anime': 1, 'novel': 2};
const _CategoryforItemTypeValueEnumMap = {
0: ItemType.manga,
1: ItemType.anime,
@ -171,10 +154,7 @@ extension CategoryQueryWhereSort on QueryBuilder<Category, Category, QWhere> {
extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
QueryBuilder<Category, Category, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
return query.addWhereClause(IdWhereClause.between(lower: id, upper: id));
});
}
@ -200,8 +180,10 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
});
}
QueryBuilder<Category, Category, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
QueryBuilder<Category, Category, QAfterWhereClause> idGreaterThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
@ -209,8 +191,10 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
});
}
QueryBuilder<Category, Category, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
QueryBuilder<Category, Category, QAfterWhereClause> idLessThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
@ -225,12 +209,14 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
return query.addWhereClause(
IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
),
);
});
}
}
@ -238,26 +224,25 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
extension CategoryQueryFilter
on QueryBuilder<Category, Category, QFilterCondition> {
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeEqualTo(
ItemType value) {
ItemType value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'forItemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'forItemType', value: value),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
forItemTypeGreaterThan(
ItemType value, {
bool include = false,
}) {
forItemTypeGreaterThan(ItemType value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'forItemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'forItemType',
value: value,
),
);
});
}
@ -266,11 +251,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'forItemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'forItemType',
value: value,
),
);
});
}
@ -281,90 +268,91 @@ extension CategoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'forItemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'forItemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'forManga',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'forManga'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'forManga',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'forManga'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaEqualTo(
bool? value) {
bool? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'forManga',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'forManga', value: value),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> hideIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'hide',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'hide'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> hideIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'hide',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'hide'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> hideEqualTo(
bool? value) {
bool? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'hide',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'hide', value: value),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'id'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'id'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> idEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'id', value: value),
);
});
}
@ -373,11 +361,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -386,11 +376,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -401,29 +393,31 @@ extension CategoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'name',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'name'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'name',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'name'),
);
});
}
@ -432,11 +426,13 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.equalTo(
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -446,12 +442,14 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -461,12 +459,14 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -478,14 +478,16 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'name',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'name',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
),
);
});
}
@ -494,11 +496,13 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.startsWith(
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -507,79 +511,85 @@ extension CategoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.endsWith(
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'name',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.contains(
property: r'name',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'name',
wildcard: pattern,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.matches(
property: r'name',
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'name',
value: '',
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'name', value: ''),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> nameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'name',
value: '',
));
return query.addFilterCondition(
FilterCondition.greaterThan(property: r'name', value: ''),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> posIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'pos',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'pos'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> posIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'pos',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'pos'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> posEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'pos',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'pos', value: value),
);
});
}
@ -588,11 +598,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'pos',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'pos',
value: value,
),
);
});
}
@ -601,11 +613,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'pos',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'pos',
value: value,
),
);
});
}
@ -616,39 +630,41 @@ extension CategoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'pos',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'pos',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> updatedAtIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'updatedAt'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> updatedAtIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'updatedAt'),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> updatedAtEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'updatedAt', value: value),
);
});
}
@ -657,11 +673,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -670,11 +688,13 @@ extension CategoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -685,13 +705,15 @@ extension CategoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
}
@ -883,8 +905,9 @@ extension CategoryQueryWhereDistinct
});
}
QueryBuilder<Category, Category, QDistinct> distinctByName(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QDistinct> distinctByName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'name', caseSensitive: caseSensitive);
});

View file

@ -28,17 +28,10 @@ const ChangedPartSchema = CollectionSchema(
name: r'clientDate',
type: IsarType.long,
),
r'data': PropertySchema(
id: 2,
name: r'data',
type: IsarType.string,
),
r'isarId': PropertySchema(
id: 3,
name: r'isarId',
type: IsarType.long,
)
r'data': PropertySchema(id: 2, name: r'data', type: IsarType.string),
r'isarId': PropertySchema(id: 3, name: r'isarId', type: IsarType.long),
},
estimateSize: _changedPartEstimateSize,
serialize: _changedPartSerialize,
deserialize: _changedPartDeserialize,
@ -47,6 +40,7 @@ const ChangedPartSchema = CollectionSchema(
indexes: {},
links: {},
embeddedSchemas: {},
getId: _changedPartGetId,
getLinks: _changedPartGetLinks,
attach: _changedPartAttach,
@ -84,7 +78,7 @@ ChangedPart _changedPartDeserialize(
final object = ChangedPart(
actionType:
_ChangedPartactionTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ??
ActionType.removeItem,
ActionType.removeItem,
clientDate: reader.readLong(offsets[1]),
data: reader.readString(offsets[2]),
id: id,
@ -101,9 +95,11 @@ P _changedPartDeserializeProp<P>(
) {
switch (propertyId) {
case 0:
return (_ChangedPartactionTypeValueEnumMap[
reader.readByteOrNull(offset)] ??
ActionType.removeItem) as P;
return (_ChangedPartactionTypeValueEnumMap[reader.readByteOrNull(
offset,
)] ??
ActionType.removeItem)
as P;
case 1:
return (reader.readLong(offset)) as P;
case 2:
@ -143,7 +139,10 @@ List<IsarLinkBase<dynamic>> _changedPartGetLinks(ChangedPart object) {
}
void _changedPartAttach(
IsarCollection<dynamic> col, Id id, ChangedPart object) {
IsarCollection<dynamic> col,
Id id,
ChangedPart object,
) {
object.id = id;
}
@ -160,15 +159,13 @@ extension ChangedPartQueryWhere
on QueryBuilder<ChangedPart, ChangedPart, QWhereClause> {
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
return query.addWhereClause(IdWhereClause.between(lower: id, upper: id));
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idNotEqualTo(
Id id) {
Id id,
) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
@ -190,8 +187,10 @@ extension ChangedPartQueryWhere
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idGreaterThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
@ -199,8 +198,10 @@ extension ChangedPartQueryWhere
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
QueryBuilder<ChangedPart, ChangedPart, QAfterWhereClause> idLessThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
@ -215,12 +216,14 @@ extension ChangedPartQueryWhere
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
return query.addWhereClause(
IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
),
);
});
}
}
@ -228,114 +231,112 @@ extension ChangedPartQueryWhere
extension ChangedPartQueryFilter
on QueryBuilder<ChangedPart, ChangedPart, QFilterCondition> {
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
actionTypeEqualTo(ActionType value) {
actionTypeEqualTo(ActionType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'actionType',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'actionType', value: value),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
actionTypeGreaterThan(
ActionType value, {
bool include = false,
}) {
actionTypeGreaterThan(ActionType value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'actionType',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'actionType',
value: value,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
actionTypeLessThan(
ActionType value, {
bool include = false,
}) {
actionTypeLessThan(ActionType value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'actionType',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'actionType',
value: value,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
actionTypeBetween(
actionTypeBetween(
ActionType lower,
ActionType upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'actionType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'actionType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
clientDateEqualTo(int value) {
clientDateEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'clientDate',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'clientDate', value: value),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
clientDateGreaterThan(
int value, {
bool include = false,
}) {
clientDateGreaterThan(int value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'clientDate',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'clientDate',
value: value,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
clientDateLessThan(
int value, {
bool include = false,
}) {
clientDateLessThan(int value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'clientDate',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'clientDate',
value: value,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
clientDateBetween(
clientDateBetween(
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'clientDate',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'clientDate',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
@ -344,11 +345,13 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.equalTo(
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -358,12 +361,14 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -373,12 +378,14 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -390,14 +397,16 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'data',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'data',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
),
);
});
}
@ -406,11 +415,13 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.startsWith(
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -419,80 +430,86 @@ extension ChangedPartQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.endsWith(
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> dataContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'data',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.contains(
property: r'data',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> dataMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'data',
wildcard: pattern,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.matches(
property: r'data',
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> dataIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'data',
value: '',
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'data', value: ''),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
dataIsNotEmpty() {
dataIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'data',
value: '',
));
return query.addFilterCondition(
FilterCondition.greaterThan(property: r'data', value: ''),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'id'),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'id'),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> idEqualTo(
Id? value) {
Id? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'id', value: value),
);
});
}
@ -501,11 +518,13 @@ extension ChangedPartQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -514,11 +533,13 @@ extension ChangedPartQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -529,54 +550,55 @@ extension ChangedPartQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> isarIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'isarId',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'isarId'),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
isarIdIsNotNull() {
isarIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'isarId',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'isarId'),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition> isarIdEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'isarId',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'isarId', value: value),
);
});
}
QueryBuilder<ChangedPart, ChangedPart, QAfterFilterCondition>
isarIdGreaterThan(
int? value, {
bool include = false,
}) {
isarIdGreaterThan(int? value, {bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'isarId',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'isarId',
value: value,
),
);
});
}
@ -585,11 +607,13 @@ extension ChangedPartQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'isarId',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'isarId',
value: value,
),
);
});
}
@ -600,13 +624,15 @@ extension ChangedPartQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'isarId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'isarId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
}
@ -745,8 +771,9 @@ extension ChangedPartQueryWhereDistinct
});
}
QueryBuilder<ChangedPart, ChangedPart, QDistinct> distinctByData(
{bool caseSensitive = true}) {
QueryBuilder<ChangedPart, ChangedPart, QDistinct> distinctByData({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'data', caseSensitive: caseSensitive);
});

View file

@ -26,6 +26,18 @@ class Chapter {
///Only for local archive Comic
String? archivePath;
bool? isFiller;
String? thumbnailUrl;
String? description;
/// video size
String? downloadSize;
/// video duration
String? duration;
int? updatedAt;
final manga = IsarLink<Manga>();
@ -41,6 +53,11 @@ class Chapter {
this.isRead = false,
this.lastPageRead = '',
this.archivePath = '',
this.isFiller = false,
this.thumbnailUrl,
this.description,
this.downloadSize,
this.duration,
this.updatedAt = 0,
});
@ -55,6 +72,11 @@ class Chapter {
name = json['name'];
scanlator = json['scanlator'];
url = json['url'];
isFiller = json['isFiller'] ?? false;
thumbnailUrl = json['thumbnailUrl'];
description = json['description'];
downloadSize = json['downloadSize'];
duration = json['duration'];
updatedAt = json['updatedAt'];
}
@ -69,6 +91,11 @@ class Chapter {
'name': name,
'scanlator': scanlator,
'url': url,
'isFiller': isFiller,
'thumbnailUrl': thumbnailUrl,
'description': description,
'downloadSize': downloadSize,
'duration': duration,
'updatedAt': updatedAt ?? 0,
};
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,95 @@
import 'package:isar/isar.dart';
part 'custom_button.g.dart';
@collection
@Name("CustomButton")
class CustomButton {
Id? id;
String? title;
String? codePress;
String? codeLongPress;
String? codeStartup;
bool? isFavourite;
int? pos;
int? updatedAt;
CustomButton({
this.id = Isar.autoIncrement,
required this.title,
required this.codePress,
this.codeLongPress = "",
this.codeStartup = "",
this.isFavourite = false,
required this.pos,
this.updatedAt = 0,
});
String getButtonStartup(int primaryId) {
final isPrimary = primaryId == id ? "true" : "false";
return codeStartup
?.replaceAll("\$id", "$id")
.replaceAll("\$isPrimary", isPrimary) ??
"";
}
String getButtonPress(int primaryId) {
final isPrimary = primaryId == id ? "true" : "false";
return codePress
?.replaceAll("\$id", "$id")
.replaceAll("\$isPrimary", isPrimary) ??
"";
}
String getButtonLongPress(int primaryId) {
final isPrimary = primaryId == id ? "true" : "false";
return codeLongPress
?.replaceAll("\$id", "$id")
.replaceAll("\$isPrimary", isPrimary) ??
"";
}
CustomButton.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
codePress = json['codePress'];
codeLongPress = json['codeLongPress'];
codeStartup = json['codeStartup'];
isFavourite = json['isFavourite'];
pos = json['pos'];
updatedAt = json['updatedAt'];
}
Map<String, dynamic> toJson() => {
'id': id,
'title': title,
'codePress': codePress,
'codeLongPress': codeLongPress,
'codeStartup': codeStartup,
'isFavourite': isFavourite,
'pos': pos,
'updatedAt': updatedAt ?? 0,
};
}
class ActiveCustomButton {
String currentTitle;
bool visible;
CustomButton button;
Function() onPress;
Function() onLongPress;
ActiveCustomButton({
required this.currentTitle,
required this.visible,
required this.button,
required this.onPress,
required this.onLongPress,
});
}

File diff suppressed because it is too large Load diff

View file

@ -17,11 +17,7 @@ const DownloadSchema = CollectionSchema(
name: r'Download',
id: 5905484153212786579,
properties: {
r'failed': PropertySchema(
id: 0,
name: r'failed',
type: IsarType.long,
),
r'failed': PropertySchema(id: 0, name: r'failed', type: IsarType.long),
r'isDownload': PropertySchema(
id: 1,
name: r'isDownload',
@ -37,12 +33,9 @@ const DownloadSchema = CollectionSchema(
name: r'succeeded',
type: IsarType.long,
),
r'total': PropertySchema(
id: 4,
name: r'total',
type: IsarType.long,
)
r'total': PropertySchema(id: 4, name: r'total', type: IsarType.long),
},
estimateSize: _downloadEstimateSize,
serialize: _downloadSerialize,
deserialize: _downloadDeserialize,
@ -55,9 +48,10 @@ const DownloadSchema = CollectionSchema(
name: r'chapter',
target: r'Chapter',
single: true,
)
),
},
embeddedSchemas: {},
getId: _downloadGetId,
getLinks: _downloadGetLinks,
attach: _downloadAttach,
@ -149,10 +143,7 @@ extension DownloadQueryWhereSort on QueryBuilder<Download, Download, QWhere> {
extension DownloadQueryWhere on QueryBuilder<Download, Download, QWhereClause> {
QueryBuilder<Download, Download, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
return query.addWhereClause(IdWhereClause.between(lower: id, upper: id));
});
}
@ -178,8 +169,10 @@ extension DownloadQueryWhere on QueryBuilder<Download, Download, QWhereClause> {
});
}
QueryBuilder<Download, Download, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
QueryBuilder<Download, Download, QAfterWhereClause> idGreaterThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
@ -187,8 +180,10 @@ extension DownloadQueryWhere on QueryBuilder<Download, Download, QWhereClause> {
});
}
QueryBuilder<Download, Download, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
QueryBuilder<Download, Download, QAfterWhereClause> idLessThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
@ -203,12 +198,14 @@ extension DownloadQueryWhere on QueryBuilder<Download, Download, QWhereClause> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
return query.addWhereClause(
IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
),
);
});
}
}
@ -217,27 +214,27 @@ extension DownloadQueryFilter
on QueryBuilder<Download, Download, QFilterCondition> {
QueryBuilder<Download, Download, QAfterFilterCondition> failedIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'failed',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'failed'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> failedIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'failed',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'failed'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> failedEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'failed',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'failed', value: value),
);
});
}
@ -246,11 +243,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'failed',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'failed',
value: value,
),
);
});
}
@ -259,11 +258,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'failed',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'failed',
value: value,
),
);
});
}
@ -274,38 +275,39 @@ extension DownloadQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'failed',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'failed',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'id'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'id'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> idEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'id', value: value),
);
});
}
@ -314,11 +316,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -327,11 +331,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -342,94 +348,95 @@ extension DownloadQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> isDownloadIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'isDownload',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'isDownload'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition>
isDownloadIsNotNull() {
isDownloadIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'isDownload',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'isDownload'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> isDownloadEqualTo(
bool? value) {
bool? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'isDownload',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'isDownload', value: value),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition>
isStartDownloadIsNull() {
isStartDownloadIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'isStartDownload',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'isStartDownload'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition>
isStartDownloadIsNotNull() {
isStartDownloadIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'isStartDownload',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'isStartDownload'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition>
isStartDownloadEqualTo(bool? value) {
isStartDownloadEqualTo(bool? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'isStartDownload',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'isStartDownload', value: value),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> succeededIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'succeeded',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'succeeded'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> succeededIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'succeeded',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'succeeded'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> succeededEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'succeeded',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'succeeded', value: value),
);
});
}
@ -438,11 +445,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'succeeded',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'succeeded',
value: value,
),
);
});
}
@ -451,11 +460,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'succeeded',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'succeeded',
value: value,
),
);
});
}
@ -466,39 +477,41 @@ extension DownloadQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'succeeded',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'succeeded',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> totalIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'total',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'total'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> totalIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'total',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'total'),
);
});
}
QueryBuilder<Download, Download, QAfterFilterCondition> totalEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'total',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'total', value: value),
);
});
}
@ -507,11 +520,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'total',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'total',
value: value,
),
);
});
}
@ -520,11 +535,13 @@ extension DownloadQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'total',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'total',
value: value,
),
);
});
}
@ -535,13 +552,15 @@ extension DownloadQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'total',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'total',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
}
@ -552,7 +571,8 @@ extension DownloadQueryObject
extension DownloadQueryLinks
on QueryBuilder<Download, Download, QFilterCondition> {
QueryBuilder<Download, Download, QAfterFilterCondition> chapter(
FilterQuery<Chapter> q) {
FilterQuery<Chapter> q,
) {
return QueryBuilder.apply(this, (query) {
return query.link(q, r'chapter');
});

View file

@ -22,33 +22,22 @@ const HistorySchema = CollectionSchema(
name: r'chapterId',
type: IsarType.long,
),
r'date': PropertySchema(
id: 1,
name: r'date',
type: IsarType.string,
),
r'isManga': PropertySchema(
id: 2,
name: r'isManga',
type: IsarType.bool,
),
r'date': PropertySchema(id: 1, name: r'date', type: IsarType.string),
r'isManga': PropertySchema(id: 2, name: r'isManga', type: IsarType.bool),
r'itemType': PropertySchema(
id: 3,
name: r'itemType',
type: IsarType.byte,
enumMap: _HistoryitemTypeEnumValueMap,
),
r'mangaId': PropertySchema(
id: 4,
name: r'mangaId',
type: IsarType.long,
),
r'mangaId': PropertySchema(id: 4, name: r'mangaId', type: IsarType.long),
r'updatedAt': PropertySchema(
id: 5,
name: r'updatedAt',
type: IsarType.long,
)
),
},
estimateSize: _historyEstimateSize,
serialize: _historySerialize,
deserialize: _historyDeserialize,
@ -61,9 +50,10 @@ const HistorySchema = CollectionSchema(
name: r'chapter',
target: r'Chapter',
single: true,
)
),
},
embeddedSchemas: {},
getId: _historyGetId,
getLinks: _historyGetLinks,
attach: _historyAttach,
@ -110,7 +100,8 @@ History _historyDeserialize(
date: reader.readStringOrNull(offsets[1]),
id: id,
isManga: reader.readBoolOrNull(offsets[2]),
itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[3])] ??
itemType:
_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[3])] ??
ItemType.manga,
mangaId: reader.readLongOrNull(offsets[4]),
updatedAt: reader.readLongOrNull(offsets[5]),
@ -133,7 +124,8 @@ P _historyDeserializeProp<P>(
return (reader.readBoolOrNull(offset)) as P;
case 3:
return (_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
ItemType.manga) as P;
ItemType.manga)
as P;
case 4:
return (reader.readLongOrNull(offset)) as P;
case 5:
@ -143,11 +135,7 @@ P _historyDeserializeProp<P>(
}
}
const _HistoryitemTypeEnumValueMap = {
'manga': 0,
'anime': 1,
'novel': 2,
};
const _HistoryitemTypeEnumValueMap = {'manga': 0, 'anime': 1, 'novel': 2};
const _HistoryitemTypeValueEnumMap = {
0: ItemType.manga,
1: ItemType.anime,
@ -178,10 +166,7 @@ extension HistoryQueryWhereSort on QueryBuilder<History, History, QWhere> {
extension HistoryQueryWhere on QueryBuilder<History, History, QWhereClause> {
QueryBuilder<History, History, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
return query.addWhereClause(IdWhereClause.between(lower: id, upper: id));
});
}
@ -207,8 +192,10 @@ extension HistoryQueryWhere on QueryBuilder<History, History, QWhereClause> {
});
}
QueryBuilder<History, History, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
QueryBuilder<History, History, QAfterWhereClause> idGreaterThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
@ -216,8 +203,10 @@ extension HistoryQueryWhere on QueryBuilder<History, History, QWhereClause> {
});
}
QueryBuilder<History, History, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
QueryBuilder<History, History, QAfterWhereClause> idLessThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
@ -232,12 +221,14 @@ extension HistoryQueryWhere on QueryBuilder<History, History, QWhereClause> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
return query.addWhereClause(
IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
),
);
});
}
}
@ -246,27 +237,27 @@ extension HistoryQueryFilter
on QueryBuilder<History, History, QFilterCondition> {
QueryBuilder<History, History, QAfterFilterCondition> chapterIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'chapterId',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'chapterId'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> chapterIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'chapterId',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'chapterId'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> chapterIdEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'chapterId',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'chapterId', value: value),
);
});
}
@ -275,11 +266,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'chapterId',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'chapterId',
value: value,
),
);
});
}
@ -288,11 +281,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'chapterId',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'chapterId',
value: value,
),
);
});
}
@ -303,29 +298,31 @@ extension HistoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'chapterId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'chapterId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'date',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'date'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'date',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'date'),
);
});
}
@ -334,11 +331,13 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.equalTo(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -348,12 +347,14 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -363,12 +364,14 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -380,14 +383,16 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'date',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'date',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
),
);
});
}
@ -396,11 +401,13 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.startsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -409,78 +416,83 @@ extension HistoryQueryFilter
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.endsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.contains(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'date',
wildcard: pattern,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.matches(
property: r'date',
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: '',
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'date', value: ''),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> dateIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'date',
value: '',
));
return query.addFilterCondition(
FilterCondition.greaterThan(property: r'date', value: ''),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'id'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'id'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> idEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'id', value: value),
);
});
}
@ -489,11 +501,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -502,11 +516,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -517,49 +533,51 @@ extension HistoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> isMangaIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'isManga',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'isManga'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> isMangaIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'isManga',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'isManga'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> isMangaEqualTo(
bool? value) {
bool? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'isManga',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'isManga', value: value),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> itemTypeEqualTo(
ItemType value) {
ItemType value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'itemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'itemType', value: value),
);
});
}
@ -568,11 +586,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'itemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'itemType',
value: value,
),
);
});
}
@ -581,11 +601,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'itemType',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'itemType',
value: value,
),
);
});
}
@ -596,39 +618,41 @@ extension HistoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'itemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'itemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> mangaIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'mangaId',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'mangaId'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> mangaIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'mangaId',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'mangaId'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> mangaIdEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'mangaId', value: value),
);
});
}
@ -637,11 +661,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'mangaId',
value: value,
),
);
});
}
@ -650,11 +676,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'mangaId',
value: value,
),
);
});
}
@ -665,39 +693,41 @@ extension HistoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'mangaId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'mangaId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> updatedAtIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'updatedAt'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> updatedAtIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'updatedAt'),
);
});
}
QueryBuilder<History, History, QAfterFilterCondition> updatedAtEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'updatedAt', value: value),
);
});
}
@ -706,11 +736,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -719,11 +751,13 @@ extension HistoryQueryFilter
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -734,13 +768,15 @@ extension HistoryQueryFilter
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
}
@ -751,7 +787,8 @@ extension HistoryQueryObject
extension HistoryQueryLinks
on QueryBuilder<History, History, QFilterCondition> {
QueryBuilder<History, History, QAfterFilterCondition> chapter(
FilterQuery<Chapter> q) {
FilterQuery<Chapter> q,
) {
return QueryBuilder.apply(this, (query) {
return query.link(q, r'chapter');
});
@ -933,8 +970,9 @@ extension HistoryQueryWhereDistinct
});
}
QueryBuilder<History, History, QDistinct> distinctByDate(
{bool caseSensitive = true}) {
QueryBuilder<History, History, QDistinct> distinctByDate({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'date', caseSensitive: caseSensitive);
});

View file

@ -49,8 +49,13 @@ class Manga {
String? customCoverFromTracker;
/// only update X days after `lastUpdate`
int? smartUpdateDays;
int? updatedAt;
int? sourceId;
@Backlink(to: "manga")
final chapters = IsarLinks<Chapter>();
@ -67,6 +72,7 @@ class Manga {
required this.name,
required this.status,
required this.description,
required this.sourceId,
this.isManga,
this.itemType = ItemType.manga,
this.dateAdded,
@ -76,6 +82,7 @@ class Manga {
this.isLocalArchive = false,
this.customCoverImage,
this.customCoverFromTracker,
this.smartUpdateDays,
this.updatedAt = 0,
});
@ -101,7 +108,9 @@ class Manga {
source = json['source'];
status = Status.values[json['status']];
customCoverFromTracker = json['customCoverFromTracker'];
smartUpdateDays = json['smartUpdateDays'];
updatedAt = json['updatedAt'];
sourceId = json['sourceId'];
}
Map<String, dynamic> toJson() => {
@ -125,7 +134,9 @@ class Manga {
'source': source,
'status': status.index,
'customCoverFromTracker': customCoverFromTracker,
'smartUpdateDays': smartUpdateDays,
'updatedAt': updatedAt ?? 0,
'sourceId': sourceId,
};
}

File diff suppressed because it is too large Load diff

View file

@ -169,6 +169,8 @@ class Settings {
int? aniSkipTimeoutLength;
String? customDns;
String? btServerAddress;
int? btServerPort;
@ -201,6 +203,8 @@ class Settings {
List<Repo>? novelExtensionsRepo;
String? androidProxyServer;
@enumerated
late SectionType disableSectionType;
@ -208,6 +212,8 @@ class Settings {
String? hwdecMode;
bool? enableHardwareAcceleration;
int? libraryFilterNovelDownloadType;
int? libraryFilterNovelUnreadType;
@ -258,6 +264,28 @@ class Settings {
bool? rpcShowCoverImage;
bool? useMpvConfig;
@enumerated
late DebandingType debandingType;
bool? enableGpuNext;
bool? useYUV420P;
String? audioPreferredLanguages;
bool? enableAudioPitchCorrection;
@enumerated
late AudioChannel audioChannels;
int? volumeBoostCap;
bool? downloadedOnlyMode;
late AlgorithmWeights? algorithmWeights;
Settings({
this.id = 227,
this.updatedAt = 0,
@ -332,6 +360,7 @@ class Settings {
this.enableAniSkip,
this.enableAutoSkip,
this.aniSkipTimeoutLength,
this.customDns = "",
this.btServerAddress = "127.0.0.1",
this.btServerPort,
this.fullScreenReader = true,
@ -346,6 +375,7 @@ class Settings {
this.disableSectionType = SectionType.all,
this.useLibass = true,
this.hwdecMode = "auto",
this.enableHardwareAcceleration,
this.libraryFilterNovelDownloadType = 0,
this.libraryFilterNovelUnreadType = 0,
this.libraryFilterNovelStartedType = 0,
@ -366,6 +396,7 @@ class Settings {
this.mangaExtensionsRepo,
this.animeExtensionsRepo,
this.novelExtensionsRepo,
this.androidProxyServer,
this.lastTrackerLibraryLocation,
this.mergeLibraryNavMobile = false,
this.enableDiscordRpc = true,
@ -373,6 +404,16 @@ class Settings {
this.rpcShowReadingWatchingProgress = true,
this.rpcShowTitle = true,
this.rpcShowCoverImage = true,
this.useMpvConfig = true,
this.debandingType = DebandingType.none,
this.enableGpuNext = false,
this.useYUV420P = false,
this.audioPreferredLanguages,
this.enableAudioPitchCorrection,
this.audioChannels = AudioChannel.autoSafe,
this.volumeBoostCap,
this.downloadedOnlyMode = false,
this.algorithmWeights,
});
Settings.fromJson(Map<String, dynamic> json) {
@ -516,6 +557,7 @@ class Settings {
enableAniSkip = json['enableAniSkip'];
enableAutoSkip = json['enableAutoSkip'];
aniSkipTimeoutLength = json['aniSkipTimeoutLength'];
customDns = json['customDns'];
btServerAddress = json['btServerAddress'];
btServerPort = json['btServerPort'];
customColorFilter = json['customColorFilter'] != null
@ -538,6 +580,7 @@ class Settings {
SectionType.values[json['disableSectionType'] ?? SectionType.all.index];
useLibass = json['useLibass'];
hwdecMode = json['hwdecMode'];
enableHardwareAcceleration = json['enableHardwareAcceleration'];
libraryFilterNovelBookMarkedType = json['libraryFilterNovelBookMarkedType'];
libraryFilterNovelDownloadType = json['libraryFilterNovelDownloadType'];
libraryFilterNovelStartedType = json['libraryFilterNovelStartedType'];
@ -587,6 +630,7 @@ class Settings {
.map((e) => Repo.fromJson(e))
.toList();
}
androidProxyServer = json['androidProxyServer'];
lastTrackerLibraryLocation = json['lastTrackerLibraryLocation'];
mergeLibraryNavMobile = json['mergeLibraryNavMobile'];
enableDiscordRpc = json['enableDiscordRpc'];
@ -594,6 +638,20 @@ class Settings {
rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress'];
rpcShowTitle = json['rpcShowTitle'];
rpcShowCoverImage = json['rpcShowCoverImage'];
useMpvConfig = json['useMpvConfig'];
debandingType =
DebandingType.values[json['debandingType'] ?? DebandingType.none.index];
enableGpuNext = json['enableGpuNext'];
useYUV420P = json['useYUV420P'];
audioPreferredLanguages = json['audioPreferredLanguages'];
enableAudioPitchCorrection = json['enableAudioPitchCorrection'];
audioChannels = AudioChannel
.values[json['audioChannels'] ?? AudioChannel.autoSafe.index];
volumeBoostCap = json['volumeBoostCap'];
downloadedOnlyMode = json['downloadedOnlyMode'];
algorithmWeights = json['algorithmWeights'] != null
? AlgorithmWeights.fromJson(json['algorithmWeights'])
: null;
}
Map<String, dynamic> toJson() => {
@ -688,6 +746,7 @@ class Settings {
'enableAniSkip': enableAniSkip,
'enableAutoSkip': enableAutoSkip,
'aniSkipTimeoutLength': aniSkipTimeoutLength,
'customDns': customDns,
'btServerAddress': btServerAddress,
'btServerPort': btServerPort,
'fullScreenReader': fullScreenReader,
@ -704,6 +763,7 @@ class Settings {
'disableSectionType': disableSectionType.index,
'useLibass': useLibass,
'hwdecMode': hwdecMode,
'enableHardwareAcceleration': enableHardwareAcceleration,
'libraryFilterNovelBookMarkedType': libraryFilterNovelBookMarkedType,
'libraryFilterNovelDownloadType': libraryFilterNovelDownloadType,
'libraryFilterNovelStartedType': libraryFilterNovelStartedType,
@ -725,6 +785,7 @@ class Settings {
'mangaExtensionsRepo': mangaExtensionsRepo?.map((e) => e.toJson()).toList(),
'animeExtensionsRepo': animeExtensionsRepo?.map((e) => e.toJson()).toList(),
'novelExtensionsRepo': novelExtensionsRepo?.map((e) => e.toJson()).toList(),
'androidProxyServer': androidProxyServer,
'lastTrackerLibraryLocation': lastTrackerLibraryLocation,
'mergeLibraryNavMobile': mergeLibraryNavMobile,
'enableDiscordRpc': enableDiscordRpc,
@ -732,9 +793,34 @@ class Settings {
'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress,
'rpcShowTitle': rpcShowTitle,
'rpcShowCoverImage': rpcShowCoverImage,
'useMpvConfig': useMpvConfig,
'debandingType': debandingType.index,
'enableGpuNext': enableGpuNext,
'useYUV420P': useYUV420P,
'audioPreferredLanguages': audioPreferredLanguages,
'enableAudioPitchCorrection': enableAudioPitchCorrection,
'audioChannels': audioChannels.index,
'volumeBoostCap': volumeBoostCap,
'downloadedOnlyMode': downloadedOnlyMode,
if (algorithmWeights != null)
'algorithmWeights': algorithmWeights!.toJson(),
};
}
enum DebandingType { none, cpu, gpu }
enum AudioChannel {
auto(mpvName: "auto"),
autoSafe(mpvName: "auto-safe"),
mono(mpvName: "mono"),
stereo(mpvName: "stereo"),
reverseStereo(mpvName: "pan=[stereo|c0=c1|c1=c0]");
final String mpvName;
const AudioChannel({required this.mpvName});
}
enum SectionType { all, anime, manga }
enum DisplayType { compactGrid, comfortableGrid, coverOnlyGrid, list }
@ -918,20 +1004,34 @@ class Repo {
String? name;
String? website;
String? jsonUrl;
bool? hidden;
Repo({this.name, this.website, this.jsonUrl});
Repo({this.name, this.website, this.jsonUrl, this.hidden});
Repo.fromJson(Map<String, dynamic> json) {
name = json['name'];
website = json['website'];
name = json['meta']?['name'] ?? json['name'];
website = json['meta']?['website'] ?? json['website'];
jsonUrl = json['jsonUrl'];
hidden = json['hidden'];
}
Map<String, dynamic> toJson() => {
'name': name,
'website': website,
'jsonUrl': jsonUrl,
'hidden': hidden,
};
@override
bool operator ==(Object other) {
return other is Repo &&
name == other.name &&
website == other.website &&
jsonUrl == other.jsonUrl;
}
@override
int get hashCode => Object.hash(name, website, jsonUrl);
}
@embedded
@ -1088,6 +1188,35 @@ class PlayerSubtitleSettings {
};
}
@embedded
class AlgorithmWeights {
int? genre;
int? setting;
int? synopsis;
int? theme;
AlgorithmWeights({
this.genre = 30,
this.setting = 15,
this.synopsis = 40,
this.theme = 20,
});
AlgorithmWeights.fromJson(Map<String, dynamic> json) {
genre = json['genre'];
setting = json['setting'];
synopsis = json['synopsis'];
theme = json['theme'];
}
Map<String, dynamic> toJson() => {
'genre': genre,
'setting': setting,
'synopsis': synopsis,
'theme': theme,
};
}
enum ColorFilterBlendMode {
none,
multiply,

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,7 @@
import 'dart:convert';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
@ -49,6 +52,15 @@ class Source {
String? headers;
/// For Mihon ext
bool? supportLatest;
/// For Mihon ext
String? filterList;
/// For Mihon ext
String? preferenceList;
bool? isManga;
@enumerated
@ -93,6 +105,9 @@ class Source {
this.versionLast = "0.0.1",
this.sourceCode = '',
this.headers = '',
this.supportLatest,
this.filterList,
this.preferenceList,
this.isManga,
this.itemType = ItemType.manga,
this.appMinVerReq = "",
@ -104,6 +119,10 @@ class Source {
this.updatedAt = 0,
});
FilterList? getFilterList() => filterList != null
? FilterList.fromJson(jsonDecode(filterList!) as Map<String, dynamic>)
: null;
Source.fromJson(Map<String, dynamic> json) {
apiUrl = json['apiUrl'];
appMinVerReq = json['appMinVerReq'];
@ -112,6 +131,9 @@ class Source {
dateFormatLocale = json['dateFormatLocale'];
hasCloudflare = json['hasCloudflare'];
headers = json['headers'];
supportLatest = json['supportLatest'];
filterList = json['filterList'];
preferenceList = json['preferenceList'];
iconUrl = json['iconUrl'];
id = json['id'];
isActive = json['isActive'];
@ -147,6 +169,9 @@ class Source {
'dateFormatLocale': dateFormatLocale,
'hasCloudflare': hasCloudflare,
'headers': headers,
'supportLatest': supportLatest,
'filterList': filterList,
'preferenceList': preferenceList,
'iconUrl': iconUrl,
'id': id,
'isActive': isActive,
@ -191,4 +216,4 @@ class Source {
}
}
enum SourceCodeLanguage { dart, javascript }
enum SourceCodeLanguage { dart, javascript, mihon }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,15 @@ class TrackPreference {
String? prefs;
TrackPreference({this.syncId, this.username, this.oAuth, this.prefs});
bool? refreshing;
TrackPreference({
this.syncId,
this.username,
this.oAuth,
this.prefs,
this.refreshing,
});
TrackPreference.fromJson(Map<String, dynamic> json) {
syncId = json['syncId'];

File diff suppressed because it is too large Load diff

View file

@ -22,22 +22,15 @@ const UpdateSchema = CollectionSchema(
name: r'chapterName',
type: IsarType.string,
),
r'date': PropertySchema(
id: 1,
name: r'date',
type: IsarType.string,
),
r'mangaId': PropertySchema(
id: 2,
name: r'mangaId',
type: IsarType.long,
),
r'date': PropertySchema(id: 1, name: r'date', type: IsarType.string),
r'mangaId': PropertySchema(id: 2, name: r'mangaId', type: IsarType.long),
r'updatedAt': PropertySchema(
id: 3,
name: r'updatedAt',
type: IsarType.long,
)
),
},
estimateSize: _updateEstimateSize,
serialize: _updateSerialize,
deserialize: _updateDeserialize,
@ -50,9 +43,10 @@ const UpdateSchema = CollectionSchema(
name: r'chapter',
target: r'Chapter',
single: true,
)
),
},
embeddedSchemas: {},
getId: _updateGetId,
getLinks: _updateGetLinks,
attach: _updateAttach,
@ -152,10 +146,7 @@ extension UpdateQueryWhereSort on QueryBuilder<Update, Update, QWhere> {
extension UpdateQueryWhere on QueryBuilder<Update, Update, QWhereClause> {
QueryBuilder<Update, Update, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
return query.addWhereClause(IdWhereClause.between(lower: id, upper: id));
});
}
@ -181,8 +172,10 @@ extension UpdateQueryWhere on QueryBuilder<Update, Update, QWhereClause> {
});
}
QueryBuilder<Update, Update, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
QueryBuilder<Update, Update, QAfterWhereClause> idGreaterThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
@ -190,8 +183,10 @@ extension UpdateQueryWhere on QueryBuilder<Update, Update, QWhereClause> {
});
}
QueryBuilder<Update, Update, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
QueryBuilder<Update, Update, QAfterWhereClause> idLessThan(
Id id, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
@ -206,12 +201,14 @@ extension UpdateQueryWhere on QueryBuilder<Update, Update, QWhereClause> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
return query.addWhereClause(
IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
),
);
});
}
}
@ -219,17 +216,17 @@ extension UpdateQueryWhere on QueryBuilder<Update, Update, QWhereClause> {
extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'chapterName',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'chapterName'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'chapterName',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'chapterName'),
);
});
}
@ -238,11 +235,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.equalTo(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -252,12 +251,14 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -267,12 +268,14 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -284,14 +287,16 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'chapterName',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'chapterName',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
),
);
});
}
@ -300,11 +305,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.startsWith(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -313,69 +320,75 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.endsWith(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.contains(
property: r'chapterName',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'chapterName',
wildcard: pattern,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.matches(
property: r'chapterName',
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'chapterName',
value: '',
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'chapterName', value: ''),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> chapterNameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'chapterName',
value: '',
));
return query.addFilterCondition(
FilterCondition.greaterThan(property: r'chapterName', value: ''),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'date',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'date'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'date',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'date'),
);
});
}
@ -384,11 +397,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.equalTo(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -398,12 +413,14 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -413,12 +430,14 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -430,14 +449,16 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'date',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'date',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
),
);
});
}
@ -446,11 +467,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.startsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
@ -459,77 +482,83 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.endsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateContains(String value,
{bool caseSensitive = true}) {
QueryBuilder<Update, Update, QAfterFilterCondition> dateContains(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.contains(
property: r'date',
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'date',
wildcard: pattern,
caseSensitive: caseSensitive,
));
return query.addFilterCondition(
FilterCondition.matches(
property: r'date',
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: '',
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'date', value: ''),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> dateIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'date',
value: '',
));
return query.addFilterCondition(
FilterCondition.greaterThan(property: r'date', value: ''),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'id'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'id'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> idEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'id', value: value),
);
});
}
@ -538,11 +567,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -551,11 +582,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
),
);
});
}
@ -566,39 +599,41 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> mangaIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'mangaId',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'mangaId'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> mangaIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'mangaId',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'mangaId'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> mangaIdEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'mangaId', value: value),
);
});
}
@ -607,11 +642,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'mangaId',
value: value,
),
);
});
}
@ -620,11 +657,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'mangaId',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'mangaId',
value: value,
),
);
});
}
@ -635,39 +674,41 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'mangaId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'mangaId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> updatedAtIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNull(property: r'updatedAt'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> updatedAtIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'updatedAt',
));
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'updatedAt'),
);
});
}
QueryBuilder<Update, Update, QAfterFilterCondition> updatedAtEqualTo(
int? value) {
int? value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.equalTo(property: r'updatedAt', value: value),
);
});
}
@ -676,11 +717,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.greaterThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -689,11 +732,13 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
));
return query.addFilterCondition(
FilterCondition.lessThan(
include: include,
property: r'updatedAt',
value: value,
),
);
});
}
@ -704,13 +749,15 @@ extension UpdateQueryFilter on QueryBuilder<Update, Update, QFilterCondition> {
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
return query.addFilterCondition(
FilterCondition.between(
property: r'updatedAt',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
),
);
});
}
}
@ -719,7 +766,8 @@ extension UpdateQueryObject on QueryBuilder<Update, Update, QFilterCondition> {}
extension UpdateQueryLinks on QueryBuilder<Update, Update, QFilterCondition> {
QueryBuilder<Update, Update, QAfterFilterCondition> chapter(
FilterQuery<Chapter> q) {
FilterQuery<Chapter> q,
) {
return QueryBuilder.apply(this, (query) {
return query.link(q, r'chapter');
});
@ -845,15 +893,17 @@ extension UpdateQuerySortThenBy on QueryBuilder<Update, Update, QSortThenBy> {
}
extension UpdateQueryWhereDistinct on QueryBuilder<Update, Update, QDistinct> {
QueryBuilder<Update, Update, QDistinct> distinctByChapterName(
{bool caseSensitive = true}) {
QueryBuilder<Update, Update, QDistinct> distinctByChapterName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'chapterName', caseSensitive: caseSensitive);
});
}
QueryBuilder<Update, Update, QDistinct> distinctByDate(
{bool caseSensitive = true}) {
QueryBuilder<Update, Update, QDistinct> distinctByDate({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'date', caseSensitive: caseSensitive);
});

File diff suppressed because it is too large Load diff

View file

@ -34,9 +34,7 @@ abstract class _$AnimeStreamController
extends BuildlessAutoDisposeNotifier<void> {
late final Chapter episode;
void build({
required Chapter episode,
});
void build({required Chapter episode});
}
/// See also [AnimeStreamController].
@ -49,21 +47,15 @@ class AnimeStreamControllerFamily extends Family<void> {
const AnimeStreamControllerFamily();
/// See also [AnimeStreamController].
AnimeStreamControllerProvider call({
required Chapter episode,
}) {
return AnimeStreamControllerProvider(
episode: episode,
);
AnimeStreamControllerProvider call({required Chapter episode}) {
return AnimeStreamControllerProvider(episode: episode);
}
@override
AnimeStreamControllerProvider getProviderOverride(
covariant AnimeStreamControllerProvider provider,
) {
return call(
episode: provider.episode,
);
return call(episode: provider.episode);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -85,21 +77,19 @@ class AnimeStreamControllerFamily extends Family<void> {
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({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, {
@ -114,12 +104,8 @@ class AnimeStreamControllerProvider
final Chapter episode;
@override
void runNotifierBuild(
covariant AnimeStreamController notifier,
) {
return notifier.build(
episode: episode,
);
void runNotifierBuild(covariant AnimeStreamController notifier) {
return notifier.build(episode: episode);
}
@override
@ -140,7 +126,7 @@ class AnimeStreamControllerProvider
@override
AutoDisposeNotifierProviderElement<AnimeStreamController, void>
createElement() {
createElement() {
return _AnimeStreamControllerProviderElement(this);
}
@ -173,5 +159,6 @@ class _AnimeStreamControllerProviderElement
@override
Chapter get episode => (origin as AnimeStreamControllerProvider).episode;
}
// 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

@ -11,16 +11,19 @@ String _$subtitleSettingsStateHash() =>
/// 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,
);
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

View file

@ -1,6 +1,7 @@
import 'dart:io';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:mangayomi/modules/anime/widgets/custom_track_shape.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart';
@ -9,6 +10,7 @@ class CustomSeekBar extends StatefulWidget {
final Duration? delta;
final Function(Duration)? onSeekStart;
final Function(Duration)? onSeekEnd;
final ValueNotifier<List<(String, int)>> chapterMarks;
const CustomSeekBar({
super.key,
@ -16,6 +18,7 @@ class CustomSeekBar extends StatefulWidget {
this.onSeekEnd,
required this.player,
this.delta,
required this.chapterMarks,
});
@override
@ -90,6 +93,14 @@ class CustomSeekBarState extends State<CustomSeekBar> {
data: SliderTheme.of(context).copyWith(
trackHeight: isDesktop ? null : 3,
overlayShape: const RoundSliderOverlayShape(overlayRadius: 5.0),
trackShape: CustomTrackShape(
currentPosition: clampedValue,
bufferPosition: max(buffer.inMilliseconds.toDouble(), 0),
maxValue: maxValue < 1 ? 1 : maxValue,
minValue: 0,
chapterMarks: widget.chapterMarks.value,
chapterMarkWidth: 10,
),
),
child: Slider(
max: maxValue,

View file

@ -0,0 +1,200 @@
import 'dart:math';
import 'package:flutter/material.dart';
class CustomTrackShape extends SliderTrackShape {
final double maxValue;
final double minValue;
final double currentPosition;
final double bufferPosition;
final List<(String, int)> chapterMarks;
final double chapterMarkWidth;
double trackWidth;
CustomTrackShape({
required this.maxValue,
required this.minValue,
required this.currentPosition,
required this.bufferPosition,
required this.chapterMarks,
this.chapterMarkWidth = 3,
this.trackWidth = 5,
});
@override
Rect getPreferredRect({
required RenderBox parentBox,
Offset offset = Offset.zero,
required SliderThemeData sliderTheme,
bool? isEnabled,
bool? isDiscrete,
}) {
final double thumbWidth = sliderTheme.thumbShape!
.getPreferredSize(isEnabled ?? true, isDiscrete ?? false)
.width;
final double trackHeight = sliderTheme.trackHeight!;
final double trackTop =
offset.dy + (parentBox.size.height - trackHeight) / 2;
final double trackLeft = offset.dx + thumbWidth / 2;
trackWidth = parentBox.size.width - thumbWidth;
return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
}
@override
void paint(
PaintingContext context,
Offset offset, {
required RenderBox parentBox,
required SliderThemeData sliderTheme,
required Animation<double> enableAnimation,
required Offset thumbCenter,
Offset? secondaryOffset,
bool? isEnabled,
bool? isDiscrete,
required TextDirection textDirection,
}) {
if (sliderTheme.trackHeight == 0) return;
final Rect trackRect = getPreferredRect(
parentBox: parentBox,
offset: offset,
sliderTheme: sliderTheme,
isEnabled: isEnabled,
isDiscrete: isDiscrete,
);
double currentPositionWidth = (trackWidth / maxValue) * currentPosition;
double bufferPositionWidth = (trackWidth / maxValue) * bufferPosition;
_drawActiveThumb(context, sliderTheme, trackRect, currentPositionWidth);
_drawBufferThumb(
context,
sliderTheme,
trackRect,
currentPositionWidth,
bufferPositionWidth,
);
_drawInactiveThumb(context, sliderTheme, trackRect, currentPositionWidth);
for (final mark in chapterMarks) {
double markPositionWidth = (trackWidth / maxValue) * mark.$2;
_drawChapterMark(context, sliderTheme, trackRect, markPositionWidth);
}
}
void _drawActiveThumb(
PaintingContext context,
SliderThemeData sliderTheme,
Rect trackRect,
double currentPositionWidth,
) {
final Paint defaultPathPaint = Paint()
..color = sliderTheme.activeTrackColor!
..style = PaintingStyle.fill;
final defaultPathSegment = Path()
..addRect(
Rect.fromPoints(
Offset(trackRect.left, trackRect.top),
Offset(trackRect.left + currentPositionWidth, trackRect.bottom),
),
)
..lineTo(trackRect.left, trackRect.bottom)
..arcTo(
Rect.fromPoints(
Offset(trackRect.left + 5, trackRect.top),
Offset(trackRect.left - 5, trackRect.bottom),
),
-pi * 3 / 2,
pi,
false,
);
context.canvas.drawPath(defaultPathSegment, defaultPathPaint);
}
void _drawBufferThumb(
PaintingContext context,
SliderThemeData sliderTheme,
Rect trackRect,
double currentPositionWidth,
double bufferPositionWidth,
) {
final Paint defaultPathPaint = Paint()
..color = sliderTheme.secondaryActiveTrackColor!
..style = PaintingStyle.fill;
final defaultPathSegment = Path()
..addRect(
Rect.fromPoints(
Offset(trackRect.left + currentPositionWidth, trackRect.top),
Offset(trackRect.left + bufferPositionWidth, trackRect.bottom),
),
)
..lineTo(trackRect.left, trackRect.bottom)
..arcTo(
Rect.fromPoints(
Offset(trackRect.left + 5, trackRect.top),
Offset(trackRect.left - 5, trackRect.bottom),
),
-pi * 3 / 2,
pi,
false,
);
context.canvas.drawPath(defaultPathSegment, defaultPathPaint);
}
void _drawInactiveThumb(
PaintingContext context,
SliderThemeData sliderTheme,
Rect trackRect,
double currentPositionWidth,
) {
final unselectedPathPaint = Paint()
..style = PaintingStyle.fill
..color = sliderTheme.inactiveTrackColor!;
final unselectedPathSegment = Path()
..addRect(
Rect.fromPoints(
Offset(trackRect.right, trackRect.top),
Offset(trackRect.left + currentPositionWidth, trackRect.bottom),
),
)
..addArc(
Rect.fromPoints(
Offset(trackRect.right - 5, trackRect.bottom),
Offset(trackRect.right + 5, trackRect.top),
),
-pi / 2,
pi,
);
context.canvas.drawPath(unselectedPathSegment, unselectedPathPaint);
}
void _drawChapterMark(
PaintingContext context,
SliderThemeData sliderTheme,
Rect trackRect,
double markPositionWidth,
) {
final Paint borderPaint = Paint()
..color = Colors.white
..style = PaintingStyle.fill;
final pathSegmentSelected = Path()
..addRect(
Rect.fromPoints(
Offset(trackRect.left + markPositionWidth, trackRect.top),
Offset(
trackRect.left + markPositionWidth + chapterMarkWidth,
trackRect.bottom,
),
),
);
context.canvas.drawPath(pathSegmentSelected, borderPaint);
}
}

View file

@ -9,6 +9,7 @@ import 'package:mangayomi/modules/anime/providers/anime_player_controller_provid
import 'package:mangayomi/modules/anime/widgets/custom_seekbar.dart';
import 'package:mangayomi/modules/anime/widgets/subtitle_view.dart';
import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart';
import 'package:window_manager/window_manager.dart';
@ -24,6 +25,7 @@ class DesktopControllerWidget extends ConsumerStatefulWidget {
final Widget seekToWidget;
final int defaultSkipIntroLength;
final void Function(bool) desktopFullScreenPlayer;
final ValueNotifier<List<(String, int)>> chapterMarks;
const DesktopControllerWidget({
super.key,
required this.videoController,
@ -36,6 +38,7 @@ class DesktopControllerWidget extends ConsumerStatefulWidget {
required this.doubleSpeed,
required this.defaultSkipIntroLength,
required this.desktopFullScreenPlayer,
required this.chapterMarks,
});
@override
@ -215,6 +218,48 @@ class _DesktopControllerWidgetState
final desktopFullScreenPlayer = widget.desktopFullScreenPlayer;
await _changeFullScreen(ref, desktopFullScreenPlayer, value: false);
},
const SingleActivator(LogicalKeyboardKey.digit0, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"clear_anime",
]);
},
const SingleActivator(LogicalKeyboardKey.digit1, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_a",
]);
},
const SingleActivator(LogicalKeyboardKey.digit2, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_b",
]);
},
const SingleActivator(LogicalKeyboardKey.digit3, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_c",
]);
},
const SingleActivator(LogicalKeyboardKey.digit4, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_aa",
]);
},
const SingleActivator(LogicalKeyboardKey.digit5, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_bb",
]);
},
const SingleActivator(LogicalKeyboardKey.digit6, control: true): () {
(widget.videoController.player.platform as NativePlayer).command([
"script-message",
"set_anime_ca",
]);
},
},
child: Stack(
children: [
@ -439,6 +484,7 @@ class _DesktopControllerWidgetState
widget.tempDuration(null);
},
player: widget.videoController.player,
chapterMarks: widget.chapterMarks,
),
),
),

View file

@ -24,6 +24,7 @@ class MobileControllerWidget extends ConsumerStatefulWidget {
final Widget topButtonBarWidget;
final GlobalKey<VideoState> videoStatekey;
final Widget bottomButtonBarWidget;
final ValueNotifier<List<(String, int)>> chapterMarks;
const MobileControllerWidget({
super.key,
required this.videoController,
@ -32,6 +33,7 @@ class MobileControllerWidget extends ConsumerStatefulWidget {
required this.streamController,
required this.videoStatekey,
required this.doubleSpeed,
required this.chapterMarks,
});
@override
@ -464,6 +466,7 @@ class _MobileControllerWidgetState
});
},
player: widget.videoController.player,
chapterMarks: widget.chapterMarks,
),
),
widget.bottomButtonBarWidget,
@ -491,6 +494,7 @@ class _MobileControllerWidgetState
child: CustomSeekBar(
delta: _seekBarDeltaValueNotifier,
player: widget.videoController.player,
chapterMarks: widget.chapterMarks,
),
),
],

View file

@ -0,0 +1,439 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
import 'package:mangayomi/modules/widgets/error_text.dart';
import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/services/fetch_subtitles.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/services/http/rhttp/src/model/settings.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
import 'package:mangayomi/utils/log/logger.dart';
import 'package:path/path.dart' as path;
import 'package:super_sliver_list/super_sliver_list.dart';
class SubtitlesWidgetSearch extends ConsumerStatefulWidget {
final Chapter chapter;
final bool isLocal;
const SubtitlesWidgetSearch({
required this.chapter,
required this.isLocal,
super.key,
});
@override
ConsumerState<SubtitlesWidgetSearch> createState() =>
_SubtitlesWidgetSearchState();
}
class _SubtitlesWidgetSearchState extends ConsumerState<SubtitlesWidgetSearch> {
late final _controller = TextEditingController(text: query);
List<ImdbTitle> titles = [];
List<ImdbEpisode>? episodes;
List<ImdbSubtitle>? subtitles;
late String query = widget.chapter.manga.value?.name?.trim() ?? "";
bool hide = false;
bool _isLoading = true;
String? _errorMsg;
@override
initState() {
super.initState();
_init();
}
_init() async {
await Future.delayed(const Duration(microseconds: 100));
try {
titles = await fetchImdbTitles(query);
} catch (e) {
_errorMsg = e.toString();
}
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
color: Theme.of(context).scaffoldBackgroundColor,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
clipBehavior: Clip.antiAliasWithSaveLayer,
child: _isLoading
? SizedBox(
height: context.height(0.3),
child: Padding(
padding: const EdgeInsets.all(20),
child: const ProgressCenter(),
),
)
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: SizedBox(
height: context.height(0.8),
child: Column(
mainAxisAlignment: _errorMsg != null
? MainAxisAlignment.center
: MainAxisAlignment.start,
children: [
if (subtitles != null || episodes != null)
IconButton(
onPressed: () {
setState(() {
if (subtitles != null) {
subtitles = null;
} else if (episodes != null) {
episodes = null;
}
});
},
icon: const Icon(Icons.keyboard_arrow_left),
),
if (_errorMsg != null)
Padding(
padding: const EdgeInsets.all(30),
child: ErrorText(_errorMsg!),
),
if (_errorMsg == null && !hide)
Flexible(child: _showImdbList(context)),
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextFormField(
onTap: () {
if (Platform.isAndroid || Platform.isIOS) {
setState(() {
hide = true;
});
}
},
controller: _controller,
keyboardType: TextInputType.text,
onChanged: (d) {
setState(() {
query = d;
});
},
onFieldSubmitted: (d) async {
setState(() {
_isLoading = true;
_errorMsg = null;
subtitles = null;
episodes = null;
});
try {
titles = await fetchImdbTitles(query);
} catch (e) {
_errorMsg = e.toString();
hide = false;
}
if (mounted) {
setState(() {
_isLoading = false;
hide = false;
});
}
},
decoration: InputDecoration(
isDense: true,
filled: true,
fillColor: Colors.transparent,
suffixIcon: query.isEmpty
? null
: IconButton(
onPressed: () {
_controller.clear();
},
icon: const Icon(Icons.clear),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: context.primaryColor),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: context.primaryColor),
),
border: OutlineInputBorder(
borderSide: BorderSide(color: context.primaryColor),
),
),
),
),
],
),
),
),
);
}
Widget _showImdbList(BuildContext context) {
return SuperListView.separated(
padding: const EdgeInsets.only(top: 20),
itemCount: subtitles?.length ?? episodes?.length ?? titles.length,
itemBuilder: (context, index) {
final isSubtitles = subtitles != null;
final isEpisodes = episodes != null;
return Padding(
padding: const EdgeInsets.only(top: 5),
child: InkWell(
onTap: () async {
if (isSubtitles) {
Navigator.pop(context, subtitles![index]);
} else {
setState(() {
_isLoading = true;
_errorMsg = null;
});
try {
if (isEpisodes) {
subtitles = await fetchImdbSubtitles(episodes![index].id);
} else {
episodes = await fetchImdbEpisodes(titles[index].id);
if (episodes == null || episodes!.isEmpty) {
subtitles = await fetchImdbSubtitles(titles[index].id);
}
}
} catch (e) {
_errorMsg = e.toString();
}
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
},
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (!isSubtitles && !isEpisodes)
Material(
borderRadius: BorderRadius.circular(5),
color: Colors.transparent,
clipBehavior: Clip.antiAliasWithSaveLayer,
child: Ink.image(
height: 120,
width: 80,
fit: BoxFit.cover,
image: titles[index].primaryImage != null
? CustomExtendedNetworkImageProvider(
titles[index].primaryImage!,
)
: const AssetImage('assets/transparent.png'),
),
),
const SizedBox(width: 10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: context.width(0.6),
child: Text(
isSubtitles
? "${subtitles![index].name} (${subtitles![index].displayLang}) - ${subtitles![index].format?.toUpperCase() ?? "Unknown"} - ${subtitles![index].encoding ?? "Unknown"}"
: isEpisodes
? "S${episodes![index].season}E${episodes![index].episode}: ${episodes![index].title}"
: titles[index].primaryTitle,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
if (!isSubtitles && !isEpisodes)
Row(
children: [
const Text(
"Rating : ",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
Text(
titles[index].aggregateRating?.toStringAsFixed(
2,
) ??
"?",
style: const TextStyle(fontSize: 12),
),
],
),
if (!isSubtitles && !isEpisodes)
Row(
children: [
const Text(
"Votes : ",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
Text(
titles[index].voteCount?.toString() ?? "?",
style: const TextStyle(fontSize: 12),
),
],
),
if (!isSubtitles && !isEpisodes)
Row(
children: [
const Text(
"Date : ",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
Text(
"${titles[index].startYear?.toString() ?? "?"} - ${titles[index].endYear?.toString() ?? "?"}",
style: const TextStyle(fontSize: 12),
),
],
),
],
),
if (isSubtitles && widget.isLocal)
OutlinedButton.icon(
onPressed: () async => _downloadSubtitle(index),
label: Text(context.l10n.download),
icon: Icon(Icons.download_outlined),
),
],
),
],
),
),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider();
},
);
}
Future<void> _downloadSubtitle(int index) async {
botToast(context.l10n.started);
try {
final subtitle = subtitles![index];
final storageProvider = StorageProvider();
final chapterDirectory = (await storageProvider.getMangaChapterDirectory(
widget.chapter,
))!;
final subtitleFile = File(
path.join(
'${chapterDirectory.path}_subtitles',
'${subtitle.language}.srt',
),
);
final client = MClient.httpClient(
settings: const ClientSettings(
throwOnStatusCode: false,
tlsSettings: TlsSettings(verifyCertificates: false),
),
);
await subtitleFile.create(recursive: true);
final response = await _withRetry(
() => client.get(Uri.parse(subtitle.url ?? '')),
);
if (response.statusCode != 200) {
AppLogger.log(
'Warning: Failed to download subtitle file: ${subtitle.language}',
);
return;
}
AppLogger.log('Subtitle file downloaded: ${subtitle.language}');
await subtitleFile.writeAsBytes(response.bodyBytes);
if (mounted) {
botToast(context.l10n.finished(""));
}
} catch (e) {
AppLogger.log("Failed to download subtitle:", logLevel: LogLevel.error);
AppLogger.log(e.toString(), logLevel: LogLevel.error);
if (mounted) {
botToast(context.l10n.failed);
}
}
}
Future<T> _withRetry<T>(Future<T> Function() operation) async {
int attempts = 0;
while (true) {
try {
attempts++;
return await operation();
} catch (e) {
if (attempts >= 3) {
AppLogger.log("Request retries failed", logLevel: LogLevel.error);
}
}
}
}
}
subtitlesSearchraggableMenu(
BuildContext context, {
required Chapter chapter,
required bool isLocal,
}) async {
var padding = MediaQuery.of(context).padding;
return await showDialog(
context: context,
builder: (context) => Scaffold(
backgroundColor: Colors.transparent,
body: SingleChildScrollView(
child: SizedBox(
height: context.height(1) - padding.top - padding.bottom,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
decoration: BoxDecoration(
color: Theme.of(context).scaffoldBackgroundColor,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: const Icon(Icons.clear),
),
),
],
),
],
),
),
SubtitlesWidgetSearch(chapter: chapter, isLocal: isLocal),
],
),
),
),
),
);
}

View file

@ -124,12 +124,14 @@ class _BrowseScreenState extends ConsumerState<BrowseScreen>
} else {
context.push(
'/globalSearch',
extra:
switch (_tabList[_tabBarController.index]) {
"manga" => ItemType.manga,
"anime" => ItemType.anime,
_ => ItemType.novel,
},
extra: (
null,
switch (_tabList[_tabBarController.index]) {
"manga" => ItemType.manga,
"anime" => ItemType.anime,
_ => ItemType.novel,
},
),
);
}
},

View file

@ -9,6 +9,7 @@ import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/manga/home/widget/filter_widget.dart';
import 'package:mangayomi/modules/more/settings/appearance/providers/app_font_family.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/get_detail.dart';
import 'package:mangayomi/services/get_filter_list.dart';
@ -314,6 +315,7 @@ class _CodeEditorPageState extends ConsumerState<CodeEditorPage> {
if (source != null) {
final service = getExtensionService(
source!,
ref.read(androidProxyServerStateProvider),
);
try {

View file

@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_qjs/quickjs/ffi.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
@ -66,6 +68,9 @@ class _ExtensionScreenState extends ConsumerState<ExtensionScreen> {
final streamExtensions = ref.watch(
getExtensionsStreamProvider(widget.itemType),
);
final repositories = ref.watch(
extensionsRepoStateProvider(widget.itemType),
);
final l10n = l10nLocalizations(context)!;
@ -92,6 +97,12 @@ class _ExtensionScreenState extends ConsumerState<ExtensionScreen> {
final notInstalledEntries = <Source>[];
for (var element in filteredData) {
if (repositories
.firstWhereOrNull((e) => e == element.repo)
?.hidden ??
false) {
continue;
}
final isLatestVersion = element.version == element.versionLast;
if (compareVersions(

View file

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
@ -11,6 +13,22 @@ void setPreferenceSetting(SourcePreference sourcePreference, Source source) {
.keyEqualTo(sourcePreference.key)
.findFirstSync();
isar.writeTxnSync(() {
if (source.sourceCodeLanguage == SourceCodeLanguage.mihon &&
source.preferenceList != null) {
final prefs = (jsonDecode(source.preferenceList!) as List)
.map((e) => SourcePreference.fromJson(e))
.toList();
final idx = prefs.indexWhere((e) => e.key == sourcePreference.key);
if (idx != -1) {
prefs[idx] = sourcePreference..id = null;
isar.sources.putSync(
source
..preferenceList = jsonEncode(
prefs.map((e) => e.toJson()).toList(),
),
);
}
}
if (sourcePref != null) {
isar.sourcePreferences.putSync(sourcePreference);
} else {

View file

@ -1,6 +1,7 @@
import 'package:isar/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';
@ -12,6 +13,11 @@ Stream<List<Source>> getExtensionsStream(Ref ref, ItemType itemType) async* {
.filter()
.idIsNotNull()
.and()
.group(
(q) => q.repoIsNull().or().repo(
(q) => q.hiddenIsNull().or().hiddenEqualTo(false),
),
)
.isActiveEqualTo(true)
.itemTypeEqualTo(itemType)
.watch(fireImmediately: true);

View file

@ -7,7 +7,7 @@ part of 'extensions_provider.dart';
// **************************************************************************
String _$getExtensionsStreamHash() =>
r'3c5d6625c40c222f25fc8141df078dd46bcc762f';
r'af34092ebf31c784010110af746e3ee2731297bd';
/// Copied from Dart SDK
class _SystemHash {
@ -40,21 +40,15 @@ class GetExtensionsStreamFamily extends Family<AsyncValue<List<Source>>> {
const GetExtensionsStreamFamily();
/// See also [getExtensionsStream].
GetExtensionsStreamProvider call(
ItemType itemType,
) {
return GetExtensionsStreamProvider(
itemType,
);
GetExtensionsStreamProvider call(ItemType itemType) {
return GetExtensionsStreamProvider(itemType);
}
@override
GetExtensionsStreamProvider getProviderOverride(
covariant GetExtensionsStreamProvider provider,
) {
return call(
provider.itemType,
);
return call(provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -76,24 +70,19 @@ class GetExtensionsStreamFamily extends Family<AsyncValue<List<Source>>> {
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(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, {
@ -159,5 +148,6 @@ class _GetExtensionsStreamProviderElement
@override
ItemType get itemType => (origin as GetExtensionsStreamProvider).itemType;
}
// 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,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/changed.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
import 'package:mangayomi/services/fetch_item_sources.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
@ -56,24 +61,126 @@ class _ExtensionListTileWidgetState
}
Widget _buildTrailingButton(BuildContext context, String label) {
return TextButton(
onPressed: _isLoading
? null
: () {
if (!_updateAvailable && _sourceNotEmpty) {
context.push('/extension_detail', extra: widget.source);
} else {
_handleSourceFetch();
}
},
child: _isLoading
? const SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator(strokeWidth: 2.0),
)
: Text(label),
);
final isInstall = label == context.l10n.install;
final isUpdate = label == context.l10n.update;
return _isLoading
? const SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator(strokeWidth: 2.0),
)
: Row(
mainAxisSize: MainAxisSize.min,
children: [
TextButton(
onPressed: _isLoading
? null
: () {
if (!_updateAvailable && _sourceNotEmpty) {
context.push(
'/extension_detail',
extra: widget.source,
);
} else {
_handleSourceFetch();
}
},
child: Icon(
isInstall
? Icons.download_outlined
: isUpdate
? Icons.system_update_alt_outlined
: Icons.settings_outlined,
size: 24,
),
),
if (_sourceNotEmpty)
TextButton(
onPressed: () {
showDialog(
context: context,
builder: (ctx) {
return AlertDialog(
title: Text(widget.source.name!),
content: Text(
ctx.l10n.uninstall_extension(widget.source.name!),
),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () {
Navigator.pop(ctx);
},
child: Text(ctx.l10n.cancel),
),
const SizedBox(width: 15),
TextButton(
onPressed: () {
final sourcePrefsIds = isar
.sourcePreferences
.filter()
.sourceIdEqualTo(widget.source.id!)
.findAllSync()
.map((e) => e.id!)
.toList();
final sourcePrefsStringIds = isar
.sourcePreferenceStringValues
.filter()
.sourceIdEqualTo(widget.source.id!)
.findAllSync()
.map((e) => e.id)
.toList();
isar.writeTxnSync(() {
if (widget.source.isObsolete ?? false) {
isar.sources.deleteSync(
widget.source.id!,
);
ref
.read(
synchingProvider(
syncId: 1,
).notifier,
)
.addChangedPart(
ActionType.removeExtension,
widget.source.id,
"{}",
false,
);
} else {
isar.sources.putSync(
widget.source
..sourceCode = ""
..isAdded = false
..isPinned = false
..updatedAt = DateTime.now()
.millisecondsSinceEpoch,
);
}
isar.sourcePreferences.deleteAllSync(
sourcePrefsIds,
);
isar.sourcePreferenceStringValues
.deleteAllSync(sourcePrefsStringIds);
});
Navigator.pop(ctx);
},
child: Text(ctx.l10n.ok),
),
],
),
],
);
},
);
},
child: Icon(Icons.delete_outline, size: 24),
),
],
);
}
@override

View file

@ -45,15 +45,15 @@ class _SourcePreferenceWidgetState extends State<SourcePreferenceWidget> {
showDialog(
context: context,
builder: (context) => EditTextDialogWidget(
text: pref.value!,
text: pref.value ?? "",
onChanged: (value) {
setState(() {
pref.value = value;
});
setPreferenceSetting(preference, widget.source);
},
dialogTitle: pref.dialogTitle!,
dialogMessage: pref.dialogMessage!,
dialogTitle: pref.dialogTitle ?? "",
dialogMessage: pref.dialogMessage ?? "",
),
);
},
@ -127,23 +127,25 @@ class _SourcePreferenceWidgetState extends State<SourcePreferenceWidget> {
),
content: SizedBox(
width: context.width(0.8),
child: SuperListView.builder(
shrinkWrap: true,
itemCount: pref.entries!.length,
itemBuilder: (context, index) {
return RadioListTile(
dense: true,
contentPadding: const EdgeInsets.all(0),
value: index,
groupValue: pref.valueIndex,
onChanged: (value) {
Navigator.pop(context, index);
},
title: Row(
children: [Text(pref.entries![index])],
),
);
child: RadioGroup(
groupValue: pref.valueIndex,
onChanged: (value) {
Navigator.pop(context, value);
},
child: SuperListView.builder(
shrinkWrap: true,
itemCount: pref.entries!.length,
itemBuilder: (context, index) {
return RadioListTile(
dense: true,
contentPadding: const EdgeInsets.all(0),
value: index,
title: Row(
children: [Text(pref.entries![index])],
),
);
},
),
),
),
actions: [

View file

@ -24,15 +24,16 @@ import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart';
import 'package:super_sliver_list/super_sliver_list.dart';
class GlobalSearchScreen extends ConsumerStatefulWidget {
final String? search;
final ItemType itemType;
const GlobalSearchScreen({required this.itemType, super.key});
const GlobalSearchScreen({this.search, required this.itemType, super.key});
@override
ConsumerState<GlobalSearchScreen> createState() => _GlobalSearchScreenState();
}
class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
String query = "";
String _query = "";
final _textEditingController = TextEditingController();
late final List<Source> sourceList =
ref.read(onlyIncludePinnedSourceStateProvider)
@ -50,8 +51,17 @@ class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
.and()
.itemTypeEqualTo(widget.itemType)
.findAllSync();
@override
void initState() {
super.initState();
_textEditingController.text = widget.search ?? "";
}
@override
Widget build(BuildContext context) {
final query = _query.isNotEmpty ? _query : widget.search ?? "";
return Scaffold(
appBar: AppBar(
leading: Container(),
@ -62,27 +72,27 @@ class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
Navigator.pop(context);
},
onFieldSubmitted: (value) async {
if (!(query == _textEditingController.text)) {
if (!(_query == _textEditingController.text)) {
setState(() {
query = "";
_query = "";
});
await Future.delayed(const Duration(milliseconds: 10));
setState(() {
query = value;
_query = value;
});
}
},
onSuffixPressed: () {
_textEditingController.clear();
setState(() {
query = "";
_query = "";
});
},
controller: _textEditingController,
),
],
),
body: query.isNotEmpty
body: _query.isNotEmpty || widget.search != null
? SuperListView.builder(
itemCount: sourceList.length,
extentPrecalculationPolicy: SuperPrecalculationPolicy(),
@ -90,7 +100,11 @@ class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
final source = sourceList[index];
return SizedBox(
height: 260,
child: SourceSearchScreen(query: query, source: source),
child: SourceSearchScreen(
key: ValueKey(query),
query: query,
source: source,
),
);
},
)
@ -105,7 +119,7 @@ class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
}
}
class SourceSearchScreen extends StatefulWidget {
class SourceSearchScreen extends ConsumerStatefulWidget {
final String query;
final Source source;
@ -116,10 +130,10 @@ class SourceSearchScreen extends StatefulWidget {
});
@override
State<SourceSearchScreen> createState() => _SourceSearchScreenState();
ConsumerState<SourceSearchScreen> createState() => _SourceSearchScreenState();
}
class _SourceSearchScreenState extends State<SourceSearchScreen> {
class _SourceSearchScreenState extends ConsumerState<SourceSearchScreen> {
@override
void initState() {
super.initState();
@ -132,11 +146,13 @@ class _SourceSearchScreenState extends State<SourceSearchScreen> {
_init() async {
try {
_errorMessage = "";
pages = await search(
source: widget.source,
page: 1,
query: widget.query,
filterList: [],
pages = await ref.read(
searchProvider(
source: widget.source,
page: 1,
query: widget.query,
filterList: [],
).future,
);
if (mounted) {
setState(() {
@ -247,6 +263,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
itemType: widget.source.itemType,
useMaterialRoute: true,
source: widget.source.name!,
sourceId: widget.source.id,
);
},
child: StreamBuilder(
@ -282,6 +299,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
headersProvider(
source: widget.source.name!,
lang: widget.source.lang!,
sourceId: widget.source.id,
),
),
imageUrl: toImgUrl(

View file

@ -0,0 +1,430 @@
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:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/calendar/providers/calendar_provider.dart';
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/utils/constant.dart';
import 'package:mangayomi/utils/date.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
import 'package:mangayomi/utils/headers.dart';
import 'package:table_calendar/table_calendar.dart';
class CalendarScreen extends ConsumerStatefulWidget {
final ItemType? itemType;
const CalendarScreen({super.key, this.itemType});
@override
ConsumerState<CalendarScreen> createState() => _CalendarScreenState();
}
class _CalendarScreenState extends ConsumerState<CalendarScreen> {
late final ValueNotifier<List<Manga>> _selectedEntries;
CalendarFormat _calendarFormat = CalendarFormat.month;
RangeSelectionMode _rangeSelectionMode = RangeSelectionMode.toggledOff;
final firstDay = DateTime.now();
final lastDay = DateTime.now().add(const Duration(days: 1000));
DateTime _focusedDay = DateTime.now();
DateTime? _selectedDay;
DateTime? _rangeStart;
DateTime? _rangeEnd;
late ItemType? itemType = widget.itemType ?? ItemType.manga;
@override
void initState() {
super.initState();
_selectedDay = _focusedDay;
_selectedEntries = ValueNotifier([]);
}
@override
void dispose() {
_selectedEntries.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
final locale = ref.watch(l10nLocaleStateProvider);
final data = ref.watch(getCalendarStreamProvider(itemType: itemType));
return Scaffold(
appBar: AppBar(title: Text(l10n.calendar)),
body: data.when(
data: (data) {
if (_selectedDay != null) {
_selectedEntries.value = _getEntriesForDay(_selectedDay!, data);
}
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: CustomScrollView(
slivers: [
SliverToBoxAdapter(
child: Column(
children: [
ListTile(
title: Padding(
padding: const EdgeInsets.symmetric(vertical: 3),
child: Row(
children: [
Icon(
Icons.warning_amber_outlined,
color: context.secondaryColor,
),
const SizedBox(width: 10),
Flexible(
child: Text(
l10n.calendar_info,
softWrap: true,
overflow: TextOverflow.clip,
style: TextStyle(
fontSize: 13,
color: context.secondaryColor,
),
),
),
],
),
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(
children: [
Expanded(
child: SegmentedButton(
emptySelectionAllowed: true,
showSelectedIcon: false,
style: TextButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
),
segments: [
ButtonSegment(
value: ItemType.manga.index,
label: Padding(
padding: const EdgeInsets.all(12),
child: Text(l10n.manga),
),
),
ButtonSegment(
value: ItemType.anime.index,
label: Padding(
padding: const EdgeInsets.all(12),
child: Text(l10n.anime),
),
),
ButtonSegment(
value: ItemType.novel.index,
label: Padding(
padding: const EdgeInsets.all(12),
child: Text(l10n.novel),
),
),
],
selected: {itemType?.index},
onSelectionChanged: (newSelection) {
if (newSelection.isNotEmpty &&
newSelection.first != null) {
setState(() {
itemType =
ItemType.values[newSelection.first!];
});
}
},
),
),
],
),
),
TableCalendar(
firstDay: firstDay,
lastDay: lastDay,
focusedDay: _focusedDay,
locale: locale.toLanguageTag(),
selectedDayPredicate: (day) =>
isSameDay(_selectedDay, day),
rangeStartDay: _rangeStart,
rangeEndDay: _rangeEnd,
calendarFormat: _calendarFormat,
rangeSelectionMode: _rangeSelectionMode,
eventLoader: (day) => _getEntriesForDay(day, data),
startingDayOfWeek: StartingDayOfWeek.monday,
calendarStyle: CalendarStyle(
outsideDaysVisible: true,
weekendTextStyle: TextStyle(
color: context.primaryColor,
),
),
onDaySelected: (selectedDay, focusedDay) =>
_onDaySelected(selectedDay, focusedDay, data),
onRangeSelected: (start, end, focusedDay) =>
_onRangeSelected(start, end, focusedDay, data),
onFormatChanged: (format) {
if (_calendarFormat != format) {
setState(() {
_calendarFormat = format;
});
}
},
onPageChanged: (focusedDay) {
_focusedDay = focusedDay;
},
),
const SizedBox(height: 15),
],
),
),
ValueListenableBuilder<List<Manga>>(
valueListenable: _selectedEntries,
builder: (context, value, _) {
return CustomSliverGroupedListView<Manga, String>(
elements: value,
groupBy: (element) {
return dateFormat(
_selectedDay?.millisecondsSinceEpoch.toString() ??
DateTime.now()
.add(Duration(days: element.smartUpdateDays!))
.millisecondsSinceEpoch
.toString(),
context: context,
ref: ref,
forHistoryValue: true,
useRelativeTimesTamps: false,
);
},
groupSeparatorBuilder: (String groupByValue) => Padding(
padding: const EdgeInsets.only(bottom: 8, left: 12),
child: Row(
children: [
Text(
"${dateFormat(null, context: context, stringDate: groupByValue, ref: ref, useRelativeTimesTamps: true, showInDaysFuture: true)} - ${dateFormat(null, context: context, stringDate: groupByValue, ref: ref, useRelativeTimesTamps: false)}",
),
],
),
),
itemBuilder: (context, element) {
return CalendarListTileWidget(
manga: element,
selectedDay: _selectedDay,
);
},
order: GroupedListOrder.ASC,
);
},
),
SliverToBoxAdapter(child: const SizedBox(height: 15)),
],
),
);
},
error: (Object error, StackTrace stackTrace) {
return Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(l10n.calendar_no_data, textAlign: TextAlign.center),
),
);
},
loading: () {
return const ProgressCenter();
},
),
);
}
List<Manga> _getEntriesForDay(DateTime day, List<Manga> data) {
return data.where((e) {
final lastChapter = e.chapters
.filter()
.sortByDateUploadDesc()
.findFirstSync();
final lastDate = int.tryParse(lastChapter?.dateUpload ?? "");
final start = lastDate != null
? DateTime.fromMillisecondsSinceEpoch(lastDate)
: DateTime.now();
final temp = start.add(Duration(days: e.smartUpdateDays!));
final predictedDay = "${temp.year}-${temp.month}-${temp.day}";
final selectedDay = "${day.year}-${day.month}-${day.day}";
return predictedDay == selectedDay;
}).toList();
}
List<Manga> _getEntriesForRange(
DateTime start,
DateTime end,
List<Manga> data,
) {
final days = _daysInRange(start, end);
return [for (final d in days) ..._getEntriesForDay(d, data)];
}
void _onDaySelected(
DateTime selectedDay,
DateTime focusedDay,
List<Manga> data,
) {
if (!isSameDay(_selectedDay, selectedDay)) {
setState(() {
_selectedDay = selectedDay;
_focusedDay = focusedDay;
_rangeStart = null;
_rangeEnd = null;
_rangeSelectionMode = RangeSelectionMode.toggledOff;
});
_selectedEntries.value = _getEntriesForDay(selectedDay, data);
}
}
void _onRangeSelected(
DateTime? start,
DateTime? end,
DateTime focusedDay,
List<Manga> data,
) {
setState(() {
_selectedDay = null;
_focusedDay = focusedDay;
_rangeStart = start;
_rangeEnd = end;
_rangeSelectionMode = RangeSelectionMode.toggledOn;
});
if (start != null && end != null) {
_selectedEntries.value = _getEntriesForRange(start, end, data);
} else if (start != null) {
_selectedEntries.value = _getEntriesForDay(start, data);
} else if (end != null) {
_selectedEntries.value = _getEntriesForDay(end, data);
}
}
List<DateTime> _daysInRange(DateTime first, DateTime last) {
final dayCount = last.difference(first).inDays + 1;
return List.generate(
dayCount,
(index) => DateTime.utc(first.year, first.month, first.day + index),
);
}
}
class CalendarListTileWidget extends ConsumerWidget {
final Manga manga;
final DateTime? selectedDay;
const CalendarListTileWidget({
required this.manga,
required this.selectedDay,
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
return Material(
borderRadius: BorderRadius.circular(5),
color: Colors.transparent,
clipBehavior: Clip.antiAliasWithSaveLayer,
child: InkWell(
onTap: () => context.push('/manga-reader/detail', extra: manga.id),
onLongPress: () {},
onSecondaryTap: () {},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 5),
child: Container(
height: 45,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(5)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(5),
child: Material(
child: GestureDetector(
onTap: () {
context.push(
'/manga-reader/detail',
extra: manga.id,
);
},
child: Ink.image(
fit: BoxFit.cover,
width: 40,
height: 45,
image: manga.customCoverImage != null
? MemoryImage(
manga.customCoverImage as Uint8List,
)
as ImageProvider
: CustomExtendedNetworkImageProvider(
toImgUrl(
manga.customCoverFromTracker ??
manga.imageUrl!,
),
headers: ref.watch(
headersProvider(
source: manga.source!,
lang: manga.lang!,
sourceId: manga.sourceId,
),
),
),
child: InkWell(child: Container()),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
manga.name!,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 14,
color: Theme.of(
context,
).textTheme.bodyLarge!.color,
),
),
Text(
context.l10n.n_chapters(
manga.chapters.countSync(),
),
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 11,
fontStyle: FontStyle.italic,
color: context.secondaryColor,
),
),
],
),
),
),
],
),
),
],
),
),
),
),
);
}
}

View file

@ -0,0 +1,23 @@
import 'package:isar/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
Stream<List<Manga>> getCalendarStream(Ref ref, {ItemType? itemType}) async* {
yield* isar.mangas
.filter()
.idIsNotNull()
.favoriteEqualTo(true)
.itemTypeEqualTo(itemType ?? ItemType.manga)
.anyOf([
Status.ongoing,
Status.unknown,
Status.publishingFinished,
], (q, status) => q.statusEqualTo(status))
.smartUpdateDaysIsNotNull()
.smartUpdateDaysGreaterThan(0)
.watch(fireImmediately: true);
}

View file

@ -0,0 +1,152 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'calendar_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$getCalendarStreamHash() => r'850d81742f8ac5ce88175732c0edf57a7a9295d4';
/// 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();
/// See also [getCalendarStream].
class GetCalendarStreamFamily extends Family<AsyncValue<List<Manga>>> {
/// See also [getCalendarStream].
const GetCalendarStreamFamily();
/// See also [getCalendarStream].
GetCalendarStreamProvider call({ItemType? itemType}) {
return GetCalendarStreamProvider(itemType: itemType);
}
@override
GetCalendarStreamProvider getProviderOverride(
covariant GetCalendarStreamProvider 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'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);
}
@override
bool operator ==(Object other) {
return other is GetCalendarStreamProvider && other.itemType == itemType;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
}
}
@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;
}
class _GetCalendarStreamProviderElement
extends AutoDisposeStreamProviderElement<List<Manga>>
with GetCalendarStreamRef {
_GetCalendarStreamProviderElement(super.provider);
@override
ItemType? get itemType => (origin as GetCalendarStreamProvider).itemType;
}
// 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

@ -64,7 +64,6 @@ class _HistoryScreenState extends ConsumerState<HistoryScreen>
}
bool _isSearch = false;
// List<History> _entriesData = []; // TODO. The variable is never used/modified
@override
Widget build(BuildContext context) {
final hideItems = ref.watch(hideItemsStateProvider);
@ -403,7 +402,11 @@ class _HistoryTabState extends ConsumerState<HistoryTab>
? Image.memory(manga.customCoverImage as Uint8List)
: cachedCompressedNetworkImage(
headers: ref.watch(
headersProvider(source: manga.source!, lang: manga.lang!),
headersProvider(
source: manga.source!,
lang: manga.lang!,
sourceId: manga.sourceId,
),
),
imageUrl: toImgUrl(
manga.customCoverFromTracker ?? manga.imageUrl ?? "",
@ -451,26 +454,21 @@ class _HistoryTabState extends ConsumerState<HistoryTab>
) async {
await manga.chapters.load();
final chapters = manga.chapters;
await isar.writeTxn(() async {
await isar.historys.delete(deleteId!);
isar.writeTxnSync(() {
isar.historys.deleteSync(deleteId!);
for (var chapter in chapters) {
await isar.chapters.delete(chapter.id!);
await ref
isar.chapters.deleteSync(chapter.id!);
ref
.read(synchingProvider(syncId: 1).notifier)
.addChangedPartAsync(
ActionType.removeChapter,
chapter.id,
"{}",
false,
);
.addChangedPart(ActionType.removeChapter, chapter.id, "{}", false);
}
await isar.mangas.delete(manga.id!);
await ref
isar.mangas.deleteSync(manga.id!);
ref
.read(synchingProvider(syncId: 1).notifier)
.addChangedPartAsync(ActionType.removeHistory, deleteId, "{}", false);
await ref
.addChangedPart(ActionType.removeHistory, deleteId, "{}", false);
ref
.read(synchingProvider(syncId: 1).notifier)
.addChangedPartAsync(ActionType.removeItem, manga.id, "{}", false);
.addChangedPart(ActionType.removeItem, manga.id, "{}", false);
});
if (context.mounted) {
Navigator.pop(context);

View file

@ -44,20 +44,14 @@ class GetAllHistoryStreamFamily extends Family<AsyncValue<List<History>>> {
required ItemType itemType,
String search = "",
}) {
return GetAllHistoryStreamProvider(
itemType: itemType,
search: search,
);
return GetAllHistoryStreamProvider(itemType: itemType, search: search);
}
@override
GetAllHistoryStreamProvider getProviderOverride(
covariant GetAllHistoryStreamProvider provider,
) {
return call(
itemType: provider.itemType,
search: provider.search,
);
return call(itemType: provider.itemType, search: provider.search);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -79,27 +73,24 @@ class GetAllHistoryStreamFamily extends Family<AsyncValue<List<History>>> {
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,
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, {
@ -194,20 +185,14 @@ class GetAllUpdateStreamFamily extends Family<AsyncValue<List<Update>>> {
required ItemType itemType,
String search = "",
}) {
return GetAllUpdateStreamProvider(
itemType: itemType,
search: search,
);
return GetAllUpdateStreamProvider(itemType: itemType, search: search);
}
@override
GetAllUpdateStreamProvider getProviderOverride(
covariant GetAllUpdateStreamProvider provider,
) {
return call(
itemType: provider.itemType,
search: provider.search,
);
return call(itemType: provider.itemType, search: provider.search);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -229,27 +214,24 @@ class GetAllUpdateStreamFamily extends Family<AsyncValue<List<Update>>> {
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,
name: r'getAllUpdateStreamProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllUpdateStreamHash,
dependencies: GetAllUpdateStreamFamily._dependencies,
allTransitiveDependencies:
GetAllUpdateStreamFamily._allTransitiveDependencies,
GetAllUpdateStreamProvider({required ItemType itemType, String search = ""})
: this._internal(
(ref) => getAllUpdateStream(
ref as GetAllUpdateStreamRef,
itemType: itemType,
search: search,
);
),
from: getAllUpdateStreamProvider,
name: r'getAllUpdateStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllUpdateStreamHash,
dependencies: GetAllUpdateStreamFamily._dependencies,
allTransitiveDependencies:
GetAllUpdateStreamFamily._allTransitiveDependencies,
itemType: itemType,
search: search,
);
GetAllUpdateStreamProvider._internal(
super._createNotifier, {
@ -326,5 +308,6 @@ class _GetAllUpdateStreamProviderElement
@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

@ -18,10 +18,13 @@ import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/update.dart';
import 'package:mangayomi/modules/library/providers/add_torrent.dart';
import 'package:mangayomi/modules/library/providers/local_archive.dart';
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart';
import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart';
import 'package:mangayomi/modules/more/providers/downloaded_only_state_provider.dart';
import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
import 'package:mangayomi/modules/widgets/bottom_select_bar.dart';
import 'package:mangayomi/modules/widgets/category_selection_dialog.dart';
import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart';
import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart';
@ -134,6 +137,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
final withoutCategories = ref.watch(
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType),
);
final downloadedOnly = ref.watch(downloadedOnlyStateProvider);
final mangaAll = ref.watch(
getAllMangaStreamProvider(
categoryId: null,
@ -247,6 +251,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref: ref,
localSource: localSource,
settings: settings,
downloadedOnly: downloadedOnly,
);
}
if (tabCount > 0 &&
@ -279,6 +284,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType,
downloadedOnly: downloadedOnly,
);
final withoutCategoryNumberOfItemsList =
_filterAndSortManga(
@ -288,6 +294,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType,
downloadedOnly: downloadedOnly,
);
return DefaultTabController(
@ -370,6 +377,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
categoryId:
entr[i - 1].id!,
settings: settings,
downloadedOnly:
downloadedOnly,
),
],
),
@ -396,6 +405,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
continueReaderBtn,
categoryId: entr[i].id!,
settings: settings,
downloadedOnly:
downloadedOnly,
),
],
),
@ -432,6 +443,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref: ref,
localSource: localSource,
settings: settings,
downloadedOnly:
downloadedOnly,
)
: _bodyWithCatories(
categoryId:
@ -454,6 +467,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref: ref,
localSource: localSource,
settings: settings,
downloadedOnly:
downloadedOnly,
),
if (withoutCategory.isEmpty)
for (
@ -481,6 +496,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref: ref,
localSource: localSource,
settings: settings,
downloadedOnly: downloadedOnly,
),
],
),
@ -501,6 +517,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType,
downloadedOnly: downloadedOnly,
);
return Scaffold(
appBar: _appBar(
@ -526,6 +543,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref: ref,
localSource: localSource,
settings: settings,
downloadedOnly: downloadedOnly,
),
);
},
@ -554,159 +572,85 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
return const ProgressCenter();
},
),
bottomNavigationBar: Consumer(
builder: (context, ref, child) {
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final color = Theme.of(context).textTheme.bodyLarge!.color!;
bottomNavigationBar: Builder(
builder: (context) {
final mangaIds = ref.watch(mangasListStateProvider);
return AnimatedContainer(
curve: Curves.easeIn,
decoration: BoxDecoration(
color: context.primaryColor.withValues(alpha: 0.2),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
final color = Theme.of(context).textTheme.bodyLarge!.color!;
return BottomSelectBar(
isVisible: ref.watch(isLongPressedStateProvider),
actions: [
BottomSelectButton(
icon: Icon(Icons.label_outline_rounded, color: color),
onPressed: () {
final mangaIdsList = ref.watch(mangasListStateProvider);
final List<Manga> bulkMangas = mangaIdsList
.map((id) => isar.mangas.getSync(id)!)
.toList();
showCategorySelectionDialog(
context: context,
ref: ref,
itemType: widget.itemType,
bulkMangas: bulkMangas,
);
},
),
),
duration: const Duration(milliseconds: 100),
height: isLongPressed ? 70 : 0,
width: context.width(1),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
shadowColor: Colors.transparent,
elevation: 0,
backgroundColor: Colors.transparent,
),
onPressed: () {
final mangaIdsList = ref.watch(
mangasListStateProvider,
);
final List<Manga> bulkMangas = mangaIdsList
.map((id) => isar.mangas.getSync(id)!)
.toList();
showCategorySelectionDialog(
context: context,
ref: ref,
itemType: widget.itemType,
bulkMangas: bulkMangas,
);
},
child: Icon(
Icons.label_outline_rounded,
color: color,
),
BottomSelectButton(
icon: Icon(Icons.done_all_sharp, color: color),
onPressed: () {
ref
.read(
mangasSetIsReadStateProvider(
mangaIds: mangaIds,
markAsRead: true,
).notifier,
)
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
itemType: widget.itemType,
),
),
),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
ref
.read(
mangasSetIsReadStateProvider(
mangaIds: mangaIds,
).notifier,
)
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
itemType: widget.itemType,
),
);
ref.invalidate(
getAllMangaStreamProvider(
categoryId: null,
itemType: widget.itemType,
),
);
},
child: Icon(Icons.done_all_sharp, color: color),
);
ref.invalidate(
getAllMangaStreamProvider(
categoryId: null,
itemType: widget.itemType,
),
),
),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
ref
.read(
mangasSetUnReadStateProvider(
mangaIds: mangaIds,
).notifier,
)
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
itemType: widget.itemType,
),
);
ref.invalidate(
getAllMangaStreamProvider(
categoryId: null,
itemType: widget.itemType,
),
);
},
child: Icon(Icons.remove_done_sharp, color: color),
);
},
),
BottomSelectButton(
icon: Icon(Icons.remove_done_sharp, color: color),
onPressed: () {
ref
.read(
mangasSetIsReadStateProvider(
mangaIds: mangaIds,
markAsRead: false,
).notifier,
)
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
itemType: widget.itemType,
),
),
),
// Expanded(
// child: SizedBox(
// height: 70,
// child: ElevatedButton(
// style: ElevatedButton.styleFrom(
// elevation: 0,
// backgroundColor: Colors.transparent,
// shadowColor: Colors.transparent,
// ),
// onPressed: () {},
// child: Icon(
// Icons.download_outlined,
// color: color,
// )),
// ),
// ),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
_deleteManga();
},
child: Icon(
Icons.delete_outline_outlined,
color: color,
),
);
ref.invalidate(
getAllMangaStreamProvider(
categoryId: null,
itemType: widget.itemType,
),
),
),
],
),
);
},
),
// BottomBarAction(
// icon: Icon(Icons.download_outlined, color: color),
// onPressed: () {}
// ),
BottomSelectButton(
icon: Icon(Icons.delete_outline_outlined, color: color),
onPressed: () => _deleteManga(),
),
],
);
},
),
@ -731,6 +675,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required bool continueReaderBtn,
required int categoryId,
required Settings settings,
required bool downloadedOnly,
}) {
final mangas = ref.watch(
getAllMangaStreamProvider(
@ -755,6 +700,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType!,
downloadedOnly: downloadedOnly,
);
return CircleAvatar(
backgroundColor: Theme.of(context).focusColor,
@ -791,6 +737,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required WidgetRef ref,
required DisplayType displayType,
required Settings settings,
required bool downloadedOnly,
}) {
final l10n = l10nLocalizations(context)!;
final mangas = ref.watch(
@ -818,6 +765,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType!,
downloadedOnly: downloadedOnly,
);
if (entries.isNotEmpty) {
final entriesManga = reverse ? entries.reversed.toList() : entries;
@ -875,6 +823,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required WidgetRef ref,
bool withoutCategories = false,
required Settings settings,
required bool downloadedOnly,
}) {
final sortType = ref
.watch(
@ -907,6 +856,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
startedFilterType: startedFilterType,
bookmarkedFilterType: bookmarkedFilterType,
sortType: sortType ?? 0,
downloadedOnly: downloadedOnly,
);
if (entries.isNotEmpty) {
final entriesManga = reverse ? entries.reversed.toList() : entries;
@ -970,6 +920,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required int startedFilterType,
required int bookmarkedFilterType,
required int sortType,
bool downloadedOnly = false,
}) {
List<Manga>? mangas;
final searchQuery = _textEditingController.text;
@ -984,7 +935,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
.where((element) {
// Filter by download
List list = [];
if (downloadFilterType == 1) {
if (downloadFilterType == 1 || downloadedOnly) {
for (var chap in element.chapters) {
final modelChapDownload = isar.downloads
.filter()
@ -1206,7 +1157,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref.read(mangasListStateProvider.notifier).clear();
ref
.read(isLongPressedMangaStateProvider.notifier)
.read(isLongPressedStateProvider.notifier)
.update(false);
if (mounted) {
Navigator.pop(context);
@ -1859,7 +1810,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
int? categoryId,
Settings settings,
) {
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final isLongPressed = ref.watch(isLongPressedStateProvider);
final mangaIdsList = ref.watch(mangasListStateProvider);
final manga = categoryId == null
? ref.watch(
@ -1888,7 +1839,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref.read(mangasListStateProvider.notifier).clear();
ref
.read(isLongPressedMangaStateProvider.notifier)
.read(isLongPressedStateProvider.notifier)
.update(!isLongPressed);
},
icon: const Icon(Icons.clear),
@ -1913,7 +1864,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
.selectSome(manga);
}
ref
.read(isLongPressedMangaStateProvider.notifier)
.read(isLongPressedStateProvider.notifier)
.update(false);
} else {
for (var manga in data) {
@ -2069,6 +2020,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
lang: randomManga.lang!,
mangaM: randomManga,
source: randomManga.source!,
sourceId: randomManga.sourceId,
);
});
} else if (value == 2) {

View file

@ -51,6 +51,7 @@ Future addTorrentFromUrlOrFromFile(
isLocalArchive: true,
artist: '',
updatedAt: dateNow,
sourceId: null,
);
if (url != null) {

View file

@ -7,7 +7,7 @@ part of 'add_torrent.dart';
// **************************************************************************
String _$addTorrentFromUrlOrFromFileHash() =>
r'ca841c87c01dd9e9254b99b3223ac67d775ba5b2';
r'a54f90b6708b13eeb8fed098691f9a79dbab50fd';
/// Copied from Dart SDK
class _SystemHash {
@ -45,22 +45,14 @@ class AddTorrentFromUrlOrFromFileFamily extends Family<AsyncValue> {
required bool init,
String? url,
}) {
return AddTorrentFromUrlOrFromFileProvider(
mManga,
init: init,
url: url,
);
return AddTorrentFromUrlOrFromFileProvider(mManga, init: init, url: url);
}
@override
AddTorrentFromUrlOrFromFileProvider getProviderOverride(
covariant AddTorrentFromUrlOrFromFileProvider provider,
) {
return call(
provider.mManga,
init: provider.init,
url: provider.url,
);
return call(provider.mManga, init: provider.init, url: provider.url);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -87,25 +79,24 @@ class AddTorrentFromUrlOrFromFileProvider
required bool init,
String? url,
}) : this._internal(
(ref) => addTorrentFromUrlOrFromFile(
ref as AddTorrentFromUrlOrFromFileRef,
mManga,
init: init,
url: url,
),
from: addTorrentFromUrlOrFromFileProvider,
name: r'addTorrentFromUrlOrFromFileProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$addTorrentFromUrlOrFromFileHash,
dependencies: AddTorrentFromUrlOrFromFileFamily._dependencies,
allTransitiveDependencies:
AddTorrentFromUrlOrFromFileFamily._allTransitiveDependencies,
mManga: mManga,
init: init,
url: url,
);
(ref) => addTorrentFromUrlOrFromFile(
ref as AddTorrentFromUrlOrFromFileRef,
mManga,
init: init,
url: url,
),
from: addTorrentFromUrlOrFromFileProvider,
name: r'addTorrentFromUrlOrFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$addTorrentFromUrlOrFromFileHash,
dependencies: AddTorrentFromUrlOrFromFileFamily._dependencies,
allTransitiveDependencies:
AddTorrentFromUrlOrFromFileFamily._allTransitiveDependencies,
mManga: mManga,
init: init,
url: url,
);
AddTorrentFromUrlOrFromFileProvider._internal(
super._createNotifier, {
@ -192,5 +183,6 @@ class _AddTorrentFromUrlOrFromFileProviderElement
@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

@ -130,6 +130,7 @@ Future<void> scanLocalLibrary(Ref ref) async {
itemType: itemType,
dateAdded: dateNow,
lastUpdate: dateNow,
sourceId: null,
);
newMangas++;
}

View file

@ -6,7 +6,7 @@ part of 'file_scanner.dart';
// RiverpodGenerator
// **************************************************************************
String _$scanLocalLibraryHash() => r'7e028c45097e5802ee974d9f0c5a2bc540bba91c';
String _$scanLocalLibraryHash() => r'efbad9aa5fa4233e260a2e132389c23b40ef515a';
/// Scans `Mangayomi/local` folder (if exists) for Mangas/Animes and imports in library.
///

View file

@ -53,10 +53,7 @@ class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
GetAllMangaStreamProvider getProviderOverride(
covariant GetAllMangaStreamProvider provider,
) {
return call(
categoryId: provider.categoryId,
itemType: provider.itemType,
);
return call(categoryId: provider.categoryId, itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -81,23 +78,22 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
required int? categoryId,
required ItemType itemType,
}) : this._internal(
(ref) => getAllMangaStream(
ref as GetAllMangaStreamRef,
categoryId: categoryId,
itemType: itemType,
),
from: getAllMangaStreamProvider,
name: r'getAllMangaStreamProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllMangaStreamHash,
dependencies: GetAllMangaStreamFamily._dependencies,
allTransitiveDependencies:
GetAllMangaStreamFamily._allTransitiveDependencies,
categoryId: categoryId,
itemType: itemType,
);
(ref) => getAllMangaStream(
ref as GetAllMangaStreamRef,
categoryId: categoryId,
itemType: itemType,
),
from: getAllMangaStreamProvider,
name: r'getAllMangaStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getAllMangaStreamHash,
dependencies: GetAllMangaStreamFamily._dependencies,
allTransitiveDependencies:
GetAllMangaStreamFamily._allTransitiveDependencies,
categoryId: categoryId,
itemType: itemType,
);
GetAllMangaStreamProvider._internal(
super._createNotifier, {
@ -193,18 +189,14 @@ class GetAllMangaWithoutCategoriesStreamFamily
GetAllMangaWithoutCategoriesStreamProvider call({
required ItemType itemType,
}) {
return GetAllMangaWithoutCategoriesStreamProvider(
itemType: itemType,
);
return GetAllMangaWithoutCategoriesStreamProvider(itemType: itemType);
}
@override
GetAllMangaWithoutCategoriesStreamProvider getProviderOverride(
covariant GetAllMangaWithoutCategoriesStreamProvider provider,
) {
return call(
itemType: provider.itemType,
);
return call(itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -226,24 +218,22 @@ class GetAllMangaWithoutCategoriesStreamFamily
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,
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,
);
GetAllMangaWithoutCategoriesStreamProvider._internal(
super._createNotifier, {
@ -260,7 +250,7 @@ class GetAllMangaWithoutCategoriesStreamProvider
@override
Override overrideWith(
Stream<List<Manga>> Function(GetAllMangaWithoutCategoriesStreamRef provider)
create,
create,
) {
return ProviderOverride(
origin: this,
@ -320,14 +310,14 @@ String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27';
@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,
);
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

View file

@ -3,6 +3,7 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -785,7 +786,7 @@ class MangasListState extends _$MangasListState {
newList.add(value.id!);
}
if (newList.isEmpty) {
ref.read(isLongPressedMangaStateProvider.notifier).update(false);
ref.read(isLongPressedStateProvider.notifier).update(false);
}
state = newList;
}
@ -814,65 +815,24 @@ class MangasListState extends _$MangasListState {
}
}
@riverpod
class IsLongPressedMangaState extends _$IsLongPressedMangaState {
@override
bool build() {
return false;
}
void update(bool value) {
state = value;
}
}
@riverpod
class MangasSetIsReadState extends _$MangasSetIsReadState {
@override
void build({required List<int> mangaIds}) {}
void build({required List<int> mangaIds, required bool markAsRead}) {}
void set() {
final allChapters = <Chapter>[];
final allMangas = <Manga>[];
final now = DateTime.now().millisecondsSinceEpoch;
for (var mangaid in mangaIds) {
final manga = isar.mangas.getSync(mangaid)!;
final chapters = manga.chapters;
if (chapters.isNotEmpty) {
chapters.last.updateTrackChapterRead(ref);
for (var chapter in chapters) {
chapter.isRead = true;
chapter.lastPageRead = "1";
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
chapter.manga.value = manga;
allChapters.add(chapter);
}
allMangas.add(manga);
}
}
isar.writeTxnSync(() {
isar.chapters.putAllSync(allChapters);
isar.mangas.putAllSync(allMangas);
});
ref.read(isLongPressedMangaStateProvider.notifier).update(false);
ref.read(mangasListStateProvider.notifier).clear();
}
}
@riverpod
class MangasSetUnReadState extends _$MangasSetUnReadState {
@override
void build({required List<int> mangaIds}) {}
void set() {
final allChapters = <Chapter>[];
final allMangas = <Manga>[];
for (var mangaid in mangaIds) {
final manga = isar.mangas.getSync(mangaid)!;
for (var chapter in manga.chapters) {
chapter.isRead = false;
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
if (chapters.isEmpty) continue;
if (markAsRead) chapters.last.updateTrackChapterRead(ref);
for (var chapter in chapters) {
chapter.isRead = markAsRead;
if (markAsRead) chapter.lastPageRead = "1";
chapter.updatedAt = now;
chapter.manga.value = manga;
allChapters.add(chapter);
}
@ -884,7 +844,7 @@ class MangasSetUnReadState extends _$MangasSetUnReadState {
isar.mangas.putAllSync(allMangas);
});
ref.read(isLongPressedMangaStateProvider.notifier).update(false);
ref.read(isLongPressedStateProvider.notifier).update(false);
ref.read(mangasListStateProvider.notifier).clear();
}
}

File diff suppressed because it is too large Load diff

View file

@ -48,6 +48,7 @@ Future importArchivesFromFile(
isLocalArchive: true,
artist: '',
updatedAt: dateNow,
sourceId: null,
);
for (var file in result.files.reversed.toList()) {

View file

@ -7,7 +7,7 @@ part of 'local_archive.dart';
// **************************************************************************
String _$importArchivesFromFileHash() =>
r'4d92aaade0544f76214030364433f91d27570b5a';
r'784b9d45958695faffdf04ee7c105c9b486122de';
/// Copied from Dart SDK
class _SystemHash {
@ -87,25 +87,24 @@ class ImportArchivesFromFileProvider
required ItemType itemType,
required bool init,
}) : this._internal(
(ref) => importArchivesFromFile(
ref as ImportArchivesFromFileRef,
mManga,
itemType: itemType,
init: init,
),
from: importArchivesFromFileProvider,
name: r'importArchivesFromFileProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$importArchivesFromFileHash,
dependencies: ImportArchivesFromFileFamily._dependencies,
allTransitiveDependencies:
ImportArchivesFromFileFamily._allTransitiveDependencies,
mManga: mManga,
itemType: itemType,
init: init,
);
(ref) => importArchivesFromFile(
ref as ImportArchivesFromFileRef,
mManga,
itemType: itemType,
init: init,
),
from: importArchivesFromFileProvider,
name: r'importArchivesFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$importArchivesFromFileHash,
dependencies: ImportArchivesFromFileFamily._dependencies,
allTransitiveDependencies:
ImportArchivesFromFileFamily._allTransitiveDependencies,
mManga: mManga,
itemType: itemType,
init: init,
);
ImportArchivesFromFileProvider._internal(
super._createNotifier, {
@ -192,5 +191,6 @@ class _ImportArchivesFromFileProviderElement
@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

@ -9,6 +9,7 @@ import 'package:mangayomi/models/history.dart';
import 'package:mangayomi/modules/library/providers/isar_providers.dart';
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
import 'package:mangayomi/utils/constant.dart';
@ -52,7 +53,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
Widget build(BuildContext context) {
return Consumer(
builder: (context, ref, child) {
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final isLongPressed = ref.watch(isLongPressedStateProvider);
final itemType = widget.itemType;
final gridSize = ref.watch(
@ -93,6 +94,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
headersProvider(
source: entry.source!,
lang: entry.lang!,
sourceId: entry.sourceId,
),
),
),
@ -109,6 +111,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
lang: entry.lang!,
mangaM: entry,
source: entry.source!,
sourceId: entry.sourceId,
);
if (context.mounted) {
ref.invalidate(
@ -430,7 +433,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
) {
if (!isLongPressed) {
ref.read(mangasListStateProvider.notifier).update(entry);
ref.read(isLongPressedMangaStateProvider.notifier).update(!isLongPressed);
ref.read(isLongPressedStateProvider.notifier).update(!isLongPressed);
} else {
ref.read(mangasListStateProvider.notifier).update(entry);
}

View file

@ -9,6 +9,7 @@ import 'package:mangayomi/models/history.dart';
import 'package:mangayomi/modules/library/providers/isar_providers.dart';
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
import 'package:mangayomi/utils/constant.dart';
@ -44,7 +45,7 @@ class LibraryListViewWidget extends StatelessWidget {
bool isLocalArchive = entry.isLocalArchive ?? false;
return Consumer(
builder: (context, ref, child) {
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final isLongPressed = ref.watch(isLongPressedStateProvider);
return Material(
borderRadius: BorderRadius.circular(5),
color: Colors.transparent,
@ -61,6 +62,7 @@ class LibraryListViewWidget extends StatelessWidget {
lang: entry.lang!,
mangaM: entry,
source: entry.source!,
sourceId: entry.sourceId,
);
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
@ -80,7 +82,7 @@ class LibraryListViewWidget extends StatelessWidget {
ref.read(mangasListStateProvider.notifier).update(entry);
ref
.read(isLongPressedMangaStateProvider.notifier)
.read(isLongPressedStateProvider.notifier)
.update(!isLongPressed);
} else {
ref.read(mangasListStateProvider.notifier).update(entry);
@ -91,7 +93,7 @@ class LibraryListViewWidget extends StatelessWidget {
ref.read(mangasListStateProvider.notifier).update(entry);
ref
.read(isLongPressedMangaStateProvider.notifier)
.read(isLongPressedStateProvider.notifier)
.update(!isLongPressed);
} else {
ref.read(mangasListStateProvider.notifier).update(entry);
@ -139,6 +141,7 @@ class LibraryListViewWidget extends StatelessWidget {
headersProvider(
source: entry.source!,
lang: entry.lang!,
sourceId: entry.sourceId,
),
),
),

View file

@ -11,6 +11,7 @@ import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/update.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/providers/downloaded_only_state_provider.dart';
import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
import 'package:mangayomi/modules/widgets/loading_icon.dart';
@ -23,7 +24,7 @@ import 'package:mangayomi/router/router.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:mangayomi/services/sync_server.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart';
final libLocationRegex = RegExp(r"^/(Manga|Anime|Novel)Library$");
@ -239,10 +240,16 @@ class _MainScreenState extends ConsumerState<MainScreen> {
}
final incognitoMode = ref.watch(incognitoModeStateProvider);
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final downloadedOnly = ref.watch(downloadedOnlyStateProvider);
final isLongPressed = ref.watch(isLongPressedStateProvider);
return Column(
children: [
if (!isReadingScreen)
_DownloadedOnlyBar(
downloadedOnly: downloadedOnly,
l10n: l10n,
),
if (!isReadingScreen)
_IncognitoModeBar(incognitoMode: incognitoMode, l10n: l10n),
Flexible(
@ -526,6 +533,45 @@ class _MainScreenState extends ConsumerState<MainScreen> {
}
}
class _DownloadedOnlyBar extends StatelessWidget {
const _DownloadedOnlyBar({required this.downloadedOnly, required this.l10n});
final bool downloadedOnly;
final dynamic l10n;
@override
Widget build(BuildContext context) {
return Material(
child: AnimatedContainer(
height: downloadedOnly
? Platform.isAndroid || Platform.isIOS
? MediaQuery.of(context).padding.top * 2
: 50
: 0,
curve: Curves.easeIn,
duration: const Duration(milliseconds: 150),
color: context.secondaryColor,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
l10n.downloaded_only,
style: TextStyle(
color: Colors.white,
fontFamily: GoogleFonts.aBeeZee().fontFamily,
),
),
),
],
),
),
);
}
}
class _IncognitoModeBar extends StatelessWidget {
const _IncognitoModeBar({required this.incognitoMode, required this.l10n});

View file

@ -13,8 +13,9 @@ String _$migrationHash() => r'2a82120544e693a3162da887a3ca1b3066f3799f';
final migrationProvider = AutoDisposeFutureProvider<void>.internal(
migration,
name: r'migrationProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$migrationHash,
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$migrationHash,
dependencies: null,
allTransitiveDependencies: null,
);

View file

@ -36,27 +36,24 @@ const getArchivesDataFromDirectoryProvider =
GetArchivesDataFromDirectoryFamily();
/// See also [getArchivesDataFromDirectory].
class GetArchivesDataFromDirectoryFamily extends Family<
AsyncValue<List<(String, LocalExtensionType, Uint8List, String)>>> {
class GetArchivesDataFromDirectoryFamily
extends
Family<
AsyncValue<List<(String, LocalExtensionType, Uint8List, String)>>
> {
/// See also [getArchivesDataFromDirectory].
const GetArchivesDataFromDirectoryFamily();
/// See also [getArchivesDataFromDirectory].
GetArchivesDataFromDirectoryProvider call(
String path,
) {
return GetArchivesDataFromDirectoryProvider(
path,
);
GetArchivesDataFromDirectoryProvider call(String path) {
return GetArchivesDataFromDirectoryProvider(path);
}
@override
GetArchivesDataFromDirectoryProvider getProviderOverride(
covariant GetArchivesDataFromDirectoryProvider provider,
) {
return call(
provider.path,
);
return call(provider.path);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -75,27 +72,28 @@ class GetArchivesDataFromDirectoryFamily extends Family<
}
/// See also [getArchivesDataFromDirectory].
class GetArchivesDataFromDirectoryProvider extends AutoDisposeFutureProvider<
List<(String, LocalExtensionType, Uint8List, String)>> {
class GetArchivesDataFromDirectoryProvider
extends
AutoDisposeFutureProvider<
List<(String, LocalExtensionType, Uint8List, String)>
> {
/// See also [getArchivesDataFromDirectory].
GetArchivesDataFromDirectoryProvider(
String path,
) : this._internal(
(ref) => getArchivesDataFromDirectory(
ref as GetArchivesDataFromDirectoryRef,
path,
),
from: getArchivesDataFromDirectoryProvider,
name: r'getArchivesDataFromDirectoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchivesDataFromDirectoryHash,
dependencies: GetArchivesDataFromDirectoryFamily._dependencies,
allTransitiveDependencies:
GetArchivesDataFromDirectoryFamily._allTransitiveDependencies,
path: path,
);
GetArchivesDataFromDirectoryProvider(String path)
: this._internal(
(ref) => getArchivesDataFromDirectory(
ref as GetArchivesDataFromDirectoryRef,
path,
),
from: getArchivesDataFromDirectoryProvider,
name: r'getArchivesDataFromDirectoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchivesDataFromDirectoryHash,
dependencies: GetArchivesDataFromDirectoryFamily._dependencies,
allTransitiveDependencies:
GetArchivesDataFromDirectoryFamily._allTransitiveDependencies,
path: path,
);
GetArchivesDataFromDirectoryProvider._internal(
super._createNotifier, {
@ -112,8 +110,9 @@ class GetArchivesDataFromDirectoryProvider extends AutoDisposeFutureProvider<
@override
Override overrideWith(
FutureOr<List<(String, LocalExtensionType, Uint8List, String)>> Function(
GetArchivesDataFromDirectoryRef provider)
create,
GetArchivesDataFromDirectoryRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@ -131,7 +130,9 @@ class GetArchivesDataFromDirectoryProvider extends AutoDisposeFutureProvider<
@override
AutoDisposeFutureProviderElement<
List<(String, LocalExtensionType, Uint8List, String)>> createElement() {
List<(String, LocalExtensionType, Uint8List, String)>
>
createElement() {
return _GetArchivesDataFromDirectoryProviderElement(this);
}
@ -151,15 +152,20 @@ class GetArchivesDataFromDirectoryProvider extends AutoDisposeFutureProvider<
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetArchivesDataFromDirectoryRef on AutoDisposeFutureProviderRef<
List<(String, LocalExtensionType, Uint8List, String)>> {
mixin GetArchivesDataFromDirectoryRef
on
AutoDisposeFutureProviderRef<
List<(String, LocalExtensionType, Uint8List, String)>
> {
/// The parameter `path` of this provider.
String get path;
}
class _GetArchivesDataFromDirectoryProviderElement
extends AutoDisposeFutureProviderElement<
List<(String, LocalExtensionType, Uint8List, String)>>
extends
AutoDisposeFutureProviderElement<
List<(String, LocalExtensionType, Uint8List, String)>
>
with GetArchivesDataFromDirectoryRef {
_GetArchivesDataFromDirectoryProviderElement(super.provider);
@ -181,21 +187,15 @@ class GetArchiveDataFromDirectoryFamily
const GetArchiveDataFromDirectoryFamily();
/// See also [getArchiveDataFromDirectory].
GetArchiveDataFromDirectoryProvider call(
String path,
) {
return GetArchiveDataFromDirectoryProvider(
path,
);
GetArchiveDataFromDirectoryProvider call(String path) {
return GetArchiveDataFromDirectoryProvider(path);
}
@override
GetArchiveDataFromDirectoryProvider getProviderOverride(
covariant GetArchiveDataFromDirectoryProvider provider,
) {
return call(
provider.path,
);
return call(provider.path);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -217,24 +217,22 @@ class GetArchiveDataFromDirectoryFamily
class GetArchiveDataFromDirectoryProvider
extends AutoDisposeFutureProvider<List<LocalArchive>> {
/// See also [getArchiveDataFromDirectory].
GetArchiveDataFromDirectoryProvider(
String path,
) : this._internal(
(ref) => getArchiveDataFromDirectory(
ref as GetArchiveDataFromDirectoryRef,
path,
),
from: getArchiveDataFromDirectoryProvider,
name: r'getArchiveDataFromDirectoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchiveDataFromDirectoryHash,
dependencies: GetArchiveDataFromDirectoryFamily._dependencies,
allTransitiveDependencies:
GetArchiveDataFromDirectoryFamily._allTransitiveDependencies,
path: path,
);
GetArchiveDataFromDirectoryProvider(String path)
: this._internal(
(ref) => getArchiveDataFromDirectory(
ref as GetArchiveDataFromDirectoryRef,
path,
),
from: getArchiveDataFromDirectoryProvider,
name: r'getArchiveDataFromDirectoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchiveDataFromDirectoryHash,
dependencies: GetArchiveDataFromDirectoryFamily._dependencies,
allTransitiveDependencies:
GetArchiveDataFromDirectoryFamily._allTransitiveDependencies,
path: path,
);
GetArchiveDataFromDirectoryProvider._internal(
super._createNotifier, {
@ -251,8 +249,9 @@ class GetArchiveDataFromDirectoryProvider
@override
Override overrideWith(
FutureOr<List<LocalArchive>> Function(
GetArchiveDataFromDirectoryRef provider)
create,
GetArchiveDataFromDirectoryRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@ -312,27 +311,22 @@ String _$getArchivesDataFromFileHash() =>
const getArchivesDataFromFileProvider = GetArchivesDataFromFileFamily();
/// See also [getArchivesDataFromFile].
class GetArchivesDataFromFileFamily extends Family<
AsyncValue<(String, LocalExtensionType, Uint8List, String)>> {
class GetArchivesDataFromFileFamily
extends
Family<AsyncValue<(String, LocalExtensionType, Uint8List, String)>> {
/// See also [getArchivesDataFromFile].
const GetArchivesDataFromFileFamily();
/// See also [getArchivesDataFromFile].
GetArchivesDataFromFileProvider call(
String path,
) {
return GetArchivesDataFromFileProvider(
path,
);
GetArchivesDataFromFileProvider call(String path) {
return GetArchivesDataFromFileProvider(path);
}
@override
GetArchivesDataFromFileProvider getProviderOverride(
covariant GetArchivesDataFromFileProvider provider,
) {
return call(
provider.path,
);
return call(provider.path);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -351,27 +345,26 @@ class GetArchivesDataFromFileFamily extends Family<
}
/// See also [getArchivesDataFromFile].
class GetArchivesDataFromFileProvider extends AutoDisposeFutureProvider<
(String, LocalExtensionType, Uint8List, String)> {
class GetArchivesDataFromFileProvider
extends
AutoDisposeFutureProvider<
(String, LocalExtensionType, Uint8List, String)
> {
/// See also [getArchivesDataFromFile].
GetArchivesDataFromFileProvider(
String path,
) : this._internal(
(ref) => getArchivesDataFromFile(
ref as GetArchivesDataFromFileRef,
path,
),
from: getArchivesDataFromFileProvider,
name: r'getArchivesDataFromFileProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchivesDataFromFileHash,
dependencies: GetArchivesDataFromFileFamily._dependencies,
allTransitiveDependencies:
GetArchivesDataFromFileFamily._allTransitiveDependencies,
path: path,
);
GetArchivesDataFromFileProvider(String path)
: this._internal(
(ref) =>
getArchivesDataFromFile(ref as GetArchivesDataFromFileRef, path),
from: getArchivesDataFromFileProvider,
name: r'getArchivesDataFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchivesDataFromFileHash,
dependencies: GetArchivesDataFromFileFamily._dependencies,
allTransitiveDependencies:
GetArchivesDataFromFileFamily._allTransitiveDependencies,
path: path,
);
GetArchivesDataFromFileProvider._internal(
super._createNotifier, {
@ -388,8 +381,9 @@ class GetArchivesDataFromFileProvider extends AutoDisposeFutureProvider<
@override
Override overrideWith(
FutureOr<(String, LocalExtensionType, Uint8List, String)> Function(
GetArchivesDataFromFileRef provider)
create,
GetArchivesDataFromFileRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@ -407,7 +401,9 @@ class GetArchivesDataFromFileProvider extends AutoDisposeFutureProvider<
@override
AutoDisposeFutureProviderElement<
(String, LocalExtensionType, Uint8List, String)> createElement() {
(String, LocalExtensionType, Uint8List, String)
>
createElement() {
return _GetArchivesDataFromFileProviderElement(this);
}
@ -427,15 +423,20 @@ class GetArchivesDataFromFileProvider extends AutoDisposeFutureProvider<
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin GetArchivesDataFromFileRef on AutoDisposeFutureProviderRef<
(String, LocalExtensionType, Uint8List, String)> {
mixin GetArchivesDataFromFileRef
on
AutoDisposeFutureProviderRef<
(String, LocalExtensionType, Uint8List, String)
> {
/// The parameter `path` of this provider.
String get path;
}
class _GetArchivesDataFromFileProviderElement
extends AutoDisposeFutureProviderElement<
(String, LocalExtensionType, Uint8List, String)>
extends
AutoDisposeFutureProviderElement<
(String, LocalExtensionType, Uint8List, String)
>
with GetArchivesDataFromFileRef {
_GetArchivesDataFromFileProviderElement(super.provider);
@ -456,21 +457,15 @@ class GetArchiveDataFromFileFamily extends Family<AsyncValue<LocalArchive>> {
const GetArchiveDataFromFileFamily();
/// See also [getArchiveDataFromFile].
GetArchiveDataFromFileProvider call(
String path,
) {
return GetArchiveDataFromFileProvider(
path,
);
GetArchiveDataFromFileProvider call(String path) {
return GetArchiveDataFromFileProvider(path);
}
@override
GetArchiveDataFromFileProvider getProviderOverride(
covariant GetArchiveDataFromFileProvider provider,
) {
return call(
provider.path,
);
return call(provider.path);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -492,24 +487,19 @@ class GetArchiveDataFromFileFamily extends Family<AsyncValue<LocalArchive>> {
class GetArchiveDataFromFileProvider
extends AutoDisposeFutureProvider<LocalArchive> {
/// See also [getArchiveDataFromFile].
GetArchiveDataFromFileProvider(
String path,
) : this._internal(
(ref) => getArchiveDataFromFile(
ref as GetArchiveDataFromFileRef,
path,
),
from: getArchiveDataFromFileProvider,
name: r'getArchiveDataFromFileProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchiveDataFromFileHash,
dependencies: GetArchiveDataFromFileFamily._dependencies,
allTransitiveDependencies:
GetArchiveDataFromFileFamily._allTransitiveDependencies,
path: path,
);
GetArchiveDataFromFileProvider(String path)
: this._internal(
(ref) => getArchiveDataFromFile(ref as GetArchiveDataFromFileRef, path),
from: getArchiveDataFromFileProvider,
name: r'getArchiveDataFromFileProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$getArchiveDataFromFileHash,
dependencies: GetArchiveDataFromFileFamily._dependencies,
allTransitiveDependencies:
GetArchiveDataFromFileFamily._allTransitiveDependencies,
path: path,
);
GetArchiveDataFromFileProvider._internal(
super._createNotifier, {
@ -575,5 +565,6 @@ class _GetArchiveDataFromFileProviderElement
@override
String get path => (origin as GetArchiveDataFromFileProvider).path;
}
// 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

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