mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-05-11 04:10:53 +00:00
Merge remote-tracking branch 'upstream/main' into Correct-directory
This commit is contained in:
commit
e6b6fd6a92
369 changed files with 52407 additions and 24495 deletions
|
|
@ -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')
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
BIN
assets/mangayomi_mpv.zip
Normal file
Binary file not shown.
BIN
assets/trackers_icons/tracker_simkl.webp
Normal file
BIN
assets/trackers_icons/tracker_simkl.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
assets/trackers_icons/tracker_trakt.webp
Normal file
BIN
assets/trackers_icons/tracker_trakt.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
85
lib/eval/mihon/models.dart
Normal file
85
lib/eval/mihon/models.dart
Normal 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
339
lib/eval/mihon/service.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
279
lib/l10n/app_as.arb
Normal 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": "এক্সটেনশন দেখুৱাওক"
|
||||
}
|
||||
|
|
@ -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
279
lib/l10n/app_hi.arb
Normal 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": "एक्सटेंशन दिखाएँ"
|
||||
}
|
||||
|
|
@ -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':
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
1738
lib/l10n/generated/app_localizations_as.dart
Normal file
1738
lib/l10n/generated/app_localizations_as.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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`).
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
1739
lib/l10n/generated/app_localizations_hi.dart
Normal file
1739
lib/l10n/generated/app_localizations_hi.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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`).
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:';
|
||||
}
|
||||
|
|
|
|||
120
lib/main.dart
120
lib/main.dart
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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
95
lib/models/custom_button.dart
Normal file
95
lib/models/custom_button.dart
Normal 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,
|
||||
});
|
||||
}
|
||||
1454
lib/models/custom_button.g.dart
Normal file
1454
lib/models/custom_button.g.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
200
lib/modules/anime/widgets/custom_track_shape.dart
Normal file
200
lib/modules/anime/widgets/custom_track_shape.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
439
lib/modules/anime/widgets/search_subtitles.dart
Normal file
439
lib/modules/anime/widgets/search_subtitles.dart
Normal 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),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
@ -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,
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: [
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
430
lib/modules/calendar/calendar_screen.dart
Normal file
430
lib/modules/calendar/calendar_screen.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
23
lib/modules/calendar/providers/calendar_provider.dart
Normal file
23
lib/modules/calendar/providers/calendar_provider.dart
Normal 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);
|
||||
}
|
||||
152
lib/modules/calendar/providers/calendar_provider.g.dart
Normal file
152
lib/modules/calendar/providers/calendar_provider.g.dart
Normal 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
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ Future addTorrentFromUrlOrFromFile(
|
|||
isLocalArchive: true,
|
||||
artist: '',
|
||||
updatedAt: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
|
||||
if (url != null) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ Future<void> scanLocalLibrary(Ref ref) async {
|
|||
itemType: itemType,
|
||||
dateAdded: dateNow,
|
||||
lastUpdate: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
newMangas++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -48,6 +48,7 @@ Future importArchivesFromFile(
|
|||
isLocalArchive: true,
|
||||
artist: '',
|
||||
updatedAt: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
|
||||
for (var file in result.files.reversed.toList()) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue