From 5b5657802971c214733ec54838e090dc8356370b Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 23 Jul 2025 03:16:24 +0200 Subject: [PATCH 001/100] separated some classes from reader_view --- .../reader/double_columm_view_center.dart | 2 +- .../reader/double_columm_view_vertical.dart | 2 +- .../manga/reader/image_view_paged.dart | 2 +- .../manga/reader/image_view_vertical.dart | 2 +- .../providers/crop_borders_provider.dart | 2 +- lib/modules/manga/reader/reader_view.dart | 193 +----------------- .../manga/reader/u_chap_data_preload.dart | 54 +++++ .../virtual_scrolling/virtual_manga_list.dart | 6 +- .../virtual_page_manager.dart | 10 +- .../virtual_reader_view.dart | 12 +- .../widgets/custom_popup_menu_button.dart | 80 ++++++++ .../widgets/custom_value_indicator_shape.dart | 62 ++++++ .../reader/widgets/transition_view_paged.dart | 2 +- .../widgets/transition_view_vertical.dart | 2 +- lib/modules/novel/novel_reader_view.dart | 104 ---------- lib/services/get_chapter_pages.dart | 2 +- lib/utils/extensions/others.dart | 2 +- 17 files changed, 223 insertions(+), 316 deletions(-) create mode 100644 lib/modules/manga/reader/u_chap_data_preload.dart create mode 100644 lib/modules/manga/reader/widgets/custom_popup_menu_button.dart create mode 100644 lib/modules/manga/reader/widgets/custom_value_indicator_shape.dart diff --git a/lib/modules/manga/reader/double_columm_view_center.dart b/lib/modules/manga/reader/double_columm_view_center.dart index bdc7de15..39d4eda8 100644 --- a/lib/modules/manga/reader/double_columm_view_center.dart +++ b/lib/modules/manga/reader/double_columm_view_center.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/reader/image_view_paged.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart'; import 'package:mangayomi/modules/manga/reader/widgets/transition_view_paged.dart'; import 'package:mangayomi/modules/more/settings/reader/reader_screen.dart'; diff --git a/lib/modules/manga/reader/double_columm_view_vertical.dart b/lib/modules/manga/reader/double_columm_view_vertical.dart index 7d08bd72..cf01cbd1 100644 --- a/lib/modules/manga/reader/double_columm_view_vertical.dart +++ b/lib/modules/manga/reader/double_columm_view_vertical.dart @@ -2,7 +2,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/reader/image_view_paged.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart'; import 'package:mangayomi/modules/manga/reader/widgets/transition_view_vertical.dart'; import 'package:mangayomi/modules/more/settings/reader/reader_screen.dart'; diff --git a/lib/modules/manga/reader/image_view_paged.dart b/lib/modules/manga/reader/image_view_paged.dart index 82e828b4..3d765d42 100644 --- a/lib/modules/manga/reader/image_view_paged.dart +++ b/lib/modules/manga/reader/image_view_paged.dart @@ -2,7 +2,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/utils/extensions/others.dart'; diff --git a/lib/modules/manga/reader/image_view_vertical.dart b/lib/modules/manga/reader/image_view_vertical.dart index a7a95a16..b505826a 100644 --- a/lib/modules/manga/reader/image_view_vertical.dart +++ b/lib/modules/manga/reader/image_view_vertical.dart @@ -2,7 +2,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; diff --git a/lib/modules/manga/reader/providers/crop_borders_provider.dart b/lib/modules/manga/reader/providers/crop_borders_provider.dart index dad45c99..33c63d57 100644 --- a/lib/modules/manga/reader/providers/crop_borders_provider.dart +++ b/lib/modules/manga/reader/providers/crop_borders_provider.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:isolate'; import 'package:flutter/foundation.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/src/rust/api/image.dart'; import 'package:mangayomi/src/rust/frb_generated.dart'; import 'package:mangayomi/utils/extensions/others.dart'; diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 081a3347..9665e063 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -12,14 +12,16 @@ import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/anime/widgets/desktop.dart'; import 'package:mangayomi/modules/manga/reader/providers/crop_borders_provider.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/btn_chapter_list_dialog.dart'; import 'package:mangayomi/modules/manga/reader/double_columm_view_center.dart'; import 'package:mangayomi/modules/manga/reader/providers/color_filter_provider.dart'; import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/custom_popup_menu_button.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/custom_value_indicator_shape.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -1633,7 +1635,7 @@ class _MangaChapterPageGalleryState return SliderTheme( data: SliderTheme.of(context).copyWith( valueIndicatorShape: - _CustomValueIndicatorShape( + CustomValueIndicatorShape( tranform: _isReverseHorizontal, ), overlayShape: @@ -2504,190 +2506,3 @@ class _MangaChapterPageGalleryState } } } - -class UChapDataPreload { - Chapter? chapter; - Directory? directory; - PageUrl? pageUrl; - bool? isLocale; - Uint8List? archiveImage; - int? index; - GetChapterPagesModel? chapterUrlModel; - int? pageIndex; - Uint8List? cropImage; - bool isTransitionPage; - Chapter? nextChapter; - String? mangaName; - bool? isLastChapter; - - UChapDataPreload( - this.chapter, - this.directory, - this.pageUrl, - this.isLocale, - this.archiveImage, - this.index, - this.chapterUrlModel, - this.pageIndex, { - this.cropImage, - this.isTransitionPage = false, - this.nextChapter, - this.mangaName, - this.isLastChapter = false, - }); - - UChapDataPreload.transition({ - required Chapter currentChapter, - required this.nextChapter, - required String this.mangaName, - required int this.pageIndex, - this.isLastChapter = false, - }) : chapter = currentChapter, - isTransitionPage = true, - directory = null, - pageUrl = null, - isLocale = null, - archiveImage = null, - index = null, - chapterUrlModel = null, - cropImage = null; -} - -class CustomPopupMenuButton extends StatelessWidget { - final String label; - final String title; - final ValueChanged onSelected; - final T value; - final List list; - final String Function(T) itemText; - const CustomPopupMenuButton({ - super.key, - required this.label, - required this.title, - required this.onSelected, - required this.value, - required this.list, - required this.itemText, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: PopupMenuButton( - popUpAnimationStyle: popupAnimationStyle, - tooltip: "", - offset: Offset.fromDirection(1), - color: Colors.black, - onSelected: onSelected, - itemBuilder: (context) => [ - for (var d in list) - PopupMenuItem( - value: d, - child: Row( - children: [ - Icon( - Icons.check, - color: d == value ? Colors.white : Colors.transparent, - ), - const SizedBox(width: 7), - Text( - itemText(d), - style: const TextStyle(color: Colors.white), - ), - ], - ), - ), - ], - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text( - label, - style: TextStyle( - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!.withValues(alpha: 0.9), - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ), - Row( - children: [ - Text(title), - const SizedBox(width: 20), - const Icon(Icons.keyboard_arrow_down_outlined), - ], - ), - ], - ), - ), - ), - ); - } -} - -class _CustomValueIndicatorShape extends SliderComponentShape { - final _indicatorShape = const PaddleSliderValueIndicatorShape(); - final bool tranform; - const _CustomValueIndicatorShape({this.tranform = false}); - @override - Size getPreferredSize(bool isEnabled, bool isDiscrete) { - return const Size(40, 40); - } - - @override - void paint( - PaintingContext context, - Offset center, { - required Animation activationAnimation, - required Animation enableAnimation, - required bool isDiscrete, - required TextPainter labelPainter, - required RenderBox parentBox, - required SliderThemeData sliderTheme, - required TextDirection textDirection, - required double value, - required double textScaleFactor, - required Size sizeWithOverflow, - }) { - final textSpan = TextSpan( - text: labelPainter.text?.toPlainText(), - style: sliderTheme.valueIndicatorTextStyle, - ); - - final textPainter = TextPainter( - text: textSpan, - textAlign: labelPainter.textAlign, - textDirection: textDirection, - ); - - textPainter.layout(); - - context.canvas.save(); - context.canvas.translate(center.dx, center.dy); - context.canvas.scale(tranform ? -1.0 : 1.0, 1.0); - context.canvas.translate(-center.dx, -center.dy); - - _indicatorShape.paint( - context, - center, - activationAnimation: activationAnimation, - enableAnimation: enableAnimation, - labelPainter: textPainter, - parentBox: parentBox, - sliderTheme: sliderTheme, - value: value, - textScaleFactor: textScaleFactor, - sizeWithOverflow: sizeWithOverflow, - isDiscrete: isDiscrete, - textDirection: textDirection, - ); - - context.canvas.restore(); - } -} diff --git a/lib/modules/manga/reader/u_chap_data_preload.dart b/lib/modules/manga/reader/u_chap_data_preload.dart new file mode 100644 index 00000000..68b7f1f4 --- /dev/null +++ b/lib/modules/manga/reader/u_chap_data_preload.dart @@ -0,0 +1,54 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/page.dart'; +import 'package:mangayomi/services/get_chapter_pages.dart'; + +class UChapDataPreload { + Chapter? chapter; + Directory? directory; + PageUrl? pageUrl; + bool? isLocale; + Uint8List? archiveImage; + int? index; + GetChapterPagesModel? chapterUrlModel; + int? pageIndex; + Uint8List? cropImage; + bool isTransitionPage; + Chapter? nextChapter; + String? mangaName; + bool? isLastChapter; + + UChapDataPreload( + this.chapter, + this.directory, + this.pageUrl, + this.isLocale, + this.archiveImage, + this.index, + this.chapterUrlModel, + this.pageIndex, { + this.cropImage, + this.isTransitionPage = false, + this.nextChapter, + this.mangaName, + this.isLastChapter = false, + }); + + UChapDataPreload.transition({ + required Chapter currentChapter, + required this.nextChapter, + required String this.mangaName, + required int this.pageIndex, + this.isLastChapter = false, + }) : chapter = currentChapter, + isTransitionPage = true, + directory = null, + pageUrl = null, + isLocale = null, + archiveImage = null, + index = null, + chapterUrlModel = null, + cropImage = null; +} diff --git a/lib/modules/manga/reader/virtual_scrolling/virtual_manga_list.dart b/lib/modules/manga/reader/virtual_scrolling/virtual_manga_list.dart index 22274bcc..43bfd4dd 100644 --- a/lib/modules/manga/reader/virtual_scrolling/virtual_manga_list.dart +++ b/lib/modules/manga/reader/virtual_scrolling/virtual_manga_list.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart' as reader; import 'package:mangayomi/modules/manga/reader/image_view_vertical.dart'; import 'package:mangayomi/modules/manga/reader/double_columm_view_vertical.dart'; import 'package:mangayomi/modules/manga/reader/widgets/transition_view_vertical.dart'; @@ -21,7 +21,7 @@ class VirtualMangaList extends ConsumerStatefulWidget { final double minCacheExtent; final int initialScrollIndex; final ScrollPhysics physics; - final Function(reader.UChapDataPreload data) onLongPressData; + final Function(UChapDataPreload data) onLongPressData; final Function(bool) onFailedToLoadImage; final BackgroundColor backgroundColor; final bool isDoublePageMode; @@ -215,7 +215,7 @@ class _VirtualMangaListState extends ConsumerState { final int index1 = index * 2 - 1; final int index2 = index1 + 1; - final List datas = index == 0 + final List datas = index == 0 ? [widget.pageManager.getOriginalPage(0), null] : [ index1 < widget.pageManager.pageCount diff --git a/lib/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart b/lib/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart index c954eeb8..38ce27b5 100644 --- a/lib/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart +++ b/lib/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart' as reader; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; /// Page loading states for virtual scrolling enum PageLoadState { notLoaded, loading, loaded, error, cached } @@ -10,7 +10,7 @@ enum PageLoadState { notLoaded, loading, loaded, error, cached } /// Virtual page information for tracking state class VirtualPageInfo { final int index; - final reader.UChapDataPreload originalData; + final UChapDataPreload originalData; PageLoadState loadState; DateTime? lastAccessTime; Object? error; @@ -56,7 +56,7 @@ class VirtualPageConfig { /// Manages virtual page loading and memory optimization class VirtualPageManager extends ChangeNotifier { - final List _originalPages; + final List _originalPages; final VirtualPageConfig config; final Map _pageInfoMap = {}; final Set _preloadQueue = {}; @@ -65,7 +65,7 @@ class VirtualPageManager extends ChangeNotifier { Timer? _cleanupTimer; VirtualPageManager({ - required List pages, + required List pages, this.config = const VirtualPageConfig(), }) : _originalPages = List.from(pages) { _initializePages(); @@ -108,7 +108,7 @@ class VirtualPageManager extends ChangeNotifier { } /// Get original page data - reader.UChapDataPreload? getOriginalPage(int index) { + UChapDataPreload? getOriginalPage(int index) { if (index < 0 || index >= _originalPages.length) return null; return _originalPages[index]; } diff --git a/lib/modules/manga/reader/virtual_scrolling/virtual_reader_view.dart b/lib/modules/manga/reader/virtual_scrolling/virtual_reader_view.dart index 136a90b6..b1aa41de 100644 --- a/lib/modules/manga/reader/virtual_scrolling/virtual_reader_view.dart +++ b/lib/modules/manga/reader/virtual_scrolling/virtual_reader_view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; @@ -7,11 +8,10 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/modules/manga/reader/virtual_scrolling/virtual_page_manager.dart'; import 'package:mangayomi/modules/manga/reader/virtual_scrolling/virtual_manga_list.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart' as reader; /// Provides virtual page manager instances final virtualPageManagerProvider = - Provider.family>(( + Provider.family>(( ref, pages, ) { @@ -20,7 +20,7 @@ final virtualPageManagerProvider = /// Main widget for virtual reading that replaces ScrollablePositionedList class VirtualReaderView extends ConsumerStatefulWidget { - final List pages; + final List pages; final ItemScrollController itemScrollController; final ScrollOffsetController scrollOffsetController; final ItemPositionsListener itemPositionsListener; @@ -28,7 +28,7 @@ class VirtualReaderView extends ConsumerStatefulWidget { final double minCacheExtent; final int initialScrollIndex; final ScrollPhysics physics; - final Function(reader.UChapDataPreload data) onLongPressData; + final Function(UChapDataPreload data) onLongPressData; final Function(bool) onFailedToLoadImage; final BackgroundColor backgroundColor; final bool isDoublePageMode; @@ -169,10 +169,10 @@ mixin VirtualPageManagerMixin } /// Override this method to provide the pages list - List getPages(); + List getPages(); /// Call this when pages change - void updateVirtualPages(List newPages) { + void updateVirtualPages(List newPages) { _virtualPageManager?.dispose(); _virtualPageManager = VirtualPageManager(pages: newPages); } diff --git a/lib/modules/manga/reader/widgets/custom_popup_menu_button.dart b/lib/modules/manga/reader/widgets/custom_popup_menu_button.dart new file mode 100644 index 00000000..4f29e069 --- /dev/null +++ b/lib/modules/manga/reader/widgets/custom_popup_menu_button.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:mangayomi/utils/global_style.dart'; + +class CustomPopupMenuButton extends StatelessWidget { + final String label; + final String title; + final ValueChanged onSelected; + final T value; + final List list; + final String Function(T) itemText; + const CustomPopupMenuButton({ + super.key, + required this.label, + required this.title, + required this.onSelected, + required this.value, + required this.list, + required this.itemText, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: PopupMenuButton( + popUpAnimationStyle: popupAnimationStyle, + tooltip: "", + offset: Offset.fromDirection(1), + color: Colors.black, + onSelected: onSelected, + itemBuilder: (context) => [ + for (var d in list) + PopupMenuItem( + value: d, + child: Row( + children: [ + Icon( + Icons.check, + color: d == value ? Colors.white : Colors.transparent, + ), + const SizedBox(width: 7), + Text( + itemText(d), + style: const TextStyle(color: Colors.white), + ), + ], + ), + ), + ], + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + label, + style: TextStyle( + color: Theme.of( + context, + ).textTheme.bodyLarge!.color!.withValues(alpha: 0.9), + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + Row( + children: [ + Text(title), + const SizedBox(width: 20), + const Icon(Icons.keyboard_arrow_down_outlined), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/modules/manga/reader/widgets/custom_value_indicator_shape.dart b/lib/modules/manga/reader/widgets/custom_value_indicator_shape.dart new file mode 100644 index 00000000..ddda1f93 --- /dev/null +++ b/lib/modules/manga/reader/widgets/custom_value_indicator_shape.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class CustomValueIndicatorShape extends SliderComponentShape { + final _indicatorShape = const PaddleSliderValueIndicatorShape(); + final bool tranform; + const CustomValueIndicatorShape({this.tranform = false}); + @override + Size getPreferredSize(bool isEnabled, bool isDiscrete) { + return const Size(40, 40); + } + + @override + void paint( + PaintingContext context, + Offset center, { + required Animation activationAnimation, + required Animation enableAnimation, + required bool isDiscrete, + required TextPainter labelPainter, + required RenderBox parentBox, + required SliderThemeData sliderTheme, + required TextDirection textDirection, + required double value, + required double textScaleFactor, + required Size sizeWithOverflow, + }) { + final textSpan = TextSpan( + text: labelPainter.text?.toPlainText(), + style: sliderTheme.valueIndicatorTextStyle, + ); + + final textPainter = TextPainter( + text: textSpan, + textAlign: labelPainter.textAlign, + textDirection: textDirection, + ); + + textPainter.layout(); + + context.canvas.save(); + context.canvas.translate(center.dx, center.dy); + context.canvas.scale(tranform ? -1.0 : 1.0, 1.0); + context.canvas.translate(-center.dx, -center.dy); + + _indicatorShape.paint( + context, + center, + activationAnimation: activationAnimation, + enableAnimation: enableAnimation, + labelPainter: textPainter, + parentBox: parentBox, + sliderTheme: sliderTheme, + value: value, + textScaleFactor: textScaleFactor, + sizeWithOverflow: sizeWithOverflow, + isDiscrete: isDiscrete, + textDirection: textDirection, + ); + + context.canvas.restore(); + } +} diff --git a/lib/modules/manga/reader/widgets/transition_view_paged.dart b/lib/modules/manga/reader/widgets/transition_view_paged.dart index 96abcd4d..57f8bb75 100644 --- a/lib/modules/manga/reader/widgets/transition_view_paged.dart +++ b/lib/modules/manga/reader/widgets/transition_view_paged.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/chapter_transition_page.dart'; class TransitionViewPaged extends ConsumerWidget { diff --git a/lib/modules/manga/reader/widgets/transition_view_vertical.dart b/lib/modules/manga/reader/widgets/transition_view_vertical.dart index 2ea9f674..2a80e717 100644 --- a/lib/modules/manga/reader/widgets/transition_view_vertical.dart +++ b/lib/modules/manga/reader/widgets/transition_view_vertical.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/widgets/chapter_transition_page.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 6384e778..83a6b9a5 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -11,7 +11,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; -import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/anime/widgets/desktop.dart'; import 'package:mangayomi/modules/manga/reader/widgets/btn_chapter_list_dialog.dart'; @@ -22,9 +21,7 @@ import 'package:mangayomi/services/get_html_content.dart'; import 'package:mangayomi/utils/extensions/dom_extensions.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; -import 'package:mangayomi/services/get_chapter_pages.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; -import 'package:mangayomi/utils/global_style.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:window_manager/window_manager.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; @@ -759,104 +756,3 @@ class _NovelWebViewState extends ConsumerState return null; } } - -class UChapDataPreload { - Chapter? chapter; - Directory? directory; - PageUrl? pageUrl; - bool? isLocale; - Uint8List? archiveImage; - int? index; - GetChapterPagesModel? chapterUrlModel; - int? pageIndex; - Uint8List? cropImage; - UChapDataPreload( - this.chapter, - this.directory, - this.pageUrl, - this.isLocale, - this.archiveImage, - this.index, - this.chapterUrlModel, - this.pageIndex, { - this.cropImage, - }); -} - -class CustomPopupMenuButton extends StatelessWidget { - final String label; - final String title; - final ValueChanged onSelected; - final T value; - final List list; - final String Function(T) itemText; - const CustomPopupMenuButton({ - super.key, - required this.label, - required this.title, - required this.onSelected, - required this.value, - required this.list, - required this.itemText, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: PopupMenuButton( - popUpAnimationStyle: popupAnimationStyle, - tooltip: "", - offset: Offset.fromDirection(1), - color: Colors.black, - onSelected: onSelected, - itemBuilder: (context) => [ - for (var d in list) - PopupMenuItem( - value: d, - child: Row( - children: [ - Icon( - Icons.check, - color: d == value ? Colors.white : Colors.transparent, - ), - const SizedBox(width: 7), - Text( - itemText(d), - style: const TextStyle(color: Colors.white), - ), - ], - ), - ), - ], - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text( - label, - style: TextStyle( - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!.withValues(alpha: 0.9), - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ), - Row( - children: [ - Text(title), - const SizedBox(width: 20), - const Icon(Icons.keyboard_arrow_down_outlined), - ], - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/services/get_chapter_pages.dart b/lib/services/get_chapter_pages.dart index 5dfa05db..7f1a9787 100644 --- a/lib/services/get_chapter_pages.dart +++ b/lib/services/get_chapter_pages.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:path/path.dart' as p; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/javascript/http.dart'; @@ -9,7 +10,6 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart'; diff --git a/lib/utils/extensions/others.dart b/lib/utils/extensions/others.dart index d1ba834d..fd5f94b7 100644 --- a/lib/utils/extensions/others.dart +++ b/lib/utils/extensions/others.dart @@ -5,7 +5,7 @@ import 'dart:ui'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/utils/headers.dart'; From 1450641f1688cea4553da502e22afb3a0a95ffe0 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 24 Jul 2025 22:25:14 +0200 Subject: [PATCH 002/100] added mpv config for Anime4K --- lib/eval/dart/bridge/m_chapter.dart | 20 + lib/eval/model/m_chapter.dart | 35 +- lib/l10n/app_en.arb | 5 +- lib/l10n/generated/app_localizations.dart | 18 + lib/l10n/generated/app_localizations_ar.dart | 10 + lib/l10n/generated/app_localizations_de.dart | 10 + lib/l10n/generated/app_localizations_en.dart | 10 + lib/l10n/generated/app_localizations_es.dart | 10 + lib/l10n/generated/app_localizations_fr.dart | 10 + lib/l10n/generated/app_localizations_id.dart | 10 + lib/l10n/generated/app_localizations_it.dart | 10 + lib/l10n/generated/app_localizations_pt.dart | 10 + lib/l10n/generated/app_localizations_ru.dart | 10 + lib/l10n/generated/app_localizations_th.dart | 10 + lib/l10n/generated/app_localizations_tr.dart | 10 + lib/l10n/generated/app_localizations_zh.dart | 10 + lib/main.dart | 1 + lib/models/chapter.dart | 27 + lib/models/chapter.g.dart | 928 +++++++++++++++++- lib/models/settings.dart | 5 + lib/models/settings.g.dart | 90 +- lib/modules/anime/anime_player_view.dart | 65 +- lib/modules/anime/widgets/desktop.dart | 21 + .../update_manga_detail_providers.dart | 10 + .../update_manga_detail_providers.g.dart | 2 +- .../more/settings/player/player_screen.dart | 176 +++- .../providers/player_state_provider.dart | 16 + .../providers/player_state_provider.g.dart | 16 + lib/providers/storage_provider.dart | 7 + lib/services/get_video_list.dart | 10 +- lib/services/get_video_list.g.dart | 23 +- lib/utils/extensions/string_extensions.dart | 22 + linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + pubspec.lock | 21 +- pubspec.yaml | 5 +- 36 files changed, 1571 insertions(+), 77 deletions(-) diff --git a/lib/eval/dart/bridge/m_chapter.dart b/lib/eval/dart/bridge/m_chapter.dart index c3160e7d..3b66e6e9 100644 --- a/lib/eval/dart/bridge/m_chapter.dart +++ b/lib/eval/dart/bridge/m_chapter.dart @@ -12,6 +12,11 @@ class MChapterBridge { url: namedArgs.get('url'), dateUpload: namedArgs.get('dateUpload'), scanlator: namedArgs.get('scanlator'), + isFiller: namedArgs.get('isFiller'), + thumbnailUrl: namedArgs.get('scanlator'), + description: namedArgs.get('scanlator'), + downloadSize: namedArgs.get('scanlator'), + duration: namedArgs.get('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) { diff --git a/lib/eval/model/m_chapter.dart b/lib/eval/model/m_chapter.dart index 8a774db1..82fa94ef 100644 --- a/lib/eval/model/m_chapter.dart +++ b/lib/eval/model/m_chapter.dart @@ -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 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 toJson() => { @@ -20,5 +48,10 @@ class MChapter { 'url': url, 'dateUpload': dateUpload, 'scanlator': scanlator, + 'isFiller': isFiller, + 'thumbnailUrl': thumbnailUrl, + 'description': description, + 'downloadSize': downloadSize, + 'duration': duration, }; } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 38ed6832..6a855653 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -468,5 +468,8 @@ "hide_discord_rpc_incognito": "Hide Discord RPC while in Incognito", "rpc_show_reading_watching_progress": "Show current chapter in Discord (requires a restart)", "rpc_show_title": "Show current title in Discord", - "rpc_show_cover_image": "Show current cover image in Discord" + "rpc_show_cover_image": "Show current cover image in Discord", + "anime4K": "Enable Anime4K", + "anime4K_info": "Supports .js scripts under /mpv/scripts/", + "anime4K_download": "MPV config files are required!\nDownload now?" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index e56eec94..3fc9b39d 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2884,6 +2884,24 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Show current cover image in Discord'** String get rpc_show_cover_image; + + /// No description provided for @anime4K. + /// + /// In en, this message translates to: + /// **'Enable Anime4K'** + String get anime4K; + + /// No description provided for @anime4K_info. + /// + /// In en, this message translates to: + /// **'Supports .js scripts under /mpv/scripts/'** + String get anime4K_info; + + /// No description provided for @anime4K_download. + /// + /// In en, this message translates to: + /// **'MPV config files are required!\nDownload now?'** + String get anime4K_download; } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 684efe04..f66f5b99 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1485,4 +1485,14 @@ class AppLocalizationsAr extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 4a2166d5..24741a3e 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1498,4 +1498,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 05da3e52..ed3e94c9 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1486,4 +1486,14 @@ class AppLocalizationsEn extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 86c7bdde..d0d86c94 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1503,6 +1503,16 @@ class AppLocalizationsEs extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 82a2ca30..cd0ebf0a 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1504,4 +1504,14 @@ class AppLocalizationsFr extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 43e86f70..ce465df5 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1492,4 +1492,14 @@ class AppLocalizationsId extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index aa4be1b8..4e8ed88a 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1501,4 +1501,14 @@ class AppLocalizationsIt extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index bb883598..5d7a1014 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1500,6 +1500,16 @@ class AppLocalizationsPt extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 5c0298de..e226264c 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1502,4 +1502,14 @@ class AppLocalizationsRu extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 40a25995..8d8944d9 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1486,4 +1486,14 @@ class AppLocalizationsTh extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index f010c51e..1e93bf14 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1492,4 +1492,14 @@ class AppLocalizationsTr extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index ee59d081..b32d5233 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1457,4 +1457,14 @@ class AppLocalizationsZh extends AppLocalizations { @override String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get anime4K => 'Enable Anime4K'; + + @override + String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + + @override + String get anime4K_download => + 'MPV config files are required!\nDownload now?'; } diff --git a/lib/main.dart b/lib/main.dart index a0cdb672..15173eec 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,6 +30,7 @@ import 'package:mangayomi/utils/discord_rpc.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'; +// ignore: depend_on_referenced_packages import 'package:media_kit/media_kit.dart'; import 'package:path_provider/path_provider.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/models/chapter.dart b/lib/models/chapter.dart index a09cb415..d2d2c0e7 100644 --- a/lib/models/chapter.dart +++ b/lib/models/chapter.dart @@ -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(); @@ -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, }; } diff --git a/lib/models/chapter.g.dart b/lib/models/chapter.g.dart index 9bebb94f..acc08cac 100644 --- a/lib/models/chapter.g.dart +++ b/lib/models/chapter.g.dart @@ -27,43 +27,68 @@ const ChapterSchema = CollectionSchema( name: r'dateUpload', type: IsarType.string, ), - r'isBookmarked': PropertySchema( + r'description': PropertySchema( id: 2, + name: r'description', + type: IsarType.string, + ), + r'downloadSize': PropertySchema( + id: 3, + name: r'downloadSize', + type: IsarType.string, + ), + r'duration': PropertySchema( + id: 4, + name: r'duration', + type: IsarType.string, + ), + r'isBookmarked': PropertySchema( + id: 5, name: r'isBookmarked', type: IsarType.bool, ), + r'isFiller': PropertySchema( + id: 6, + name: r'isFiller', + type: IsarType.bool, + ), r'isRead': PropertySchema( - id: 3, + id: 7, name: r'isRead', type: IsarType.bool, ), r'lastPageRead': PropertySchema( - id: 4, + id: 8, name: r'lastPageRead', type: IsarType.string, ), r'mangaId': PropertySchema( - id: 5, + id: 9, name: r'mangaId', type: IsarType.long, ), r'name': PropertySchema( - id: 6, + id: 10, name: r'name', type: IsarType.string, ), r'scanlator': PropertySchema( - id: 7, + id: 11, name: r'scanlator', type: IsarType.string, ), + r'thumbnailUrl': PropertySchema( + id: 12, + name: r'thumbnailUrl', + type: IsarType.string, + ), r'updatedAt': PropertySchema( - id: 8, + id: 13, name: r'updatedAt', type: IsarType.long, ), r'url': PropertySchema( - id: 9, + id: 14, name: r'url', type: IsarType.string, ) @@ -107,6 +132,24 @@ int _chapterEstimateSize( bytesCount += 3 + value.length * 3; } } + { + final value = object.description; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.downloadSize; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.duration; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.lastPageRead; if (value != null) { @@ -125,6 +168,12 @@ int _chapterEstimateSize( bytesCount += 3 + value.length * 3; } } + { + final value = object.thumbnailUrl; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.url; if (value != null) { @@ -142,14 +191,19 @@ void _chapterSerialize( ) { writer.writeString(offsets[0], object.archivePath); writer.writeString(offsets[1], object.dateUpload); - writer.writeBool(offsets[2], object.isBookmarked); - writer.writeBool(offsets[3], object.isRead); - writer.writeString(offsets[4], object.lastPageRead); - writer.writeLong(offsets[5], object.mangaId); - writer.writeString(offsets[6], object.name); - writer.writeString(offsets[7], object.scanlator); - writer.writeLong(offsets[8], object.updatedAt); - writer.writeString(offsets[9], object.url); + writer.writeString(offsets[2], object.description); + writer.writeString(offsets[3], object.downloadSize); + writer.writeString(offsets[4], object.duration); + writer.writeBool(offsets[5], object.isBookmarked); + writer.writeBool(offsets[6], object.isFiller); + writer.writeBool(offsets[7], object.isRead); + writer.writeString(offsets[8], object.lastPageRead); + writer.writeLong(offsets[9], object.mangaId); + writer.writeString(offsets[10], object.name); + writer.writeString(offsets[11], object.scanlator); + writer.writeString(offsets[12], object.thumbnailUrl); + writer.writeLong(offsets[13], object.updatedAt); + writer.writeString(offsets[14], object.url); } Chapter _chapterDeserialize( @@ -161,15 +215,20 @@ Chapter _chapterDeserialize( final object = Chapter( archivePath: reader.readStringOrNull(offsets[0]), dateUpload: reader.readStringOrNull(offsets[1]), + description: reader.readStringOrNull(offsets[2]), + downloadSize: reader.readStringOrNull(offsets[3]), + duration: reader.readStringOrNull(offsets[4]), id: id, - isBookmarked: reader.readBoolOrNull(offsets[2]), - isRead: reader.readBoolOrNull(offsets[3]), - lastPageRead: reader.readStringOrNull(offsets[4]), - mangaId: reader.readLongOrNull(offsets[5]), - name: reader.readStringOrNull(offsets[6]), - scanlator: reader.readStringOrNull(offsets[7]), - updatedAt: reader.readLongOrNull(offsets[8]), - url: reader.readStringOrNull(offsets[9]), + isBookmarked: reader.readBoolOrNull(offsets[5]), + isFiller: reader.readBoolOrNull(offsets[6]), + isRead: reader.readBoolOrNull(offsets[7]), + lastPageRead: reader.readStringOrNull(offsets[8]), + mangaId: reader.readLongOrNull(offsets[9]), + name: reader.readStringOrNull(offsets[10]), + scanlator: reader.readStringOrNull(offsets[11]), + thumbnailUrl: reader.readStringOrNull(offsets[12]), + updatedAt: reader.readLongOrNull(offsets[13]), + url: reader.readStringOrNull(offsets[14]), ); return object; } @@ -186,20 +245,30 @@ P _chapterDeserializeProp

( case 1: return (reader.readStringOrNull(offset)) as P; case 2: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 3: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 4: return (reader.readStringOrNull(offset)) as P; case 5: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 6: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 7: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 8: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 9: + return (reader.readLongOrNull(offset)) as P; + case 10: + return (reader.readStringOrNull(offset)) as P; + case 11: + return (reader.readStringOrNull(offset)) as P; + case 12: + return (reader.readStringOrNull(offset)) as P; + case 13: + return (reader.readLongOrNull(offset)) as P; + case 14: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -589,6 +658,447 @@ extension ChapterQueryFilter }); } + QueryBuilder descriptionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'description', + )); + }); + } + + QueryBuilder descriptionIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'description', + )); + }); + } + + QueryBuilder descriptionEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'description', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'description', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder + descriptionIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder downloadSizeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'downloadSize', + )); + }); + } + + QueryBuilder + downloadSizeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'downloadSize', + )); + }); + } + + QueryBuilder downloadSizeEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'downloadSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'downloadSize', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder downloadSizeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'downloadSize', + value: '', + )); + }); + } + + QueryBuilder + downloadSizeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'downloadSize', + value: '', + )); + }); + } + + QueryBuilder durationIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'duration', + )); + }); + } + + QueryBuilder durationIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'duration', + )); + }); + } + + QueryBuilder durationEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'duration', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'duration', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder durationIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'duration', + value: '', + )); + }); + } + + QueryBuilder durationIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'duration', + value: '', + )); + }); + } + QueryBuilder idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -684,6 +1194,32 @@ extension ChapterQueryFilter }); } + QueryBuilder isFillerIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isFiller', + )); + }); + } + + QueryBuilder isFillerIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isFiller', + )); + }); + } + + QueryBuilder isFillerEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isFiller', + value: value, + )); + }); + } + QueryBuilder isReadIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -1219,6 +1755,154 @@ extension ChapterQueryFilter }); } + QueryBuilder thumbnailUrlIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'thumbnailUrl', + )); + }); + } + + QueryBuilder + thumbnailUrlIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'thumbnailUrl', + )); + }); + } + + QueryBuilder thumbnailUrlEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'thumbnailUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'thumbnailUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder thumbnailUrlIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'thumbnailUrl', + value: '', + )); + }); + } + + QueryBuilder + thumbnailUrlIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'thumbnailUrl', + value: '', + )); + }); + } + QueryBuilder updatedAtIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -1479,6 +2163,42 @@ extension ChapterQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder sortByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder sortByDownloadSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadSize', Sort.asc); + }); + } + + QueryBuilder sortByDownloadSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadSize', Sort.desc); + }); + } + + QueryBuilder sortByDuration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'duration', Sort.asc); + }); + } + + QueryBuilder sortByDurationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'duration', Sort.desc); + }); + } + QueryBuilder sortByIsBookmarked() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isBookmarked', Sort.asc); @@ -1491,6 +2211,18 @@ extension ChapterQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByIsFiller() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFiller', Sort.asc); + }); + } + + QueryBuilder sortByIsFillerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFiller', Sort.desc); + }); + } + QueryBuilder sortByIsRead() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isRead', Sort.asc); @@ -1551,6 +2283,18 @@ extension ChapterQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByThumbnailUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'thumbnailUrl', Sort.asc); + }); + } + + QueryBuilder sortByThumbnailUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'thumbnailUrl', Sort.desc); + }); + } + QueryBuilder sortByUpdatedAt() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updatedAt', Sort.asc); @@ -1602,6 +2346,42 @@ extension ChapterQuerySortThenBy }); } + QueryBuilder thenByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder thenByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder thenByDownloadSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadSize', Sort.asc); + }); + } + + QueryBuilder thenByDownloadSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadSize', Sort.desc); + }); + } + + QueryBuilder thenByDuration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'duration', Sort.asc); + }); + } + + QueryBuilder thenByDurationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'duration', Sort.desc); + }); + } + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); @@ -1626,6 +2406,18 @@ extension ChapterQuerySortThenBy }); } + QueryBuilder thenByIsFiller() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFiller', Sort.asc); + }); + } + + QueryBuilder thenByIsFillerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFiller', Sort.desc); + }); + } + QueryBuilder thenByIsRead() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isRead', Sort.asc); @@ -1686,6 +2478,18 @@ extension ChapterQuerySortThenBy }); } + QueryBuilder thenByThumbnailUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'thumbnailUrl', Sort.asc); + }); + } + + QueryBuilder thenByThumbnailUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'thumbnailUrl', Sort.desc); + }); + } + QueryBuilder thenByUpdatedAt() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updatedAt', Sort.asc); @@ -1727,12 +2531,39 @@ extension ChapterQueryWhereDistinct }); } + QueryBuilder distinctByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'description', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByDownloadSize( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'downloadSize', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByDuration( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'duration', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByIsBookmarked() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'isBookmarked'); }); } + QueryBuilder distinctByIsFiller() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isFiller'); + }); + } + QueryBuilder distinctByIsRead() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'isRead'); @@ -1766,6 +2597,13 @@ extension ChapterQueryWhereDistinct }); } + QueryBuilder distinctByThumbnailUrl( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'thumbnailUrl', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByUpdatedAt() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'updatedAt'); @@ -1800,12 +2638,36 @@ extension ChapterQueryProperty }); } + QueryBuilder descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'description'); + }); + } + + QueryBuilder downloadSizeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'downloadSize'); + }); + } + + QueryBuilder durationProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'duration'); + }); + } + QueryBuilder isBookmarkedProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'isBookmarked'); }); } + QueryBuilder isFillerProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isFiller'); + }); + } + QueryBuilder isReadProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'isRead'); @@ -1836,6 +2698,12 @@ extension ChapterQueryProperty }); } + QueryBuilder thumbnailUrlProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'thumbnailUrl'); + }); + } + QueryBuilder updatedAtProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'updatedAt'); diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 35efb128..5076aa30 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -256,6 +256,8 @@ class Settings { bool? rpcShowCoverImage; + bool? useAnime4K; + Settings({ this.id = 227, this.displayType = DisplayType.compactGrid, @@ -370,6 +372,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, + this.useAnime4K = false, }); Settings.fromJson(Map json) { @@ -590,6 +593,7 @@ class Settings { rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress']; rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; + useAnime4K = json['useAnime4K']; } Map toJson() => { @@ -727,6 +731,7 @@ class Settings { 'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress, 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, + 'useAnime4K': useAnime4K, }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 9ce98abf..60fce2ad 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -623,18 +623,23 @@ const SettingsSchema = CollectionSchema( name: r'updateProgressAfterReading', type: IsarType.bool, ), - r'useLibass': PropertySchema( + r'useAnime4K': PropertySchema( id: 115, + name: r'useAnime4K', + type: IsarType.bool, + ), + r'useLibass': PropertySchema( + id: 116, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 116, + id: 117, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 117, + id: 118, name: r'userAgent', type: IsarType.string, ) @@ -1238,9 +1243,10 @@ void _settingsSerialize( writer.writeLong(offsets[112], object.startDatebackup); writer.writeBool(offsets[113], object.themeIsDark); writer.writeBool(offsets[114], object.updateProgressAfterReading); - writer.writeBool(offsets[115], object.useLibass); - writer.writeBool(offsets[116], object.usePageTapZones); - writer.writeString(offsets[117], object.userAgent); + writer.writeBool(offsets[115], object.useAnime4K); + writer.writeBool(offsets[116], object.useLibass); + writer.writeBool(offsets[117], object.usePageTapZones); + writer.writeString(offsets[118], object.userAgent); } Settings _settingsDeserialize( @@ -1455,9 +1461,10 @@ Settings _settingsDeserialize( startDatebackup: reader.readLongOrNull(offsets[112]), themeIsDark: reader.readBoolOrNull(offsets[113]), updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), - useLibass: reader.readBoolOrNull(offsets[115]), - usePageTapZones: reader.readBoolOrNull(offsets[116]), - userAgent: reader.readStringOrNull(offsets[117]), + useAnime4K: reader.readBoolOrNull(offsets[115]), + useLibass: reader.readBoolOrNull(offsets[116]), + usePageTapZones: reader.readBoolOrNull(offsets[117]), + userAgent: reader.readStringOrNull(offsets[118]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1850,6 +1857,8 @@ P _settingsDeserializeProp

( case 116: return (reader.readBoolOrNull(offset)) as P; case 117: + return (reader.readBoolOrNull(offset)) as P; + case 118: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -9504,6 +9513,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useAnime4KIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useAnime4K', + )); + }); + } + + QueryBuilder + useAnime4KIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useAnime4K', + )); + }); + } + + QueryBuilder useAnime4KEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useAnime4K', + value: value, + )); + }); + } + QueryBuilder useLibassIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -11113,6 +11149,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.asc); + }); + } + + QueryBuilder sortByUseAnime4KDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.desc); + }); + } + QueryBuilder sortByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -12358,6 +12406,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.asc); + }); + } + + QueryBuilder thenByUseAnime4KDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.desc); + }); + } + QueryBuilder thenByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -13016,6 +13076,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useAnime4K'); + }); + } + QueryBuilder distinctByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'useLibass'); @@ -13813,6 +13879,12 @@ extension SettingsQueryProperty }); } + QueryBuilder useAnime4KProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useAnime4K'); + }); + } + QueryBuilder useLibassProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'useLibass'); diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 59604caa..f33f3aef 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -1,7 +1,10 @@ import 'dart:async'; +import 'dart:ffi'; import 'dart:io'; import 'package:bot_toast/bot_toast.dart'; +import 'package:ffi/ffi.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -31,6 +34,7 @@ import 'package:mangayomi/services/torrent_server.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:media_kit/media_kit.dart'; +import 'package:media_kit/generated/libmpv/bindings.dart' as generated; 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:path/path.dart' as p; @@ -71,7 +75,7 @@ class _AnimePlayerViewState extends riv.ConsumerState { SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); return serversData.when( data: (data) { - final (videos, isLocal, infoHashList) = data; + final (videos, isLocal, infoHashList, mpvDirectory) = data; _infoHashList = infoHashList; if (videos.isEmpty && !(episode.manga.value!.isLocalArchive ?? false)) { return Scaffold( @@ -99,6 +103,7 @@ class _AnimePlayerViewState extends riv.ConsumerState { desktopFullScreenPlayer: (value) { desktopFullScreenPlayer = value; }, + mpvDirectory: mpvDirectory, ); }, error: (error, stackTrace) => Scaffold( @@ -147,6 +152,7 @@ class AnimeStreamPage extends riv.ConsumerStatefulWidget { final String defaultSubtitle; final bool isLocal; final bool isTorrent; + final Directory? mpvDirectory; final void Function(bool) desktopFullScreenPlayer; const AnimeStreamPage({ super.key, @@ -156,6 +162,7 @@ class AnimeStreamPage extends riv.ConsumerStatefulWidget { required this.episode, required this.isTorrent, required this.desktopFullScreenPlayer, + required this.mpvDirectory, }); @override @@ -172,8 +179,15 @@ class _AnimeStreamPageState extends riv.ConsumerState with TickerProviderStateMixin, WidgetsBindingObserver { late final GlobalKey _key = GlobalKey(); late final useLibass = ref.read(useLibassStateProvider); + late final useAnime4K = ref.read(useAnime4KStateProvider); late final Player _player = Player( - configuration: PlayerConfiguration(libass: useLibass), + configuration: PlayerConfiguration( + libass: useLibass, + config: true, + configDir: useAnime4K ? widget.mpvDirectory?.path ?? "" : "", + observeProperties: {}, + eventHandler: _handleMpvEvents, + ), ); late final hwdecMode = ref.read(hwdecModeStateProvider()); late final VideoController _controller = VideoController( @@ -246,6 +260,25 @@ class _AnimeStreamPageState extends riv.ConsumerState } }); + Future _handleMpvEvents(Pointer event) async { + try { + if (event.ref.event_id == + generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE) { + final prop = event.ref.data.cast(); + if (prop.ref.name.cast().toDartString() == + "user-data/aniyomi/dummy_number" && + prop.ref.format == generated.mpv_format.MPV_FORMAT_INT64) { + final number = prop.ref.data.cast().value; + botToast("Dummy number: $number"); + } + } + } catch (e) { + if (kDebugMode) { + debugPrint(e.toString()); + } + } + } + void pushToNewEpisode(BuildContext context, Chapter episode) { widget.desktopFullScreenPlayer.call(ref.read(fullscreenProvider)); if (context.mounted) { @@ -1030,6 +1063,34 @@ class _AnimeStreamPageState extends riv.ConsumerState onPressed: () => _videoSettingDraggableMenu(context), icon: const Icon(Icons.video_settings, color: Colors.white), ), + if (useAnime4K) + PopupMenuButton( + tooltip: '', // Remove default tooltip "Show menu" for consistency + icon: const Icon(Icons.high_quality, color: Colors.white), + itemBuilder: (context) => + [ + ("Anime4K: Mode A (Fast)", "CTRL+1"), + ("Anime4K: Mode B (Fast)", "CTRL+2"), + ("Anime4K: Mode C (Fast)", "CTRL+3"), + ("Anime4K: Mode A+A (Fast)", "CTRL+4"), + ("Anime4K: Mode B+B (Fast)", "CTRL+5"), + ("Anime4K: Mode C+A (Fast)", "CTRL+6"), + ("Clear GLSL shaders", "CTRL+0"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text(mode.$1), + onTap: () { + (_player.platform as dynamic).command([ + "keydown", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.speed, color: Colors.white), diff --git a/lib/modules/anime/widgets/desktop.dart b/lib/modules/anime/widgets/desktop.dart index eadc18be..ae3a9032 100644 --- a/lib/modules/anime/widgets/desktop.dart +++ b/lib/modules/anime/widgets/desktop.dart @@ -215,6 +215,27 @@ class _DesktopControllerWidgetState final desktopFullScreenPlayer = widget.desktopFullScreenPlayer; await _changeFullScreen(ref, desktopFullScreenPlayer, value: false); }, + const SingleActivator(LogicalKeyboardKey.digit0, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+0"]); + }, + const SingleActivator(LogicalKeyboardKey.digit1, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+1"]); + }, + const SingleActivator(LogicalKeyboardKey.digit2, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+2"]); + }, + const SingleActivator(LogicalKeyboardKey.digit3, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+3"]); + }, + const SingleActivator(LogicalKeyboardKey.digit4, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+4"]); + }, + const SingleActivator(LogicalKeyboardKey.digit5, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+5"]); + }, + const SingleActivator(LogicalKeyboardKey.digit6, control: true): () { + (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+6"]); + }, }, child: Stack( children: [ diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index c5a16393..162f22a3 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -81,6 +81,11 @@ Future updateMangaDetail( scanlator: chaps[i].scanlator ?? '', mangaId: mangaId, updatedAt: DateTime.now().millisecondsSinceEpoch, + isFiller: chaps[i].isFiller, + thumbnailUrl: chaps[i].thumbnailUrl, + description: chaps[i].description, + downloadSize: chaps[i].downloadSize, + duration: chaps[i].duration, )..manga.value = manga; chapters.add(chapter); } @@ -115,6 +120,11 @@ Future updateMangaDetail( oldChap.url = newChap.url; oldChap.scanlator = newChap.scanlator; oldChap.updatedAt = DateTime.now().millisecondsSinceEpoch; + oldChap.isFiller = newChap.isFiller; + oldChap.thumbnailUrl = newChap.thumbnailUrl; + oldChap.description = newChap.description; + oldChap.downloadSize = newChap.downloadSize; + oldChap.duration = newChap.duration; isar.chapters.putSync(oldChap); oldChap.manga.saveSync(); } diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 637e1db6..a818c90a 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'ce51918a48b315c3555b3de4e602bd998e00a992'; +String _$updateMangaDetailHash() => r'f75938777640ae0cfee181a2df7a12a56c42db41'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index e9407515..98d8368c 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,18 +1,43 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:http/http.dart' as http; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:numberpicker/numberpicker.dart'; +import 'package:path/path.dart' as path; +import 'package:permission_handler/permission_handler.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; import 'package:mangayomi/l10n/generated/app_localizations.dart'; -class PlayerScreen extends ConsumerWidget { +class PlayerScreen extends ConsumerStatefulWidget { const PlayerScreen({super.key}); @override - Widget build(BuildContext context, WidgetRef ref) { + ConsumerState createState() => _PlayerScreenState(); +} + +class _PlayerScreenState extends ConsumerState { + int _total = 0; + int _received = 0; + late http.StreamedResponse _response; + final List _bytes = []; + late StreamSubscription>? _subscription; + + @override + void dispose() { + _subscription?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { final defaultSubtitleLang = ref.watch(defaultSubtitleLangStateProvider); final markEpisodeAsSeenType = ref.watch(markEpisodeAsSeenTypeStateProvider); final defaultSkipIntroLength = ref.watch( @@ -26,6 +51,7 @@ class PlayerScreen extends ConsumerWidget { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); + final useAnime4K = ref.watch(useAnime4KStateProvider); final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); @@ -457,6 +483,20 @@ class PlayerScreen extends ConsumerWidget { ), ], ), + SwitchListTile( + value: useAnime4K, + title: Text(context.l10n.anime4K), + subtitle: Text( + context.l10n.anime4K_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) async { + if (value && !(await _checkAnime4K(context))) { + return; + } + ref.read(useAnime4KStateProvider.notifier).set(value); + }, + ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), @@ -501,7 +541,11 @@ class PlayerScreen extends ConsumerWidget { groupValue: hwdecMode, onChanged: (value) { ref - .read(hwdecModeStateProvider(rawValue: true).notifier) + .read( + hwdecModeStateProvider( + rawValue: true, + ).notifier, + ) .set(value!); Navigator.pop(context); }, @@ -547,4 +591,130 @@ class PlayerScreen extends ConsumerWidget { ), ); } + + Future _checkAnime4K(BuildContext context) async { + var status = await Permission.storage.status; + if (!status.isGranted) { + await Permission.storage.request(); + } + final provider = StorageProvider(); + final dir = await provider.getMpvDirectory(); + final mpvFile = File('${dir!.path}/mpv.conf'); + final inputFile = File('${dir.path}/input.conf'); + if (!(await mpvFile.exists()) && + !(await inputFile.exists()) && + context.mounted) { + final res = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: SingleChildScrollView( + child: Column( + children: [ + Text(context.l10n.anime4K_download), + _total > 0 + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Flexible( + child: LinearProgressIndicator( + value: _total > 0 + ? (_received * 1.0) / _total + : 0.0, + ), + ), + Flexible( + child: Text( + '${(_received / 1048576.0).toStringAsFixed(2)}/${(_total / 1048576.0).toStringAsFixed(2)} MB', + ), + ), + ], + ) + : SizedBox.shrink(), + ], + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + try { + await _subscription?.cancel(); + } catch (_) {} + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text(context.l10n.cancel), + ), + const SizedBox(width: 15), + ElevatedButton( + onPressed: _total == 0 + ? () async { + _response = await http.Client().send( + http.Request( + 'GET', + Uri.parse( + "https://github.com/Tama47/Anime4K/releases/download/v4.0.1/GLSL_Windows_Low-end.zip", + ), + ), + ); + _total = _response.contentLength ?? 0; + _subscription = _response.stream.listen((value) { + setState(() { + _bytes.addAll(value); + _received += value.length; + }); + }); + _subscription?.onDone(() async { + final archive = ZipDecoder().decodeBytes(_bytes); + String shadersDir = path.join( + dir.path, + 'shaders', + ); + await Directory( + shadersDir, + ).create(recursive: true); + String scriptsDir = path.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.endsWith(".glsl")) { + final shaderFile = File( + '$shadersDir/${file.name.split("/").last}', + ); + await shaderFile.writeAsBytes(file.content); + } + } + _total = 0; + _received = 0; + _bytes.clear(); + if (context.mounted) { + Navigator.pop(context, "ok"); + } + }); + } + : null, + child: Text(context.l10n.download), + ), + ], + ), + ], + ); + }, + ); + return res != null && res == "ok"; + } + return context.mounted; + } } diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 0ba8e9a6..90554502 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -183,6 +183,22 @@ class UseLibassState extends _$UseLibassState { } } +@riverpod +class UseAnime4KState extends _$UseAnime4KState { + @override + bool build() { + return isar.settings.getSync(227)!.useAnime4K ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..useAnime4K = value), + ); + } +} + final hwdecs = { "no": ["all"], "auto": ["all"], diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 67236f59..4f5975f6 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -175,6 +175,22 @@ final useLibassStateProvider = ); typedef _$UseLibassState = AutoDisposeNotifier; +String _$useAnime4KStateHash() => r'3902552d399794bf7c78d5f18adcf59f267b3cf6'; + +/// See also [UseAnime4KState]. +@ProviderFor(UseAnime4KState) +final useAnime4KStateProvider = + AutoDisposeNotifierProvider.internal( + UseAnime4KState.new, + name: r'useAnime4KStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useAnime4KStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseAnime4KState = AutoDisposeNotifier; String _$hwdecModeStateHash() => r'e8b8e2b378eb9ac687bd8dad5637a816ad33fedb'; /// Copied from Dart SDK diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index f7b2dfe6..cc11ce4c 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -61,6 +61,13 @@ class StorageProvider { return directory; } + Future getMpvDirectory() async { + final defaultDirectory = await getDefaultDirectory(); + String dbDir = path.join(defaultDirectory!.path, 'mpv'); + await Directory(dbDir).create(recursive: true); + return Directory(dbDir); + } + Future getBtDirectory() async { final gefaultDirectory = await getDefaultDirectory(); String dbDir = path.join(gefaultDirectory!.path, 'torrents'); diff --git a/lib/services/get_video_list.dart b/lib/services/get_video_list.dart index d1bf5984..b7cbf195 100644 --- a/lib/services/get_video_list.dart +++ b/lib/services/get_video_list.dart @@ -13,11 +13,12 @@ import 'package:path/path.dart' as p; part 'get_video_list.g.dart'; @riverpod -Future<(List

( case 117: return (reader.readBoolOrNull(offset)) as P; case 118: + return (reader.readBoolOrNull(offset)) as P; + case 119: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -9582,6 +9591,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useAnime4KIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useAnime4K', + )); + }); + } + + QueryBuilder + useAnime4KIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useAnime4K', + )); + }); + } + + QueryBuilder useAnime4KEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useAnime4K', + value: value, + )); + }); + } + QueryBuilder useLibassIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -11203,6 +11239,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.asc); + }); + } + + QueryBuilder sortByUseAnime4KDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.desc); + }); + } + QueryBuilder sortByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -12460,6 +12508,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.asc); + }); + } + + QueryBuilder thenByUseAnime4KDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useAnime4K', Sort.desc); + }); + } + QueryBuilder thenByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -13124,6 +13184,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByUseAnime4K() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useAnime4K'); + }); + } + QueryBuilder distinctByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'useLibass'); @@ -13927,6 +13993,12 @@ extension SettingsQueryProperty }); } + QueryBuilder useAnime4KProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useAnime4K'); + }); + } + QueryBuilder useLibassProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'useLibass'); diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 54e1f9ec..bd52f1cc 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -175,6 +175,22 @@ final useLibassStateProvider = ); typedef _$UseLibassState = AutoDisposeNotifier; +String _$useAnime4KStateHash() => r'3902552d399794bf7c78d5f18adcf59f267b3cf6'; + +/// See also [UseAnime4KState]. +@ProviderFor(UseAnime4KState) +final useAnime4KStateProvider = + AutoDisposeNotifierProvider.internal( + UseAnime4KState.new, + name: r'useAnime4KStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useAnime4KStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseAnime4KState = AutoDisposeNotifier; String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; /// Copied from Dart SDK diff --git a/lib/services/get_video_list.g.dart b/lib/services/get_video_list.g.dart index f7438944..7aa851ab 100644 --- a/lib/services/get_video_list.g.dart +++ b/lib/services/get_video_list.g.dart @@ -6,7 +6,7 @@ part of 'get_video_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$getVideoListHash() => r'aeed8a24962e960a374d6bc7294e798ad3d0c05e'; +String _$getVideoListHash() => r'140ac1ca572d6220b7791c4350a0b32e275535a4'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index 30ccc0ed..af5cc986 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'97a778696e0cc8b8e4c706de50d60464bb7b2f03'; +String _$syncServerHash() => r'141ba3be28182e05480e06fbf3f1de68f868cb8e'; /// Copied from Dart SDK class _SystemHash { From 6be2775feefecf5787fb388ab5327b433e0bedbc Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 25 Jul 2025 20:08:51 +0200 Subject: [PATCH 004/100] added filler, thumbnail and description info to chapter list --- lib/main.dart | 1 - lib/models/manga.dart | 6 + lib/models/manga.g.dart | 136 ++++++++++++++++-- .../manga/detail/manga_detail_view.dart | 28 ++++ .../update_manga_detail_providers.dart | 25 +++- .../update_manga_detail_providers.g.dart | 2 +- .../widgets/chapter_list_tile_widget.dart | 97 ++++++++++++- .../more/settings/player/player_screen.dart | 8 +- lib/utils/discord_rpc.dart | 6 +- lib/utils/extensions/others.dart | 15 ++ linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + pubspec.lock | 2 +- pubspec.yaml | 4 + 14 files changed, 313 insertions(+), 22 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index b1564c53..32a5f03f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,7 +30,6 @@ import 'package:mangayomi/utils/discord_rpc.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'; -// ignore: depend_on_referenced_packages import 'package:media_kit/media_kit.dart'; import 'package:path_provider/path_provider.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 922000b9..d15d0676 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -49,6 +49,9 @@ class Manga { String? customCoverFromTracker; + /// only update X days after `lastUpdate` + int? smartUpdateDays; + int? updatedAt; @Backlink(to: "manga") @@ -76,6 +79,7 @@ class Manga { this.isLocalArchive = false, this.customCoverImage, this.customCoverFromTracker, + this.smartUpdateDays, this.updatedAt = 0, }); @@ -101,6 +105,7 @@ class Manga { source = json['source']; status = Status.values[json['status']]; customCoverFromTracker = json['customCoverFromTracker']; + smartUpdateDays = json['smartUpdateDays']; updatedAt = json['updatedAt']; } @@ -125,6 +130,7 @@ class Manga { 'source': source, 'status': status.index, 'customCoverFromTracker': customCoverFromTracker, + 'smartUpdateDays': smartUpdateDays, 'updatedAt': updatedAt ?? 0, }; } diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index 5f9fad4f..79ed73d7 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -108,19 +108,24 @@ const MangaSchema = CollectionSchema( name: r'name', type: IsarType.string, ), - r'source': PropertySchema( + r'smartUpdateDays': PropertySchema( id: 18, + name: r'smartUpdateDays', + type: IsarType.long, + ), + r'source': PropertySchema( + id: 19, name: r'source', type: IsarType.string, ), r'status': PropertySchema( - id: 19, + id: 20, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, ), r'updatedAt': PropertySchema( - id: 20, + id: 21, name: r'updatedAt', type: IsarType.long, ) @@ -258,9 +263,10 @@ void _mangaSerialize( writer.writeLong(offsets[15], object.lastUpdate); writer.writeString(offsets[16], object.link); writer.writeString(offsets[17], object.name); - writer.writeString(offsets[18], object.source); - writer.writeByte(offsets[19], object.status.index); - writer.writeLong(offsets[20], object.updatedAt); + writer.writeLong(offsets[18], object.smartUpdateDays); + writer.writeString(offsets[19], object.source); + writer.writeByte(offsets[20], object.status.index); + writer.writeLong(offsets[21], object.updatedAt); } Manga _mangaDeserialize( @@ -290,10 +296,11 @@ Manga _mangaDeserialize( lastUpdate: reader.readLongOrNull(offsets[15]), link: reader.readStringOrNull(offsets[16]), name: reader.readStringOrNull(offsets[17]), - source: reader.readStringOrNull(offsets[18]), - status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[19])] ?? + smartUpdateDays: reader.readLongOrNull(offsets[18]), + source: reader.readStringOrNull(offsets[19]), + status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[20])] ?? Status.ongoing, - updatedAt: reader.readLongOrNull(offsets[20]), + updatedAt: reader.readLongOrNull(offsets[21]), ); return object; } @@ -343,11 +350,13 @@ P _mangaDeserializeProp

( case 17: return (reader.readStringOrNull(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 19: + return (reader.readStringOrNull(offset)) as P; + case 20: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; - case 20: + case 21: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -2591,6 +2600,75 @@ extension MangaQueryFilter on QueryBuilder { }); } + QueryBuilder smartUpdateDaysIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'smartUpdateDays', + )); + }); + } + + QueryBuilder smartUpdateDaysIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'smartUpdateDays', + )); + }); + } + + QueryBuilder smartUpdateDaysEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'smartUpdateDays', + value: value, + )); + }); + } + + QueryBuilder smartUpdateDaysGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'smartUpdateDays', + value: value, + )); + }); + } + + QueryBuilder smartUpdateDaysLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'smartUpdateDays', + value: value, + )); + }); + } + + QueryBuilder smartUpdateDaysBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'smartUpdateDays', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder sourceIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -3100,6 +3178,18 @@ extension MangaQuerySortBy on QueryBuilder { }); } + QueryBuilder sortBySmartUpdateDays() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'smartUpdateDays', Sort.asc); + }); + } + + QueryBuilder sortBySmartUpdateDaysDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'smartUpdateDays', Sort.desc); + }); + } + QueryBuilder sortBySource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'source', Sort.asc); @@ -3330,6 +3420,18 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenBySmartUpdateDays() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'smartUpdateDays', Sort.asc); + }); + } + + QueryBuilder thenBySmartUpdateDaysDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'smartUpdateDays', Sort.desc); + }); + } + QueryBuilder thenBySource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'source', Sort.asc); @@ -3485,6 +3587,12 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctBySmartUpdateDays() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'smartUpdateDays'); + }); + } + QueryBuilder distinctBySource( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -3621,6 +3729,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder smartUpdateDaysProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'smartUpdateDays'); + }); + } + QueryBuilder sourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'source'); diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index d0638106..21bee62d 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1855,6 +1855,7 @@ class _MangaDetailViewState extends ConsumerState child: Row( children: [ Expanded(child: widget.action!), + Expanded(child: _smartUpdateDays()), Expanded( child: widget.itemType == ItemType.novel ? SizedBox.shrink() @@ -1905,6 +1906,33 @@ class _MangaDetailViewState extends ConsumerState ); } + Widget _smartUpdateDays() { + return SizedBox( + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + elevation: 0, + ), + onPressed: () {}, + child: Column( + children: [ + Icon( + Icons.hourglass_empty, + size: 20, + color: context.secondaryColor, + ), + const SizedBox(height: 4), + Text( + "${widget.manga?.smartUpdateDays ?? "N/A"}", + style: TextStyle(fontSize: 11, color: context.secondaryColor), + textAlign: TextAlign.center, + ), + ], + ), + ), + ); + } + /// Tracker button Widget _action() { return StreamBuilder( diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index 162f22a3..f798b539 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -5,6 +5,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/services/get_detail.dart'; +import 'package:mangayomi/utils/extensions/others.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -62,7 +63,7 @@ Future updateMangaDetail( return; } isar.writeTxnSync(() { - isar.mangas.putSync(manga); + final mangaId = isar.mangas.putSync(manga); manga.lastUpdate = DateTime.now().millisecondsSinceEpoch; List chapters = []; @@ -129,6 +130,28 @@ Future updateMangaDetail( oldChap.manga.saveSync(); } } + final List daysBetweenUploads = []; + for (var i = 0; i + 1 < chaps.length; i++) { + if (chaps[i].dateUpload != null && chaps[i + 1].dateUpload != null) { + final date1 = DateTime.fromMillisecondsSinceEpoch( + int.parse(chaps[i].dateUpload!), + ); + final date2 = DateTime.fromMillisecondsSinceEpoch( + int.parse(chaps[i + 1].dateUpload!), + ); + daysBetweenUploads.add(date1.difference(date2).abs().inDays); + } + } + if (daysBetweenUploads.isNotEmpty) { + final median = daysBetweenUploads.median(); + isar.mangas.putSync( + manga + ..id = mangaId + ..smartUpdateDays = median != 0 + ? median + : daysBetweenUploads.arithmeticMean(), + ); + } }); } catch (e, s) { if (showToast) botToast('$e\n$s'); diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index a818c90a..ac7f4879 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'f75938777640ae0cfee181a2df7a12a56c42db41'; +String _$updateMangaDetailHash() => r'769afb98684ba7d53c36d14637a51d1be9e6826d'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 8c7f9627..b189f3c1 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/utils/constant.dart'; import 'package:marquee/marquee.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; @@ -10,6 +13,8 @@ import 'package:mangayomi/utils/extensions/chapter.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart'; import 'package:mangayomi/modules/manga/download/download_page_widget.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; class ChapterListTileWidget extends ConsumerWidget { final Chapter chapter; @@ -33,6 +38,9 @@ class ChapterListTileWidget extends ConsumerWidget { onLongPress: () => _handleInteraction(ref), onSecondaryTap: () => _handleInteraction(ref), child: ListTile( + tileColor: (chapter.isFiller ?? false) + ? context.primaryColor.withValues(alpha: 0.15) + : null, textColor: chapter.isRead! ? context.isLight ? Colors.black.withValues(alpha: 0.4) @@ -44,14 +52,43 @@ class ChapterListTileWidget extends ConsumerWidget { onTap: () async => _handleInteraction(ref, context), title: Row( children: [ + if (chapter.thumbnailUrl != null) + _thumbnailPreview(context, chapter.thumbnailUrl), chapter.isBookmarked! ? Icon(Icons.bookmark, size: 16, color: context.primaryColor) : Container(), - Flexible(child: _buildTitle(chapter.name!, context)), + chapter.description != null + ? Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle(chapter.name!, context), + Text( + chapter.description!, + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ) + : Flexible(child: _buildTitle(chapter.name!, context)), ], ), subtitle: Row( children: [ + if (chapter.isFiller ?? false) + Row( + children: [ + Icon(Icons.label, size: 16, color: context.primaryColor), + Text( + " Filler ", + style: TextStyle( + fontSize: 11, + color: context.primaryColor, + ), + ), + ], + ), if ((chapter.manga.value!.isLocalArchive ?? false) == false) Text( chapter.dateUpload == null || chapter.dateUpload!.isEmpty @@ -172,4 +209,62 @@ class ChapterListTileWidget extends ConsumerWidget { }, ); } + + Widget _thumbnailPreview(BuildContext context, String? imageUrl) { + final imageProvider = CustomExtendedNetworkImageProvider( + toImgUrl(imageUrl ?? ""), + ); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: GestureDetector( + onTap: () { + _openImage(context, imageProvider); + }, + child: SizedBox( + width: 50, + height: 65, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), + ), + ), + ), + ), + ); + } + + void _openImage(BuildContext context, ImageProvider imageProvider) { + showDialog( + context: context, + builder: (context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: Stack( + children: [ + GestureDetector( + onTap: () => Navigator.pop(context), + child: PhotoViewGallery.builder( + backgroundDecoration: const BoxDecoration( + color: Colors.transparent, + ), + itemCount: 1, + builder: (context, index) { + return PhotoViewGalleryPageOptions( + imageProvider: imageProvider, + minScale: PhotoViewComputedScale.contained, + maxScale: 2.0, + ); + }, + loadingBuilder: (context, event) { + return const ProgressCenter(); + }, + ), + ), + ], + ), + ); + }, + ); + } } diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 98d8368c..8f95e33d 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -26,9 +26,9 @@ class PlayerScreen extends ConsumerStatefulWidget { class _PlayerScreenState extends ConsumerState { int _total = 0; int _received = 0; - late http.StreamedResponse _response; + http.StreamedResponse? _response; final List _bytes = []; - late StreamSubscription>? _subscription; + StreamSubscription>? _subscription; @override void dispose() { @@ -661,8 +661,8 @@ class _PlayerScreenState extends ConsumerState { ), ), ); - _total = _response.contentLength ?? 0; - _subscription = _response.stream.listen((value) { + _total = _response?.contentLength ?? 0; + _subscription = _response?.stream.listen((value) { setState(() { _bytes.addAll(value); _received += value.length; diff --git a/lib/utils/discord_rpc.dart b/lib/utils/discord_rpc.dart index 6b821cd4..b7b6f32b 100644 --- a/lib/utils/discord_rpc.dart +++ b/lib/utils/discord_rpc.dart @@ -91,6 +91,7 @@ class DiscordRPC { : "Reading"; final title = chapter.manga.value!.name; final chapterTitle = chapter.name; + final imageUrl = chapter.manga.value!.imageUrl; final rpcShowTitle = ref.read(rpcShowTitleStateProvider); final rpcShowCoverImage = ref.read(rpcShowCoverImageStateProvider); await updateActivity( @@ -98,9 +99,10 @@ class DiscordRPC { state: rpcShowTitle && rpcShowReadingWatchingProgress ? chapterTitle : "-----", - assets: rpcShowCoverImage + assets: + rpcShowCoverImage && imageUrl != null && imageUrl.startsWith("http") ? RPCAssets( - largeImage: chapter.manga.value!.imageUrl, + largeImage: imageUrl, largeText: rpcShowTitle ? chapter.manga.value!.name : "-----", smallImage: "app-icon", smallText: "Mangayomi", diff --git a/lib/utils/extensions/others.dart b/lib/utils/extensions/others.dart index fd5f94b7..5f9870c1 100644 --- a/lib/utils/extensions/others.dart +++ b/lib/utils/extensions/others.dart @@ -20,6 +20,21 @@ extension LetExtension on T { } } +extension MedianExtension on List { + int median() { + var middle = length ~/ 2; + if (length % 2 == 1) { + return this[middle]; + } else { + return ((this[middle - 1] + this[middle]) / 2).round(); + } + } + + int arithmeticMean() { + return isNotEmpty ? (reduce((e1, e2) => e1 + e2) / length).round() : 0; + } +} + extension ImageProviderExtension on ImageProvider { Future getBytes( BuildContext context, { diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 3ebc68a6..21b7afb6 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) volume_controller_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "VolumeControllerPlugin"); + volume_controller_plugin_register_with_registrar(volume_controller_registrar); g_autoptr(FlPluginRegistrar) window_manager_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); window_manager_plugin_register_with_registrar(window_manager_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index d68e2c1a..aa21f937 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -11,6 +11,7 @@ list(APPEND FLUTTER_PLUGIN_LIST media_kit_video screen_retriever_linux url_launcher_linux + volume_controller window_manager window_to_front ) diff --git a/pubspec.lock b/pubspec.lock index d220dfec..0508a12d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1160,7 +1160,7 @@ packages: source: hosted version: "0.5.3" media_kit: - dependency: transitive + dependency: "direct main" description: path: media_kit ref: HEAD diff --git a/pubspec.yaml b/pubspec.yaml index 16dcff70..011d7f51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,6 +41,10 @@ dependencies: flutter_web_auth_2: ^3.1.2 numberpicker: ^2.1.2 encrypt: ^5.0.3 + media_kit: + git: + url: https://github.com/Schnitzel5/media-kit.git + path: media_kit media_kit_video: git: url: https://github.com/Schnitzel5/media-kit.git From e6302d7d67b9e619c0f6afba7c29156eafc27cfd Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:32:19 +0200 Subject: [PATCH 005/100] Allow OAuth model to save used clientId --- .../more/settings/track/myanimelist/model.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/modules/more/settings/track/myanimelist/model.dart b/lib/modules/more/settings/track/myanimelist/model.dart index 99406758..06890cf8 100644 --- a/lib/modules/more/settings/track/myanimelist/model.dart +++ b/lib/modules/more/settings/track/myanimelist/model.dart @@ -3,14 +3,22 @@ class OAuth { int? expiresIn; String? accessToken; String? refreshToken; + String? clientId; - OAuth({this.tokenType, this.expiresIn, this.accessToken, this.refreshToken}); + OAuth({ + this.tokenType, + this.expiresIn, + this.accessToken, + this.refreshToken, + this.clientId, + }); OAuth.fromJson(Map json) { tokenType = json['token_type']; expiresIn = json['expires_in'] as int; accessToken = json['access_token']; refreshToken = json['refresh_token']; + clientId = json['client_id']; } Map toJson() { @@ -19,6 +27,7 @@ class OAuth { data['expires_in'] = expiresIn; data['access_token'] = accessToken; data['refresh_token'] = refreshToken; + data['client_id'] = clientId; return data; } } From 76cef84a96236f6dee53da58c9d747df11e3914f Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:33:13 +0200 Subject: [PATCH 006/100] MAL save used clientId on login --- lib/services/trackers/myanimelist.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index 55212f8e..e69e8fdb 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -46,7 +46,8 @@ class MyAnimeList extends _$MyAnimeList { final mALOAuth = OAuth.fromJson(oAuth as Map) ..expiresIn = DateTime.now() .add(Duration(seconds: oAuth['expires_in'])) - .millisecondsSinceEpoch; + .millisecondsSinceEpoch + ..clientId = clientId; final username = await _getUserName(mALOAuth.accessToken!); ref .read(tracksProvider(syncId: syncId).notifier) From c74a4c428e6bd94a35396ab51e725472f3edc507 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:34:02 +0200 Subject: [PATCH 007/100] Use saved clientId or fallback to refresh token --- lib/services/trackers/myanimelist.dart | 72 ++++++++++++++++---------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index e69e8fdb..8bbd4c91 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:intl/intl.dart'; +import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; @@ -21,9 +22,13 @@ class MyAnimeList extends _$MyAnimeList { String baseApiUrl = 'https://api.myanimelist.net/v2'; String codeVerifier = ""; static final isDesktop = (Platform.isWindows || Platform.isLinux); - String clientId = isDesktop - ? '39e9be346b4e7dbcc59a98357e2f8472' - : '0c9100ccd443ddb441a319a881180f7f'; + static const String desktopClientId = '39e9be346b4e7dbcc59a98357e2f8472'; + static const String mobileClientId = '0c9100ccd443ddb441a319a881180f7f'; + String clientId = isDesktop ? desktopClientId : mobileClientId; + + String getFallbackClientId(String usedClientId) { + return usedClientId == desktopClientId ? mobileClientId : desktopClientId; + } @override void build({required int syncId, required ItemType? itemType}) {} @@ -71,33 +76,48 @@ class MyAnimeList extends _$MyAnimeList { jsonDecode(track!.oAuth!) as Map, ); final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); - if (DateTime.now().isAfter(expiresIn)) { - final params = { - 'client_id': clientId, - 'grant_type': 'refresh_token', - 'refresh_token': mALOAuth.refreshToken, - }; - final response = await http.post( + if (!DateTime.now().isAfter(expiresIn)) return mALOAuth.accessToken!; + String primaryClientId = mALOAuth.clientId ?? clientId; + Map params = { + 'client_id': primaryClientId, + 'grant_type': 'refresh_token', + 'refresh_token': mALOAuth.refreshToken, + }; + Response response = await http.post( + Uri.parse('$baseOAuthUrl/token'), + body: params, + ); + if (response.statusCode != 200) { + // Try the fallback client ID (desktop <-> mobile) + params['client_id'] = getFallbackClientId(primaryClientId); + response = await http.post( Uri.parse('$baseOAuthUrl/token'), body: params, ); - final oAuth = OAuth.fromJson( - jsonDecode(response.body) as Map, - ); - final username = await _getUserName(oAuth.accessToken!); - ref - .read(tracksProvider(syncId: syncId).notifier) - .login( - TrackPreference( - syncId: syncId, - username: username, - prefs: "", - oAuth: jsonEncode(oAuth.toJson()), - ), - ); - return oAuth.accessToken!; } - return mALOAuth.accessToken!; + if (response.statusCode != 200) { + ref.read(tracksProvider(syncId: syncId).notifier).logout(); + botToast("MyAnimeList Token expired"); + throw Exception("Token expired"); + } + final body = jsonDecode(response.body) as Map; + final oAuth = OAuth.fromJson(body) + ..expiresIn = DateTime.now() + .add(Duration(seconds: body['expires_in'])) + .millisecondsSinceEpoch + ..clientId = params['client_id']; + final username = await _getUserName(oAuth.accessToken!); + ref + .read(tracksProvider(syncId: syncId).notifier) + .login( + TrackPreference( + syncId: syncId, + username: username, + prefs: "", + oAuth: jsonEncode(oAuth.toJson()), + ), + ); + return oAuth.accessToken!; } Future> search(String query, isManga) async { From 4bad1a24e3e4cd2140e9cdc7ff86d355cd78070f Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 25 Jul 2025 22:18:44 +0200 Subject: [PATCH 008/100] Refactor --- lib/services/trackers/myanimelist.dart | 124 ++++++++++++------------- 1 file changed, 61 insertions(+), 63 deletions(-) diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index 8bbd4c91..376c0fcf 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -18,23 +18,23 @@ part 'myanimelist.g.dart'; @riverpod class MyAnimeList extends _$MyAnimeList { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); - String baseOAuthUrl = 'https://myanimelist.net/v1/oauth2'; - String baseApiUrl = 'https://api.myanimelist.net/v2'; + static const _baseOAuthUrl = 'https://myanimelist.net/v1/oauth2'; + static const _baseApiUrl = 'https://api.myanimelist.net/v2'; String codeVerifier = ""; - static final isDesktop = (Platform.isWindows || Platform.isLinux); - static const String desktopClientId = '39e9be346b4e7dbcc59a98357e2f8472'; - static const String mobileClientId = '0c9100ccd443ddb441a319a881180f7f'; - String clientId = isDesktop ? desktopClientId : mobileClientId; + static final _isDesktop = (Platform.isWindows || Platform.isLinux); + static const _desktopClientId = '39e9be346b4e7dbcc59a98357e2f8472'; + static const _mobileClientId = '0c9100ccd443ddb441a319a881180f7f'; + final _clientId = _isDesktop ? _desktopClientId : _mobileClientId; - String getFallbackClientId(String usedClientId) { - return usedClientId == desktopClientId ? mobileClientId : desktopClientId; + String getFallbackClientId(String usedId) { + return usedId == _desktopClientId ? _mobileClientId : _desktopClientId; } @override void build({required int syncId, required ItemType? itemType}) {} Future login() async { - final callbackUrlScheme = isDesktop + final callbackUrlScheme = _isDesktop ? 'http://localhost:43824' : 'mangayomi'; final loginUrl = _authUrl(); @@ -44,25 +44,13 @@ class MyAnimeList extends _$MyAnimeList { url: loginUrl, callbackUrlScheme: callbackUrlScheme, ); - final queryParams = Uri.parse(uri).queryParameters; - if (queryParams['code'] == null) return null; + final code = Uri.parse(uri).queryParameters['code']; + if (code == null) return null; - final oAuth = await _getOAuth(queryParams['code']!); - final mALOAuth = OAuth.fromJson(oAuth as Map) - ..expiresIn = DateTime.now() - .add(Duration(seconds: oAuth['expires_in'])) - .millisecondsSinceEpoch - ..clientId = clientId; - final username = await _getUserName(mALOAuth.accessToken!); - ref - .read(tracksProvider(syncId: syncId).notifier) - .login( - TrackPreference( - syncId: syncId, - username: username, - oAuth: jsonEncode(mALOAuth.toJson()), - ), - ); + final oAuthData = await _getOAuth(code); + final oAuth = _buildOAuth(oAuthData, _clientId); + final username = await _getUserName(oAuth.accessToken!); + _saveOAuth(username, oAuth); return true; } catch (_) { @@ -76,37 +64,48 @@ class MyAnimeList extends _$MyAnimeList { jsonDecode(track!.oAuth!) as Map, ); final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); - if (!DateTime.now().isAfter(expiresIn)) return mALOAuth.accessToken!; - String primaryClientId = mALOAuth.clientId ?? clientId; - Map params = { - 'client_id': primaryClientId, - 'grant_type': 'refresh_token', - 'refresh_token': mALOAuth.refreshToken, - }; - Response response = await http.post( - Uri.parse('$baseOAuthUrl/token'), - body: params, - ); - if (response.statusCode != 200) { - // Try the fallback client ID (desktop <-> mobile) - params['client_id'] = getFallbackClientId(primaryClientId); - response = await http.post( - Uri.parse('$baseOAuthUrl/token'), - body: params, - ); - } - if (response.statusCode != 200) { + if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!; + final refreshed = await _tryRefreshToken(mALOAuth); + if (refreshed == null) { ref.read(tracksProvider(syncId: syncId).notifier).logout(); botToast("MyAnimeList Token expired"); throw Exception("Token expired"); } - final body = jsonDecode(response.body) as Map; - final oAuth = OAuth.fromJson(body) + final username = await _getUserName(refreshed.accessToken!); + _saveOAuth(username, refreshed); + return refreshed.accessToken!; + } + + Future _tryRefreshToken(OAuth oldOAuth) async { + String primaryClientId = oldOAuth.clientId ?? _clientId; + + Future tryRefresh(String cid) async { + final response = await http.post( + Uri.parse('$_baseOAuthUrl/token'), + body: { + 'client_id': cid, + 'grant_type': 'refresh_token', + 'refresh_token': oldOAuth.refreshToken, + }, + ); + if (response.statusCode != 200) return null; + final body = jsonDecode(response.body) as Map; + return _buildOAuth(body, cid); + } + + return await tryRefresh(primaryClientId) ?? + await tryRefresh(getFallbackClientId(primaryClientId)); + } + + OAuth _buildOAuth(Map json, String clientId) { + return OAuth.fromJson(json) ..expiresIn = DateTime.now() - .add(Duration(seconds: body['expires_in'])) + .add(Duration(seconds: json['expires_in'])) .millisecondsSinceEpoch - ..clientId = params['client_id']; - final username = await _getUserName(oAuth.accessToken!); + ..clientId = clientId; + } + + void _saveOAuth(String username, OAuth oAuth) { ref .read(tracksProvider(syncId: syncId).notifier) .login( @@ -117,13 +116,12 @@ class MyAnimeList extends _$MyAnimeList { oAuth: jsonEncode(oAuth.toJson()), ), ); - return oAuth.accessToken!; } Future> search(String query, isManga) async { final accessToken = await _getAccessToken(); final url = Uri.parse( - '$baseApiUrl/${isManga ? "manga" : "anime"}', + '$_baseApiUrl/${isManga ? "manga" : "anime"}', ).replace(queryParameters: {'q': query.trim(), 'nsfw': 'true'}); final result = await _makeGetRequest(url, accessToken); final res = jsonDecode(result.body) as Map; @@ -147,7 +145,7 @@ class MyAnimeList extends _$MyAnimeList { ) async { final item = isManga ? "manga" : "anime"; final contentUnit = isManga ? "num_chapters" : "num_episodes"; - final url = Uri.parse('$baseApiUrl/$item/$id').replace( + final url = Uri.parse('$_baseApiUrl/$item/$id').replace( queryParameters: { 'fields': 'id,title,synopsis,$contentUnit,main_picture,status,media_type,start_date,mean', @@ -179,7 +177,7 @@ class MyAnimeList extends _$MyAnimeList { final accessToken = await _getAccessToken(); final item = isManga ? "manga" : "anime"; final contentUnit = isManga ? "num_chapters" : "num_episodes"; - final url = Uri.parse('$baseApiUrl/$item/ranking').replace( + final url = Uri.parse('$_baseApiUrl/$item/ranking').replace( queryParameters: { 'ranking_type': rankingType, 'limit': '15', @@ -216,7 +214,7 @@ class MyAnimeList extends _$MyAnimeList { final item = isManga ? "mangalist" : "animelist"; final contentUnit = isManga ? "num_chapters" : "num_episodes"; final currentStatus = isManga ? "reading" : "watching"; - final url = Uri.parse('$baseApiUrl/users/@me/$item').replace( + final url = Uri.parse('$_baseApiUrl/users/@me/$item').replace( queryParameters: { 'status': currentStatus, utf8.decode([110, 115, 102, 119]): 'true', @@ -278,7 +276,7 @@ class MyAnimeList extends _$MyAnimeList { String _authUrl() { _codeVerifier(); - return '$baseOAuthUrl/authorize?client_id=$clientId&code_challenge=$codeVerifier&response_type=code'; + return '$_baseOAuthUrl/authorize?client_id=$_clientId&code_challenge=$codeVerifier&response_type=code'; } TrackStatus _getMALTrackStatus(String status, bool isManga) { @@ -331,13 +329,13 @@ class MyAnimeList extends _$MyAnimeList { Future _getOAuth(String code) async { final params = { - 'client_id': clientId, + 'client_id': _clientId, 'code': code, 'code_verifier': codeVerifier, 'grant_type': 'authorization_code', }; final response = await http.post( - Uri.parse('$baseOAuthUrl/token'), + Uri.parse('$_baseOAuthUrl/token'), body: params, ); return jsonDecode(response.body); @@ -345,7 +343,7 @@ class MyAnimeList extends _$MyAnimeList { Future _getUserName(String accessToken) async { final response = await _makeGetRequest( - Uri.parse('$baseApiUrl/users/@me'), + Uri.parse('$_baseApiUrl/users/@me'), accessToken, ); return jsonDecode(response.body)['name']; @@ -355,7 +353,7 @@ class MyAnimeList extends _$MyAnimeList { final type = isManga ? "manga" : "anime"; final contentUnit = isManga ? 'num_chapters' : 'num_episodes'; final accessToken = await _getAccessToken(); - final uri = Uri.parse('$baseApiUrl/$type/${track.mediaId}').replace( + final uri = Uri.parse('$_baseApiUrl/$type/${track.mediaId}').replace( queryParameters: { 'fields': '$contentUnit,my_list_status{start_date,finish_date}', }, @@ -416,7 +414,7 @@ class MyAnimeList extends _$MyAnimeList { final request = Request( 'PUT', Uri.parse( - '$baseApiUrl/${isManga ? "manga" : "anime"}' + '$_baseApiUrl/${isManga ? "manga" : "anime"}' '/${track.mediaId}/my_list_status', ), ); From 163bc9cec98a3e2f90336c9e9ba1d7d95bab3891 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 26 Jul 2025 02:03:44 +0200 Subject: [PATCH 009/100] added more shaders --- lib/l10n/app_en.arb | 3 +- lib/l10n/generated/app_localizations.dart | 6 ++++ lib/l10n/generated/app_localizations_ar.dart | 5 +++ lib/l10n/generated/app_localizations_de.dart | 5 +++ lib/l10n/generated/app_localizations_en.dart | 5 +++ lib/l10n/generated/app_localizations_es.dart | 5 +++ lib/l10n/generated/app_localizations_fr.dart | 5 +++ lib/l10n/generated/app_localizations_id.dart | 5 +++ lib/l10n/generated/app_localizations_it.dart | 5 +++ lib/l10n/generated/app_localizations_pt.dart | 5 +++ lib/l10n/generated/app_localizations_ru.dart | 5 +++ lib/l10n/generated/app_localizations_th.dart | 5 +++ lib/l10n/generated/app_localizations_tr.dart | 5 +++ lib/l10n/generated/app_localizations_zh.dart | 5 +++ lib/modules/anime/anime_player_view.dart | 26 +++++++++----- lib/modules/anime/widgets/desktop.dart | 35 +++++++++++++++---- .../manga/detail/manga_detail_view.dart | 4 ++- .../more/settings/player/player_screen.dart | 11 ++++-- 18 files changed, 126 insertions(+), 19 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 18ef0232..2855b0a6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -474,5 +474,6 @@ "sync_enable_settings": "Sync settings", "anime4K": "Enable Anime4K", "anime4K_info": "Supports .js scripts under /mpv/scripts/", - "anime4K_download": "MPV config files are required!\nDownload now?" + "anime4K_download": "MPV config files are required!\nDownload now?", + "n_days": "{n} days" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 35aa9e34..0d872e52 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2920,6 +2920,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'MPV config files are required!\nDownload now?'** String get anime4K_download; + + /// No description provided for @n_days. + /// + /// In en, this message translates to: + /// **'{n} days'** + String n_days(Object n); } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index ca06afba..e182cd22 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1504,4 +1504,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index f1da1f28..7d86254d 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1517,4 +1517,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 0dc11fbf..fe1217e8 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1505,4 +1505,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 8c62a389..29c369ec 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1522,6 +1522,11 @@ class AppLocalizationsEs extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index ed40292e..597773be 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1523,4 +1523,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index ef88463e..73ecf42a 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1511,4 +1511,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 97bcf6ef..212bda6d 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1520,4 +1520,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 57712332..da342ffc 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1519,6 +1519,11 @@ class AppLocalizationsPt extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 2e704fb6..280a2369 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1521,4 +1521,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index aaed6589..160e30f8 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1505,4 +1505,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 1cce8a46..1e71f993 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1511,4 +1511,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 2e8702c5..f3f0c20b 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1476,4 +1476,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get anime4K_download => 'MPV config files are required!\nDownload now?'; + + @override + String n_days(Object n) { + return '$n days'; + } } diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index da71e146..c4dc8787 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -1072,13 +1072,23 @@ class _AnimeStreamPageState extends riv.ConsumerState icon: const Icon(Icons.high_quality, color: Colors.white), itemBuilder: (context) => [ - ("Anime4K: Mode A (Fast)", "CTRL+1"), - ("Anime4K: Mode B (Fast)", "CTRL+2"), - ("Anime4K: Mode C (Fast)", "CTRL+3"), - ("Anime4K: Mode A+A (Fast)", "CTRL+4"), - ("Anime4K: Mode B+B (Fast)", "CTRL+5"), - ("Anime4K: Mode C+A (Fast)", "CTRL+6"), - ("Clear GLSL shaders", "CTRL+0"), + ("Anime4K: Mode A (Fast)", "set_anime_a"), + ("Anime4K: Mode B (Fast)", "set_anime_b"), + ("Anime4K: Mode C (Fast)", "set_anime_c"), + ("Anime4K: Mode A+A (Fast)", "set_anime_aa"), + ("Anime4K: Mode B+B (Fast)", "set_anime_bb"), + ("Anime4K: Mode C+A (Fast)", "set_anime_ca"), + ("Anime4K: Mode A (HQ)", "set_anime_hq_a"), + ("Anime4K: Mode B (HQ)", "set_anime_hq_b"), + ("Anime4K: Mode C (HQ)", "set_anime_hq_c"), + ("Anime4K: Mode A+A (HQ)", "set_anime_hq_aa"), + ("Anime4K: Mode B+B (HQ)", "set_anime_hq_bb"), + ("Anime4K: Mode C+A (HQ)", "set_anime_hq_ca"), + ("AMD FSR", "set_fsr"), + ("Luma Upscaling", "set_luma"), + ("Qualcomm Snapdragon GSR", "set_snapdragon"), + ("NVIDIA Image Scaling", "set_nvidia"), + ("Clear GLSL shaders", "clear_anime"), ] .map( (mode) => PopupMenuItem( @@ -1086,7 +1096,7 @@ class _AnimeStreamPageState extends riv.ConsumerState child: Text(mode.$1), onTap: () { (_player.platform as dynamic).command([ - "keydown", + "script-message", mode.$2, ]); }, diff --git a/lib/modules/anime/widgets/desktop.dart b/lib/modules/anime/widgets/desktop.dart index ae3a9032..54eeb9d9 100644 --- a/lib/modules/anime/widgets/desktop.dart +++ b/lib/modules/anime/widgets/desktop.dart @@ -216,25 +216,46 @@ class _DesktopControllerWidgetState await _changeFullScreen(ref, desktopFullScreenPlayer, value: false); }, const SingleActivator(LogicalKeyboardKey.digit0, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+0"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "clear_anime", + ]); }, const SingleActivator(LogicalKeyboardKey.digit1, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+1"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_a", + ]); }, const SingleActivator(LogicalKeyboardKey.digit2, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+2"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_b", + ]); }, const SingleActivator(LogicalKeyboardKey.digit3, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+3"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_c", + ]); }, const SingleActivator(LogicalKeyboardKey.digit4, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+4"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_aa", + ]); }, const SingleActivator(LogicalKeyboardKey.digit5, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+5"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_bb", + ]); }, const SingleActivator(LogicalKeyboardKey.digit6, control: true): () { - (widget.videoController.player.platform as dynamic).command(["keydown", "CTRL+6"]); + (widget.videoController.player.platform as dynamic).command([ + "script-message", + "set_anime_ca", + ]); }, }, child: Stack( diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 21bee62d..1cd56063 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1923,7 +1923,9 @@ class _MangaDetailViewState extends ConsumerState ), const SizedBox(height: 4), Text( - "${widget.manga?.smartUpdateDays ?? "N/A"}", + widget.manga?.smartUpdateDays != null + ? context.l10n.n_days(widget.manga!.smartUpdateDays!) + : "N/A", style: TextStyle(fontSize: 11, color: context.secondaryColor), textAlign: TextAlign.center, ), diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 8f95e33d..5de676b6 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -657,7 +657,7 @@ class _PlayerScreenState extends ConsumerState { http.Request( 'GET', Uri.parse( - "https://github.com/Tama47/Anime4K/releases/download/v4.0.1/GLSL_Windows_Low-end.zip", + "https://github.com/Schnitzel5/mangayomi/releases/download/v0.6.3-anime4k/mangayomi_mpv.zip", ), ), ); @@ -689,11 +689,18 @@ class _PlayerScreenState extends ConsumerState { await mpvFile.writeAsBytes(file.content); } else if (file.name == "input.conf") { await inputFile.writeAsBytes(file.content); - } else if (file.name.endsWith(".glsl")) { + } 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")) { + final scriptFile = File( + '$scriptsDir/${file.name.split("/").last}', + ); + await scriptFile.writeAsBytes(file.content); } } _total = 0; From 5e1e5267851b643d8e00ca85ab78c23a50913ed1 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 27 Jul 2025 02:44:04 +0200 Subject: [PATCH 010/100] added video chapter timestamps --- lib/l10n/app_en.arb | 8 +- lib/l10n/generated/app_localizations.dart | 28 ++- lib/l10n/generated/app_localizations_ar.dart | 13 +- lib/l10n/generated/app_localizations_de.dart | 13 +- lib/l10n/generated/app_localizations_en.dart | 13 +- lib/l10n/generated/app_localizations_es.dart | 13 +- lib/l10n/generated/app_localizations_fr.dart | 13 +- lib/l10n/generated/app_localizations_id.dart | 13 +- lib/l10n/generated/app_localizations_it.dart | 13 +- lib/l10n/generated/app_localizations_pt.dart | 13 +- lib/l10n/generated/app_localizations_ru.dart | 13 +- lib/l10n/generated/app_localizations_th.dart | 13 +- lib/l10n/generated/app_localizations_tr.dart | 13 +- lib/l10n/generated/app_localizations_zh.dart | 13 +- lib/modules/anime/anime_player_view.dart | 125 ++++++++++- lib/modules/anime/widgets/custom_seekbar.dart | 11 + .../anime/widgets/custom_track_shape.dart | 200 ++++++++++++++++++ lib/modules/anime/widgets/desktop.dart | 3 + lib/modules/anime/widgets/mobile.dart | 4 + .../more/settings/player/player_screen.dart | 29 ++- 20 files changed, 491 insertions(+), 73 deletions(-) create mode 100644 lib/modules/anime/widgets/custom_track_shape.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2855b0a6..d2acdada 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -472,8 +472,10 @@ "sync_enable_histories": "Sync history data", "sync_enable_updates": "Sync update data", "sync_enable_settings": "Sync settings", - "anime4K": "Enable Anime4K", - "anime4K_info": "Supports .js scripts under /mpv/scripts/", - "anime4K_download": "MPV config files are required!\nDownload now?", + "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?", "n_days": "{n} days" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 0d872e52..b2162604 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2903,23 +2903,35 @@ abstract class AppLocalizations { /// **'Sync settings'** String get sync_enable_settings; - /// No description provided for @anime4K. + /// No description provided for @enable_mpv. /// /// In en, this message translates to: - /// **'Enable Anime4K'** - String get anime4K; + /// **'Enable mpv shaders / scripts'** + String get enable_mpv; - /// No description provided for @anime4K_info. + /// No description provided for @mpv_info. /// /// In en, this message translates to: - /// **'Supports .js scripts under /mpv/scripts/'** - String get anime4K_info; + /// **'Supports .js scripts under mpv/scripts/'** + String get mpv_info; - /// No description provided for @anime4K_download. + /// 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 anime4K_download; + String get mpv_download; /// No description provided for @n_days. /// diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index e182cd22..28277592 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1496,14 +1496,19 @@ class AppLocalizationsAr extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 7d86254d..8e7161a9 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1509,14 +1509,19 @@ class AppLocalizationsDe extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index fe1217e8..f366078e 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1497,14 +1497,19 @@ class AppLocalizationsEn extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 29c369ec..f789df01 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1514,14 +1514,19 @@ class AppLocalizationsEs extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 597773be..49621f8c 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1515,14 +1515,19 @@ class AppLocalizationsFr extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 73ecf42a..f568f382 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1503,14 +1503,19 @@ class AppLocalizationsId extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 212bda6d..c5740f47 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1512,14 +1512,19 @@ class AppLocalizationsIt extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index da342ffc..41bb0f48 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1511,14 +1511,19 @@ class AppLocalizationsPt extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 280a2369..276fa8e2 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1513,14 +1513,19 @@ class AppLocalizationsRu extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 160e30f8..b318b867 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1497,14 +1497,19 @@ class AppLocalizationsTh extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 1e71f993..78cf94cd 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1503,14 +1503,19 @@ class AppLocalizationsTr extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index f3f0c20b..65a9b4a9 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1468,14 +1468,19 @@ class AppLocalizationsZh extends AppLocalizations { String get sync_enable_settings => 'Sync settings'; @override - String get anime4K => 'Enable Anime4K'; + String get enable_mpv => 'Enable mpv shaders / scripts'; @override - String get anime4K_info => 'Supports .js scripts under /mpv/scripts/'; + String get mpv_info => 'Supports .js scripts under mpv/scripts/'; @override - String get anime4K_download => - 'MPV config files are required!\nDownload now?'; + 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 n_days(Object n) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index c4dc8787..a18d6e99 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -1,6 +1,8 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; +import 'dart:math'; import 'package:bot_toast/bot_toast.dart'; import 'package:ffi/ffi.dart'; import 'package:file_picker/file_picker.dart'; @@ -188,7 +190,35 @@ class _AnimeStreamPageState extends riv.ConsumerState libass: useLibass, config: true, configDir: useAnime4K ? widget.mpvDirectory?.path ?? "" : "", - observeProperties: {}, + observeProperties: { + "user-data/aniyomi/show_text": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/toggle_ui": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/show_panel": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/software_keyboard": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/set_button_title": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/reset_button_title": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/toggle_button": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/switch_episode": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/pause": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/seek_by": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/seek_to": generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/seek_by_with_text": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/seek_to_with_text": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/aniyomi/launch_int_picker": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/current-anime/intro-length": + generated.mpv_format.MPV_FORMAT_INT64, + "user-data/mangayomi/chapter_titles": + generated.mpv_format.MPV_FORMAT_NODE, + "user-data/mangayomi/current_chapter": + generated.mpv_format.MPV_FORMAT_INT64, + }, eventHandler: _handleMpvEvents, ), ); @@ -221,6 +251,8 @@ class _AnimeStreamPageState extends riv.ConsumerState final ValueNotifier _isCompleted = ValueNotifier(false); final ValueNotifier _tempPosition = ValueNotifier(null); final ValueNotifier _fit = ValueNotifier(BoxFit.contain); + final ValueNotifier> _chapterMarks = ValueNotifier([]); + final ValueNotifier _currentChapterMark = ValueNotifier(null); late final ValueNotifier<_AniSkipPhase> _skipPhase = ValueNotifier( _AniSkipPhase.none, ); @@ -268,11 +300,15 @@ class _AnimeStreamPageState extends riv.ConsumerState if (event.ref.event_id == generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE) { final prop = event.ref.data.cast(); - if (prop.ref.name.cast().toDartString() == - "user-data/aniyomi/dummy_number" && + final propName = prop.ref.name.cast().toDartString(); + if (propName.startsWith("user-data/") && + prop.ref.format == generated.mpv_format.MPV_FORMAT_NODE) { + final value = prop.ref.data.cast(); + _handleMpvNodeEvents(propName, value); + } else if (propName.startsWith("user-data/") && prop.ref.format == generated.mpv_format.MPV_FORMAT_INT64) { - final number = prop.ref.data.cast().value; - botToast("Dummy number: $number"); + final value = prop.ref.data.cast().value; + _handleMpvNumberEvents(propName, value); } } } catch (e) { @@ -282,6 +318,37 @@ class _AnimeStreamPageState extends riv.ConsumerState } } + Future _handleMpvNodeEvents( + String propName, + Pointer value, + ) async { + switch (propName.substring(10)) { + case "aniyomi/show_text": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + botToast(text); + } + break; + case "mangayomi/chapter_titles": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + final data = jsonDecode(text) as List; + _chapterMarks.value = data + .map((e) => (e["title"] as String, (e["time"] as int) * 1000)) + .toList(); + } + break; + } + } + + Future _handleMpvNumberEvents(String propName, int value) async { + switch (propName.substring(10)) { + case "mangayomi/current_chapter": + _currentChapterMark.value = max(value, 0); + break; + } + } + void pushToNewEpisode(BuildContext context, Chapter episode) { widget.desktopFullScreenPlayer.call(ref.read(fullscreenProvider)); if (context.mounted) { @@ -893,6 +960,45 @@ class _AnimeStreamPageState extends riv.ConsumerState ); } + Widget _chapterMarkWidget() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), + child: SizedBox( + height: 35, + child: ValueListenableBuilder( + valueListenable: _currentChapterMark, + builder: (context, value, child) => value != null + ? PopupMenuButton( + tooltip: '', + itemBuilder: (context) => _chapterMarks.value + .map( + (mark) => PopupMenuItem( + value: mark.$2, + child: Text( + "${mark.$1} - ${Duration(milliseconds: mark.$2).label()}", + ), + onTap: () => + _player.seek(Duration(milliseconds: mark.$2)), + ), + ) + .toList(), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + "${_chapterMarks.value[value].$1} - ${Duration(milliseconds: _chapterMarks.value[value].$2).label()}", + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + : Container(), + ), + ), + ); + } + Widget _mobileBottomButtonBar(BuildContext context) { return Padding( padding: const EdgeInsets.only(bottom: 30), @@ -903,7 +1009,11 @@ class _AnimeStreamPageState extends riv.ConsumerState padding: const EdgeInsets.symmetric(horizontal: 8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [_seekToWidget(), _buildSettingsButtons(context)], + children: [ + _seekToWidget(), + _chapterMarkWidget(), + _buildSettingsButtons(context), + ], ), ), ], @@ -1047,6 +1157,7 @@ class _AnimeStreamPageState extends riv.ConsumerState controller: _controller, ), ), + _chapterMarkWidget(), ], ), _buildSettingsButtons(context), @@ -1330,6 +1441,7 @@ class _AnimeStreamPageState extends riv.ConsumerState }, defaultSkipIntroLength: skipIntroLength, desktopFullScreenPlayer: widget.desktopFullScreenPlayer, + chapterMarks: _chapterMarks, ) : MobileControllerWidget( videoController: _controller, @@ -1340,6 +1452,7 @@ class _AnimeStreamPageState extends riv.ConsumerState doubleSpeed: (value) { _isDoubleSpeed.value = value ?? false; }, + chapterMarks: _chapterMarks, ), controller: _controller, width: context.width(1), diff --git a/lib/modules/anime/widgets/custom_seekbar.dart b/lib/modules/anime/widgets/custom_seekbar.dart index 38bf4e01..e4305c83 100644 --- a/lib/modules/anime/widgets/custom_seekbar.dart +++ b/lib/modules/anime/widgets/custom_seekbar.dart @@ -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> 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 { 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, diff --git a/lib/modules/anime/widgets/custom_track_shape.dart b/lib/modules/anime/widgets/custom_track_shape.dart new file mode 100644 index 00000000..a7796248 --- /dev/null +++ b/lib/modules/anime/widgets/custom_track_shape.dart @@ -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 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); + } +} diff --git a/lib/modules/anime/widgets/desktop.dart b/lib/modules/anime/widgets/desktop.dart index 54eeb9d9..8c1932d0 100644 --- a/lib/modules/anime/widgets/desktop.dart +++ b/lib/modules/anime/widgets/desktop.dart @@ -24,6 +24,7 @@ class DesktopControllerWidget extends ConsumerStatefulWidget { final Widget seekToWidget; final int defaultSkipIntroLength; final void Function(bool) desktopFullScreenPlayer; + final ValueNotifier> chapterMarks; const DesktopControllerWidget({ super.key, required this.videoController, @@ -36,6 +37,7 @@ class DesktopControllerWidget extends ConsumerStatefulWidget { required this.doubleSpeed, required this.defaultSkipIntroLength, required this.desktopFullScreenPlayer, + required this.chapterMarks, }); @override @@ -481,6 +483,7 @@ class _DesktopControllerWidgetState widget.tempDuration(null); }, player: widget.videoController.player, + chapterMarks: widget.chapterMarks, ), ), ), diff --git a/lib/modules/anime/widgets/mobile.dart b/lib/modules/anime/widgets/mobile.dart index 7c234099..c797973e 100644 --- a/lib/modules/anime/widgets/mobile.dart +++ b/lib/modules/anime/widgets/mobile.dart @@ -24,6 +24,7 @@ class MobileControllerWidget extends ConsumerStatefulWidget { final Widget topButtonBarWidget; final GlobalKey videoStatekey; final Widget bottomButtonBarWidget; + final ValueNotifier> 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, ), ), ], diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 5de676b6..36ccaa98 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -485,18 +485,28 @@ class _PlayerScreenState extends ConsumerState { ), SwitchListTile( value: useAnime4K, - title: Text(context.l10n.anime4K), + title: Text(context.l10n.enable_mpv), subtitle: Text( - context.l10n.anime4K_info, + context.l10n.mpv_info, style: TextStyle(fontSize: 11, color: context.secondaryColor), ), onChanged: (value) async { - if (value && !(await _checkAnime4K(context))) { + if (value && !(await _checkMpvConfig(context))) { return; } ref.read(useAnime4KStateProvider.notifier).set(value); }, ), + ListTile( + onTap: () { + _checkMpvConfig(context, redownload: true); + }, + title: Text(context.l10n.mpv_redownload), + subtitle: Text( + context.l10n.mpv_redownload_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), @@ -592,7 +602,10 @@ class _PlayerScreenState extends ConsumerState { ); } - Future _checkAnime4K(BuildContext context) async { + Future _checkMpvConfig( + BuildContext context, { + bool redownload = false, + }) async { var status = await Permission.storage.status; if (!status.isGranted) { await Permission.storage.request(); @@ -601,9 +614,9 @@ class _PlayerScreenState extends ConsumerState { final dir = await provider.getMpvDirectory(); final mpvFile = File('${dir!.path}/mpv.conf'); final inputFile = File('${dir.path}/input.conf'); - if (!(await mpvFile.exists()) && - !(await inputFile.exists()) && - context.mounted) { + final filesMissing = + !(await mpvFile.exists()) && !(await inputFile.exists()); + if ((redownload || filesMissing) && context.mounted) { final res = await showDialog( context: context, builder: (context) { @@ -611,7 +624,7 @@ class _PlayerScreenState extends ConsumerState { content: SingleChildScrollView( child: Column( children: [ - Text(context.l10n.anime4K_download), + Text(context.l10n.mpv_download), _total > 0 ? Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, From 1e2153fa4f86cb5f4035ada6a068eabdc01c14dd Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:42:05 +0200 Subject: [PATCH 011/100] Fix unread count after marking chapters read Fix unread count not updating when marking selected chapters as read --- lib/modules/manga/detail/manga_detail_view.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index d0638106..96f27026 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -914,6 +914,7 @@ class _MangaDetailViewState extends ConsumerState chapter.updateTrackChapterRead(ref); } } + isar.mangas.putSync(widget.manga!); }); ref .read(isLongPressedStateProvider.notifier) @@ -963,6 +964,7 @@ class _MangaDetailViewState extends ConsumerState chapters[i].manga.saveSync(); } } + isar.mangas.putSync(widget.manga!); ref .read(isLongPressedStateProvider.notifier) .update(false); From 88a5474f96626b585bbddb951ccba560383ca22a Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 27 Jul 2025 20:06:16 +0200 Subject: [PATCH 012/100] bulk write instead of one-by-one reduces IO-operations. --- .../manga/detail/manga_detail_view.dart | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 96f27026..65838fc2 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -898,22 +898,22 @@ class _MangaDetailViewState extends ConsumerState final chapters = ref.watch( chaptersListStateProvider, ); - isar.writeTxnSync(() { - for (var chapter in chapters) { - chapter.isRead = !chapter.isRead!; - if (!chapter.isRead!) { - chapter.lastPageRead = "1"; - } - chapter.updatedAt = - DateTime.now().millisecondsSinceEpoch; - isar.chapters.putSync( - chapter..manga.value = widget.manga, - ); - chapter.manga.saveSync(); - if (chapter.isRead!) { - chapter.updateTrackChapterRead(ref); - } + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; + for (var chapter in chapters) { + chapter.isRead = !chapter.isRead!; + if (!chapter.isRead!) { + chapter.lastPageRead = "1"; } + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); + if (chapter.isRead!) { + chapter.updateTrackChapterRead(ref); + } + } + isar.writeTxnSync(() { + isar.chapters.putAllSync(updatedChapters); isar.mangas.putSync(widget.manga!); }); ref @@ -946,32 +946,33 @@ class _MangaDetailViewState extends ConsumerState ), onPressed: () { int index = chapters.indexOf(chap.first); + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; chapters[index + 1].updateTrackChapterRead(ref); - isar.writeTxnSync(() { - for ( - var i = index + 1; - i < chapters.length; - i++ - ) { - if (!chapters[i].isRead!) { - chapters[i].isRead = true; - chapters[i].lastPageRead = "1"; - chapters[i].updatedAt = - DateTime.now().millisecondsSinceEpoch; - isar.chapters.putSync( - chapters[i]..manga.value = widget.manga, - ); - chapters[i].manga.saveSync(); - } + for ( + var i = index + 1; + i < chapters.length; + i++ + ) { + final chapter = chapters[i]; + if (!chapter.isRead!) { + chapter.isRead = true; + chapter.lastPageRead = "1"; + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); } + } + isar.writeTxnSync(() { + isar.chapters.putAllSync(updatedChapters); isar.mangas.putSync(widget.manga!); - ref - .read(isLongPressedStateProvider.notifier) - .update(false); - ref - .read(chaptersListStateProvider.notifier) - .clear(); }); + ref + .read(isLongPressedStateProvider.notifier) + .update(false); + ref + .read(chaptersListStateProvider.notifier) + .clear(); }, child: Stack( children: [ From fc3cf226f79740fbe1eb04105a3b836b1053eeff Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 27 Jul 2025 21:06:45 +0200 Subject: [PATCH 013/100] bulk write instead of one-by-one (bookmark) reduces IO-operations. --- .../manga/detail/manga_detail_view.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 65838fc2..da0719a2 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -858,16 +858,16 @@ class _MangaDetailViewState extends ConsumerState final chapters = ref.watch( chaptersListStateProvider, ); + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; + for (var chapter in chapters) { + chapter.isBookmarked = !chapter.isBookmarked!; + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); + } isar.writeTxnSync(() { - for (var chapter in chapters) { - chapter.isBookmarked = !chapter.isBookmarked!; - chapter.updatedAt = - DateTime.now().millisecondsSinceEpoch; - isar.chapters.putSync( - chapter..manga.value = widget.manga, - ); - chapter.manga.saveSync(); - } + isar.chapters.putAllSync(updatedChapters); }); ref .read(isLongPressedStateProvider.notifier) From 633b84dd6d002af3547e533f3ddc5f7e6131200a Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Mon, 28 Jul 2025 00:55:45 +0200 Subject: [PATCH 014/100] Rearrange some code - variable `color`, to avoid passing `Theme.of(context).textTheme.bodyLarge!.color!` on every Icon in `bottomNavigationBar` - No need to create variable `isLongPressed` and `chapterNameList` in `build()` and pass them to `_buildWidget()` if they are only going to be used there. Just create the variables inside `_buildWidget()` - Why create second `isLongPressed` variable in `_buildWidget()` with the same value? Just use the first one. --- .../manga/detail/manga_detail_view.dart | 45 +++++-------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index da0719a2..622c9570 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -101,8 +101,6 @@ class _MangaDetailViewState extends ConsumerState late final isLocalArchive = widget.manga!.isLocalArchive ?? false; @override Widget build(BuildContext context) { - final isLongPressed = ref.watch(isLongPressedStateProvider); - final chapterNameList = ref.watch(chaptersListStateProvider); final scanlators = ref.watch(scanlatorsFilterStateProvider(widget.manga!)); final reverse = ref .watch(sortChapterStateProvider(mangaId: widget.manga!.id!)) @@ -143,12 +141,7 @@ class _MangaDetailViewState extends ConsumerState filterScanlator: scanlators.$2, ); ref.read(chaptersListttStateProvider.notifier).set(chapters); - return _buildWidget( - chapters: chapters, - reverse: reverse, - chapterList: chapterNameList, - isLongPressed: isLongPressed, - ); + return _buildWidget(chapters: chapters, reverse: reverse); }, error: (Object error, StackTrace stackTrace) { return ErrorText(error); @@ -157,8 +150,6 @@ class _MangaDetailViewState extends ConsumerState return _buildWidget( chapters: widget.manga!.chapters.toList().reversed.toList(), reverse: reverse, - chapterList: chapterNameList, - isLongPressed: isLongPressed, ); }, ), @@ -267,9 +258,9 @@ class _MangaDetailViewState extends ConsumerState Widget _buildWidget({ required List chapters, required bool reverse, - required List chapterList, - required bool isLongPressed, }) { + final chapterList = ref.watch(chaptersListStateProvider); + final isLongPressed = ref.watch(isLongPressedStateProvider); final checkCategoryList = isar.categorys .filter() .idIsNotNull() @@ -367,7 +358,6 @@ class _MangaDetailViewState extends ConsumerState final isNotFiltering = ref.watch( chapterFilterResultStateProvider(manga: widget.manga!), ); - final isLongPressed = ref.watch(isLongPressedStateProvider); return isLongPressed ? Container( color: Theme.of(context).scaffoldBackgroundColor, @@ -830,6 +820,7 @@ class _MangaDetailViewState extends ConsumerState bool checkReadBookmarked = chap.isNotEmpty && chap.first.isRead! && getLength1; final l10n = l10nLocalizations(context)!; + final color = Theme.of(context).textTheme.bodyLarge!.color!; return AnimatedContainer( curve: Curves.easeIn, decoration: BoxDecoration( @@ -880,7 +871,7 @@ class _MangaDetailViewState extends ConsumerState checkFirstBookmarked ? Icons.bookmark_remove_outlined : Icons.bookmark_add_outlined, - color: Theme.of(context).textTheme.bodyLarge!.color, + color: color, ), ), ), @@ -927,9 +918,7 @@ class _MangaDetailViewState extends ConsumerState checkReadBookmarked ? Icons.remove_done_sharp : Icons.done_all_sharp, - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!, + color: color, ), ), ), @@ -976,21 +965,14 @@ class _MangaDetailViewState extends ConsumerState }, child: Stack( children: [ - Icon( - Icons.done_outlined, - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!, - ), + Icon(Icons.done_outlined, color: color), Positioned( bottom: 0, right: 0, child: Icon( Icons.arrow_downward_outlined, size: 11, - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!, + color: color, ), ), ], @@ -1034,12 +1016,7 @@ class _MangaDetailViewState extends ConsumerState .read(chaptersListStateProvider.notifier) .clear(); }, - child: Icon( - Icons.download_outlined, - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!, - ), + child: Icon(Icons.download_outlined, color: color), ), ), ), @@ -1171,9 +1148,7 @@ class _MangaDetailViewState extends ConsumerState }, child: Icon( Icons.delete_outline_outlined, - color: Theme.of( - context, - ).textTheme.bodyLarge!.color!, + color: color, ), ), ), From 1f0938fab960ec75709296652fd572908970c4c2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 28 Jul 2025 02:24:32 +0200 Subject: [PATCH 015/100] adding custom buttons --- lib/l10n/app_en.arb | 9 + lib/l10n/generated/app_localizations.dart | 48 + lib/l10n/generated/app_localizations_ar.dart | 25 + lib/l10n/generated/app_localizations_de.dart | 25 + lib/l10n/generated/app_localizations_en.dart | 25 + lib/l10n/generated/app_localizations_es.dart | 25 + lib/l10n/generated/app_localizations_fr.dart | 25 + lib/l10n/generated/app_localizations_id.dart | 25 + lib/l10n/generated/app_localizations_it.dart | 25 + lib/l10n/generated/app_localizations_pt.dart | 25 + lib/l10n/generated/app_localizations_ru.dart | 25 + lib/l10n/generated/app_localizations_th.dart | 25 + lib/l10n/generated/app_localizations_tr.dart | 25 + lib/l10n/generated/app_localizations_zh.dart | 25 + lib/models/custom_button.dart | 55 + lib/models/custom_button.g.dart | 1413 +++++++++++++++++ lib/models/settings.dart | 8 +- lib/models/settings.g.dart | 142 +- lib/modules/anime/anime_player_view.dart | 80 +- .../update_manga_detail_providers.g.dart | 2 +- .../settings/player/custom_button_screen.dart | 287 ++++ .../more/settings/player/player_screen.dart | 16 +- .../providers/custom_buttons_provider.dart | 11 + .../providers/custom_buttons_provider.g.dart | 30 + .../providers/player_state_provider.dart | 6 +- .../providers/player_state_provider.g.dart | 18 +- lib/providers/storage_provider.dart | 25 + lib/router/router.dart | 5 + 28 files changed, 2360 insertions(+), 95 deletions(-) create mode 100644 lib/models/custom_button.dart create mode 100644 lib/models/custom_button.g.dart create mode 100644 lib/modules/more/settings/player/custom_button_screen.dart create mode 100644 lib/modules/more/settings/player/providers/custom_buttons_provider.dart create mode 100644 lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d2acdada..87a19002 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -477,5 +477,14 @@ "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 Javascript code with custom buttons", + "custom_buttons_edit": "Edit custom buttons", + "custom_buttons_add": "Add custom button", + "custom_buttons_edit": "Add custom button", + "custom_buttons_text": "Button text", + "custom_buttons_js_code": "Javascript code", + "custom_buttons_js_code_long": "Javascript code (on long press)", + "custom_buttons_startup": "On startup", "n_days": "{n} days" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index b2162604..0fc30cbd 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2933,6 +2933,54 @@ abstract class AppLocalizations { /// **'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 Javascript code with custom buttons'** + String get custom_buttons_info; + + /// No description provided for @custom_buttons_edit. + /// + /// In en, this message translates to: + /// **'Add custom button'** + 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_text. + /// + /// In en, this message translates to: + /// **'Button text'** + String get custom_buttons_text; + + /// No description provided for @custom_buttons_js_code. + /// + /// In en, this message translates to: + /// **'Javascript code'** + String get custom_buttons_js_code; + + /// No description provided for @custom_buttons_js_code_long. + /// + /// In en, this message translates to: + /// **'Javascript code (on long press)'** + String get custom_buttons_js_code_long; + + /// No description provided for @custom_buttons_startup. + /// + /// In en, this message translates to: + /// **'On startup'** + String get custom_buttons_startup; + /// No description provided for @n_days. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 28277592..0ee8e394 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1510,6 +1510,31 @@ class AppLocalizationsAr extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 8e7161a9..ca9fbf35 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1523,6 +1523,31 @@ class AppLocalizationsDe extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index f366078e..49995069 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1511,6 +1511,31 @@ class AppLocalizationsEn extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index f789df01..d01ce663 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1528,6 +1528,31 @@ class AppLocalizationsEs extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 49621f8c..f86ffbaf 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1529,6 +1529,31 @@ class AppLocalizationsFr extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index f568f382..9f0a2b3b 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1517,6 +1517,31 @@ class AppLocalizationsId extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index c5740f47..b4049fcb 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1526,6 +1526,31 @@ class AppLocalizationsIt extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 41bb0f48..1ffda025 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1525,6 +1525,31 @@ class AppLocalizationsPt extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 276fa8e2..89cc8dc5 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1527,6 +1527,31 @@ class AppLocalizationsRu extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index b318b867..0d60364b 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1511,6 +1511,31 @@ class AppLocalizationsTh extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 78cf94cd..dd1ec81b 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1517,6 +1517,31 @@ class AppLocalizationsTr extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 65a9b4a9..060b17ad 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1482,6 +1482,31 @@ class AppLocalizationsZh extends AppLocalizations { @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 Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/models/custom_button.dart b/lib/models/custom_button.dart new file mode 100644 index 00000000..0ea64789 --- /dev/null +++ b/lib/models/custom_button.dart @@ -0,0 +1,55 @@ +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, + }); + + CustomButton.fromJson(Map 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 toJson() => { + 'id': id, + 'title': title, + 'codePress': codePress, + 'codeLongPress': codeLongPress, + 'codeStartup': codeStartup, + 'isFavourite': isFavourite, + 'pos': pos, + 'updatedAt': updatedAt ?? 0, + }; +} diff --git a/lib/models/custom_button.g.dart b/lib/models/custom_button.g.dart new file mode 100644 index 00000000..a08db717 --- /dev/null +++ b/lib/models/custom_button.g.dart @@ -0,0 +1,1413 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'custom_button.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetCustomButtonCollection on Isar { + IsarCollection get customButtons => this.collection(); +} + +const CustomButtonSchema = CollectionSchema( + name: r'CustomButton', + id: 3146166780828864477, + properties: { + r'codeLongPress': PropertySchema( + id: 0, + name: r'codeLongPress', + type: IsarType.string, + ), + r'codePress': PropertySchema( + id: 1, + name: r'codePress', + type: IsarType.string, + ), + r'codeStartup': PropertySchema( + id: 2, + name: r'codeStartup', + type: IsarType.string, + ), + r'isFavourite': PropertySchema( + id: 3, + name: r'isFavourite', + type: IsarType.bool, + ), + r'pos': PropertySchema( + id: 4, + name: r'pos', + type: IsarType.long, + ), + r'title': PropertySchema( + id: 5, + name: r'title', + type: IsarType.string, + ), + r'updatedAt': PropertySchema( + id: 6, + name: r'updatedAt', + type: IsarType.long, + ) + }, + estimateSize: _customButtonEstimateSize, + serialize: _customButtonSerialize, + deserialize: _customButtonDeserialize, + deserializeProp: _customButtonDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _customButtonGetId, + getLinks: _customButtonGetLinks, + attach: _customButtonAttach, + version: '3.1.0+1', +); + +int _customButtonEstimateSize( + CustomButton object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.codeLongPress; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.codePress; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.codeStartup; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.title; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _customButtonSerialize( + CustomButton object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.codeLongPress); + writer.writeString(offsets[1], object.codePress); + writer.writeString(offsets[2], object.codeStartup); + writer.writeBool(offsets[3], object.isFavourite); + writer.writeLong(offsets[4], object.pos); + writer.writeString(offsets[5], object.title); + writer.writeLong(offsets[6], object.updatedAt); +} + +CustomButton _customButtonDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = CustomButton( + codeLongPress: reader.readStringOrNull(offsets[0]), + codePress: reader.readStringOrNull(offsets[1]), + codeStartup: reader.readStringOrNull(offsets[2]), + id: id, + isFavourite: reader.readBoolOrNull(offsets[3]), + pos: reader.readLongOrNull(offsets[4]), + title: reader.readStringOrNull(offsets[5]), + updatedAt: reader.readLongOrNull(offsets[6]), + ); + return object; +} + +P _customButtonDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readStringOrNull(offset)) as P; + case 2: + return (reader.readStringOrNull(offset)) as P; + case 3: + return (reader.readBoolOrNull(offset)) as P; + case 4: + return (reader.readLongOrNull(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + case 6: + return (reader.readLongOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _customButtonGetId(CustomButton object) { + return object.id ?? Isar.autoIncrement; +} + +List> _customButtonGetLinks(CustomButton object) { + return []; +} + +void _customButtonAttach( + IsarCollection col, Id id, CustomButton object) { + object.id = id; +} + +extension CustomButtonQueryWhereSort + on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension CustomButtonQueryWhere + on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo( + Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan( + Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension CustomButtonQueryFilter + on QueryBuilder { + QueryBuilder + codeLongPressIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codeLongPress', + )); + }); + } + + QueryBuilder + codeLongPressIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codeLongPress', + )); + }); + } + + QueryBuilder + codeLongPressEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'codeLongPress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codeLongPress', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeLongPress', + value: '', + )); + }); + } + + QueryBuilder + codeLongPressIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codeLongPress', + value: '', + )); + }); + } + + QueryBuilder + codePressIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codePress', + )); + }); + } + + QueryBuilder + codePressIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codePress', + )); + }); + } + + QueryBuilder + codePressEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'codePress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codePress', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codePress', + value: '', + )); + }); + } + + QueryBuilder + codePressIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codePress', + value: '', + )); + }); + } + + QueryBuilder + codeStartupIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codeStartup', + )); + }); + } + + QueryBuilder + codeStartupIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codeStartup', + )); + }); + } + + QueryBuilder + codeStartupEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'codeStartup', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codeStartup', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeStartup', + value: '', + )); + }); + } + + QueryBuilder + codeStartupIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codeStartup', + value: '', + )); + }); + } + + QueryBuilder idIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'id', + )); + }); + } + + QueryBuilder + idIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'id', + )); + }); + } + + QueryBuilder idEqualTo( + Id? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id? lower, + Id? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + isFavouriteIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isFavourite', + )); + }); + } + + QueryBuilder + isFavouriteIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isFavourite', + )); + }); + } + + QueryBuilder + isFavouriteEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isFavourite', + value: value, + )); + }); + } + + QueryBuilder posIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'pos', + )); + }); + } + + QueryBuilder + posIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'pos', + )); + }); + } + + QueryBuilder posEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder + posGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder posLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder posBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'pos', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + titleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'title', + )); + }); + } + + QueryBuilder + titleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'title', + )); + }); + } + + QueryBuilder titleEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder + titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder + updatedAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'updatedAt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension CustomButtonQueryObject + on QueryBuilder {} + +extension CustomButtonQueryLinks + on QueryBuilder {} + +extension CustomButtonQuerySortBy + on QueryBuilder { + QueryBuilder sortByCodeLongPress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.asc); + }); + } + + QueryBuilder + sortByCodeLongPressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.desc); + }); + } + + QueryBuilder sortByCodePress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.asc); + }); + } + + QueryBuilder sortByCodePressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.desc); + }); + } + + QueryBuilder sortByCodeStartup() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.asc); + }); + } + + QueryBuilder + sortByCodeStartupDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.desc); + }); + } + + QueryBuilder sortByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.asc); + }); + } + + QueryBuilder + sortByIsFavouriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.desc); + }); + } + + QueryBuilder sortByPos() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.asc); + }); + } + + QueryBuilder sortByPosDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder sortByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder sortByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension CustomButtonQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByCodeLongPress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.asc); + }); + } + + QueryBuilder + thenByCodeLongPressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.desc); + }); + } + + QueryBuilder thenByCodePress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.asc); + }); + } + + QueryBuilder thenByCodePressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.desc); + }); + } + + QueryBuilder thenByCodeStartup() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.asc); + }); + } + + QueryBuilder + thenByCodeStartupDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.asc); + }); + } + + QueryBuilder + thenByIsFavouriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.desc); + }); + } + + QueryBuilder thenByPos() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.asc); + }); + } + + QueryBuilder thenByPosDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder thenByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder thenByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension CustomButtonQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByCodeLongPress( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codeLongPress', + caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCodePress( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codePress', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCodeStartup( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codeStartup', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isFavourite'); + }); + } + + QueryBuilder distinctByPos() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'pos'); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'updatedAt'); + }); + } +} + +extension CustomButtonQueryProperty + on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder + codeLongPressProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codeLongPress'); + }); + } + + QueryBuilder codePressProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codePress'); + }); + } + + QueryBuilder codeStartupProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codeStartup'); + }); + } + + QueryBuilder isFavouriteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isFavourite'); + }); + } + + QueryBuilder posProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'pos'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } + + QueryBuilder updatedAtProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'updatedAt'); + }); + } +} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index d9094209..61ebad75 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -258,7 +258,7 @@ class Settings { bool? rpcShowCoverImage; - bool? useAnime4K; + bool? useMpvConfig; Settings({ this.id = 227, @@ -375,7 +375,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, - this.useAnime4K = false, + this.useMpvConfig = false, }); Settings.fromJson(Map json) { @@ -597,7 +597,7 @@ class Settings { rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress']; rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; - useAnime4K = json['useAnime4K']; + useMpvConfig = json['useMpvConfig']; } Map toJson() => { @@ -736,7 +736,7 @@ class Settings { 'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress, 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, - 'useAnime4K': useAnime4K, + 'useMpvConfig': useMpvConfig, }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 927f407c..8a4e5827 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -628,14 +628,14 @@ const SettingsSchema = CollectionSchema( name: r'updatedAt', type: IsarType.long, ), - r'useAnime4K': PropertySchema( + r'useLibass': PropertySchema( id: 116, - name: r'useAnime4K', + name: r'useLibass', type: IsarType.bool, ), - r'useLibass': PropertySchema( + r'useMpvConfig': PropertySchema( id: 117, - name: r'useLibass', + name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( @@ -1249,8 +1249,8 @@ void _settingsSerialize( writer.writeBool(offsets[113], object.themeIsDark); writer.writeBool(offsets[114], object.updateProgressAfterReading); writer.writeLong(offsets[115], object.updatedAt); - writer.writeBool(offsets[116], object.useAnime4K); - writer.writeBool(offsets[117], object.useLibass); + writer.writeBool(offsets[116], object.useLibass); + writer.writeBool(offsets[117], object.useMpvConfig); writer.writeBool(offsets[118], object.usePageTapZones); writer.writeString(offsets[119], object.userAgent); } @@ -1468,8 +1468,8 @@ Settings _settingsDeserialize( themeIsDark: reader.readBoolOrNull(offsets[113]), updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), updatedAt: reader.readLongOrNull(offsets[115]), - useAnime4K: reader.readBoolOrNull(offsets[116]), - useLibass: reader.readBoolOrNull(offsets[117]), + useLibass: reader.readBoolOrNull(offsets[116]), + useMpvConfig: reader.readBoolOrNull(offsets[117]), usePageTapZones: reader.readBoolOrNull(offsets[118]), userAgent: reader.readStringOrNull(offsets[119]), ); @@ -9591,33 +9591,6 @@ extension SettingsQueryFilter }); } - QueryBuilder useAnime4KIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useAnime4K', - )); - }); - } - - QueryBuilder - useAnime4KIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useAnime4K', - )); - }); - } - - QueryBuilder useAnime4KEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useAnime4K', - value: value, - )); - }); - } - QueryBuilder useLibassIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -9644,6 +9617,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useMpvConfigIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useMpvConfig', + )); + }); + } + + QueryBuilder + useMpvConfigIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useMpvConfig', + )); + }); + } + + QueryBuilder useMpvConfigEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useMpvConfig', + value: value, + )); + }); + } + QueryBuilder usePageTapZonesIsNull() { return QueryBuilder.apply(this, (query) { @@ -11239,18 +11239,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.asc); - }); - } - - QueryBuilder sortByUseAnime4KDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.desc); - }); - } - QueryBuilder sortByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -11263,6 +11251,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.asc); + }); + } + + QueryBuilder sortByUseMpvConfigDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.desc); + }); + } + QueryBuilder sortByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'usePageTapZones', Sort.asc); @@ -12508,18 +12508,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.asc); - }); - } - - QueryBuilder thenByUseAnime4KDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.desc); - }); - } - QueryBuilder thenByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -12532,6 +12520,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.asc); + }); + } + + QueryBuilder thenByUseMpvConfigDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.desc); + }); + } + QueryBuilder thenByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'usePageTapZones', Sort.asc); @@ -13184,18 +13184,18 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'useAnime4K'); - }); - } - QueryBuilder distinctByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'useLibass'); }); } + QueryBuilder distinctByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useMpvConfig'); + }); + } + QueryBuilder distinctByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'usePageTapZones'); @@ -13993,18 +13993,18 @@ extension SettingsQueryProperty }); } - QueryBuilder useAnime4KProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'useAnime4K'); - }); - } - QueryBuilder useLibassProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'useLibass'); }); } + QueryBuilder useMpvConfigProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useMpvConfig'); + }); + } + QueryBuilder usePageTapZonesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'usePageTapZones'); diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index a18d6e99..f923007c 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -184,12 +184,12 @@ class _AnimeStreamPageState extends riv.ConsumerState with TickerProviderStateMixin, WidgetsBindingObserver { late final GlobalKey _key = GlobalKey(); late final useLibass = ref.read(useLibassStateProvider); - late final useAnime4K = ref.read(useAnime4KStateProvider); + late final useMpvConfig = ref.read(useMpvConfigStateProvider); late final Player _player = Player( configuration: PlayerConfiguration( libass: useLibass, config: true, - configDir: useAnime4K ? widget.mpvDirectory?.path ?? "" : "", + configDir: useMpvConfig ? widget.mpvDirectory?.path ?? "" : "", observeProperties: { "user-data/aniyomi/show_text": generated.mpv_format.MPV_FORMAT_NODE, "user-data/aniyomi/toggle_ui": generated.mpv_format.MPV_FORMAT_NODE, @@ -329,12 +329,84 @@ class _AnimeStreamPageState extends riv.ConsumerState botToast(text); } break; + case "user-data/aniyomi/toggle_ui": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/show_panel": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/software_keyboard": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/set_button_title": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/reset_button_title": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/toggle_button": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/switch_episode": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/pause": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_by": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_to": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_by_with_text": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_to_with_text": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/launch_int_picker": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; case "mangayomi/chapter_titles": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); final data = jsonDecode(text) as List; _chapterMarks.value = data - .map((e) => (e["title"] as String, (e["time"] as int) * 1000)) + .map( + (e) => ( + e["title"] as String, + e["time"] is double + ? (e["time"] as double).toInt() * 1000 + : (e["time"] as int) * 1000, + ), + ) .toList(); } break; @@ -1177,7 +1249,7 @@ class _AnimeStreamPageState extends riv.ConsumerState onPressed: () => _videoSettingDraggableMenu(context), icon: const Icon(Icons.video_settings, color: Colors.white), ), - if (useAnime4K) + if (useMpvConfig) PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.high_quality, color: Colors.white), diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index ac7f4879..27dd03b3 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'769afb98684ba7d53c36d14637a51d1be9e6826d'; +String _$updateMangaDetailHash() => r'33c6bd0f1de57e2e839ae695a0301893b9a94624'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/player/custom_button_screen.dart b/lib/modules/more/settings/player/custom_button_screen.dart new file mode 100644 index 00000000..6aced89e --- /dev/null +++ b/lib/modules/more/settings/player/custom_button_screen.dart @@ -0,0 +1,287 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/custom_button.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; + +class CustomButtonScreen extends ConsumerStatefulWidget { + const CustomButtonScreen({super.key}); + + @override + ConsumerState createState() => _CustomButtonScreenState(); +} + +class _CustomButtonScreenState extends ConsumerState { + List _entries = []; + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final customButtons = ref.watch(getCustomButtonsStreamProvider); + return Scaffold( + appBar: AppBar(title: Text(l10n.custom_buttons_edit)), + body: customButtons.when( + data: (data) { + if (data.isEmpty) { + _entries = []; + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + l10n.custom_buttons_edit, + textAlign: TextAlign.center, + ), + ), + ); + } + data.sort((a, b) => (a.pos ?? 0).compareTo(b.pos ?? 0)); + _entries = data; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: ReorderableListView.builder( + buildDefaultDragHandles: false, + itemCount: _entries.length, + itemBuilder: (context, index) { + final customButton = _entries[index]; + return Row( + key: Key('custom_btn_${customButton.id}'), + children: [ + ReorderableDragStartListener( + index: index, + child: const Icon(Icons.drag_handle), + ), + Expanded( + child: Row( + children: [ + IconButton( + onPressed: () {}, + icon: Icon( + (customButton.isFavourite ?? false) + ? Icons.star + : Icons.star_border, + ), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.mode_edit_outlined), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.delete_outline), + ), + ], + ), + ), + ], + ); + }, + onReorder: (oldIndex, newIndex) { + /*if (oldIndex < newIndex) { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i < newIndex - 1; i++) { + navigationOrder[i] = navigationOrder[i + 1]; + } + navigationOrder[newIndex - 1] = draggedItem; + } else { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i > newIndex; i--) { + navigationOrder[i] = navigationOrder[i - 1]; + } + navigationOrder[newIndex] = draggedItem; + } + ref + .read(navigationOrderStateProvider.notifier) + .set(navigationOrder);*/ + }, + ), + ); + }, + error: (Object error, StackTrace stackTrace) { + _entries = []; + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + l10n.custom_buttons_edit, + textAlign: TextAlign.center, + ), + ), + ); + }, + loading: () { + return const ProgressCenter(); + }, + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + bool isExist = false; + final controller = TextEditingController(); + showDialog( + context: context, + builder: (context) { + return SizedBox( + child: StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text(l10n.add_category), + content: CustomTextFormField( + controller: controller, + entries: _entries, + context: context, + exist: (value) { + setState(() { + isExist = value; + }); + }, + isExist: isExist, + val: (val) {}, + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(l10n.cancel), + ), + const SizedBox(width: 15), + TextButton( + onPressed: controller.text.isEmpty || isExist + ? null + : () async { + /*final category = Category( + forItemType: widget.itemType, + name: controller.text, + updatedAt: DateTime.now() + .millisecondsSinceEpoch, + ); + isar.writeTxnSync(() { + isar.categorys.putSync( + category..pos = category.id, + ); + final categories = isar.categorys + .filter() + .posIsNull() + .findAllSync(); + for (var category in categories) { + isar.categorys.putSync( + category..pos = category.id, + ); + } + });*/ + + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text( + l10n.add, + style: TextStyle( + color: controller.text.isEmpty || isExist + ? Theme.of( + context, + ).primaryColor.withValues(alpha: 0.2) + : null, + ), + ), + ), + ], + ), + ], + ); + }, + ), + ); + }, + ); + }, + label: Row( + children: [ + const Icon(Icons.add), + const SizedBox(width: 10), + Text(l10n.add), + ], + ), + ), + ); + } +} + +class CustomTextFormField extends StatelessWidget { + final TextEditingController controller; + final List entries; + final BuildContext context; + final Function(bool) exist; + final bool isExist; + final String name; + final Function(String) val; + const CustomTextFormField({ + super.key, + required this.controller, + required this.entries, + required this.context, + required this.exist, + required this.isExist, + this.name = "", + required this.val, + }); + + @override + Widget build(BuildContext context) { + final l10n = l10nLocalizations(context); + return TextFormField( + autofocus: true, + controller: controller, + keyboardType: TextInputType.text, + onChanged: (value) { + if (name != controller.text) { + exist( + entries + .where((element) => element.title == controller.text) + .toList() + .isNotEmpty, + ); + } + val(value); + }, + onFieldSubmitted: (s) {}, + decoration: InputDecoration( + helperText: isExist == true + ? l10n!.add_category_error_exist + : l10n!.category_name_required, + helperStyle: TextStyle(color: isExist == true ? Colors.red : null), + isDense: true, + label: Text( + l10n.name, + style: TextStyle(color: isExist == true ? Colors.red : null), + ), + filled: true, + fillColor: Colors.transparent, + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + border: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 36ccaa98..203882cb 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -4,8 +4,10 @@ import 'dart:io'; import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -51,7 +53,7 @@ class _PlayerScreenState extends ConsumerState { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); - final useAnime4K = ref.watch(useAnime4KStateProvider); + final useMpvConfig = ref.watch(useMpvConfigStateProvider); final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); @@ -484,7 +486,7 @@ class _PlayerScreenState extends ConsumerState { ], ), SwitchListTile( - value: useAnime4K, + value: useMpvConfig, title: Text(context.l10n.enable_mpv), subtitle: Text( context.l10n.mpv_info, @@ -494,7 +496,7 @@ class _PlayerScreenState extends ConsumerState { if (value && !(await _checkMpvConfig(context))) { return; } - ref.read(useAnime4KStateProvider.notifier).set(value); + ref.read(useMpvConfigStateProvider.notifier).set(value); }, ), ListTile( @@ -507,6 +509,14 @@ class _PlayerScreenState extends ConsumerState { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), + ListTileWidget( + onTap: () { + context.push("/customButtonScreen"); + }, + icon: Icons.terminal, + title: context.l10n.custom_buttons, + subtitle: context.l10n.custom_buttons_info, + ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart new file mode 100644 index 00000000..f931e92d --- /dev/null +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart @@ -0,0 +1,11 @@ +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/custom_button.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +part 'custom_buttons_provider.g.dart'; + +@riverpod +Stream> getCustomButtonsStream(Ref ref) async* { + yield* isar.customButtons.filter().idIsNotNull().watch(fireImmediately: true); +} diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart new file mode 100644 index 00000000..276a045a --- /dev/null +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'custom_buttons_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$getCustomButtonsStreamHash() => + r'463d2142793ffb5a905f6f90c3a756445be8b133'; + +/// See also [getCustomButtonsStream]. +@ProviderFor(getCustomButtonsStream) +final getCustomButtonsStreamProvider = + AutoDisposeStreamProvider>.internal( + getCustomButtonsStream, + name: r'getCustomButtonsStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getCustomButtonsStreamHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef GetCustomButtonsStreamRef + = AutoDisposeStreamProviderRef>; +// 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 diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index d5c54e45..47494a7d 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -219,17 +219,17 @@ class UseLibassState extends _$UseLibassState { } @riverpod -class UseAnime4KState extends _$UseAnime4KState { +class UseMpvConfigState extends _$UseMpvConfigState { @override bool build() { - return isar.settings.getSync(227)!.useAnime4K ?? false; + return isar.settings.getSync(227)!.useMpvConfig ?? false; } void set(bool value) { final settings = isar.settings.getSync(227); state = value; isar.writeTxnSync( - () => isar.settings.putSync(settings!..useAnime4K = value), + () => isar.settings.putSync(settings!..useMpvConfig = value), ); } } diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index bd52f1cc..50e47082 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -175,22 +175,22 @@ final useLibassStateProvider = ); typedef _$UseLibassState = AutoDisposeNotifier; -String _$useAnime4KStateHash() => r'3902552d399794bf7c78d5f18adcf59f267b3cf6'; +String _$useMpvConfigStateHash() => r'f91e6a7dbd3c5f7674ba74842521ecfca01c78b0'; -/// See also [UseAnime4KState]. -@ProviderFor(UseAnime4KState) -final useAnime4KStateProvider = - AutoDisposeNotifierProvider.internal( - UseAnime4KState.new, - name: r'useAnime4KStateProvider', +/// See also [UseMpvConfigState]. +@ProviderFor(UseMpvConfigState) +final useMpvConfigStateProvider = + AutoDisposeNotifierProvider.internal( + UseMpvConfigState.new, + name: r'useMpvConfigStateProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$useAnime4KStateHash, + : _$useMpvConfigStateHash, dependencies: null, allTransitiveDependencies: null, ); -typedef _$UseAnime4KState = AutoDisposeNotifier; +typedef _$UseMpvConfigState = AutoDisposeNotifier; String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; /// Copied from Dart SDK diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index cc11ce4c..3747ba35 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -6,6 +6,7 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/changed.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/history.dart'; @@ -176,6 +177,7 @@ class StorageProvider { ChangedPartSchema, ChapterSchema, CategorySchema, + CustomButtonSchema, UpdateSchema, HistorySchema, DownloadSchema, @@ -199,6 +201,29 @@ class StorageProvider { }); } + final customButton = await isar.customButtons + .filter() + .idEqualTo(1) + .findFirst(); + if (customButton == null) { + await isar.writeTxn(() async { + isar.customButtons.put( + CustomButton( + title: "+85 s", + codePress: + "var intro_length = mp.get_property_number(\"user-data/current-anime/intro-length\")\naniyomi.right_seek_by(intro_length)", + codeLongPress: + "aniyomi.int_picker(\"Change intro length\", \"%ds\", 0, 255, 1, \"user-data/current-anime/intro-length\")", + codeStartup: + "function update_button(_, length) {\n if (!length || length == 0) {\n aniyomi.hide_button()\n } else {\n aniyomi.show_button()\n }\n aniyomi.set_button_title(\"+\" + length + \" s\")", + isFavourite: true, + pos: 0, + updatedAt: DateTime.now().millisecondsSinceEpoch, + ), + ); + }); + } + return isar; } } diff --git a/lib/router/router.dart b/lib/router/router.dart index a0b24a97..c889dfb8 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -16,6 +16,7 @@ import 'package:mangayomi/modules/more/data_and_storage/create_backup.dart'; import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; import 'package:mangayomi/modules/more/settings/browse/source_repositories.dart'; +import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/statistics/statistics_screen.dart'; import 'package:mangayomi/modules/novel/novel_reader_view.dart'; @@ -214,6 +215,10 @@ class RouterNotifier extends ChangeNotifier { name: "customNavigationSettings", child: const CustomNavigationSettings(), ), + _genericRoute( + name: "customButtonScreen", + child: const CustomButtonScreen(), + ), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga), From ae1d158264b2bda9c2cec26de7a8dbaede7b17ba Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:08:13 +0200 Subject: [PATCH 016/100] Combine two identical classes Combine MangasSetIsReadState and MangasSetUnReadState to reduce code duplication. --- lib/modules/library/library_screen.dart | 4 +- .../providers/library_state_provider.dart | 45 +---- .../providers/library_state_provider.g.dart | 176 +++--------------- lib/services/aniskip.g.dart | 2 +- lib/services/sync_server.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- lib/services/trackers/myanimelist.g.dart | 2 +- 7 files changed, 41 insertions(+), 192 deletions(-) diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 971a3c12..bb8f4b80 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -618,6 +618,7 @@ class _LibraryScreenState extends ConsumerState .read( mangasSetIsReadStateProvider( mangaIds: mangaIds, + markAsRead: true, ).notifier, ) .set(); @@ -649,8 +650,9 @@ class _LibraryScreenState extends ConsumerState onPressed: () { ref .read( - mangasSetUnReadStateProvider( + mangasSetIsReadStateProvider( mangaIds: mangaIds, + markAsRead: false, ).notifier, ) .set(); diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 175c737c..44c8c323 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -829,50 +829,21 @@ class IsLongPressedMangaState extends _$IsLongPressedMangaState { @riverpod class MangasSetIsReadState extends _$MangasSetIsReadState { @override - void build({required List mangaIds}) {} + void build({required List mangaIds, required bool markAsRead}) {} void set() { final allChapters = []; final allMangas = []; + 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 mangaIds}) {} - - void set() { - final allChapters = []; - final allMangas = []; - 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); } diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index 6f33272d..08acfd3e 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -2551,14 +2551,16 @@ final isLongPressedMangaStateProvider = typedef _$IsLongPressedMangaState = AutoDisposeNotifier; String _$mangasSetIsReadStateHash() => - r'8f4f7f22ea8e82cf2370fb997033e1a4ec03168f'; + r'0bc11e49fd33d7c76e86b005e6d30d7ac39bb5e2'; abstract class _$MangasSetIsReadState extends BuildlessAutoDisposeNotifier { late final List mangaIds; + late final bool markAsRead; void build({ required List mangaIds, + required bool markAsRead, }); } @@ -2574,9 +2576,11 @@ class MangasSetIsReadStateFamily extends Family { /// See also [MangasSetIsReadState]. MangasSetIsReadStateProvider call({ required List mangaIds, + required bool markAsRead, }) { return MangasSetIsReadStateProvider( mangaIds: mangaIds, + markAsRead: markAsRead, ); } @@ -2586,6 +2590,7 @@ class MangasSetIsReadStateFamily extends Family { ) { return call( mangaIds: provider.mangaIds, + markAsRead: provider.markAsRead, ); } @@ -2610,8 +2615,11 @@ class MangasSetIsReadStateProvider /// See also [MangasSetIsReadState]. MangasSetIsReadStateProvider({ required List mangaIds, + required bool markAsRead, }) : this._internal( - () => MangasSetIsReadState()..mangaIds = mangaIds, + () => MangasSetIsReadState() + ..mangaIds = mangaIds + ..markAsRead = markAsRead, from: mangasSetIsReadStateProvider, name: r'mangasSetIsReadStateProvider', debugGetCreateSourceHash: @@ -2622,6 +2630,7 @@ class MangasSetIsReadStateProvider allTransitiveDependencies: MangasSetIsReadStateFamily._allTransitiveDependencies, mangaIds: mangaIds, + markAsRead: markAsRead, ); MangasSetIsReadStateProvider._internal( @@ -2632,9 +2641,11 @@ class MangasSetIsReadStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaIds, + required this.markAsRead, }) : super.internal(); final List mangaIds; + final bool markAsRead; @override void runNotifierBuild( @@ -2642,6 +2653,7 @@ class MangasSetIsReadStateProvider ) { return notifier.build( mangaIds: mangaIds, + markAsRead: markAsRead, ); } @@ -2650,13 +2662,16 @@ class MangasSetIsReadStateProvider return ProviderOverride( origin: this, override: MangasSetIsReadStateProvider._internal( - () => create()..mangaIds = mangaIds, + () => create() + ..mangaIds = mangaIds + ..markAsRead = markAsRead, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaIds: mangaIds, + markAsRead: markAsRead, ), ); } @@ -2669,13 +2684,16 @@ class MangasSetIsReadStateProvider @override bool operator ==(Object other) { - return other is MangasSetIsReadStateProvider && other.mangaIds == mangaIds; + return other is MangasSetIsReadStateProvider && + other.mangaIds == mangaIds && + other.markAsRead == markAsRead; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaIds.hashCode); + hash = _SystemHash.combine(hash, markAsRead.hashCode); return _SystemHash.finish(hash); } @@ -2686,6 +2704,9 @@ class MangasSetIsReadStateProvider mixin MangasSetIsReadStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaIds` of this provider. List get mangaIds; + + /// The parameter `markAsRead` of this provider. + bool get markAsRead; } class _MangasSetIsReadStateProviderElement @@ -2695,153 +2716,8 @@ class _MangasSetIsReadStateProviderElement @override List get mangaIds => (origin as MangasSetIsReadStateProvider).mangaIds; -} - -String _$mangasSetUnReadStateHash() => - r'09ddd287b110fd76494f9f56bd5cf76f58936f1f'; - -abstract class _$MangasSetUnReadState - extends BuildlessAutoDisposeNotifier { - late final List mangaIds; - - void build({ - required List mangaIds, - }); -} - -/// See also [MangasSetUnReadState]. -@ProviderFor(MangasSetUnReadState) -const mangasSetUnReadStateProvider = MangasSetUnReadStateFamily(); - -/// See also [MangasSetUnReadState]. -class MangasSetUnReadStateFamily extends Family { - /// See also [MangasSetUnReadState]. - const MangasSetUnReadStateFamily(); - - /// See also [MangasSetUnReadState]. - MangasSetUnReadStateProvider call({ - required List mangaIds, - }) { - return MangasSetUnReadStateProvider( - mangaIds: mangaIds, - ); - } - @override - MangasSetUnReadStateProvider getProviderOverride( - covariant MangasSetUnReadStateProvider provider, - ) { - return call( - mangaIds: provider.mangaIds, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'mangasSetUnReadStateProvider'; -} - -/// See also [MangasSetUnReadState]. -class MangasSetUnReadStateProvider - extends AutoDisposeNotifierProviderImpl { - /// See also [MangasSetUnReadState]. - MangasSetUnReadStateProvider({ - required List mangaIds, - }) : this._internal( - () => MangasSetUnReadState()..mangaIds = mangaIds, - from: mangasSetUnReadStateProvider, - name: r'mangasSetUnReadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangasSetUnReadStateHash, - dependencies: MangasSetUnReadStateFamily._dependencies, - allTransitiveDependencies: - MangasSetUnReadStateFamily._allTransitiveDependencies, - mangaIds: mangaIds, - ); - - MangasSetUnReadStateProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.mangaIds, - }) : super.internal(); - - final List mangaIds; - - @override - void runNotifierBuild( - covariant MangasSetUnReadState notifier, - ) { - return notifier.build( - mangaIds: mangaIds, - ); - } - - @override - Override overrideWith(MangasSetUnReadState Function() create) { - return ProviderOverride( - origin: this, - override: MangasSetUnReadStateProvider._internal( - () => create()..mangaIds = mangaIds, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - mangaIds: mangaIds, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement - createElement() { - return _MangasSetUnReadStateProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is MangasSetUnReadStateProvider && other.mangaIds == mangaIds; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, mangaIds.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin MangasSetUnReadStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `mangaIds` of this provider. - List get mangaIds; -} - -class _MangasSetUnReadStateProviderElement - extends AutoDisposeNotifierProviderElement - with MangasSetUnReadStateRef { - _MangasSetUnReadStateProviderElement(super.provider); - - @override - List get mangaIds => (origin as MangasSetUnReadStateProvider).mangaIds; + bool get markAsRead => (origin as MangasSetIsReadStateProvider).markAsRead; } // 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 diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index c05db920..b2e1defb 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; +String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index 30ccc0ed..af5cc986 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'97a778696e0cc8b8e4c706de50d60464bb7b2f03'; +String _$syncServerHash() => r'141ba3be28182e05480e06fbf3f1de68f868cb8e'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index 96c9f674..9eee8f76 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'fafb964252b3a5741e981cb8c2f0f2090b3b86ae'; +String _$anilistHash() => r'c786a526fdacc875e4a7e00886b2bda546eafeae'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index 7283560e..a3d8b6ee 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'a612e9ce814268ac79dc86d810ca6bd3671812e6'; +String _$myAnimeListHash() => r'4391ad9446d14b1fb1ffdfbc5323ef04db5140f7'; /// Copied from Dart SDK class _SystemHash { From c2bae6d17bb8fbde440053e5e2a43d12be9e7565 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:29:30 +0200 Subject: [PATCH 017/100] Extract reusable Select Bar and Button widgets Previously, the same select bar and button styles were defined in both `library_screen.dart` and `manga_detail_view.dart`, resulting in repeated code. This commit extracts the select bar and its buttons into reusable widgets to reduce duplication and improve readability and maintainability. --- lib/modules/library/library_screen.dart | 223 +++---- .../manga/detail/manga_detail_view.dart | 560 ++++++++---------- lib/modules/widgets/bottom_select_bar.dart | 66 +++ 3 files changed, 371 insertions(+), 478 deletions(-) create mode 100644 lib/modules/widgets/bottom_select_bar.dart diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index bb8f4b80..c42a7871 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -22,6 +22,7 @@ import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_pro import 'package:mangayomi/modules/more/categories/providers/isar_providers.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'; @@ -554,161 +555,85 @@ class _LibraryScreenState extends ConsumerState 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(isLongPressedMangaStateProvider), + actions: [ + BottomSelectButton( + icon: Icon(Icons.label_outline_rounded, color: color), + onPressed: () { + final mangaIdsList = ref.watch(mangasListStateProvider); + final List 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 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, - markAsRead: true, - ).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( - mangasSetIsReadStateProvider( - mangaIds: mangaIds, - markAsRead: false, - ).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(), + ), + ], ); }, ), diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 622c9570..6da41c1b 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -24,6 +24,7 @@ import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.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/custom_extended_image_provider.dart'; @@ -811,8 +812,8 @@ class _MangaDetailViewState extends ConsumerState ], ), ), - bottomNavigationBar: Consumer( - builder: (context, ref, child) { + bottomNavigationBar: Builder( + builder: (context) { final chap = ref.watch(chaptersListStateProvider); bool getLength1 = chap.length == 1; bool checkFirstBookmarked = @@ -821,340 +822,241 @@ class _MangaDetailViewState extends ConsumerState chap.isNotEmpty && chap.first.isRead! && getLength1; final l10n = l10nLocalizations(context)!; final color = Theme.of(context).textTheme.bodyLarge!.color!; - 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), + return BottomSelectBar( + isVisible: isLongPressed, + actions: [ + BottomSelectButton( + icon: Icon( + checkFirstBookmarked + ? Icons.bookmark_remove_outlined + : Icons.bookmark_add_outlined, + color: color, + ), + onPressed: () { + final chapters = ref.watch(chaptersListStateProvider); + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; + for (var chapter in chapters) { + chapter.isBookmarked = !chapter.isBookmarked!; + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); + } + isar.writeTxnSync(() { + isar.chapters.putAllSync(updatedChapters); + }); + ref + .read(isLongPressedStateProvider.notifier) + .update(false); + ref.read(chaptersListStateProvider.notifier).clear(); + }, ), - ), - 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( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - onPressed: () { - final chapters = ref.watch( - chaptersListStateProvider, - ); - final List updatedChapters = []; - final now = DateTime.now().millisecondsSinceEpoch; - for (var chapter in chapters) { - chapter.isBookmarked = !chapter.isBookmarked!; - chapter.updatedAt = now; - chapter.manga.value = widget.manga; - updatedChapters.add(chapter); - } - isar.writeTxnSync(() { - isar.chapters.putAllSync(updatedChapters); - }); - ref - .read(isLongPressedStateProvider.notifier) - .update(false); - ref - .read(chaptersListStateProvider.notifier) - .clear(); - }, - child: Icon( - checkFirstBookmarked - ? Icons.bookmark_remove_outlined - : Icons.bookmark_add_outlined, - color: color, - ), - ), - ), + BottomSelectButton( + icon: Icon( + checkReadBookmarked + ? Icons.remove_done_sharp + : Icons.done_all_sharp, + color: color, ), - Expanded( - child: SizedBox( - height: 70, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - onPressed: () { - final chapters = ref.watch( - chaptersListStateProvider, - ); - final List updatedChapters = []; - final now = DateTime.now().millisecondsSinceEpoch; - for (var chapter in chapters) { - chapter.isRead = !chapter.isRead!; - if (!chapter.isRead!) { - chapter.lastPageRead = "1"; - } - chapter.updatedAt = now; - chapter.manga.value = widget.manga; - updatedChapters.add(chapter); - if (chapter.isRead!) { - chapter.updateTrackChapterRead(ref); - } - } - isar.writeTxnSync(() { - isar.chapters.putAllSync(updatedChapters); - isar.mangas.putSync(widget.manga!); - }); - ref - .read(isLongPressedStateProvider.notifier) - .update(false); - ref - .read(chaptersListStateProvider.notifier) - .clear(); - }, - child: Icon( - checkReadBookmarked - ? Icons.remove_done_sharp - : Icons.done_all_sharp, - color: color, - ), - ), - ), - ), - if (getLength1) - Expanded( - child: SizedBox( - height: 70, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - onPressed: () { - int index = chapters.indexOf(chap.first); - final List updatedChapters = []; - final now = DateTime.now().millisecondsSinceEpoch; - chapters[index + 1].updateTrackChapterRead(ref); - for ( - var i = index + 1; - i < chapters.length; - i++ - ) { - final chapter = chapters[i]; - if (!chapter.isRead!) { - chapter.isRead = true; - chapter.lastPageRead = "1"; - chapter.updatedAt = now; - chapter.manga.value = widget.manga; - updatedChapters.add(chapter); - } - } - isar.writeTxnSync(() { - isar.chapters.putAllSync(updatedChapters); - isar.mangas.putSync(widget.manga!); - }); - ref - .read(isLongPressedStateProvider.notifier) - .update(false); - ref - .read(chaptersListStateProvider.notifier) - .clear(); - }, - child: Stack( - children: [ - Icon(Icons.done_outlined, color: color), - Positioned( - bottom: 0, - right: 0, - child: Icon( - Icons.arrow_downward_outlined, - size: 11, - color: color, - ), - ), - ], - ), - ), - ), - ), - if (!isLocalArchive) - Expanded( - child: SizedBox( - height: 70, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - onPressed: () { - for (var chapter in ref.watch( - chaptersListStateProvider, - )) { - final entries = isar.downloads - .filter() - .idEqualTo(chapter.id) - .findAllSync(); - if (entries.isEmpty || - !entries.first.isDownload!) { - ref.read( - addDownloadToQueueProvider( - chapter: chapter, - ), - ); - } - } - ref.watch(processDownloadsProvider()); - - ref - .read(isLongPressedStateProvider.notifier) - .update(false); - ref - .read(chaptersListStateProvider.notifier) - .clear(); - }, - child: Icon(Icons.download_outlined, color: color), - ), - ), - ), - if (isLocalArchive) - Expanded( - child: SizedBox( - height: 70, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - onPressed: () { - final selectedChapters = ref.watch( - chaptersListStateProvider, - ); - final totalChapters = - widget.manga!.chapters.length; - final isLastChapters = - selectedChapters.length == totalChapters; - final isAnime = widget.itemType == ItemType.anime; - final entryType = isAnime - ? l10n.episode - : l10n.chapter; - final pluralEntryType = isAnime - ? l10n.episodes - : l10n.chapters; - final mediaType = isAnime - ? l10n.anime - : l10n.manga; - final warningMessage = l10n - .last_entry_delete_warning( - totalChapters, - entryType, - pluralEntryType, - mediaType, - ); - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(l10n.delete_chapters), - content: isLastChapters - ? Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - const Icon( - Icons.warning_amber_rounded, - color: Colors.orange, - ), - const SizedBox(width: 12), - Expanded( - child: Text( - warningMessage, - style: TextStyle( - color: Colors.red, - ), - ), - ), - ], - ) - : null, - actions: [ - Row( - mainAxisAlignment: - MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text(l10n.cancel), - ), - const SizedBox(width: 15), - TextButton( - onPressed: () async { - final navigator = Navigator.of( - context, - ); - await isar.writeTxn(() async { - final idsToDelete = - selectedChapters - .map((c) => c.id!) - .toList(); - await isar.chapters.deleteAll( - idsToDelete, - ); - }); - if (!mounted) return; - ref - .read( - isLongPressedStateProvider - .notifier, - ) - .update(false); - ref - .read( - chaptersListStateProvider - .notifier, - ) - .clear(); - navigator.pop(); - if (isLastChapters) { - navigator.pop(); - Future.delayed( - const Duration( - milliseconds: 350, - ), - () { - isar.writeTxn( - () => isar.mangas.delete( - widget.manga!.id!, - ), - ); - }, - ); - } - }, - child: Text(l10n.delete), - ), - ], - ), - ], - ); - }, - ); - }, + onPressed: () { + final chapters = ref.watch(chaptersListStateProvider); + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; + for (var chapter in chapters) { + chapter.isRead = !chapter.isRead!; + if (!chapter.isRead!) { + chapter.lastPageRead = "1"; + } + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); + if (chapter.isRead!) { + chapter.updateTrackChapterRead(ref); + } + } + isar.writeTxnSync(() { + isar.chapters.putAllSync(updatedChapters); + isar.mangas.putSync(widget.manga!); + }); + ref + .read(isLongPressedStateProvider.notifier) + .update(false); + ref.read(chaptersListStateProvider.notifier).clear(); + }, + ), + if (getLength1) + BottomSelectButton( + icon: Stack( + children: [ + Icon(Icons.done_outlined, color: color), + Positioned( + bottom: 0, + right: 0, child: Icon( - Icons.delete_outline_outlined, + Icons.arrow_downward_outlined, + size: 11, color: color, ), ), - ), + ], ), - ], - ), + onPressed: () { + int index = chapters.indexOf(chap.first); + final List updatedChapters = []; + final now = DateTime.now().millisecondsSinceEpoch; + chapters[index + 1].updateTrackChapterRead(ref); + for (var i = index + 1; i < chapters.length; i++) { + final chapter = chapters[i]; + if (!chapter.isRead!) { + chapter.isRead = true; + chapter.lastPageRead = "1"; + chapter.updatedAt = now; + chapter.manga.value = widget.manga; + updatedChapters.add(chapter); + } + } + isar.writeTxnSync(() { + isar.chapters.putAllSync(updatedChapters); + isar.mangas.putSync(widget.manga!); + }); + ref + .read(isLongPressedStateProvider.notifier) + .update(false); + ref.read(chaptersListStateProvider.notifier).clear(); + }, + ), + if (!isLocalArchive) + BottomSelectButton( + icon: Icon(Icons.download_outlined, color: color), + onPressed: () { + for (var chapter in ref.watch( + chaptersListStateProvider, + )) { + final entries = isar.downloads + .filter() + .idEqualTo(chapter.id) + .findAllSync(); + if (entries.isEmpty || !entries.first.isDownload!) { + ref.read( + addDownloadToQueueProvider(chapter: chapter), + ); + } + } + ref.watch(processDownloadsProvider()); + + ref + .read(isLongPressedStateProvider.notifier) + .update(false); + ref.read(chaptersListStateProvider.notifier).clear(); + }, + ), + if (isLocalArchive) + BottomSelectButton( + icon: Icon(Icons.delete_outline_outlined, color: color), + onPressed: () { + final selectedChapters = ref.watch( + chaptersListStateProvider, + ); + final totalChapters = widget.manga!.chapters.length; + final isLastChapters = + selectedChapters.length == totalChapters; + final isAnime = widget.itemType == ItemType.anime; + final entryType = isAnime ? l10n.episode : l10n.chapter; + final pluralEntryType = isAnime + ? l10n.episodes + : l10n.chapters; + final mediaType = isAnime ? l10n.anime : l10n.manga; + final warningMessage = l10n.last_entry_delete_warning( + totalChapters, + entryType, + pluralEntryType, + mediaType, + ); + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(l10n.delete_chapters), + content: isLastChapters + ? Row( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + const Icon( + Icons.warning_amber_rounded, + color: Colors.orange, + ), + const SizedBox(width: 12), + Expanded( + child: Text( + warningMessage, + style: TextStyle(color: Colors.red), + ), + ), + ], + ) + : null, + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(l10n.cancel), + ), + const SizedBox(width: 15), + TextButton( + onPressed: () async { + final navigator = Navigator.of(context); + await isar.writeTxn(() async { + final idsToDelete = selectedChapters + .map((c) => c.id!) + .toList(); + await isar.chapters.deleteAll( + idsToDelete, + ); + }); + if (!mounted) return; + ref + .read( + isLongPressedStateProvider + .notifier, + ) + .update(false); + ref + .read( + chaptersListStateProvider + .notifier, + ) + .clear(); + navigator.pop(); + if (isLastChapters) { + navigator.pop(); + Future.delayed( + const Duration(milliseconds: 350), + () { + isar.writeTxn( + () => isar.mangas.delete( + widget.manga!.id!, + ), + ); + }, + ); + } + }, + child: Text(l10n.delete), + ), + ], + ), + ], + ); + }, + ); + }, + ), + ], ); }, ), diff --git a/lib/modules/widgets/bottom_select_bar.dart b/lib/modules/widgets/bottom_select_bar.dart new file mode 100644 index 00000000..0f2cc56b --- /dev/null +++ b/lib/modules/widgets/bottom_select_bar.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; + +/// Bar, that appears at the bottom of the screen when long-pressing (selecting) +/// a Manga/Anime/Novel or Chapter/Episode +class BottomSelectBar extends StatelessWidget { + final bool isVisible; + final List actions; + + const BottomSelectBar({ + super.key, + required this.isVisible, + required this.actions, + }); + + @override + Widget build(BuildContext context) { + 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), + ), + ), + duration: const Duration(milliseconds: 100), + height: isVisible ? 70 : 0, + width: context.width(1), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: actions, + ), + ); + } +} + +/// Button for the BottomSelectBar +class BottomSelectButton extends StatelessWidget { + final Widget icon; + final VoidCallback onPressed; + + const BottomSelectButton({ + super.key, + required this.icon, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return Expanded( + child: SizedBox( + height: 70, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 0, + backgroundColor: Colors.transparent, + shadowColor: Colors.transparent, + ), + onPressed: onPressed, + child: icon, + ), + ), + ); + } +} From cd06ae3e7881efabe93b1093d1ac7ccba8f32eea Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:19:39 +0200 Subject: [PATCH 018/100] Fix Exception when disconnecting When restoring a backup, the app tries to disconnect DiscordRPC but that gives an exception, when there is no live IPC socket to close. `AnyhowException (AnyhowException(Failed to close to Discord IPC: Custom { kind: ConnectionRefused, error: "Couldn't retrieve the Discord IPC socket" }` --- lib/utils/discord_rpc.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/utils/discord_rpc.dart b/lib/utils/discord_rpc.dart index 6b821cd4..558abc56 100644 --- a/lib/utils/discord_rpc.dart +++ b/lib/utils/discord_rpc.dart @@ -203,6 +203,7 @@ class DiscordRPC { } Future disconnect() async { + if (!FlutterDiscordRPC.instance.isConnected) return; await FlutterDiscordRPC.instance.disconnect(); } From 4682ab3577d94a99222497f5beabeb9d92953c48 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 28 Jul 2025 23:42:55 +0200 Subject: [PATCH 019/100] added custom buttons --- assets/mangayomi_mpv.zip | Bin 0 -> 1192984 bytes lib/l10n/app_en.arb | 6 +- lib/l10n/generated/app_localizations.dart | 22 +- lib/l10n/generated/app_localizations_ar.dart | 13 +- lib/l10n/generated/app_localizations_de.dart | 13 +- lib/l10n/generated/app_localizations_en.dart | 13 +- lib/l10n/generated/app_localizations_es.dart | 13 +- lib/l10n/generated/app_localizations_fr.dart | 13 +- lib/l10n/generated/app_localizations_id.dart | 13 +- lib/l10n/generated/app_localizations_it.dart | 13 +- lib/l10n/generated/app_localizations_pt.dart | 13 +- lib/l10n/generated/app_localizations_ru.dart | 13 +- lib/l10n/generated/app_localizations_th.dart | 13 +- lib/l10n/generated/app_localizations_tr.dart | 13 +- lib/l10n/generated/app_localizations_zh.dart | 13 +- lib/main.dart | 36 ++ lib/models/custom_button.dart | 40 ++ lib/models/settings.dart | 2 +- lib/modules/anime/anime_player_view.dart | 373 +++++++++++++-- lib/modules/anime/widgets/desktop.dart | 15 +- .../settings/player/custom_button_screen.dart | 447 +++++++++++------- .../more/settings/player/player_screen.dart | 145 ++---- .../providers/custom_buttons_provider.dart | 4 +- .../providers/custom_buttons_provider.g.dart | 2 +- .../more/widgets/list_tile_widget.dart | 6 + lib/providers/storage_provider.dart | 21 +- 26 files changed, 926 insertions(+), 349 deletions(-) create mode 100644 assets/mangayomi_mpv.zip diff --git a/assets/mangayomi_mpv.zip b/assets/mangayomi_mpv.zip new file mode 100644 index 0000000000000000000000000000000000000000..40513093fa0febfb50f53c001a1955b07a5ad76f GIT binary patch literal 1192984 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

Km4%Bx+*5LhxYHqyxv{ytRtKk(bFF|okG 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

9lY6S{X*B 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

  • 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

    #|ZFw`N!| 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 z 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 PlFkelD=* zOOutitT^uF$7qp&T-o3PY)13M^=z`|kIUBn{@a-|u^12B@{SGHR}WirxcewOF)AJu zF_F{YJlLU!xPoU0o|?bRA9UVE!8k9!7%Vo$guoMomft~Pw)7+*Jb^K4%}*?46Sno1 zpi$#k8J-~<xItBIJlFY|sKcr=`}7KR zfEIZX67LEZmlM~%o^wS%ZIuVl6w|Po4}dgkVTh8pO9}{ks`DE|h6xct2K=&%{MfYAdEE81bc_82`(Z{TBR>uTx{P@Pkqz^a)y{*O4*T?_xnz0eysP$B8v-$yFw3oh9Il!Y8qO?Y4YD6sjR3$-sxZ`f8qH&LMb~qH zb37DNFS7<)n!e|$KnJ&}@m|G%&S?VoASNNr)QPe)T)k!?Lnr0H{dNT~n*R)W3MS~jd&SMy_ z%ou6~mHj)M_@lQFzQ}$uFyHu|cxN(t%R?^Vx21`HpDkGI7|v}LJ|ZjC$++*7F=R3h z2wmNTzkDB8`b*HCN|Yll^AP*WsK5;;hj8lG zT@^$dg$=hY<09HE9T$u;vb43Xs{3tCkHC-)dHa=5>pp|cF*X z0gAW9-?+EchSCP`H;$-KkfvWYgnmsKu88zd+aX>_&IAO5R8iWf&-3>v)z==kKL@~& ze(5au%xX*SlKy;Q{cWkb1HH4OQjd-9CC7b325@56s^v<{L-;er<2OVs4MH!hR{WtO zBP`(qWef-xZ}Lf~<#TS@FnlL+*riLtgQmw12G&67`&Y=EV-RH0Ggva*Sc(VzPJzU* zyQ>bvrTE{2K`b!Y@#@LWa$G&P&U$~hK}}3^L=qM%KUO0z zq!XEmrM-o}M6(QJG9j88e!N)on|KA?kkM95=i#)*$2QyiJ~w|zFFrhF0Ze6hI;@Pk zorES0#1VYT;FE9Ohz<47D4|k3Ql$pY3Rx(kGBt8_XaYlbxSbm00^!uueGbkPMGliR zp|$(}^h||)hF)ahVzJ2aq(8TY?=3Ul__pq**#Bx=SKF7oJV%Axei6eDF=QL6!1Bl? z{8!XXS6eUFe_rY55UB;l8D*Ms1z*_YHJ^f0x_HzOO<9$|{1xX{Yh{WhF^vnu0j9Dg zrFZ-IuWX;$meIxq>TlVw$u2}jtMP(EZQc(Su;LQ8K^HiCK~M>SC2?0M=Xm?nUYJ;S zPO6jO4@pnAHn3Z;W|}dsr5$twT)1&ztvK$5-)TD-2b4Qw8@jjGtC|u`zP;Y6tDGVLFyXv6J(wte?@z0^nWrM}-UQ zXJd-CiqMc2H1mh0Ua!_2MZ9ly8mKTDz$qhDhZ|2ffpzXg1QUf9PF?UFK|eD-*U5YJk4Vq3mwKFYNpME2{C?u`vM^h!!ftMC$0D+X zKh44GoB^8G{zNCA0rc4sZOLiea6Z8R$EC%kQm?aMP3%2*cAP>Hkb9()G# zvW#m{3U>K@>%7%kM**`CeN6@p^-8aU2b36%mK?a}0sCnHZ(3$SdQE}c)$Bw?d`hsH z(d{_?#iNmbEO8*t`*AGr??EiksGsJY`Ct6c=|wDXrU1YlR4H0aMfxQ9ZoZJo()Yj- z7v{tWNp=i z<|;lSlRSSq3x#YxTY9-`L{!O%b$uKY%UY_p!*xVr>iRPhGWL6szZ@dLCdn)~;Fi-J zC+S09A0K@r-E&Tz#l=?0sPgc2R*AfZbOG698NQPmR+$!sC22E0a)pz~^`j<^op&MF z)G&DQTg$|crtoZiA-jG(8ibG6pOf#Kpb>?2)Rii^*JFegcBNAy``Q-;uL8a{cX?0$ zUBMjVCGSt|5%{y}f8CAUVS+8GFTQy9PHGJCyNO*FTxjoWj2q=Et*!pC|46%oC9^IZ z(0a-+nhbmQ{Bh{~TCr;nQ42nVqM(}k3u*X{lcBonL!3ao|3mP+NztwPoBZT7DXVya za7ew#8InJ~G9uYX4RLK;CXjhedlEM1W=jUFwj=QV@++1H?qR&K6mn=52xVo-WN3zS zuHO(e2=WKT_IIcCk!?UJf;?2QC#Ys&%6zHci?Dt9WfYl6D)pVtKdJ?j+O4pZh6k9}G zC;XMQ^>=&*{2+ujQjPe*NGs#w+yV#z*doP3Hd!8Qz()@p8}!FEI2;bzoO%4yvm*Iz zRdfGP+@h!4Lg!;EMe6aKXWx5vL7!Du)|_fELVP-=hMJ-E7uv~t-DIdVLB`}@7&axB z)5QtN#5hc4_#L5Ghr-ocjn^4@{)Luj3rX95O3b1l60^-l@>7wEkj;vlXt8xu>Y^`i zAU`vJYA~h|8)8oOn4DXf~KJsgZH%93LeMX_ebc7|%c{lrf!=wg_~V{KI|xUxDPe-Ju z)Gd8(r0UB_di?Mi|3GPH|PNK zOJ{ywr3s1i_LGwU$35Nm$vG5CiYhb_5*40EWlUuM1QOUuiGOL4D5*LP_v z2lyvYH#$EX)5kt<4CJL&==*GM(tIHTYGLh9vXc3>Upli2o*Uw?mlQSxmL9M#ng-AL zCovU?RI3#M(yma7iSr7= zARLj&L~vev3$K1m?{mt&NUWEZpft=F^OG=g zP*FtZ#}xroxVLVbnR~X}y+Tpz|F+M%$p92%t(10URd93;*|}f*eEGGv*k`-_tp8zW zgIlMp$)uOmP0mze=dHH{^=KD{&zL|05oe-?cZLZ?dk`JU?(#;~;j7HY3jY>!4`zo^>N)HRaFq^WA{*Zf6yQ+tTck}~Yk~*16AWfl zo`&k1bgP3oBwxrjI|xV$-$fD0n!IIl& z6rw8}yy3*u8HwmuiXTYM-M)$#;GPy(knk{`IPZny3jS2?ONx<@yp~x6gSb6){TuII z6t_i^bT0}|0X9egHSwUViU{M3gx4m;e2e(?TpH&&9_3-Nb-*s8t==OHbVPRkK65pj zSRPN47eSgY;=JAAk@j2SkWmjAu1rajc zb3?`f2t*z}*^AhGRJJu;C^2avFD%2*7TL6>l)ePL|1nCR>VeSQe6HVx?czi{J z;yfBr$+!jd&-zNAz=06)hlhlj0qYVHp-s^iM4|1gk&1B9SY@EOSrHk_e|t}7%NR?1 zJUuPs-t=xULnd)5sA^YX2&=o;TnlZC&>%!7`3+Bi*X|Grw|1poly-dEuKh7v zo_Ea`!Y3M7+96k+wbetmMCuK@TIUAqm&+M5*K+RA5a+AXK;_Fz!NlnW%vT5eMChtc z313I3a`3E5h8(>)JBz%kx_ELi;;+9;<8Fea+gSR|Lg+EXv3AOyr<@u&i7|lC{n%-V zOxl1rDQLmDeG+e8aWtW9C4_eR^XO8?rgdaWxFIk|R|@D~-PsmngoDV|Xc0{|5LH|!Acvi|HGSGY7M(Z4vO>6>jsxh`%Gk}j?z{4>v`+43tvpsy4<9A8rw%?>YDYNkz~xDLL&`ML+4O#S*fZ5iwf8V_8|O*C1w(75PiDCtHA~fy~>gV3$PMi z?7k9PTW$&?_J1taj-4s(SZEJxz^AGV&=QTkD})g;E$!MHnJrUe1TMGvJn0CT)(Ma? zf6XK^{5sF;k)~rvvMR4t1NBUhBP+Lgc<7xpYNn&k*+@179KKyc;aZzUU(s(x5>))> zUVl1F>>!Sk$#DiJ2q!K5uBimC0>v=z`z(^pol;uBWSN6P@tmQaaOvpZOp6}l*@uHT z&WM236I4#%q!FP=Mo6WZa=Tv&l~y(S1pH;&qBM zvx=-irJ|DYUz)m{%RuL1s$yYAYL21Ge^?8Sl4@pXF`E1WA0InQMrh>AGGYn@5!!Sc zLnD^a;lCl4uei%72`+xX-T$Bz1n)2QFxdjB47w4()wB*mGzy_dmIhE*L!ay{-rX_9 zTB=E)UXx9=iatxtK*~at-?QA8iDi!G+&$)EWaRuVd37LS*S``NrYj6TA$ti*?}7d%4=f_Ch@gWHqwOA+KJnOFL1<`8Ibh$Mo*EE`Dm4U{p% z836TNHK?K={{A|bjdvBST#9H>ZAmeWziqi-Pd#Tm=gvF#VVBT;)Tl8zlmy{TD}qH) ze4W0~Qk+&Qug98O{2shdo|Ls(YBTd#p=eC#+AFmTPlh=vb$TXhH!&r~7I8x!baWbt z#PSK5rO1`TK849m+l~P1@`7!zXbZIXRvG|i1da>*IneHvp^iU7*#r{{%Y{GU$SSnG`ZAkAGHG)Yt}bVG`S)jud&l2riQc?5qsRtl=axEwUZnt ziF*^JzE+seY|y>BKxf>JzJ)eS2)d4P!mapG=NN%ucI1k66X+&-4)C3VxeDYp5%tJ!hIZ4LO@S}=9S zQfVPmViPnHJ)dH2>lA<|3!Z~n{;lx_ERyZxAn*$@l{;iio)=5|!bg(cv|>?kETGW! zD+}WS;v1kjJskh^!N}f<)FngxKf@PE$U@#T#8|TJc~KjxBOWb&T+#yvHAEyTGk?AH z$Y7x;-9L(dyu%`bxcrgNBx{IJJ9tao^NKJphNiTp-ZNRP@!HoP%p22aR@01gWv1%K z&+x%lKce+l2gJGU?fC#Gs$`WOho6u6Z!cAaN}K`jZy6ijl+J}2?lO`bk?Rw6Q;t)l z)sWw$mK0frU!7@`ipxi1T#IfY~}LR4o#N@rxod9H2X%A5FXtPOp^7l6iM)p)?- zU9}Bf%&v(4f5X2onRUkGRKmknww*5O8JcUPSNg^N^F2=^r(D|-oCgBWNa(&83!NKZ zdnz!dGo7m;{!`bdr{5FXsEg3@3vp}r$_Q*U`8FuQv?6;r#n(Tv@xcn_y84uzsz@Y5Z zy#+O=yXXK#-y+S@hU)_#Ew*ypts3*AUwU^wUz@4rsIi3z%ZdOo za7XGhk`EPelO3gI_mH8MfzcT!EaML-{dN&xmA@oGv*oWYrAs8aM*5pg47h?X|LzZd z(LOM??T>21Y3YPvG^FvftawjUd;@?9KW@*!dm1R-Ivx1*% zN*s}!1`v5bFNteYijJKM-9ToYp(W(5H1v&59QA4LVRSGcQ@l5uRNIR-M{-<9d`W($ z4?jgf=e_^(wZ&ro{JQ?c0o9$U&3g}Um3qiFbk=YHeJ-9%bRq0MD)gOMnNJb`a`0dR z+O6>ggxsa4#BszU@#A&cM%evA)#*anmE`{0J&PEMm4C{ju*k9=4BV$(|KWr|ugYen z4WOj5!g$Ry@74KgV?P}Bp0!2Mt%$y=DCkD95wDG9v?$r`PCMasb7w@;mCg1+jq>8= zC*6Cpt`8^ms<7JB*LBqk|McWjdK%kc#FB;<9VHL~u7^gdDU9(4oZ>SJ3Jv>Cr_mvr z*3ZvGB}yZ}9g;(d6S3nQh$Do|7O%;A;f3^+Vr6w09s0K#iRDlve_wbdFVVJXLpk0f zOI^CsX}Z-q+z8C-lgvjgRl1jY?LO<7hueLZ?M(Xff?zopoj3@!*F^p2JD8v%SkeM! zXgwYQU!qA!dwt%(29AJ)rCz{jQO5U3{~jtRcn(%ao+483)6otJL$M9UGGwYdj?ySKKTf|o zc4hsWQ1z=gV&dS0jxHOOhov7hN~MvS^dD7(F@&M_Ea%?#=41`_hcj((>#fz3I^I{G z<6hdT%^Y1u-4O~T(2K0>YIZxQfjc>v>{cUbzTbiXh#7>Jkd;3~BoX~Cpm*U<%>C$W z2qy4>0EwR&_LK*Ir^ANGI?efvOO`+Bcef-91tcPF06C;ED3jnOUOeAb3#?xRh%E12 z#R-SP?}K(b-CRARs$Ovj6&zt;(|s!o-Wa`TktYuj`j9`sC%1S#Be|g4!v_55^qdJ* zwzEoA_lW=-^F;87X=vmMl_>@}Gv}=_N$tS>U{*+Q7RjD^Y-d-oE^hSsOtx%3@t1GC z|4yNR_F8y6qC#Px2$vDOlc2Gf@%q`aBO5S(Wt!A;9^wrSygry?}l-v4GVH!^E%+9WgduB z(k1@v{4O|hief6;3TX)eMfl(!88r^dG%8NA?;A}WV0oRgVgX9Gs?#Q22&{4t@W3|> z#*3iDK%v*yPKL!N+iE{w$8pi9Dcg#|I!~mK-3!|N%J3TX6-?vyw2Yy*>2yyzeoL?? z{Kd~PazQC{Wshv1l0Mp-)ra1iB)U+!-&8EK=}5eZ20SL=l|@OUqYNv+_9yYxN-2bs zm|wFiY&b?1f)|b1ahyuq=Zc#az1IQnC z101i?jkvK3Aq*sf)28Qy0jgSSgxMfv)XW6n7I7rRQ&BExX*W|-rFw|k8ClZLM!(~U zbGq3QV1m5tyH_7|%Pdy}>?_~!H$11^b1FiKn+2W?Vk z)`N$RTWv{wYZ~l3L~|nY8vWt}(LN7GQ2__!Cm|Yid*PCn<3>dB`Sn_$3sGrhL-8n= zOL^Z#Pgr9}`S5U_Rf##b2gC~z9ddIjv2;Tx0QPZuA7?iP+!F4|J$67BXcH2nPmg2Q zA#{zFU!Y5L+~IGJ7eg{-f63v)2c%2MSw%c*MRl&-3(RnAtkV6F|7-+Jr+Li>t=-;iCF)4Z_ezW*!~u9u;!&AUVSr6@Kv<{_>hcee} zFSALkbHa8OWqc3IJ!9MAGH<{Lnl5Z8aq~Xyw<^nimvyA!l?hag=f$6c91>h5IK48K z>+Okh1lZ0KRB-gPHI>F^u=NWlr3oC>O*b@N+_={A_dB-Y3gcHIZW}Y2;pI_=$u0V_ zamUPgIu$;+Cmn-wSvwBF;w8_Rf`M9~b#e{44>p37lcDC< z5aBS@`5?cqBUPg9GdMO91~JtVhsdl_t0P0mjfORKPd9Gwvh?1~U&0*-13$ioRMdNW z>Ku2j;i(Q*ZbNf$GfQ#@G`t17D{@p*L2zf6^EmF1)64LB0)w*{(miN~4`H5ALS_SK zyk4xW?B6AWVDQ6Win8wZnZbMYd*78WO%~rpOg*E@uC6?Mu3x4|J&vLY#i|}a0$Lo{ z{iX7XiULl#))4=MH9~M5T_j!n_1L~eyj!$1e6qmkeXfg$wU^>$lI6g$0lYDT@FOTSBZ=3irqy z`3I2&f(?J9_`%0TXk=7cL*{)BoM~bvRG$_;q~zEP;qMdwrp@j;YERe%6AiK{94kUy+ z^ZR>AZGP7i`+e5?u)pZCn8=5|p6Mb6@x1jMy%Yn^>X$WYn|@_e=(k^<=@Yj4IAoNI z+@^Qvj|-OXA~4xHHAK0nxWqIjil6ywg7KmV2iR^2|CP)_|3`5Cl4conp>+-JB04#i z7a(7YPIIMmAj3t3KKI56fLo$r84Tj&3AUPaWv^+dGL#WDLPoJ!{Wa^g zi6CLdFmAPpj{m+-0+^d>@$n*dY8*iSG?Yu9Ftaz3lB+B9eY=a7fl;l?S_2o%(Ri!y zpsp@)`I2J!_sJ1Oy0Y&hGEFk|2C?n&sS8OOymCAnV6DS;5vEeg{R)5A67DSv+JHnl zCdAZWrR{{SmLi}AR+PcC1X?wH2Umcu-kHY}^O1&}No~FN@3-s>@ELz1pru0?K8Wg5 z{~vy~+z*hA)jhJm=6GtvqU8;}L;ORtD0=1~!W}a;IeAeTH#UYto+@CibB*GBU!+vq zS60J38R_(5Y^J%Xe`Xf%W!(u$l(W>i!oh<|0Zu69{v@k9TxxRJxI;+E$IH$ zMswB1w-!rSSN|~sT}r5=Va8EzD4RaRqrv3p<3d)gKv=NOKK3#7~ro9zii!G0t`4U*0C#WJPst+^W=v=vef4Hn%{M>tpiSLbb2 zED{tnP$uwMFQ!%V%6T`uoLWSh9gD|jQt^tzC3?`}fh(lA3)YQtPKzMf!=D8tAd;;MI%5ja7 z-W&N-mjsG_?fR#O#2Zn!pkQ!H0suRbyFpTG?}F&IGmwN=s@W{!%q} zEC$t$#X^sxy38c?Z}6jN+CBc(b1_9F6<-jSbggl03N6+5rv62Irl1-U`Vq!|^Iy(5 z(61y@ND3W3^zW?^%h?O{@3POCZS0=Po zAJ*}2(|UQDud#%qSg$D;$RZ&cp}9TDO9=CA*Q6QR$#Wdi(?1hE7(ccP=Hj|f`HK?E zE*C|r$}kC*q}QpaLJkBDUT%-Dy%n`0M`%_X!ugXjjmy%~XH2FgMf-n>PYwm)sgB=8 z=wNzTF;QBN05$S8GD5ylYL|E>`qDhvNN%INckkD;f(0u+zc+*MFa<=i$#tkm1>HZy zu6dVgr$}v)9GJ+I53$U4T@c)dGZ!FX`XVFzwV)e{Nq{$cm3RlFw`P9&>izYwU}`|4~~{3@Boc@Kr|hyM$BbT!0+fGDV#N8vxT)E8## zLQC!Fst+b&4IPiZzf)Eq0T_4gDXeWX#$O}T3;i*HbzK2p)#tc zAZANCYga`nMzz?dNGX0mMyzVrG<1_C-$JG&G6i#CC$P}ajA}R2Tx=Srki*rVeYekN z9f>ZiXs*4kn>_C8{y&_ZS+X6u4MaEO?%+J^e`DqWk*K;3mpUW{FQyZdEr2+)CMwze8C3i%XrKey zC5Ztgb$y)8&uKBtdp`Kc2m*|u< zzJ*s{MP65wyO{})3yI8dX$KRHF!!n{JkuSTSv!$k5fIRXU`_2Nnk=clcEZwwxk%EZ zSFwzqq*%tdKmH$=Z?f8FjPXWR*wG``rn70Ol$fat?d(a(domhhu<e>|4 zUAab^MtBlBM|uv8DZH5LhTJ4A5Cxl)&nZGX_sg+(e*{nt38T)D8z$=~7TBqLS1z8n zi}DTyx*|S9h(->3qAlOBI8=Np68Fv8Toj0w$peRMxSkkog;5ZU?_!8vFkUfmKyNiqQLaH{`X33G`~jfZb-id?eTqRvro?I2B=L zQf~07Vxcm&J=dy?R!RX3Z*|AG`eYtRp&In@JfwRulPu+zj9NiLy!+lHF2482hFH6H zQAVib*^iK(9Pcx__*uYcO3E{GJo`;6vKduHf#saZBj)NV*{M#Y+05BFrcX~|BR&9* zf?~eQ*(>YDg->!if@s*)Vp)(#y;PQ&>)UI-*YGEV}^B=oSs zY#fHt;$RK)f&(M=GP4-ZoLbkRRV;{ZN_81;Q40wP&=w|ZW6>C<18YOXbD259;`vlL z*d)_@ujtQ-ca)ynAAMn(BClw$jQ|Tw10&y!!cfi8#mo+NywwOfM)H>w@i%5igCCGq z9Ks~xyQwzR24Dq`r@_vK;0ye-f348as!?Iezns%8&G$O~0&x^9=68xx6AtWg%$*HM zQ_JN}CwnM~bGg^-(Sqf0??nd?I?;|XgAS-h?Zw-lQ16yJ*FZVvx*k-9%1IFA9fU*(h zqO*#be=Ok+E=58FY)UoBjcQJLb+)ZGXoU=!_#|mIR$nB5qA3sDS3HaBmQz?pB49K5zOdB7ed-5D&^t@jS>Tg$d+LLq+It=!pK>I zL=1v;{}KU^mnq*$OVRH?ASPQ;TEcH21|ry09&KSa=A*CS^TvkqWICe53uVZ0#JNC` zea?;k8CSelF!Jlr^c0Lz{l1OP<>wmm>bzY)S{PIdBf@jj!D3(pL!S}3Q0n3*6-%dr zU>w#$nT$YOH>UfU-tfP*i9fvZcS06#-JXzykx1?K{NVa>sjq)Rtl+G&0${h14r!3T z;ouQ7IOx%$WqC566v_s=i`yj$?C3G70vYeDH6_cicyd^gG_#10m?*|mxFTSjiWyIO z9qpn)N2O_tWT?pnOF+5m`V1@HFPBU@v><0qgQ^pB1MMu{qM zRIO%csCX$p=R)OW1f&uBFP$~mL3^lqw*RLY-i%4)bOi_yw>*D7wUxsweAt#hKf{VQ z^2)4UJqv*M<@JQkJenIWn8scW+(iN#0e!70%%~C5O!Z*!7HFD*-MB?2RV^qUDX^l@ z6USDs*ADhdH^jIu){~Ll4To#hu(6?^OMdS28?e$bJd-g4{otwXHIsfS{g_Y(pT=6o zUE+3N&brQW%{*t_$B&>8}jM?Xj04BbyfnL^?qcb$m07hj?GRXM$QzNH`c?Bp(q3h zCn3`ZP5vZ9tqsggLpPk@QK&9v3g&P7eCkCV&1~okA@7$dgB0a3(_g+-6|dJy*D|>k zb)Nkl-SYiu!^feic`Uk^wf8#fu&r15>D`HZw=t|tWclF895{sX7fWa_?`&h#iS}JF zpz#YhDRdEY!`fo8gI=70-z~dW>EE%$>u#Z9!SVI`U;~#mlOgYvk0Aydc7{l)+%6KC z8n$n)aEi*-91fg61=-ZI)z~_LLUC#*0b-g zmEFH<6YsCJ!IxA*!2Qvm%JXF?J6I>Y}F8zpL10a_^bx%@=%iw9s&$oG_S) zFc!mdV|9_HP&MbM#PO=+lXG=(_id9Lc-oEK)rl#-s}nB>g*lD0Ke$WVZCzbT##lv! z=Z=Z_h+h2JD*PG>!mgn%I9Bm;(kJxMUPFGkpKhFm_TubL42<;=;xGQ#NAViYt8;{?84YRrXm(M8T=YA1*G>i+3xgZXfx8Hiry44A)BMxs+)O_LKm zmCAGRlomly_P`WWa=z8@%o$#?vs$c#nhi1ot8}l=c;d~QFh+WS;;?@2vO_=F@{qul z3?b}xG6`09+$9htO`DxKFh3*%<5g)uIs-scf`YR88U3y15T~>194cP5K<2Z1QKO75 zt}l~ilvU3j;pUC;Ud5j*5iCf7ze`AwCxDuo`frqn9`C(s#*z<97F}BY3@m=w6SL~c zXJeJCEO-vW?JaQ7mNBler{OSkeW?X*AMWiVg36}bkSGObgz;dK@j_i{yLYC1^*yy6 zTQ=3??M-cR*3d6!s>vF)I{byP5W9J6at*^tGF6i;g)jO93_$-c4=*t2y%!JHK{ku z`qfX9YBHlB6wkc%O`7F!mH!akS!J*60Xv4s&cQM-Ao`zTv5SlAC$u~QpG@@SPZ!ui z-LDPm54aRu7*dJ%IEtV0dHavE-_Eu#i{nn}Dc9?>SLH1YW=9H?!X=y;eAk^DH!|{J zG#BT`&seovUfYv+M(743Yq|c`Jotn|%@%}uFTp^7wYT>g{=8e{gkwrk3@+5253vA| z%LtYPJEJ8Ip~Q;DFzoc?So#cVqRB@d)muQ;jC7_CyD>N=t(wtn%8MZYF3a^On#=5@4*x5DaskLq`)^n^4imNVkP{_pX^kk!d_rz{$TfN=CRhenu3} z=gRQg6#5e8a&c>e6G*Nm^c0e#Ezo3J*Iw=B_Yhp}V`7Lj2B&c(3Ys&*og_AHCdP_t z>$#m=o)R$tUWb!10_P$?h8DsscbYIs+_;5f{deEvXAR>)KSO6mZ^;{Wq~_s}^VX$rL6=D90dQw)I=SWUV#N%NA0>$5p-~78Ze;q() zk8SJ0GEo9aay~i7wnBgjt7ODR&D5|GR0>U7$X_cfq_QI;_SEQUUMD4RQD zy{hgIVvQe--~Xqhv=<$v{S6(Zz33?IZ|ErPMMr6WLq};ZI!gN+I!b%dQQF_oQQC`+ z(*A~y(q43w_BV8t_M)S-zoDbF7agVj6&=OL)tW-2LS0$Pd0fnP8X7v`2=oP=&2sO4 z+azC-VGIL1lt-T9!&ZebeM{7^GLF^W#-Fr2LP`siKm$1V=t}g@z=wS8O z8j{Nq%_^bdD)G62jScjYV;n%JH z0gF=jh&+EPL~mZ60mnUJ4xO`PMnfVeFXi4DtLl)DW5gn$CMOzrjZK@~1 z@~)YxrKZM;PoU)!%^jp3Qh5{q*?)9^fx^EG!bTvMU1@mtV01sif%uUTpqn#~>& zo428e%DBhQ_Y(fTUAP{>y}bV6nh|UJu_%BH1$AE?wevtz0NBjfBB(XksCj+KT+Tws zgb+Zlj?_(My+-?6!`}AZVk8cgat)~m8s#eB;(EeD^Lv=TEBT8L0`Q>}RmGe6%XrTt zqZJR|++McQ6^MzC0XL9qf9Bn2bACMxmW=2+|YJ=)4EOJ_md zL{1llW@hxRQS}f#zZdi8y;dwNic4q+mRF0GHuefdUeh%Ch|hBz#Aw*H3)3BlPl9}O zIHrMlnjzzkvmIkn>S+_^w!XhIhZTh~Bx^k&JN(`lcR;DuG|NI=BYQEDe%(7vZQn!` ztF5L$al?L{G7MlYF$Z9fgkOHISWV|gR14wVztL%UvU{)R!&l03Vh}V;`j5(AawSc>zPj1C}* zucfSd8JtpDP=E=cN;gl26-x9zrT;}@<~0NoyeTp=ti?HQ{6zsjNBg{jUzs-=yJ|82 znyA%F^>IG*wB9TE^G*R#?wUqS1k@cP5PQvsseT<$H59f41fgO$q7`Gp1a}4F#$0{Q z6vVDYGfC%gsZ;aExP^!&(acS4L@38-foM+5$##{-vI#L2*e&2twY^vI_nSq&JJt1{ zYh?LeGJuk&!e`olPm^@@z}ufKu|M=~<~Ah~#AvXVI9;Q2G|=5EH$H*P9zh-f|Klz+ zpdW5ZY9YkgghRN*v7mAfUZ#&zUHbzUB^fAcJ=h*Bf9`i;K%Ww#6Z+UL-lW93+N+u{ zlkU~%ULy13sG@imJKK>pn2H{8shwX8I3}3{lmiV~nM8C1j^iwWp>fc20?isqGUx!-0HOKl0VWMy1}O}o2HL*byom>6y9v<_jbTMjf$i}K zI}u~`OrJqSv4+jw<95(gdE^kg{^k5N)BcI{RF}>Fe#aQE9eI#Ttoo{m2c&nR#P%Nv zSfS3)wqV{JAOM@_mn^iOpiysR@dn%r>l`d75Mm$gOx*d?ScbX3mjJ5c;S_Y3jS}lO zYlYumbAvDs6P9^{f5sOt5)3V(XaF)F74D6VZoJ45=lkf2YK@4n9=j0KP7l|Y5$_ph zrv*;I){b_r%0*l!b}s5uvj?rvnRWy91~i3QZgPPmftm(}=?gxRE{eQ4&Cej?4f`oD zS|s4*)0r`Yjo*=K_n244blZt%2xPRKp1&7RYy6>Oo~ZW6zMC53j9Qqzco~x5%sAWu z+s2c9dEg=4JxYYp({mVpB0ZJ1*ygwE`V241&u-OdONI|C+BesL)C#mUdLJnqr;%pG z((cU0xk8ix=Q8{~+r8k@@$V+nXo0L=AklsBWh2m2qSTE|??0GCeQ3sJG5Z_rNM`Z_ zYeaFiztf@g$#wCNx3IROZSm3&c4j6to%Xq04dn}b1Ig~iZ@pBI=zoFyyix($Un zZjQ#em&$Sa3U~8Dn$dOkP|S_6^yH3#I;EJ>Bz0W))`d$i46N}PWc<8a2J4sRAkRJ# z42iN{7!U>)PFSb{%N{3G_G}xkwTB(JPQKTay`05JIYU8^&F4I`o-L3W=W2;B{AV*5 zreBLrc!jY8^Atm#5hvr!xddPr0`~etr12&YREpv)3hV<{D4!f@$isq%X~RJA_RqI1 zu@b(<$*X7}yg-`Vt0Lta(HlN{-V83rc{a^Gk_~y3yr(%VMi>5ws=R;KAd)or$)T0P zm)B@m-?7H~X3sId;whblm1825sCK&q63Yn>;ph={_giJ{g`BW~+xN~H9dJpFFr-g0 z_t99QvJ9q=>qST=g`LBN5Z95=>`zr4Ni1OYJ(d|ZLm&8F#GkiFQs-E)b76FGlw9Q; z7lsTwT!|1+`X-Ac0*;Mu#tm(2#0?Y@(=#`QlSB)(>|_{T6|tXD*qw_~#@HA^ z6dRsdG>`RQza>A2E9Khu8C<--St~6)9g@CGQ{*+qtqHnynH$tttiNqzG-asBo;#+i+LfamK=aWR&X;`c|`eVR~`SeBmaRI zf;)_h&x!J6RE~Q5&@qg|nrff`7n4}g6q*BP#FeQoG7+#mhAaf=vV%E6?rhQz z0b~{;oLU-H+dDU!$mwP;a;0R|zMz z4rDZu^>HL@Uz8NP4u)2f78Lnpv0{vSe>ERnpp#OoQn}Jzevgb-jsR6z$l!Aj+?Ttt zZbA{)IpD(}`w(;GmEs(y+9u;oitPR`jNh>|aPsb|;xj4)n<`2}0Q*kW-1 z%Qc8T+r5?kxgl-~QwfG=WX}sZqX(RpGMpv?Oo8l$9NUxB7J#llJ#@~Snv?H-2A%Zj zOzXC2Xke3$`$mdpOJ^+>7?iz!_U5m91;*LJPq$J4evOmkcNHk#%tVlqQ@$+atta_8 zZ%w_OT?lX#5#SBg!$A`9RtO1;eD=>4F=y1@&LN(owZ*MWVW|t!bkPScrCynp@%G;f z`ICWj{wD!4-Ik<9xUn?wlK8onusQ%S8sHyPPv;8M>PQx-+#?etiTHSDcr?C?aaZ8EfR18LJUx2ws zpE&;n>i5^xR)Wq{m|#^!l}JZ@65wG~(J+0RP~bB!`WSZA!km`ZH#XAu^+aG1RRNL{ z$ASYWg&%SQ&#t3(?5)FkQ{nz@i@fPKRLNJA&CPFBY`bQD;mVb*SEDQ9XlOwiq4Hjp za+>{fj98A;o~;gXN)&B6)bg0P0qUwLP!JYTyDvBuMEphevzX!Y52n!~@SuoR5)|dn z_~PfQZ9pr0D>@s~DqUqUrf|eeGxLM!+Yxt(Zrrd8477bkLl;knChS%=S#QT z!)~op4*anAyiRNJW;AOkcE*e;g1M}7xU=xn_zWz5#`9?yEFGdY0+wReL3mV@mT-$p zW8w@WX?>H!)7+L6myTf!X_*xS{{+LlDw*m@s&B}`mdBp1CPBAZE7y3yI?Rg7Pna>n z0uS@fG9sG8l6mdV*y261es<2GdR}70LTa&Py`N~DAh&hc6X@(>k={M`w%x_O4A|3} zNf{)4{!HlnwU~`Rk1!2=v-k(}Iih>WDIvZF)`pq_$Y%JZr%H^UWOEI6v5fg%&R;i- zxzO2QRlaRY6>?PKX(=?w%pWTZ0Wn@g&!D2cUgn?xZDYinl9D7QY#2{V>4YIW$yXWs z${oOoQ6Jz0Jg!|-XqOKAPIdoVgz;X}gIR8mdzl#jGhVhYqon4g`LDCm22DQKtuKFT+E;vDo zhVUnF76a;>DtT?T?81k#FOD&4By&EZ(rpA-?Gp+lIb`}&(lwCBm{xm#-#@4+;2}l} zpG&&_(o|;SX1lR;gLCMSTy;kF`3?Fi>N}joM{Ve{H=7zi;32kmg$pAH7nQ`oe3o{} zHd1IPF`9^(Ae6k#@k*6?rbgY${G&PY^MogY%bLN#VlSwjnd3{ouZv_n#sSb`E3F3o z`dH^tGFIW!2B05m1?;fy`Oz$_xjpvsD5YnPJ4ZCdWp-1F~DO39K`=T|wyZ z8DYHkE8xE-5b3HV>E53PHq|~P6k2g~SyNLPAd`Dd!2*_6K2?*Ao)L*Ceo6Oyv*u3} zzH#TggOHWVPE8SNG?l2St%tIVX|9+8L8+BT`3x`GPieKClhA)ICE*8JOI(_wNmAgr zD>c|yaKy}2%PuQE8Ep8PpZ^&Ba*aUX4e3oP=qEFaSIa{O8?|6Z7WQlmE$L5Sordha zOry7Vd{~#^QZKm$XK%UZs&jOIKJ>NsV)L)bWVDI0D!HFfoBC? ziR=LEdW++hHl8si^g#+5I_aQ)#+xrP8 ze~>Y3DL0Mtr$Tz(LW@wMJZ-}DbKrkQ7B3vb2|{+xVLWm!_4Lg1k+fP7=z3hBVT>+C ztB$3^gv477v_ywo_YDs(^W$RE$^LBtuPm)>G7C?FXpiJ@C_?V1whS_!(xtDX&l%?R zu*>SV^rFAdD29(+Sw7Dl7L@u%0RDJ5>>1cdoLC>{uYzzjhU%xa8(b`NR_+pL+e}f0 zL^V{dS9WPH)r;x{n?fm0d}*ue)mY=^EU3{BAm!0!x3~SEHrf|EBirYD*I9o@8ycp zBD6N=X{R)gP+CW|sTGeTVzwz!y3f+*!U8Sg%wka%vm=EeSk3!aAOW5+w}z&ew&13wo@hl;Q)9A{Dy-*; z*1H-@xa)4|!^0-)r?k}jZDO1Qas3FIWqwIWMjb0gyqpGC8fSi}Igl28%;>Xzp zL;O_8K~;hdx}SN^ZxP0u3dAiFXz+nQsm7YmM~GOFUpNO0`o#3BMlrSE8Pvt!9pLkW z;x$&+32pkv7}VqM+_ks>fO~z&K4|u)3+pCiOgS4W(tiOf5d>hq&_WqweMTGa9gLKJ zy_B7MhE-%{_$m7jG#vMXf8vUy{&H7?%{9fgO=4Kuz&CYazt4?Vy8~&M%=4`IDVV7n zi2HV~iU@q^$%;;rdbI3Jj46G8MV`{Cm?kyt(U@TptVD6Jf3B zz|i?t)3ad+V$zkXkQq&qQDC3+dp`q^pLK10O=~a9B4a*Y)lria?`Qj13!k*$ZD##cg5SV%(7ErbEYen*4@Or>#E8Jte}eSq#~8Z(CXQ zGxT`F8jSTBRePlJqST&kx#Ua=v_8MOBLL;~J~l)wueneM?k?T1I=rTC2&DUP5gd(? zoIHX&D|kHaWyA1Da@v66o+N8wL|5W`^m!^1q5sP5ySVZGuoT|%OL{QoOMp^aUFt(7 zP)s6;QZM&R;bfE-3V%Bdi%Q$AP$7uZMkL@GUB2LzfJH1lz0KV1Wv0l+2D$6Zc{{XpOMGUGh^3P zJlI0jSp}me5#Ad41-$Nu4VdgIY-zG-=Nu*aiQv!2sEkgi**&Deeh*lGUq@F0y{W$S z#%fE_&rRkMGvenA-+Co9;Z^D+`Gj@&8Fsvn<}0X)g4QD$=*w>4rP_}Mg^x6~fzt%o@t0i{n| zAt5Fcd#~!x>2Fem7~QPKKe?GeHprw-Z8M%(&M+M7rIk9zY+_dib7%&r>YM^|hDH^; z>yVtBohPu9aT{&~+D!PODiZ~Iy&&vyTGZ=Ls*vI}Fxv4WC;R5E(DfL5_}Z|Jv-UG7 zsU)8^QfipyTa8k&rHe5%5^KSvU?gjXo%zl6xp1HlB;0QJtb4` zkdXoziH0!BTt*u4LC=8%B*JkjIVO&~_`{-dLK!C0^qNN=oO{t6Lqy;!pXr32e}d=F z4~xyrYEgs*+9Nejh6E9O#=N#@22lhGvZuT>`)q@LMSl*n75OEayl zP9waM)_rqVv0EbCq1&tqiM=j=KNH=~=$}!>`&sQs8A{g~IKNOLs*x%dFM}c4(z4$7 zY!57!X@I-v2208p8tp{q|1rr>T@RS~xMEeJXjvMAZ8rRRzv#KRrsPa0mQ|me2qeRV z#v~=*6^+;OWqq{$*v`Tb-TN7^&W{69)j@C;3xGL))2M3lGd0lV^=3)JYT6pad|iE* z!uY(XXoOX2rJ>KsMIjqHK~xyZ1<=KYu`Q*xr<0$-b>;8w$^0*)ll@9`nU2sP0=KqC zpie5kizMhHIpNbb96gMXVV`L4;e}>X6??!~VX`WepA2LRjN2*n$H7IY_JnljY+xQj zYurd+a=1a;pvl7PwvxXCjQ90Jduj{dVfc7WY5zk{a?Sb43{QFBF>gW^&145xtILhPUm3o8++ABxG>&J z`|FWAr=J9@IBh7yIv4#;Np=WUn)31$Q#a3WLbCCPP=lIjs)7&tUs9+IE*tG2d~{co zEipmY+;xY69yJ5Y&DK~C0j=4E=fOLvXNr`VDV_f>%J`vd^cQWV{|jxUzi2D{UuY}+ zMO*3rLR;xC+DiWy+Dd=XR{FotR{D#!(*K3F(qFWd{x7tZ{-Uk)f1$1P7j32gD{Y07 ze`vOzNaS^s(HYQdgi*ANw&5ur00=^RFCHWV|`Nlsxh z1o5oLd{?E)A#Hk@)~`{*j?0HtV7|l!cFv^;UGBpH;G_yEB4uThPj*Fa5R9IE_&WmD2h@5ak zdu$W}=?2WeH90gE$9DHhfO5G2{t@V#qb& z=)sVz*Hs1qg!R3_Or6zeZ*V3HB)E)-H8EuMsD)YpUl!CR?Rq8>d4b^=pL zA2Eu?3-PcNKo%FP2c}`nb4|-Kvk`e*W5io=ctzeJ2RkbfUE7!&prEr3T@|HciA;deAIp}fWb`X9`dX7(6S2ccKIus0_6VWrTb45znyF9Kv;Re1f!mf^kYj*HD!PPn5GFRsj_Vyb z!->XAUbeN`)T544%S`lY<|X?omOm*;lOSQjt@Y(%fY!jBF6{Hv++Gafrxg#EMi22# zDU#I`vxxXv&gJW&mtjX0ltCX^a>%bXZRM|(V7QhRLc<>RzZK7ARg1Uv1ws^cc5Kw5 zH|<@8g3GWbe#$e#s4vMdRGr=-Dr9NVpS4L>Ar{c_<#ZI(M_n1Hl>&^Z?d%skCuGW9kVy2C>D^;39ArRnF+{g{p3*D~h{eNq@C?H$3Mpg%uL_hx6ILuq*eV zuNspf#S19e!fhiukTe{dr~6H;h|2~WkMZqdy5niB4lqz!;&xg+pPjMjFy5p_v!o#{ zw1ujwdoWD&QW+eQQHDu=w25&%d#~b;hdn=m0jW@0juxiFsP>n1zLekh!$|712$dk& zEW4)S%H)x}`h~)Rft?r(!0{`b+d5jfumGSx;XY2UL+nd2d`=JL#xp^04XsuiAZaQu^;VShLD!;D`V*;-wRxpMRzx zc+OC~BQOiEIJz}5V*z2{c?CUW=7isi`1A6i={}+;RM#_m2VXnC6lO^s>x_UhdO-}L zCkH7SaYAUi%Kp_1IiJEsB*ux_^AXpU?3bMNw7m&ajKZUHVK1~cVulUKoH{R|aOKaS z;)j;RnO>yK=op+o7>1bq$Fw_!JR3o!Yq^>|+*7V>+aU~;BpbL=7kVzpIF3Dl>f*e| zb6m;w5ZFc9Rpa){{c3Jm^<-VXTFj)%J;0I~P_@s1qWmQC)`ZnDx;IRCDbLA{)z(BW z8<o| zwYqG-CU*S~$_iD&-oyT+oQQYFs4N3W4?1qfiY{{2B8w$lg z-uZAzig^4|ON~kp-H*`Mu7?M8Ugn8FRC-2{n&L$6FUU&&3$lW=MD^=MnOzwi$N~aZ ze~95`e0O_7X;L-+e28%Wvgtv2>R6;d^y$|~T0N7NlGi?ZH|Uhd!Qk)bYhpTRZRh=P z>#EIR$QJ>IxJbr(5q~}`J+`7jeA-uedx}OBvtmRRhxY-~SQe~oKFIA2HEJ-4M zzuRYDc?n4}0a_|##e1;M~$J1hxF?yxE_izls zIzQ~JLHMVbIzx*T*fV5uS@R}n&&o3sNbVD=o12{ac}mMUUT4b|aEG)H!?JM2K$CBF~1Mi9mKj677N4*En;nx0jr$}kVy?}?yMHaTs7@w zG}y8bP6*i1?#oQ6nI`@odHdn8_hMRGKjxUG4RH`Nr((jgZ>s-w-bq`ZVa0pk+jJEH z>tSU~jYpmgYKB83sg+^{N>lT>rkKAAu{FYwQfj=eIYX?*l&P;^8~B!sd!|ULU!Cgv z3WnRZM!kk~QhBx)wih*YirkKAw$I?=^~A*jM$cK#*)!6;DJTeyF`h7-)KA0vnV~H& z7@}|LY6JH+y98KFHVYfYM4kqK$zQT$Z;ksXklFCcXOx$#vB_hN_Z$wGr29j?{EYQb z&fn#V_xGJ#Zc!O8FGEVk_cZ01&;guKDgr17q7m5U70v@p1V;s&r&mHnR!yj^NoJrd-Gu3yyKSR|F{s(V`{_lG?d6NrzYr_8dIuRaTI}o|AxSfP#lNo~ zSWD6?gsu8q=aNWM3LkiLiV+tYL(PpYN*}7tFjyv98WUnRDdP!7ol3Zv8(m#VHmO~b z?Dm8ldHJfa+05O)>lLr(rCndUN|$#m%%706Np%F8U`71eih5U{7IOf9$z+XQD`na~ zTAaYDT5d}1t)Vg=S>Gam7N?&uQ9kAK{KZ*R;sx;*$mQ)deM??C3+Fr7cz@l_bZ88x z7U&e!fhVB(!UEC;PafA^+{L3pOwzS4x!THx8vwNLvWg>?s+UkwnhF)Be@Wr2X$BSA z#2^CvZ=D>SW~CI#ok+|VbOVJFo|1G*+GoV^B9Rawr=Sy1gqX5~WsyC7tFueW4A{X5 zK(TGoRn6>d6&lUPHC5rp@T>}>LTP5GAHez zg7v0642p1Fd3?ql?{&@OnyA_k1hF$-4W0p$B2l`lpN}T8tJ;JIJ#;$@&cVu|Jj7C3kEIX;cdEggthWLFXult-( zC5PonqZAQ&DwVX<#Be3A3vOWsg_b3qh1HXS|3>tr{x%LO;ZJo|O)E0JYQ)h~7hSSE zJnST>Cc+DNYL{j-$6o|8$L7#drE6Qs4Ix*C2T zX14gq!v~sFX$&w4s^w`NaY46-c7zwhjy#7}7e}NPG+$Apf1RnE=m{IDP3JyPN{?j9 z;}2$aP;CL8dHz>{`4hYX*K9-y3ME~S*3h{JYqYr9rI!jlYV1_^iLP{zd>+20t+EO5$2N`%m0W%82L6YoC$F>v@|2 zGWEFUmG34#*~00;W7US5($(Rhy0tV}e#LhsXTbCdUBQXS#UZqsLTXg8Jn++zif>SO zmP6gl9QoV~Vytu^1b*RFS_m3L#D3%a9-jfn>mdzC-$s5WvTN0Suu{YxP@I>$A(JTV z>5`$dds5i^7K0)w@-p6Df5NKw1gtL??^xDdf@69tu6t6P?in> zoe-PodN1e^=VG#p8=})V84BLt>ptG#nhkEKa{Y&Mbin#s8jl zHB1Q9#(n1dg`tV8TF^l!CdB#~^lpwHuF~SK3MhF&3VW zpP>0`;QhRqHKcwRq|rO7Z)Xz^$ss#)GAbKFbg~DB|23DO^5;Z>ouZ_Tqbg)T)cEu# zbRJmcj+dcEl?<)el#BmHBzQV3(W(?NR%xTm*w7$UD6^OS8C|>)4xPp0aXj6jrw_(S zrJLXAup=(JbA;u4V0I>C1!gm9n1rIJ>$>t;+8o)}>&n+T{Z=w+YO2pMVq8;9Fm4<5 zjSltLUB1bSc4F`(>67*L8Djhl_;V`OFcD}5XZ7RAWUg(5FB&!$WyO%nmYoVxl@W+F zf*@t^6S(?|%q~wCb_71cidhy@sVQnEXTb|q!QA{wlznt5KZfUk_sE9T$3y;+)_gDO z&xdZbI9w-c8eoArPL74!O30M@h-A0tPHnv1Puz#*_Yp}_|58Xoaan_MR8B?jtBl9{ zV_=3aV-&N)@hJ2B%Srb!djIg0V(O;r9ECqn#&6mA4+IOXcXhQ$>>}M_P&623C%sP2 zZ?>6h>tJNNYu&pNi|ms8FH?TQ%Tj33&GdJubV&Dnbg`}^!)K-_rcA>MhPF9c<~f{y zjIXXsVu9_b-y)3nwykEp7&ALm7UJB;c}qi%7y`BxsE$6D!|jlsj1>Eujh{XGf=M65 zg>DC&-;(@}q34CmdFy*t#p+RcrV^Iorb11mkFbn-=Y=Di_{r}j{QX@q>=w|BC+(qv zW(asCF>}tZ_jq=mlwD(wC{Yp}d*0Z#ZQC~9*tTukGjD9$wr$(Cv9rnkf&Fkh>6@;b zn?|Lp>eM;pY(-R|)ValmxXo75uiD^BsA&Yct*Y>U937{R=s)=t76#bdY&(RKbzHHh zfTfpjWuE9JHC7ICw~;^iek%k-L;xBCa@-MxV=MDx^7g^^bOy%|7Qk6rU&15L4YI}B zK%znWOi}Z*1udZzmSB(`3}MwSP&n#=XQw;Uqp|vaLdd*4Dok0tfgL1`zA6|F-C5HIDS}mrz1){*|*&y zsRy-nsi-&71!&qW)hFG(%>&XYV6bQ;Oral zs=@NQ=<}2^SO`WI%Dnoea$bm2pR4pCy@DUSUv%!M`M`Vkd4QeAxCo+GF*MHVnQ{4| zcg*2aX~|6Fwh$oeRy?|@3owaqC|SGr)aWzaWW<;3!=O+s$2driosUUTifr{u+B{lr z>jKqoDQvkPpFE_+p|45!`+X9KF-k#1oKwMz|DuKxKk%b+P|hS2jZA`&Ulh}TvZzL* zs*+IisqD3R+UJYK_xq@uQg7q^$MkKM#~HTqmhX}A;}d+}zlS03ACqMaJ7Cd8q5bsm zbwYZqfz6j2`++o(TFZ9#RkxI(xWEzZN5n$tOhkt*n4LSh@huDi5 zp1bH@70Tj+Sn^dX_gH|OZ8{4d0XlS}$#w(zHi>if)LIXfWlC8OP2|r;Sy((R5W5#w zQB{(Wz+6BrO?-rCU&+ZG)8g~Rt$dN0bY?j52gZuy^V_$E+X=`!xVf8gwxR_Q?_u=p zmcZL1vvp$#x89hk;IHX3LPu#K3X1GG)uK8XIcx{m0`4y3>gHY1`xdVzLYM`iWBboM zYY#(t1Fm^*i(m)HQOdxwD;3o6#loli>KE2h3GJYxXB5bxx;3dzs57X}q@Y!n&k3kqtib>-n-<>rta~tK;g%qp0O>~O&&>%6?0Otx}l!GfpQ|$^XMq;^h z5y+wdZpQudoS12dP>pvOf*VfXLGs8RShAD?G%hE_C9}AKT%-sqtpFW}&HUv}d*w9` zgSZ8_VY4}fvW-w}&Mir7BO>@an2WPyWP=$EqtNO?rVL6N@o-SiZ)< zcyw;tbZLylB`bNu&}FT%G(R+gq;wi;e>Fpw>y_?Wk|iy~AtRVchFClak@?Ed5CV7o zdQq@?PHeR`vuZKeE7UG!03C`UB8E?Jh_IG2SpMns!8)o`cuiX646QaDyG;{>sboaM zw}>sb;Acpiql`){m?-^Z`hxO)dPw6MW`tyrc+UjNUhFPf9e_pLM!2CBk|I;!s1Tt} zk~L#@Dtp=oOJ_y!HZ$;sZQAo?5+hmAv-Hcj7G{W+@Efb#SEljpgK6C@#i4nlxlGC4 zCw!kf%gaT64a#fGJ*5ArVOL6ij;2&jCuyA(v`idx(gJ`iM8z}!as0ET+H61Q7zJ~K z8Bqptj@&LUyQRRJhaw965eDh?rg`k6P}6DKIT|K`k$@lOCckA{x{K^z$JAH8j3GP< zUo+);{-p+i^Y}b7Wb!ZN<}5?*2vowz`b*;XNNfVc^z^@pI;U39&)t?SetG2nsma{S zm!vUImYhSFq_CVsX7jHAoW(zbrXiZ@+(_VB7{g~^H;vi7U;T#)RDuA9{*rcinZe08 zOVtSNO@doYR8NA%Zl<-;_7xwPP4h8(q@6Bmy^?G(d*0q+SU0hgVbF%~xHg%+5*b&r z!aD_EBlL^&$&oH{OMs$$+2g3**{%I_N;96r5pXX;uC;y{8R^zho4712chC360M@f^!t~vx^Fg5@j+@ zMQ-ppzJrzYlUsY}jr{6#OaOvk!t-X=C|XjRTc1Sw0Y*d_{UE#5y9e*>Uk4B~9iPq{ zS=jAqh``!uvEs+7CKR#vg{nyTlp%R$UUP{K=a>@Q6&(9y;VIy=cpCVk18QOvNb8$1 zz22@}maja7L5!YjCiV>;69u(%;fcl%e~pvTYytP+yh^8yqfDwnM1>;z3*&UF3h@fu z0A{)5G5^y<%n{VL5EfvyQv7##mn1s%>gPXp!`gELLIXpzXMT1|s39PKcj>82TV`3= zC!LwMhXV%DIyIY6fahQ~9*V1SiOzJ# zu)g}3pZS6JP-Ftwaq|07lW3N;n}MW=cyq-#9LUlqnB>qy?tbI!=HmmV7=(-wdkpm; zPBxlP^S4!JzL__0m!dym=yDQZA|1Sg)P&fCW*H);Gwus2{9No}6``=7Z-Q>z7jPE7Z8CmEaqWHo=oB8PrFp1m7y|S3RuVcTxTOQ| zqyOf4pTWqllM~|lDXBZy1gx_(4ot6U`!3(D0O!zn`uHn@&^H#FD_n79i zRPJXH3Z4XK3OXgSu--+ukE$l}h$h|))Myw6;Y@r%>`X5igF=CftacwWfS zDk@CNik)gA_ur5i@U#==_h4zS|4mg)W^xMo|SM`9fr^ zJ>=y#aN8XjpPe)+IhlV($8FISD10Siodc%5yIV>JlBSltLgx_zpqkB`LI38b)U!y3 z^?6f$F!jIcvpYdXa_$qj+6zONYnbEU*Oc>zeY}n^&68BoNi6XxE(Bbh2p-C*x16$ga_4RuI@DuycVy zlv@#>Teki4tY@5aaKn}1<}Hpn!sPVg)PNUTt6f?YiBjJbK<|_GzyWuW;z5Ju^-6o? zk?yQE&*PG?-wy$AFI!UvEK@Q7_m;P86aO7r=d&e{xI9jsQ#bf=YdotnXvsY8 z9=uiDR(jE0a{7v&f`yU62!>5wB*b!ox#mExm@Mt!VoNOuj8X~F-!GQ5Z||30CKt&x zHX4_EzdEsm@CYP1eEn+g0vY;kN+0igz1%cGMDK5XEO1c(n!Ax<@M!dpr637{xu@|- zb{2GCn@?BsgCpIHjWUSD5B9GMJ_8e|awV->P;(iitYQoCV9!9fn9J zUAhR}Vjv>cvkDssPsk27=)?C}AzXg}15UqeYLl6r_tg8OqU*nCm@GCN!=bUv$34zL zr+PwPpxCW|=ct7F*#2(1=XlhvQfkvz9Dr}2EtCv2;jh5 zGjwNBvd-x!0e2tK`BuFxi>wR!K^`LrCG~hmwm(fKuayO0uIbwr{A1R$8YG6;%*FUm zR5_2*ePD*0EHyLe`(J}tN|bnN>M&WtMB!|CI-`)6N2WpzC6&7YdXnk}30UrNiheRZ z`(BrCJ+sEDS89xoBxYyf8Frq+L%VlGp#g@?X9Xno?K9V9`rh{QnaD&|RvXzpfnj(+ zV*!%qsZ4pFP(mzjsS+u|g$ucfnpIiGi z0QXpCl-&R?QtK zw=8}6>!8Fk#=WV0IoD}uKsbuVAY<-@lZUs4t)8;;R7Tlh*l(Vl^?*zE3Znd!paM4= z;h~*7X3X+GlQ0k-H*}S%5K9dkR}a^|#+DgwJpf62xH3ESSlu$D23(wBTlb;iU93dy zUaqkxwUQ0PZXTGJ=F=Eqp3dAdv{JFKb6i=@zAD~|l4jEKJIfg?Im*Lq=R(qA8{az{ z#nBXa(W4IST+KRmIVhgdDKv67q6<-ySyz+Fc;k6~y^f&RIH_-x_Z8!fc1XI1-yLaw z4}x@Hv+2AsfU;eumD(_xOYqNvkKqk+R$Sh5+Dh;-rfSe-%AvoQSVYO2%tCz#6D0d8 zqRG{5HVeH3^3@YcBH0Z!U)1=ly_;zBHr|CRjJj?Curk{x9b=e_(Uj*wrS^{H8?+$f z=_0D_F1<7AC--M{g(Oo$MV8n1YzExo4{?`JVBaL+VezjF+rOXzqsUN)OsKzRiqZNf zY>^mRqvOY&IXa7l#PkqL$}`OX-ZO}*-Xmx=a#CFpV}2j-=m!?Eu}JE5jMqHwWh!BU z0#E2J0k6l=W*r^_Edh$US5?U_G9>RP9Ei8Yu7my8X?W9N3+vvJPGSfW5o^<)1ly<3 z%VOSihp`N{0ZHU_3JXy1z(mTfgxAvzkmw6_=6?ya_2z9_Ny9x`$RNGWfNSiMyOWiA zYPpP?u=xTL{<_l>MQS|ECNQISFw6&#Yo+Jcf=cUBF=L}6$W=Me zR89B_fz{aYdHc;J>sU`yB)tr>(s`SpgR@`by298L$BU@_Zz{M}!p&_Crb*d>CrrI= zRhC%ukEh4nd+SVtlh#_w!@s>LD)X%AQmbWe_ka5D>q2iZlz%DYc@32V*)}iDDrr8Ph?;X>J(8!`kKjg^3&_xfy{2_e*rUnyV>d=S zYK_Ek7f`3N*$Zv84d9H#7PWq_C|}x-d=xQLm^tHYCc>6||F*cy7*YQWpaES6Nt#C8 z=It$VTlOh_eIw3xn^4<>H75fw4^t&~MF&5sZm`4U>5o;P@|vl%oO=sE!E+%`oMdVG zp-J{QindCz4T}ko_9wKj+>Gu!)6=kb%@vBPnmZ^U%hASpvt1N?=l~j4lHV-A-4{XL z__`5G1bens3F$v`1Pj~P4e~I7c$+9W4E@`fQI~vXDre})g|a3aDez_61EHni{_@nv7AHHANlT*7K`bPR5=3LI=%sZqH$lsAH0G zdf>)(>sALJX%Mu|2a0YsGF%Yj3&wXZx;Y<$?i4U@9paI&tp=U3ikp_gVcrF&tO(L1 z75e)Qb~5OyCB$NXpk3`KY}lfZ8=sb59MVee*F~hJ-6#t5!iO;n3)d+sBkbh0Sue;b z5^GU(_e()D{1V?@MgW7_9AXt~FN9Danns2EjL_(1AjvgRYON+cx8K-#>7YZK)= z?3{ucnC)XNgQU5QCg9s(tp7d^H9OEGH5CtevwI*HH0SOUf^=2VE!lX2ai>Mf`v4uR zE*ffC#euFOZ%~w$NoIA!VD8R%o7r*#pINycATN$_-nx^R{zR+1y>>yti19ep#5a#P zJkVjmRH!sf&8H9ZbUFh3lsP*C^7GnXrp{zLu?C_~V6EfqyXO^r9?cu`8HT^9DPK)! zBy+z(Hw(v|d{FEwFS?K^j;D4IFJy=BDBAvjhT}Svr8jaDP;VicK)L6Yl8HwnSN6u0 z?Z!jdji(WanG4vDkqp_*_{E~eRQA+?HyEwv*qTId`s^8wg6rjTev#nYlHOuLxz>KM zPB6Jxt_ozEN9oJwDpJusa=OC;=n-z(;$gob&-2iMbw4cMJ2jzGT17oZUI7@iD);1b zuzVoIyeQd_p;IW|r^o{cU;XH_PFk=O$v$#+1c`@aEI|R6NY6#%tx4%g2{;!(H*02id7e`@bRj;ijGM&uHx3i1jI;93UQZ&z`k|A@c0m6+x2~h)Bp-fd z7%>>dC67J%tcZ(?s#|L&!#1Lgj9+5C@*PAoM7y`cZv&3R?(7Ln4-S<_C@-I3B->uZ z-bgR6A3au0@@Fe=F5n+3FY3C)SoJtuMlTe&w1U>)<}ByMN0RBY}jo)`-Z4f;@trpc3Wba8Ml0VyUG{iBVO- z0SrmA07II71Z80$Plto!494?g8p~9tSa2g%Oqqz!_{kO)(pB+oQnd+$I=mDEZ`M6c zD14o;a<5LDp|N)4(OvAj5p^WMhc;2yWq-;cNo1K`EP|qHtbSkCzZiaa^iZU(5W@ z%6MFp<5Tns98A|Jpxr*J9Q|RYj@S`X$9CkdiA-ad*c6FH2K=Uo(p_c?YsM0j2QXX+1V*pB&D;^igEg@ORn5c;0nf!{pgpVh~;Aa3w@n#sjbO0ikRYB zh){eba`j477=9x6{YJ%UzV9*a=`t&tE|76@%3%2I=>!VFF^S&O zL1n7+bMxT@zX{) zl&0a=B5WrxD6o>x}?A?4}nEq-fXgxFQ3Y8K?0N`v@#%yYEN&z5U2R`qU z$C;d$>*;_OmLQXiKBTsDp$OrLbTJ2X(ek}o<9!rwz_f9B?YEKaKjb!CT;LsiBM{Gv z+%bBiG5WC5#edr9)X2IA@5cyktPfq-hcyMvg(w=z!BtM~(_Ry3bywJ&I({>H5CCF_ zx{RsjG0F+52qG^Y1gDy<~5A@?Qc3+`GxvjZA_;k ziLU2!O+UVlBtIge>&yRR?zH&B?_ae8aZNPNo8z#=J_#mL&(DYu#b%vj<@Cz}J_`wF zo%nVN&8K|E`hK@gukd=E+Qm-GXfTD=f?lfRc% zA|w=NY9`9F5$cwiWso_hmK@oz!FjMcBo5`v-I$O#2AQ(oW0>utVG+VVF zXR1uy$3&(l4}|oiG{a|eU!6^mTC1cX4C0#O71s!)bqFtxnWFFumj);eR^Y#kpm9l0uLm}ecJ$Bs}pUnSq zaxPDi%KO>p{>)k1vY53uI^x_ik2bLU17y(bnCY+g+X`uN@t@co95X2AX|jhu0WSg7 zQ(Gm@io_5I3$cX=FW_iRb941!%o05*c3?U%xx+B|yk$j=0P7*?Gkj8?khfKP0ePox zq4k4(-`Xk|iuUB|QCdw14r{KkvP!dLIhbp9k;rOul6A=AD2e7MaL`rmh}TinB!iDM zyc--lPb~bgI82fAf$q1zNzX7ujb1gtNVpQ4H_5ngK`?nYW^!SV3`>uqkIJCoMlQoaE z<^mc`_D>q!gKZS_bYi}$TWz*#2A>X&Y4P>$n2lhQK`TB|gmoe9P%Z}4S2D`#%}e{2 zS&j~@d<6fTb=0vE^1TW4z|`pGy=Y>THG6}!k#b9Z*k&__>^XYX#UhlQxub20&^@X& zLXc^h%ucNwQ+LIY@0SQur;Chl5WBu)N}#KAN0|1@*V*o{0J>~CAcKyS6u~1{e=vZ2?W}?k9OeM=o$p#~<1U9h0HQkh) z%*;*h#ERlLr+DSY#7oX@dvy4sz-V?k)S{FRu4(!aMd?HOgh6ti;AW^;M0I2Jg+a)p zmnaa$s{3a~XBsI6d!X`!Yz*JueOR44xjXe+id8X8_FFpxI5Z(zK^U$_t1w-A$pF zU5hFFvrB@Mx3sBNf^S0YGmL_{q-xRUUyb|4o9Ca1n3I$;L~eqyp*0ycE{8y`=p4SiX65mwh2_REx@j8+_&tkFALtEV+PvSrnx3koT@Po%NE|2c zwMMnq)yF<`!2FA?W-MGx*vx;P^T#+>Viqk*>UxzvM3|~y?Ys*KQ^s=99O|AiKh6lk ze;a7>xC=Y2L^zo;Eu2ZAp;v*4jX0cIp5xxBNK(#uB9Je$NriWi^tDslA#Rkwks{j_ zD;R(IxqG>kUoQzi{&J|&t0D-h_HygrHp-t=UAb(R%bRU{rgt|pxmf$oGQ`ymx>ZRl zima-aM54^i>2;=rrV|Mtg(Tn=$EXv1_Ko5ClTswK>QlJ2PUGiF06!78jaDMfV-hwCBZtFkwmb#`}wix_TNtZ3;dc~`RS{#J%|W)sAeWDZ3gtC{>Qu+7Ti z90&#*NR!4uJIRhnJ4r5xlE#kT@qeFI*hvavDWe*(bDSue) z>Rgp`0wd2g3n)<4?z6nqTHrB=AtolWdOMX?oul8+D-(_2-pEJFMsipwoF-R5Gm}0i zxR5NnRHqp@SCTrO*O4za3!STJYJY6&k=E(x;QPRZ97`(Lbs%wzHet`#L((X+Uqv1T zU%$eBjspW{x^;&8zr;%M6C*jQF@^Y4N?Gd3XDsy&92$m#wK(P>Q~%O@Nh%Qu*Wl+s z+V!#`3mP?|RSc%kEJ9Q>aBa3rwX1NbD7|S2-=C373Rj_Cw8OW7fTSX~^r1-xcZ zVSP*xA_SCa1~u$h@~-ryKPVs>6h_>QBn*E5RceT2xnz8HS>^6(|L$uO6yc7RM-785pYE zAl%a=kiOd7aVh>+|5RiiYKs;X=K(nuiXuk{IWYfh*ZgeMKTDy7J<^~~S~clMyP{GR zeU}^N!=u>OQtKH@Q(%75RRxAmak6D%xP=2lmYDMptW(c%Y>{X@p~9#gh_kpb?W9EA zV0oA17b;@{K(z|Bg`kTW9eX(er-*!?BM>5X%}d`B)G3(fnvl=qJR0Xy$95`W_wA-k z^&S@0LN?ydh;b*-4YB;aDgFC9gpX0Vy*~bXXE(`6VzZPu3BP0{G0+*DeztaMoiVuL zs}B(2mqEP4SHiM{Kr*8>+f_G30~JCTi`0LnU&O&DOV$QTS?uoINS9UU=uvTsw7){Bl4Q5J+MVrq)yb}C=*$3$fC*`V7mhKez`ZYox)Dj<*HJUf8jTh* zh+Z@~X4LJX3kA>z29#)(7vinffC{9rJCG(M7xf9E#E1ZXS)^XVPgLua3-DUU#HIl+w)f9!~c1PjwWE%RNd7a5G;I?RrNkSfe z#lLG$OM`6Doaz`VZ^S~>$H$!%mbB>|D#~!Vyl#@FuxGW#_;3e)OMZ&HjXV6{_We?G z%*|7!%(#IO5=OafmWwey1A{(k!Ox&a1tcStlEd))%ffU|Q!O~5ez^Ftb67q*1r@IK zGKTg*gWRT9uJkaj8&JOdoR>pONrQ~(&=rD0U(e}q7hBxkYbZlVjUH?>2Cc4y$>h-< zBxln)T}%t(2pk za!6c5aP*H5V$9uGh*#hRBOTY~5EVCXU{>Hoev|oSMSO)Sgd+iF=#g_cw)EY&`e-nq zp&U{|YLO|gN4*UXOf~EqG*q2PLdal`9WzxEQTqw2&gfDCi6bOJU2 zaGEI^dbt?s3c5wZK9Nx&qP6baVZ~t3a`&dMG|tX!oJhh>?OPj-uW0MRCZRhQqy-)3uxE6(u4(|g^p z&&5)w$N*2*qD;duXQ?Jo$S0T$u9eDCynjv{yVBw>pS06Zi%@+vCZ+r95dFgDu_qw9 zX)`gg+!D%g9+yzcYj$~*^KxN|Oh7B*9`!Jz@b5O`eAqyxVq?)jxgTXuXajx4^MUe7 znE=S&m@C;~OmKTLLj+9d`YRJet>+0{oO55jpatp_kIB%NMveZ2#i!iIC?^x1I@|K9 zST=XCD~j~-Q{LINcx?u*l`&$H-e)xVb-dR)ipAWB}Kc-ql_PbAyGCT!yre!%YfQBTae3C`gPANF1wg7kOWg> z45}LoQ0*4$y~PO}x+z10vf#C`yMQ>E3?pgj+!*rLJXFrb9EIb~p~sS<`e3RY{)NQd zZg#YKkUs#Hf zrVMazPzWx^l2k1d2ZS&%aI<1`RN{f9`h&=y-d$*QP^Xhhy-Rx9l!X-){%Xg(?10vd z)9LmwzBxHgC08viHowtw%2|SQZJZ*5dzse>AH9sSp1fOHh{VBf&}*`Mo+YfAV5~oS1<^L23@LIP4~6H|vz02wDUIs^;#mXf-29|nJl-Lj6*^G(Ur*EVX-y`dzri7aa zBw?dDDPPrLb+h%pIX(xFM*iJqdB4XtX^rB~boQ1NI+(JDgLY7-mj6e&O1-VXxcQON ztBJB5KND7|in6};tb-tR8MvxtQD1Xmh;}NufCdc6G1yzKPQVO2E?LVLA;B0WhUB%z zqwPNm=^*l7*_o1Zv?S_;(Nfh(Ww1`X@Cfm6Rd9cenm$6%-Zm~XtR|+c5adt_XoC)} z`f$8=-`v#Mjo-*hUpyL zTSS@2n75XjT)EzLAu^mknhE2bxl&!1CZbu|DgyXT+QCsMcfWnx0E-Th&r5D#8NATD znm38PG-*l~B@9CXs}Nt>{)v$H`4b|#gWTOqDh!3`_2^L#NzAq4dS~@C9BzG5F9tgw;*|)5l~QYN zJAe7CEE1YYm~4R1=6!U8#z2eqaMt0*j6duC2EJ(t8&Pzmpw?@4JZ-6SsYZsgmX6v) z+8TWb4YJURcC|5ROS`VfI7AwWPNhY&pDtzp66IZ6^cnnMc_pEE~6r>A?i$ zxI>L*#xc*+`Av=>LdB5rBSKF}Yp}~b)3-ZQUP&;Nh2d(e|G^KbBA%CvFB}LuF>x*k z1Dy{UdQsQHF288@pB+3`+4ja3L#oRiLIV{ zUA{3dvrp^P{8 zjACMuI;~3yOAuowYErB~d%?w@M*uFf1ATX34)=P*==haUz>ut9fB<1nhkZP4k#3VFsv6ykAXF9sbvFfkv!7@5TS_~ ze6bkl&s_nlMIal1nL!jE^-$kkQh5@6rQi>$bGF{WZng&*4V; z&X2BP?%Y}eU?K{5QOad1D75WF*aeXksQrAxG|(vfhZ-AE2K?$A`$!TwK<{$aTs|8y z*=T(7Z{*KhhKp>SuD*$_wKA8(bMaiKtY>S8yLYXtIFup>xE-#rueuF3e3DF+yHpYR zqA-n<1gUL}b|FD)ZV=jK%#BJzIyFTEPAnN~o#+p*pJ-`5TMG}7aZUlZ?dElDJ*{YE zI7-h+9H|MDZi^mW19>#;EpusW(Yq2x0TdYC{8Q7GV@L5Od5Ug%id-N_a{ zcp$|T#Suf$sb=wE;N1iSE1<^OkP#@)v7?)6r-k%7?PvuG08klkC^%!~C9;5mq6Ir_4@a*c8N?=RF0D)E2JdvtPlD%sCEQNTl5>4m z$$US}Q0S!8lM~iHbXa(c8Fqy{I?>K3^9Pv5va9K-h}lB%Jrh^Sb@%cJ^YM+-W}^UI z)bauNrRXix6A0Ele7U0z)OmaKt*|t6^C;hvf9h1FX6IK`G}nt(94Yh3SAqyqB}dbB=1AI# zN)?t7Basqv2pH7OfF8QV#(I{_Do&Wjt@S6FjI(b~6UtQ&0z@Tkr-Ezr4+(ub>h zgB`V4g_k8ei?!R=#s z(FXf_6Nzzc0}Y*w=~)&yYQS=c1J11FSM@j_0xZBMh7l8I-p(%#CbP9v$mEaox8-n_ zJU)Hmyl7p$DM*JG1x+W)ij64{M{5s&u{?C}_WpS*UBp*phQkHeCOiu500&nzy;B3B z2(?19AMroznt5r^fupXrL<(xBKj->2ws$Gch@dh@L?y#6EBx+!p=h z?9~hYK{3o7Vu9#GsLrDHNfhN1$bznNWYX;FQDiXc9;F-95ICaPFsI#RhVw&B`0-a3 zptevgHND!{HmNCp9A*5dRUz8$jPw{t{2~`q1%FUiVnrbPH=m>1Cy!w|fJyC>pmGSK z3JSw?HScPnnJupb@#I98T-~sHR6CYG3-?)oDWmN5vU&*n*=O(VZ7S!gr%oluWF0~X zQMCu12jwHT0jTe2$-oOajTy5Pa;+4MF)!xzk;YK@p?v)q#4x?-S6G6B#bw?}@jV;=t{q}#>1ies|ey<9&L2X0kFEnU#!5o9{Nt{5%- zfGt47^Z9d$L?XiD1_CM(*9np{CL2NXr0?X#0SwG4`xb;+8k2Q%vzzMbTLW@++L@-aZ?n8 zQC>zqIGfchG@3dCOQm!peAg6V7j0;jRySJ~oI5BF)rdG*>~?lAMB0ha^_g9gbt%<4 zDX-w2YafGnVP&E9;57l(+E6NcK>ZAOC`yo}*E0K{!U(JKf}u)rKX{)|`pM#{)Z zON_LQl;jy!Vo!+e6i`oOn@2>T2s_G*HIgab&3qaZcuAfDSIX{~&{#y-0fwR+T&s_@ zTso9MG!hr^Rv@@CaSu*PJW=SI@o7E>f{zt2y5feeXA*5?XUpqjYpQ?_x2Lu9wdJbe z!`J=&G_Yhvm)qxkuHmMp$IHvn`RlUa<%;|H={54L>PlK|hx>ctsDy20hVCX7iKiZK zr`vg2_f24-b*W_=73bV1_d+l)Z zv1g6_-QxMO?fsIoK8w!#_7`*YN#tJU4v=Jjka=^qK_^K!c9>-&52%bXYM##`p5-+4EXr zzqr&O)o7DlXxtg&{&V^Ayv7!5`zPn?xgXBkiK+VIEOO#+$!q9=@BOa*ZbMCV_GX8x z7RmSf{<-h-lRgY2Xj)G&s#Dyz?b{i=gjj4oX;Ykj?edn=Z>zfxAWc8)06H^ zkMmtmsK^Z$SC_K?ur4~EkB|LNM};XH zTBes8(fiZun=W1RMFXA>3fs%BnD+h^QYUxz?okb$&M@R<=m4Y+uH5Yl^ygB;z`M`S z@}ke%^XtORYsbgfllISnfLzXxJNJHSPVB;`eRs|8+xYJ$JBG-XR#%7j>*{DKRrh9x z+xK%|1KYhGMcOu6?lW~p_Wmb(pRAgxtL#F$#y9H>WhH%Q(fN3#XZkbZg4*_+bK*kR z)P2Z#+Sbmicm*%#?2_~17ifF-G;(t0O#8pdl9jdX-B;-vKHi@_&L0=skD9L?wAdWJ z->2-e)AMtH{m%ZgvfcK$o`9|LTJtz7>O!>>3&`{hIEjuwQ4fkZN^|R%Bj=;gM%b`- z%|nhpulm>9>4w8pO-1!MBJ8PF?#J#p^u?AwY!iiRp_#ZD+UB_J>lxg~ZSP(L#?}jA z;3yJ(`;{Oo8a5#J%nz5ySk zkm2$E09$PyG6=;oIG{OhJTW5^o`JIQf+qqDcj7sRFCdh`y+nz9n~ETJUKUI<7Lzz1 z30PiwXlNUnsnObOU0Ets9GfIUn=wC1A&)t;YCMAh{?j-@1_Sf0A=!era}IX%ki^K5 zt(Lw0kNE_e|#B6SVJ&vM|`ZB$ZuhQi4`BzZB>?yy%6MM zOCh-{^h<0L%T+J4q#3t!Y8n&fZlkut6bi&}?Rdret2*=z5hCcA?)vBBd75XTpV-~6 zq=NT69NBJ#Zpf@bHaU%Psi*NJm8YE&3Q-$z)NNbbte&PUf&`w+(e?-2$q--Xw`az} z?Z;XclL1rhrwBs)yeY#;=qWs-e?-S`I`Wd*g3&z5yc}dVU7amHF_qGoJhL&CyQ%&E zT;2Hy%0kX`f=A9h+RsepiHs>rvD8d$1u_ef!44)=g`RwCimkYNyZtJdBpBuK$EJg^ zo;#C0kwuNU2(cpo^n4%ctmIU?Y^5!a)V-48SDI6b7wA~KhB*?5gQ?&uou4?KM3|Oh zIvqO`n@l6E{tM7q!(K4IOUxk|;?aj!2av`QmR$6Y$j? z?`r156cxOP5!+1tD1cvwYa!xRuwWy-_Ld8oGDKPNhV`DrG=xr=vXaZeVyt#|yxD1< z_FI6WVJ_cD=iK)vn-GP5h~FZlcC&UzXBe+#a9UWqe5!Bm(Ts7Id_62|b=?=8+38+j zZ|4P{CWp{Ii7;~*JxE5F9sMqYR}fENK8Ei@wTyyCj*KOp-YQJX15a<}=h^h)|A22r zzMO(zNXV6rV8la6@z}M3{Rkc4izwQu_&gvfcrDMyjdigKJ8Roc+7)KxW*VQ(G`M1! zOU%>*LyT-x198~iRYo~==&ON|XknKm{uOD{<^$5uJ#?j(aCi)zfarHU>&`Bg!$*3n z6fK`e0Yoe>ag%f5R;D%$TJ{rbg+%S199)v+k(d9#!Hb1k5h2v6Lob}q? zmW+Uu>mY)}`YHTuxo+S(MjjAIYbz=2B1F0E?6YLpl2iLU#<&(;PT)B@16Ii#=He`)H7N28dE?oL)g`34bxo2E3qOl=wGb7w^ zZo)FjaA4=>f2qXq_w+QfgwVJ_ej!*hu4KlY;k%RWgK0N7Is#YxB=T!UX)dqiyc`lL zXNqB8aAVwvP=#$gK5G|xM{`AIrC9M3aU2CUb48#x<_sereJf=G!}B>K82VQ}kN=l= zngWdob`WZwk;H0v9`OAR>(H9K#Tl2jQBd^>jML4eJyexGq=Z|=9^vdS0$Ksas;w$e z_x!-kXg|Pv)J5gg0GypTtiT|y*L8v&>0YhD$Uii5mpwG$-SR#*w}UiyBvoOXx3*)t zI9GkFuqtD59>nNW zYtDm))>ve-E?vVzWRnO-RbnF5T)yX*PngJb8i;E?LVx|s;+o0Pn}ygpu0Yf-nl$-h zGOYOs80)IjuEJ4#PhZZz-PUI7@i6Wh2zH(Rcsh=}24`k5g?KH${KIH=Ub!ZeE^#0o zzH_)38HahHux4N5mUpRYjw|Gjz;ua~aj1^~U{~|4!$%X7tI(|JK^7PFrJRCPW7&^c zykYr9021s?J6FWtl`a7d1p1pYhkUctfaO{C=c&#k+~Z~PKXiRVkSM^CZQHhO+qT`e zZQHhO+qP}nw%xaF%>D0eW)^>w5tUJ=RvD3qJazKRJ-Glnx;(|1EfR~})f<3vp9SB}Rv zEn=c-P}AyZ*CqKtG*wg~TG5KqdUmv9QcwaT0`i_HLX+CrMU3JKeTw(Xu5b?Z4?c!g z7OzYlqa{e|*)}|Q@9>59oCWuuz&=W$KT6r>*>&dGdjfhd0(&oDpJdUWWbN|pI`i#3 zfqj-heU`A#v*^yVb_M-w}ZsKqmLYjAGbE$pRApT}EA7iltF!xAo=gu%m$VgR>#evC|PZe>3JEnN-0DJSp& z?1iu%X~U)fPRSA!xAXFKkofHB7gGiY>max(++3hjSxdCn&JhTYYr@7UL?I#(H@71c z+wdHO&(WZHQnequ;3cqch}9i_M);N^_sz-n$c6ra@n{g->+`<_vep#@I#k|911s6( zPR!YYn(* zN$OlM7~jYI6fF#$74;kK8eS*q@S`iLmqe9}9>bVK&P{(@7<-kx;Uoh7@=pt5OYY*e!2&a@OWnVC%hY`5NI|3% zzoe5@#6Pm@;;~q%y}|m(-`AH`S9>fx2V~5l?p!`C9X(j0i$_$4H*whEnxmmJIdeYx zma0!Av>)*^x*gimYN}%*wIit6XJh|Ox9RF11xbF8+8IX@=}(M=Qsa_@Mb;TN6`$0w zK;{S`a^0`>eYw%1S~7R}vd??+voEOplpgmD%_p7Ks$jz93d+0*`z;fUXGTkF!YiCq zq1n?USX=061l7CRFpyh{UYjH@<(Goq}%Dei0F55)7i zCVUFxTk!|B3IxpKfT2OlBsLIdMAQj$^TX6i70BNVm_Y39X7Fd}Doc;r9>-3q5LE}E zatAI$mLn4-QNwb=^`@^Z5iTovg}&~@M&wun=Z|2Akm*lnQJ?}8+g{=4jaWH8!*ShM zX|X0xKf90Yz1$dUB&LZ)dl>A@)e{%1&$|wZQD<{{0vc|ep4~0;g~wis@9d}ENr+!V z-dM#hBwk_w!<`wY1OCzW_rdme;K8rR+J_K_N9^b<`sl1Z{cUf9?JuySQ|O~pb_{ks z4EDZ(|6GI}ok1U+v1739Ww7<#+ZCP6ts<^#p%pio$=}EB;QGSAX$jC9nGfk2W-bsJjP3luyC`_ zWV|CuPgOEoqMUfl4g~)yzGt9O+p62jvfMbZjihx$VFgQ%TKLBlb%^{d^0-lId1tKg zzpbj`)2<%Oqz_=0uCp;g$|KnRfH>so^bV~o3?8dEbv;|sNq$2JuSV5-@dN`;dZ7$$ zjh*>*;f>*9uFc@-)2l;|;y;$_D5*g*3WDoGw^kXd*U3A%6qIDZ>x~&BdV%m8hk4Mw zY4M|1#&?a@nQRf|5T+ORNNY;nH5YJEOWpxY>Q$j?SDR|og&E9A%T?FDc zuPWDr-KJjBg)c7lGCqC11`WwNe<1kvG)0#u3yG|c`P$sutm+eKPL2t7sW)HaSru|_ zzHoTmpp`?GG!H$Q+c3RG{=E5%o3fP7*bxydpBQ>p=jsXx>P21E7crPIyKKC43of_J z%#M#iUBZKrxSF8^`59)=Radd7xSg$EKeyy%RW-QIh%Cn21%lj8@EY~FRN=rKY5zqx zo;ql5!)MN`-JorOSlaG`#lf0_BP-*tpZJrFWg#8nKyl7Z4FB4->&7db6DFO>K$5Fr zz^{mHnR48Idr#noO9zMM#Xo(j1!RIY8GW#WV9#?@A$;t@$^2i%(0eW5{ywh4Pgr^=p zFg_fhVHF|g{1OILeWo~{8VCdjrAO0yv;8^-=*`{D@)$`|UfAgh6n5@8ZA+hh)BChI z5_a!^K9TM2L#W28A&SVoniQ(hkXXNq7cwYoi?GWalvvqvG$2Hu z-z;Q9?+|5cXWp0$FlILegem15Ox|I;+0Q+h2}yMJm?sGHls@_w*qb z)W~k;{>pS{`?RcW10B2aitxLgJ7O<$bKDu&4lF`x-8+zjJl+Iz>x*txyHeDLU6MmO zt}h0!dx_m69aoWuu`JgeKWU(@M%&WU0FJNj2)ak*2IOEmS=*fjXPQm@rtsgT&T={T9_MDb=$f^)?>=N(V?>ygI4S#h!GE(Ol zu*368R||_cw{a;+cnThpsn~miro{B~5;hf59L83MMkOg_-RXJGAdrF!8*|~sZgY#W z^1-396OXq30$OwLC~PLyoFDC*%s4fQ3AW14;14eF>!TE8VY_glwR?s!XbXm-gKp%Vwj}-si)mm6J8tZxfF=D z9S4X6%EB~!)I|VdyC|&i z$zbCG2y-d{nx!I7Lw52|VAa-&@|Fo8OOS{ph|o15I(#o1M}BD#WK1~RMQvA=b;4o+ z7$K#$IIMK7{TK^x(+O|u5$wJZ>b`+Jv_U_#u|u%yLa_4+a^DJZ-@+c=q8r}YCD?T( z+8MEoeCz^DUuLh0E1|sU zbQ{=VazV+6A9kwL$vp?dnO$~QKFDVc$A}F{qz7%bBK5D5qgT6n( zu()!q!|0uViL+PLuXZO0Be18A0lM-~IyfY#;M}sSvfZju!@owFGi-(AA5*s~A3c znD`z$ivOlY66L{Y$2I*n=rZci1fq;umdjNhqrR1#uH=(&5jsvwdd4N*cjGU(-rpp5 zFvwnoW*C!bR*YJgJXjyV{M8}fKlX8M903V8%k$XC5S@Jx#Cf0rRLt(xbSsnPuTa0s zZ&mA`)JkyDs=NKP2*M~m0rV!pySRpWcb1N*t@u9XeReG3CYgOMoYPE{xDx$D{!{_%Zi*&~$I3<9EM|NT ze%U*vi0L-AN7X0*Ub$&}GVDTsK8hwargW!BWu`0F=;K;hkxMOZZ91RRM9&;gAY{4vgTXaO^`30^ceoZYTw^A`e@^qU?KdyS zgp}Qyd_$h`I6<@HU6%39MX^fQ#8fq9TQwQ zXUbI7&`f`LJjq{%@paVj58W!9=iS8T5-#c+wYwsUY^w2cyOvK_E@p^A;pl=Zil(tG zuvLW9Wi<%E6^Fl3$pzTvHisUFQiZ_a#^#xx1`|2iOY%QJoBwuHil;3 zhlgPPnS?~woCxscHNYHWP;$GULV=V1?y-qGV?RkLMQ+N#A#*sUh#7)j(bX%tG$b8- zBa?-Mc;}VAJ^jc@?yc^V|0&svo6JBpFC#%U^ za?%EZj<&KHTmr`GHM|!g1H_T3N^l|N3fP(on-)Wji=v;%)KH%X%|nd3pMO+;8=H(W ze3O7ycs4GeWe${l2g&jFhMs8HQdx{3S9r;zRORDd1c?3m_{E|D3Ky11vheAGfZPm^ zEF`?Il9PXsd50HZ2aFxmrZ-nB|ublCV%U{~>AL!T4w^ZTy8JUTQBIZnO0Xt2tIbIK477=Ge2`s68 zZwX=+;gwwNzk<+(UUEsBl!#^lIA#*{Xqxx5emh4^!puWmo9PHJB8ow3#2Z?-#-%ND zfZBZzQH=7DL!5fAcIPo-eeGAxs(i*Pv@BBUrc{0A4BRMH11AylI#x)aq_QoH^Cy4k zox>FgTdnrwlo78JE0M+g&Q9I)@?fd6XDKj|j?}cC&#pw7o4igi23Sf!w1QRW%l5Dc zCn#v)Z_~7U3pF65oHiZWw&ACTiKXD_QABhz2msXtngCtQh!fJt9ZVZ{L#ud+%?0XS z2!_STFZAotKYo4SLNmyJ>zo+)Mk&8`@_gT~_m{k&jrxp)osnJp6ru`o1mW|GC2dxk=mO!N2N+ec}5; zSC9q+{&fB*n&{nFeQlrraq0RUKG006-L=XEkSFg9^?q8B!m(Nl0VF}5&rwy?9M zGqZNG-qE~r+>}83`CG=3q#_HcrA<;lBy)(ro@(RD&<;SJCDlQJiB&{HAciF7I4a*1 zS0Bef-&)q?Vj)QjI%n#4t%M=HbLM@vSw^qa11J1o++hp`+f&Pa`Ed`}O3Pz+^rKnF zueodZsgSi<yxS>a0##MtXttXDLq6R*^I~Ap0gY;kChE8D zxqiMVcB+-4soaKZKaofoMu6tfu@Dg(9SyaqaOPRirM=mxwO-ZCi?(Fh>#|Cb&d{0> zb8F<-mslaLMKQLmOLv3Y;$T^4hQ>Pcoibt{-E$iBEuxP#=40bk&a4(ZYLqn0dF_aP z>Iex>;*6J}sFr2Xg;N=PWx%F>ip17BRBU=v<3L*rivdeFmd7Ow+)3Py3&-b59}Vrk zgn96djmqaTwieXINH9{rgzpzRK-%wc zN3_ik)NFhcU%$|eaRYDTXsKs;KOCs6D%!sHRqLU2OE`+i#>-r$N?519CPDJ%yO{IDyUVd z0{1I7t}BSI<;;5?AO8N2s8iTc`lqs+arr!^tN6b?-k|~5resg_3@{jQjZZM}!d!W9 za|YvAH)7(^VCbSH;dVq5IGdPrjc`AqH5Xfd^r8sfysqJ_w`QZS_f`M*MYf(Gu^L4Q zY?OIjc(A^KcUH}Xf;O{s`1vkm+r(bQv!a0yGTzI`-r~zp-reZ2OH3n%ou&3%&UN_1lZAq-I|?>j$+`1L^U|L zbVd%-KUovDr9250aPp{ct^jWbK784OlbY1hjlNH4lggr?HLK;_W+ZU;t+QC$DK=iv zR3d_X3_vfys&@$wC;I>iTJ`leeiVpYNuuPz6QiyN$=qP{oc7C#j|b;0*lguamTR75 ztiL_^G_h`Dz#>^lRuvRLQm81E3cOFI<60H{1>qsaF`Eve!6fRTau+Q(#Q<@-;1mS6 zJRlY^i}!f37tEe| z3UDuYzXnV2RRABJFZ{}Yp2Cud5D%gR{+`qQp_=vbxDdxK1QMY(Fl}y>5c}sV>Ax+O z2qG){ygjEa{<^2sf&`x1RiM=vApETu-HjMep}+Xg{;ink4<`cV=I`^TDFtq7?Q|I0 zy0OuW`qwO!3Be%wpENFVgk zO6$ti}Mt7N;R^Zm5-*Ywlj=+2f)x`6vE-zf0p7X9grVY;p<#v zY-zFN=mk>gCYb+Vx403WA+iiv;VQ~m!g@|<62o}t9ARb6g1j0`%dtgo4KnCz{1{s% zy=R{l$Fer*Abym!9?69FHLSJoM4M|)E1G1?Br2!Q4%&N>#nQ_32EAuDHr$gXXTWBM zYD`-`8aNA&ajFpK#EIsdWwo=}vKfFMsx&wRt=rXbmP!Xdnjex)OQ!qnWi~~yKK3== zBA#rujfbP7_FfFKTCIh+dVUjmhG0q_Xb*elHHS5cFF%U*p;wiK*tVLd?;iER&ky=t zL{j!^z6$jmhSqDVp*RmH8b-S4N#eBKGpt|>fy!JM?f6-2lhgegQ{mFP%%vCUtR0CWkpM)wDES{phumMOf2V&JTmcj5Vsdnmy7Z(Ha!Vv0)-7VZ zD3z2em78eBHUNC61UyrTP|u6^($vqSYm&y~tWpU7RVXKM%7!S%ZqzNyy}U?4xn`OKL592x;m` zQ->P&0X3es8(!5@7@f_qm2CU!(G@Von>_)7zW@LbAjAvMA_##jz&~SyPoM*^2>Qz|w~9_B3_fSO66wu{Ot1Qwf>Y5X7IK)ZNmSrkYNAW4yWGT~iBQ+JwVSk^T93d$ z?P=xY9!Aobb#^gsG{r1kd-AmP>~jZ@02je>xoItEfTW#}zM+tmf!dx8%IZ9&>ExAn zxQL0)$j)|x2utH$1wSjetae@zAYQo=}hOgfKS|2TXJYKEHH|yu3w#=_@L1s z3=H>$-mL`J;rZ$5rfqd$&Ivk@*Vb1nS75QcS0dOg3UKfb@DWxeiE&JyxF^?=T0{W2 z1fM3q>$KBBSnB%>Ow+PnKiNXS6=lqfUeTL;bdh1OPQrcwlDlzP$zeq~D zyi-e7a~L!#NlkI}^k@@oBN30d}{99!S6dHHY+SyEuf{vsziqPbMzR^()7Tk392 zDMAs0#CB@01gG4wiBg-mFL}+)74r8=R1NiWA_ezuJr;S*R;9~4)G)_aL&Fk$k6M~?fYbGt``R~`H_QD-e@<$3*A2@W z9hK>nN`ue}d?RoHt}#UBsT^f!&frZcy7{K#kaS7(Pq$&G3ddCNJCXrXNy(sh1cROu z<-5HpV+uxA1;Y)2o`Dd69@zdFz*ivB2#Um+2kXL(!jnzx%3S>iWL2KwGjydE_qa-% zD?yd*4FNm&alsc&GJVLytG}Vwg0b2-t19!Mis#FHB<$cEzn@!BJWtF}jkjimJ9v_+ z%o1~?L(j7D$5GeIuRz!6&!!2hR}4}N{z+jpHxpO82vjnd;G`f++mw zdsM)a4ww@!sdm$}SAe_Q(v6$ltu4i6K(1#Af;5LlS1S7TQ02uqJIwr zgQ4AJu`UQg-qz#TO93@`LIstYA_Ku?1X=#PS+l)G44BuSSZJ=2Ojk6V2g(rspE)VW zJurXERYgKAT`sfzshLvUhr)$8Z*AR*cfXT)8rBFkR=%jSHe$w&wfJjl^3O~%;0sQQ zY%#mz;7KM@8q{7W@#qC|x4}$CmJw>Boe?t`pc*QUTB<^|MTCO{N<{x5=g#hC>=ZW zgJ}GTH@Ug@cLYJ!%|Qu4c`vTc95_r=GB;3C#E`(QZ!BKHoP*ldjZ#R-3W9caFa}Xd ze@@fhO-d`JSg;rf=vm14SY|>utkcm^lV=i1qWvsbaxIv&_*TfRck2s-MV;R_-Qf=N z*)l|}Z&ym)Ye1!OLJ;pSND8bK4*=R`Av~Rh&=?V4ZP09qK6s=BvQ!4FGtKVgU(Wn6 zo6Qhoe!qz2*0UjJxRGWoaEKA+F-%E_i`%4)zJQkQ22o3gW*$@&b z#DHIt-JJ!|=k^CccpZ6E-GHk5+3?M~w!UnGqZ?AA>MVjd%^dnCsihJi;){Rpi3JycM0zU&mXpnT@KGu{e zI@@4$t`&J%=?5_fcLjWoT&&~1>BHXt1i`(|mj7F-^Tz_N;{SlUWmW&KyUSYod#?X` zWvdS#whzaV>EyNMWR1f8?P|B}@WE~$QtE?_y))n{zMVkrZE7CNd+gr!lD{*ebv1dx zSyab0*6Awd6YG5g*B{7j#o)Mkl*{Vhb-zE0yNMwJp71I6>**hRt<}X}S!9$P@C|CG zzuw}>dmA&PVN}exA0V{V^T}mz+ev)h*%KQxNR55eRO{(_3A@qamFiR_Jl5G_Yi)2s z6i=|>^uTb?Yvn}wYI&gNb=>YVTXypz4&1$xaI4?k((4x53b)#i`7o^wzpXWpY=$1A z9S~IN!wq_vL60_$8~%AeziTKo*6Intemsh~rmdI!hOe{s4ZErHWO~0vU5))Tx(KUQ z&;8|U?$a=`Z8X<2*6Fy>vxMow{P`gTuu0^RVNRCZ>FQTSjBt0Q#<$cEX4C86&;h>Y z9)edJY~Q8>DR@=CLX_(c=qK@J+@j<`nBK=V6!q=vr47_5x84#O^cj(q%nnFw3ec+=}nRR018C(v7tz z(4>?BHZ6VUkQ)|9tv6(xewRp2l=CQSK9Eh$~yyTwc3SE`*l(J1woMv&5Axj_|3rcwSN1{x9 z5$9}U$b@|p^SAfuOZ>8~FNdFCa!X6@P$!IC84J3Da^n3>XEu^x;=pjYb9-VbXw3CA z>pfmW*1>L`qBP@yN&9fE&OTPJtjvS*T|BS^em)UDEjs#KQg(HWKV-9Y_#aWR=om4S!&W1O~ply+H*=)N34^D(d zO|(Uh9mwKf@2?El)Hk`3<`BnLW2T}4a*mQ-%8Cr=W@oi)slrzB$}FlJsyR9oE9hpK z5391|0eMI!5nRi!WN|Yi*nz6MK%vQAH)M`7Zn^90jarJTD03E z(oaY8$aVuY-%i=y1S3O5+fEjyYQC8)l8NC%R?2dYjl!qkNr}IlI>zMBUw(dJE7II1 zs`NJWsy)r}DpM`FUSICfYP7$<*f}LroLa+>cee?6;=W(2R-w6Y{WQ@d``?axo=IA3 zt)*N1!XLr_kKbclZYO0sq<#Drg?Y}mX>F>otz)hR3H=t-ElD3Pu3G&9}qiX8*W zY845~=bum&HBy2CW}3(^O3NPys1e|fo0Do~LX5>MW}4zrtsz$XK>DY}%t?V?VL`_e z0f~CZ zkvoh;Ke4gZbiUjisP!ijZv5i=xg@Kv&jsMAUh_+yhL=x=bGY3gTQTLH6~l5y)DqBu zlKiLF$#m3z{Q&=O1@Vqxcqjn`0H6&50D$(tDhN{xYa2611B?HTENztc>^2z?eCPBW zyr7$hU9&+j4g+d*!q_$|wMt~Y%C#8~Qb?9v{arVIdz*0C6e0@We7)WFc1~m)Q`@xvgq%geVH03!|tC! z)u&EIC@ZNIt#YE6AaFpdOQup8H4# z8WO~)Pf|!LXPQc~Up<4{IlwsJVwGe+G-I3b3U(=8BHFxr!meZwY86h zW{fqj&ACToc1ivPsWrGYZJs(R-W!966=j=Y+1ht}RyP0aI~6nR8r6wf8ZzMB5)=f- z6*mnzHH-G;le(%EJ%Vg#VE$s73P|kFAw;NbRmIETH?MkU=4-U6id;$_sSZopXNhS7 z+*hTeRt;DEp&C%Rs~VcspkAjJ47{nM(o$#w7Q2O8EjWS1Aro3WSfCAQE#uo14jZZY zg#N#=mr*1<&WZ{EpurCSfbhR!PfS_qKh^3Cw~f=L#A4o!-a?m_3z(KZ!R%@7TQ+sH zgA6Vh{XWT$V}&4AyfvW(sX@Qw&*#z(vnTLYy_#0bRpg;!Rhe07S(#qx*4WtmLy+pZ z%ngQ=DJE8n7;ffj(VdLNK#Nf*pZ2);SaJd&?p(Fdl1sonF@y=pkhq2FYh2tt{`R>2 zsYt?+*S?7UltQc;18fMo^pw9O1?d|ygAJlw319>Kpq3!P5Cr$zkvd22k*uJ9gffw5 zIL?*?P%zRxErQ~4R;)mx{`;vnS&#ZK%ki*-2}sF$>fNKl>s!b4k-Ad5$o#!O zAGw~v!Eh^ooCTr7dAi7`0LfC07E97`)73N%FNBL)6}hK`C!S;wxpn_^TQ=l(YImbVG}147Ay*alhI6VI05ul9_rfB zT{YR`{7?X?Ta&jjew-KmOgh1`(P39@Up{MQuNh}^^Lfwi2%;~#(XV1)Mr7#O7>5-r z>ShALmc=(^BPi6Uy5-BkeysR1L}oQjv4sfZWDv17#8>>7j-CUNY*7^(%x7BB+>9VL zmvB4g6Tb`HCi%{C={^~X(y6=ucvdwkbu;S3wt=PEM!nT|1vh%lg zsNqB2Q+4GS=ia?n$|_*BMEq(N$@PgtTRwXg0rq0G?+#Ghe0MNgW6$F_hYn{>3I1lL zNnMY~`IH9fc-e@CtLtqS{P^$Lh212RX*Xx-kc4fmXzeXr@;NOw6kiQjP0`zP;`AH! zXjZWSw1_=^1okFHQ*h>j#(|(Or5tH)x0yiOQR(0T^?E3^Bg2L z6XU9fOSlylB|8sU9EzVM=u7w_9Wvs2^VAK7r(jm1tN|(Kp9<)(Bfq-S*#|2`hRea{ z)I{LVN&sUM6bTfzI$5~l8B=pkrUI2D6@d*qV$KOe*8b(64uZfdqFTllx0`BS49I?u z8y-_|SM)cVW>!O>c&>Tcl*t^IBhNhfL%rRPR$R*~-&wo>dRZyJ5JlvNm#O3ckr1NE z1>GbXwg(?xZU0zRArk0u_@UTr7@hG*k_^|6Ys((ireGPe=y>=_aJb@4sEE7efFtrZ zE{-*yYs4let}50K=S>j@*NRJ`ohf3_NSB_Mmp?V3RfYa;ovZ0xhSIw+x_rz5TS!dxRKjAN;AsIz ze33|U$jJeL(vo6@V^d!3`^PVF=k209s4|?uhD)9wHY;y)`dsl7x<{`$tmcalXV#%l zL7QkVXK9p#yivp_yoLWCJ1pT(dk3y6y5vx(FkVBaLf`o}Mm@FnK3`7M!ird#=weC0 z`fuRS*Oe0m{vD@h&Ln051N>&S@X|#IEN{>I4aFR+vKB5o@w>|H76U zA$h5&I2b5l66GSih>T&t9nOtcgi*c=e&;lj%0MiaS~cjQCGXzC7{U;}G7o1m$PO$o zTFb-YscuS00!2|=2I8!rz)??=V#195mo?M6jUMbm-a6E3Ob9l0>;M>K+SgBjxt0@rdQ&?q37Bz8zPwbu8z-}!#wewxJ zp31gge*iPLSEr$fBp+=3=u#}0doZ|lzimepCHP6=OF!vW((X-2-sIrKO}V?brww+L z)D>#;?ff=~@qc{7FZgkLI6cgIx(Pi=X94$z!EZOI(4&KQxpuQ(2uKUh!2XduqU3*? zzL$~?@*^Bv!Xj+g&WTrNB5asOmTLPwW$!u4d>Q|h;3`Tm0xxa`@>4_tdq>QS+@;Y^ zqoF?oDxED7u|NatYswWgA|AZtQyBQtU1cv&Qr~hEK;Rp3#9@ zm)Uz37WOdB%`Uw0BZ)Jisj|}H$F5&>A*4hQ>=w6RV=zv~$oCx|T*4$#Cu!+IO#~I* zJSXCyvVF9GlyqAr>$t@iHsCC_Rwhl_?^v8VaM8HhXJ?hnZcFgJI#C10_>1Zw%g*o; zj!nA;31n!yUu0~uH?{Z1?5M~H*%!ZeI(BS*krJbp#q7;9BIXidS{|&v&Jm1cpqh5V zghROx1&7&8#r#m|udS%Z7M~U@bUAEmfMfX%4RbvK&GbE=)XojNN&hshU{N^eJg+6(TNo^I zUcJx21At3aWq{z8v;lUGQ-D39OA4BLo|oynEFtXCOj*Kou{jSTWfEkxxHr_UQaT}% zFd;qSLBYC9aU=#`;xIYthOB6|3_w&UA7M0V>YYItNO zGkVm5KQjHzi#sk)>ZsiA>}n>N?;{`r*B=4XqvD{Bg@1TW&GITGx&N2R??c9o!=7OF za;#+Zpq=T*uE@K;^;X{-07ZE}H{>U~4)l05;ZI{d$5_pwX+;3u0b{pli?GtFKu39g zl6$5h+d=e4t&etg(mL&I#m2E|QYL4kU54$qnkYse&INtS7yBm8FooF>U_uF=EGZv) z?<#Y-J;=wCq0|%tEe98H(j9`VcWE2w)l6Wl=c;(c?ODpP!e~XJ4635ybHe0;88<}q zw@M%Xm5>E?9B;!J2P1ZAf`2xMa~=zsq;RPOJmk16mg{1Ase~`k!^@gah#8qE+|c?f zqozYB*!e1j%}!~J`~`q5bIz#8re#S@RP%~l^@{GhmLP0NZsw*C4semqk{DtR1oLQ+ zoQxRhKNWO~$aE96hnN82Te8rE^RyY$w-i20UVqlB28ayO$^IM3ZYU#CZ?Gj zq*rfPX(p)2RUf>nmQYa@7^Lnnp4Abo)nx(;VMOOg^&8e|FEK%_Yvk2fp!A%3tSZFI zpa+TGYr`vDietsV?$H^u1UuwoH8=4CU(W!0K=uSDC7B9K2cnXpIJkbtd0lc>q4H6T z=j4=rV?(fUKQ94~yoidkVJB%SddcV_k(mUWegA}OYP|`(bnwV_M=uH@(PfT6i$l5) z=Nm*wHSp+#X>p+2NL@-EDgLPR!isS;z!E^i%-H(3z@3*N@;|8}nDaN;q8ZQziHz+6 zVx2WAOw){jS|B`g!=j#g`_a5c+KLlQ3$@BaI88DabMFYj0vYWENI!|OF1gPPI*iaL zlEe8m#qeMeNdu`Qf~s;0=qAEoOz}i=IVY&$B}p|>50#r%RY(_=neVDQCx1wnR3nU4 z-Lk4WsjDyPaH}$&DXK5!>Mm`KRNXvP-O9Qwctt=*z&IAaU+e)&z_6zUgU*^i0ZVVi zv%Xt!O9A7OGxeiIHx$Y(lhQFyo)8KeOna<9e}p53sCFyOZ$~waj0p0UHZt)!OBLcK z^*)MXS-)`(u=z31y&h2NrCJ`aRx$9I2Z*rJM9L)oa!YuVy~*4+IIWj>W-v;}IKpiW zoZ;nxdvEjH6n!P-g@ncR@vX6+;QmQ2dR83O@E6CrddSc0l(R3b!t41dwc?~~0s)r`S6I0S zf9X0-Wx*%!QO)#qgs<@N@vQ8{aQ)<^*Ebl(%u%tj|LI2IbM0#b4{31onZ@;S9)Zuw zmY3VPp-a_x*`H=V7rQLCdXfHTy<@JGD_oIy`3Wx1--$nAi}F4oY>kq){l%HPWE3tr zH`m*)Y=y9donGN1gbA+O#;T*11od=&#}|vlxM;-jefnXKi1sW(btVZq8YxX*xQrooXaO#i*HKvc&JD_uV>81x`1|sQ& z3h?M7M+JcT+X3)&&$lvM`?%Is0EXxDuKwSS2yy7&2PK( zpb45j*-$pnw86R$pzB<{Bp{nXI!!;x5FS)LcxVS``V>PKKoce#ZGS1uBQ!&vfiB>w zOOtRzpIWyUacVKTKx|ln@qQPPpK>m=*b}1MQT1`8ewhHdTZ(v_8bTCOYMX?i?bE zlZv(O3|(?AY5LKO@L-S*B`SoRlZy7~`JSxS%lUFAij{q>^zjl>W&e=NF0_O!w7vm8Ypvr*%`-Ku0Qvf=JWO|6UX{i^O^qVmr!J65FZQTPwN zmMeaO;z|xuBkz+^5{3_-*^-nEURWk@UP_;YMENUNBkd}SD+T1<1&|BhTkf4z2ToeE zX{=;x!6su)L#Y&9ex*HvMG*TTcMVA~#R)4qT*$DH&#L2p2>^e^CT&)(mYf)uxdt#J zzcy@M?YV=is3rK-Y+4=t24Ln*VD7@-RK^86K}frXm@Snvngo1X0tVawPf!wh>7B$S zXf#oXliIj4@SHObx^j83WXSNeXyj}P3hPKjd>w-2wb1xV@U~5GEA7l`@U@NfmY8`Zq--0ar8VKPmC#S? z&7Ro!QgC-)PLy~lTaSV)4$Ly@So^RGzf_tQ8qzECSk;wfYI8Hq<5o&~NxPxOnnpph zr!{ih`NXV((bzQ&^^};_`lo-i zhP|Q;{lu{6u4An~zgjB12#dJ@$`m}r@GoU7a!q-;popqDB$bf-q&qDt;Z%Bei5a#0@8RI_%;1_! z?A^bQOu^7&+EfBn=PZ3E`z>s@5y%f6LOSCQ`nHH_jh>#*?MFRsJ%CO$+Es`++>V}@ zND%|QMK4;K*`)t8c|E07{ki&O&yZ=XTxqFXIhKg&_=){NKW}2KY~gQUL-|>DTtTmr zpQUGJbF?D;(Zm6JBlP~jN6msmq7MB)o z^pdS0r1oLm@sIc(8geNqBUNaF(uS(GRQ-^L&K_|@juXEmAvG)Lhg(u|wRMa=&JXF!<08}>JU%}?l-jMEBiog;YSAh1DU{}_&v zrj<1(S(7deB;9O36-sfuCt5|p<|GnSlq6Z^6q8NHC6UGC_Zr694Hl26Zzr&Q1gf}} z`F(hXpyGKLs0w;=cO27Zu~IGv3GaNCldI4SiWi*xm)%_U`iK~GQxMYy5&DDt$AnXv zi6Qpw!dY?QN{o13N6F-Os?bTDS$+M%B-Ebhrj<4AtV!D=iT^a4^67I~o`iDF-Z3bj zkSI9H{|``00|XQR000O80k-^F{ZYwc9drNyOVb7)~?WpZ;bMpIHlPEJ@~ zcrsr&Eif%KEio=Y zC3Rd$tx>lC;o!U9{H@G=x`C>uim}7I7>~zNm#WYCKkS`5bLCnq-+AZq;nUwfd-3#> zOD^xE^-ihZv!8wb^5xer{_l6*`Rv)t&%gck}5R zK7HrqH&36w^W~ElFQ0z%&Wq2VeDd_07wyU`Gg;Q^x^kE_~8G&{QA4gs~>*< z`Pbil^X#+FUtZq&{-aAtdA?mz$*=v!$DcoYarye2=bwG^!h>ghL6zPSAC+h2e2>^J=FA3yue z)307Uy*#mt;D;|hfBFfxz+e0Um-10u%H;>o?em|!eD?gScP~%vDLvJ<|JELY{peC3 zr}KUBkvEs;-(22$@{(Kl=JNb&{^ldQ?(Z&NJhAILfAcY)a@&J=b-$lno_(cH{`~pZ zc5k0QdCA@W?%5Y#Tz>uZ^6iVKpMLwr4Ig2@eEHWOef-0p{`}+1dmsGUef+`uAANNB!B0QDym$H8dmn!MqwoLx$M1c3`Pt7u{Mk=GdjIj|^3l_$ z=SlM+w?6Falm65`^ULSrXpS;H({`H6Ne{iwK`?H^a{P=hJsr}=fOMcu_ zy8MsxUq1K$^7(83_chKY8-?CG%hZ=|>;@^Yx29dhdU} zfBC`t?|uC958u~+{r*pX^0S|Q@csuMe{^Zz`|Z=;G+PbN|G&2$eed7-Q@MP7`R|vv z_}jnw`uU5?Kj?#g_2Stdo?hO*@C$FH$NkZx^B=x``R?~@PrrD1d8WVp*%KD@Pe1+i z#nYEBezAUOANKG6eknJX^2eLYzhCnCm$(1q-!lJZ|MIr}<&thL@o(kk`Y)IC$3MR7 z7yQ5MgWvrg@Bgi5U)eX?m!x;?AOG#L>>vO5kB{sx{I6d;eDbTWpZ)&n7cYKMI-kv# zv|m2{-HreA_x!WQpKJWN#6NrdyubRrKg2)3i{JY${`()|pY~^cvtOiLySR)2rY6L;Ul*_`UDqzyBfr`Q61H_p8V2PyU;yFYHhJ z>sxQ9$GOkab}2KDk!N2w_Op~rT6?TIW-GJr8~afjxve?suBEIw`L(ioS^RL7+DfmF z-u)h*{g1CcJf${wN_Cep>&}S}>UFj@bJ{DfW}mHJOR3n;S{t>evHbhS=yf-{rn%>2 zvA+KHY=!*tPrr`8Gb^95X03aSrjM@4E}*5l>^^JGetT)>mF-7%@iqG`r)~F=YU#;- zmiE2AukSn)PimAjJ9n4&Y&%W+e|4`~7Sx7EAdVfyP|r)$i4 zj#gLMt@gN=vUlq_P5UovZ@sEgcIU>*v==qAo@U8At+hrO-ERM0cgGt_x#rYr-hJw0 zR@%F_Z0{)X$-1bTTDNmNCA~Ah<62U+JKMX=+3tCF*%n+)wYFTwZoV*Pt25g>&9isA zE5GAz%P9|Aa&|pgw`c3Gt<+ZT+y0sFb$g}mUF%#u*`rL{UbZ)BH#c(|wxnm%C)<7Y zQHw46xr)ELYHzoe${SrP-S=VIPT2PBSIPFp`kc{=eRZ~%+3e1H?1WbAq3xPSYjMM~ zjFL;Xx0iC;?S6N+r>*D7CbqBBb=ybS*N$qwVTz)BfuyYuh{S zedYVTJ=;gw;=#19wdGQHcB}F5>}mBqSJl$ACvB^hJ(+Dw4t~^f@AkfJ#n?XI<$m90 z(I(rQvag!<1}iVmUPkE_!dBa>D28NP4wJpWE4J(4+xFne+5+39*}vTD+w7w2$bHq$ zg%^K$W$MxPwM$)D@vzzcvju38qz>C{iU$_%)|lC1-yHT@|N8f3zRtFst&L%yZcCiY z9*y^7?=6*;i=J-oE!nHevn>nFJc6~hU8U{8T&pe2ai4`^A7;BCS!g047G1Mlt_9I$ zZ^RzpW`p&~#033~%<}?Vj^}zE8o)?!{u!un4%Of3!t33m~kv&Z)*nv(Rl9+GDm~ z?;gXFc3^E5aQD9N?b!mz-M-4UpDl6UV$%))+rRekY^U`e0WvLu^v>Brc)i=;*dM+pq^aeAjVbtQLECe!Lc2QMM;-Yuc)*<$f`x zHBNwH(a^%!P{g#QZ)@G+l6_d75mE-H6Wh>I3x5U{PVD-4nRYR~-SafJ)orI3m$;hV zlO4{s!K!5;WyX)1g)=+YEhO8{XerVcTPr-=JuCrP_dR|raj@;P?c|yz&NlnogLAAV z0+yCa(st%GS;nA@#v;nHudkU1G5S3>LSJog(%IciUxnK;hiyUI&H_8hJbkhFHaYQ! z=U;wRwhN2x+dOPdwR?V_MZ%WY*cLQX9Mh$AQm$z!o#k(l2ietZdjhSq1)Fjji+iK+ zF6>yy_dLxD$N6M&+I42V7h5zIdF@oN@84-hnrB&tWhL2;_w9j=rD7LBZe%a{zK^r? zIVKy`Hk+qGt+N6xni8T;mbbVt+k3^;QOp@$UEj_@7k? z{zWBN-dG8i|5FM6pGxpQsuEO5Vu`jLgoGvwW4<>C7FN>O3EiWh$`d+GdO2 z>*UC77J{=~GsmpQI;)Oyv5;ctk40TS1MT{^r&?2~kDa1c6%LE4mY3Usa=-L&)@Far zQqoy1ht|1h*{Gcg!_q!W2R*H(3bbOoP9DIiZ#qe{{U0mrmPNdK-JJ!io@TL{hr`NG zJS&~+r+!;W7&ayJKhiY2h^xUfKK^{dq* zB`QN(D)xYv6=rdES=wbemnB=7m_P4XmDvNbjLnYnLJ6;XYgUk0W>q-&mBriTXAAGG zP$Nx$b8~ZqSQ5g2*!RnQt-`Ua%ra^LGfod8S%?<+|ASJZIE_2@M6iRC5Drt zq57^b78H2mTtuq(SeI|-$Gc8mekG~2ELQKXH2z1q^|WlqzmE);z-l$Gtq~PdmV??O zC-9LV-m6NoU1jN=WzRqX$+5jON4K?ZD`F8Z1GKV#v!se-+ny$`*lHtt0QR#^6d(7i zk}`YF-gmK#-R{r7ZvbIci^LY>qbjqk%@#&)Ugj$nbQa58tl0_Tct7YR^YZNN)on#V zgeKKVwq`klB8Cp&vJRxPt$NbW?AEqrk!xB4-tV_oGKJpexEfZ#Ebhcg7+a$jb$cO= zAHER?-vfZm9`B5}YQI2ex5(G;x6Li!vcl_}cF@H(2ea)gjm^&P+UB!mj)+Mlv0{Z2 z!cIX;|BF=@8Q|o8IF@D3L`Zv377KHWGQ!qBP!V5Oy}Y!wng#PNt7ts?w+CW>*qx(i zmHVAOwiv7!vZ}1NeSm06KU+X{1?&|^ z9k7IbzwJybl&b$$2S91uSS$C%uqF_7Hkg zJ;T;4)v|lp9IXD?lX~7xTV;-VOP1W)NnrJ@Ee*#5semoS4iemy(tmaJXI0&I5X$YeAAa*0fK>{^y*nXu4>Qoz^k zFa^_TBk4yVVJs8-=?j%_vlb4l6!Lt@9+h21 zw@laeO{_mVD}i#VeyU6s^ogO;pe5qy&QTA%cfb3@d$j*tVWA8Q7Z7bJRQRueW zOSD73z4nmHoe%l7r3`3o!Ja;aB@Gd$?2%J7+6CHm>X^63QK)F`kpj(W=Zs2&fM>&@ z#gF<{N7L3swL^C`-%NJ!lbTO56wgN*^~D4Z%D!_UBBvozoLmwz!?8)goeD2Pm|EqtQ$E(pI&v zdD3@FSoRX;7SCi^?q(Udm1%Z7mNzZtbjw<1-!9sJq>@w1Bij+riB+SLq(E9cm1PMk zy=Om3Y*n*9Eu2x1sro3i9xbX{yti^*iAbnWoX;72V z>)biEv!#KJw%{ye33@{`A}lwV0K}72Bon*rq$J<~zAq&Qty2%!yRocg`U|(+Q|W_P zV=1TOjwMf9W=g+TE2lG)Dk1ZK>NW!kt zuE5@MA=D?&3cG~~tK4mg*uANKu$5)ocTlkR8W@b7a+H#mHZCwC4?sH&(k?p^sJF+P z7V@n@xotpf+u(&vCc5$#4DIu6y>Z4kuwGPsQ^nCs@IGo*D1eV)t68f+CAEFjpk~$M zvlwnC3x&h9dnV(}792KwiNslM5!E|CRtH+#vR7d_zcL<Px1h(Y^-W#t>_G~Kus&eLY3``sJU627E>zC*6OcfH^>sO0%!tx zJz!~77r`EX(8VhlVPG*an>3Dl~PrEU6wZk=G${lehg>jd~`D{%ZRtjeOq}% zkmSWJOUV&4h~c6cp(G9B|eq7}ya zRiLn-WDDPOADX7*`6@^6T*v8-bFZk?*6hrs=jG>vT`ST|6k?JTnkIoJdL#JO&+uj2qeIA;4cJ4LD0_@*ZblbC7Y@awFBt4=S;oXXRmk>P1hN9z zq&lg=jwMAND`qTW=sVdwjfSoTDBI5a&Xt^QPvI=}qnf5$)@YIWsSZ|4Zec6jQ(!9- z6}TK2(o?b5P)OtK;I|d&tHqYD#r6eF2WZ>FBdMFxH4dD;BPoKfVHvh9{j9^bY1`Nt zq`2JrO(tSiTJ>pjHJ&1nx!AQ*sM!*?voI5r8{86mpo5#x@d%U3mNxH#qe}NMl{El3 z(aRUysT_RK9HiZ@Ti~MXxJUwcebd_3?n*d#_&tp`Eah8{J<|Wpk}UwZo>3A|Im;ni z^c07Ig=kLQ2CM?Em>&;1k*sbzr>A#(;X08aI2af;Kv7n&bO;bm55+bs|E}X&m6WA! z8*qtCt$PMSe{!uxfD)#lnfzcwGWs|n~s^@}&&h6tHWR&bFEagfg z4IJRd!{ht5l~%wbKhA1yhw!_z*8>#(o!NM>mdO?MhNyZQUE1u*SR zLh4I8Xdo$)M#Jiv%_|$u&kE|b=|$^Dw)huI+MYEiX(St#%9i4l^jdFN#kb}aR_1Aw z@juHmq(yCKX{snf0%a>vlAt)j#^X5^0)mwUG}DIXxjLZ|i_vQIrN&j~uUQ^t&%T42 z>8Zm(u(K)-+W@+Y$VnDKS3FH9W6*;pZMWv{P^BZktZLrB)Shh-3~6OiaX@X68{5;< z+tsVKXl5@KR#4VK;-^Q3wnC*xHgupz;zDAHS5eI9u~;b%DnM2`->`~rIq}HECPX>0 zCF7W>l=1e2?U{E`U&~`VW$cKBMW^uQWy7W!0VqEgn1>D!tL#RDSGpm3dfp>~+)jG- z@g|hwW@TYkK}MFcsEHeot~&e;jm%c7Z3CDl$}}jyE14A)WY+4miyUyQ*Uv$3_9no-r_Ro_8+dyC4gz zg$Adm?M6FaBDu6sPfVn^@2N+UYcE@6KYS@KMHgMo#yMrbsEA^#jC>trs)5w#sWkSO zU0a2$IY^H!&S$%2$V8m!!X6ggn*zCSvN1iWuykdR`vb(6AQVxCZ^$~JSwjywt4*K` z?x6gZ$x&KbB5kXvINm|$hxbZkO#!jm^Q?=-z2oyOh*+@Z=GWGiO?O2^oW?EJ0SGUw?dLm3u$#N{P4ECQ^aR>0C!Iya<$v5Ky z|7umZp|>4|Jv;kSyIjsdM+9sa+HN5Irzxfa5&qpKPfVT`M3>)^LpwcLQ%YSeXSLY8 zK%XqAlxW-7W3^xI%Q=C%Mk~CZ2jb+C_DTX#!eL!mV(7GK$eexHhGPQ!DEExEf zY_}53SbIQL_LBBm5OvhWUJbb?Vc<~QEs?PMfc`W}uorFFbUH~SDa2dBCM2mAEumu6 z9*vU?`qR3$i6;>D(!t)L^s!zX=wJsn5<9zMFW`A!7Kt)>*+`yLuw^R8vx;$#o&=Z< zGHCY!b>R&Q`Ie`gp_AC+tMDnVg(K`x+upX&+VDDO*+sy8SaiKs09gcHu zX&At7;aFDFHctSIrlwelItA!67m=b#$o)xCZPIkMx-a>fsssV{^%flEusBg2qJE+a z8`ZDsG&`nfOCR>EEt4Tglkn>aey8xGU7l%3DBxQj149PJJ87cdSAqphf@7O*l5dF>gOj~L&gsHUJuvPj&ZwQfEn;P+(@nyZh;n`tq{Raup2zPG3hJ}n z6omy3!gF_vG&4hUU+i?%Q7Z{iw)~8<)srK;1zX*A7nyh-r}+YD)!MC|-LT3D1(wk+ z51_SqW)G7TtYSP1ajZ#cCvsW)1_^6LVZQhZiiM5U%;74 zRH&AGYO#+arOM!*q+U}zSfZrmG&|D=$#8QVLTFG8=0eqCb(%-r-KKM6K(bXnLRq2; z+O&s*w~)aD;6LqpCHizb*&52AK@jv4kn^S^RN@+)pkp700+-s=0+N$1wk1k}MJy?( zM;irHOYO1GjsqRGT|$DDA=f{wZ{_i?(Fd{EyK`K%eJjj1${9gnm}=<50hMBiG)l~Mx}urata-rhEZVs@W>#UFZ+zqqTSJpxL#EK zEpR^yt_22VZ=vI;cD22) z3WNu^*t{-A8e66HsL1bZ4#HCB!GHyAPmN(&ZLr@C9mEL*g}`HR+YXRiyws-J znraTu$UPFhkW3{25}mndTU%sWw#mp+k`m(qNMo_8Ptosv!P6cU%uXQJ>)|A}nur#I zC3p_Nfz;bW>b9r4GC7j*zOtxgw&48uC(t)q5f&A**T4n+R7c-Hy5UV1az`@ng>WkP zHIr(>Li_4=o*obg0T$2zr*D2x%Zl^E5(!(c_C7hPz5F67lqS}Yt+kt=7STO&@Ig0g znFYej3cG)cZA+AD@StFL6+f};!F4LULA@kMAJhs44Vf%Snm2bzaVE(&iJ=#xBw!Y< z>|CR}>i2IO4zPfR&T<{d7U*dg0D;xBy+Y@&LBY2w#V%ZzR+TR;dO)iM_(UB`O|`(z zPaAIY&E&B3wAD4@mDozN*Fi_*LH(+zjnn}gw8DB|Z2+c_Y-z4|^$l7M3yFw4{Om-I zXm>womcT8GQm%vg4K$j~nJF{_ZM#x#bBcI)D*z2p4lMOgec+os=X9S?s-~&F4Hv}5ba#6U`4flJsH%cQ2DTKWv zEqB75?bJ$NqtwG_fTK~VvrsrasAI*qpn{_YM47h!0$?O!eQ`2>pJdI&T&m{2< z$e^;DIE_espS5JjP7X%2+Rx)xNg)FeLESVKi z+Fu34C_O2VFQwEVHWd70t70lb@0FiYXVbk_%$_K*>`htZ?mdWJy%C)ky)}DBk+a)% zKr$vhTIovK6T<+lWNGQa{VKGAPyvZo%@-amVI4jkdrAW!PuMS@)#kKuu7IsJjxDg! z*q@yLlPnP?xDW&B(+h7=!Z)ueK*sDb+B4b#EQ^J_$pFf=rv=1pnTV|_d+gQw-Q+YV zNLld3S;e#&DZZ)X>>5L650M+HxtJ}%oTD`H<}Wps_pfNC!!gonpy~;Zj=eSn3f&_X z3~&kwi_{$n{6m{n^!gLo8SMK=zUhxlx^5#WT=1x%8X^}Hq|>^eT$Y*>2!W+n=z;AV z1ZoE-@<84>n!rbv6p}jN$deG0li`lxLipfoBWvM+X4^0h72#$`)yX5iQsI{Ie-vwgH2+|U+=z7ERlx?BeBO+ zm4W;aWdZC=`lk=+RTbzbgR>TtlC7nN1H@?C!<*jph`R;8BzGxLs2qeB0kY>|6=U8Z zuPs1iWS&T06e|}wa8o$iNa6Hxn;LUV5Cf1Pa(AH;tzgxmnIWE&j#{P${6&`wbu>bX zMNQq8nubWA?NqQw%6H1y!Y$3Z63surSq$qk-C#x^>A_hP_lS zEWr8&HVE1XY|k5;u*S+1=2f+H3eg+vim;j-LV|WnudUO933dmJZF-uv=qu`%bIfi! zj)ZbsL=Wj!iTBh|c3V`e+s}r|aSyt#lEfAAg)-X-RPY5om$NfsLq7po62rPuuK-a= z@vhvpR5iNn7dou3gVfuO@8E$}svX$^gfbafAZ75kGqd=sn2;p(jTY?}K!4jms~^Zq zOoT?vPLV?|b{FhnXch_-RTLph+AQd|Bj!$Rc)g9@#_5)ed=>c@WFsd*Wyr|*gwXtL z`yst5hg)GFaw;`0)z2BrbZjfLA}n8+egx9!$20^Z5?{qucT7@O@Y@~89inOoG*;qe zuPiJpWM^_JSpZR$LUx%|9P>lLR&0Mev8bfr52e^9^pU{!tj_5kJCxjPI~h?Xth27c z0W8c|?&@;tO!t6xEg)FX(l;d(@Zg$}0097il5V9&!U_sJGs;3Rh2W?4ED9uqd5bF# z?o{O}xBycAJPij-Q4&WIz>-UiXNMKlmCTjw1S)hu)KPF=k21bP!s7kd;;znb%dlaP zEF+h2R8^TGG%$JdICG|Lm>w{AA@O=tq{jo(h=j}us1)X+X;es@&M^|TNNye@+7#;A zOw}ypWbwYNdf{2Zm{0D^VMoJ+LTm4F1uje*1Lg;GuGN&ri~cC)5zo3js8Qvlzlu^r zeaTr*89B&+IbzES9R?7Fdb*0ej{1PSb5>G_DwwcBAeLCdN;#kpgDqOP55T1mjCA`{ z{#ujlZN={mK)oi?dJv2;(*V)mI7m1;0?+*z%SJmLav_0{Q@)g-A!0uAX>;5i?<)DI#l!rNj02v zv1F&UflBgrq?&gC@sF;)C;K4FcF!HTMu_R|+okeGFC^tf$be+-tfDG#Yv>&UTPpWG(Yxu4UfkDEcZ@(U zd-5EE_HPS@Du)5byFE}_yTJ@yRQtdn3(une?N$}xgE%y;q@wX65@R zY>4nYP9Y9H-KXerB|<;T4K`9Q;>mc#p+JzeSVpk!mp_mY0%zmb6dq#G+rTr4?(ZC3eQ@B{(A4%rxLl4!T{>Yh;TY_ejDn;CGXQCg(KU=*U&{+OQf$=l#Y5T zBHE%Qb>PyVYjHYtII=kU^%*~dM%Kjkw1he&YqV1et#aIk!if&*MJd2M@bw+JY?wkI z>!Yr4r58maO&Qe1%Tp0@b)Z938pAJ`yQvsQ4J|D{{Smkd8I_(==kVr004;+#b5i1! zh-uD4EU%t%xnD2P>SC+JDw(Dyyd2_$d#&*lI%9fo9N|^T?DURag#l`r(u88#I-d`?hYy{#3^JpJ>5oISVQOhby@Xb07gqS0Boco-xn{mEC1=zK@ zgmy_550FdhdqHkf6zrVt)#u z>N0Jb39pkUfpXj{5t7rSD| zHbqUcy9AEgK{Rg`w=D_>+ZPd-lE5xm%E3l3qYzU%HWeg~jgAFq zaULnFH;9P1?RZ3>s7En4XfOLl6WmL+1Y+&p4rm0)$}#t|J8N%P%eMq%R;Sf&$kl`h zD4VsdTcJrfM_FJaM3I`xq1=$);x>cwA3CBZL}`~zHt{8ez6V!|mooU3#a*+0Rau;9TWyLtxa$AHTrzqmD^?KJrzN3qR{@sE-=8bZ(Rka8w z5q>BA5XC%%DYnBnY-?YhF_Gs}$V^DIPFS;tLAxm-0s&xl5TOfxgS4N5UuXFX{m>3? zaRw$$BbDCM!~`U;yDS2Wr3kh&Z0%kp*_BLz=1hbJ9VVUq(v)q!?VXP%Uloe(7B()3 z{-B0VB-xra zQWePF=!dso_~W7>Qr0nufrkPa7vv|bi{^5BAvhn|u`d|K^xSA;hkwNwGD8Ne&mLC` zernz05Ai}7gPrk~DrI>dYq=wK0OuqJ!Lve=oFdXB9vP?^^ic3ChD;6JEXbrZ3;<@u zAC3+o+B=lD0Oxg{mJ#h;3uGC}w_XKtoK_=l)My>=UdXp9w%6=RRq1vBY1(-XPJpMG zN|)?U1-KFRoCq4R%rIj>#ZqV#g*g+s7mt$eRCVDjyB4)7Tfw&N;lRjh#sY+W!WPe( zH3)By=0XYQZM5VG&?^tBc<>eQ4jV&Rt!y~*D5IlHl-XSMfppKxeCxJ&*|K6^b?`>gs1prOqhQ(<< z-W3~;401VyIR2Gw3-UnB6Gvc?>>V(y_Cweb`GXb-h+rtR3YMH0LSa_wduhY(v`wI{ zoDLmQJHcb94}%Ug0EB2scC5$N-AnlPoFZpTSoIw%q|VfPd?ww4epTjz3US0#SXF*P zkEB!qIn1mFTP7mrCS3cdSAl|&bkbv10g|QCgRzx~$T|V^$naQKOT5_Bo;J=YFH^9b#{)zI^j-!|Hhyw9xBlCp@ z-rb#X7CEw78a~La?_R^VKIH`?13wZO|3|J)K}U({0|@jbcKk#1hBV-%D!Tj%?@HpH ztK}3eP3YLDT0@vTw`}0CJ06Ga#j}DAq;`$MILnw$EFK0uvQqSlONc&QE>$41uI2Yg zbz2WY6ks`pR12?KNMhvG7I|!;II$0*i9I-`2#ggrnk>$VQCDuk&qHWW)12s^lS68q z_MFb0I{TeS#T`X-mCYHnL;Kp~Ng$inP0D+;&G1))fYGsrJW}le;|E zF0Z|#mZXo#!GQ;JWP7yoXzo}|SCdmACqI7i`bljaz z+|j7YZtk)$72zQFP%o7OL}}__MMd~cbf95|+QJQkR1_!ZkAb_w8D>MkC5I>5jKZn_ z*}`qZI3OSx*t!$!f~wh<7|je(-Rvm@PK``?yGU=R!<&%i+1>rBzp^E7x}=VqlT}C$ z#IdIQoYezS!KZ>S+_&SsSq5F;S+*Z~I_(GY7i`QRHAE`XF@Zs%g4yc4dlBEJ_5rcN zNwDz{!xOd;oH*0rZ+X;JBOOJZ$oeivg7!r(5n!jqPR9s+iZFyEzR*P&j_qXyt7CyvA~~ZXo}grO3%@}goSs*;VwxC-l7)83kYTsInBwi zG42;sPAMHBci@V-@ZlNo9sTcO&fjTVfg8F|thvi%W;d30_bR?Ml|Umcmsq@da-3mZ zd?+-y@ighZ*?r+3OTQutqlR(Z!l!_P#!*COieO;Q6qpF=(taWGC#CdvC`&tAAw#4X zXOhaHl49KMx5m=3-LWW*rP%P}ZzJu(aR(w+_kyGC0kJ1#Mwu2 zLxH)!kx};ajj)(C+nUs+5gN3GQCQx5Q!RAmE0H4@Ha8Mp|AGfR`Hv z(#J|j<^kD9^!y;!inP8@wGV|ktMw0$>Z%-D^wFqV5389zGggm)i>Hl@;|fgDDK2Fk zYD+W}BvsotvE{`G8YYxL7_pvEVK$2x3`A@ktyfYS!-R_z31EkVXgh}me!w9*h~!Ap zq(x1%q@0!&lgvGJgv(fs&6-f3yn4ugTbIgRwD17Nsifo8CD#@F{u*s!+zVr#3JRMc zWhEC7kQPiA$P_DlyMaKtehrzAd}M3rt}57q(ee94UFJ10fZpaZ3QHbJQV6K?+z~z z7o?L?LVbrm?&KBTXaf@(xVCBclaCK@2fXdVBMQKI+FK`VI54ity|?G6HK|-A z!7{g@sl%vi|Y7sN<(Y&jt6=@wU%fIEt7 zanXP)uyEU9y^@{rFmYg7*|RY3y^|qvvU&7_%0Qn5Qbu}Mmn!^X5(?7=QYFu}i~t(( zDU!_{16Zm~dYGe>vo0t`{k^poNpA!2MFNl4B{l~OR|&BvYz5oWfbbQG9Y-Wa6R5EL zhB53xtOgV{L!*rnU7~nclsUwQ8%`-AWsFx>#CybanD8Wh+S!(`?V_p))0lNoSvc#nBG&$M?a8xR8m4OP)N|#DrZqS>3F^dVq1RyTi zDI$}^R6Aq$69u7aR(NmV+FtN;6ZF!cO6G8`y>GY5BbwS$O)7O~;?k3_D-p1st^?T6 zNy(P6P0s|R`JTEsh)CMx%T3q_xzEwjf*%hC_Hc~w zGQgPWz>&Wc?I8OETMH-(Cid+@P_O=89qMLJ;AjWQU z%DL9DSGYm7sGlJ`*JEB&4MWrjXV&|+s>G#Z0uyeh*yB3(LXt^6Q8kw>iUXNp4-TR2 zNh*tL`wTF&mt38myWf3O2{9OF~+7kVpr-ubBtTMDsA zp>oaMBD5$yyO`lA*j2z&An>r*oi_)eWrNvy)9utx%*>zQ*Y6Vq?MZk17 zXWRzUj_ukcfa9-W>;AAN6=$0yA;hdQ4k9__zbe&^$79?T^|90H01KCs?Ei3mT66FeSq;)o?70Kwg$H>~Lg3|}PzPVvGp0b+A(_92*+BY=TK zF|)3TUkP>}{wr8(PE^`%669iB`xKc#((d&n2ymu~cu`!M0q=5A(_;j+LI5Xq5x9rl zUC#R31XPA^DjL$k!Q+lj;0GWNh=qbC#3r@4o`KbS&<2Vp ze7q{yt-<|NCl9J$I{}dH9vFk{s#^q4a5(@@43!TuiqIbGI6Su0qoM7W0jIEo+2`y9 zXd|~{8sG{lo$Ql~9I6%jT{F_y0nw-6e!0OA#3jnPd1OO1;HsH-JpmTz;&1sCG(^>YhO_EL4ww8x1Y!C_ z%PP}!I_X<6%@RW^IDyn0O)Y8;>jI2T!lf^r}E) z0fRb?>N*lvk*z@pF1Y8ln8?*N{1+?41?u3-A4|*L9OMkPI#8!@aOw{yzd=6iNfT9O z@t`YNJBnmXv(#u2SkFK%E;kE$EE=Iu*+rbQ;Wfw{WE4U4DZM}0f#(7{blXQ~vjd5e z>80_o1{F#=T42Cy6jn-g#qb;Q#yRspCKFifF^Z#craCZ;k_I(8G;b8jD-mNpFo+o0 zT6Or#qhYM8rxaKdDRRMM_3T6jr^068SoL+?QNjR5W1U(YrWo|gv&^FXp%>LM8Yb1F zz{C{;oeBXQ#3J%b8oBHxEUt8~menalqU#TY8n}iE6tPPTO;fo6f((}~zg|7x$M&yD z51<)P$g$ktjGPIkbcg#AW_UCxNLV2cNY;lET~o29+_7Tv12jM`5l0Y@CM%!hmw`Ot zmB279^bZ(t_#`YjY-NqYO2N&p0F30eQ+b%1TaiO`HK`HJ#Fx^AMg6>c3|j-Um>@>X zN1EGDJ6T$8O}DObI)hAP5D*}V;R9ZPkQgS2h;4|ZhTUVAlYs@8T^`b+(jtQ@#<+V7 zr5$RAAP82PWJ4dJ1BW3H|0R6D@hnWMFahjR?Ra_0n`&ZVSt%18BYDb@12tPcA(ZT* z(kDEk#?`ENfl^xJf^ro2Sj7tzglAscim0ea^_VQ~4c^R!+O~$r0;mwRDA68@mvAZn zT5O1c6k$Pa=elF6MMtN@fOPK-D306+O*lu{QIZyo;m0bu?+5g$-ge45Lr6$tW2y-i zF>E^qjTCoNcDq5Qfh8)cg8?PADH-tQZtT*+!d)O%`hdnH3LK7Z1EOM-Hk4eji)X(M z+(0(L-Lr(e5ngaRcg{XcQRi}iK}_^USg(7K!H`NF8KG9LiGmI6$*z;7bRj5;fz)V0 z1So(9vuyt8`^H{GZ~)GNNNvQs1|G-3hq^n>2lT0&?cPObt3%v}NN<&(VVH-hp`+E5 z)Gox{ZVr|3#zttx%q<^N1quK^1zVyNz<`WsFhp-Fz+ja88fV~x=FYOqvVKC^aL8+n zpRou7$&$4juL2@bo0_dw9hSynaO0gR_XWiOSo8$|O{R{KDWceh9I-j^T-#kHN&*@F z&O`8;6jFfWP)mYqqis$+AK-!i0d1;LHO!y3BxzD;elt!jvO&-8X<0O-UlXOF6Nb|* zv-iM3WpeU&)TOF_uBQ64KmLads{*Cd0RP;=moa0DMK^`b)}p5a#R^sygB4mFWzd^8 zePl*VmUYXtD%?H^5l|6>dVpC^msqK`Gu#3}LQ5Kk8t!S(Vi~Yb1{*!vLW?77R*D=5 zl}`!LL#os{RNYL2VXa_QlK+Z%(WDL~?Tmp_B8h{rCrt|U5=q9Ccn3&?bo`{I1VI|# z7Qk`U*u1K`ZU@~ji5G&$9_lZTnE<>rb~WkEgAfB4EWsW8D22V(v{IFI3KeFjSDWFU zU8Iof}>!LTW=fMNRDbf62LVIG1~f%lL8C?G&=K){oCQ1DL+{6~H=Sq?LdLuPP7fRQpivf2fcTwjiG zF#s0m`FLjt8A_Hm04}s|9v}ZMlVpKTA@xVs@8*XNcUGW7wCT9&=uOCxl3Edm_$2HU z0iGX-2oeM9r=43My`lqje#fHq-%w1*PQ+hz*Vmy$VjSY#%lOvRgmj7?FYax}xtE7W zw_rhDJx-nI_xrpu=+F!%F=G*_2W?Yi!mNo?Jq!*-l!dknI35&Nh{WX5YTLz&fUykq zwG5W%nOL*Ly<>$s`6kP8%(ku4XHVCP26th{gFxH89w-5qn#cUEKPCz;7=Dn=oIcFp z1`SBye4bZYbj3(s+(5-T&FzO0(3BRByVvk-BrsYqEH)gNd&D~ytE}IpGmrG5sNc;< z*x|4CX}8FZuqbU3B?|bd78t@9VIL)*1A^4>6_qh;&*`6%sKBgKH$O`mlQrY& zRXa?x_vj@e2hw8#=7jJ#WSA7qH9!|`3yXW#n{`b))0EVZg0-d_#jMHpk0Y)O;ze93 zX9GuJG!vCJGpYTUcdy{v8`)^hAScpR_Kqc1!U)Sil=@jr2<~WNxn-uFoHvPaFW-?! zakjt=C8dkrl$@PK0Tt(cI9#EzNx-a!16E0dnHPi(_4Ex$yf8niWt}RN+in`J5`tFp zXS#;)_#i5IvkG1Z6A3h>D)KqRfOsxWl6t2=uppX-*EDx0&A2a7=C>ihK@<@BRq|o8 z^Xd)j_qM*2CBj2P-LXRtglH5uJA_b~!_q@8^)!<@4a?wEbPV}{ZwDi2oEOU-wWbn5 zs9DiuF-@?hNABf2ha4Cw@*tm3fc%xCAEaZ9AjQgrbIJ%i5?qGZVvaIjT?Q69Sg8q` zjRK@4`UuLmXoiJ9ZPK73=|7s|*C3Rjz%tTP1yQwd@yIDm!f~oIb`m})&o+6#WBuMC z?4hS9nV2Q=4$cr^dO9Q%-cV)@ZD1w)0IYGo8z~dwr zIn^MJQYMLXj5~}UQ@9~e&q>^)Z_M)7XI%VRPT@pZPn88XBOS|TjzA{xQSKR|BL0wi$&!r7U9+ue_?Rlu_L-Z+qfHbeaN1QSFa(2fM$*9ISmdV;&VnbRFaHL@^LJ+eBqYtoxu|z0SS@d?WeKHd0C1um# zpws@1Mm<{GM18yTEy;T%q+-Z4Dz@-qBQ!!-i~@A9FN(G30D+|XexYiD zI{{w3pjL`*95>9DlcIX=QB&2}kG=S`40ljC$jS~QTsr8mAtU;njlrhW`g|qO7Pt3h zaNdb=Cm&W_vHEs|&A1r0NB!ZiX-+Rv=1sX2f4AI>QmPbY6KH%;&~eT;qSUQuxG$<` zRbkOHA>1=}Y@t@|v+8_h4LQ>!NWPO|%WV#GJu<4#VO4c|B+glQ`MR7&=e^ff)So=c zp*oepdW{uWQ3%5cO1p%+xB?o8GdP_Ep--@k!3_O8x?( zz0Lq(rND8OKhnW}z(_Qof6Zk^E5J-x)0nU{nI->uL5xe`KzzQY)edfM9X=69Hqazi zfxx*)1Yo4=${G$b{Ssr9rc#C#%g--oS-~bBJgt=#_h(Czwp8|UNEu|1uVZ!QD%d=KhDWzebm*cNWNQ3^9%Esv+$Q;x4A?&(-pQ z&qW#YE2K-OZ)``){Zt&LX4B&R$52t15>G*3;RLCOhBUY@t|@8NGa?>dTn+{X)~xy(?e!GVO>+Q7BV86 zz1&&ZX|$5Q`raCq9LdbAR^85FD=vhLN%G^YIU96u26@WRohe0w-I;H zM72K=O*1f}aKN41^}%{Z@Qfw}9$w~7t?`zl6kP@)kz&yP%t-p&;sIiMm76P#bAnu~ z`r``{alS^vP>{DwJ3}1!vP>Eap;3h19G)1heq`KLnf2Iy^opoKhpBZ(+#_|1Av&6C zzVVpwETh&Hy9iZB?=~sbj7)eI`9+JE=t^*lJN-Vu`?qBBKA;zE~hlXgF^@Ew&mCT1np$pXba0 zH2%Aj5%yBz2Y5laC4&t9_!e?mjg8A&4)Pg<{cK30hEb6ijF>!8iK=+>)aK_{rDR%_ z?|{oji&ONlk+zV?R9xj#%jzikpt9fywaDQo+_cc$QJ@HPz+5ADPlB4loE9*pY@oeR zFrP;<%(k+@j$u4zyUU&siAA}Bz^$}vBT=(STP=5N(&2ed2l=>!zKnrxxuYLn?MrFC zp~!Shd{urCni#8yqP<{yB?TsT-C+*yzS4Gc4@E5Qof03=*}Qck5|G4TS!bfToWnFf z1qLJ59oEN|KX2gScqEL(!X5#4y+`N8U>eWoMVK<|(UZYxQic}l`M=+fI3m=1Ek8USBxUKz}|n@ z>yi9$Vzg?HQVM}}M=0Z%cW&DLNrD?$pU~sg67KWy1pn`jkLVo@= zcmqF1>z4{YElp5T*NqjHWSbnb0!YHOcS>ePV zHgSY`38#6yuhL>>%$^n~5JbR96kC(ROTu@u$D6ExeCyczw}~UBneW_8zvS>Tr4q+=tbjTl6?v)Pj{D-5 zR_G5fE#89%O@#&mdpaL)!%xfy-UnF&H-x!Ex5=M>z%+z8?vp=Y=oNUvk>#R`8hLOm z2>YtO1r@GLHePrmtC@5;nq8SFHEfdL7qIELw{281Ug>WDop&L4N^TS}6PWgsjA@rf zw&DgzJrPQw{pBN)Mm5Nt4i)5G=KjTJzLGyv{n@2pJG3%nCrlty@SX%+o}3JX z!WJ9XH4ho){$pkn^CCSNf^!hGT#=*M@0H*XY^s}dH@mprW}=ZtQ_GOgJS28`QYHWo zQYg(k!Gy8^-d^56qIdIEpbr;cfP$o|tr|hr{vkr=X*E-#5zcv=O3cmJEDyl2y)u7( zrFhW3>DDi$okW8TP5GyPHHUNDd5E{-tUvJSUu2>Rk0|~|>uTx7Mj=Pc@1-kil7&DWux-51=H|{Yyu22YTz&@I5wpQ${@ddsjwAD3Nm3m%|njWd>3R1k=!H(h@8(tv< zD6y0~bJDY7RNBW&p{s7lntgfL%N-7RlF(@Q{KaBTlODYy0tUQ zP(z2DH(%~5JRm!3VFY&{g$zZ4xs=lZ3*TUHjEoT-$~e)5uPg$vHa13j{*nS_d2UfG z5?BG85`6-U@jRkcA_=KCid&ik;FSf-s6PPNpKaEiNU-M&k+~glz1e`GQu;+LsHk#; z@#}U!*!$Po!dM*JId?ZChu&wD3fIiS1`+1xYG)jI1EX1kmlZ4G*Kb_tit+OU(TX=* zu4+qNCMP~ArtMasm?;Km4NwX%jtdlknL{T9o2?KOr5fL`q~)n7sHre}Ex1sOLa<6~ z;e6Sl8zfeHc_Ea!+{0m~K1q2|l2|a!G1nN+%kJ1cx%bC9=+X@2u^6F<^BctL?--p{27=mSVtUG)Sc6%XFyr_vF=f5e^O#4qkrJLg5?Zi|xs{2y7$kJYY2eJ!RmE=Kwql|;?U7)Y#e66O zfwuPMs7WneJ>9AZkU8zVJ5)N{u$8u%n3rG1NoC~EAQd1iYMj|tnp@$Jvpf+a(iCrH zZO|p+99zpU`T1;7m08{R@^7VflT`UX#w_jXUHU4!pXV9XR$5a1Fveggl z3o=tV>a%44GS#6yPo3o6h?tqOP!WMe zHM&ONRtEXsj}n=Ao!}~hsuD4jaywJiLf|nH@Sz6GA$@m0E+CXd(pe1c*imS=*HFU0 z*X=zAvYAOH*W@aye`lG?nM!xb6cKTeW1xmpqI|#2@7{-mtCXB3PE;Y(kod^+o-{|6 zgN&#tiCs>d&Q*Yf$ef^YIT+`54$Qsl)3tZbe-v|%>=C)+F;Ry@<>|%3il3H zJIIxMHyV1V6j`bsH$eO`B1@oLZMUIBijDTzsqBv05Ob74&kM1G*gwu642oQzIX{aS z02vlS|A=k%=zvcX#sS1~cb^tol}=C-vs9$0YS@|BMMYL7LQi2u$E~^oq#oO*6QGb+ z`CP!KF8vEhI{A~#fGS0^H@inrfm0IIrmLoXXT#SDM0IGiG{K_bvAr}@YiY0@=mr7( zDswyo7>Z=`kWrlzFG`xGVD6V7&RrYN@mFRKkp?$(DdYgVZ;7F(o^uz&{-8U`o! z9Jz%FuB#X;ecb$al1Om{2aEai#3;G}2qAXZHKRsf$JsB5lIbEqMyr z=wOkOhu=nVAz#P-#lR0nE{Iba@sFCc&p_Hb>i!F>E0P(1uL0ws&cJuFfb@oNOAm@n zb;=QHCqva%4lemU>$hP{b2(}w;vM&O!1e`uF8K8c6qX+2CLFmjyn)iwOQ6Qg?o^+< zn>ae9W&Ad}0^GdsLC57R516m1M(qUdMKP}36733hf;wD+vk_xNJ7Yhql{Sv;6qaZv zSy1B`%VH0@H*b1_`M_c+G#GHH8Zx90uY#mU`g7Kkr8laEvn4!d&<=)}sk#maNukw; zoQS9WNFof>HZf)b;leTy6`K3WB+F6%&Wfqxf)0qJm;itl- z6ZN$OHC7c4g6uPjl4_d%SM+C=GtE;~$0YFpy^}^Em@-a+=tU2a#g61OQG!tw(N39F zKG2R8c~>m?R9YzX#n1F@xFm{bwBt~Z*t<}Jz?JQ7&BHT%C_9u@qOzQAU-y7;EGyhQ zLaO#@AmnBH!0ml1&NWy|Ymsfki8>gW65EP$C3NZo7ns#HsRcROEMp@VJE4ZX#0>K% zbzT?YG*s5s7N}FcKmT>gE>`B>^h~I%n>j3x8UfFt?Jq#Dm zm!0)lB^JxLXEPZc5H}(&1(}V|5|85jN57%5bat~`aDVBz>V5-OKpt0MSeGtmDQkM& zS*1HBTQXsH)G#ZjG)pjst1-7)`M91kV+lko0#hmF9SpXjNH@Bm{qQx)K5t%gDx7=Q zT;qh6w(5a~C@s_}{W6ipxFK={YJLTu`gN<+IiX|E3k-`O)t{Ukxv{Roe>(Xi-TInz z4^4m#%-mNaaX-@^=Nj?%+_Whb36_30!3M`;22Y`r7jPplOo1qsj9@GVY9$*xPbw>%hpIGwkC{_kg{TQn&%pG4 z^KD@VWmx+`11%m{?t;HwbKRbYX+XhY(?gatBWxuRlf^yau{uY>hEmbSqX`j zzJjQ^@ubhfzBn>bE@8UqZJ;gTU^FEKcKS}jPb4{2_ds8a%cbE|sHdY~ehWuJV$vlL zJ%$2~=?p#zg)f25kLXm5Bkh#RG0YUAwz`Jp5A7O%ScOzZFb+@oEo0GqUA6f!d6##& zNKnly`^3QypIRXp>Z;X6;5YDUTLpJ7z6x(2CWE)*pJ{-Z#;!2xLz|3f-Y#Etn3f~F z7}bFu&^}keqE@$Bko=6Oi`-*WgX<$-AFK@iPQapYxu9k0Ri`v4$T@C=J|;>X-sM@& zM<@^bO!k5jb`xP0U}Q!a#b|znmR+v0O6=%1HF=Go^snt0Gd(n3fQ-;$F|97@;t6MN zOlD3^C!jssC_*-wgKSbXM7hh4-C^b;(EWAOM;oTtuCAO2Rtjy5^;>8{wl>@*$h)|mhdY>L(tR#Z!ggR!JYY#>4 z*%FsIDmx!Z0!;j85z+)kXiT+9jPff8!H@VKxhUSN41>8d9D=69{Q*BSJbM5-gJY9V zY8Ne=ZlywG$_WkJ8}V3=0-D)2sl=&&y4bSHT9~o-?G<9FMRTQ7dbe^$yAZ<=oTFZl z#|@M3fYisTE@B5L^+vMharUOhSfbdqh1fICArMTk0(l^k@pfYsr}>s_N52CR7Xc`& z&#ARCymFE?Mv;NnF%~U_Im;!)y0CM6^;g9C$4NaBsk*W_#!UDLxZOjzk5L5r?-PVn zq?!wl#qdaXXdo8Sl>2G)nCJ9|F4=~)U-%D=4bA7-{OJnA&eS$wS9Xx<9Hp?sp4M}V z=F74mQH3Yn$vBK(i`P3VSmm{YsBKd$XR&i*2pBD z-T0PE86A68Omr*g4U>tKitwiW*fpxek&EeYZ#;#}pndwwPP z|N0HHOl9B4u+RuR1UA3cvrPjn{|#m1Hcw*6^N-WSkMIKl{p#7h#sZy2f~z?G#3g#xQdeZ1n|W{OI`sZ_~~;i#Pv}& zy6@tq^g_Ir5XA~Cn}@?&ld=zZ9J^>83dWI7<<^vVw#%qOnel4hq*Cq=7GsTIW`ac+gKi$x7GoJfX3uL%8eyi)tBPlD$^s)%OfP6&ROueBeBD&m zfx<(~bwg5yrwHez5t2+`vB*3UN{);jbLy*0kt175zJS8Nug1*XcKE*^hwA$>ASK4T zrb=hefz4U0f}#nDiFr*43Q-siLH$lrCJrw%KD@?)<4j!WN(sb@C(>KPf?Z&$LN;Pm z0!5<;H3H?;j~ksgW?zQXB~E$g2Ob)qh_YYD@>H;K(y;Pfxqlf7f-{l#Dtf~?9&n!v z)*~Y?1f>9`S%pwVuuVKj+t*s<6C_;AlHj>GBPsgpjyfSYK?o7dEwF5w1%bsK zQOPP0uFA_=5$3LQ5ul-0_47%jY})WtT7BftCrI?o9Ie3l`)%g;4p9zvdqjzekak3U zLGJR=WL?SrQZ5^38svpp;h^r~m!mbzI>1>$^AMX8TMN=WO=rbZ=JoYx!@&Xpzj6gn zSn=G*KMJg-uHiX5;_P^J*nDsQH%w&aUu;+^4oOplmyn!`h0g)I85zobtuzRzk@`Qe- zJB+#=NOLHrOv%fM=Iq$IBNb3DCi`@wZP%uyu}vqLPY>=%#oH!|tF&CILa*^qCE-GLirb2}kpp}{x?WZ;gv?iGYoG{c^lR<=ELN!= zr4>fOy~A=jnhsRbI7=hb^(xss-x9*k`APw+RPNW##AsvD`G(rxtq zZWAG3%!wNo*A{&2Pa8pbYm`cX7%cQ-t+=m9N~qmaUNH-FV8ayr7IZ4APrOu==0WBA zu+sExye|^~N*$6ZY&L?46Y)yUNHYp4P+g4MS(*{@4lMrX=oRtXbaEh94hh0Gn;D)s z`nc1B;@+-gRSy`~%r-u!_cm+$0Cs7e@sqa~7MYh@4EdKjuV&?<-d@ro0W)t*)9-vZ zGI-KtqF`9m7H{unF-jI7m0Yi6a}tqvEJbx_wSun ztT3c-;Wd|hLT>-GF+#TIP!QLluT(@tbbvQO`p>%WovJ_zwvleK)Ikl>IFxCJyZ2e$ zbmeVCYgs&A-R}nAx-L3T)Yy)szLR5bLTldEg?Qc7`>d#ZLy9nj2yQV&Fyu5`C5b|I z9{@7%_#X~0Fq=TMQ-xYIBxQ2^o>$=ngbWgIt$pAF?8EEMYzVRADyRC&#R~a z&CM$w2HVjr5F)bqL^}JWTL~km zl;T$Qz-O*Sba)wuqbH!3DdH||Aw5-y*uj)a;NeE-87b9&5Gd%w;_9HrI%_i>Bo787 ztgX;$mZ7_VkD(WU_#8;mf0MDB68{lo>PCl#qapKAk{|)Ijlu%LzvK~$>_vcVSln3- zPkCXdy>xsB;Yt(QpVNj{6^lN# zEyb0FR8=m?(bl*Mdlu0vAuO)u{yt@SOiwNGi$jg_ruD59SJ0uD zJ!wLZk|mQ&Z_cAtg?+`CGB$C%4wAKEKGf1YEqQa@i8RVp?V^6kXVZxUOG{{@u#Iz% zLf(6JX4SDfr4@wGjxkiRM1e{OnCCKf>_v9Ia~!fwi4o!Ys1E z<1pqZ=eLk?{zoAoZRW`08CjUkb&-_Eb#olfL*!td)QNTn)}uaOkx)o#id|KyG9~!} ze<|DjF)==a;e@4>i-`b3N1%M}m&2HSsnj->i-JIZ53RmlKN$`S3U>fkj3@ce?e=b` zc0QIPQftg`du*+c`Bo0semAI2KbnuAmYal~Y!3S|_c-nGofHscN#DFD>qc>kC$q0q zfv1PC)74|z5*}J?St)6UWIJ zO9}$QIu&v5FEAIl5)*~v^h5yV4H@k=le7qp#?tAlgPJmQ>YrmcP6-gsjNc>cczUwa zo5L%2E`tQ*Ot{~)^z$tE-8DUGK;C^a0l;ctBk&8XkZ?VByCkw5oH+f)pRcT7N`pt=H1Og69q5IZ<|m>M?&?#5sOkr7Q9gw2arv!VH+a=Ucjn z0$)Ed3hBYUP<%y2(Paax@A_g`h|^EomZ{*Gk(HDRAsq7@&<@8@TanFhKt2g6HdrF% zjL%DSGtx1uG@0M1S0vB0*u?}tlSeL-_SDwAy#MAbD>vu-SQN{OjaykjD_^ z5$6N@Q;^pf>aqDvg?K6RcIVXt+iJOTAGWueXgK}jB#$nJj)5fFpN~iqLoNRSO7ozC zl^r>LP(+D9oZD?aSFqRgGy3T|*=k)tg@8nm41r_)6zEOUh|N;_)Yjn1AP-i`s?~@3 z10i1%225=hM>1BLuc^FYs66Qi$-pcc=O;!1<$(pSG5xWIghO@f={J#YZ-G)mO|3VN zcrE?L>yi zqeg}Qi7BhfxUbc$8I8b8ifsx$IPoc&0@FAbPVMM=Bg^?`dLIk)Wne#LcnCEDe$L{$ ze*r5CYB{dy8)mI}_9jC2JR+yyNUshn(y=8ZKa7)#2JHe0&_FC?Fy~?gaJ_o&;);379Gd_9bF(kf$PmHK^>lJ$;9kw zRevQ=~QAId1H)mll8FnPI{p{uY9$W)b~JPXt#e zDBz_w2d!-Jlt31cbEBg4yG*efP@Q>b(xawLv-H4%B!_9*SjM30o50)bGdpx8@!F#s zck=m09g4{{Cd6SJ{28V!Ybpjh6;2Al6hxvyQ#7lZz__(~W$GQZNIA(1-u+_MbJO?M zBZHAEd#`#6man&fcbcY1qAsi$=)Y8W4Pwg!sm(%|_8eIGBwVUm`97{zJm75fq!c{A z?Z3amiXR#kRrL|Y0%B?`L#Pt;VDOLSU8=IbL{zf$U$Nw;jKF6TDCbiQ>OP@TwrQJ*4ykR^^z$u4d4n~nP<$a^9X_CbZDYG@nUF_lN^W%%{z}LuS!fT zU*bHWgN}AMtfpxDh|&3k09bx#Q!G(pT%VYuir@Q0W2mW6tjXZ;s+}PLe1u#3R@?rg z?6Cs78hEe@y{*;bGTwE(r_T}dMP9_CP<8Z-NrUKhHov7*+jKC`uc7dk;d+BGbB}8s zTlwR3!;Qp-Ze)mitiD>IHsDf6{si~m#RAAcWiM_GYawEO=aR(@_31qR%JUvytpS+< z2_7+e0TdxS3icSmL6F_{w`caP1r>&Ae@f!(pnfGI7>xKs%*Ebh=Fs4Nf_V)0J{pNE=b- zi2K^G>wRJqgU*03*I!i#R`fOYf^*~X&M+%&#)4?_gAo}q0ZRz0xnBFDkiUEw^Jf!+ z>;E-4O&wJU2NGGB-IGK3Lqco5R6Rx8RbaEufg0}4St_z+vKmKzCLuv>hx|xuF&0jI zn_*u%sb`fhj@g5+FX>QB@X_D~AHOi^(eij-L~iT|Z^OA!nTT=$=VvQ}Cmd7hCRwMw z$Ug28Born>(L8u=Mp4i=aG@Vwpr9TX4jlm7nb1#lAg&BJGSE(SatW@MLq+V`IU|Cl zo`Bj5Cb{1Nj^h^9vqYE~$HX=7TRbv%^{9;r{~~-e&jfcicV^kF2=TEjRcJ+I#Y+kC zoWPRmFt=%UpSNfNB3QVF*k_sl9Sx6m!Q>mHX#qEZ!~i9^SEn8`DIOQEEcnO!dPVDR zPp-z0rz>YE^ZPR%b%LJwUk7tG7It@{6`>CWh`1^ z>xlP2cQis!qBpK?{h>R9tPp|yP}FEzgfz2-Nb(b^A++t`l?>ec6|wOUXhnxqAbcEX zg|dA^8!8fn3ZcNJViwUjn_(VAqGgxaVCDLQ(x^H#XogRY-PhnaS$O)GOgRxoe%WrChagP*aATcg zq;^#-WZsyan>Rv;eKE)2TUItwv#~omY-vvuD+ohclnY;{62ghcXsQd`qL!4vf!_2P zMe@bPhO0T4U~QoG!`T08tVos?aC;f0%r!Z@eGXXK{!+W z`9>&5tC482{nX(g^b7)|fuY$8OU350h;bq0!rh|aAjG7f3D`oIv#s$(A4# zLgH{ku7yG}X=A9`yUR0s54xise5PeA5UOqWBoWQr7~n9mgU%M`tfx=o{UvT&$WqxsTYH(a=EK!ZL!63b28KJZ4nhJhXRe#i5p(y_Zi2iWAu+*KB zYA@UyO^9nFxyTCXUTE4w3|v6IMy?y6?9fBwx7Ivi#5pHTv3k2_6RT!aGVh~XypQPy zDL7t{t0`@?JPQ5E2=IYuuG(7RPc~^_uf|e7-rok{XidlDiLSOi*I1k<+B6*ur*4uQ z!x_QW;smldz)Gzno%wqsT$>qEY$})+XLfrnIS&^Y5~Hqo`IM)qpo`p9ZO3T}+$p_5 zQ@z>2?$U3Yd{odoM*)I)zO{Q!#~x_a1S`Bk4pM}zUBptK)Juk{<{l?y_+$x1{6sGf zVGRmU2eHg|duEWEe9Mlz?Ig+ECXDRdCFXiz<$j%fg@Y3Hry~%5#_fUH-%kBDUwioy zgtld0G%C}RGm3LenP4>OM|wiz;VddrfG8rMH6(Ur(DzyTpwV^>n9ikyn&Q%f)cb>0 z{_cv&xU@1U1k^%Egoao&jo%|`Z1rLxOq9TfzT|3^3**LWd{nSpd&w2ktL!olb)%-E~H7i z&xp;mJM5#ynQx!Sig;ysqgIHQGs{D#G|vpPB#LLenwR*47-%?aF?My*TWBeG{wzm_ z1lEx4SeCT6!NdDuPQuEm*O5@c=tDxZUwA?$D*0`YYA>ol}5#kDjAiR2=A3T5$3+Q zx>3#q)sWF?kI#^zg~V!Ccap>oyyP&grc5coWIXgw- zbx&I4*ii5&u%e3?B95-Mxqo{Yiq&DS)fmTx1B6&_Xr6=-=8;?_Rg&5!s|xJ|fQ;*h zT)iaBxodvZ%ml-PH|<%TCDYsH6Zs9(L3utM?CVJq7aVs zv5NuTeA7|jL-~(vn%>T*=bLIBA_(GT)1q+8JZBe?455CU`Xv47h0ly71`z*LK&^SD zL)btFkCRfL;G-p^Bs4^S8PqT7Oh*^`J7TNqUQ5xMFbGKnfq{?XnNjR$v*u&Zk3}AHUhrsMpGoEPtmZUGu?gS|7f*|D zL`06z8$s18VV-G?e5LsH@EIpyt1B+ji;3H}+aTiKO zVF$^cBg0U)Nln48w2kFIpLp;k@ujH{hO&x4>fGZxFO7-z28_o#w-D0eO(ufkCs&=J zmb(H~q$+5gj9#t!0B3~Sk{%}rZWA#5B*KFLB4N0wDg^61wi!c*zIU+LLiOG%4%3e?9JsiL6 zgeO92j2Bg>Nvb(8RjErszi-Kf*To>mY%5g>#6ntAy{jV}kqvwNDEH-yeyehmnK@1Imup zxV?|-7KeQQ=TP&dQ;e&O4g94xx+e^~Lg%+9j)j7N$Eni+1OBhyQx5w5ZvKBY3hlZyep1&R6wrODcsO6`X?Urq57^xs(eb@E;Qui=f5iXU<1gNHdoAeyIGrQA2)Ky+ zx&MLuzhu#BGKXtnSRf!0Mj#;U|3wy+akjD$wz4&HHFGwy{V!B>H`~VH7bhTGARz!8 z<3p@p2Sa(vyH}80F2_*0VzSI?i4A5f-J~u4G%0oS*7*D5fjasriAQDDIOuOgHn;E7 zL$Ab9QgZ9Q#Kyf$@&wC?_t%ip{v!@+J7u)ncY^;9(^Sl!i85_If%nQ&RRM4RQ%O+F z*-8ls?}*Am%+yko&k20-))Lcr=BrT%^k+6%!T{+^Wn_zG6u$epd6H<2R(DZ~?YDc< ziDeeAsZzU$E9b%y=IKT6rl=OLXwMUtTnYO05!M``41RtLCK-4!$``8%h{6SJ)*sDl zFSZyKRa#?F44-Kw?lVY-agTH6c^B>%a{YVOJw5^26e^w%=B)7=UU8-Pb=pjZBdnR^ zyw~h9XA%{m29;_8bg6Fa;!FVX@0x*8EqRg2Kk%#G%FQ9ma9m15w5F7LEi5^#fAEgR z6fK@JVN{`RJi?RFHS|kuF71%fXK%>0mc7T%xf0G6W)M;e8M_BM`3Aas#3+sv&c9FI z-%Wi#oFos8la{w$$pFezE8ba(X4Z5u>SOWb3ut@!dIk9_D)RnaoxPo3leE44op=Si zJB1q>8|PqsJYD^LoP9mKUE+Uk>-Y6`bN?cBN13Quk%ItwYM*kg`O8`hTRJ0?&GZ2W zBz>z~bIx2MG3R9E8NS#Q46GASaw~st7xd=My1h^8m6WP%5_XdVcm}%P(ev^R4Ep$t zA_jD04T@%ZI^F|;EgCit=cYbbT)o@^{M;YkNMLsidb|0~Tpj*B7YpOcH62M#Pb@iJ zZtgDDyI&2Mrc@tnq1sLvET_EK6uPySZF1|5 z%3AD}?`Y|8z4QOTc?U_{-4nX{p>%Hw+!oTu;i1YxjPl_x&PfL&U_U_+alynxLG%5* zo@e5+@w85MpcHsZEk-6-o>3a-8wFq!{hNz4%F(0r6C?TU zAqgpv;92gvXEy5$mPPZ+Vpi%!%f;SgsgBa6ic3z-Ol!wRDsbsC`tNmFYWg z{3=?H^t-^UaqD^}_Ynk{iMMpO*B%ZEonx6Knp8jkb;tmONpO@Gp;W5eDcp3k-*O2QfpZ&N$sZ ze?J%T{XKeyy;z&=>0NEMw4Rr4fyJ0)-ZO#wjL^LUisy@$Eu^oVFN&}6Pxev|I9jb zOD&`xGoZRRSMuMaRqk7p&%Y;WCiG+KsS!W|PRt z?BA)VA@jQ``*YN0y$V<{dunyx)W3KT zSB_?VV`&{}SE&5ahdXL&3}8*Fv8ST_f3 z*S|hIiT84@YkEcFw)*jr9*p!n;HsFFK+Yg4_5R{OR=AUBu+_iYigiA;y zW3xYbH76gp^HlK~3uFQ#+EJ$z=ciFH79(M_`FAj%r!oc ztK6F2Gopd{;7+3|$;7<^H1Y-1oX4AEG%E1< z<7zbcitre9N|1X9$om{{x@JQ-F*Bj}`ol=FXtoq^Lq)+ip-ica$k3=HM#eMA%#h6)pkNU&?Jk6h2t|`b ztjMa_3wfw5uDBFj_K4;;aswh^Sut>r8h;~stq#F#f2S#wc0<{m}>j)|Xtabu%E`kpR(bLXDTkC=a!uFnl=va4>^8|vnfO0bO zz?n)sHTULd!Swn0zW{1(7>^MK(A=t3NW*}a18Mu5C(J$&c zMvi2UL~s^!IY+{>VGQT4(YmVn%FH!5!8)e@(nfHFbu82g1l@fP{AIXcXIS;`1{ny! z71*&5HV{3dJ|D*@PJqI}u!~i}3`O`I+j$J>6a4>icgfNQ$x|P&-9a$!Btq#uVs0LDteOrgE zZEX~nJ;YXvGlt>p??v=#-)N7yXOGqXWic7_m-$N$xigZNn z{FTHlRZ9EAzlCtXSjEOtNI3lvL`?PS74 zi;-g1j4|TO1V;~$orNEJEyChRt{jac1<4BSJ-q(6hysxxD$G9r+)-u1&2=W}lG&4L zMBz-mF>`G>UZ418-<0xYwL+5L$j=f; zV+pVxhi6IeFsel1m{U8A$dcJ-I+bC)P21-DTQFEzGBXEeO+Oc7amZ<$Moj;CYe(Tz z(mIWrQ8;7~N~PXpzxGAM#1qqz& zAhH+nK;kcf{kPTmZ>V|>wb5y1U{7`g2f=p_3i`SQ>lu=^+8r-b|Be;PXru&S25 zjc*$1?gr_Ul9om~q`RcMTNHPMA%ejJ{b3b_Y^YTac{MI|Y zW(~9HG5j)w$UY#$Yv*cWj_ev&+h=th@hpiLNDFe#MyeXSGF6zhKcRZsC|FQ~-De!u z&dbyQ|HK#z#D_0TYTT{?n<*GV9)v79bnOMzkJQs%II8C9_E3^}TPY&odCqEdxtPgJ zrS>xrVbn~N7h7UPmw8NVY^<2=N6&f0qpQC6hOJ#wi|{NBR78ryFBE+FCc+;*4(qf5 zLl8tC8{zSx>aB6uS9MZ}c}M)q50VW!teVw>^&;k&xiZR3a3asU>Sgu6r6BQiHEJ&UQTX?n#9s?U)>0M;10IKhim96;v%let0NN}RmW7NB7o~Qyx?4N%yLi2Gc623ta}0Y1_o)i3 zE0p&;_y9g4mJEO4JT7rV^4$I<3_)EwF;qtk@Z6^eD{tDNdOWz72{R6X%hzXD4o+gb zyTn!^JV;BRl=H_{41vv`oQCW0$1kcFgiOoMSqos9g>T zL)kTVYc7ITefV z97D`{=6D07Eh(A+WDy|=hn(rTgdJpKRS!hKa=w<;2>i3zpmFFRo7QC)?D{1dyGk2O zHd0$&_6BUtQ)c&SCJX2$EO~lA73~+u-i-e8{6yl#dsek%Dv1O+#D0{9#A|}~b!j!t z>lG$qb3I~2H3XzdI-ttVdySc)%`H!ej{>xL$G;{jQc|M9CaaK-fKlp5{KOW(PxKoJ zWh7?Q#N*R=*PM_|8U_lZXzu;Y)c{F$ubb6m6jzZ_gn-e9O!UaJ1_$oi0Cb^kjaLXg z{E&V~wEJV90(eJO2505l_~+JxxTy*1I0`P{6+%!y2EQlQ878MmghqO0qjh&`8!8=jIYg;X6=`u6^ zQd!^Q_Ol1Y=No2vi5L2l61s9(JU8f@t4U9A{SVBY%V8L6CaYQ8ji$_@Z(?-OutnBp zx8@WG-{xvP^K{`^4`(7z3Ejrx^y6Z$T>TI|Ui|La=qqP(QDFfdk~kj-GV>=5M*Zty z*ybz7Xu1&W2jw9dAStwmgf*xqA%Mw$a3OIUw#`gh+j%P48dnz)uPCe#yYjzLfa7 z;Xqz5C(xp?C!Eo{GKedTQjiv*#~eyAU4nZ=j{08CszPGWEv*5phAxuNQWt)BoHosu z=}r5PhO+Yr2s4xq8*tHt)*!qROS^ch3sIxUgbVwfnY|7Na+akv$;WUdYGIT!B>E#n zX)02Tlq9t{x>b`D(2tPNg`-_;SgGo=R&f%f*)4-gI2};ZA55N4A-FiHX3O!duuQpi zc{jW8(u!H>7LggzViL1be<9+f&k@OO4jmREj}u=0j55guMx0CdW&b&S$GTEm?kjn9 z0^na7Tnc^dZ$$JpGK9#(6xs+WKV`P`ih{A)Nh3)F-!x<74~1P(;Wpzq4Tfp@+G1sJ zIv~J)_0+ZVBT-Q?tQE!3G`tyNQIY8Q#4Gof{%jL}&oM%w*Y&M^wWVY2l4Sw3fg4Zt zVew65nam8-NCD;c;~QXBydnh`A1X&Ygxrae26tyzHHBgV?MXbhzw`HbY%<#UAyQ*`$ST>bc}E09nV zytvK2^94fL8uz5(AYrevGn36s7Y=n z-<_Iq1%}v^dW`Txi>zW#eSOmM)n)-82P{LNx+2mMHB@OG$^Ef$ltqsr@M7S(tC6Tc%z?hWj zH--?|1EKW5&Uz8Gt@$`%1Yn%6Y2Ls3e&tQ7(iZI;Zbe$+M~KpgX}-Y5xqpTj4c6JR zi7nnP0pSA$?M?Z8m?G1uecfzctE|Q8Ii#=oYtN@fGm=dH9ZS(2WA!9E>E4a|W1om@ z!%)Xc4vn8E7M(WRSXZrtGINm7xfj}#z#Sd%gA_-1kS>jkyZLP4x%)1taAUK}Q6wE_ z3&DjS6_&xj{|YjPw7^x?!%41pA)#c=;GaF7q?9KTRIe2=$WNY#uNT%0<^5RwcMu)eWJAH<;{;N?KL*k@HdF z=r&2qhDlC9WT*bzucy+fQ3EOr!h-%n0pWuHagPEen^YvzM@`iAYO^+jenjQTw~|{Q z6w67beC$0GqQnyD48KN|BaKaDmBM{DR4RZyCjj?|EI_CR-NyGP4l+KC3BV4)rC=%i z=T=2#4E0cPFdT*V(eC4fW-xSxG4D5E-qB}ltQfZn!5JaAFprz%iKWtZ zyB4o5^=X?+)08Ir94###%JrrvnzYVam8iE%amN4r7EAQnZx|t0X||l&+?tm%o`dY- zbb&XTv}4Favin6VbpEsqv%VNrTltjvS_gR>M3`3ukw8KVbw^u9b2bLgYYJ#$+7w-a zFrDMWmXiGJ+<>Eieo57;cm6Ao?1Ak{!R1?Fb#rQ-O~88>H(FZc12L@h(CUeD-4 zQi35_x>JnOIQn0%a)+>m={Mx5T#(_3di%i=y)O~_t#~D&Kiv_sBbRUB2tLp6#dsafP+RG-7%)RB z_jC>NfbvOpxJCQK^={sQ%Zik3a?BXlcFEjkHG+^4G=ujXyxwrqx~)P}jd`D`#sGHE z)Ju)BX*ayp7Xl81F_Qsj(f;h7CcI;4VT?xAUT!o!KYDy3=^`>~txT~xK(LAo1$Sf28XuGk=7Ge^JqrIbyWr*$OH z=l90Ti*OguNzjuhEERHn2nnElm^2|}G$xdAE4=z?m9fSYvr0fu-iIKGeHjq9Nk*|` z4#p7_>P57kMzNH5PZXtujJcEZPRLa(TpSVQi&Tmv8Nl(`R|In3KuGn3%a&|&ZgG`i zd=*ah;>(tmVMAIosCe&M#sUo6xRPyrmFA4z&r@A-y6EQPk>(Wd_{%z~1ev={R;mLw ztqv#cwP)ginpDBCo4aXcU#1y;am5I)7x#i9oel&Ml7l!;T!3s#@d-g_p&1_~v1NrC zC2^snngC2~jd^g2QW%(G{q`c36W4P%O`*dZ^|zgb<8+W;bI2yiMZcG4A50yEjTe1z zZCJ@qn43{;JS9*y$<5nU$UA(kmOqk7thH_m{=;-sJ|BIaho;REL!S@+JE4BnXn`5| zXpv&GG+w@%u;-L!#bJ&b+LXzp=`OXpOSzI-Rj8%|O~jZaY(itUbzCO4$%<*LBE4>V zfEuK@IOaRqX&(zTijWd$GMx=(V#i(WiauOPT?Y-1A>rU7>%itN;WZ(JBi8gfs zg!UpYbrQY%mcNx$KZcC<)&7dada=*7utylrER4ev*Amr01tLv+;|UC5^_;NmXOTvG zqx?ve`iwrzZ*!ru#fTHR98DRUt|0Y}lMVgO;iB-{X`8Vq5%S6Nx&BZ=nC>s?O1oz@ z0`$puiKovivrd_LuY~&&pZ=(t440qXG%ptGNJ6u2r(=6!Lb`)MVu_{(m$0KlCP`d$ zRU-e@AouMwjpznGjMfQDVOiY7hm?sAFU(7mRrwg@2 zRoO~$80QLJTpWZuWp#KGDN0f2xPz<@|I(miEJY*`ildOo$&PeSOg}7ht^M_zZ(^W{ zE&?D#5Z^>OU<4RS8o!)?F_LaHDbu5&exskDS7JeVA~H!&qxz0NJZl20ZzguxwP31D zJhYD<23216kb)|*4CQk;jDGO>K-uD+xzK2f1qTY4U41tdfYqH2FQ@|M>gyId>AuJT z6szo~ai;jnq+q8)CdPdwR=5E2;ObM^CR!Zfoafe|SN6W>FUgO;EJ6D^i*HCw*XJAT zc9|AF*Sv&kaYFxMio>V+-6&$^s;9l8} zPaE4#e(!BhoMobojnt9K^C34))e_i3+h>Pxr^Ro{LGx;b5MvvFo8!M;`* zELD2JX{`G)P|ItS!B}`yfO^2GL4>78N9LX7Gy7JzzCDWJCt4 zP?f+(?8JORo>wO6synvPv$(Uh4fr$aVj7n2)u)IF%M@+Zmm6kV+>~aGj5cYypqbXa zjewzCdk&U;>7Z@v_%`Z{D?3#9W+qS`)izYTBzIGdNoW8bpCfs)QOZa?y!`lUloFF@ zX;2@D0J@xkFYRo17Ru$Rl_MfcS*O0On?UUmb`Xu3nh`DrbtAsQd{}OxCoK9^;N?$* zkt&5DRt{EiD_F&$$T8EEs62;b$@~~pCbPEC-9WYrWYp`(SYgGff|8Y23;Kbr#h(gZ zQ4tj=Kixu$q(^j?N1#O58xw#T579`jauDFG{1lx`u|D|OC?)}fNXMfgF0%Z&LIi^@ zy^uKiXQl|h5D6&hu`Kdy*Q6cLp8at%MmO^IQZktYE-_UamP-NU8OUbVoEq7#py4c5 ztCOe(p%DEkO9OwF0N$3>WSCOuJ{-*1U@VoNA0!xiRt#MkFPMPW9e71wuI zneg$x(@&and9e*i9o%fseqyqc<=UzkCMSB90CJH{r`=QQ{K>qu@lDkMOIYae5ml0Z zQ7<$}$779hRV#Vp`*`s*9Z;JDrJouV+iVnm&8YqhxVzJFS_=ZR_dmFLbiNc(@sUPUq-; zxgYMlO&%BvuK~@M$msTA68!p!)HR<&vvy?}4I-$-2=5!Ag3TmXQL<0LrkbcpA;?i1 zly;F%W9Y##*Yi&Ze8@(AgqnV*ql02AaGv!KVGVD89XXX&;1hJ?$n({hk5cuZB>3ed zngk|qfo)v=YAHiz z^&R7HKyMt{oQ^|oZ1#!|u1XSabop+sIInYX2@Mh>Q{9)gf59!`%+u#_$-U?%C;J6EUJbxXL1^XoL8q1 zP3OSf%r=@EtyP;w980Cfr|2I&uwpScx5KJxald&Ls>vTXdG??zp;U_y8ez9p^6YY6 z1~)BdU8Y+0mW8p{QRdAvk4A?-H%lard##K8@dAP{`J3`V#80(KX-*@hYdX_!v*jMS z9U_Sz>pWZ3XL~R%jJIBOSkTbZcu|eUyQNSS(nPSGJABynTH3OA*|>C3+>^i9W={Yf z+kCVL7uY>o#h>1AuoEO4wb_ucVw!x+#Ubq0Jt}d!sWf^m8f;ROep<(?S9R@B*jrW* zht9X<4g4hg-tnKtZJRTysaE@waobAC7)^o`@`vi*yqwC?--e9V6!RUpbdX_Sk6H1S zbJVeFX^cT792YBb7EKWlOe|lh2`{GdM0nzzT%#wuoMbE|p!Jq^s>fapu4b1J=*7B{ z7w4oka4O2+I^pjeWQ;D^C3g_MG^^Wf{rIW0&Q(b}!PcNEBArj-@NE*`r5NW8y3l)$ zzB<0$%N6ts`kMuP6!|m0FRThz`gJ&)uoYHRO$)v!OYitjJ;4(Sybd)XyjI)NseKMs zYNW1gJ(aUe6)(mom4of@6oSnWBRU$l2$%LMPAIPj>FX5;luky^Z9BG}t8dp`KfU?c zrB(k~V57w_AH<7xInFFd$t$?2ESR*Ob9R$q9LeV`eUN)bp2nAyM1bspLHL1y0h{2lMdy+x4y z{dQc$;%4T31a5GGG}q-tR%e7cUnq{71S4(4`ty~^K&M6BrKYyFt^Lb{lXQ+3*G|r> zFm?eoZFqY0JNrGXt9W)199sSs zvY38ygrOEP)pwU4DkH@4%C|_s$irbgt8Kt=`r5-DpL5UMo{$qsvwE4({wXKwY%qdw zg5}xXV8yzIJp(6}W~j91^5E#Yxjj24o@Qe*;kv6mZ!IC=8-`|z`h!y#cgRLCLLY{f zkH7%O9ib75(2rqi1Iitp7k1tsu`OY7*wNXYpb?Sqv=eiV*Cw#jXo>3}<5b=~Z<_m5 z!<~T_OItGi3f_trcYcR}Fq~oj>|;9nlYTF#(;H1vKU)s3O2guhlU-}`yM&0-Kb6PP zs`l0lPt~Q%9lRQwAm2dJ?s%5VOndH6irA>n@AGa<4ZgQpI~+bHZ20C7_B?0GG)k+n zDa%G8S$XheHI;l`jmFvNA_|G#Fv189dq-@5_VfF})6!a-xAQz0$K%kU{AT2B(={?N zL>tiv#x&srqUR^90jcBrmG7pElR^g~RkI>8+e7gQuv@ObY<}yq$cpbM=JHU`=xi$D z57O3p$GP0tfqd1stQH8Z_W~0a=f;@5TRYmcFk0rF8)uYxZ_3drECKfGv(odgA0d?+ zI!{Ut=-3!UmJw%n4Bnrbsa&07kZC#`PYI5nGViFa`QAX>gkD*eww$jV;&d)H2AD+i ziQ0FfHyxO%V{_G2d2YNs%s$P2fA;ZU=SyqhcCl_Vu7`RP)-khZ%4+z&z$x$XIOBpv zLNr%*t~K8{QJJRVnPA!+OGW2akc6$#=%^sCxqE_=K(e-r=lCQd_wv`CpskZLDPB!w zcpP_yQTtC3s|pm;M`f?VkCMN}3tq*@j8=*RKkDV^8yI(4x3-!VlvVd8QN>LcgO%rp z-l1&c8=nX^YIME}&(iDRZ`7Y`f)}#Pk!($rz1S*QUhw_kdVBNARaq*UfjZaNqXd_< z-84Wc;UW+N zu==HOR;wXWic<6SV;qyyENWMb&d=8qU0IX{dQCGDbjrzfOn9YC!k1ly8~!G2Jv`&a zecubJlH<8<78#sF)W^?PWG6KoJ>>GfH-GfX^PAYk*-S(H)`+pS(%6xB7Jm>pR@E3= zpJbVX?iod_eT|_>BR*_i_I%L1b1gaAXBRMpI#JgvaBB_5g(yw}){0pwl6-$IJA_gF{vi z>G?LW{nkFnW}1DtdN9Nm2`=t>$o>|$eWLp6I!Hg|Chm)UdTuy|wqYyodW8PAiyn~G zR)l^H-9ARAM!WSSi8?c}RUEtUnoc|e`dxE8yEu;S8AAl-1g9v;BvoY0!(ZCUvPs_XRjSheN}e8Bz#aW)V^2y=H6k(={pJ{KYW zTl!f|-z>AinsqIE#@f@|mL45d3`zjehDjx~}phg1#kbilmtstr(fBQVULB&F0`8mq9q^B^$ z#TUp>0Z{*@`#s1Oe`UD58h(9g%P1 zk;%{Q85}&lIo-g=uOW0ks2Na=3;8ni2J?&&Co~-FRQapHhhem$*ddzNeoEFYaf>c* zGAaG+s9LDeBY*m=(GUa{tL=I2T2eHf@P!2B`~M3MZF;h4Th19yPJSRLZ9)EWk0zM=1p_N7&T zM4pn<@S%96`#gl7qNIyMnU{`KxumjBFsTg;+!cDIF+ZzcF)2VE8;wD% z#BL_;wY^>O;Stv|>wQKlf8gheOs@{bac&SH0OPwsbqJO#ODQT?o$?IbMujm$;M;lN z^iPJhack{;llleJsGmV8gWn8Xoj??X`(SVtX9|ud->u+%D+o$NGX;^Px2NxU2Cv(Q z2C*RHXXo9`_JL1AWD&gCy7z^WvM$J%=oM^hdrcKKCAD^geYtoSOFGdS`U1Cd9%Kj+ zK|PjeMk={r;rSqGNC;4x-0!GL6GL9K@E;7z3&M20$pog*A<2!H_O{4Cyw`-ja97%h zH|!d@hN&xrLF;{U_osLdts8*+-AryDppT4JO>YPnf!BD@1E^x;AO#;KWq?bqkjEj} z3_NSwK_eg5F0#yFX=tpiscmcu@J>y+v7~65D`|rsWYW$I&W^W{==4`2A0Il9TNp$W zDF`x7RY4{W=EvuAi@ z0wkl~B_={_(g!L`;n}XeH+CJtM(eVyY$v))HM`wpT4Z zJ(&ZAOkdZw!?kIeUVHzHvEC0&=MqrT?eS`h_*$cuXc!avv=zA}2Apd1*@D>eXD+yY zxsQkNP)gHXV1XzCIrhOXI}xZt9Q|gVz>v}-hk0;{oR%S~yptdgHrxJA+uHqtOhpj- z!&r%s)6t@ER0dXp3bMFDQ)}uD;a430L#M|Q@#^!d5|HV0;vR(=Z>4R)|-d^wH%veCMCJq+r?xZ{VL!z=Zy{Fxz> zM?2fEU74GFGwR&pCpc}VE!}vM%XglqBga!{hH_I(oi;SNx>?rq1~QqKsOm$cRmWF#vO zTNq@aPd_M0*K<#lJM9ub&vIZrPlc?ZX)ZLcubh!7v{0+MWu%}@<$G9xE9VxgdQFA= zLiE}faD-i08bXAYkbKwLgDZ@7_+3f)RaRH1Fn>V0C<GEt0be1tq-XW%tVdkW{TfLJ=rd+ShrpqdaZL45bJH^cJuGaWQQ;|Zar6QAMh7vb}^MR3Ny$WvsH?S&6&xp2`z+prRusOn%N~*MG`7JB0 znD!?GJh{2%G0k^2^XRmISuAD;-|#eX}2Q^y7nZXNuwrF(Ire^+P7D zgS6a0AeATUs~4HF48ftOyHICOGO2o9S{FgIyGO~|i0?A}9V3*0AnnMH|2(zKr~W2j z9B(%p)K18}MHG{)QpGH6goSGaX3XdMQYi! z5~F#4glK$4-?8#E)H1q=`qEPe|@`Bwo!52!CnyDP%aq5{Eha#!2>3{YzdxbZt z+#Ei5F((t$DOFCq{7W9;ZeE=PiL+FLYq2Y#2>ua8{&nTK^nTsu*4}|<_3~_Z3;Ooz z)m+`?DA%a(Y7_eA@{hiS^xVDg*B)KdHg-ZyG9HKQfBob1LhAW2m#YaeL!odZX=K(4;4Lm(x*iioagISFFM|Wl527zr@nD5ScexbPC$dW(ZT5a zxgM4&nMxV|QJPyl^t;UhRiAzCNI1@>ncld$+hwiR_^afxaBX~(n5^ZjW#rKjG`;6` zB-W{NVy*BC`S|iMayp$fC`07tJ`kb7h{UPyBL=YP^kAgn+S4idy8!h%OB1+kRr?ey ze$FDqIT@JzIzL-3=FqWN-dgYQ9GQq|V9|;cF~1%QV9xOr@)lw=iW!6}!?UPf)+!K{DN4)0bDLiS4&%1)x*YaI3;Ka~muc`cydXln(Y^<7}VrjpoVn)*n zY7qE-Cf$6%@q;!|-;x=n%v?Eqt2L;VB=fknkP&(YZhUr8_{J1^XAWMYN~&xYcaFuz zjvLlGj@|@x#o2D0-$0U%%(K2_0lU?(le^(X%<;?dbp$IFn6+8mVtrNXIra>A-%5_{ zG%aikR7mC3_f`%DfRLerA-L}?dR8FwWzRNwe>NLADtxw*Ie!DdI^P%U+;)Ita~Rr5ZE4=#?k!18Wo9d% zBIMFp-#)5!W2=9otsG}a$`HN=in*`YijO3 z_F1~66mO4KI3_s*9boEyA`D@V`cJMb1CD;iM(YCzedw1$dK{I^qANxK1YswN85^9 zj&iy#Mz4}8249n+&j@^8ZZCr3SKAYcT;8`<>Fx18Lq^jZDuDl+Da3aXh%QQ$F@FoD zB+ZwDK73X>axBoMB=!v7TPvkIjAxfXJmQOM6_C@Xhr`Od0jeV%bO2WDR;osmWTvqeP-RZEs z=nOC7Ff=}9_@QZDm{+QvpMT)QK4&-B069=a|6=4&eY)NbvHW5{Tdp|Dnv%89!)=#Ec{W?uz#(yhp;1{-;OGVyVnE z%{J1T5iw(Je=d~T4?CTJ2~ap&!mW2@g|uf z5TVc9*15=+x+fjAKf%6@AJ10hd_OtG-#ga$aWarqecG%N_-7|OF1=$~3#8S zMcP2zsD?{n8}dakC{=>QXHfkFXS>&hI@CRy5KY$Y;wVpjodYx8W;!oGSSN1sefU8c z+PuOfR$X)D{)MHbJd4O*c2K0VS2hqNo@qh zt*?if!KiPUY2{hy+1!&el)MVt6^j}rhWF<9!qfW+wk|7vQJ-xyk1Tanu5-2vjz8H9 zmRLBp%qt~_z16&!RIAqw2{`)Mn#Y2P30qDP^tF9b(ovlt)CD@kEwKQ9mF~({BdsVE zNy7-aWPxCR2;q6)KvfnPtTXKH6~0Q3?;8dtzh>2K5(H^*Xt`rB(1}xt&PIyKKJ_1f zOxD04sAME}^%-}pnHTAS#6=zp1c-^SS+lJUw57XT7$*VHw$A@FEg{7-lg1DL8Rug-w0?eMD2t79w? z_T@qAAtnHM3Pl`wWZ4&K;Ha|N(dk3)(vHV23Cq}7h`=Q7^u(-kt$GE+=@^R?tb2a$ zreeq5!|G{i0Hv~W)*Ep?hrqUoHyJW~jvcr2Q#ux8oRz%^5Q=fLGl0s97*u{LSx3)fH$jwcR0RBDSoD12?xu4K`^ zie!iN4q^R(UXgFhF^vBWZOx7|))lf~e7Y(5u?5$6Iodh9{G3%kbMBLuwD~x-wz=_J0WeMP<4AVt zLsLex$5`HCLxQYZWeX|92Jm-4Pa&1EltggvSLX*cGj_d|D`ppe;kEfxCq$NGHI}qe z%B~nYj<(_2vMpApf+#kdaL^F>CgBsB19+jL8K&QP&Q!tR{I_H^cpKR2ndX?~c`EA5 zsuv}dTg%9{S72|ROz0P7wyWP5ZUq82uY3!ynibX-Sd%FdkgE)+hTxfm#&2L5oj0!X zv|5QA?=yubpFM4PQhppZz_E>;7^}W5{h{NShVe_byqtmyd{@R3;IrqKi9(l&Z%{

    fsDTaw8q>H!qb3=@&e_lFS8~5uSb%I1Hp78G@hKo*8=r4aRKA z8JsBLXIhkmB^1TNd?qQjd=V&+smi81MjbT$Mqfy)UcK5N2y(6@OQ7=&INaexu7=_$ z3QNtki0~dFL#eWea>Rt$SY4VUq20(LuJcah{?sDF!4z}5(%E#-&b*|#4KBBgx$TvD z5FJz@517;zU(f{E`3XfO_-P%II_Pm*kQAr0fO&{H*!5yNq#6pPE8Y~FWo3(&VclT$ z&u2F~s{5K>_xv-890fdE?OdzdESe|fM`Q<-uyM}HZoEZ3R#a*~mZj$i`OB8pSqSkY z)}08V8F&bNj38|40?P>&Bwgm%%MZ67!J!VIgsfAdU1FMQ9?aY?os$yq$U3<0;V zp0`4vcBGfVVf3ev=(WDOxuLhHOz7B#8oSok>KHi9b1m?y94(8M9j=&0*0OjCUo7RA z<|<=2;hKm-)a;^Hn`sKJ&mEp)BCNG8UJ3`s4P80}8pRU8U}F$S`qxTjS<-Zj{Cc=(YA%M3KcgdvRoA`^|}|W5gg7xUI^DYi;VM+cDUKHgiL;1-Pfal6~wBr>MoQ zeZ|d1qRPt)vo0ZOUJ=y#Ea}sm8pouymQ-13+dbsA7Pfsl_vw!>pD69At1 zJ2bE($f)wacCtoIvm+I!Sfw#;lYSp}W^<8m!di^Lg7I(9GblFS(63ZyB)`jojnzEQ8JB5VG-`L%R;rBhL0m=u)?H#;=pbLmfm230OBNaGNs9T0g&bqS+T zk~RUKIa$_*ka^TUy|PHl?M1C9FtuUS$1&ch9s;jlV-kKMa!nev-u}e_2|Q)4@I{QF zYz*bFM>Q-rd$RQ~z8I9bYIo-fKtbhgDiS8m4=hA@CE=brPJ;`QRf$lNDupvKA!1hM zmX4p4ghxLWvYbN+eB;M-Bx@uhOzFqWhvg^S6`%tRnH6GM+F!g{21jMdC`jYoqBZvo zyaD-Z+=c;;&;USA<)vC531%K5@aMl?(7>04wIjX0mE~(Ab31c7J7Zk~Lt8r@5)xSn z5KuzE-P-`bw*mj>-(N5Qvj6-{^dB{`w05w+O$G*V_d5^(7U09l`*i?d2IR5+ns&mY zw4wh_8wr>;CGcgZZ);+0Z^!U!%C0x$F(AN{@AVij?3Q$wGH|u}FKfV*ZD~7cBtZax z0nooDDZgH|^e-vv8|zvF4@S_oH?cPdPFhUueno*dWZouyuVOxT@vo>1Aj+Kc3#dB~ zgMt765I;Z-0x#g+go&kzy|%8UiHntmiS}y;OMQD2E6c}7R&e!{zues`vtjNZ-33bZ z{RDsk0I%@?z+C^;T`2e?((s}G}{Wi zOL$mIr$~Os3hCOK8Cq(K=-S!;X7ncYj(D%@GI#M~qn`|S8E}9^QY-*~;DJ#+VC{OG z#s49S$^FKgrzpO4c&`%Mf95fWE*lA*23A6+ilm)uhCl}hR^ ze(VzD>FP>1kgAIU01!T)zF_+U)lkpe!B$(yO7u6IN^+lXf%iJG_h(>3PMTRZurX5n zW>bvkAAvH!gJ(=E|8wTduhpk?=Z<=>(H(d3W1GzuU{gX6z^VhRwKNZGG6?^PYH4L+ zXQ=)6SvT5JhPuCZ6U5G?x0de}mFF&g47ZH9u($-~@gZ<9qI&?Z7ytjk4NU%kmkp}8 z#ow!!)PLgJLHEDISMQ37PB0L!0356zdIyvLf8nhR41X(b?&p=a@O#a@`ZL^CV?*9u z9XOaFg8)b#cpp{y9S*$Px3>cJjDphA+LFI9Pe`k7nfDqodUp+v^Lyjx(uaCR06;Pn z@Q4{z{_jkw-eKzcGgg?wI##l6x0F zW?C%2D;5XltsgLNDIVnQ-1YxpTD`XaLk0(U*WQ}F*HE>)_%T>vvNLr7n878$41Nf< zPy_j`Yy7oP75)PMp34$2b+_PqC0hP7xO7YvgAAC<^n#DU(INj2@b6h2@a7JDul}lc z@ngrcGMl}!Z$SXTmEey?`il?$53u6zm3ckI9Q8FuVuVz{<=F`iLCG z0QSH0TIqN47wCpt^1UYX{+UcLh9T1v3<4;x00)phs9s&`|4#mc-8`JeTj;$)F5F$j zW4k9vmsvhQyWP(~A3;ZLA^z3wADn9NH{C+-RUGFoehlS2XzCLHj!E*ss`YTFPo#nT z4f@L1{WN^->ZMbpLw-$lJitR9wl&Uf%hP1F_`~>_lJpvnpyL$yL)Y6yo(>Z zqv1|JcnPHC1KmCBf?YWOf%cEn3Xg?5#=S!K{+TH>36`d+4FD_?fIONdf(rc3RJ6W* zQh3|#J3sqF$Mn&o<<{!Gk_+6$kFAPNljmMN0{~cK9#2lwGX5v__im{dvh@~wuPyU` z#@3gn=qdppfcA+!#?FoWPwelVl1IcH_Flb>@8ZX988X5nfcr}TgBIWb@(0z(Y5#v> z|IkKpjoWVR-s=hNUHq84N57TOQ3U|7^MF3$(rH2e)?6MH?jM>d40XpX_g-bd+i&B? z+zYVkJs4m`c1HznCVSwQ9plMAa)th$v;OIZtD@tMeXm97ckyF(vU)#jG?3j0Y(xwX z*unV!lYKvZ{nG_V%XHqFz1MoQyZG@1*l@g7atF33YeJAmlSt#I|8@a)Gugi;RDWz) zU7TIF_i;+X_m)=E`t{cRy}H=n#gE;4hD>Rf0bAOsIXHm+LFxAl|G)8nXmJBc-){N$ zs%m=|Kju%x3p^VKwm3Ini+jlL=7;^4n*X5i|IqS6G`ny4_qs)L7eD4Zw-Der18<-B zfOjwtrvkfY|H8Kt{Zoy%((Ji~-fI@?UHmKbuVo@Aug?$`!27i(-pA0rn}31668aN# zrtuDPuk`tUhGGmDK}7=Fc`UG+l>RddfzSTUNwmB;>S6AO|!=72L=v6O@)1g3Soi& zugSkr%)c*GB_;IVqV6@B^)7ylTHqHq=79qMMuE2rxDQ&6$aCbsQG%}}wSg;Q1}3*F znZNlGCmOhg-K)XbpJ8sv;u_%4z%^Uoyz1d1QN7SV!L%h!?0>(#o$k0{@+TiV#-)o7;UHsU|mE2c7e0u=kI~K^Jg`io32LxdC zQ~7Hwc}~Yj$3n;STVd7o-vRDb>(ifs4-Xk81Foe1^+g1Hu}}UN`1_H=znXJr8oD)i zuk%mt;>YG59;@~%>+|>jvK}0=_A6$&?=IPUE&TXr%)_1TzheBsQ2ws$fA4$$6)`3_ zeCy<1+wkt<$4(w@x%(BN4f_k?_YHWz!cL;@5`V0ZVGnm_{0hrJeh7Q8SL0VyEaTnE z{k?`9{p#zV9w_~aQpHC3`|;ARDZe8-%=qj1#=S0L$NZ;>LI4-L001uFw>@x?F&y}Q H0O0=sf*dCY literal 0 HcmV?d00001 diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 87a19002..7049d912 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -481,10 +481,12 @@ "custom_buttons_info": "Execute Javascript code with custom buttons", "custom_buttons_edit": "Edit custom buttons", "custom_buttons_add": "Add custom button", - "custom_buttons_edit": "Add custom button", + "custom_buttons_delete": "Delete custom button", "custom_buttons_text": "Button text", + "custom_buttons_text_req": "Button text required", "custom_buttons_js_code": "Javascript code", + "custom_buttons_js_code_req": "Javascript code required", "custom_buttons_js_code_long": "Javascript code (on long press)", - "custom_buttons_startup": "On startup", + "custom_buttons_startup": "Javascript code (on startup)", "n_days": "{n} days" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 0fc30cbd..73ef3982 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2948,7 +2948,7 @@ abstract class AppLocalizations { /// No description provided for @custom_buttons_edit. /// /// In en, this message translates to: - /// **'Add custom button'** + /// **'Edit custom buttons'** String get custom_buttons_edit; /// No description provided for @custom_buttons_add. @@ -2957,18 +2957,36 @@ abstract class AppLocalizations { /// **'Add custom button'** String get custom_buttons_add; + /// 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: /// **'Javascript code'** String get custom_buttons_js_code; + /// No description provided for @custom_buttons_js_code_req. + /// + /// In en, this message translates to: + /// **'Javascript code required'** + String get custom_buttons_js_code_req; + /// No description provided for @custom_buttons_js_code_long. /// /// In en, this message translates to: @@ -2978,7 +2996,7 @@ abstract class AppLocalizations { /// No description provided for @custom_buttons_startup. /// /// In en, this message translates to: - /// **'On startup'** + /// **'Javascript code (on startup)'** String get custom_buttons_startup; /// No description provided for @n_days. diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 0ee8e394..a3fb79f5 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1518,22 +1518,31 @@ class AppLocalizationsAr extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index ca9fbf35..ccc8ce7f 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1531,22 +1531,31 @@ class AppLocalizationsDe extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 49995069..19050456 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1519,22 +1519,31 @@ class AppLocalizationsEn extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index d01ce663..8ad3b531 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1536,22 +1536,31 @@ class AppLocalizationsEs extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index f86ffbaf..f1dee22e 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1537,22 +1537,31 @@ class AppLocalizationsFr extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 9f0a2b3b..c2c87a01 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1525,22 +1525,31 @@ class AppLocalizationsId extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index b4049fcb..7411c45b 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1534,22 +1534,31 @@ class AppLocalizationsIt extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 1ffda025..c1885463 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1533,22 +1533,31 @@ class AppLocalizationsPt extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 89cc8dc5..55c58f7b 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1535,22 +1535,31 @@ class AppLocalizationsRu extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 0d60364b..b9cbb00c 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1519,22 +1519,31 @@ class AppLocalizationsTh extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index dd1ec81b..382f9f66 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1525,22 +1525,31 @@ class AppLocalizationsTr extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 060b17ad..b1eca29e 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1490,22 +1490,31 @@ class AppLocalizationsZh extends AppLocalizations { 'Execute Javascript code with custom buttons'; @override - String get custom_buttons_edit => 'Add custom button'; + String get custom_buttons_edit => 'Edit custom buttons'; @override String get custom_buttons_add => 'Add custom button'; + @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 => 'Javascript code'; + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + @override String get custom_buttons_js_code_long => 'Javascript code (on long press)'; @override - String get custom_buttons_startup => 'On startup'; + String get custom_buttons_startup => 'Javascript code (on startup)'; @override String n_days(Object n) { diff --git a/lib/main.dart b/lib/main.dart index 32a5f03f..ed50af13 100644 --- a/lib/main.dart +++ b/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'; @@ -31,9 +32,11 @@ 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'; import 'package:media_kit/media_kit.dart'; +import 'package:path/path.dart' as path; 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; @@ -94,6 +97,7 @@ class _MyAppState extends ConsumerState { super.initState(); initializeDateFormatting(); _initDeepLinks(); + _setupMpvConfig(); unawaited(ref.read(scanLocalLibraryProvider.future)); WidgetsBinding.instance.addPostFrameCallback((_) { @@ -242,6 +246,38 @@ class _MyAppState extends ConsumerState { } return true; } + + Future _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 = path.join(dir.path, 'shaders'); + await Directory(shadersDir).create(recursive: true); + String scriptsDir = path.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")) { + final scriptFile = File('$scriptsDir/${file.name.split("/").last}'); + await scriptFile.writeAsBytes(file.content); + } + } + } + } } class AllowScrollBehavior extends MaterialScrollBehavior { diff --git a/lib/models/custom_button.dart b/lib/models/custom_button.dart index 0ea64789..b0bd3873 100644 --- a/lib/models/custom_button.dart +++ b/lib/models/custom_button.dart @@ -31,6 +31,30 @@ class CustomButton { 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 json) { id = json['id']; title = json['title']; @@ -53,3 +77,19 @@ class CustomButton { '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, + }); +} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 61ebad75..e4655ed0 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -375,7 +375,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, - this.useMpvConfig = false, + this.useMpvConfig = true, }); Settings.fromJson(Map json) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index f923007c..0de42202 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -9,11 +9,13 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_qjs/quickjs/ffi.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart' as riv; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/video.dart' as vid; import 'package:mangayomi/modules/anime/providers/anime_player_controller_provider.dart'; @@ -25,6 +27,7 @@ import 'package:mangayomi/modules/anime/widgets/mobile.dart'; import 'package:mangayomi/modules/anime/widgets/subtitle_view.dart'; import 'package:mangayomi/modules/anime/widgets/subtitle_setting_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; @@ -39,8 +42,11 @@ import 'package:media_kit/media_kit.dart'; import 'package:media_kit/generated/libmpv/bindings.dart' as generated; 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:numberpicker/numberpicker.dart'; import 'package:path/path.dart' as p; +import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:share_plus/share_plus.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; @@ -212,12 +218,12 @@ class _AnimeStreamPageState extends riv.ConsumerState generated.mpv_format.MPV_FORMAT_NODE, "user-data/aniyomi/launch_int_picker": generated.mpv_format.MPV_FORMAT_NODE, - "user-data/current-anime/intro-length": - generated.mpv_format.MPV_FORMAT_INT64, "user-data/mangayomi/chapter_titles": generated.mpv_format.MPV_FORMAT_NODE, "user-data/mangayomi/current_chapter": generated.mpv_format.MPV_FORMAT_INT64, + "user-data/mangayomi/selected_shader": + generated.mpv_format.MPV_FORMAT_NODE, }, eventHandler: _handleMpvEvents, ), @@ -253,6 +259,8 @@ class _AnimeStreamPageState extends riv.ConsumerState final ValueNotifier _fit = ValueNotifier(BoxFit.contain); final ValueNotifier> _chapterMarks = ValueNotifier([]); final ValueNotifier _currentChapterMark = ValueNotifier(null); + final ValueNotifier _selectedShader = ValueNotifier(""); + final ValueNotifier _customButton = ValueNotifier(null); late final ValueNotifier<_AniSkipPhase> _skipPhase = ValueNotifier( _AniSkipPhase.none, ); @@ -301,6 +309,9 @@ class _AnimeStreamPageState extends riv.ConsumerState generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE) { final prop = event.ref.data.cast(); final propName = prop.ref.name.cast().toDartString(); + if (propName.startsWith("user-data/")) { + print("DEBUG 00: $propName - ${prop.ref.format}"); + } if (propName.startsWith("user-data/") && prop.ref.format == generated.mpv_format.MPV_FORMAT_NODE) { final value = prop.ref.data.cast(); @@ -322,76 +333,269 @@ class _AnimeStreamPageState extends riv.ConsumerState String propName, Pointer value, ) async { + final nativePlayer = _player.platform as NativePlayer; switch (propName.substring(10)) { case "aniyomi/show_text": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; botToast(text); + nativePlayer.setProperty("user-data/aniyomi/show_text", ""); } break; - case "user-data/aniyomi/toggle_ui": + case "aniyomi/toggle_ui": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + switch (text) { + // WIP + case "show": + break; + case "hide": + break; + case "toggle": + break; + } + nativePlayer.setProperty("user-data/aniyomi/toggle_ui", ""); } break; - case "user-data/aniyomi/show_panel": + case "aniyomi/show_panel": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + switch (text) { + // WIP + case "subtitle_settings": + break; + case "subtitle_delay": + break; + case "audio_delay": + break; + case "video_filters": + break; + } + nativePlayer.setProperty("user-data/aniyomi/show_panel", ""); } break; - case "user-data/aniyomi/software_keyboard": + case "aniyomi/software_keyboard": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + switch (text) { + // WIP + case "show": + break; + case "hide": + break; + case "toggle": + break; + } + nativePlayer.setProperty("user-data/aniyomi/software_keyboard", ""); } break; - case "user-data/aniyomi/set_button_title": + case "aniyomi/set_button_title": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + print("DEBUG SET BUTTON TITLE: $text"); + if (text.isEmpty) break; + final temp = _customButton.value; + if (temp == null) break; + _customButton.value = temp..currentTitle = text; + nativePlayer.setProperty("user-data/aniyomi/set_button_title", ""); } break; - case "user-data/aniyomi/reset_button_title": + case "aniyomi/reset_button_title": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final temp = _customButton.value; + if (temp == null) break; + _customButton.value = temp..currentTitle = temp.button.title ?? ""; + nativePlayer.setProperty("user-data/aniyomi/reset_button_title", ""); } break; - case "user-data/aniyomi/toggle_button": + case "aniyomi/toggle_button": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final temp = _customButton.value; + if (temp == null) break; + switch (text) { + case "show": + _customButton.value = temp..visible = true; + break; + case "hide": + _customButton.value = temp..visible = false; + break; + case "toggle": + _customButton.value = temp..visible = !temp.visible; + break; + } + nativePlayer.setProperty("user-data/aniyomi/toggle_button", ""); } break; - case "user-data/aniyomi/switch_episode": + case "aniyomi/switch_episode": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + switch (text) { + case "n": + pushToNewEpisode(context, _streamController.getNextEpisode()); + break; + case "p": + pushToNewEpisode(context, _streamController.getPrevEpisode()); + break; + } + nativePlayer.setProperty("user-data/aniyomi/switch_episode", ""); } break; - case "user-data/aniyomi/pause": + case "aniyomi/pause": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + switch (text) { + case "pause": + await _player.pause(); + break; + case "unpause": + await _player.play(); + break; + case "pauseunpause": + await _player.playOrPause(); + break; + } + nativePlayer.setProperty("user-data/aniyomi/pause", ""); } break; - case "user-data/aniyomi/seek_by": + case "aniyomi/seek_by": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + final tt = await nativePlayer.getProperty( + "user-data/current-anime/intro-length", + ); + if (text.isEmpty) break; + final data = int.parse(text.replaceAll("\"", "")); + final pos = _currentPosition.value.inSeconds + data; + _tempPosition.value = Duration(seconds: pos); + await _player.seek(Duration(seconds: pos)); + _tempPosition.value = null; + nativePlayer.setProperty("user-data/aniyomi/seek_by", ""); } break; - case "user-data/aniyomi/seek_to": + case "aniyomi/seek_to": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final data = int.parse(text.replaceAll("\"", "")); + _tempPosition.value = Duration(seconds: data); + await _player.seek(Duration(seconds: data)); + _tempPosition.value = null; + nativePlayer.setProperty("user-data/aniyomi/seek_to", ""); } break; - case "user-data/aniyomi/seek_by_with_text": + case "aniyomi/seek_by_with_text": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final data = text.split("|"); + final pos = + _currentPosition.value.inSeconds + + int.parse(data[0].replaceAll("\"", "")); + _tempPosition.value = Duration(seconds: pos); + await _player.seek(Duration(seconds: pos)); + _tempPosition.value = null; + (_player.platform as NativePlayer).command(["show-text", data[1]]); + nativePlayer.setProperty("user-data/aniyomi/seek_by_with_text", ""); } break; - case "user-data/aniyomi/seek_to_with_text": + case "aniyomi/seek_to_with_text": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final data = text.split("|"); + final pos = int.parse(data[0].replaceAll("\"", "")); + _tempPosition.value = Duration(seconds: pos); + await _player.seek(Duration(seconds: pos)); + _tempPosition.value = null; + (_player.platform as NativePlayer).command(["show-text", data[1]]); + nativePlayer.setProperty("user-data/aniyomi/seek_to_with_text", ""); } break; - case "user-data/aniyomi/launch_int_picker": + case "aniyomi/launch_int_picker": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); + if (text.isEmpty) break; + final data = text.split("|"); + final start = int.parse(data[2]); + final stop = int.parse(data[3]); + final step = int.parse(data[4]); + int currentValue = start; + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(data[0]), + content: StatefulBuilder( + builder: (context, setState) => SizedBox( + height: 200, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + NumberPicker( + value: currentValue, + minValue: start, + maxValue: stop, + step: step, + haptics: true, + textMapper: (numberText) => + data[1].replaceAll("%d", numberText), + onChanged: (value) => + setState(() => currentValue = value), + ), + ], + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + TextButton( + onPressed: () async { + final namePtr = data[5].toNativeUtf8(); + final valuePtr = calloc(1) + ..value = currentValue; + nativePlayer.mpv.mpv_set_property( + nativePlayer.ctx, + namePtr.cast(), + generated.mpv_format.MPV_FORMAT_INT64, + valuePtr.cast(), + ); + malloc.free(namePtr); + malloc.free(valuePtr); + Navigator.pop(context); + }, + child: Text( + context.l10n.ok, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + nativePlayer.setProperty("user-data/aniyomi/launch_int_picker", ""); } break; case "mangayomi/chapter_titles": @@ -410,6 +614,12 @@ class _AnimeStreamPageState extends riv.ConsumerState .toList(); } break; + case "mangayomi/selected_shader": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + _selectedShader.value = text; + } + break; } } @@ -421,6 +631,57 @@ class _AnimeStreamPageState extends riv.ConsumerState } } + Future _initCustomButton() async { + if (!useMpvConfig) return; + final customButtons = await ref.read(getCustomButtonsStreamProvider.future); + if (customButtons.isEmpty) return; + final primaryButton = + customButtons.firstWhereOrNull((e) => e.isFavourite ?? false) ?? + customButtons.first; + var status = await Permission.storage.status; + if (!status.isGranted) { + await Permission.storage.request(); + } + final provider = StorageProvider(); + final dir = await provider.getMpvDirectory(); + String scriptsDir = path.join(dir!.path, 'scripts'); + final mpvFile = File('$scriptsDir/init_custom_buttons.js'); + final content = StringBuffer(); + content.write("var aniyomi = require('./init_aniyomi_functions');"); + for (final button in customButtons) { + content.write( + """ +${button.getButtonStartup(primaryButton.id!).trim()} +function button${button.id}() { + ${button.getButtonPress(primaryButton.id!).trim()} +} +mp.register_script_message('call_button_${button.id}', button${button.id}) +function button${button.id}long() { + ${button.getButtonLongPress(primaryButton.id!).trim()} +} +mp.register_script_message('call_button_${button.id}_long', button${button.id}long)""", + ); + } + await mpvFile.writeAsString(content.toString()); + await (_player.platform as NativePlayer).command([ + "load-script", + mpvFile.path, + ]); + _customButton.value = ActiveCustomButton( + currentTitle: primaryButton.title!, + visible: true, + button: primaryButton, + onPress: () => (_player.platform as NativePlayer).command([ + "script-message", + "call_button_${primaryButton.id}", + ]), + onLongPress: () => (_player.platform as NativePlayer).command([ + "script-message", + "call_button_${primaryButton.id}_long", + ]), + ); + } + void pushToNewEpisode(BuildContext context, Chapter episode) { widget.desktopFullScreenPlayer.call(ref.read(fullscreenProvider)); if (context.mounted) { @@ -526,6 +787,22 @@ class _AnimeStreamPageState extends riv.ConsumerState _setPlaybackSpeed(ref.read(defaultPlayBackSpeedStateProvider)); if (ref.read(enableAniSkipStateProvider)) _initAniSkip(); }); + final defaultSkipIntroLength = ref.read( + defaultSkipIntroLengthStateProvider, + ); + (_player.platform as NativePlayer).setProperty( + "user-data/current-anime/intro-length", + "$defaultSkipIntroLength", + ); + (_player.platform as NativePlayer).command([ + "script-binding", + "stats/display-stats-toggle", + ]); + (_player.platform as NativePlayer).command([ + "script-binding", + "stats/display-page-1", + ]); + _initCustomButton(); discordRpc?.showChapterDetails(ref, widget.episode); _currentPosition.addListener(_updateRpcTimestamp); WidgetsBinding.instance.addObserver(this); @@ -1006,27 +1283,39 @@ class _AnimeStreamPageState extends riv.ConsumerState padding: const EdgeInsets.symmetric(vertical: 5), child: SizedBox( height: 35, - child: ElevatedButton( - onPressed: () async { - _tempPosition.value = Duration( - seconds: - defaultSkipIntroLength + _currentPosition.value.inSeconds, - ); - await _player.seek( - Duration( - seconds: - _currentPosition.value.inSeconds + defaultSkipIntroLength, - ), - ); - _tempPosition.value = null; - }, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - "+$defaultSkipIntroLength", - style: const TextStyle(fontWeight: FontWeight.w100), - ), - ), + child: ValueListenableBuilder( + valueListenable: _customButton, + builder: (context, value, child) => (value?.visible ?? true) + ? ElevatedButton( + onPressed: + value?.onPress ?? + () async { + _tempPosition.value = Duration( + seconds: + defaultSkipIntroLength + + _currentPosition.value.inSeconds, + ); + await _player.seek( + Duration( + seconds: + _currentPosition.value.inSeconds + + defaultSkipIntroLength, + ), + ); + _tempPosition.value = null; + }, + onLongPress: value?.onLongPress, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + value != null + ? value.currentTitle + : "+$defaultSkipIntroLength", + style: const TextStyle(fontWeight: FontWeight.w100), + ), + ), + ) + : Container(), ), ), ); @@ -1061,6 +1350,7 @@ class _AnimeStreamPageState extends riv.ConsumerState style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, + color: Colors.white, ), ), ), @@ -1276,9 +1566,16 @@ class _AnimeStreamPageState extends riv.ConsumerState .map( (mode) => PopupMenuItem( value: mode.$1, - child: Text(mode.$1), + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), onTap: () { - (_player.platform as dynamic).command([ + (_player.platform as NativePlayer).command([ "script-message", mode.$2, ]); diff --git a/lib/modules/anime/widgets/desktop.dart b/lib/modules/anime/widgets/desktop.dart index 8c1932d0..d3754a9c 100644 --- a/lib/modules/anime/widgets/desktop.dart +++ b/lib/modules/anime/widgets/desktop.dart @@ -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'; @@ -218,43 +219,43 @@ class _DesktopControllerWidgetState await _changeFullScreen(ref, desktopFullScreenPlayer, value: false); }, const SingleActivator(LogicalKeyboardKey.digit0, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "clear_anime", ]); }, const SingleActivator(LogicalKeyboardKey.digit1, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_a", ]); }, const SingleActivator(LogicalKeyboardKey.digit2, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_b", ]); }, const SingleActivator(LogicalKeyboardKey.digit3, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_c", ]); }, const SingleActivator(LogicalKeyboardKey.digit4, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_aa", ]); }, const SingleActivator(LogicalKeyboardKey.digit5, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_bb", ]); }, const SingleActivator(LogicalKeyboardKey.digit6, control: true): () { - (widget.videoController.player.platform as dynamic).command([ + (widget.videoController.player.platform as NativePlayer).command([ "script-message", "set_anime_ca", ]); diff --git a/lib/modules/more/settings/player/custom_button_screen.dart b/lib/modules/more/settings/player/custom_button_screen.dart index 6aced89e..785034a6 100644 --- a/lib/modules/more/settings/player/custom_button_screen.dart +++ b/lib/modules/more/settings/player/custom_button_screen.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class CustomButtonScreen extends ConsumerStatefulWidget { const CustomButtonScreen({super.key}); @@ -13,7 +16,6 @@ class CustomButtonScreen extends ConsumerStatefulWidget { } class _CustomButtonScreenState extends ConsumerState { - List _entries = []; @override Widget build(BuildContext context) { final l10n = context.l10n; @@ -23,7 +25,6 @@ class _CustomButtonScreenState extends ConsumerState { body: customButtons.when( data: (data) { if (data.isEmpty) { - _entries = []; return Center( child: Padding( padding: const EdgeInsets.all(8.0), @@ -34,71 +35,107 @@ class _CustomButtonScreenState extends ConsumerState { ), ); } - data.sort((a, b) => (a.pos ?? 0).compareTo(b.pos ?? 0)); - _entries = data; return Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: ReorderableListView.builder( buildDefaultDragHandles: false, - itemCount: _entries.length, + itemCount: data.length, itemBuilder: (context, index) { - final customButton = _entries[index]; - return Row( - key: Key('custom_btn_${customButton.id}'), + final customButton = data[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + key: Key("custom_btn_col_${customButton.id}"), children: [ - ReorderableDragStartListener( - index: index, - child: const Icon(Icons.drag_handle), + Row( + key: Key("custom_btn_row_${customButton.id}"), + children: [ + ReorderableDragStartListener( + index: index, + child: const Icon(Icons.drag_handle), + ), + Expanded( + child: Row( + key: Key("custom_btn_row1_${customButton.id}"), + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Expanded( + child: ListTile( + key: Key( + "custom_btn_tile_${customButton.id}", + ), + dense: true, + title: Text( + customButton.title!, + overflow: TextOverflow.ellipsis, + ), + ), + ), + IconButton( + onPressed: () async { + for (final button in data) { + button.isFavourite = + button.id == customButton.id; + } + await isar.writeTxn( + () async => + await isar.customButtons.putAll(data), + ); + }, + icon: Icon( + (customButton.isFavourite ?? false) + ? Icons.star + : Icons.star_border, + color: context.primaryColor, + ), + ), + IconButton( + onPressed: () async { + await _showEditForm(customButton); + }, + icon: Icon(Icons.mode_edit_outlined), + ), + IconButton( + onPressed: () async { + await _showDeleteButton(customButton); + }, + icon: Icon(Icons.delete_outline), + ), + ], + ), + ), + ], ), - Expanded( - child: Row( - children: [ - IconButton( - onPressed: () {}, - icon: Icon( - (customButton.isFavourite ?? false) - ? Icons.star - : Icons.star_border, - ), - ), - IconButton( - onPressed: () {}, - icon: Icon(Icons.mode_edit_outlined), - ), - IconButton( - onPressed: () {}, - icon: Icon(Icons.delete_outline), - ), - ], - ), + Text( + customButton.codePress ?? "", + overflow: TextOverflow.ellipsis, ), ], ); }, - onReorder: (oldIndex, newIndex) { - /*if (oldIndex < newIndex) { - final draggedItem = navigationOrder[oldIndex]; + onReorder: (oldIndex, newIndex) async { + if (oldIndex < newIndex) { + final draggedItemPos = data[oldIndex].pos; for (var i = oldIndex; i < newIndex - 1; i++) { - navigationOrder[i] = navigationOrder[i + 1]; + data[i].pos = data[i + 1].pos; } - navigationOrder[newIndex - 1] = draggedItem; + data[newIndex - 1].pos = draggedItemPos; } else { - final draggedItem = navigationOrder[oldIndex]; + final draggedItemPos = data[oldIndex].pos; for (var i = oldIndex; i > newIndex; i--) { - navigationOrder[i] = navigationOrder[i - 1]; + data[i].pos = data[i - 1].pos; } - navigationOrder[newIndex] = draggedItem; + data[newIndex].pos = draggedItemPos; } - ref - .read(navigationOrderStateProvider.notifier) - .set(navigationOrder);*/ + await isar.writeTxn( + () async => await isar.customButtons.putAll(data), + ); }, ), ); }, error: (Object error, StackTrace stackTrace) { - _entries = []; return Center( child: Padding( padding: const EdgeInsets.all(8.0), @@ -114,89 +151,8 @@ class _CustomButtonScreenState extends ConsumerState { }, ), floatingActionButton: FloatingActionButton.extended( - onPressed: () { - bool isExist = false; - final controller = TextEditingController(); - showDialog( - context: context, - builder: (context) { - return SizedBox( - child: StatefulBuilder( - builder: (context, setState) { - return AlertDialog( - title: Text(l10n.add_category), - content: CustomTextFormField( - controller: controller, - entries: _entries, - context: context, - exist: (value) { - setState(() { - isExist = value; - }); - }, - isExist: isExist, - val: (val) {}, - ), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text(l10n.cancel), - ), - const SizedBox(width: 15), - TextButton( - onPressed: controller.text.isEmpty || isExist - ? null - : () async { - /*final category = Category( - forItemType: widget.itemType, - name: controller.text, - updatedAt: DateTime.now() - .millisecondsSinceEpoch, - ); - isar.writeTxnSync(() { - isar.categorys.putSync( - category..pos = category.id, - ); - final categories = isar.categorys - .filter() - .posIsNull() - .findAllSync(); - for (var category in categories) { - isar.categorys.putSync( - category..pos = category.id, - ); - } - });*/ - - if (context.mounted) { - Navigator.pop(context); - } - }, - child: Text( - l10n.add, - style: TextStyle( - color: controller.text.isEmpty || isExist - ? Theme.of( - context, - ).primaryColor.withValues(alpha: 0.2) - : null, - ), - ), - ), - ], - ), - ], - ); - }, - ), - ); - }, - ); + onPressed: () async { + await _showEditForm(null); }, label: Row( children: [ @@ -208,77 +164,250 @@ class _CustomButtonScreenState extends ConsumerState { ), ); } + + Future _showEditForm(CustomButton? customButton) async { + bool isTitleMissing = customButton == null; + bool isCodePressMissing = customButton == null; + final titleController = TextEditingController( + text: customButton?.title ?? "", + ); + final codePressController = TextEditingController( + text: customButton?.codePress ?? "", + ); + final codeLongPressController = TextEditingController( + text: customButton?.codeLongPress ?? "", + ); + final codeStartupController = TextEditingController( + text: customButton?.codeStartup ?? "", + ); + await showDialog( + context: context, + builder: (context) { + return SizedBox( + child: StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text( + "${context.l10n.custom_buttons_add}${customButton != null ? " (ID: ${customButton.id})" : ""}", + ), + scrollable: true, + content: Column( + children: [ + const SizedBox(height: 20), + CustomTextFormField( + name: context.l10n.custom_buttons_text, + helperText: context.l10n.custom_buttons_text_req, + allowEnterNewLine: false, + controller: titleController, + context: context, + missing: (value) { + setState(() { + isTitleMissing = value; + }); + }, + isMissing: isTitleMissing, + val: (val) {}, + ), + const SizedBox(height: 20), + CustomTextFormField( + name: context.l10n.custom_buttons_js_code, + helperText: context.l10n.custom_buttons_js_code_req, + minLines: 4, + controller: codePressController, + context: context, + missing: (value) { + setState(() { + isCodePressMissing = value; + }); + }, + isMissing: isCodePressMissing, + val: (val) {}, + ), + const SizedBox(height: 20), + CustomTextFormField( + name: context.l10n.custom_buttons_js_code_long, + minLines: 4, + controller: codeLongPressController, + context: context, + missing: (value) {}, + isMissing: false, + val: (val) {}, + ), + const SizedBox(height: 20), + CustomTextFormField( + name: context.l10n.custom_buttons_startup, + minLines: 4, + controller: codeStartupController, + context: context, + missing: (value) {}, + isMissing: false, + val: (val) {}, + ), + ], + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(context.l10n.cancel), + ), + const SizedBox(width: 15), + TextButton( + onPressed: isTitleMissing || isCodePressMissing + ? null + : () async { + final temp = await isar.customButtons + .filter() + .idEqualTo(customButton?.id) + .findFirst(); + final button = + temp ?? + CustomButton( + title: "", + codePress: "", + codeLongPress: "", + codeStartup: "", + pos: await isar.customButtons.count(), + ); + await isar.writeTxn(() async { + await isar.customButtons.put( + button + ..title = titleController.text + ..codePress = codePressController.text + ..codeLongPress = + codeLongPressController.text + ..codeStartup = + codeStartupController.text, + ); + }); + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text( + customButton == null + ? context.l10n.add + : context.l10n.edit, + style: TextStyle( + color: isTitleMissing || isCodePressMissing + ? Theme.of( + context, + ).primaryColor.withValues(alpha: 0.2) + : null, + ), + ), + ), + ], + ), + ], + ); + }, + ), + ); + }, + ); + } + + Future _showDeleteButton(CustomButton customButton) async { + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Text(context.l10n.custom_buttons_delete), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(context.l10n.cancel), + ), + const SizedBox(width: 15), + ElevatedButton( + onPressed: () async { + await isar.writeTxn( + () async => + await isar.customButtons.delete(customButton.id!), + ); + if (context.mounted) { + Navigator.pop(context, "ok"); + } + }, + child: Text(context.l10n.ok), + ), + ], + ), + ], + ); + }, + ); + } } class CustomTextFormField extends StatelessWidget { final TextEditingController controller; - final List entries; final BuildContext context; - final Function(bool) exist; - final bool isExist; + final Function(bool) missing; + final bool isMissing; final String name; + final String helperText; + final int minLines; + final bool allowEnterNewLine; final Function(String) val; const CustomTextFormField({ super.key, required this.controller, - required this.entries, required this.context, - required this.exist, - required this.isExist, + required this.missing, + required this.isMissing, this.name = "", + this.helperText = "", + this.minLines = 1, + this.allowEnterNewLine = true, required this.val, }); @override Widget build(BuildContext context) { - final l10n = l10nLocalizations(context); return TextFormField( - autofocus: true, + minLines: minLines, + maxLines: null, controller: controller, - keyboardType: TextInputType.text, + keyboardType: allowEnterNewLine + ? TextInputType.multiline + : TextInputType.text, onChanged: (value) { - if (name != controller.text) { - exist( - entries - .where((element) => element.title == controller.text) - .toList() - .isNotEmpty, - ); - } + missing(controller.text.isEmpty); val(value); }, onFieldSubmitted: (s) {}, decoration: InputDecoration( - helperText: isExist == true - ? l10n!.add_category_error_exist - : l10n!.category_name_required, - helperStyle: TextStyle(color: isExist == true ? Colors.red : null), + helperText: helperText, + helperStyle: TextStyle(color: isMissing ? Colors.red : null), isDense: true, label: Text( - l10n.name, - style: TextStyle(color: isExist == true ? Colors.red : null), + name, + style: TextStyle(color: isMissing ? Colors.red : null), ), filled: true, fillColor: Colors.transparent, enabledBorder: OutlineInputBorder( borderSide: BorderSide( - color: isExist == true - ? Colors.red - : Theme.of(context).primaryColor, + color: isMissing ? Colors.red : Theme.of(context).primaryColor, ), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( - color: isExist == true - ? Colors.red - : Theme.of(context).primaryColor, + color: isMissing ? Colors.red : Theme.of(context).primaryColor, ), ), border: OutlineInputBorder( borderSide: BorderSide( - color: isExist == true - ? Colors.red - : Theme.of(context).primaryColor, + color: isMissing ? Colors.red : Theme.of(context).primaryColor, ), ), ), diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 203882cb..0647c5e6 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -3,9 +3,9 @@ import 'dart:io'; import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -26,18 +26,6 @@ class PlayerScreen extends ConsumerStatefulWidget { } class _PlayerScreenState extends ConsumerState { - int _total = 0; - int _received = 0; - http.StreamedResponse? _response; - final List _bytes = []; - StreamSubscription>? _subscription; - - @override - void dispose() { - _subscription?.cancel(); - super.dispose(); - } - @override Widget build(BuildContext context) { final defaultSubtitleLang = ref.watch(defaultSubtitleLangStateProvider); @@ -631,110 +619,51 @@ class _PlayerScreenState extends ConsumerState { context: context, builder: (context) { return AlertDialog( - content: SingleChildScrollView( - child: Column( - children: [ - Text(context.l10n.mpv_download), - _total > 0 - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Flexible( - child: LinearProgressIndicator( - value: _total > 0 - ? (_received * 1.0) / _total - : 0.0, - ), - ), - Flexible( - child: Text( - '${(_received / 1048576.0).toStringAsFixed(2)}/${(_total / 1048576.0).toStringAsFixed(2)} MB', - ), - ), - ], - ) - : SizedBox.shrink(), - ], - ), - ), + content: Text(context.l10n.mpv_download), actions: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( - onPressed: () async { - try { - await _subscription?.cancel(); - } catch (_) {} - if (context.mounted) { - Navigator.pop(context); - } - }, + onPressed: () => Navigator.pop(context), child: Text(context.l10n.cancel), ), const SizedBox(width: 15), ElevatedButton( - onPressed: _total == 0 - ? () async { - _response = await http.Client().send( - http.Request( - 'GET', - Uri.parse( - "https://github.com/Schnitzel5/mangayomi/releases/download/v0.6.3-anime4k/mangayomi_mpv.zip", - ), - ), - ); - _total = _response?.contentLength ?? 0; - _subscription = _response?.stream.listen((value) { - setState(() { - _bytes.addAll(value); - _received += value.length; - }); - }); - _subscription?.onDone(() async { - final archive = ZipDecoder().decodeBytes(_bytes); - String shadersDir = path.join( - dir.path, - 'shaders', - ); - await Directory( - shadersDir, - ).create(recursive: true); - String scriptsDir = path.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")) { - final scriptFile = File( - '$scriptsDir/${file.name.split("/").last}', - ); - await scriptFile.writeAsBytes(file.content); - } - } - _total = 0; - _received = 0; - _bytes.clear(); - if (context.mounted) { - Navigator.pop(context, "ok"); - } - }); - } - : null, + onPressed: () async { + final bytes = await rootBundle.load( + "assets/mangayomi_mpv.zip", + ); + final archive = ZipDecoder().decodeBytes( + bytes.buffer.asUint8List(), + ); + String shadersDir = path.join(dir.path, 'shaders'); + await Directory(shadersDir).create(recursive: true); + String scriptsDir = path.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")) { + final scriptFile = File( + '$scriptsDir/${file.name.split("/").last}', + ); + await scriptFile.writeAsBytes(file.content); + } + } + if (context.mounted) { + Navigator.pop(context, "ok"); + } + }, child: Text(context.l10n.download), ), ], diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart index f931e92d..40e7c12d 100644 --- a/lib/modules/more/settings/player/providers/custom_buttons_provider.dart +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart @@ -7,5 +7,7 @@ part 'custom_buttons_provider.g.dart'; @riverpod Stream> getCustomButtonsStream(Ref ref) async* { - yield* isar.customButtons.filter().idIsNotNull().watch(fireImmediately: true); + yield* isar.customButtons.filter().idIsNotNull().sortByPos().watch( + fireImmediately: true, + ); } diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart index 276a045a..c8157b2f 100644 --- a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart @@ -7,7 +7,7 @@ part of 'custom_buttons_provider.dart'; // ************************************************************************** String _$getCustomButtonsStreamHash() => - r'463d2142793ffb5a905f6f90c3a756445be8b133'; + r'476c26eb3d20e9e9eed2e1d8bb15fa74ce357ba3'; /// See also [getCustomButtonsStream]. @ProviderFor(getCustomButtonsStream) diff --git a/lib/modules/more/widgets/list_tile_widget.dart b/lib/modules/more/widgets/list_tile_widget.dart index 4952b4de..31717dd1 100644 --- a/lib/modules/more/widgets/list_tile_widget.dart +++ b/lib/modules/more/widgets/list_tile_widget.dart @@ -31,6 +31,12 @@ class ListTileWidget extends StatelessWidget { child: Icon(icon, color: context.primaryColor), ), title: Text(title), + subtitle: subtitle != null + ? Text( + subtitle!, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ) + : null, trailing: trailing, ); } diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 3747ba35..e7313c23 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -203,19 +203,28 @@ class StorageProvider { final customButton = await isar.customButtons .filter() - .idEqualTo(1) + .idIsNotNull() .findFirst(); if (customButton == null) { await isar.writeTxn(() async { - isar.customButtons.put( + await isar.customButtons.put( CustomButton( title: "+85 s", codePress: - "var intro_length = mp.get_property_number(\"user-data/current-anime/intro-length\")\naniyomi.right_seek_by(intro_length)", + """var intro_length = mp.get_property_number("user-data/current-anime/intro-length") + aniyomi.right_seek_by(intro_length)""", codeLongPress: - "aniyomi.int_picker(\"Change intro length\", \"%ds\", 0, 255, 1, \"user-data/current-anime/intro-length\")", - codeStartup: - "function update_button(_, length) {\n if (!length || length == 0) {\n aniyomi.hide_button()\n } else {\n aniyomi.show_button()\n }\n aniyomi.set_button_title(\"+\" + length + \" s\")", + """aniyomi.int_picker("Change intro length", "%ds", 0, 255, 1, "user-data/current-anime/intro-length")""", + codeStartup: """function update_button(_, length) { + if (length && length == 0) { + aniyomi.hide_button() + } else { + aniyomi.show_button() + } + aniyomi.set_button_title("+" + length + " s") + if (\$isPrimary) { + mp.observe_property("user-data/current-anime/intro-length", "number", update_button) + }""", isFavourite: true, pos: 0, updatedAt: DateTime.now().millisecondsSinceEpoch, From d58400d236b0f014cefc0d81ca48d26be287f314 Mon Sep 17 00:00:00 2001 From: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:55:09 +0530 Subject: [PATCH 020/100] Create app_as.arb --- lib/l10n/app_as.arb | 279 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 lib/l10n/app_as.arb diff --git a/lib/l10n/app_as.arb b/lib/l10n/app_as.arb new file mode 100644 index 00000000..4e29a726 --- /dev/null +++ b/lib/l10n/app_as.arb @@ -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": "এক্সটেনশন দেখুৱাওক" +} From 1b6a118ad8a099f4931024c74ab1efe9fc51ad3b Mon Sep 17 00:00:00 2001 From: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:57:49 +0530 Subject: [PATCH 021/100] Create app_hi.arb --- lib/l10n/app_hi.arb | 279 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 lib/l10n/app_hi.arb diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb new file mode 100644 index 00000000..9c9f4638 --- /dev/null +++ b/lib/l10n/app_hi.arb @@ -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": "एक्सटेंशन दिखाएँ" +} From 69df87ff0e13af242c785c100fe0ea646b3e39e5 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:02:48 +0200 Subject: [PATCH 022/100] Merge two identical providers Merge `isLongPressedMangaStateProvider` and `isLongPressedStateProvider` Both providers do the same thing and it is impossible to change the value of the provider in different places in the app at the same time. So just use one `isLongPressedStateProvider`. Reduces code duplication and there is no confusion about which one to use. --- lib/modules/library/library_screen.dart | 11 +++++----- .../providers/library_state_provider.dart | 17 +++------------ .../providers/library_state_provider.g.dart | 21 ++----------------- .../widgets/library_gridview_widget.dart | 5 +++-- .../widgets/library_listview_widget.dart | 7 ++++--- lib/modules/main_view/main_screen.dart | 4 ++-- .../widgets/category_selection_dialog.dart | 3 ++- 7 files changed, 22 insertions(+), 46 deletions(-) diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index c42a7871..7144d515 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -18,6 +18,7 @@ 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/settings/appearance/providers/theme_mode_state_provider.dart'; @@ -560,7 +561,7 @@ class _LibraryScreenState extends ConsumerState final mangaIds = ref.watch(mangasListStateProvider); final color = Theme.of(context).textTheme.bodyLarge!.color!; return BottomSelectBar( - isVisible: ref.watch(isLongPressedMangaStateProvider), + isVisible: ref.watch(isLongPressedStateProvider), actions: [ BottomSelectButton( icon: Icon(Icons.label_outline_rounded, color: color), @@ -1133,7 +1134,7 @@ class _LibraryScreenState extends ConsumerState ref.read(mangasListStateProvider.notifier).clear(); ref - .read(isLongPressedMangaStateProvider.notifier) + .read(isLongPressedStateProvider.notifier) .update(false); if (mounted) { Navigator.pop(context); @@ -1786,7 +1787,7 @@ class _LibraryScreenState extends ConsumerState 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( @@ -1815,7 +1816,7 @@ class _LibraryScreenState extends ConsumerState ref.read(mangasListStateProvider.notifier).clear(); ref - .read(isLongPressedMangaStateProvider.notifier) + .read(isLongPressedStateProvider.notifier) .update(!isLongPressed); }, icon: const Icon(Icons.clear), @@ -1840,7 +1841,7 @@ class _LibraryScreenState extends ConsumerState .selectSome(manga); } ref - .read(isLongPressedMangaStateProvider.notifier) + .read(isLongPressedStateProvider.notifier) .update(false); } else { for (var manga in data) { diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 44c8c323..a6c91ae7 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -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,18 +815,6 @@ 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 @@ -855,7 +844,7 @@ class MangasSetIsReadState extends _$MangasSetIsReadState { isar.mangas.putAllSync(allMangas); }); - ref.read(isLongPressedMangaStateProvider.notifier).update(false); + ref.read(isLongPressedStateProvider.notifier).update(false); ref.read(mangasListStateProvider.notifier).clear(); } } diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index 08acfd3e..e4cc60af 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -2517,7 +2517,7 @@ class _SortLibraryMangaStateProviderElement Settings get settings => (origin as SortLibraryMangaStateProvider).settings; } -String _$mangasListStateHash() => r'ad1cc419dfd3793bfc8c90f3ce8b7726561dd9ad'; +String _$mangasListStateHash() => r'bbd2e3600ec22a774b1774ae3c221815e52bfef6'; /// See also [MangasListState]. @ProviderFor(MangasListState) @@ -2533,25 +2533,8 @@ final mangasListStateProvider = ); typedef _$MangasListState = AutoDisposeNotifier>; -String _$isLongPressedMangaStateHash() => - r'f77076b0335e92df26a75ea0c338d4214a330184'; - -/// See also [IsLongPressedMangaState]. -@ProviderFor(IsLongPressedMangaState) -final isLongPressedMangaStateProvider = - AutoDisposeNotifierProvider.internal( - IsLongPressedMangaState.new, - name: r'isLongPressedMangaStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$isLongPressedMangaStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$IsLongPressedMangaState = AutoDisposeNotifier; String _$mangasSetIsReadStateHash() => - r'0bc11e49fd33d7c76e86b005e6d30d7ac39bb5e2'; + r'2a1b1005e2ed5068d36188a3fb969d21b64bfef6'; abstract class _$MangasSetIsReadState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 5bec0f2e..75c891ad 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -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 { 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( @@ -430,7 +431,7 @@ class _LibraryGridViewWidgetState extends State { ) { 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); } diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index 7306e15d..4dc2e22e 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -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, @@ -80,7 +81,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 +92,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); diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index add15f8d..c782bddc 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -23,7 +23,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,7 +239,7 @@ class _MainScreenState extends ConsumerState { } final incognitoMode = ref.watch(incognitoModeStateProvider); - final isLongPressed = ref.watch(isLongPressedMangaStateProvider); + final isLongPressed = ref.watch(isLongPressedStateProvider); return Column( children: [ diff --git a/lib/modules/widgets/category_selection_dialog.dart b/lib/modules/widgets/category_selection_dialog.dart index 1d79cf21..19719f92 100644 --- a/lib/modules/widgets/category_selection_dialog.dart +++ b/lib/modules/widgets/category_selection_dialog.dart @@ -7,6 +7,7 @@ import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; import 'package:mangayomi/modules/library/widgets/list_tile_manga_category.dart'; +import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart'; import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -151,7 +152,7 @@ void showCategorySelectionDialog({ if (isBulk) { ref.read(mangasListStateProvider.notifier).clear(); ref - .read(isLongPressedMangaStateProvider.notifier) + .read(isLongPressedStateProvider.notifier) .update(false); } }); From d7c59fe16b24e521848bd92cb713bd899611358a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 30 Jul 2025 03:23:15 +0200 Subject: [PATCH 023/100] added mpv stats --- assets/mangayomi_mpv.zip | Bin 1192984 -> 1209958 bytes lib/modules/anime/anime_player_view.dart | 59 +++++++++++++++++------ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/assets/mangayomi_mpv.zip b/assets/mangayomi_mpv.zip index 40513093fa0febfb50f53c001a1955b07a5ad76f..64e16ae08da797a2dc66a5544d202d10b076a098 100644 GIT binary patch delta 21766 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

  • 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 delta 4503 zcmZvf3tUsz9mmg2AcQ0^bCAqH1QfYwRs==V+3H6$u?QlxovU6@-Wm!~dDN=KQFUOQ z4~p@#Q^7}>&JN$GCD5YPb~0B)v1r$|w%9tE>s+;;xiV|eod>7Oy`ShO{?6~_e1GSE z9=YDze|PSicTxaV9)cbxV=-$uS(;M7!+0o}conmpQ=T&3AW8}Dz_ zG~|%4vTkW+B$7s>DFB7z#->RV1Kg7)YEL`K)o=D`wKVI&i-DPxoRbsy1#QGE3%o!h z?sf)-(FpAifz>o(bEwX}IaEJLBVOOAA4MY$KW%v8uM%3_N0JRk^rRuB8?FW5#-@Y? z26w`OAk!#fQdR}wPcZ)c1b>FPQ&t(<)ug+6t+CQT8f$8eGqt4g-ge_!6=_VVH|B+s zM#Dkl!b;M35C&J%L6(c~;|OwPmK}adMsr)z;YXj8znr7q6_Wh}Qv{ z0t7GutbHQ71RTQkd&@Q&%0h-?N((?M8k-F*!uU8T0K(f zv#6#y_8fKjrkToq7DHjK9=`DN`UWpGU_YW7ivN7|Hr`QJbdz)}mqlki@Yt$wc6 zn$d~g<#k*~ZY<+*x>j zW5xk6QdZgh0N0thk+Ow5wfZm(;kwPry!XNZyl_u?^M781r~8ZsfU&YrrwL8Sfs@5& zLyyuVu6sT^;-fsYEeBduBf-jO6VMk zVsc@kxGMA*9g^$9Z+#`9U*+NwJ{#?dFEP8$6$YZSxzHd!*~3__cQTllSAp&mHh&yu zqtN&~%=N_{r(<$WyX%w7&BI($r600 z2tcH4<})X|dR)ViHXoX8zkIHRrg8oBp6|3X2ltlz9-pz;FnmU2X(`ib+M0YAA)fpf zOXIqulX-b<=uAGISG*l_F~2QK(flVvGSVt?Sxf7kJ-5AynkfROl_q&*XBWAxJN3_{>SrGS@`#F6u@ZN{I4$r zsHF&wbe(I^pw)%Aq=9HR&E#5losFTG&Y?nRQP-blH0m#eP>i0`PD!r2cd;Y|8Bv7E zZMP{IfwGFA(cas`NUp`r%*#oSe`i7&v1Y46)yMv4hsZHO6^@JMABUnjQFfWhcK+L%F7gF)t5ApF8lny!kWq&;g$kr?^=kt~GT&nY3ce zm=aNOF|>+O$vHX>*YgR?E5>Oj%$jNFFU2rHTz8Z8;i~QS$;7>cmr6BDgIY>p6uQ4r zqd}LP&|rUi-FZ4BS8*2e@*zD^>gQtf;6wnDT*|xp-lm~Y`*M7Qx-}orJg(>aeC46= z5?s!g*M>-`1Va0|I!1C`?_ge8Nqp1xx^kxgt~&jIDBHPL?$f+PG2HPXErRR7Q_Rbw zkggOL5w}Fk)?{ue46*5~os{I7;rB=C<)lY?q;9*X!#C%u5CE*QBBq$oTcvQS_)aHF z;(BZ!^YSG07}ucMJd!Y@&~zuXi1Rc4M2F9t-$-$m8?fir7)b#IS7$W6SpkxqBz%oj%HqgdkFsRLyCu? zq?OPlu2_7Dl3e#EG4D+Zt*C4zCht8NA`fBGe&a0b$#wi;U!+Ge^(+f`10R%~`0gve zOX50bIrGZG9uCX@It9NbWaGz8ldQ1E z^H5?1jEVU#18asfwC)B}iB4G`OCa!@PWO)JK>v3ejK%j1$|h zus&Ru{J|%aS&8>x%3qCWMJ0?Ct0sI*2jbcn$h=~p4g$6O&4{W+Xp+4Y+`7yFu1DYY z72uHu8-vpi<1=W*&t^v1GS#S2^2;#N{>kiKS_;<>EzHYH@kkYaA0`IkC)_fV@+9Qw zA&N_f^4GnAdKRNpWo${`3(f0sf%|_7fLT^xlMxwL!PwZH3GAhc>z4m`7s%d$@k=o> z<5$-?i_8!>SFRdguwwaA? case "aniyomi/set_button_title": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); - print("DEBUG SET BUTTON TITLE: $text"); if (text.isEmpty) break; final temp = _customButton.value; if (temp == null) break; @@ -761,6 +760,15 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo // use global "Use Fullscreen" setting. // Else (if user already watches an episode and just changes it), // stay in the same mode, the user left it in. + try { + final defaultSkipIntroLength = ref.read( + defaultSkipIntroLengthStateProvider, + ); + (_player.platform as NativePlayer).setProperty( + "user-data/current-anime/intro-length", + "$defaultSkipIntroLength", + ); + } catch (_) {} if (_isDesktop && _firstTime) { final globalFullscreen = ref.read(fullScreenPlayerStateProvider); setFullScreen(value: globalFullscreen); @@ -787,21 +795,6 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo _setPlaybackSpeed(ref.read(defaultPlayBackSpeedStateProvider)); if (ref.read(enableAniSkipStateProvider)) _initAniSkip(); }); - final defaultSkipIntroLength = ref.read( - defaultSkipIntroLengthStateProvider, - ); - (_player.platform as NativePlayer).setProperty( - "user-data/current-anime/intro-length", - "$defaultSkipIntroLength", - ); - (_player.platform as NativePlayer).command([ - "script-binding", - "stats/display-stats-toggle", - ]); - (_player.platform as NativePlayer).command([ - "script-binding", - "stats/display-page-1", - ]); _initCustomButton(); discordRpc?.showChapterDetails(ref, widget.episode); _currentPosition.addListener(_updateRpcTimestamp); @@ -1584,6 +1577,40 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo ) .toList(), ), + if (useMpvConfig) + PopupMenuButton( + tooltip: '', // Remove default tooltip "Show menu" for consistency + icon: const Icon(Icons.terminal, color: Colors.white), + itemBuilder: (context) => + [ + ("Stats Toggle", "stats/display-stats-toggle"), + ("Stats Page 1", "stats/display-page-1"), + ("Stats Page 2", "stats/display-page-2"), + ("Stats Page 3", "stats/display-page-3"), + ("Stats Page 4", "stats/display-page-4"), + ("Stats Page 5", "stats/display-page-5"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-binding", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.speed, color: Colors.white), From afee5926dc327ed647c7608e28ba1422bfb07dbb Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 31 Jul 2025 01:58:18 +0200 Subject: [PATCH 024/100] added more player customizations - added navigation button if an entry is already being tracked - added option to calibrate soft subtitles --- lib/l10n/app_en.arb | 23 +- lib/l10n/generated/app_localizations.dart | 126 ++ lib/l10n/generated/app_localizations_ar.dart | 67 + lib/l10n/generated/app_localizations_de.dart | 67 + lib/l10n/generated/app_localizations_en.dart | 67 + lib/l10n/generated/app_localizations_es.dart | 67 + lib/l10n/generated/app_localizations_fr.dart | 67 + lib/l10n/generated/app_localizations_id.dart | 67 + lib/l10n/generated/app_localizations_it.dart | 67 + lib/l10n/generated/app_localizations_pt.dart | 67 + lib/l10n/generated/app_localizations_ru.dart | 67 + lib/l10n/generated/app_localizations_th.dart | 67 + lib/l10n/generated/app_localizations_tr.dart | 67 + lib/l10n/generated/app_localizations_zh.dart | 67 + lib/models/settings.dart | 53 + lib/models/settings.g.dart | 1692 ++++++++++++----- lib/modules/anime/anime_player_view.dart | 363 +++- .../player/player_advanced_screen.dart | 138 ++ .../settings/player/player_audio_screen.dart | 236 +++ .../player/player_decoder_screen.dart | 195 ++ .../player/player_overview_screen.dart | 52 + .../more/settings/player/player_screen.dart | 238 +-- .../player_audio_state_provider.dart | 86 + .../player_audio_state_provider.g.dart | 77 + .../player_decoder_state_provider.dart | 110 ++ .../player_decoder_state_provider.g.dart | 223 +++ .../providers/player_state_provider.dart | 43 - .../providers/player_state_provider.g.dart | 164 -- .../more/settings/settings_screen.dart | 15 +- .../tracker_library/tracker_item_card.dart | 18 + .../tracker_library/tracker_library_card.dart | 39 +- lib/router/router.dart | 14 + pubspec.lock | 4 +- 33 files changed, 3720 insertions(+), 993 deletions(-) create mode 100644 lib/modules/more/settings/player/player_advanced_screen.dart create mode 100644 lib/modules/more/settings/player/player_audio_screen.dart create mode 100644 lib/modules/more/settings/player/player_decoder_screen.dart create mode 100644 lib/modules/more/settings/player/player_overview_screen.dart create mode 100644 lib/modules/more/settings/player/providers/player_audio_state_provider.dart create mode 100644 lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart create mode 100644 lib/modules/more/settings/player/providers/player_decoder_state_provider.dart create mode 100644 lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7049d912..bc12ce57 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -335,6 +335,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 +407,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", @@ -458,6 +460,7 @@ "you_have_finished_reading": "You have finished reading", "return_to_the_list_of_chapters": "Return to the list of chapters", "hwdec": "Hardware Decoder", + "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!", @@ -488,5 +491,23 @@ "custom_buttons_js_code_req": "Javascript code required", "custom_buttons_js_code_long": "Javascript code (on long press)", "custom_buttons_startup": "Javascript code (on startup)", - "n_days": "{n} days" + "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" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 73ef3982..f8f51b64 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2081,6 +2081,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 +2513,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: @@ -2819,6 +2831,12 @@ abstract class AppLocalizations { /// **'Hardware Decoder'** String get hwdec; + /// 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: @@ -3004,6 +3022,114 @@ abstract class AppLocalizations { /// 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; } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index a3fb79f5..6a7b7c8e 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1050,6 +1050,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 +1276,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get advanced => 'متقدم'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'استخدام عميل HTTP الأصلي'; @@ -1450,6 +1457,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1548,4 +1558,61 @@ class AppLocalizationsAr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index ccc8ce7f..94cd4f50 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1055,6 +1055,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 +1286,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'; @@ -1462,6 +1469,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Zur lokalen Bibliothek hinzufügen'; @@ -1561,4 +1571,61 @@ class AppLocalizationsDe extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 19050456..3a06fe3a 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1049,6 +1049,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 +1276,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'; @@ -1451,6 +1458,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1549,4 +1559,61 @@ class AppLocalizationsEn extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 8ad3b531..2badf647 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1059,6 +1059,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 +1290,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'; @@ -1468,6 +1475,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1566,6 +1576,63 @@ class AppLocalizationsEs extends AppLocalizations { 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'; } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index f1dee22e..3e884093 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1061,6 +1061,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 +1292,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'; @@ -1469,6 +1476,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1567,4 +1577,61 @@ class AppLocalizationsFr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index c2c87a01..00de1ae8 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1055,6 +1055,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 +1283,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'; @@ -1457,6 +1464,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1555,4 +1565,61 @@ class AppLocalizationsId extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 7411c45b..e162f89f 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1058,6 +1058,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 +1290,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'; @@ -1466,6 +1473,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1564,4 +1574,61 @@ class AppLocalizationsIt extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index c1885463..bb6ea388 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1057,6 +1057,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 +1287,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'; @@ -1465,6 +1472,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1563,6 +1573,63 @@ class AppLocalizationsPt extends AppLocalizations { 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'; } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 55c58f7b..6fc4136d 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1060,6 +1060,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 +1290,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get advanced => 'Продвинутые'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Использовать нативный HTTP-клиент'; @@ -1467,6 +1474,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1565,4 +1575,61 @@ class AppLocalizationsRu extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index b9cbb00c..fcb07900 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1049,6 +1049,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 +1277,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get advanced => 'ขั้นสูง'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'ใช้ไคลเอนต์ HTTP พื้นเมือง'; @@ -1451,6 +1458,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1549,4 +1559,61 @@ class AppLocalizationsTh extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 382f9f66..34cdac5e 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1053,6 +1053,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 +1282,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'; @@ -1457,6 +1464,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1555,4 +1565,61 @@ class AppLocalizationsTr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index b1eca29e..b4f3f66b 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1033,6 +1033,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 +1254,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get advanced => '高级'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => '使用本地 HTTP 客户端'; @@ -1422,6 +1429,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1520,4 +1530,61 @@ class AppLocalizationsZh extends AppLocalizations { 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'; } diff --git a/lib/models/settings.dart b/lib/models/settings.dart index e4655ed0..425f9134 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -260,6 +260,22 @@ class Settings { bool? useMpvConfig; + @enumerated + late DebandingType debandingType; + + bool? enableGpuNext; + + bool? useYUV420P; + + String? audioPreferredLanguages; + + bool? enableAudioPitchCorrection; + + @enumerated + late AudioChannel audioChannels; + + int? volumeBoostCap; + Settings({ this.id = 227, this.updatedAt = 0, @@ -376,6 +392,13 @@ class Settings { 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, }); Settings.fromJson(Map json) { @@ -598,6 +621,15 @@ class Settings { 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']; } Map toJson() => { @@ -737,9 +769,30 @@ class Settings { 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, 'useMpvConfig': useMpvConfig, + 'debandingType': debandingType.index, + 'enableGpuNext': enableGpuNext, + 'useYUV420P': useYUV420P, + 'audioPreferredLanguages': audioPreferredLanguages, + 'enableAudioPitchCorrection': enableAudioPitchCorrection, + 'audioChannels': audioChannels.index, + 'volumeBoostCap': volumeBoostCap, }; } +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 } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 8a4e5827..975f0946 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -79,574 +79,611 @@ const SettingsSchema = CollectionSchema( name: r'appFontFamily', type: IsarType.string, ), - r'autoBackupLocation': PropertySchema( + r'audioChannels': PropertySchema( id: 12, + name: r'audioChannels', + type: IsarType.byte, + enumMap: _SettingsaudioChannelsEnumValueMap, + ), + r'audioPreferredLanguages': PropertySchema( + id: 13, + name: r'audioPreferredLanguages', + type: IsarType.string, + ), + r'autoBackupLocation': PropertySchema( + id: 14, name: r'autoBackupLocation', type: IsarType.string, ), r'autoExtensionsUpdates': PropertySchema( - id: 13, + id: 15, name: r'autoExtensionsUpdates', type: IsarType.bool, ), r'autoScrollPages': PropertySchema( - id: 14, + id: 16, name: r'autoScrollPages', type: IsarType.objectList, target: r'AutoScrollPages', ), r'backgroundColor': PropertySchema( - id: 15, + id: 17, name: r'backgroundColor', type: IsarType.byte, enumMap: _SettingsbackgroundColorEnumValueMap, ), r'backupFrequency': PropertySchema( - id: 16, + id: 18, name: r'backupFrequency', type: IsarType.long, ), r'backupListOptions': PropertySchema( - id: 17, + id: 19, name: r'backupListOptions', type: IsarType.longList, ), r'btServerAddress': PropertySchema( - id: 18, + id: 20, name: r'btServerAddress', type: IsarType.string, ), r'btServerPort': PropertySchema( - id: 19, + id: 21, name: r'btServerPort', type: IsarType.long, ), r'chapterFilterBookmarkedList': PropertySchema( - id: 20, + id: 22, name: r'chapterFilterBookmarkedList', type: IsarType.objectList, target: r'ChapterFilterBookmarked', ), r'chapterFilterDownloadedList': PropertySchema( - id: 21, + id: 23, name: r'chapterFilterDownloadedList', type: IsarType.objectList, target: r'ChapterFilterDownloaded', ), r'chapterFilterUnreadList': PropertySchema( - id: 22, + id: 24, name: r'chapterFilterUnreadList', type: IsarType.objectList, target: r'ChapterFilterUnread', ), r'chapterPageIndexList': PropertySchema( - id: 23, + id: 25, name: r'chapterPageIndexList', type: IsarType.objectList, target: r'ChapterPageIndex', ), r'chapterPageUrlsList': PropertySchema( - id: 24, + id: 26, name: r'chapterPageUrlsList', type: IsarType.objectList, target: r'ChapterPageurls', ), r'checkForAppUpdates': PropertySchema( - id: 25, + id: 27, name: r'checkForAppUpdates', type: IsarType.bool, ), r'checkForExtensionUpdates': PropertySchema( - id: 26, + id: 28, name: r'checkForExtensionUpdates', type: IsarType.bool, ), r'clearChapterCacheOnAppLaunch': PropertySchema( - id: 27, + id: 29, name: r'clearChapterCacheOnAppLaunch', type: IsarType.bool, ), r'colorFilterBlendMode': PropertySchema( - id: 28, + id: 30, name: r'colorFilterBlendMode', type: IsarType.byte, enumMap: _SettingscolorFilterBlendModeEnumValueMap, ), r'concurrentDownloads': PropertySchema( - id: 29, + id: 31, name: r'concurrentDownloads', type: IsarType.long, ), r'cookiesList': PropertySchema( - id: 30, + id: 32, name: r'cookiesList', type: IsarType.objectList, target: r'MCookie', ), r'cropBorders': PropertySchema( - id: 31, + id: 33, name: r'cropBorders', type: IsarType.bool, ), r'customColorFilter': PropertySchema( - id: 32, + id: 34, name: r'customColorFilter', type: IsarType.object, target: r'CustomColorFilter', ), r'dateFormat': PropertySchema( - id: 33, + id: 35, name: r'dateFormat', type: IsarType.string, ), + r'debandingType': PropertySchema( + id: 36, + name: r'debandingType', + type: IsarType.byte, + enumMap: _SettingsdebandingTypeEnumValueMap, + ), r'defaultDoubleTapToSkipLength': PropertySchema( - id: 34, + id: 37, name: r'defaultDoubleTapToSkipLength', type: IsarType.long, ), r'defaultPlayBackSpeed': PropertySchema( - id: 35, + id: 38, name: r'defaultPlayBackSpeed', type: IsarType.double, ), r'defaultReaderMode': PropertySchema( - id: 36, + id: 39, name: r'defaultReaderMode', type: IsarType.byte, enumMap: _SettingsdefaultReaderModeEnumValueMap, ), r'defaultSkipIntroLength': PropertySchema( - id: 37, + id: 40, name: r'defaultSkipIntroLength', type: IsarType.long, ), r'defaultSubtitleLang': PropertySchema( - id: 38, + id: 41, name: r'defaultSubtitleLang', type: IsarType.object, target: r'L10nLocale', ), r'disableSectionType': PropertySchema( - id: 39, + id: 42, name: r'disableSectionType', type: IsarType.byte, enumMap: _SettingsdisableSectionTypeEnumValueMap, ), r'displayType': PropertySchema( - id: 40, + id: 43, name: r'displayType', type: IsarType.byte, enumMap: _SettingsdisplayTypeEnumValueMap, ), r'doubleTapAnimationSpeed': PropertySchema( - id: 41, + id: 44, name: r'doubleTapAnimationSpeed', type: IsarType.long, ), r'downloadLocation': PropertySchema( - id: 42, + id: 45, name: r'downloadLocation', type: IsarType.string, ), r'downloadOnlyOnWifi': PropertySchema( - id: 43, + id: 46, name: r'downloadOnlyOnWifi', type: IsarType.bool, ), r'enableAniSkip': PropertySchema( - id: 44, + id: 47, name: r'enableAniSkip', type: IsarType.bool, ), + r'enableAudioPitchCorrection': PropertySchema( + id: 48, + name: r'enableAudioPitchCorrection', + type: IsarType.bool, + ), r'enableAutoSkip': PropertySchema( - id: 45, + id: 49, name: r'enableAutoSkip', type: IsarType.bool, ), r'enableCustomColorFilter': PropertySchema( - id: 46, + id: 50, name: r'enableCustomColorFilter', type: IsarType.bool, ), r'enableDiscordRpc': PropertySchema( - id: 47, + id: 51, name: r'enableDiscordRpc', type: IsarType.bool, ), + r'enableGpuNext': PropertySchema( + id: 52, + name: r'enableGpuNext', + type: IsarType.bool, + ), r'filterScanlatorList': PropertySchema( - id: 48, + id: 53, name: r'filterScanlatorList', type: IsarType.objectList, target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 49, + id: 54, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 50, + id: 55, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'followSystemTheme': PropertySchema( - id: 51, + id: 56, name: r'followSystemTheme', type: IsarType.bool, ), r'fullScreenPlayer': PropertySchema( - id: 52, + id: 57, name: r'fullScreenPlayer', type: IsarType.bool, ), r'fullScreenReader': PropertySchema( - id: 53, + id: 58, name: r'fullScreenReader', type: IsarType.bool, ), r'hideDiscordRpcInIncognito': PropertySchema( - id: 54, + id: 59, name: r'hideDiscordRpcInIncognito', type: IsarType.bool, ), r'hideItems': PropertySchema( - id: 55, + id: 60, name: r'hideItems', type: IsarType.stringList, ), r'hwdecMode': PropertySchema( - id: 56, + id: 61, name: r'hwdecMode', type: IsarType.string, ), r'incognitoMode': PropertySchema( - id: 57, + id: 62, name: r'incognitoMode', type: IsarType.bool, ), r'lastTrackerLibraryLocation': PropertySchema( - id: 58, + id: 63, name: r'lastTrackerLibraryLocation', type: IsarType.string, ), r'libraryDownloadedChapters': PropertySchema( - id: 59, + id: 64, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 60, + id: 65, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 61, + id: 66, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 62, + id: 67, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 63, + id: 68, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 64, + id: 69, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 65, + id: 70, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 66, + id: 71, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 67, + id: 72, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 68, + id: 73, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 69, + id: 74, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 70, + id: 75, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 71, + id: 76, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 72, + id: 77, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 73, + id: 78, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 74, + id: 79, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 75, + id: 80, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 76, + id: 81, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 77, + id: 82, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( - id: 78, + id: 83, name: r'mangaExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'mangaGridSize': PropertySchema( - id: 79, + id: 84, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 80, + id: 85, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 81, + id: 86, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'mergeLibraryNavMobile': PropertySchema( - id: 82, + id: 87, name: r'mergeLibraryNavMobile', type: IsarType.bool, ), r'navigationOrder': PropertySchema( - id: 83, + id: 88, name: r'navigationOrder', type: IsarType.stringList, ), r'novelDisplayType': PropertySchema( - id: 84, + id: 89, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelExtensionsRepo': PropertySchema( - id: 85, + id: 90, name: r'novelExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'novelFontSize': PropertySchema( - id: 86, + id: 91, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 87, + id: 92, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 88, + id: 93, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 89, + id: 94, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 90, + id: 95, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 91, + id: 96, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 92, + id: 97, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 93, + id: 98, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 94, + id: 99, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 95, + id: 100, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 96, + id: 101, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 97, + id: 102, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 98, + id: 103, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 99, + id: 104, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 100, + id: 105, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 101, + id: 106, name: r'relativeTimesTamps', type: IsarType.long, ), r'rpcShowCoverImage': PropertySchema( - id: 102, + id: 107, name: r'rpcShowCoverImage', type: IsarType.bool, ), r'rpcShowReadingWatchingProgress': PropertySchema( - id: 103, + id: 108, name: r'rpcShowReadingWatchingProgress', type: IsarType.bool, ), r'rpcShowTitle': PropertySchema( - id: 104, + id: 109, name: r'rpcShowTitle', type: IsarType.bool, ), r'saveAsCBZArchive': PropertySchema( - id: 105, + id: 110, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 106, + id: 111, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 107, + id: 112, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 108, + id: 113, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 109, + id: 114, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 110, + id: 115, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 111, + id: 116, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 112, + id: 117, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 113, + id: 118, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 114, + id: 119, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'updatedAt': PropertySchema( - id: 115, + id: 120, name: r'updatedAt', type: IsarType.long, ), r'useLibass': PropertySchema( - id: 116, + id: 121, name: r'useLibass', type: IsarType.bool, ), r'useMpvConfig': PropertySchema( - id: 117, + id: 122, name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 118, + id: 123, name: r'usePageTapZones', type: IsarType.bool, ), + r'useYUV420P': PropertySchema( + id: 124, + name: r'useYUV420P', + type: IsarType.bool, + ), r'userAgent': PropertySchema( - id: 119, + id: 125, name: r'userAgent', type: IsarType.string, + ), + r'volumeBoostCap': PropertySchema( + id: 126, + name: r'volumeBoostCap', + type: IsarType.long, ) }, estimateSize: _settingsEstimateSize, @@ -712,6 +749,12 @@ int _settingsEstimateSize( bytesCount += 3 + value.length * 3; } } + { + final value = object.audioPreferredLanguages; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.autoBackupLocation; if (value != null) { @@ -1045,214 +1088,221 @@ void _settingsSerialize( writer.writeBool(offsets[9], object.animeLibraryShowLanguage); writer.writeBool(offsets[10], object.animeLibraryShowNumbersOfItems); writer.writeString(offsets[11], object.appFontFamily); - writer.writeString(offsets[12], object.autoBackupLocation); - writer.writeBool(offsets[13], object.autoExtensionsUpdates); + writer.writeByte(offsets[12], object.audioChannels.index); + writer.writeString(offsets[13], object.audioPreferredLanguages); + writer.writeString(offsets[14], object.autoBackupLocation); + writer.writeBool(offsets[15], object.autoExtensionsUpdates); writer.writeObjectList( - offsets[14], + offsets[16], allOffsets, AutoScrollPagesSchema.serialize, object.autoScrollPages, ); - writer.writeByte(offsets[15], object.backgroundColor.index); - writer.writeLong(offsets[16], object.backupFrequency); - writer.writeLongList(offsets[17], object.backupListOptions); - writer.writeString(offsets[18], object.btServerAddress); - writer.writeLong(offsets[19], object.btServerPort); + writer.writeByte(offsets[17], object.backgroundColor.index); + writer.writeLong(offsets[18], object.backupFrequency); + writer.writeLongList(offsets[19], object.backupListOptions); + writer.writeString(offsets[20], object.btServerAddress); + writer.writeLong(offsets[21], object.btServerPort); writer.writeObjectList( - offsets[20], + offsets[22], allOffsets, ChapterFilterBookmarkedSchema.serialize, object.chapterFilterBookmarkedList, ); writer.writeObjectList( - offsets[21], + offsets[23], allOffsets, ChapterFilterDownloadedSchema.serialize, object.chapterFilterDownloadedList, ); writer.writeObjectList( - offsets[22], + offsets[24], allOffsets, ChapterFilterUnreadSchema.serialize, object.chapterFilterUnreadList, ); writer.writeObjectList( - offsets[23], + offsets[25], allOffsets, ChapterPageIndexSchema.serialize, object.chapterPageIndexList, ); writer.writeObjectList( - offsets[24], + offsets[26], allOffsets, ChapterPageurlsSchema.serialize, object.chapterPageUrlsList, ); - writer.writeBool(offsets[25], object.checkForAppUpdates); - writer.writeBool(offsets[26], object.checkForExtensionUpdates); - writer.writeBool(offsets[27], object.clearChapterCacheOnAppLaunch); - writer.writeByte(offsets[28], object.colorFilterBlendMode.index); - writer.writeLong(offsets[29], object.concurrentDownloads); + writer.writeBool(offsets[27], object.checkForAppUpdates); + writer.writeBool(offsets[28], object.checkForExtensionUpdates); + writer.writeBool(offsets[29], object.clearChapterCacheOnAppLaunch); + writer.writeByte(offsets[30], object.colorFilterBlendMode.index); + writer.writeLong(offsets[31], object.concurrentDownloads); writer.writeObjectList( - offsets[30], + offsets[32], allOffsets, MCookieSchema.serialize, object.cookiesList, ); - writer.writeBool(offsets[31], object.cropBorders); + writer.writeBool(offsets[33], object.cropBorders); writer.writeObject( - offsets[32], + offsets[34], allOffsets, CustomColorFilterSchema.serialize, object.customColorFilter, ); - writer.writeString(offsets[33], object.dateFormat); - writer.writeLong(offsets[34], object.defaultDoubleTapToSkipLength); - writer.writeDouble(offsets[35], object.defaultPlayBackSpeed); - writer.writeByte(offsets[36], object.defaultReaderMode.index); - writer.writeLong(offsets[37], object.defaultSkipIntroLength); + writer.writeString(offsets[35], object.dateFormat); + writer.writeByte(offsets[36], object.debandingType.index); + writer.writeLong(offsets[37], object.defaultDoubleTapToSkipLength); + writer.writeDouble(offsets[38], object.defaultPlayBackSpeed); + writer.writeByte(offsets[39], object.defaultReaderMode.index); + writer.writeLong(offsets[40], object.defaultSkipIntroLength); writer.writeObject( - offsets[38], + offsets[41], allOffsets, L10nLocaleSchema.serialize, object.defaultSubtitleLang, ); - writer.writeByte(offsets[39], object.disableSectionType.index); - writer.writeByte(offsets[40], object.displayType.index); - writer.writeLong(offsets[41], object.doubleTapAnimationSpeed); - writer.writeString(offsets[42], object.downloadLocation); - writer.writeBool(offsets[43], object.downloadOnlyOnWifi); - writer.writeBool(offsets[44], object.enableAniSkip); - writer.writeBool(offsets[45], object.enableAutoSkip); - writer.writeBool(offsets[46], object.enableCustomColorFilter); - writer.writeBool(offsets[47], object.enableDiscordRpc); + writer.writeByte(offsets[42], object.disableSectionType.index); + writer.writeByte(offsets[43], object.displayType.index); + writer.writeLong(offsets[44], object.doubleTapAnimationSpeed); + writer.writeString(offsets[45], object.downloadLocation); + writer.writeBool(offsets[46], object.downloadOnlyOnWifi); + writer.writeBool(offsets[47], object.enableAniSkip); + writer.writeBool(offsets[48], object.enableAudioPitchCorrection); + writer.writeBool(offsets[49], object.enableAutoSkip); + writer.writeBool(offsets[50], object.enableCustomColorFilter); + writer.writeBool(offsets[51], object.enableDiscordRpc); + writer.writeBool(offsets[52], object.enableGpuNext); writer.writeObjectList( - offsets[48], + offsets[53], allOffsets, FilterScanlatorSchema.serialize, object.filterScanlatorList, ); - writer.writeDouble(offsets[49], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[50], object.flexSchemeColorIndex); - writer.writeBool(offsets[51], object.followSystemTheme); - writer.writeBool(offsets[52], object.fullScreenPlayer); - writer.writeBool(offsets[53], object.fullScreenReader); - writer.writeBool(offsets[54], object.hideDiscordRpcInIncognito); - writer.writeStringList(offsets[55], object.hideItems); - writer.writeString(offsets[56], object.hwdecMode); - writer.writeBool(offsets[57], object.incognitoMode); - writer.writeString(offsets[58], object.lastTrackerLibraryLocation); - writer.writeBool(offsets[59], object.libraryDownloadedChapters); - writer.writeLong(offsets[60], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[61], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[62], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[63], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[64], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[65], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[66], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[67], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[68], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[69], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[70], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[71], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[72], object.libraryLocalSource); - writer.writeBool(offsets[73], object.libraryShowCategoryTabs); - writer.writeBool(offsets[74], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[75], object.libraryShowLanguage); - writer.writeBool(offsets[76], object.libraryShowNumbersOfItems); + writer.writeDouble(offsets[54], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[55], object.flexSchemeColorIndex); + writer.writeBool(offsets[56], object.followSystemTheme); + writer.writeBool(offsets[57], object.fullScreenPlayer); + writer.writeBool(offsets[58], object.fullScreenReader); + writer.writeBool(offsets[59], object.hideDiscordRpcInIncognito); + writer.writeStringList(offsets[60], object.hideItems); + writer.writeString(offsets[61], object.hwdecMode); + writer.writeBool(offsets[62], object.incognitoMode); + writer.writeString(offsets[63], object.lastTrackerLibraryLocation); + writer.writeBool(offsets[64], object.libraryDownloadedChapters); + writer.writeLong(offsets[65], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[66], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[67], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[68], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[69], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[70], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[71], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[72], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[73], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[74], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[75], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[76], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[77], object.libraryLocalSource); + writer.writeBool(offsets[78], object.libraryShowCategoryTabs); + writer.writeBool(offsets[79], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[80], object.libraryShowLanguage); + writer.writeBool(offsets[81], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[77], + offsets[82], allOffsets, L10nLocaleSchema.serialize, object.locale, ); writer.writeObjectList( - offsets[78], + offsets[83], allOffsets, RepoSchema.serialize, object.mangaExtensionsRepo, ); - writer.writeLong(offsets[79], object.mangaGridSize); - writer.writeByte(offsets[80], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[81], object.markEpisodeAsSeenType); - writer.writeBool(offsets[82], object.mergeLibraryNavMobile); - writer.writeStringList(offsets[83], object.navigationOrder); - writer.writeByte(offsets[84], object.novelDisplayType.index); + writer.writeLong(offsets[84], object.mangaGridSize); + writer.writeByte(offsets[85], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[86], object.markEpisodeAsSeenType); + writer.writeBool(offsets[87], object.mergeLibraryNavMobile); + writer.writeStringList(offsets[88], object.navigationOrder); + writer.writeByte(offsets[89], object.novelDisplayType.index); writer.writeObjectList( - offsets[85], + offsets[90], allOffsets, RepoSchema.serialize, object.novelExtensionsRepo, ); - writer.writeLong(offsets[86], object.novelFontSize); - writer.writeLong(offsets[87], object.novelGridSize); - writer.writeBool(offsets[88], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[89], object.novelLibraryLocalSource); - writer.writeBool(offsets[90], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[91], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[92], object.novelLibraryShowLanguage); - writer.writeBool(offsets[93], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[94], object.novelTextAlign.index); - writer.writeBool(offsets[95], object.onlyIncludePinnedSources); - writer.writeLong(offsets[96], object.pagePreloadAmount); + writer.writeLong(offsets[91], object.novelFontSize); + writer.writeLong(offsets[92], object.novelGridSize); + writer.writeBool(offsets[93], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[94], object.novelLibraryLocalSource); + writer.writeBool(offsets[95], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[96], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[97], object.novelLibraryShowLanguage); + writer.writeBool(offsets[98], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[99], object.novelTextAlign.index); + writer.writeBool(offsets[100], object.onlyIncludePinnedSources); + writer.writeLong(offsets[101], object.pagePreloadAmount); writer.writeObjectList( - offsets[97], + offsets[102], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[98], + offsets[103], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[99], + offsets[104], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[100], object.pureBlackDarkMode); - writer.writeLong(offsets[101], object.relativeTimesTamps); - writer.writeBool(offsets[102], object.rpcShowCoverImage); - writer.writeBool(offsets[103], object.rpcShowReadingWatchingProgress); - writer.writeBool(offsets[104], object.rpcShowTitle); - writer.writeBool(offsets[105], object.saveAsCBZArchive); - writer.writeByte(offsets[106], object.scaleType.index); - writer.writeBool(offsets[107], object.showPagesNumber); + writer.writeBool(offsets[105], object.pureBlackDarkMode); + writer.writeLong(offsets[106], object.relativeTimesTamps); + writer.writeBool(offsets[107], object.rpcShowCoverImage); + writer.writeBool(offsets[108], object.rpcShowReadingWatchingProgress); + writer.writeBool(offsets[109], object.rpcShowTitle); + writer.writeBool(offsets[110], object.saveAsCBZArchive); + writer.writeByte(offsets[111], object.scaleType.index); + writer.writeBool(offsets[112], object.showPagesNumber); writer.writeObjectList( - offsets[108], + offsets[113], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[109], + offsets[114], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[110], + offsets[115], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[111], + offsets[116], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[112], object.startDatebackup); - writer.writeBool(offsets[113], object.themeIsDark); - writer.writeBool(offsets[114], object.updateProgressAfterReading); - writer.writeLong(offsets[115], object.updatedAt); - writer.writeBool(offsets[116], object.useLibass); - writer.writeBool(offsets[117], object.useMpvConfig); - writer.writeBool(offsets[118], object.usePageTapZones); - writer.writeString(offsets[119], object.userAgent); + writer.writeLong(offsets[117], object.startDatebackup); + writer.writeBool(offsets[118], object.themeIsDark); + writer.writeBool(offsets[119], object.updateProgressAfterReading); + writer.writeLong(offsets[120], object.updatedAt); + writer.writeBool(offsets[121], object.useLibass); + writer.writeBool(offsets[122], object.useMpvConfig); + writer.writeBool(offsets[123], object.usePageTapZones); + writer.writeBool(offsets[124], object.useYUV420P); + writer.writeString(offsets[125], object.userAgent); + writer.writeLong(offsets[126], object.volumeBoostCap); } Settings _settingsDeserialize( @@ -1281,228 +1331,239 @@ Settings _settingsDeserialize( animeLibraryShowLanguage: reader.readBoolOrNull(offsets[9]), animeLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[10]), appFontFamily: reader.readStringOrNull(offsets[11]), - autoBackupLocation: reader.readStringOrNull(offsets[12]), - autoExtensionsUpdates: reader.readBoolOrNull(offsets[13]), + audioChannels: _SettingsaudioChannelsValueEnumMap[ + reader.readByteOrNull(offsets[12])] ?? + AudioChannel.autoSafe, + audioPreferredLanguages: reader.readStringOrNull(offsets[13]), + autoBackupLocation: reader.readStringOrNull(offsets[14]), + autoExtensionsUpdates: reader.readBoolOrNull(offsets[15]), autoScrollPages: reader.readObjectList( - offsets[14], + offsets[16], AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), ), backgroundColor: _SettingsbackgroundColorValueEnumMap[ - reader.readByteOrNull(offsets[15])] ?? + reader.readByteOrNull(offsets[17])] ?? BackgroundColor.black, - backupFrequency: reader.readLongOrNull(offsets[16]), - backupListOptions: reader.readLongList(offsets[17]), - btServerAddress: reader.readStringOrNull(offsets[18]), - btServerPort: reader.readLongOrNull(offsets[19]), + backupFrequency: reader.readLongOrNull(offsets[18]), + backupListOptions: reader.readLongList(offsets[19]), + btServerAddress: reader.readStringOrNull(offsets[20]), + btServerPort: reader.readLongOrNull(offsets[21]), chapterFilterDownloadedList: reader.readObjectList( - offsets[21], + offsets[23], ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), ), chapterPageIndexList: reader.readObjectList( - offsets[23], + offsets[25], ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), ), chapterPageUrlsList: reader.readObjectList( - offsets[24], + offsets[26], ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), ), - checkForAppUpdates: reader.readBoolOrNull(offsets[25]), - checkForExtensionUpdates: reader.readBoolOrNull(offsets[26]), - clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[27]), + checkForAppUpdates: reader.readBoolOrNull(offsets[27]), + checkForExtensionUpdates: reader.readBoolOrNull(offsets[28]), + clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[29]), colorFilterBlendMode: _SettingscolorFilterBlendModeValueEnumMap[ - reader.readByteOrNull(offsets[28])] ?? + reader.readByteOrNull(offsets[30])] ?? ColorFilterBlendMode.none, - concurrentDownloads: reader.readLongOrNull(offsets[29]), + concurrentDownloads: reader.readLongOrNull(offsets[31]), cookiesList: reader.readObjectList( - offsets[30], + offsets[32], MCookieSchema.deserialize, allOffsets, MCookie(), ), - cropBorders: reader.readBoolOrNull(offsets[31]), + cropBorders: reader.readBoolOrNull(offsets[33]), customColorFilter: reader.readObjectOrNull( - offsets[32], + offsets[34], CustomColorFilterSchema.deserialize, allOffsets, ), - dateFormat: reader.readStringOrNull(offsets[33]), - defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[34]), - defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[35]), - defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ + dateFormat: reader.readStringOrNull(offsets[35]), + debandingType: _SettingsdebandingTypeValueEnumMap[ reader.readByteOrNull(offsets[36])] ?? - ReaderMode.vertical, - defaultSkipIntroLength: reader.readLongOrNull(offsets[37]), - disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ + DebandingType.none, + defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[37]), + defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[38]), + defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ reader.readByteOrNull(offsets[39])] ?? + ReaderMode.vertical, + defaultSkipIntroLength: reader.readLongOrNull(offsets[40]), + disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ + reader.readByteOrNull(offsets[42])] ?? SectionType.all, displayType: - _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[40])] ?? + _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[43])] ?? DisplayType.compactGrid, - doubleTapAnimationSpeed: reader.readLongOrNull(offsets[41]), - downloadLocation: reader.readStringOrNull(offsets[42]), - downloadOnlyOnWifi: reader.readBoolOrNull(offsets[43]), - enableAniSkip: reader.readBoolOrNull(offsets[44]), - enableAutoSkip: reader.readBoolOrNull(offsets[45]), - enableCustomColorFilter: reader.readBoolOrNull(offsets[46]), - enableDiscordRpc: reader.readBoolOrNull(offsets[47]), - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[49]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[50]), - followSystemTheme: reader.readBoolOrNull(offsets[51]), - fullScreenPlayer: reader.readBoolOrNull(offsets[52]), - fullScreenReader: reader.readBoolOrNull(offsets[53]), - hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[54]), - hideItems: reader.readStringList(offsets[55]), - hwdecMode: reader.readStringOrNull(offsets[56]), + doubleTapAnimationSpeed: reader.readLongOrNull(offsets[44]), + downloadLocation: reader.readStringOrNull(offsets[45]), + downloadOnlyOnWifi: reader.readBoolOrNull(offsets[46]), + enableAniSkip: reader.readBoolOrNull(offsets[47]), + enableAudioPitchCorrection: reader.readBoolOrNull(offsets[48]), + enableAutoSkip: reader.readBoolOrNull(offsets[49]), + enableCustomColorFilter: reader.readBoolOrNull(offsets[50]), + enableDiscordRpc: reader.readBoolOrNull(offsets[51]), + enableGpuNext: reader.readBoolOrNull(offsets[52]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[54]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[55]), + followSystemTheme: reader.readBoolOrNull(offsets[56]), + fullScreenPlayer: reader.readBoolOrNull(offsets[57]), + fullScreenReader: reader.readBoolOrNull(offsets[58]), + hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[59]), + hideItems: reader.readStringList(offsets[60]), + hwdecMode: reader.readStringOrNull(offsets[61]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[57]), - lastTrackerLibraryLocation: reader.readStringOrNull(offsets[58]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[59]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[60]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[61]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[62]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[63]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[64]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[65]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[66]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[67]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[68]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[69]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[70]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[71]), - libraryLocalSource: reader.readBoolOrNull(offsets[72]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[73]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[74]), - libraryShowLanguage: reader.readBoolOrNull(offsets[75]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[76]), + incognitoMode: reader.readBoolOrNull(offsets[62]), + lastTrackerLibraryLocation: reader.readStringOrNull(offsets[63]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[64]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[65]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[66]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[67]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[68]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[69]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[70]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[71]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[72]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[73]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[74]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[75]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[76]), + libraryLocalSource: reader.readBoolOrNull(offsets[77]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[78]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[79]), + libraryShowLanguage: reader.readBoolOrNull(offsets[80]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[81]), mangaExtensionsRepo: reader.readObjectList( - offsets[78], + offsets[83], RepoSchema.deserialize, allOffsets, Repo(), ), - mangaGridSize: reader.readLongOrNull(offsets[79]), + mangaGridSize: reader.readLongOrNull(offsets[84]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[80])] ?? + reader.readByteOrNull(offsets[85])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[81]), - mergeLibraryNavMobile: reader.readBoolOrNull(offsets[82]), - navigationOrder: reader.readStringList(offsets[83]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[86]), + mergeLibraryNavMobile: reader.readBoolOrNull(offsets[87]), + navigationOrder: reader.readStringList(offsets[88]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[84])] ?? + reader.readByteOrNull(offsets[89])] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( - offsets[85], + offsets[90], RepoSchema.deserialize, allOffsets, Repo(), ), - novelFontSize: reader.readLongOrNull(offsets[86]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[88]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[89]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[90]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[91]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[92]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[93]), + novelFontSize: reader.readLongOrNull(offsets[91]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[93]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[94]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[95]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[96]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[97]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[98]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[94])] ?? + reader.readByteOrNull(offsets[99])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[95]), - pagePreloadAmount: reader.readLongOrNull(offsets[96]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[100]), + pagePreloadAmount: reader.readLongOrNull(offsets[101]), personalPageModeList: reader.readObjectList( - offsets[97], + offsets[102], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[98], + offsets[103], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[99], + offsets[104], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[100]), - relativeTimesTamps: reader.readLongOrNull(offsets[101]), - rpcShowCoverImage: reader.readBoolOrNull(offsets[102]), - rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[103]), - rpcShowTitle: reader.readBoolOrNull(offsets[104]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[105]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[105]), + relativeTimesTamps: reader.readLongOrNull(offsets[106]), + rpcShowCoverImage: reader.readBoolOrNull(offsets[107]), + rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[108]), + rpcShowTitle: reader.readBoolOrNull(offsets[109]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[110]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[106])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[111])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[107]), + showPagesNumber: reader.readBoolOrNull(offsets[112]), sortChapterList: reader.readObjectList( - offsets[108], + offsets[113], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[109], + offsets[114], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[110], + offsets[115], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[111], + offsets[116], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[112]), - themeIsDark: reader.readBoolOrNull(offsets[113]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), - updatedAt: reader.readLongOrNull(offsets[115]), - useLibass: reader.readBoolOrNull(offsets[116]), - useMpvConfig: reader.readBoolOrNull(offsets[117]), - usePageTapZones: reader.readBoolOrNull(offsets[118]), - userAgent: reader.readStringOrNull(offsets[119]), + startDatebackup: reader.readLongOrNull(offsets[117]), + themeIsDark: reader.readBoolOrNull(offsets[118]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[119]), + updatedAt: reader.readLongOrNull(offsets[120]), + useLibass: reader.readBoolOrNull(offsets[121]), + useMpvConfig: reader.readBoolOrNull(offsets[122]), + usePageTapZones: reader.readBoolOrNull(offsets[123]), + useYUV420P: reader.readBoolOrNull(offsets[124]), + userAgent: reader.readStringOrNull(offsets[125]), + volumeBoostCap: reader.readLongOrNull(offsets[126]), ); object.chapterFilterBookmarkedList = reader.readObjectList( - offsets[20], + offsets[22], ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), ); object.chapterFilterUnreadList = reader.readObjectList( - offsets[22], + offsets[24], ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), ); object.defaultSubtitleLang = reader.readObjectOrNull( - offsets[38], + offsets[41], L10nLocaleSchema.deserialize, allOffsets, ); object.filterScanlatorList = reader.readObjectList( - offsets[48], + offsets[53], FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[77], + offsets[82], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[87]); + object.novelGridSize = reader.readLongOrNull(offsets[92]); return object; } @@ -1545,168 +1606,172 @@ P _settingsDeserializeProp

    ( case 11: return (reader.readStringOrNull(offset)) as P; case 12: - return (reader.readStringOrNull(offset)) as P; + return (_SettingsaudioChannelsValueEnumMap[ + reader.readByteOrNull(offset)] ?? + AudioChannel.autoSafe) as P; case 13: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 14: + return (reader.readStringOrNull(offset)) as P; + case 15: + return (reader.readBoolOrNull(offset)) as P; + case 16: return (reader.readObjectList( offset, AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), )) as P; - case 15: + case 17: return (_SettingsbackgroundColorValueEnumMap[ reader.readByteOrNull(offset)] ?? BackgroundColor.black) as P; - case 16: - return (reader.readLongOrNull(offset)) as P; - case 17: - return (reader.readLongList(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; - case 19: return (reader.readLongOrNull(offset)) as P; + case 19: + return (reader.readLongList(offset)) as P; case 20: + return (reader.readStringOrNull(offset)) as P; + case 21: + return (reader.readLongOrNull(offset)) as P; + case 22: return (reader.readObjectList( offset, ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), )) as P; - case 21: + case 23: return (reader.readObjectList( offset, ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), )) as P; - case 22: + case 24: return (reader.readObjectList( offset, ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), )) as P; - case 23: + case 25: return (reader.readObjectList( offset, ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), )) as P; - case 24: + case 26: return (reader.readObjectList( offset, ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), )) as P; - case 25: - return (reader.readBoolOrNull(offset)) as P; - case 26: - return (reader.readBoolOrNull(offset)) as P; case 27: return (reader.readBoolOrNull(offset)) as P; case 28: + return (reader.readBoolOrNull(offset)) as P; + case 29: + return (reader.readBoolOrNull(offset)) as P; + case 30: return (_SettingscolorFilterBlendModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ColorFilterBlendMode.none) as P; - case 29: + case 31: return (reader.readLongOrNull(offset)) as P; - case 30: + case 32: return (reader.readObjectList( offset, MCookieSchema.deserialize, allOffsets, MCookie(), )) as P; - case 31: + case 33: return (reader.readBoolOrNull(offset)) as P; - case 32: + case 34: return (reader.readObjectOrNull( offset, CustomColorFilterSchema.deserialize, allOffsets, )) as P; - case 33: - return (reader.readStringOrNull(offset)) as P; - case 34: - return (reader.readLongOrNull(offset)) as P; case 35: - return (reader.readDoubleOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 36: - return (_SettingsdefaultReaderModeValueEnumMap[ + return (_SettingsdebandingTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? - ReaderMode.vertical) as P; + DebandingType.none) as P; case 37: return (reader.readLongOrNull(offset)) as P; case 38: + return (reader.readDoubleOrNull(offset)) as P; + case 39: + return (_SettingsdefaultReaderModeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + ReaderMode.vertical) as P; + case 40: + return (reader.readLongOrNull(offset)) as P; + case 41: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 39: + case 42: return (_SettingsdisableSectionTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? SectionType.all) as P; - case 40: + case 43: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 41: - return (reader.readLongOrNull(offset)) as P; - case 42: - return (reader.readStringOrNull(offset)) as P; - case 43: - return (reader.readBoolOrNull(offset)) as P; case 44: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 45: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 46: return (reader.readBoolOrNull(offset)) as P; case 47: return (reader.readBoolOrNull(offset)) as P; case 48: + return (reader.readBoolOrNull(offset)) as P; + case 49: + return (reader.readBoolOrNull(offset)) as P; + case 50: + return (reader.readBoolOrNull(offset)) as P; + case 51: + return (reader.readBoolOrNull(offset)) as P; + case 52: + return (reader.readBoolOrNull(offset)) as P; + case 53: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 49: - return (reader.readDoubleOrNull(offset)) as P; - case 50: - return (reader.readLongOrNull(offset)) as P; - case 51: - return (reader.readBoolOrNull(offset)) as P; - case 52: - return (reader.readBoolOrNull(offset)) as P; - case 53: - return (reader.readBoolOrNull(offset)) as P; case 54: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 55: - return (reader.readStringList(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 56: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 57: return (reader.readBoolOrNull(offset)) as P; case 58: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 59: return (reader.readBoolOrNull(offset)) as P; case 60: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 61: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 62: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 63: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 64: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 65: return (reader.readLongOrNull(offset)) as P; case 66: @@ -1722,153 +1787,167 @@ P _settingsDeserializeProp

    ( case 52: return (reader.readBoolOrNull(offset)) as P; case 53: + return (reader.readBoolOrNull(offset)) as P; + case 54: + return (reader.readBoolOrNull(offset)) as P; + case 55: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 54: - return (reader.readDoubleOrNull(offset)) as P; - case 55: - return (reader.readLongOrNull(offset)) as P; case 56: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 57: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 58: return (reader.readBoolOrNull(offset)) as P; case 59: return (reader.readBoolOrNull(offset)) as P; case 60: - return (reader.readStringList(offset)) as P; - case 61: - return (reader.readStringOrNull(offset)) as P; - case 62: return (reader.readBoolOrNull(offset)) as P; + case 61: + return (reader.readBoolOrNull(offset)) as P; + case 62: + return (reader.readStringList(offset)) as P; case 63: return (reader.readStringOrNull(offset)) as P; case 64: return (reader.readBoolOrNull(offset)) as P; case 65: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 66: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 67: return (reader.readLongOrNull(offset)) as P; case 68: @@ -1797,9 +1811,9 @@ P _settingsDeserializeProp

    ( case 76: return (reader.readLongOrNull(offset)) as P; case 77: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 78: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 79: return (reader.readBoolOrNull(offset)) as P; case 80: @@ -1807,49 +1821,49 @@ P _settingsDeserializeProp

    ( case 81: return (reader.readBoolOrNull(offset)) as P; case 82: + return (reader.readBoolOrNull(offset)) as P; + case 83: + return (reader.readBoolOrNull(offset)) as P; + case 84: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 83: + case 85: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 84: - return (reader.readLongOrNull(offset)) as P; - case 85: - return (_SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.comfortableGrid) as P; case 86: return (reader.readLongOrNull(offset)) as P; case 87: - return (reader.readBoolOrNull(offset)) as P; + return (_SettingsmangaHomeDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.comfortableGrid) as P; case 88: - return (reader.readStringList(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 89: + return (reader.readBoolOrNull(offset)) as P; + case 90: + return (reader.readStringList(offset)) as P; + case 91: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 90: + case 92: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 91: - return (reader.readLongOrNull(offset)) as P; - case 92: - return (reader.readLongOrNull(offset)) as P; case 93: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 94: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 95: return (reader.readBoolOrNull(offset)) as P; case 96: @@ -1859,69 +1873,61 @@ P _settingsDeserializeProp

    ( case 98: return (reader.readBoolOrNull(offset)) as P; case 99: - return (_SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offset)] ?? - NovelTextAlign.left) as P; + return (reader.readBoolOrNull(offset)) as P; case 100: return (reader.readBoolOrNull(offset)) as P; case 101: - return (reader.readLongOrNull(offset)) as P; + return (_SettingsnovelTextAlignValueEnumMap[ + reader.readByteOrNull(offset)] ?? + NovelTextAlign.left) as P; case 102: + return (reader.readBoolOrNull(offset)) as P; + case 103: + return (reader.readLongOrNull(offset)) as P; + case 104: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 103: + case 105: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 104: + case 106: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 105: - return (reader.readBoolOrNull(offset)) as P; - case 106: - return (reader.readLongOrNull(offset)) as P; case 107: return (reader.readBoolOrNull(offset)) as P; case 108: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 109: return (reader.readBoolOrNull(offset)) as P; case 110: return (reader.readBoolOrNull(offset)) as P; case 111: - return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; + return (reader.readBoolOrNull(offset)) as P; case 112: return (reader.readBoolOrNull(offset)) as P; case 113: + return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ScaleType.fitScreen) as P; + case 114: + return (reader.readBoolOrNull(offset)) as P; + case 115: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 114: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 115: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; case 116: return (reader.readObjectOrNull( offset, @@ -1929,24 +1935,36 @@ P _settingsDeserializeProp

    ( allOffsets, )) as P; case 117: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 118: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 119: - return (reader.readBoolOrNull(offset)) as P; - case 120: return (reader.readLongOrNull(offset)) as P; + case 120: + return (reader.readBoolOrNull(offset)) as P; case 121: return (reader.readBoolOrNull(offset)) as P; case 122: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 123: return (reader.readBoolOrNull(offset)) as P; case 124: return (reader.readBoolOrNull(offset)) as P; case 125: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 126: + return (reader.readBoolOrNull(offset)) as P; + case 127: + return (reader.readStringOrNull(offset)) as P; + case 128: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -5715,6 +5733,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableAutoPiPIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enableAutoPiP', + )); + }); + } + + QueryBuilder + enableAutoPiPIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enableAutoPiP', + )); + }); + } + + QueryBuilder enableAutoPiPEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enableAutoPiP', + value: value, + )); + }); + } + QueryBuilder enableAutoSkipIsNull() { return QueryBuilder.apply(this, (query) { @@ -5827,6 +5873,32 @@ extension SettingsQueryFilter }); } + QueryBuilder enablePiPIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enablePiP', + )); + }); + } + + QueryBuilder enablePiPIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enablePiP', + )); + }); + } + + QueryBuilder enablePiPEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enablePiP', + value: value, + )); + }); + } + QueryBuilder filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { @@ -11051,6 +11123,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByEnableAutoPiP() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAutoPiP', Sort.asc); + }); + } + + QueryBuilder sortByEnableAutoPiPDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAutoPiP', Sort.desc); + }); + } + QueryBuilder sortByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -11101,6 +11185,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByEnablePiP() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enablePiP', Sort.asc); + }); + } + + QueryBuilder sortByEnablePiPDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enablePiP', Sort.desc); + }); + } + QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -12396,6 +12492,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByEnableAutoPiP() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAutoPiP', Sort.asc); + }); + } + + QueryBuilder thenByEnableAutoPiPDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAutoPiP', Sort.desc); + }); + } + QueryBuilder thenByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -12446,6 +12554,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByEnablePiP() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enablePiP', Sort.asc); + }); + } + + QueryBuilder thenByEnablePiPDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enablePiP', Sort.desc); + }); + } + QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -13517,6 +13637,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByEnableAutoPiP() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableAutoPiP'); + }); + } + QueryBuilder distinctByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAutoSkip'); @@ -13542,6 +13668,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByEnablePiP() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enablePiP'); + }); + } + QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -14292,6 +14424,12 @@ extension SettingsQueryProperty }); } + QueryBuilder enableAutoPiPProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableAutoPiP'); + }); + } + QueryBuilder enableAutoSkipProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAutoSkip'); @@ -14317,6 +14455,12 @@ extension SettingsQueryProperty }); } + QueryBuilder enablePiPProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enablePiP'); + }); + } + QueryBuilder?, QQueryOperations> filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 86d26e15..9d45df3c 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -852,6 +852,16 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo // Else (if user already watches an episode and just changes it), // stay in the same mode, the user left it in. try { + final enablePiP = ref.read(enablePiPStateProvider); + final enableAutoPiP = ref.read(enableAutoPiPStateProvider); + + /// only available for iOS 15+ + if (enablePiP && _controller.isPictureInPictureAvailable()) { + _controller.enablePictureInPicture(); + if (enableAutoPiP) { + _controller.enableAutoPictureInPicture(); + } + } final defaultSkipIntroLength = ref.read( defaultSkipIntroLengthStateProvider, ); @@ -1944,53 +1954,12 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo } }, ), - // IconButton( - // onPressed: () { - // showDialog( - // context: context, - // builder: (context) { - // return AlertDialog( - // scrollable: true, - // title: Text("Player Settings"), - // content: SizedBox( - // width: context.width(0.8), - // child: Column( - // crossAxisAlignment: - // CrossAxisAlignment.start, - // children: [ - // SwitchListTile( - // value: false, - // title: Text( - // "Enable Volume and Brightness Gestures", - // style: TextStyle( - // color: Theme.of(context) - // .textTheme - // .bodyLarge! - // .color! - // .withValues(alpha: 0.9), - // fontSize: 14), - // ), - // onChanged: (value) {}), - // SwitchListTile( - // value: false, - // title: Text( - // "Enable Horizonal Seek Gestures", - // style: TextStyle( - // color: Theme.of(context) - // .textTheme - // .bodyLarge! - // .color! - // .withValues(alpha: 0.9), - // fontSize: 14), - // ), - // onChanged: (value) {}), - // ], - // ), - // ), - // ); - // }); - // }, - // icon: Icon(Icons.adaptive.more)) + if (_controller.isPictureInPictureAvailable()) + IconButton( + onPressed: () async => + await _controller.enterPictureInPicture(), + icon: const Icon(Icons.featured_video_outlined), + ), ], ), ], diff --git a/lib/modules/more/data_and_storage/providers/restore.g.dart b/lib/modules/more/data_and_storage/providers/restore.g.dart index aed202b8..4d55b176 100644 --- a/lib/modules/more/data_and_storage/providers/restore.g.dart +++ b/lib/modules/more/data_and_storage/providers/restore.g.dart @@ -173,7 +173,7 @@ class _DoRestoreProviderElement extends AutoDisposeProviderElement BuildContext get context => (origin as DoRestoreProvider).context; } -String _$restoreBackupHash() => r'0dc4d911f0b84fd7fa30acf690799b196db4de6e'; +String _$restoreBackupHash() => r'adc705e1e65dedcc919a525d7bd14f6451620c43'; /// See also [restoreBackup]. @ProviderFor(restoreBackup) diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index bf1c64e4..192fcae2 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; @@ -18,6 +20,8 @@ class PlayerScreen extends ConsumerStatefulWidget { class _PlayerScreenState extends ConsumerState { @override Widget build(BuildContext context) { + final enablePiP = ref.watch(enablePiPStateProvider); + final enableAutoPiP = ref.watch(enableAutoPiPStateProvider); final defaultSubtitleLang = ref.watch(defaultSubtitleLangStateProvider); final markEpisodeAsSeenType = ref.watch(markEpisodeAsSeenTypeStateProvider); final defaultSkipIntroLength = ref.watch( @@ -38,6 +42,22 @@ class _PlayerScreenState extends ConsumerState { body: SingleChildScrollView( child: Column( children: [ + if (Platform.isIOS) + SwitchListTile( + value: enablePiP, + title: Text(context.l10n.enable_pip), + onChanged: (value) { + ref.read(enablePiPStateProvider.notifier).set(value); + }, + ), + if (Platform.isIOS) + SwitchListTile( + value: enableAutoPiP, + title: Text(context.l10n.enable_auto_pip), + onChanged: (value) { + ref.read(enableAutoPiPStateProvider.notifier).set(value); + }, + ), ListTile( onTap: () { showDialog( diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 5996fb87..7ae4782d 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -5,6 +5,46 @@ import 'package:mangayomi/models/settings.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'player_state_provider.g.dart'; +@riverpod +class EnablePiPState extends _$EnablePiPState { + @override + bool build() { + return isar.settings.getSync(227)!.enablePiP ?? true; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enablePiP = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class EnableAutoPiPState extends _$EnableAutoPiPState { + @override + bool build() { + return isar.settings.getSync(227)!.enableAutoPiP ?? true; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableAutoPiP = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + @riverpod class DefaultSubtitleLangState extends _$DefaultSubtitleLangState { @override diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 58df635c..7fb1d029 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -6,6 +6,39 @@ part of 'player_state_provider.dart'; // RiverpodGenerator // ************************************************************************** +String _$enablePiPStateHash() => r'e99c6a5dc9d6fe55c6b33b03d2d74e55ae5f4199'; + +/// See also [EnablePiPState]. +@ProviderFor(EnablePiPState) +final enablePiPStateProvider = + AutoDisposeNotifierProvider.internal( + EnablePiPState.new, + name: r'enablePiPStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enablePiPStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$EnablePiPState = AutoDisposeNotifier; +String _$enableAutoPiPStateHash() => + r'5d0e53cccb9be4cedb8567ce1cd7b5fe3ff2e52f'; + +/// See also [EnableAutoPiPState]. +@ProviderFor(EnableAutoPiPState) +final enableAutoPiPStateProvider = + AutoDisposeNotifierProvider.internal( + EnableAutoPiPState.new, + name: r'enableAutoPiPStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAutoPiPStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$EnableAutoPiPState = AutoDisposeNotifier; String _$defaultSubtitleLangStateHash() => r'ae7b275e168dd15117512d9ed1c474736458753b'; diff --git a/lib/utils/date.dart b/lib/utils/date.dart index 99fa3aaa..509c4eec 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -79,7 +79,7 @@ String dateFormat( showInDaysFuture ? l10n.in_n_days(difference) : l10n.n_days_ago(difference), - _ => l10n.a_week_ago, + _ => showInDaysFuture ? l10n.next_week : l10n.a_week_ago, }; } } diff --git a/pubspec.lock b/pubspec.lock index d7a06737..5dea9a50 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" + resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From fc8cfd75e5a7c84db606712293d9e3c52c77c547 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 7 Aug 2025 22:43:18 +0200 Subject: [PATCH 046/100] + --- pubspec.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 5dea9a50..5f633593 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: f26da7cc3725e109c63e1300639df00cd65992a3 + resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From 72dd2d76615c807e7e4a5ec834fdfa766c3c3903 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 7 Aug 2025 23:56:27 +0200 Subject: [PATCH 047/100] removed iOS PiP --- ios/Runner/Info.plist | 1 - lib/l10n/app_en.arb | 4 +- lib/models/settings.dart | 10 - lib/models/settings.g.dart | 730 +++++++----------- lib/modules/anime/anime_player_view.dart | 16 - .../more/settings/player/player_screen.dart | 18 - .../providers/player_state_provider.dart | 40 - .../providers/player_state_provider.g.dart | 33 - 8 files changed, 295 insertions(+), 557 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 421b7dd5..ed2cfaee 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -36,7 +36,6 @@ UIBackgroundModes fetch - audio UILaunchStoryboardName LaunchScreen diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index e7ad49df..94700e35 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -520,6 +520,6 @@ "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", - "enable_pip": "Enable Picture-in-Picture (PiP)", - "enable_auto_pip": "Enter PiP automatically when moving out of app" + "recommendations": "Recommendations", + "recommendations_similarity": "Similarity:" } diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 540229f0..425f9134 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -276,10 +276,6 @@ class Settings { int? volumeBoostCap; - bool? enablePiP; - - bool? enableAutoPiP; - Settings({ this.id = 227, this.updatedAt = 0, @@ -403,8 +399,6 @@ class Settings { this.enableAudioPitchCorrection, this.audioChannels = AudioChannel.autoSafe, this.volumeBoostCap, - this.enablePiP = true, - this.enableAutoPiP = true, }); Settings.fromJson(Map json) { @@ -636,8 +630,6 @@ class Settings { audioChannels = AudioChannel .values[json['audioChannels'] ?? AudioChannel.autoSafe.index]; volumeBoostCap = json['volumeBoostCap']; - enablePiP = json['enablePiP']; - enableAutoPiP = json['enableAutoPiP']; } Map toJson() => { @@ -784,8 +776,6 @@ class Settings { 'enableAudioPitchCorrection': enableAudioPitchCorrection, 'audioChannels': audioChannels.index, 'volumeBoostCap': volumeBoostCap, - 'enablePiP': enablePiP, - 'enableAutoPiP': enableAutoPiP, }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index fbd751cd..975f0946 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -280,418 +280,408 @@ const SettingsSchema = CollectionSchema( name: r'enableAudioPitchCorrection', type: IsarType.bool, ), - r'enableAutoPiP': PropertySchema( - id: 49, - name: r'enableAutoPiP', - type: IsarType.bool, - ), r'enableAutoSkip': PropertySchema( - id: 50, + id: 49, name: r'enableAutoSkip', type: IsarType.bool, ), r'enableCustomColorFilter': PropertySchema( - id: 51, + id: 50, name: r'enableCustomColorFilter', type: IsarType.bool, ), r'enableDiscordRpc': PropertySchema( - id: 52, + id: 51, name: r'enableDiscordRpc', type: IsarType.bool, ), r'enableGpuNext': PropertySchema( - id: 53, + id: 52, name: r'enableGpuNext', type: IsarType.bool, ), - r'enablePiP': PropertySchema( - id: 54, - name: r'enablePiP', - type: IsarType.bool, - ), r'filterScanlatorList': PropertySchema( - id: 55, + id: 53, name: r'filterScanlatorList', type: IsarType.objectList, target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 56, + id: 54, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 57, + id: 55, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'followSystemTheme': PropertySchema( - id: 58, + id: 56, name: r'followSystemTheme', type: IsarType.bool, ), r'fullScreenPlayer': PropertySchema( - id: 59, + id: 57, name: r'fullScreenPlayer', type: IsarType.bool, ), r'fullScreenReader': PropertySchema( - id: 60, + id: 58, name: r'fullScreenReader', type: IsarType.bool, ), r'hideDiscordRpcInIncognito': PropertySchema( - id: 61, + id: 59, name: r'hideDiscordRpcInIncognito', type: IsarType.bool, ), r'hideItems': PropertySchema( - id: 62, + id: 60, name: r'hideItems', type: IsarType.stringList, ), r'hwdecMode': PropertySchema( - id: 63, + id: 61, name: r'hwdecMode', type: IsarType.string, ), r'incognitoMode': PropertySchema( - id: 64, + id: 62, name: r'incognitoMode', type: IsarType.bool, ), r'lastTrackerLibraryLocation': PropertySchema( - id: 65, + id: 63, name: r'lastTrackerLibraryLocation', type: IsarType.string, ), r'libraryDownloadedChapters': PropertySchema( - id: 66, + id: 64, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 67, + id: 65, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 68, + id: 66, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 69, + id: 67, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 70, + id: 68, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 71, + id: 69, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 72, + id: 70, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 73, + id: 71, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 74, + id: 72, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 75, + id: 73, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 76, + id: 74, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 77, + id: 75, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 78, + id: 76, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 79, + id: 77, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 80, + id: 78, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 81, + id: 79, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 82, + id: 80, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 83, + id: 81, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 84, + id: 82, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( - id: 85, + id: 83, name: r'mangaExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'mangaGridSize': PropertySchema( - id: 86, + id: 84, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 87, + id: 85, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 88, + id: 86, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'mergeLibraryNavMobile': PropertySchema( - id: 89, + id: 87, name: r'mergeLibraryNavMobile', type: IsarType.bool, ), r'navigationOrder': PropertySchema( - id: 90, + id: 88, name: r'navigationOrder', type: IsarType.stringList, ), r'novelDisplayType': PropertySchema( - id: 91, + id: 89, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelExtensionsRepo': PropertySchema( - id: 92, + id: 90, name: r'novelExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'novelFontSize': PropertySchema( - id: 93, + id: 91, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 94, + id: 92, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 95, + id: 93, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 96, + id: 94, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 97, + id: 95, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 98, + id: 96, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 99, + id: 97, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 100, + id: 98, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 101, + id: 99, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 102, + id: 100, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 103, + id: 101, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 104, + id: 102, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 105, + id: 103, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 106, + id: 104, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 107, + id: 105, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 108, + id: 106, name: r'relativeTimesTamps', type: IsarType.long, ), r'rpcShowCoverImage': PropertySchema( - id: 109, + id: 107, name: r'rpcShowCoverImage', type: IsarType.bool, ), r'rpcShowReadingWatchingProgress': PropertySchema( - id: 110, + id: 108, name: r'rpcShowReadingWatchingProgress', type: IsarType.bool, ), r'rpcShowTitle': PropertySchema( - id: 111, + id: 109, name: r'rpcShowTitle', type: IsarType.bool, ), r'saveAsCBZArchive': PropertySchema( - id: 112, + id: 110, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 113, + id: 111, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 114, + id: 112, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 115, + id: 113, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 116, + id: 114, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 117, + id: 115, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 118, + id: 116, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 119, + id: 117, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 120, + id: 118, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 121, + id: 119, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'updatedAt': PropertySchema( - id: 122, + id: 120, name: r'updatedAt', type: IsarType.long, ), r'useLibass': PropertySchema( - id: 123, + id: 121, name: r'useLibass', type: IsarType.bool, ), r'useMpvConfig': PropertySchema( - id: 124, + id: 122, name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 125, + id: 123, name: r'usePageTapZones', type: IsarType.bool, ), r'useYUV420P': PropertySchema( - id: 126, + id: 124, name: r'useYUV420P', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 127, + id: 125, name: r'userAgent', type: IsarType.string, ), r'volumeBoostCap': PropertySchema( - id: 128, + id: 126, name: r'volumeBoostCap', type: IsarType.long, ) @@ -1180,141 +1170,139 @@ void _settingsSerialize( writer.writeBool(offsets[46], object.downloadOnlyOnWifi); writer.writeBool(offsets[47], object.enableAniSkip); writer.writeBool(offsets[48], object.enableAudioPitchCorrection); - writer.writeBool(offsets[49], object.enableAutoPiP); - writer.writeBool(offsets[50], object.enableAutoSkip); - writer.writeBool(offsets[51], object.enableCustomColorFilter); - writer.writeBool(offsets[52], object.enableDiscordRpc); - writer.writeBool(offsets[53], object.enableGpuNext); - writer.writeBool(offsets[54], object.enablePiP); + writer.writeBool(offsets[49], object.enableAutoSkip); + writer.writeBool(offsets[50], object.enableCustomColorFilter); + writer.writeBool(offsets[51], object.enableDiscordRpc); + writer.writeBool(offsets[52], object.enableGpuNext); writer.writeObjectList( - offsets[55], + offsets[53], allOffsets, FilterScanlatorSchema.serialize, object.filterScanlatorList, ); - writer.writeDouble(offsets[56], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[57], object.flexSchemeColorIndex); - writer.writeBool(offsets[58], object.followSystemTheme); - writer.writeBool(offsets[59], object.fullScreenPlayer); - writer.writeBool(offsets[60], object.fullScreenReader); - writer.writeBool(offsets[61], object.hideDiscordRpcInIncognito); - writer.writeStringList(offsets[62], object.hideItems); - writer.writeString(offsets[63], object.hwdecMode); - writer.writeBool(offsets[64], object.incognitoMode); - writer.writeString(offsets[65], object.lastTrackerLibraryLocation); - writer.writeBool(offsets[66], object.libraryDownloadedChapters); - writer.writeLong(offsets[67], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[68], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[69], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[70], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[71], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[72], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[73], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[74], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[75], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[76], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[77], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[78], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[79], object.libraryLocalSource); - writer.writeBool(offsets[80], object.libraryShowCategoryTabs); - writer.writeBool(offsets[81], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[82], object.libraryShowLanguage); - writer.writeBool(offsets[83], object.libraryShowNumbersOfItems); + writer.writeDouble(offsets[54], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[55], object.flexSchemeColorIndex); + writer.writeBool(offsets[56], object.followSystemTheme); + writer.writeBool(offsets[57], object.fullScreenPlayer); + writer.writeBool(offsets[58], object.fullScreenReader); + writer.writeBool(offsets[59], object.hideDiscordRpcInIncognito); + writer.writeStringList(offsets[60], object.hideItems); + writer.writeString(offsets[61], object.hwdecMode); + writer.writeBool(offsets[62], object.incognitoMode); + writer.writeString(offsets[63], object.lastTrackerLibraryLocation); + writer.writeBool(offsets[64], object.libraryDownloadedChapters); + writer.writeLong(offsets[65], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[66], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[67], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[68], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[69], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[70], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[71], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[72], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[73], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[74], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[75], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[76], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[77], object.libraryLocalSource); + writer.writeBool(offsets[78], object.libraryShowCategoryTabs); + writer.writeBool(offsets[79], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[80], object.libraryShowLanguage); + writer.writeBool(offsets[81], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[84], + offsets[82], allOffsets, L10nLocaleSchema.serialize, object.locale, ); writer.writeObjectList( - offsets[85], + offsets[83], allOffsets, RepoSchema.serialize, object.mangaExtensionsRepo, ); - writer.writeLong(offsets[86], object.mangaGridSize); - writer.writeByte(offsets[87], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[88], object.markEpisodeAsSeenType); - writer.writeBool(offsets[89], object.mergeLibraryNavMobile); - writer.writeStringList(offsets[90], object.navigationOrder); - writer.writeByte(offsets[91], object.novelDisplayType.index); + writer.writeLong(offsets[84], object.mangaGridSize); + writer.writeByte(offsets[85], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[86], object.markEpisodeAsSeenType); + writer.writeBool(offsets[87], object.mergeLibraryNavMobile); + writer.writeStringList(offsets[88], object.navigationOrder); + writer.writeByte(offsets[89], object.novelDisplayType.index); writer.writeObjectList( - offsets[92], + offsets[90], allOffsets, RepoSchema.serialize, object.novelExtensionsRepo, ); - writer.writeLong(offsets[93], object.novelFontSize); - writer.writeLong(offsets[94], object.novelGridSize); - writer.writeBool(offsets[95], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[96], object.novelLibraryLocalSource); - writer.writeBool(offsets[97], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[98], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[99], object.novelLibraryShowLanguage); - writer.writeBool(offsets[100], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[101], object.novelTextAlign.index); - writer.writeBool(offsets[102], object.onlyIncludePinnedSources); - writer.writeLong(offsets[103], object.pagePreloadAmount); + writer.writeLong(offsets[91], object.novelFontSize); + writer.writeLong(offsets[92], object.novelGridSize); + writer.writeBool(offsets[93], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[94], object.novelLibraryLocalSource); + writer.writeBool(offsets[95], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[96], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[97], object.novelLibraryShowLanguage); + writer.writeBool(offsets[98], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[99], object.novelTextAlign.index); + writer.writeBool(offsets[100], object.onlyIncludePinnedSources); + writer.writeLong(offsets[101], object.pagePreloadAmount); writer.writeObjectList( - offsets[104], + offsets[102], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[105], + offsets[103], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[106], + offsets[104], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[107], object.pureBlackDarkMode); - writer.writeLong(offsets[108], object.relativeTimesTamps); - writer.writeBool(offsets[109], object.rpcShowCoverImage); - writer.writeBool(offsets[110], object.rpcShowReadingWatchingProgress); - writer.writeBool(offsets[111], object.rpcShowTitle); - writer.writeBool(offsets[112], object.saveAsCBZArchive); - writer.writeByte(offsets[113], object.scaleType.index); - writer.writeBool(offsets[114], object.showPagesNumber); + writer.writeBool(offsets[105], object.pureBlackDarkMode); + writer.writeLong(offsets[106], object.relativeTimesTamps); + writer.writeBool(offsets[107], object.rpcShowCoverImage); + writer.writeBool(offsets[108], object.rpcShowReadingWatchingProgress); + writer.writeBool(offsets[109], object.rpcShowTitle); + writer.writeBool(offsets[110], object.saveAsCBZArchive); + writer.writeByte(offsets[111], object.scaleType.index); + writer.writeBool(offsets[112], object.showPagesNumber); writer.writeObjectList( - offsets[115], + offsets[113], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[116], + offsets[114], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[117], + offsets[115], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[118], + offsets[116], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[119], object.startDatebackup); - writer.writeBool(offsets[120], object.themeIsDark); - writer.writeBool(offsets[121], object.updateProgressAfterReading); - writer.writeLong(offsets[122], object.updatedAt); - writer.writeBool(offsets[123], object.useLibass); - writer.writeBool(offsets[124], object.useMpvConfig); - writer.writeBool(offsets[125], object.usePageTapZones); - writer.writeBool(offsets[126], object.useYUV420P); - writer.writeString(offsets[127], object.userAgent); - writer.writeLong(offsets[128], object.volumeBoostCap); + writer.writeLong(offsets[117], object.startDatebackup); + writer.writeBool(offsets[118], object.themeIsDark); + writer.writeBool(offsets[119], object.updateProgressAfterReading); + writer.writeLong(offsets[120], object.updatedAt); + writer.writeBool(offsets[121], object.useLibass); + writer.writeBool(offsets[122], object.useMpvConfig); + writer.writeBool(offsets[123], object.usePageTapZones); + writer.writeBool(offsets[124], object.useYUV420P); + writer.writeString(offsets[125], object.userAgent); + writer.writeLong(offsets[126], object.volumeBoostCap); } Settings _settingsDeserialize( @@ -1420,133 +1408,131 @@ Settings _settingsDeserialize( downloadOnlyOnWifi: reader.readBoolOrNull(offsets[46]), enableAniSkip: reader.readBoolOrNull(offsets[47]), enableAudioPitchCorrection: reader.readBoolOrNull(offsets[48]), - enableAutoPiP: reader.readBoolOrNull(offsets[49]), - enableAutoSkip: reader.readBoolOrNull(offsets[50]), - enableCustomColorFilter: reader.readBoolOrNull(offsets[51]), - enableDiscordRpc: reader.readBoolOrNull(offsets[52]), - enableGpuNext: reader.readBoolOrNull(offsets[53]), - enablePiP: reader.readBoolOrNull(offsets[54]), - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[56]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[57]), - followSystemTheme: reader.readBoolOrNull(offsets[58]), - fullScreenPlayer: reader.readBoolOrNull(offsets[59]), - fullScreenReader: reader.readBoolOrNull(offsets[60]), - hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[61]), - hideItems: reader.readStringList(offsets[62]), - hwdecMode: reader.readStringOrNull(offsets[63]), + enableAutoSkip: reader.readBoolOrNull(offsets[49]), + enableCustomColorFilter: reader.readBoolOrNull(offsets[50]), + enableDiscordRpc: reader.readBoolOrNull(offsets[51]), + enableGpuNext: reader.readBoolOrNull(offsets[52]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[54]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[55]), + followSystemTheme: reader.readBoolOrNull(offsets[56]), + fullScreenPlayer: reader.readBoolOrNull(offsets[57]), + fullScreenReader: reader.readBoolOrNull(offsets[58]), + hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[59]), + hideItems: reader.readStringList(offsets[60]), + hwdecMode: reader.readStringOrNull(offsets[61]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[64]), - lastTrackerLibraryLocation: reader.readStringOrNull(offsets[65]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[66]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[67]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[68]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[69]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[70]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[71]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[72]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[73]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[74]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[75]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[76]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[77]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[78]), - libraryLocalSource: reader.readBoolOrNull(offsets[79]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[80]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[81]), - libraryShowLanguage: reader.readBoolOrNull(offsets[82]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[83]), + incognitoMode: reader.readBoolOrNull(offsets[62]), + lastTrackerLibraryLocation: reader.readStringOrNull(offsets[63]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[64]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[65]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[66]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[67]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[68]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[69]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[70]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[71]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[72]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[73]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[74]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[75]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[76]), + libraryLocalSource: reader.readBoolOrNull(offsets[77]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[78]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[79]), + libraryShowLanguage: reader.readBoolOrNull(offsets[80]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[81]), mangaExtensionsRepo: reader.readObjectList( - offsets[85], + offsets[83], RepoSchema.deserialize, allOffsets, Repo(), ), - mangaGridSize: reader.readLongOrNull(offsets[86]), + mangaGridSize: reader.readLongOrNull(offsets[84]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[87])] ?? + reader.readByteOrNull(offsets[85])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[88]), - mergeLibraryNavMobile: reader.readBoolOrNull(offsets[89]), - navigationOrder: reader.readStringList(offsets[90]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[86]), + mergeLibraryNavMobile: reader.readBoolOrNull(offsets[87]), + navigationOrder: reader.readStringList(offsets[88]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[91])] ?? + reader.readByteOrNull(offsets[89])] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( - offsets[92], + offsets[90], RepoSchema.deserialize, allOffsets, Repo(), ), - novelFontSize: reader.readLongOrNull(offsets[93]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[95]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[96]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[97]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[98]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[99]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[100]), + novelFontSize: reader.readLongOrNull(offsets[91]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[93]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[94]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[95]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[96]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[97]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[98]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[101])] ?? + reader.readByteOrNull(offsets[99])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[102]), - pagePreloadAmount: reader.readLongOrNull(offsets[103]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[100]), + pagePreloadAmount: reader.readLongOrNull(offsets[101]), personalPageModeList: reader.readObjectList( - offsets[104], + offsets[102], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[105], + offsets[103], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[106], + offsets[104], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[107]), - relativeTimesTamps: reader.readLongOrNull(offsets[108]), - rpcShowCoverImage: reader.readBoolOrNull(offsets[109]), - rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[110]), - rpcShowTitle: reader.readBoolOrNull(offsets[111]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[112]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[105]), + relativeTimesTamps: reader.readLongOrNull(offsets[106]), + rpcShowCoverImage: reader.readBoolOrNull(offsets[107]), + rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[108]), + rpcShowTitle: reader.readBoolOrNull(offsets[109]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[110]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[113])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[111])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[114]), + showPagesNumber: reader.readBoolOrNull(offsets[112]), sortChapterList: reader.readObjectList( - offsets[115], + offsets[113], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[116], + offsets[114], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[117], + offsets[115], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[118], + offsets[116], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[119]), - themeIsDark: reader.readBoolOrNull(offsets[120]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[121]), - updatedAt: reader.readLongOrNull(offsets[122]), - useLibass: reader.readBoolOrNull(offsets[123]), - useMpvConfig: reader.readBoolOrNull(offsets[124]), - usePageTapZones: reader.readBoolOrNull(offsets[125]), - useYUV420P: reader.readBoolOrNull(offsets[126]), - userAgent: reader.readStringOrNull(offsets[127]), - volumeBoostCap: reader.readLongOrNull(offsets[128]), + startDatebackup: reader.readLongOrNull(offsets[117]), + themeIsDark: reader.readBoolOrNull(offsets[118]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[119]), + updatedAt: reader.readLongOrNull(offsets[120]), + useLibass: reader.readBoolOrNull(offsets[121]), + useMpvConfig: reader.readBoolOrNull(offsets[122]), + usePageTapZones: reader.readBoolOrNull(offsets[123]), + useYUV420P: reader.readBoolOrNull(offsets[124]), + userAgent: reader.readStringOrNull(offsets[125]), + volumeBoostCap: reader.readLongOrNull(offsets[126]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1567,17 +1553,17 @@ Settings _settingsDeserialize( allOffsets, ); object.filterScanlatorList = reader.readObjectList( - offsets[55], + offsets[53], FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[84], + offsets[82], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[94]); + object.novelGridSize = reader.readLongOrNull(offsets[92]); return object; } @@ -1758,38 +1744,38 @@ P _settingsDeserializeProp

    ( case 52: return (reader.readBoolOrNull(offset)) as P; case 53: - return (reader.readBoolOrNull(offset)) as P; - case 54: - return (reader.readBoolOrNull(offset)) as P; - case 55: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 56: + case 54: return (reader.readDoubleOrNull(offset)) as P; - case 57: + case 55: return (reader.readLongOrNull(offset)) as P; + case 56: + return (reader.readBoolOrNull(offset)) as P; + case 57: + return (reader.readBoolOrNull(offset)) as P; case 58: return (reader.readBoolOrNull(offset)) as P; case 59: return (reader.readBoolOrNull(offset)) as P; case 60: - return (reader.readBoolOrNull(offset)) as P; - case 61: - return (reader.readBoolOrNull(offset)) as P; - case 62: return (reader.readStringList(offset)) as P; + case 61: + return (reader.readStringOrNull(offset)) as P; + case 62: + return (reader.readBoolOrNull(offset)) as P; case 63: return (reader.readStringOrNull(offset)) as P; case 64: return (reader.readBoolOrNull(offset)) as P; case 65: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 66: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 67: return (reader.readLongOrNull(offset)) as P; case 68: @@ -1811,9 +1797,9 @@ P _settingsDeserializeProp

    ( case 76: return (reader.readLongOrNull(offset)) as P; case 77: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 78: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 79: return (reader.readBoolOrNull(offset)) as P; case 80: @@ -1821,49 +1807,49 @@ P _settingsDeserializeProp

    ( case 81: return (reader.readBoolOrNull(offset)) as P; case 82: - return (reader.readBoolOrNull(offset)) as P; - case 83: - return (reader.readBoolOrNull(offset)) as P; - case 84: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 85: + case 83: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 86: + case 84: return (reader.readLongOrNull(offset)) as P; - case 87: + case 85: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 88: + case 86: return (reader.readLongOrNull(offset)) as P; - case 89: + case 87: return (reader.readBoolOrNull(offset)) as P; - case 90: + case 88: return (reader.readStringList(offset)) as P; - case 91: + case 89: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 92: + case 90: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; + case 91: + return (reader.readLongOrNull(offset)) as P; + case 92: + return (reader.readLongOrNull(offset)) as P; case 93: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 94: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 95: return (reader.readBoolOrNull(offset)) as P; case 96: @@ -1873,61 +1859,69 @@ P _settingsDeserializeProp

    ( case 98: return (reader.readBoolOrNull(offset)) as P; case 99: - return (reader.readBoolOrNull(offset)) as P; - case 100: - return (reader.readBoolOrNull(offset)) as P; - case 101: return (_SettingsnovelTextAlignValueEnumMap[ reader.readByteOrNull(offset)] ?? NovelTextAlign.left) as P; - case 102: + case 100: return (reader.readBoolOrNull(offset)) as P; - case 103: + case 101: return (reader.readLongOrNull(offset)) as P; - case 104: + case 102: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 105: + case 103: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 106: + case 104: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; + case 105: + return (reader.readBoolOrNull(offset)) as P; + case 106: + return (reader.readLongOrNull(offset)) as P; case 107: return (reader.readBoolOrNull(offset)) as P; case 108: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 109: return (reader.readBoolOrNull(offset)) as P; case 110: return (reader.readBoolOrNull(offset)) as P; case 111: - return (reader.readBoolOrNull(offset)) as P; + return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ScaleType.fitScreen) as P; case 112: return (reader.readBoolOrNull(offset)) as P; case 113: - return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; - case 114: - return (reader.readBoolOrNull(offset)) as P; - case 115: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; + case 114: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; + case 115: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 116: return (reader.readObjectOrNull( offset, @@ -1935,36 +1929,24 @@ P _settingsDeserializeProp

    ( allOffsets, )) as P; case 117: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 118: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 119: return (reader.readLongOrNull(offset)) as P; - case 120: + case 118: return (reader.readBoolOrNull(offset)) as P; + case 119: + return (reader.readBoolOrNull(offset)) as P; + case 120: + return (reader.readLongOrNull(offset)) as P; case 121: return (reader.readBoolOrNull(offset)) as P; case 122: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 123: return (reader.readBoolOrNull(offset)) as P; case 124: return (reader.readBoolOrNull(offset)) as P; case 125: - return (reader.readBoolOrNull(offset)) as P; - case 126: - return (reader.readBoolOrNull(offset)) as P; - case 127: return (reader.readStringOrNull(offset)) as P; - case 128: + case 126: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -5733,34 +5715,6 @@ extension SettingsQueryFilter }); } - QueryBuilder - enableAutoPiPIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableAutoPiP', - )); - }); - } - - QueryBuilder - enableAutoPiPIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableAutoPiP', - )); - }); - } - - QueryBuilder enableAutoPiPEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableAutoPiP', - value: value, - )); - }); - } - QueryBuilder enableAutoSkipIsNull() { return QueryBuilder.apply(this, (query) { @@ -5873,32 +5827,6 @@ extension SettingsQueryFilter }); } - QueryBuilder enablePiPIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enablePiP', - )); - }); - } - - QueryBuilder enablePiPIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enablePiP', - )); - }); - } - - QueryBuilder enablePiPEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enablePiP', - value: value, - )); - }); - } - QueryBuilder filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { @@ -11123,18 +11051,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByEnableAutoPiP() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enableAutoPiP', Sort.asc); - }); - } - - QueryBuilder sortByEnableAutoPiPDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enableAutoPiP', Sort.desc); - }); - } - QueryBuilder sortByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -11185,18 +11101,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByEnablePiP() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enablePiP', Sort.asc); - }); - } - - QueryBuilder sortByEnablePiPDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enablePiP', Sort.desc); - }); - } - QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -12492,18 +12396,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenByEnableAutoPiP() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enableAutoPiP', Sort.asc); - }); - } - - QueryBuilder thenByEnableAutoPiPDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enableAutoPiP', Sort.desc); - }); - } - QueryBuilder thenByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -12554,18 +12446,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenByEnablePiP() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enablePiP', Sort.asc); - }); - } - - QueryBuilder thenByEnablePiPDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'enablePiP', Sort.desc); - }); - } - QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -13637,12 +13517,6 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByEnableAutoPiP() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'enableAutoPiP'); - }); - } - QueryBuilder distinctByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAutoSkip'); @@ -13668,12 +13542,6 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByEnablePiP() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'enablePiP'); - }); - } - QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -14424,12 +14292,6 @@ extension SettingsQueryProperty }); } - QueryBuilder enableAutoPiPProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'enableAutoPiP'); - }); - } - QueryBuilder enableAutoSkipProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAutoSkip'); @@ -14455,12 +14317,6 @@ extension SettingsQueryProperty }); } - QueryBuilder enablePiPProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'enablePiP'); - }); - } - QueryBuilder?, QQueryOperations> filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 9d45df3c..903017fc 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -852,16 +852,6 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo // Else (if user already watches an episode and just changes it), // stay in the same mode, the user left it in. try { - final enablePiP = ref.read(enablePiPStateProvider); - final enableAutoPiP = ref.read(enableAutoPiPStateProvider); - - /// only available for iOS 15+ - if (enablePiP && _controller.isPictureInPictureAvailable()) { - _controller.enablePictureInPicture(); - if (enableAutoPiP) { - _controller.enableAutoPictureInPicture(); - } - } final defaultSkipIntroLength = ref.read( defaultSkipIntroLengthStateProvider, ); @@ -1954,12 +1944,6 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo } }, ), - if (_controller.isPictureInPictureAvailable()) - IconButton( - onPressed: () async => - await _controller.enterPictureInPicture(), - icon: const Icon(Icons.featured_video_outlined), - ), ], ), ], diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 192fcae2..b0288bef 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -20,8 +20,6 @@ class PlayerScreen extends ConsumerStatefulWidget { class _PlayerScreenState extends ConsumerState { @override Widget build(BuildContext context) { - final enablePiP = ref.watch(enablePiPStateProvider); - final enableAutoPiP = ref.watch(enableAutoPiPStateProvider); final defaultSubtitleLang = ref.watch(defaultSubtitleLangStateProvider); final markEpisodeAsSeenType = ref.watch(markEpisodeAsSeenTypeStateProvider); final defaultSkipIntroLength = ref.watch( @@ -42,22 +40,6 @@ class _PlayerScreenState extends ConsumerState { body: SingleChildScrollView( child: Column( children: [ - if (Platform.isIOS) - SwitchListTile( - value: enablePiP, - title: Text(context.l10n.enable_pip), - onChanged: (value) { - ref.read(enablePiPStateProvider.notifier).set(value); - }, - ), - if (Platform.isIOS) - SwitchListTile( - value: enableAutoPiP, - title: Text(context.l10n.enable_auto_pip), - onChanged: (value) { - ref.read(enableAutoPiPStateProvider.notifier).set(value); - }, - ), ListTile( onTap: () { showDialog( diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 7ae4782d..5996fb87 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -5,46 +5,6 @@ import 'package:mangayomi/models/settings.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'player_state_provider.g.dart'; -@riverpod -class EnablePiPState extends _$EnablePiPState { - @override - bool build() { - return isar.settings.getSync(227)!.enablePiP ?? true; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync( - settings! - ..enablePiP = value - ..updatedAt = DateTime.now().millisecondsSinceEpoch, - ), - ); - } -} - -@riverpod -class EnableAutoPiPState extends _$EnableAutoPiPState { - @override - bool build() { - return isar.settings.getSync(227)!.enableAutoPiP ?? true; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync( - settings! - ..enableAutoPiP = value - ..updatedAt = DateTime.now().millisecondsSinceEpoch, - ), - ); - } -} - @riverpod class DefaultSubtitleLangState extends _$DefaultSubtitleLangState { @override diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 7fb1d029..58df635c 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -6,39 +6,6 @@ part of 'player_state_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$enablePiPStateHash() => r'e99c6a5dc9d6fe55c6b33b03d2d74e55ae5f4199'; - -/// See also [EnablePiPState]. -@ProviderFor(EnablePiPState) -final enablePiPStateProvider = - AutoDisposeNotifierProvider.internal( - EnablePiPState.new, - name: r'enablePiPStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enablePiPStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$EnablePiPState = AutoDisposeNotifier; -String _$enableAutoPiPStateHash() => - r'5d0e53cccb9be4cedb8567ce1cd7b5fe3ff2e52f'; - -/// See also [EnableAutoPiPState]. -@ProviderFor(EnableAutoPiPState) -final enableAutoPiPStateProvider = - AutoDisposeNotifierProvider.internal( - EnableAutoPiPState.new, - name: r'enableAutoPiPStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableAutoPiPStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$EnableAutoPiPState = AutoDisposeNotifier; String _$defaultSubtitleLangStateHash() => r'ae7b275e168dd15117512d9ed1c474736458753b'; From 57be3eec9a5ead0adaebe3b5322799b46e64eeb3 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 10 Aug 2025 02:14:18 +0200 Subject: [PATCH 048/100] re-added full upload and download --- lib/l10n/app_en.arb | 4 + lib/l10n/generated/app_localizations.dart | 24 + lib/l10n/generated/app_localizations_ar.dart | 14 + lib/l10n/generated/app_localizations_as.dart | 14 + lib/l10n/generated/app_localizations_de.dart | 14 + lib/l10n/generated/app_localizations_en.dart | 14 + lib/l10n/generated/app_localizations_es.dart | 14 + lib/l10n/generated/app_localizations_fr.dart | 14 + lib/l10n/generated/app_localizations_hi.dart | 14 + lib/l10n/generated/app_localizations_id.dart | 14 + lib/l10n/generated/app_localizations_it.dart | 14 + lib/l10n/generated/app_localizations_pt.dart | 14 + lib/l10n/generated/app_localizations_ru.dart | 14 + lib/l10n/generated/app_localizations_th.dart | 14 + lib/l10n/generated/app_localizations_tr.dart | 14 + lib/l10n/generated/app_localizations_zh.dart | 14 + lib/modules/more/settings/sync/sync.dart | 438 +++++++++++-------- lib/services/sync_server.dart | 170 +++++-- 18 files changed, 615 insertions(+), 217 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 824fc2f4..b169ef6f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -225,6 +225,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!", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 847d0bf8..fe050ea9 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -1425,6 +1425,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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 2cd15f8d..8902e8f6 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -696,6 +696,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 => 'تمكين المزامنة'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index d8a73c94..482a6857 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -698,6 +698,20 @@ class AppLocalizationsAs 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'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 37a2cbca..2b972192 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -700,6 +700,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'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index b155ade0..9c3672a0 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -698,6 +698,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'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 02baacb3..183b9681 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -702,6 +702,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'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 34c81a28..13a45d79 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -705,6 +705,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'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 75e73a35..928ac58c 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -698,6 +698,20 @@ class AppLocalizationsHi 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'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 71a677f8..9e26b025 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -702,6 +702,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'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index f49ea921..d64fd6de 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -702,6 +702,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'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index f84131f6..fc1f16a0 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -702,6 +702,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'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index ea8db99d..2763c20a 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -704,6 +704,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 => 'Включить синхронизацию'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 48797005..d1a8c1ca 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -698,6 +698,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 => 'เปิดการซิงค์'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index ec9837cd..4c68163e 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -698,6 +698,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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index c76e32b9..9c053b99 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -690,6 +690,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 => '启用同步'; diff --git a/lib/modules/more/settings/sync/sync.dart b/lib/modules/more/settings/sync/sync.dart index 92f7d084..db68dbf6 100644 --- a/lib/modules/more/settings/sync/sync.dart +++ b/lib/modules/more/settings/sync/sync.dart @@ -116,7 +116,9 @@ class SyncScreen extends ConsumerWidget { title: Text(l10n.sync_auto), subtitle: Text( autoSyncOptions.entries - .where((o) => o.value == syncPreference.autoSyncFrequency) + .where( + (o) => o.value == syncPreference.autoSyncFrequency, + ) .first .key, style: TextStyle( @@ -150,29 +152,35 @@ class SyncScreen extends ConsumerWidget { SwitchListTile( value: syncPreference.syncHistories, title: Text(context.l10n.sync_enable_histories), - onChanged: syncPreference.syncOn ? (value) { - ref - .read(SynchingProvider(syncId: 1).notifier) - .setSyncHistories(value); - } : null, + onChanged: syncPreference.syncOn + ? (value) { + ref + .read(SynchingProvider(syncId: 1).notifier) + .setSyncHistories(value); + } + : null, ), SwitchListTile( value: syncPreference.syncUpdates, title: Text(context.l10n.sync_enable_updates), - onChanged: syncPreference.syncOn ? (value) { - ref - .read(SynchingProvider(syncId: 1).notifier) - .setSyncUpdates(value); - } : null, + onChanged: syncPreference.syncOn + ? (value) { + ref + .read(SynchingProvider(syncId: 1).notifier) + .setSyncUpdates(value); + } + : null, ), SwitchListTile( value: syncPreference.syncSettings, title: Text(context.l10n.sync_enable_settings), - onChanged: syncPreference.syncOn ? (value) { - ref - .read(SynchingProvider(syncId: 1).notifier) - .setSyncSettings(value); - } : null, + onChanged: syncPreference.syncOn + ? (value) { + ref + .read(SynchingProvider(syncId: 1).notifier) + .setSyncSettings(value); + } + : null, ), Padding( padding: const EdgeInsets.only( @@ -288,6 +296,40 @@ class SyncScreen extends ConsumerWidget { Text(l10n.sync_button_sync), ], ), + const SizedBox(width: 20), + Column( + children: [ + IconButton( + onPressed: !syncPreference.syncOn || !isLogged + ? null + : () => _showConfirmDialog(context, ref, true), + icon: Icon( + Icons.file_upload_outlined, + color: !syncPreference.syncOn || !isLogged + ? context.secondaryColor + : context.primaryColor, + ), + ), + Text(l10n.sync_button_upload), + ], + ), + const SizedBox(width: 20), + Column( + children: [ + IconButton( + onPressed: !syncPreference.syncOn || !isLogged + ? null + : () => _showConfirmDialog(context, ref, false), + icon: Icon( + Icons.file_download_outlined, + color: !syncPreference.syncOn || !isLogged + ? context.secondaryColor + : context.primaryColor, + ), + ), + Text(l10n.sync_button_download), + ], + ), ], ), const SizedBox(height: 20), @@ -298,172 +340,220 @@ class SyncScreen extends ConsumerWidget { ), ); } -} -void _showDialogLogin( - BuildContext context, - WidgetRef ref, - SyncPreference syncPreference, -) { - final serverController = TextEditingController(text: syncPreference.server); - final emailController = TextEditingController(text: syncPreference.email); - final passwordController = TextEditingController(); - String server = ""; - String email = ""; - String password = ""; - String errorMessage = ""; - bool isLoading = false; - bool obscureText = true; - final l10n = l10nLocalizations(context)!; - showDialog( - context: context, - builder: (context) => StatefulBuilder( - builder: (context, setState) { + Future _showConfirmDialog( + BuildContext context, + WidgetRef ref, + bool isUpload, + ) async { + await showDialog( + context: context, + builder: (context) { return AlertDialog( - title: Text( - l10n.login_into("SyncServer"), - style: const TextStyle(fontSize: 30), + content: Text( + isUpload + ? context.l10n.sync_button_upload_info + : context.l10n.sync_button_download_info, + style: TextStyle(fontWeight: FontWeight.bold), ), - content: SizedBox( - height: 400, - width: MediaQuery.of(context).size.width, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, children: [ - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: TextFormField( - controller: serverController, - autofocus: true, - onChanged: (value) => setState(() { - server = value; - }), - decoration: InputDecoration( - hintText: l10n.sync_server, - filled: false, - contentPadding: const EdgeInsets.all(12), - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(width: 0.4), - borderRadius: BorderRadius.circular(5), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(), - borderRadius: BorderRadius.circular(5), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: const BorderSide(), - ), - ), - ), + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(context.l10n.cancel), ), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: TextFormField( - controller: emailController, - autofocus: true, - onChanged: (value) => setState(() { - email = value; - }), - decoration: InputDecoration( - hintText: l10n.email_adress, - filled: false, - contentPadding: const EdgeInsets.all(12), - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(width: 0.4), - borderRadius: BorderRadius.circular(5), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(), - borderRadius: BorderRadius.circular(5), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: const BorderSide(), - ), - ), - ), - ), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: TextFormField( - controller: passwordController, - obscureText: obscureText, - onChanged: (value) => setState(() { - password = value; - }), - decoration: InputDecoration( - hintText: l10n.sync_password, - suffixIcon: IconButton( - onPressed: () => setState(() { - obscureText = !obscureText; - }), - icon: Icon( - obscureText - ? Icons.visibility_outlined - : Icons.visibility_off_outlined, - ), - ), - filled: false, - contentPadding: const EdgeInsets.all(12), - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(width: 0.4), - borderRadius: BorderRadius.circular(5), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(), - borderRadius: BorderRadius.circular(5), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: const BorderSide(), - ), - ), - ), - ), - const SizedBox(height: 10), - Text(errorMessage, style: const TextStyle(color: Colors.red)), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: SizedBox( - width: context.width(1), - height: 50, - child: ElevatedButton( - onPressed: isLoading - ? null - : () async { - setState(() { - isLoading = true; - }); - final res = await ref - .read(syncServerProvider(syncId: 1).notifier) - .login(l10n, server, email, password); - if (!res.$1) { - setState(() { - isLoading = false; - errorMessage = res.$2; - }); - } else { - if (context.mounted) { - Navigator.pop(context); - } - } - }, - child: isLoading - ? const CircularProgressIndicator() - : Text(l10n.login), - ), - ), + const SizedBox(width: 15), + ElevatedButton( + onPressed: () { + ref + .read(syncServerProvider(syncId: 1).notifier) + .startSync( + context.l10n, + false, + upload: isUpload, + download: !isUpload, + ); + Navigator.pop(context); + }, + child: Text(context.l10n.dialog_confirm), ), ], ), - ), + ], ); }, - ), - ); + ); + } + + void _showDialogLogin( + BuildContext context, + WidgetRef ref, + SyncPreference syncPreference, + ) { + final serverController = TextEditingController(text: syncPreference.server); + final emailController = TextEditingController(text: syncPreference.email); + final passwordController = TextEditingController(); + String server = ""; + String email = ""; + String password = ""; + String errorMessage = ""; + bool isLoading = false; + bool obscureText = true; + final l10n = l10nLocalizations(context)!; + showDialog( + context: context, + builder: (context) => StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text( + l10n.login_into("SyncServer"), + style: const TextStyle(fontSize: 30), + ), + content: SizedBox( + height: 400, + width: MediaQuery.of(context).size.width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextFormField( + controller: serverController, + autofocus: true, + onChanged: (value) => setState(() { + server = value; + }), + decoration: InputDecoration( + hintText: l10n.sync_server, + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + ), + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextFormField( + controller: emailController, + autofocus: true, + onChanged: (value) => setState(() { + email = value; + }), + decoration: InputDecoration( + hintText: l10n.email_adress, + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + ), + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextFormField( + controller: passwordController, + obscureText: obscureText, + onChanged: (value) => setState(() { + password = value; + }), + decoration: InputDecoration( + hintText: l10n.sync_password, + suffixIcon: IconButton( + onPressed: () => setState(() { + obscureText = !obscureText; + }), + icon: Icon( + obscureText + ? Icons.visibility_outlined + : Icons.visibility_off_outlined, + ), + ), + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + ), + const SizedBox(height: 10), + Text(errorMessage, style: const TextStyle(color: Colors.red)), + const SizedBox(height: 30), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: SizedBox( + width: context.width(1), + height: 50, + child: ElevatedButton( + onPressed: isLoading + ? null + : () async { + setState(() { + isLoading = true; + }); + final res = await ref + .read( + syncServerProvider(syncId: 1).notifier, + ) + .login(l10n, server, email, password); + if (!res.$1) { + setState(() { + isLoading = false; + errorMessage = res.$2; + }); + } else { + if (context.mounted) { + Navigator.pop(context); + } + } + }, + child: isLoading + ? const CircularProgressIndicator() + : Text(l10n.login), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } } diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index e38238f5..52c59be8 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -41,7 +41,7 @@ class SyncServer extends _$SyncServer { String username, String password, ) async { - server = server[server.length - 1] == '/' + server = server.isNotEmpty && server[server.length - 1] == '/' ? server.substring(0, server.length - 1) : server; try { @@ -67,7 +67,12 @@ class SyncServer extends _$SyncServer { } } - Future startSync(AppLocalizations l10n, bool silent) async { + Future startSync( + AppLocalizations l10n, + bool silent, { + bool upload = false, + bool download = false, + }) async { if (!silent) { botToast(l10n.sync_starting, second: 500); } @@ -75,27 +80,46 @@ class SyncServer extends _$SyncServer { final syncPreference = ref.read(synchingProvider(syncId: syncId)); final syncNotifier = ref.read(synchingProvider(syncId: syncId).notifier); - final resultManga = await _syncManga(l10n, syncNotifier); + final resultManga = await _syncManga( + l10n, + syncNotifier, + download: download, + upload: upload, + ); if (!resultManga) { botToast(l10n.sync_failed, second: 5); return; } if (syncPreference.syncHistories) { - final resultHistory = await _syncHistory(l10n, syncNotifier); + final resultHistory = await _syncHistory( + l10n, + syncNotifier, + download: download, + upload: upload, + ); if (!resultHistory) { botToast(l10n.sync_failed, second: 5); return; } } if (syncPreference.syncUpdates) { - final resultUpdate = await _syncUpdate(l10n, syncNotifier); + final resultUpdate = await _syncUpdate( + l10n, + syncNotifier, + download: download, + upload: upload, + ); if (!resultUpdate) { botToast(l10n.sync_failed, second: 5); return; } } if (syncPreference.syncSettings) { - final resultSettings = await _syncSettings(l10n); + final resultSettings = await _syncSettings( + l10n, + download: download, + upload: upload, + ); if (!resultSettings) { botToast(l10n.sync_failed, second: 5); return; @@ -111,8 +135,13 @@ class SyncServer extends _$SyncServer { } } - Future _syncManga(AppLocalizations l10n, Synching syncNotifier) async { - final mangaData = _getMangaData(); + Future _syncManga( + AppLocalizations l10n, + Synching syncNotifier, { + bool upload = false, + bool download = false, + }) async { + final mangaData = _getMangaData(upload: upload, download: download); final accessToken = _getAccessToken(); var response = await http.post( Uri.parse('${_getServer()}$_syncMangaUrl'), @@ -127,11 +156,20 @@ class SyncServer extends _$SyncServer { return false; } - final jsonData = jsonDecode(response.body) as Map; - await _upsertCategories(jsonData, syncNotifier); - await _upsertManga(jsonData, syncNotifier); - await _upsertChapters(jsonData, syncNotifier); - await _upsertTracks(jsonData, syncNotifier); + if (!upload) { + final jsonData = jsonDecode(response.body) as Map; + await _upsertCategories(jsonData, syncNotifier); + await _upsertManga(jsonData, syncNotifier); + await _upsertChapters(jsonData, syncNotifier); + await _upsertTracks(jsonData, syncNotifier); + } else { + await syncNotifier.clearChangedParts([ + ActionType.removeCategory, + ActionType.removeItem, + ActionType.removeChapter, + ActionType.removeTrack, + ], true); + } syncNotifier.setLastSyncManga(DateTime.now().millisecondsSinceEpoch); @@ -140,9 +178,11 @@ class SyncServer extends _$SyncServer { Future _syncHistory( AppLocalizations l10n, - Synching syncNotifier, - ) async { - final historyData = _getHistoryData(); + Synching syncNotifier, { + bool upload = false, + bool download = false, + }) async { + final historyData = _getHistoryData(upload: upload, download: download); final accessToken = _getAccessToken(); var response = await http.post( Uri.parse('${_getServer()}$_syncHistoryUrl'), @@ -157,16 +197,25 @@ class SyncServer extends _$SyncServer { return false; } - final jsonData = jsonDecode(response.body) as Map; - await _upsertHistories(jsonData, syncNotifier); + if (!upload) { + final jsonData = jsonDecode(response.body) as Map; + await _upsertHistories(jsonData, syncNotifier); + } else { + await syncNotifier.clearChangedParts([ActionType.removeHistory], true); + } syncNotifier.setLastSyncHistory(DateTime.now().millisecondsSinceEpoch); return true; } - Future _syncUpdate(AppLocalizations l10n, Synching syncNotifier) async { - final updateData = _getUpdateData(); + Future _syncUpdate( + AppLocalizations l10n, + Synching syncNotifier, { + bool upload = false, + bool download = false, + }) async { + final updateData = _getUpdateData(upload: upload, download: download); final accessToken = _getAccessToken(); var response = await http.post( Uri.parse('${_getServer()}$_syncUpdateUrl'), @@ -181,16 +230,24 @@ class SyncServer extends _$SyncServer { return false; } - final jsonData = jsonDecode(response.body) as Map; - await _upsertUpdates(jsonData, syncNotifier); + if (!upload) { + final jsonData = jsonDecode(response.body) as Map; + await _upsertUpdates(jsonData, syncNotifier); + } else { + await syncNotifier.clearChangedParts([ActionType.removeUpdate], true); + } syncNotifier.setLastSyncUpdate(DateTime.now().millisecondsSinceEpoch); return true; } - Future _syncSettings(AppLocalizations l10n) async { - final settingsData = _getSettingsData(); + Future _syncSettings( + AppLocalizations l10n, { + bool upload = false, + bool download = false, + }) async { + final settingsData = _getSettingsData(download: download); final accessToken = _getAccessToken(); var response = await http.post( Uri.parse('${_getServer()}$_syncSettingsUrl'), @@ -205,8 +262,10 @@ class SyncServer extends _$SyncServer { return false; } - final jsonData = jsonDecode(response.body) as Map; - await _upsertSettings(jsonData); + if (!upload) { + final jsonData = jsonDecode(response.body) as Map; + await _upsertSettings(jsonData); + } return true; } @@ -424,36 +483,61 @@ class SyncServer extends _$SyncServer { }); } - String _getMangaData() { + String _getMangaData({bool upload = false, bool download = false}) { Map data = {}; - data["categories"] = _getCategories(); - data["deleted_categories"] = _getDeletedObjects(ActionType.removeCategory); - data["manga"] = _getManga(); - data["deleted_manga"] = _getDeletedObjects(ActionType.removeItem); - data["chapters"] = _getChapters(); - data["deleted_chapters"] = _getDeletedObjects(ActionType.removeChapter); - data["tracks"] = _getTracks(); - data["deleted_tracks"] = _getDeletedObjects(ActionType.removeTrack); + data["categories"] = download ? [] : _getCategories(); + data["deleted_categories"] = download + ? [] + : _getDeletedObjects(ActionType.removeCategory); + data["manga"] = download ? [] : _getManga(); + data["deleted_manga"] = download + ? [] + : _getDeletedObjects(ActionType.removeItem); + data["chapters"] = download ? [] : _getChapters(); + data["deleted_chapters"] = download + ? [] + : _getDeletedObjects(ActionType.removeChapter); + data["tracks"] = download ? [] : _getTracks(); + data["deleted_tracks"] = download + ? [] + : _getDeletedObjects(ActionType.removeTrack); + if (upload) { + data["resetAll"] = true; + } return jsonEncode(data); } - String _getHistoryData() { + String _getHistoryData({bool upload = false, bool download = false}) { Map data = {}; - data["histories"] = _getHistories(); - data["deleted_histories"] = _getDeletedObjects(ActionType.removeHistory); + data["histories"] = download ? [] : _getHistories(); + data["deleted_histories"] = download + ? [] + : _getDeletedObjects(ActionType.removeHistory); + if (upload) { + data["resetAll"] = true; + } return jsonEncode(data); } - String _getUpdateData() { + String _getUpdateData({bool upload = false, bool download = false}) { Map data = {}; - data["updates"] = _getUpdates(); - data["deleted_updates"] = _getDeletedObjects(ActionType.removeUpdate); + data["updates"] = download ? [] : _getUpdates(); + data["deleted_updates"] = download + ? [] + : _getDeletedObjects(ActionType.removeUpdate); + if (upload) { + data["resetAll"] = true; + } return jsonEncode(data); } - String _getSettingsData() { + String _getSettingsData({bool download = false}) { Map data = {}; - data["settings"] = isar.settings.getSync(227)!..updatedAt ??= DateTime.now().millisecondsSinceEpoch..cookiesList = []; + if (!download) { + data["settings"] = isar.settings.getSync(227)! + ..updatedAt ??= DateTime.now().millisecondsSinceEpoch + ..cookiesList = []; + } return jsonEncode(data); } From e9bf100905e6393113a7d22204ab3448b60921c2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 15 Aug 2025 21:20:36 +0200 Subject: [PATCH 049/100] move history to more screen if hidden --- lib/modules/more/more_screen.dart | 18 +++++++++++++++++- .../appearance/custom_navigation_settings.dart | 1 - 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/modules/more/more_screen.dart b/lib/modules/more/more_screen.dart index 34227e00..f5774f46 100644 --- a/lib/modules/more/more_screen.dart +++ b/lib/modules/more/more_screen.dart @@ -1,15 +1,23 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/widgets/incognito_mode_widget.dart'; import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; -class MoreScreen extends StatelessWidget { +class MoreScreen extends ConsumerStatefulWidget { const MoreScreen({super.key}); + @override + ConsumerState createState() => MoreScreenState(); +} + +class MoreScreenState extends ConsumerState { @override Widget build(BuildContext context) { final l10n = l10nLocalizations(context); + final hiddenItems = ref.watch(hideItemsStateProvider); return Scaffold( body: SingleChildScrollView( child: Column( @@ -39,6 +47,14 @@ class MoreScreen extends StatelessWidget { // ), const IncognitoModeWidget(), const Divider(), + if (hiddenItems.contains("/history")) + ListTileWidget( + onTap: () { + context.push('/history'); + }, + icon: Icons.history, + title: l10n!.history, + ), ListTileWidget( onTap: () { context.push('/downloadQueue'); diff --git a/lib/modules/more/settings/appearance/custom_navigation_settings.dart b/lib/modules/more/settings/appearance/custom_navigation_settings.dart index 99718163..dfd3ced3 100644 --- a/lib/modules/more/settings/appearance/custom_navigation_settings.dart +++ b/lib/modules/more/settings/appearance/custom_navigation_settings.dart @@ -61,7 +61,6 @@ class _CustomNavigationSettingsState [ "/more", "/browse", - "/history", ].any((element) => element == navigation) ? null : (value) { From 201568df9e61c0c1d1009955e31ec2e6c34ebf7d Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 15 Aug 2025 21:25:22 +0200 Subject: [PATCH 050/100] added quick access to source settings --- lib/l10n/app_en.arb | 1 + lib/modules/manga/detail/manga_detail_view.dart | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b169ef6f..76063c2c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -255,6 +255,7 @@ "anime_extensions": "Anime Extensions", "manga_extensions": "Manga Extensions", "novel_extensions": "Novel Extensions", + "extension_settings": "Extension settings", "anime": "Anime", "manga": "Manga", "novel": "Novel", diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 622c9570..e161f4d8 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -624,6 +624,11 @@ class _MangaDetailViewState extends ConsumerState value: 3, child: Text(l10n.migrate), ), + if (!isLocalArchive) + PopupMenuItem( + value: 4, + child: Text(l10n.extension_settings), + ), ]; }, onSelected: (value) { @@ -651,6 +656,16 @@ class _MangaDetailViewState extends ConsumerState case 3: context.push("/migrate", extra: widget.manga); break; + case 4: + final source = getSource( + widget.manga!.lang!, + widget.manga!.source!, + ); + context.push( + '/extension_detail', + extra: source, + ); + break; } }, ), From 56fc7f905ae57b3df90d5b3cf8646ba0e3dd97aa Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 15 Aug 2025 21:33:54 +0200 Subject: [PATCH 051/100] added downloaded only mode --- lib/l10n/app_en.arb | 2 + lib/models/settings.dart | 5 ++ lib/modules/library/library_screen.dart | 25 +++++++++- lib/modules/main_view/main_screen.dart | 46 +++++++++++++++++++ lib/modules/more/more_screen.dart | 2 + .../downloaded_only_state_provider.dart | 24 ++++++++++ .../downloaded_only_state_provider.g.dart | 27 +++++++++++ .../incognito_mode_state_provider.dart | 2 +- .../incognito_mode_state_provider.g.dart | 2 +- .../more/widgets/downloaded_only_widget.dart | 29 ++++++++++++ 10 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 lib/modules/more/providers/downloaded_only_state_provider.dart create mode 100644 lib/modules/more/providers/downloaded_only_state_provider.g.dart create mode 100644 lib/modules/more/widgets/downloaded_only_widget.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b169ef6f..96934e8a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -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", diff --git a/lib/models/settings.dart b/lib/models/settings.dart index bfd4a2ac..d8f67526 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -258,6 +258,8 @@ class Settings { bool? rpcShowCoverImage; + bool? downloadedOnlyMode; + Settings({ this.id = 227, this.updatedAt = 0, @@ -373,6 +375,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, + this.downloadedOnlyMode = false, }); Settings.fromJson(Map json) { @@ -594,6 +597,7 @@ class Settings { rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress']; rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; + downloadedOnlyMode = json['downloadedOnlyMode']; } Map toJson() => { @@ -732,6 +736,7 @@ class Settings { 'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress, 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, + 'downloadedOnlyMode': downloadedOnlyMode, }; } diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 971a3c12..9fa6a8e2 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -20,6 +20,7 @@ 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/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/category_selection_dialog.dart'; @@ -134,6 +135,7 @@ class _LibraryScreenState extends ConsumerState final withoutCategories = ref.watch( getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType), ); + final downloadedOnly = ref.watch(downloadedOnlyStateProvider); final mangaAll = ref.watch( getAllMangaStreamProvider( categoryId: null, @@ -247,6 +249,7 @@ class _LibraryScreenState extends ConsumerState ref: ref, localSource: localSource, settings: settings, + downloadedOnly: downloadedOnly, ); } if (tabCount > 0 && @@ -279,6 +282,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType, + downloadedOnly: downloadedOnly, ); final withoutCategoryNumberOfItemsList = _filterAndSortManga( @@ -288,6 +292,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType, + downloadedOnly: downloadedOnly, ); return DefaultTabController( @@ -370,6 +375,8 @@ class _LibraryScreenState extends ConsumerState categoryId: entr[i - 1].id!, settings: settings, + downloadedOnly: + downloadedOnly, ), ], ), @@ -396,6 +403,8 @@ class _LibraryScreenState extends ConsumerState continueReaderBtn, categoryId: entr[i].id!, settings: settings, + downloadedOnly: + downloadedOnly, ), ], ), @@ -432,6 +441,8 @@ class _LibraryScreenState extends ConsumerState ref: ref, localSource: localSource, settings: settings, + downloadedOnly: + downloadedOnly, ) : _bodyWithCatories( categoryId: @@ -454,6 +465,8 @@ class _LibraryScreenState extends ConsumerState ref: ref, localSource: localSource, settings: settings, + downloadedOnly: + downloadedOnly, ), if (withoutCategory.isEmpty) for ( @@ -481,6 +494,7 @@ class _LibraryScreenState extends ConsumerState ref: ref, localSource: localSource, settings: settings, + downloadedOnly: downloadedOnly, ), ], ), @@ -501,6 +515,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType, + downloadedOnly: downloadedOnly, ); return Scaffold( appBar: _appBar( @@ -526,6 +541,7 @@ class _LibraryScreenState extends ConsumerState ref: ref, localSource: localSource, settings: settings, + downloadedOnly: downloadedOnly, ), ); }, @@ -731,6 +747,7 @@ class _LibraryScreenState extends ConsumerState required bool continueReaderBtn, required int categoryId, required Settings settings, + required bool downloadedOnly, }) { final mangas = ref.watch( getAllMangaStreamProvider( @@ -755,6 +772,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType!, + downloadedOnly: downloadedOnly, ); return CircleAvatar( backgroundColor: Theme.of(context).focusColor, @@ -791,6 +809,7 @@ class _LibraryScreenState extends ConsumerState required WidgetRef ref, required DisplayType displayType, required Settings settings, + required bool downloadedOnly, }) { final l10n = l10nLocalizations(context)!; final mangas = ref.watch( @@ -818,6 +837,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType!, + downloadedOnly: downloadedOnly, ); if (entries.isNotEmpty) { final entriesManga = reverse ? entries.reversed.toList() : entries; @@ -875,6 +895,7 @@ class _LibraryScreenState extends ConsumerState required WidgetRef ref, bool withoutCategories = false, required Settings settings, + required bool downloadedOnly, }) { final sortType = ref .watch( @@ -907,6 +928,7 @@ class _LibraryScreenState extends ConsumerState startedFilterType: startedFilterType, bookmarkedFilterType: bookmarkedFilterType, sortType: sortType ?? 0, + downloadedOnly: downloadedOnly, ); if (entries.isNotEmpty) { final entriesManga = reverse ? entries.reversed.toList() : entries; @@ -970,6 +992,7 @@ class _LibraryScreenState extends ConsumerState required int startedFilterType, required int bookmarkedFilterType, required int sortType, + bool downloadedOnly = false, }) { List? mangas; final searchQuery = _textEditingController.text; @@ -984,7 +1007,7 @@ class _LibraryScreenState extends ConsumerState .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() diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index add15f8d..cf0c7f65 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -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'; @@ -239,10 +240,16 @@ class _MainScreenState extends ConsumerState { } final incognitoMode = ref.watch(incognitoModeStateProvider); + final downloadedOnly = ref.watch(downloadedOnlyStateProvider); final isLongPressed = ref.watch(isLongPressedMangaStateProvider); 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 { } } +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}); diff --git a/lib/modules/more/more_screen.dart b/lib/modules/more/more_screen.dart index 34227e00..4799b63f 100644 --- a/lib/modules/more/more_screen.dart +++ b/lib/modules/more/more_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:mangayomi/modules/more/widgets/downloaded_only_widget.dart'; import 'package:mangayomi/modules/more/widgets/incognito_mode_widget.dart'; import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -37,6 +38,7 @@ class MoreScreen extends StatelessWidget { // onChanged: (value) {}, // ), // ), + const DownloadedOnlyWidget(), const IncognitoModeWidget(), const Divider(), ListTileWidget( diff --git a/lib/modules/more/providers/downloaded_only_state_provider.dart b/lib/modules/more/providers/downloaded_only_state_provider.dart new file mode 100644 index 00000000..92760ca4 --- /dev/null +++ b/lib/modules/more/providers/downloaded_only_state_provider.dart @@ -0,0 +1,24 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'downloaded_only_state_provider.g.dart'; + +@riverpod +class DownloadedOnlyState extends _$DownloadedOnlyState { + @override + bool build() { + return isar.settings.getSync(227)!.downloadedOnlyMode ?? false; + } + + void setDownloadedOnly(bool value) { + final settings = isar.settings.getSync(227)!; + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings + ..downloadedOnlyMode = state + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} diff --git a/lib/modules/more/providers/downloaded_only_state_provider.g.dart b/lib/modules/more/providers/downloaded_only_state_provider.g.dart new file mode 100644 index 00000000..1d1d7ddb --- /dev/null +++ b/lib/modules/more/providers/downloaded_only_state_provider.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'downloaded_only_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$downloadedOnlyStateHash() => + r'09c451617c435ca59554546f5d3090d20c961bfe'; + +/// See also [DownloadedOnlyState]. +@ProviderFor(DownloadedOnlyState) +final downloadedOnlyStateProvider = + AutoDisposeNotifierProvider.internal( + DownloadedOnlyState.new, + name: r'downloadedOnlyStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$downloadedOnlyStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$DownloadedOnlyState = AutoDisposeNotifier; +// 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 diff --git a/lib/modules/more/providers/incognito_mode_state_provider.dart b/lib/modules/more/providers/incognito_mode_state_provider.dart index 87cbdd80..3bf04479 100644 --- a/lib/modules/more/providers/incognito_mode_state_provider.dart +++ b/lib/modules/more/providers/incognito_mode_state_provider.dart @@ -7,7 +7,7 @@ part 'incognito_mode_state_provider.g.dart'; class IncognitoModeState extends _$IncognitoModeState { @override bool build() { - return isar.settings.getSync(227)!.incognitoMode!; + return isar.settings.getSync(227)!.incognitoMode ?? false; } void setIncognitoMode(bool value) { diff --git a/lib/modules/more/providers/incognito_mode_state_provider.g.dart b/lib/modules/more/providers/incognito_mode_state_provider.g.dart index c5e77e99..b70a5e8a 100644 --- a/lib/modules/more/providers/incognito_mode_state_provider.g.dart +++ b/lib/modules/more/providers/incognito_mode_state_provider.g.dart @@ -7,7 +7,7 @@ part of 'incognito_mode_state_provider.dart'; // ************************************************************************** String _$incognitoModeStateHash() => - r'149c4dcbc434fb6efc883e196392320bdc7c0821'; + r'3858256a820eef632d3df57533f2aad14f555b22'; /// See also [IncognitoModeState]. @ProviderFor(IncognitoModeState) diff --git a/lib/modules/more/widgets/downloaded_only_widget.dart b/lib/modules/more/widgets/downloaded_only_widget.dart new file mode 100644 index 00000000..6a0a1276 --- /dev/null +++ b/lib/modules/more/widgets/downloaded_only_widget.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/more/providers/downloaded_only_state_provider.dart'; +import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; + +class DownloadedOnlyWidget extends ConsumerWidget { + const DownloadedOnlyWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final l10n = l10nLocalizations(context); + final downloadedOnly = ref.watch(downloadedOnlyStateProvider); + return ListTileWidget( + onTap: () => ref + .read(downloadedOnlyStateProvider.notifier) + .setDownloadedOnly(!downloadedOnly), + icon: Icons.cloud_off_outlined, + subtitle: l10n!.downloaded_only_description, + title: l10n.downloaded_only, + trailing: Switch( + value: downloadedOnly, + onChanged: (value) => ref + .read(downloadedOnlyStateProvider.notifier) + .setDownloadedOnly(value), + ), + ); + } +} From c7d1d75045c6ca002a3a19e2ee123f2289902a72 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 15 Aug 2025 21:42:47 +0200 Subject: [PATCH 052/100] added Anibrain recommendations --- lib/l10n/app_en.arb | 6 + lib/models/settings.dart | 37 ++ lib/modules/browse/browse_screen.dart | 14 +- .../global_search/global_search_screen.dart | 30 +- .../manga/detail/manga_detail_view.dart | 32 ++ .../detail/widgets/recommendation_screen.dart | 383 ++++++++++++++++++ .../algorithm_weights_state_provider.dart | 35 ++ .../algorithm_weights_state_provider.g.dart | 27 ++ .../more/settings/general/general_screen.dart | 221 +++++++++- lib/router/router.dart | 14 +- lib/services/recommendation.dart | 146 +++++++ 11 files changed, 927 insertions(+), 18 deletions(-) create mode 100644 lib/modules/manga/detail/widgets/recommendation_screen.dart create mode 100644 lib/modules/more/providers/algorithm_weights_state_provider.dart create mode 100644 lib/modules/more/providers/algorithm_weights_state_provider.g.dart create mode 100644 lib/services/recommendation.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b169ef6f..4cf2eef4 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -430,6 +430,12 @@ "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_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", diff --git a/lib/models/settings.dart b/lib/models/settings.dart index bfd4a2ac..56c6354d 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -258,6 +258,8 @@ class Settings { bool? rpcShowCoverImage; + late AlgorithmWeights? algorithmWeights; + Settings({ this.id = 227, this.updatedAt = 0, @@ -373,6 +375,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, + this.algorithmWeights, }); Settings.fromJson(Map json) { @@ -594,6 +597,9 @@ class Settings { rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress']; rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; + algorithmWeights = json['algorithmWeights'] != null + ? AlgorithmWeights.fromJson(json['algorithmWeights']) + : null; } Map toJson() => { @@ -732,6 +738,8 @@ class Settings { 'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress, 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, + if (algorithmWeights != null) + 'algorithmWeights': algorithmWeights!.toJson(), }; } @@ -1088,6 +1096,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 json) { + genre = json['genre']; + setting = json['setting']; + synopsis = json['synopsis']; + theme = json['theme']; + } + + Map toJson() => { + 'genre': genre, + 'setting': setting, + 'synopsis': synopsis, + 'theme': theme, + }; +} + enum ColorFilterBlendMode { none, multiply, diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index 914a2048..bbc493e6 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -124,12 +124,14 @@ class _BrowseScreenState extends ConsumerState } 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, + }, + ), ); } }, diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index f3b357a3..6b497653 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -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 createState() => _GlobalSearchScreenState(); } class _GlobalSearchScreenState extends ConsumerState { - String query = ""; + String _query = ""; final _textEditingController = TextEditingController(); late final List sourceList = ref.read(onlyIncludePinnedSourceStateProvider) @@ -50,8 +51,17 @@ class _GlobalSearchScreenState extends ConsumerState { .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 { 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 { final source = sourceList[index]; return SizedBox( height: 260, - child: SourceSearchScreen(query: query, source: source), + child: SourceSearchScreen( + key: ValueKey(query), + query: query, + source: source, + ), ); }, ) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 622c9570..d838f5ef 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -22,6 +22,7 @@ import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.d import 'package:mangayomi/modules/manga/detail/widgets/tracker_search_widget.dart'; import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; +import 'package:mangayomi/modules/more/providers/algorithm_weights_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart'; import 'package:mangayomi/modules/widgets/category_selection_dialog.dart'; @@ -1694,6 +1695,37 @@ class _MangaDetailViewState extends ConsumerState ), ), ), + const SizedBox(height: 15), + SizedBox( + width: context.width(1), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: OutlinedButton.icon( + style: ButtonStyle( + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + ), + ), + onPressed: () { + final algorithmWeights = ref.read( + algorithmWeightsStateProvider, + ); + context.push( + "/recommendations", + extra: ( + widget.manga!.name, + widget.manga!.itemType, + algorithmWeights, + ), + ); + }, + label: Text(l10n.recommendations), + icon: Icon(Icons.arrow_right_alt_outlined), + ), + ), + ), if (!context.isTablet) Column( children: [ diff --git a/lib/modules/manga/detail/widgets/recommendation_screen.dart b/lib/modules/manga/detail/widgets/recommendation_screen.dart new file mode 100644 index 00000000..bca8b9d8 --- /dev/null +++ b/lib/modules/manga/detail/widgets/recommendation_screen.dart @@ -0,0 +1,383 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/recommendation.dart'; +import 'package:mangayomi/utils/constant.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:marquee/marquee.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class RecommendationScreen extends StatefulWidget { + final String name; + final ItemType itemType; + final AlgorithmWeights algorithmWeights; + + const RecommendationScreen({ + super.key, + required this.name, + required this.itemType, + required this.algorithmWeights, + }); + + @override + State createState() => _RecommendationScreenState(); +} + +class _RecommendationScreenState extends State { + String _errorMessage = ""; + bool _isLoading = true; + List? data; + + @override + void initState() { + super.initState(); + _init(); + } + + Future _init() async { + try { + _errorMessage = ""; + data = await getRecommendations( + widget.name, + widget.itemType, + widget.algorithmWeights, + ); + if (mounted) { + setState(() { + _isLoading = false; + }); + } + } catch (e) { + if (mounted) { + setState(() { + _errorMessage = e.toString(); + _isLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return Scaffold( + appBar: AppBar(title: Text(l10n.recommendations)), + body: Padding( + padding: EdgeInsetsGeometry.all(5), + child: _isLoading + ? const Center(child: CircularProgressIndicator()) + : Builder( + builder: (context) { + if (_errorMessage.isNotEmpty) { + return Center(child: Text(_errorMessage)); + } + if (data != null && data!.isNotEmpty) { + return SuperListView.builder( + extentPrecalculationPolicy: SuperPrecalculationPolicy(), + itemCount: data!.length, + itemBuilder: (context, index) { + final recommendation = data![index]; + return ListTile( + onTap: () => context.push( + '/globalSearch', + extra: ( + recommendation.titleEnglish ?? + recommendation.titleRomaji ?? + recommendation.titleNative, + widget.itemType, + ), + ), + title: Row( + children: [ + if (recommendation.imgURLs.isNotEmpty) + _thumbnailPreview( + context, + recommendation.imgURLs.first, + ), + const SizedBox(width: 15), + recommendation.description != null + ? Flexible( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + _buildTitle( + recommendation.titleEnglish ?? + recommendation.titleRomaji ?? + recommendation.titleNative ?? + "", + context, + ), + Text( + recommendation.description!, + style: const TextStyle( + fontSize: 11, + ), + overflow: TextOverflow.clip, + ), + ], + ), + ) + : Flexible( + child: _buildTitle( + recommendation.titleEnglish ?? + recommendation.titleRomaji ?? + recommendation.titleNative ?? + "", + context, + ), + ), + ], + ), + subtitle: Padding( + padding: const EdgeInsets.symmetric(vertical: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, + ), + child: recommendation.genres.isEmpty + ? const SizedBox(height: 15) + : context.isTablet + ? Wrap( + children: [ + for ( + var i = 0; + i < recommendation.genres.length; + i++ + ) + Padding( + padding: const EdgeInsets.only( + left: 2, + right: 2, + bottom: 5, + ), + child: SizedBox( + height: 30, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 0, + backgroundColor: Colors + .grey + .withValues( + alpha: 0.2, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 5, + ), + ), + ), + onPressed: null, + child: Text( + recommendation.genres[i], + style: TextStyle( + fontSize: 11.5, + color: context.isLight + ? Colors.black + : Colors.white, + ), + ), + ), + ), + ), + ], + ) + : SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + for ( + var i = 0; + i < + recommendation + .genres + .length; + i++ + ) + Padding( + padding: + const EdgeInsets.only( + left: 2, + right: 2, + bottom: 5, + ), + child: SizedBox( + height: 30, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 0, + backgroundColor: Colors + .grey + .withValues( + alpha: 0.2, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 5, + ), + ), + ), + onPressed: () {}, + child: Text( + recommendation + .genres[i], + style: TextStyle( + fontSize: 11.5, + color: context.isLight + ? Colors.black + : Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ), + const SizedBox(width: 15), + Text( + "${recommendation.score}% ${l10n.recommendations_similar}", + style: TextStyle( + background: Paint() + ..color = Theme.of(context) + .scaffoldBackgroundColor + .withValues(alpha: 0.75) + ..strokeWidth = 30.0 + ..strokeJoin = StrokeJoin.round + ..style = PaintingStyle.stroke, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ); + }, + ); + } + return Center(child: Text(l10n.no_result)); + }, + ), + ), + ); + } + + Widget _buildTitle(String text, BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + // Make sure that (constraints.maxWidth - (35 + 5)) is strictly positive. + final double availableWidth = constraints.maxWidth - (35 + 5); + final textPainter = + TextPainter( + text: TextSpan(text: text, style: const TextStyle(fontSize: 13)), + maxLines: 1, + textDirection: TextDirection.ltr, + )..layout( + maxWidth: availableWidth > 0 ? availableWidth : 1.0, + ); // - Download icon size (download_page_widget.dart, Widget Build SizedBox width: 35) + + final isOverflowing = textPainter.didExceedMaxLines; + + if (isOverflowing) { + return SizedBox( + height: 20, + child: Marquee( + text: text, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold), + blankSpace: 40.0, + velocity: 30.0, + pauseAfterRound: const Duration(seconds: 1), + startPadding: 10.0, + ), + ); + } else { + return Text( + text, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + ); + } + }, + ); + } + + Widget _thumbnailPreview(BuildContext context, String? imageUrl) { + final imageProvider = CustomExtendedNetworkImageProvider( + toImgUrl(imageUrl ?? ""), + ); + return Padding( + padding: const EdgeInsets.all(3), + child: GestureDetector( + onTap: () { + _openImage(context, imageProvider); + }, + child: SizedBox( + width: 100, + height: 150, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), + ), + ), + ), + ), + ); + } + + void _openImage(BuildContext context, ImageProvider imageProvider) { + showDialog( + context: context, + builder: (context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: Stack( + children: [ + GestureDetector( + onTap: () => Navigator.pop(context), + child: PhotoViewGallery.builder( + backgroundDecoration: const BoxDecoration( + color: Colors.transparent, + ), + itemCount: 1, + builder: (context, index) { + return PhotoViewGalleryPageOptions( + imageProvider: imageProvider, + minScale: PhotoViewComputedScale.contained, + maxScale: 2.0, + ); + }, + loadingBuilder: (context, event) { + return const ProgressCenter(); + }, + ), + ), + ], + ), + ); + }, + ); + } +} + +class SuperPrecalculationPolicy extends ExtentPrecalculationPolicy { + @override + bool shouldPrecalculateExtents(ExtentPrecalculationContext context) { + return context.numberOfItems < 100; + } +} diff --git a/lib/modules/more/providers/algorithm_weights_state_provider.dart b/lib/modules/more/providers/algorithm_weights_state_provider.dart new file mode 100644 index 00000000..cfe4b2ba --- /dev/null +++ b/lib/modules/more/providers/algorithm_weights_state_provider.dart @@ -0,0 +1,35 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'algorithm_weights_state_provider.g.dart'; + +@riverpod +class AlgorithmWeightsState extends _$AlgorithmWeightsState { + @override + AlgorithmWeights build() { + return isar.settings.getSync(227)!.algorithmWeights ?? AlgorithmWeights(); + } + + void set(AlgorithmWeights value) { + final settings = isar.settings.getSync(227)!; + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings + ..algorithmWeights = state + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } + + void setWeights({int? genre, int? setting, int? synopsis, int? theme}) { + set( + AlgorithmWeights( + genre: genre ?? state.genre, + setting: setting ?? state.setting, + synopsis: synopsis ?? state.synopsis, + theme: theme ?? state.theme, + ), + ); + } +} diff --git a/lib/modules/more/providers/algorithm_weights_state_provider.g.dart b/lib/modules/more/providers/algorithm_weights_state_provider.g.dart new file mode 100644 index 00000000..0374b79d --- /dev/null +++ b/lib/modules/more/providers/algorithm_weights_state_provider.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'algorithm_weights_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$algorithmWeightsStateHash() => + r'5c20cb9b195a73161b485e082ad024b138c3da9c'; + +/// See also [AlgorithmWeightsState]. +@ProviderFor(AlgorithmWeightsState) +final algorithmWeightsStateProvider = AutoDisposeNotifierProvider< + AlgorithmWeightsState, AlgorithmWeights>.internal( + AlgorithmWeightsState.new, + name: r'algorithmWeightsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$algorithmWeightsStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AlgorithmWeightsState = AutoDisposeNotifier; +// 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 diff --git a/lib/modules/more/settings/general/general_screen.dart b/lib/modules/more/settings/general/general_screen.dart index 10cd91b6..379a47d9 100644 --- a/lib/modules/more/settings/general/general_screen.dart +++ b/lib/modules/more/settings/general/general_screen.dart @@ -1,14 +1,38 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/more/providers/algorithm_weights_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/utils/extensions/build_context_extensions.dart'; -class GeneralScreen extends ConsumerWidget { +class GeneralScreen extends ConsumerStatefulWidget { const GeneralScreen({super.key}); @override - Widget build(BuildContext context, WidgetRef ref) { + ConsumerState createState() => _GeneralStateScreen(); +} + +class _GeneralStateScreen extends ConsumerState { + int _genre = 0; + int _setting = 0; + int _synopsis = 0; + int _theme = 0; + + @override + void initState() { + super.initState(); + final algorithmWeights = ref.read(algorithmWeightsStateProvider); + _genre = algorithmWeights.genre!; + _setting = algorithmWeights.setting!; + _synopsis = algorithmWeights.synopsis!; + _theme = algorithmWeights.theme!; + } + + @override + Widget build(BuildContext context) { final l10n = l10nLocalizations(context); final enableDiscordRpc = ref.watch(enableDiscordRpcStateProvider); final hideDiscordRpcInIncognito = ref.watch( @@ -24,6 +48,199 @@ class GeneralScreen extends ConsumerWidget { body: SingleChildScrollView( child: Column( children: [ + Container( + margin: const EdgeInsets.all(20.0), + padding: const EdgeInsets.all(10.0), + decoration: BoxDecoration( + border: Border.all(width: 3.0, color: context.primaryColor), + borderRadius: BorderRadius.all(Radius.circular(5.0)), + ), + child: Column( + children: [ + Row( + children: [ + Text( + context.l10n.recommendations_weights, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox(width: 20), + OutlinedButton.icon( + onPressed: () { + final defaultWeights = AlgorithmWeights(); + setState(() { + _genre = defaultWeights.genre!; + _setting = defaultWeights.setting!; + _synopsis = defaultWeights.synopsis!; + _theme = defaultWeights.theme!; + }); + ref + .read(algorithmWeightsStateProvider.notifier) + .set(defaultWeights); + }, + label: Text(context.l10n.reset), + icon: const Icon(Icons.restore), + ), + ], + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.recommendations_weights_genre), + Text( + (_genre / 100).toStringAsFixed(2), + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 100, + value: _genre.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + setState(() { + _genre = value.toInt(); + }); + }, + onChangeEnd: (value) => ref + .read(algorithmWeightsStateProvider.notifier) + .setWeights(genre: _genre), + ), + ), + ], + ), + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.recommendations_weights_setting), + Text( + (_setting / 100).toStringAsFixed(2), + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 100, + value: _setting.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + setState(() { + _setting = value.toInt(); + }); + }, + onChangeEnd: (value) => ref + .read(algorithmWeightsStateProvider.notifier) + .setWeights(setting: _setting), + ), + ), + ], + ), + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.recommendations_weights_synopsis), + Text( + (_synopsis / 100).toStringAsFixed(2), + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 100, + value: _synopsis.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + setState(() { + _synopsis = value.toInt(); + }); + }, + onChangeEnd: (value) => ref + .read(algorithmWeightsStateProvider.notifier) + .setWeights(synopsis: _synopsis), + ), + ), + ], + ), + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.recommendations_weights_theme), + Text( + (_theme / 100).toStringAsFixed(2), + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 100, + value: _theme.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + setState(() { + _theme = value.toInt(); + }); + }, + onChangeEnd: (value) => ref + .read(algorithmWeightsStateProvider.notifier) + .setWeights(theme: _theme), + ), + ), + ], + ), + ), + ], + ), + ), SwitchListTile( value: enableDiscordRpc, title: Text(l10n.enable_discord_rpc), diff --git a/lib/router/router.dart b/lib/router/router.dart index a0b24a97..6214b5c2 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_search.dart'; @@ -12,6 +13,7 @@ import 'package:mangayomi/modules/browse/extension/extension_detail.dart'; import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart'; import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart'; import 'package:mangayomi/modules/manga/detail/widgets/migrate_screen.dart'; +import 'package:mangayomi/modules/manga/detail/widgets/recommendation_screen.dart'; import 'package:mangayomi/modules/more/data_and_storage/create_backup.dart'; import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; @@ -168,9 +170,9 @@ class RouterNotifier extends ChangeNotifier { name: "extension_detail", builder: (source) => ExtensionDetail(source: source), ), - _genericRoute( + _genericRoute<(String?, ItemType)>( name: "globalSearch", - builder: (itemType) => GlobalSearchScreen(itemType: itemType), + builder: (data) => GlobalSearchScreen(search: data.$1, itemType: data.$2), ), _genericRoute(name: "about", child: const AboutScreen()), _genericRoute(name: "track", child: const TrackScreen()), @@ -222,6 +224,14 @@ class RouterNotifier extends ChangeNotifier { name: "migrate/tracker", builder: (data) => MigrationScreen(manga: data.$1, trackSearch: data.$2), ), + _genericRoute<(String, ItemType, AlgorithmWeights)>( + name: "recommendations", + builder: (data) => RecommendationScreen( + name: data.$1, + itemType: data.$2, + algorithmWeights: data.$3, + ), + ), ]; GoRoute _genericRoute({ diff --git a/lib/services/recommendation.dart b/lib/services/recommendation.dart new file mode 100644 index 00000000..37ecdafe --- /dev/null +++ b/lib/services/recommendation.dart @@ -0,0 +1,146 @@ +import 'dart:convert'; +import 'package:http_interceptor/http_interceptor.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/services/http/m_client.dart'; + +Future?> getRecommendations( + String name, + ItemType itemType, + AlgorithmWeights algorithmWeights, +) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final mediaId = await _getSuggest(http, name, itemType); + return _getRecommendation( + http, + mediaId ?? name, + itemType, + algorithmWeights, + ); + } catch (_) { + return null; + } +} + +Future?> _getRecommendation( + InterceptedClient http, + String mediaId, + ItemType itemType, + AlgorithmWeights algorithmWeights, +) async { + final url = + "https://anibrain.ai/api/-/recommender/recs/${itemType != ItemType.anime ? "manga" : "anime"}"; + final res = await http.get( + Uri.parse(url), + headers: { + "priority": "u=1, i", + "Referer": "https://anibrain.ai/", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + params: { + "filterCountry": '[]', + "filterFormat": '${_fillerType(itemType).map((e) => '"$e"').toList()}', + "filterGenre": '{}', + "filterTag": '{"max":{},"min":{}}', + "filterRelease": '[1930,${DateTime.now().year}]', + "filterScore": 0, + "algorithmWeights": _algorithmWeights(algorithmWeights), + "mediaId": mediaId, + "mediaType": _mediaType(itemType), + "adult": false, + "page": 1, + }, + ); + final data = json.decode(res.body) as Map; + return (data["data"] as List?) + ?.map((e) => RecommendationResult.fromJson(e)) + .toList(); +} + +Future _getSuggest( + InterceptedClient http, + String name, + ItemType itemType, +) async { + final url = + "https://anibrain.ai/api/-/recommender/autosuggest?searchValue=$name&mediaType=${_mediaType(itemType)}&adult=false"; + final res = await http.get( + Uri.parse(url), + headers: { + "priority": "u=1, i", + "Referer": "https://anibrain.ai/recommender/manga", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final data = json.decode(res.body) as Map; + final list = (data["data"] as List?)?.map((e) => e["id"]); + return list?.firstOrNull; +} + +String _algorithmWeights(AlgorithmWeights algorithmWeights) { + final genre = ((algorithmWeights.genre ?? 30) / 100).toStringAsFixed(2); + final setting = ((algorithmWeights.setting ?? 15) / 100).toStringAsFixed(2); + final synopsis = ((algorithmWeights.synopsis ?? 40) / 100).toStringAsFixed(2); + final theme = ((algorithmWeights.theme ?? 20) / 100).toStringAsFixed(2); + return '{"genre":$genre,"setting":$setting,"synopsis":$synopsis,"theme":$theme}'; +} + +String _mediaType(ItemType itemType) { + return switch (itemType) { + ItemType.manga => "MANGA", + ItemType.anime => "ANIME", + ItemType.novel => "NOVEL", + }; +} + +List _fillerType(ItemType itemType) { + return switch (itemType) { + ItemType.manga => ["MANGA"], + ItemType.anime => ["movie", "ona", "tv"], + ItemType.novel => ["NOVEL"], + }; +} + +class RecommendationResult { + final String id; + final int? anilistId; + final int? myanimelistId; + final int score; + final String? titleRomaji; + final String? titleEnglish; + final String? titleNative; + final String? description; + final List imgURLs; + final List genres; + + RecommendationResult({ + required this.id, + this.anilistId, + this.myanimelistId, + required this.score, + this.titleRomaji, + this.titleEnglish, + this.titleNative, + this.description, + required this.imgURLs, + required this.genres, + }); + + factory RecommendationResult.fromJson(Map json) { + return RecommendationResult( + id: json["id"], + anilistId: json["anilistId"], + myanimelistId: json["myanimelistId"], + score: json["score"], + titleRomaji: json["titleRomaji"], + titleEnglish: json["titleEnglish"], + titleNative: json["titleNative"], + description: json["description"], + imgURLs: json["imgURLs"]?.cast() ?? [], + genres: json["genres"]?.cast() ?? [], + ); + } +} From 226c6b145ef659519389b0e84c10ea7b94ef046e Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 15 Aug 2025 22:07:44 +0200 Subject: [PATCH 053/100] allow to swipe pages even if zoomed in --- lib/modules/manga/reader/reader_view.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 08a78c99..9257b22b 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -640,7 +640,7 @@ class _MangaChapterPageGalleryState reverse: _isReverseHorizontal, physics: const ClampingScrollPhysics(), canScrollPage: (_) { - return _horizontalScaleValue == 1.0; + return true; }, itemBuilder: (context, index) { if (index < _uChapDataPreload.length && @@ -693,9 +693,7 @@ class _MangaChapterPageGalleryState reverse: _isReverseHorizontal, physics: const ClampingScrollPhysics(), canScrollPage: (gestureDetails) { - return gestureDetails != null - ? !(gestureDetails.totalScale! > 1.0) - : true; + return true; }, itemBuilder: (BuildContext context, int index) { if (_uChapDataPreload[index] From f88978219f685d32c00132813db5c739102f44fc Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:21:28 +0200 Subject: [PATCH 054/100] Fix Kitsu "No Cover" Exception ``` NoSuchMethodError: The method '[]' was called on null. Receiver: null Tried calling []("original") ``` --- lib/services/trackers/kitsu.dart | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/services/trackers/kitsu.dart b/lib/services/trackers/kitsu.dart index 91aca50d..384c32c1 100644 --- a/lib/services/trackers/kitsu.dart +++ b/lib/services/trackers/kitsu.dart @@ -160,7 +160,7 @@ class Kitsu extends _$Kitsu { mediaId: jsonRes['id'], summary: jsonRes['synopsis'] ?? "", totalChapter: (jsonRes[totalChapter] ?? 0), - coverUrl: jsonRes['posterImage']['original'] ?? "", + coverUrl: jsonRes['posterImage']?['original'] ?? "", title: jsonRes['canonicalTitle'], startDate: "", publishingType: (jsonRes["subtype"] ?? ""), @@ -192,22 +192,23 @@ class Kitsu extends _$Kitsu { final mediaId = jsonRes['id'] is String ? int.parse(jsonRes['id']) : jsonRes['id']; - final score = jsonRes['attributes']['averageRating'] is String - ? double.parse(jsonRes['attributes']['averageRating']) - : jsonRes['attributes']['averageRating']; + final attributes = jsonRes['attributes']; + final score = attributes['averageRating'] is String + ? double.parse(attributes['averageRating']) + : attributes['averageRating']; return TrackSearch( libraryId: mediaId, syncId: syncId, trackingUrl: _mediaUrl(isManga ? 'manga' : 'anime', mediaId), mediaId: mediaId, - summary: jsonRes['attributes']['synopsis'] ?? "", - totalChapter: (jsonRes['attributes'][totalChapter] ?? 0), - coverUrl: jsonRes['attributes']['posterImage']['original'] ?? "", - title: jsonRes['attributes']['canonicalTitle'], + summary: attributes['synopsis'] ?? "", + totalChapter: (attributes[totalChapter] ?? 0), + coverUrl: attributes['posterImage']?['original'] ?? "", + title: attributes['canonicalTitle'], startDate: "", score: score, - publishingType: (jsonRes['attributes']['subtype'] ?? ""), - publishingStatus: jsonRes['attributes']['endDate'] == null + publishingType: (attributes['subtype'] ?? ""), + publishingStatus: attributes['endDate'] == null ? "Publishing" : "Finished", ); @@ -250,7 +251,7 @@ class Kitsu extends _$Kitsu { trackingUrl: _mediaUrl(type, id), summary: included['synopsis'] ?? "", totalChapter: included[totalChapter] ?? 0, - coverUrl: included['posterImage']['original'] ?? "", + coverUrl: included['posterImage']?['original'] ?? "", title: included['canonicalTitle'], startDate: "", publishingType: (included["subtype"] ?? ""), From 85751538ac60e90c91b418c000e0aad85097cefd Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:55:15 +0200 Subject: [PATCH 055/100] Fix MAL "No Cover" Exception ``` NoSuchMethodError: The method '[]' was called on null. Receiver: null Tried calling []("large") ``` --- lib/services/trackers/myanimelist.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index 376c0fcf..eb7c9a8b 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -159,7 +159,7 @@ class MyAnimeList extends _$MyAnimeList { mediaId: res["id"], summary: res["synopsis"] ?? "", totalChapter: res[contentUnit], - coverUrl: res["main_picture"]["large"] ?? "", + coverUrl: res["main_picture"]?["large"] ?? "", title: res["title"], startDate: res["start_date"] ?? "", publishingType: res["media_type"].toString().replaceAll("_", " "), @@ -197,7 +197,7 @@ class MyAnimeList extends _$MyAnimeList { mediaId: node["id"], summary: node["synopsis"] ?? "", totalChapter: node[contentUnit], - coverUrl: node["main_picture"]["large"] ?? "", + coverUrl: node["main_picture"]?["large"] ?? "", title: node["title"], score: (node["mean"] as num?)?.toDouble(), startDate: node["start_date"] ?? "", @@ -237,7 +237,7 @@ class MyAnimeList extends _$MyAnimeList { mediaId: node["id"], summary: node["synopsis"] ?? "", totalChapter: node[contentUnit], - coverUrl: node["main_picture"]["large"] ?? "", + coverUrl: node["main_picture"]?["large"] ?? "", title: node["title"], score: (node["mean"] as num?)?.toDouble(), startDate: node["start_date"] ?? "", From c8b8e1d917bc966b787a2950fe38b90ef67f6028 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 18 Aug 2025 18:35:26 +0200 Subject: [PATCH 056/100] added missing arb entry --- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 60 ++++++++++++++++++++ lib/l10n/generated/app_localizations_ar.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_as.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_de.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_en.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_es.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_fr.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_hi.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_id.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_it.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_pt.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_ru.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_th.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_tr.dart | 31 ++++++++++ lib/l10n/generated/app_localizations_zh.dart | 31 ++++++++++ 16 files changed, 495 insertions(+) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 44d0e119..2a24b955 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -433,6 +433,7 @@ "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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index fe050ea9..15f53832 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -537,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: @@ -1605,6 +1617,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: @@ -2655,6 +2673,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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 8902e8f6..2e2c3acd 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -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 => 'قائمة الانتظار للتحميل'; @@ -794,6 +801,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get novel_extensions => 'إضافات الروايات'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'أنمي'; @@ -1362,6 +1372,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 => 'مستودع إضافات المانجا'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 482a6857..1b3b235e 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -233,6 +233,13 @@ class AppLocalizationsAs 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 => 'ডাউনলোড শাৰী'; @@ -797,6 +804,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get novel_extensions => 'Novel Extensions'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'এনিমে'; @@ -1364,6 +1374,27 @@ class AppLocalizationsAs 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'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 2b972192..25d3ae6d 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -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'; @@ -799,6 +806,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get novel_extensions => 'Novel-Erweiterungen'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'Anime'; @@ -1373,6 +1383,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'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 9c3672a0..e0dd0b27 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -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'; @@ -797,6 +804,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get novel_extensions => 'Novel Extensions'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'Anime'; @@ -1363,6 +1373,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'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 183b9681..5a9b38fe 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -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'; @@ -801,6 +808,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'; @@ -1377,6 +1387,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'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 13a45d79..b9a90f9c 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -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'; @@ -804,6 +811,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é'; @@ -1380,6 +1390,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'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 928ac58c..9b01d5c3 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -233,6 +233,13 @@ class AppLocalizationsHi 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 => 'डाउनलोड कतार'; @@ -797,6 +804,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get novel_extensions => 'Novel Extensions'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'एनीमे'; @@ -1365,6 +1375,27 @@ class AppLocalizationsHi 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'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 9e26b025..97b1bff0 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -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'; @@ -801,6 +808,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get novel_extensions => 'Ekstensi Novel'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'Anime'; @@ -1369,6 +1379,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'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index d64fd6de..7bda719d 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -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'; @@ -801,6 +808,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get novel_extensions => 'Estensioni romanzo'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'Anime'; @@ -1377,6 +1387,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'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index fc1f16a0..9c27d999 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -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'; @@ -801,6 +808,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'; @@ -1374,6 +1384,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'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 2763c20a..5d63574d 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -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 => 'Очередь загрузки'; @@ -803,6 +810,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get novel_extensions => 'Расширения для романов'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'Аниме'; @@ -1376,6 +1386,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 => 'Репозиторий расширений манги'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index d1a8c1ca..84c9aaff 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -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 => 'คิวดาวน์โหลด'; @@ -796,6 +803,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get novel_extensions => 'ส่วนขยายของนวนิยาย'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => 'อนิเมะ'; @@ -1363,6 +1373,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 => 'ที่เก็บส่วนขยายมังงะ'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 4c68163e..ddc19651 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -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'; @@ -797,6 +804,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'; @@ -1369,6 +1379,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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 9c053b99..3c97660f 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -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 => '下载队列'; @@ -786,6 +793,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get novel_extensions => '小说扩展'; + @override + String get extension_settings => 'Extension settings'; + @override String get anime => '动画'; @@ -1337,6 +1347,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 => '漫画扩展库'; From 5f9efe957a1255c1496cc287a34d5e88ea6c44b4 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 20 Aug 2025 03:59:38 +0200 Subject: [PATCH 057/100] adding support for Mihon extensions --- lib/eval/lib.dart | 2 + lib/eval/mihon/models.dart | 85 ++ lib/eval/mihon/service.dart | 275 ++++ lib/models/settings.dart | 5 + lib/models/settings.g.dart | 1693 ++++++++++++++++------ lib/models/source.dart | 2 +- lib/models/source.g.dart | 2 + lib/services/aniskip.g.dart | 2 +- lib/services/fetch_sources_list.dart | 58 +- lib/services/sync_server.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- lib/services/trackers/kitsu.g.dart | 2 +- lib/services/trackers/myanimelist.g.dart | 2 +- 13 files changed, 1647 insertions(+), 485 deletions(-) create mode 100644 lib/eval/mihon/models.dart create mode 100644 lib/eval/mihon/service.dart diff --git a/lib/eval/lib.dart b/lib/eval/lib.dart index e185a75d..b066d61e 100644 --- a/lib/eval/lib.dart +++ b/lib/eval/lib.dart @@ -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) { return switch (source.sourceCodeLanguage) { SourceCodeLanguage.dart => DartExtensionService(source), SourceCodeLanguage.javascript => JsExtensionService(source), + SourceCodeLanguage.mihon => MihonExtensionService(source, "http://localhost:8080"), }; } diff --git a/lib/eval/mihon/models.dart b/lib/eval/mihon/models.dart new file mode 100644 index 00000000..ef629187 --- /dev/null +++ b/lib/eval/mihon/models.dart @@ -0,0 +1,85 @@ +import 'package:mangayomi/models/manga.dart'; + +class MangaPages { + List list; + bool hasNextPage; + MangaPages({required this.list, this.hasNextPage = false}); + + factory MangaPages.fromJson(Map 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 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? 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 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 toJson() { + return { + 'url': url, + 'title': title, + 'artist': artist, + 'author': author, + 'description': description, + 'genre': genre?.join(", "), + 'status': status, + 'thumbnail_url': thumbnailUrl, + }; + } +} diff --git a/lib/eval/mihon/service.dart b/lib/eval/mihon/service.dart new file mode 100644 index 00000000..01d42534 --- /dev/null +++ b/lib/eval/mihon/service.dart @@ -0,0 +1,275 @@ +import 'dart:convert'; +import 'package:http_interceptor/http_interceptor.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 getHeaders() { + return {}; + } + + @override + bool get supportsLatest { + return true; + } + + @override + String get sourceBaseUrl { + return source.baseUrl!; + } + + @override + Future 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": "", + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as Map; + 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 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": "", + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as Map; + 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 search(String query, int page, List 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": page + 1, + "search": query, + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as Map; + 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 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}, + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as Map; + 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> 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}, + "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'] is int + ? (e['date_upload'] as int).toString() + : e['date_upload'], + scanlator: e['scanlator'], + ), + ) + .toList(); + } + + @override + Future> getPageList(String url) async { + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({ + "method": "getPageList", + "chapterData": {"url": url}, + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as List; + return data.map((e) => PageUrl(e['url'])).toList(); + } + + @override + Future> getVideoList(String url) async { + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({ + "method": "getVideoList", + "episodeData": {"url": url}, + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as List; + return data.map((e) { + final tempHeaders = + e['headers']['namesAndValues\$okhttp'] as List; + final Map headers = {}; + for (var i = 0; i + 1 < tempHeaders.length; i++) { + 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'], label: e['label'])) + .toList() ?? + [], + subtitles: + (e['subtitleTracks'] as List?) + ?.map((e) => Track(file: e['file'], label: e['label'])) + .toList() ?? + [], + ); + }).toList(); + } + + @override + Future getHtmlContent(String name, String url) async { + return ""; + } + + @override + Future cleanHtmlContent(String html) async { + return html; + } + + @override + FilterList getFilterList() { + return FilterList([]); + } + + @override + List getSourcePreferences() { + return []; + } +} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 78b6083b..3456b5b6 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -201,6 +201,8 @@ class Settings { List? novelExtensionsRepo; + String? androidProxyServer; + @enumerated late SectionType disableSectionType; @@ -371,6 +373,7 @@ class Settings { this.mangaExtensionsRepo, this.animeExtensionsRepo, this.novelExtensionsRepo, + this.androidProxyServer, this.lastTrackerLibraryLocation, this.mergeLibraryNavMobile = false, this.enableDiscordRpc = true, @@ -594,6 +597,7 @@ class Settings { .map((e) => Repo.fromJson(e)) .toList(); } + androidProxyServer = json['androidProxyServer']; lastTrackerLibraryLocation = json['lastTrackerLibraryLocation']; mergeLibraryNavMobile = json['mergeLibraryNavMobile']; enableDiscordRpc = json['enableDiscordRpc']; @@ -736,6 +740,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, diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 28101798..82bb97ca 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -17,629 +17,645 @@ const SettingsSchema = CollectionSchema( name: r'Settings', id: -8656046621518759136, properties: { - r'aniSkipTimeoutLength': PropertySchema( + r'algorithmWeights': PropertySchema( id: 0, + name: r'algorithmWeights', + type: IsarType.object, + target: r'AlgorithmWeights', + ), + r'androidProxyServer': PropertySchema( + id: 1, + name: r'androidProxyServer', + type: IsarType.string, + ), + r'aniSkipTimeoutLength': PropertySchema( + id: 2, name: r'aniSkipTimeoutLength', type: IsarType.long, ), r'animatePageTransitions': PropertySchema( - id: 1, + id: 3, name: r'animatePageTransitions', type: IsarType.bool, ), r'animeDisplayType': PropertySchema( - id: 2, + id: 4, name: r'animeDisplayType', type: IsarType.byte, enumMap: _SettingsanimeDisplayTypeEnumValueMap, ), r'animeExtensionsRepo': PropertySchema( - id: 3, + id: 5, name: r'animeExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'animeGridSize': PropertySchema( - id: 4, + id: 6, name: r'animeGridSize', type: IsarType.long, ), r'animeLibraryDownloadedChapters': PropertySchema( - id: 5, + id: 7, name: r'animeLibraryDownloadedChapters', type: IsarType.bool, ), r'animeLibraryLocalSource': PropertySchema( - id: 6, + id: 8, name: r'animeLibraryLocalSource', type: IsarType.bool, ), r'animeLibraryShowCategoryTabs': PropertySchema( - id: 7, + id: 9, name: r'animeLibraryShowCategoryTabs', type: IsarType.bool, ), r'animeLibraryShowContinueReadingButton': PropertySchema( - id: 8, + id: 10, name: r'animeLibraryShowContinueReadingButton', type: IsarType.bool, ), r'animeLibraryShowLanguage': PropertySchema( - id: 9, + id: 11, name: r'animeLibraryShowLanguage', type: IsarType.bool, ), r'animeLibraryShowNumbersOfItems': PropertySchema( - id: 10, + id: 12, name: r'animeLibraryShowNumbersOfItems', type: IsarType.bool, ), r'appFontFamily': PropertySchema( - id: 11, + id: 13, name: r'appFontFamily', type: IsarType.string, ), r'autoBackupLocation': PropertySchema( - id: 12, + id: 14, name: r'autoBackupLocation', type: IsarType.string, ), r'autoExtensionsUpdates': PropertySchema( - id: 13, + id: 15, name: r'autoExtensionsUpdates', type: IsarType.bool, ), r'autoScrollPages': PropertySchema( - id: 14, + id: 16, name: r'autoScrollPages', type: IsarType.objectList, target: r'AutoScrollPages', ), r'backgroundColor': PropertySchema( - id: 15, + id: 17, name: r'backgroundColor', type: IsarType.byte, enumMap: _SettingsbackgroundColorEnumValueMap, ), r'backupFrequency': PropertySchema( - id: 16, + id: 18, name: r'backupFrequency', type: IsarType.long, ), r'backupListOptions': PropertySchema( - id: 17, + id: 19, name: r'backupListOptions', type: IsarType.longList, ), r'btServerAddress': PropertySchema( - id: 18, + id: 20, name: r'btServerAddress', type: IsarType.string, ), r'btServerPort': PropertySchema( - id: 19, + id: 21, name: r'btServerPort', type: IsarType.long, ), r'chapterFilterBookmarkedList': PropertySchema( - id: 20, + id: 22, name: r'chapterFilterBookmarkedList', type: IsarType.objectList, target: r'ChapterFilterBookmarked', ), r'chapterFilterDownloadedList': PropertySchema( - id: 21, + id: 23, name: r'chapterFilterDownloadedList', type: IsarType.objectList, target: r'ChapterFilterDownloaded', ), r'chapterFilterUnreadList': PropertySchema( - id: 22, + id: 24, name: r'chapterFilterUnreadList', type: IsarType.objectList, target: r'ChapterFilterUnread', ), r'chapterPageIndexList': PropertySchema( - id: 23, + id: 25, name: r'chapterPageIndexList', type: IsarType.objectList, target: r'ChapterPageIndex', ), r'chapterPageUrlsList': PropertySchema( - id: 24, + id: 26, name: r'chapterPageUrlsList', type: IsarType.objectList, target: r'ChapterPageurls', ), r'checkForAppUpdates': PropertySchema( - id: 25, + id: 27, name: r'checkForAppUpdates', type: IsarType.bool, ), r'checkForExtensionUpdates': PropertySchema( - id: 26, + id: 28, name: r'checkForExtensionUpdates', type: IsarType.bool, ), r'clearChapterCacheOnAppLaunch': PropertySchema( - id: 27, + id: 29, name: r'clearChapterCacheOnAppLaunch', type: IsarType.bool, ), r'colorFilterBlendMode': PropertySchema( - id: 28, + id: 30, name: r'colorFilterBlendMode', type: IsarType.byte, enumMap: _SettingscolorFilterBlendModeEnumValueMap, ), r'concurrentDownloads': PropertySchema( - id: 29, + id: 31, name: r'concurrentDownloads', type: IsarType.long, ), r'cookiesList': PropertySchema( - id: 30, + id: 32, name: r'cookiesList', type: IsarType.objectList, target: r'MCookie', ), r'cropBorders': PropertySchema( - id: 31, + id: 33, name: r'cropBorders', type: IsarType.bool, ), r'customColorFilter': PropertySchema( - id: 32, + id: 34, name: r'customColorFilter', type: IsarType.object, target: r'CustomColorFilter', ), r'dateFormat': PropertySchema( - id: 33, + id: 35, name: r'dateFormat', type: IsarType.string, ), r'defaultDoubleTapToSkipLength': PropertySchema( - id: 34, + id: 36, name: r'defaultDoubleTapToSkipLength', type: IsarType.long, ), r'defaultPlayBackSpeed': PropertySchema( - id: 35, + id: 37, name: r'defaultPlayBackSpeed', type: IsarType.double, ), r'defaultReaderMode': PropertySchema( - id: 36, + id: 38, name: r'defaultReaderMode', type: IsarType.byte, enumMap: _SettingsdefaultReaderModeEnumValueMap, ), r'defaultSkipIntroLength': PropertySchema( - id: 37, + id: 39, name: r'defaultSkipIntroLength', type: IsarType.long, ), r'defaultSubtitleLang': PropertySchema( - id: 38, + id: 40, name: r'defaultSubtitleLang', type: IsarType.object, target: r'L10nLocale', ), r'disableSectionType': PropertySchema( - id: 39, + id: 41, name: r'disableSectionType', type: IsarType.byte, enumMap: _SettingsdisableSectionTypeEnumValueMap, ), r'displayType': PropertySchema( - id: 40, + id: 42, name: r'displayType', type: IsarType.byte, enumMap: _SettingsdisplayTypeEnumValueMap, ), r'doubleTapAnimationSpeed': PropertySchema( - id: 41, + id: 43, name: r'doubleTapAnimationSpeed', type: IsarType.long, ), r'downloadLocation': PropertySchema( - id: 42, + id: 44, name: r'downloadLocation', type: IsarType.string, ), r'downloadOnlyOnWifi': PropertySchema( - id: 43, + id: 45, name: r'downloadOnlyOnWifi', type: IsarType.bool, ), + r'downloadedOnlyMode': PropertySchema( + id: 46, + name: r'downloadedOnlyMode', + type: IsarType.bool, + ), r'enableAniSkip': PropertySchema( - id: 44, + id: 47, name: r'enableAniSkip', type: IsarType.bool, ), r'enableAutoSkip': PropertySchema( - id: 45, + id: 48, name: r'enableAutoSkip', type: IsarType.bool, ), r'enableCustomColorFilter': PropertySchema( - id: 46, + id: 49, name: r'enableCustomColorFilter', type: IsarType.bool, ), r'enableDiscordRpc': PropertySchema( - id: 47, + id: 50, name: r'enableDiscordRpc', type: IsarType.bool, ), r'filterScanlatorList': PropertySchema( - id: 48, + id: 51, name: r'filterScanlatorList', type: IsarType.objectList, target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 49, + id: 52, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 50, + id: 53, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'followSystemTheme': PropertySchema( - id: 51, + id: 54, name: r'followSystemTheme', type: IsarType.bool, ), r'fullScreenPlayer': PropertySchema( - id: 52, + id: 55, name: r'fullScreenPlayer', type: IsarType.bool, ), r'fullScreenReader': PropertySchema( - id: 53, + id: 56, name: r'fullScreenReader', type: IsarType.bool, ), r'hideDiscordRpcInIncognito': PropertySchema( - id: 54, + id: 57, name: r'hideDiscordRpcInIncognito', type: IsarType.bool, ), r'hideItems': PropertySchema( - id: 55, + id: 58, name: r'hideItems', type: IsarType.stringList, ), r'hwdecMode': PropertySchema( - id: 56, + id: 59, name: r'hwdecMode', type: IsarType.string, ), r'incognitoMode': PropertySchema( - id: 57, + id: 60, name: r'incognitoMode', type: IsarType.bool, ), r'lastTrackerLibraryLocation': PropertySchema( - id: 58, + id: 61, name: r'lastTrackerLibraryLocation', type: IsarType.string, ), r'libraryDownloadedChapters': PropertySchema( - id: 59, + id: 62, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 60, + id: 63, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 61, + id: 64, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 62, + id: 65, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 63, + id: 66, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 64, + id: 67, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 65, + id: 68, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 66, + id: 69, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 67, + id: 70, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 68, + id: 71, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 69, + id: 72, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 70, + id: 73, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 71, + id: 74, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 72, + id: 75, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 73, + id: 76, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 74, + id: 77, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 75, + id: 78, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 76, + id: 79, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 77, + id: 80, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( - id: 78, + id: 81, name: r'mangaExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'mangaGridSize': PropertySchema( - id: 79, + id: 82, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 80, + id: 83, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 81, + id: 84, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'mergeLibraryNavMobile': PropertySchema( - id: 82, + id: 85, name: r'mergeLibraryNavMobile', type: IsarType.bool, ), r'navigationOrder': PropertySchema( - id: 83, + id: 86, name: r'navigationOrder', type: IsarType.stringList, ), r'novelDisplayType': PropertySchema( - id: 84, + id: 87, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelExtensionsRepo': PropertySchema( - id: 85, + id: 88, name: r'novelExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'novelFontSize': PropertySchema( - id: 86, + id: 89, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 87, + id: 90, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 88, + id: 91, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 89, + id: 92, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 90, + id: 93, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 91, + id: 94, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 92, + id: 95, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 93, + id: 96, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 94, + id: 97, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 95, + id: 98, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 96, + id: 99, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 97, + id: 100, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 98, + id: 101, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 99, + id: 102, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 100, + id: 103, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 101, + id: 104, name: r'relativeTimesTamps', type: IsarType.long, ), r'rpcShowCoverImage': PropertySchema( - id: 102, + id: 105, name: r'rpcShowCoverImage', type: IsarType.bool, ), r'rpcShowReadingWatchingProgress': PropertySchema( - id: 103, + id: 106, name: r'rpcShowReadingWatchingProgress', type: IsarType.bool, ), r'rpcShowTitle': PropertySchema( - id: 104, + id: 107, name: r'rpcShowTitle', type: IsarType.bool, ), r'saveAsCBZArchive': PropertySchema( - id: 105, + id: 108, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 106, + id: 109, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 107, + id: 110, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 108, + id: 111, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 109, + id: 112, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 110, + id: 113, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 111, + id: 114, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 112, + id: 115, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 113, + id: 116, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 114, + id: 117, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'updatedAt': PropertySchema( - id: 115, + id: 118, name: r'updatedAt', type: IsarType.long, ), r'useLibass': PropertySchema( - id: 116, + id: 119, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 117, + id: 120, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 118, + id: 121, name: r'userAgent', type: IsarType.string, ) @@ -674,7 +690,8 @@ const SettingsSchema = CollectionSchema( r'AutoScrollPages': AutoScrollPagesSchema, r'CustomColorFilter': CustomColorFilterSchema, r'PlayerSubtitleSettings': PlayerSubtitleSettingsSchema, - r'Repo': RepoSchema + r'Repo': RepoSchema, + r'AlgorithmWeights': AlgorithmWeightsSchema }, getId: _settingsGetId, getLinks: _settingsGetLinks, @@ -688,6 +705,20 @@ int _settingsEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + { + final value = object.algorithmWeights; + if (value != null) { + bytesCount += 3 + + AlgorithmWeightsSchema.estimateSize( + value, allOffsets[AlgorithmWeights]!, allOffsets); + } + } + { + final value = object.androidProxyServer; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final list = object.animeExtensionsRepo; if (list != null) { @@ -1023,230 +1054,238 @@ void _settingsSerialize( List offsets, Map> allOffsets, ) { - writer.writeLong(offsets[0], object.aniSkipTimeoutLength); - writer.writeBool(offsets[1], object.animatePageTransitions); - writer.writeByte(offsets[2], object.animeDisplayType.index); + writer.writeObject( + offsets[0], + allOffsets, + AlgorithmWeightsSchema.serialize, + object.algorithmWeights, + ); + writer.writeString(offsets[1], object.androidProxyServer); + writer.writeLong(offsets[2], object.aniSkipTimeoutLength); + writer.writeBool(offsets[3], object.animatePageTransitions); + writer.writeByte(offsets[4], object.animeDisplayType.index); writer.writeObjectList( - offsets[3], + offsets[5], allOffsets, RepoSchema.serialize, object.animeExtensionsRepo, ); - writer.writeLong(offsets[4], object.animeGridSize); - writer.writeBool(offsets[5], object.animeLibraryDownloadedChapters); - writer.writeBool(offsets[6], object.animeLibraryLocalSource); - writer.writeBool(offsets[7], object.animeLibraryShowCategoryTabs); - writer.writeBool(offsets[8], object.animeLibraryShowContinueReadingButton); - writer.writeBool(offsets[9], object.animeLibraryShowLanguage); - writer.writeBool(offsets[10], object.animeLibraryShowNumbersOfItems); - writer.writeString(offsets[11], object.appFontFamily); - writer.writeString(offsets[12], object.autoBackupLocation); - writer.writeBool(offsets[13], object.autoExtensionsUpdates); + writer.writeLong(offsets[6], object.animeGridSize); + writer.writeBool(offsets[7], object.animeLibraryDownloadedChapters); + writer.writeBool(offsets[8], object.animeLibraryLocalSource); + writer.writeBool(offsets[9], object.animeLibraryShowCategoryTabs); + writer.writeBool(offsets[10], object.animeLibraryShowContinueReadingButton); + writer.writeBool(offsets[11], object.animeLibraryShowLanguage); + writer.writeBool(offsets[12], object.animeLibraryShowNumbersOfItems); + writer.writeString(offsets[13], object.appFontFamily); + writer.writeString(offsets[14], object.autoBackupLocation); + writer.writeBool(offsets[15], object.autoExtensionsUpdates); writer.writeObjectList( - offsets[14], + offsets[16], allOffsets, AutoScrollPagesSchema.serialize, object.autoScrollPages, ); - writer.writeByte(offsets[15], object.backgroundColor.index); - writer.writeLong(offsets[16], object.backupFrequency); - writer.writeLongList(offsets[17], object.backupListOptions); - writer.writeString(offsets[18], object.btServerAddress); - writer.writeLong(offsets[19], object.btServerPort); + writer.writeByte(offsets[17], object.backgroundColor.index); + writer.writeLong(offsets[18], object.backupFrequency); + writer.writeLongList(offsets[19], object.backupListOptions); + writer.writeString(offsets[20], object.btServerAddress); + writer.writeLong(offsets[21], object.btServerPort); writer.writeObjectList( - offsets[20], + offsets[22], allOffsets, ChapterFilterBookmarkedSchema.serialize, object.chapterFilterBookmarkedList, ); writer.writeObjectList( - offsets[21], + offsets[23], allOffsets, ChapterFilterDownloadedSchema.serialize, object.chapterFilterDownloadedList, ); writer.writeObjectList( - offsets[22], + offsets[24], allOffsets, ChapterFilterUnreadSchema.serialize, object.chapterFilterUnreadList, ); writer.writeObjectList( - offsets[23], + offsets[25], allOffsets, ChapterPageIndexSchema.serialize, object.chapterPageIndexList, ); writer.writeObjectList( - offsets[24], + offsets[26], allOffsets, ChapterPageurlsSchema.serialize, object.chapterPageUrlsList, ); - writer.writeBool(offsets[25], object.checkForAppUpdates); - writer.writeBool(offsets[26], object.checkForExtensionUpdates); - writer.writeBool(offsets[27], object.clearChapterCacheOnAppLaunch); - writer.writeByte(offsets[28], object.colorFilterBlendMode.index); - writer.writeLong(offsets[29], object.concurrentDownloads); + writer.writeBool(offsets[27], object.checkForAppUpdates); + writer.writeBool(offsets[28], object.checkForExtensionUpdates); + writer.writeBool(offsets[29], object.clearChapterCacheOnAppLaunch); + writer.writeByte(offsets[30], object.colorFilterBlendMode.index); + writer.writeLong(offsets[31], object.concurrentDownloads); writer.writeObjectList( - offsets[30], + offsets[32], allOffsets, MCookieSchema.serialize, object.cookiesList, ); - writer.writeBool(offsets[31], object.cropBorders); + writer.writeBool(offsets[33], object.cropBorders); writer.writeObject( - offsets[32], + offsets[34], allOffsets, CustomColorFilterSchema.serialize, object.customColorFilter, ); - writer.writeString(offsets[33], object.dateFormat); - writer.writeLong(offsets[34], object.defaultDoubleTapToSkipLength); - writer.writeDouble(offsets[35], object.defaultPlayBackSpeed); - writer.writeByte(offsets[36], object.defaultReaderMode.index); - writer.writeLong(offsets[37], object.defaultSkipIntroLength); + writer.writeString(offsets[35], object.dateFormat); + writer.writeLong(offsets[36], object.defaultDoubleTapToSkipLength); + writer.writeDouble(offsets[37], object.defaultPlayBackSpeed); + writer.writeByte(offsets[38], object.defaultReaderMode.index); + writer.writeLong(offsets[39], object.defaultSkipIntroLength); writer.writeObject( - offsets[38], + offsets[40], allOffsets, L10nLocaleSchema.serialize, object.defaultSubtitleLang, ); - writer.writeByte(offsets[39], object.disableSectionType.index); - writer.writeByte(offsets[40], object.displayType.index); - writer.writeLong(offsets[41], object.doubleTapAnimationSpeed); - writer.writeString(offsets[42], object.downloadLocation); - writer.writeBool(offsets[43], object.downloadOnlyOnWifi); - writer.writeBool(offsets[44], object.enableAniSkip); - writer.writeBool(offsets[45], object.enableAutoSkip); - writer.writeBool(offsets[46], object.enableCustomColorFilter); - writer.writeBool(offsets[47], object.enableDiscordRpc); + writer.writeByte(offsets[41], object.disableSectionType.index); + writer.writeByte(offsets[42], object.displayType.index); + writer.writeLong(offsets[43], object.doubleTapAnimationSpeed); + writer.writeString(offsets[44], object.downloadLocation); + writer.writeBool(offsets[45], object.downloadOnlyOnWifi); + writer.writeBool(offsets[46], object.downloadedOnlyMode); + writer.writeBool(offsets[47], object.enableAniSkip); + writer.writeBool(offsets[48], object.enableAutoSkip); + writer.writeBool(offsets[49], object.enableCustomColorFilter); + writer.writeBool(offsets[50], object.enableDiscordRpc); writer.writeObjectList( - offsets[48], + offsets[51], allOffsets, FilterScanlatorSchema.serialize, object.filterScanlatorList, ); - writer.writeDouble(offsets[49], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[50], object.flexSchemeColorIndex); - writer.writeBool(offsets[51], object.followSystemTheme); - writer.writeBool(offsets[52], object.fullScreenPlayer); - writer.writeBool(offsets[53], object.fullScreenReader); - writer.writeBool(offsets[54], object.hideDiscordRpcInIncognito); - writer.writeStringList(offsets[55], object.hideItems); - writer.writeString(offsets[56], object.hwdecMode); - writer.writeBool(offsets[57], object.incognitoMode); - writer.writeString(offsets[58], object.lastTrackerLibraryLocation); - writer.writeBool(offsets[59], object.libraryDownloadedChapters); - writer.writeLong(offsets[60], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[61], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[62], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[63], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[64], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[65], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[66], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[67], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[68], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[69], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[70], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[71], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[72], object.libraryLocalSource); - writer.writeBool(offsets[73], object.libraryShowCategoryTabs); - writer.writeBool(offsets[74], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[75], object.libraryShowLanguage); - writer.writeBool(offsets[76], object.libraryShowNumbersOfItems); + writer.writeDouble(offsets[52], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[53], object.flexSchemeColorIndex); + writer.writeBool(offsets[54], object.followSystemTheme); + writer.writeBool(offsets[55], object.fullScreenPlayer); + writer.writeBool(offsets[56], object.fullScreenReader); + writer.writeBool(offsets[57], object.hideDiscordRpcInIncognito); + writer.writeStringList(offsets[58], object.hideItems); + writer.writeString(offsets[59], object.hwdecMode); + writer.writeBool(offsets[60], object.incognitoMode); + writer.writeString(offsets[61], object.lastTrackerLibraryLocation); + writer.writeBool(offsets[62], object.libraryDownloadedChapters); + writer.writeLong(offsets[63], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[64], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[65], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[66], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[67], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[68], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[69], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[70], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[71], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[72], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[73], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[74], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[75], object.libraryLocalSource); + writer.writeBool(offsets[76], object.libraryShowCategoryTabs); + writer.writeBool(offsets[77], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[78], object.libraryShowLanguage); + writer.writeBool(offsets[79], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[77], + offsets[80], allOffsets, L10nLocaleSchema.serialize, object.locale, ); writer.writeObjectList( - offsets[78], + offsets[81], allOffsets, RepoSchema.serialize, object.mangaExtensionsRepo, ); - writer.writeLong(offsets[79], object.mangaGridSize); - writer.writeByte(offsets[80], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[81], object.markEpisodeAsSeenType); - writer.writeBool(offsets[82], object.mergeLibraryNavMobile); - writer.writeStringList(offsets[83], object.navigationOrder); - writer.writeByte(offsets[84], object.novelDisplayType.index); + writer.writeLong(offsets[82], object.mangaGridSize); + writer.writeByte(offsets[83], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[84], object.markEpisodeAsSeenType); + writer.writeBool(offsets[85], object.mergeLibraryNavMobile); + writer.writeStringList(offsets[86], object.navigationOrder); + writer.writeByte(offsets[87], object.novelDisplayType.index); writer.writeObjectList( - offsets[85], + offsets[88], allOffsets, RepoSchema.serialize, object.novelExtensionsRepo, ); - writer.writeLong(offsets[86], object.novelFontSize); - writer.writeLong(offsets[87], object.novelGridSize); - writer.writeBool(offsets[88], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[89], object.novelLibraryLocalSource); - writer.writeBool(offsets[90], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[91], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[92], object.novelLibraryShowLanguage); - writer.writeBool(offsets[93], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[94], object.novelTextAlign.index); - writer.writeBool(offsets[95], object.onlyIncludePinnedSources); - writer.writeLong(offsets[96], object.pagePreloadAmount); + writer.writeLong(offsets[89], object.novelFontSize); + writer.writeLong(offsets[90], object.novelGridSize); + writer.writeBool(offsets[91], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[92], object.novelLibraryLocalSource); + writer.writeBool(offsets[93], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[94], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[95], object.novelLibraryShowLanguage); + writer.writeBool(offsets[96], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[97], object.novelTextAlign.index); + writer.writeBool(offsets[98], object.onlyIncludePinnedSources); + writer.writeLong(offsets[99], object.pagePreloadAmount); writer.writeObjectList( - offsets[97], + offsets[100], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[98], + offsets[101], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[99], + offsets[102], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[100], object.pureBlackDarkMode); - writer.writeLong(offsets[101], object.relativeTimesTamps); - writer.writeBool(offsets[102], object.rpcShowCoverImage); - writer.writeBool(offsets[103], object.rpcShowReadingWatchingProgress); - writer.writeBool(offsets[104], object.rpcShowTitle); - writer.writeBool(offsets[105], object.saveAsCBZArchive); - writer.writeByte(offsets[106], object.scaleType.index); - writer.writeBool(offsets[107], object.showPagesNumber); + writer.writeBool(offsets[103], object.pureBlackDarkMode); + writer.writeLong(offsets[104], object.relativeTimesTamps); + writer.writeBool(offsets[105], object.rpcShowCoverImage); + writer.writeBool(offsets[106], object.rpcShowReadingWatchingProgress); + writer.writeBool(offsets[107], object.rpcShowTitle); + writer.writeBool(offsets[108], object.saveAsCBZArchive); + writer.writeByte(offsets[109], object.scaleType.index); + writer.writeBool(offsets[110], object.showPagesNumber); writer.writeObjectList( - offsets[108], + offsets[111], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[109], + offsets[112], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[110], + offsets[113], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[111], + offsets[114], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[112], object.startDatebackup); - writer.writeBool(offsets[113], object.themeIsDark); - writer.writeBool(offsets[114], object.updateProgressAfterReading); - writer.writeLong(offsets[115], object.updatedAt); - writer.writeBool(offsets[116], object.useLibass); - writer.writeBool(offsets[117], object.usePageTapZones); - writer.writeString(offsets[118], object.userAgent); + writer.writeLong(offsets[115], object.startDatebackup); + writer.writeBool(offsets[116], object.themeIsDark); + writer.writeBool(offsets[117], object.updateProgressAfterReading); + writer.writeLong(offsets[118], object.updatedAt); + writer.writeBool(offsets[119], object.useLibass); + writer.writeBool(offsets[120], object.usePageTapZones); + writer.writeString(offsets[121], object.userAgent); } Settings _settingsDeserialize( @@ -1256,246 +1295,253 @@ Settings _settingsDeserialize( Map> allOffsets, ) { final object = Settings( - aniSkipTimeoutLength: reader.readLongOrNull(offsets[0]), - animatePageTransitions: reader.readBoolOrNull(offsets[1]), + algorithmWeights: reader.readObjectOrNull( + offsets[0], + AlgorithmWeightsSchema.deserialize, + allOffsets, + ), + androidProxyServer: reader.readStringOrNull(offsets[1]), + aniSkipTimeoutLength: reader.readLongOrNull(offsets[2]), + animatePageTransitions: reader.readBoolOrNull(offsets[3]), animeDisplayType: _SettingsanimeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[2])] ?? + reader.readByteOrNull(offsets[4])] ?? DisplayType.compactGrid, animeExtensionsRepo: reader.readObjectList( - offsets[3], + offsets[5], RepoSchema.deserialize, allOffsets, Repo(), ), - animeGridSize: reader.readLongOrNull(offsets[4]), - animeLibraryDownloadedChapters: reader.readBoolOrNull(offsets[5]), - animeLibraryLocalSource: reader.readBoolOrNull(offsets[6]), - animeLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[7]), - animeLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[8]), - animeLibraryShowLanguage: reader.readBoolOrNull(offsets[9]), - animeLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[10]), - appFontFamily: reader.readStringOrNull(offsets[11]), - autoBackupLocation: reader.readStringOrNull(offsets[12]), - autoExtensionsUpdates: reader.readBoolOrNull(offsets[13]), + animeGridSize: reader.readLongOrNull(offsets[6]), + animeLibraryDownloadedChapters: reader.readBoolOrNull(offsets[7]), + animeLibraryLocalSource: reader.readBoolOrNull(offsets[8]), + animeLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[9]), + animeLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[10]), + animeLibraryShowLanguage: reader.readBoolOrNull(offsets[11]), + animeLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[12]), + appFontFamily: reader.readStringOrNull(offsets[13]), + autoBackupLocation: reader.readStringOrNull(offsets[14]), + autoExtensionsUpdates: reader.readBoolOrNull(offsets[15]), autoScrollPages: reader.readObjectList( - offsets[14], + offsets[16], AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), ), backgroundColor: _SettingsbackgroundColorValueEnumMap[ - reader.readByteOrNull(offsets[15])] ?? + reader.readByteOrNull(offsets[17])] ?? BackgroundColor.black, - backupFrequency: reader.readLongOrNull(offsets[16]), - backupListOptions: reader.readLongList(offsets[17]), - btServerAddress: reader.readStringOrNull(offsets[18]), - btServerPort: reader.readLongOrNull(offsets[19]), + backupFrequency: reader.readLongOrNull(offsets[18]), + backupListOptions: reader.readLongList(offsets[19]), + btServerAddress: reader.readStringOrNull(offsets[20]), + btServerPort: reader.readLongOrNull(offsets[21]), chapterFilterDownloadedList: reader.readObjectList( - offsets[21], + offsets[23], ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), ), chapterPageIndexList: reader.readObjectList( - offsets[23], + offsets[25], ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), ), chapterPageUrlsList: reader.readObjectList( - offsets[24], + offsets[26], ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), ), - checkForAppUpdates: reader.readBoolOrNull(offsets[25]), - checkForExtensionUpdates: reader.readBoolOrNull(offsets[26]), - clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[27]), + checkForAppUpdates: reader.readBoolOrNull(offsets[27]), + checkForExtensionUpdates: reader.readBoolOrNull(offsets[28]), + clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[29]), colorFilterBlendMode: _SettingscolorFilterBlendModeValueEnumMap[ - reader.readByteOrNull(offsets[28])] ?? + reader.readByteOrNull(offsets[30])] ?? ColorFilterBlendMode.none, - concurrentDownloads: reader.readLongOrNull(offsets[29]), + concurrentDownloads: reader.readLongOrNull(offsets[31]), cookiesList: reader.readObjectList( - offsets[30], + offsets[32], MCookieSchema.deserialize, allOffsets, MCookie(), ), - cropBorders: reader.readBoolOrNull(offsets[31]), + cropBorders: reader.readBoolOrNull(offsets[33]), customColorFilter: reader.readObjectOrNull( - offsets[32], + offsets[34], CustomColorFilterSchema.deserialize, allOffsets, ), - dateFormat: reader.readStringOrNull(offsets[33]), - defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[34]), - defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[35]), + dateFormat: reader.readStringOrNull(offsets[35]), + defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[36]), + defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[37]), defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ - reader.readByteOrNull(offsets[36])] ?? + reader.readByteOrNull(offsets[38])] ?? ReaderMode.vertical, - defaultSkipIntroLength: reader.readLongOrNull(offsets[37]), + defaultSkipIntroLength: reader.readLongOrNull(offsets[39]), disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ - reader.readByteOrNull(offsets[39])] ?? + reader.readByteOrNull(offsets[41])] ?? SectionType.all, displayType: - _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[40])] ?? + _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[42])] ?? DisplayType.compactGrid, - doubleTapAnimationSpeed: reader.readLongOrNull(offsets[41]), - downloadLocation: reader.readStringOrNull(offsets[42]), - downloadOnlyOnWifi: reader.readBoolOrNull(offsets[43]), - enableAniSkip: reader.readBoolOrNull(offsets[44]), - enableAutoSkip: reader.readBoolOrNull(offsets[45]), - enableCustomColorFilter: reader.readBoolOrNull(offsets[46]), - enableDiscordRpc: reader.readBoolOrNull(offsets[47]), - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[49]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[50]), - followSystemTheme: reader.readBoolOrNull(offsets[51]), - fullScreenPlayer: reader.readBoolOrNull(offsets[52]), - fullScreenReader: reader.readBoolOrNull(offsets[53]), - hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[54]), - hideItems: reader.readStringList(offsets[55]), - hwdecMode: reader.readStringOrNull(offsets[56]), + doubleTapAnimationSpeed: reader.readLongOrNull(offsets[43]), + downloadLocation: reader.readStringOrNull(offsets[44]), + downloadOnlyOnWifi: reader.readBoolOrNull(offsets[45]), + downloadedOnlyMode: reader.readBoolOrNull(offsets[46]), + enableAniSkip: reader.readBoolOrNull(offsets[47]), + enableAutoSkip: reader.readBoolOrNull(offsets[48]), + enableCustomColorFilter: reader.readBoolOrNull(offsets[49]), + enableDiscordRpc: reader.readBoolOrNull(offsets[50]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[52]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[53]), + followSystemTheme: reader.readBoolOrNull(offsets[54]), + fullScreenPlayer: reader.readBoolOrNull(offsets[55]), + fullScreenReader: reader.readBoolOrNull(offsets[56]), + hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[57]), + hideItems: reader.readStringList(offsets[58]), + hwdecMode: reader.readStringOrNull(offsets[59]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[57]), - lastTrackerLibraryLocation: reader.readStringOrNull(offsets[58]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[59]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[60]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[61]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[62]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[63]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[64]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[65]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[66]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[67]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[68]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[69]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[70]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[71]), - libraryLocalSource: reader.readBoolOrNull(offsets[72]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[73]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[74]), - libraryShowLanguage: reader.readBoolOrNull(offsets[75]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[76]), + incognitoMode: reader.readBoolOrNull(offsets[60]), + lastTrackerLibraryLocation: reader.readStringOrNull(offsets[61]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[62]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[63]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[64]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[65]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[66]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[67]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[68]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[69]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[70]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[71]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[72]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[73]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[74]), + libraryLocalSource: reader.readBoolOrNull(offsets[75]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[76]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[77]), + libraryShowLanguage: reader.readBoolOrNull(offsets[78]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[79]), mangaExtensionsRepo: reader.readObjectList( - offsets[78], + offsets[81], RepoSchema.deserialize, allOffsets, Repo(), ), - mangaGridSize: reader.readLongOrNull(offsets[79]), + mangaGridSize: reader.readLongOrNull(offsets[82]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[80])] ?? + reader.readByteOrNull(offsets[83])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[81]), - mergeLibraryNavMobile: reader.readBoolOrNull(offsets[82]), - navigationOrder: reader.readStringList(offsets[83]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[84]), + mergeLibraryNavMobile: reader.readBoolOrNull(offsets[85]), + navigationOrder: reader.readStringList(offsets[86]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[84])] ?? + reader.readByteOrNull(offsets[87])] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( - offsets[85], + offsets[88], RepoSchema.deserialize, allOffsets, Repo(), ), - novelFontSize: reader.readLongOrNull(offsets[86]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[88]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[89]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[90]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[91]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[92]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[93]), + novelFontSize: reader.readLongOrNull(offsets[89]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[91]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[92]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[93]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[94]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[95]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[96]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[94])] ?? + reader.readByteOrNull(offsets[97])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[95]), - pagePreloadAmount: reader.readLongOrNull(offsets[96]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[98]), + pagePreloadAmount: reader.readLongOrNull(offsets[99]), personalPageModeList: reader.readObjectList( - offsets[97], + offsets[100], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[98], + offsets[101], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[99], + offsets[102], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[100]), - relativeTimesTamps: reader.readLongOrNull(offsets[101]), - rpcShowCoverImage: reader.readBoolOrNull(offsets[102]), - rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[103]), - rpcShowTitle: reader.readBoolOrNull(offsets[104]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[105]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[103]), + relativeTimesTamps: reader.readLongOrNull(offsets[104]), + rpcShowCoverImage: reader.readBoolOrNull(offsets[105]), + rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[106]), + rpcShowTitle: reader.readBoolOrNull(offsets[107]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[108]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[106])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[109])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[107]), + showPagesNumber: reader.readBoolOrNull(offsets[110]), sortChapterList: reader.readObjectList( - offsets[108], + offsets[111], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[109], + offsets[112], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[110], + offsets[113], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[111], + offsets[114], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[112]), - themeIsDark: reader.readBoolOrNull(offsets[113]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), - updatedAt: reader.readLongOrNull(offsets[115]), - useLibass: reader.readBoolOrNull(offsets[116]), - usePageTapZones: reader.readBoolOrNull(offsets[117]), - userAgent: reader.readStringOrNull(offsets[118]), + startDatebackup: reader.readLongOrNull(offsets[115]), + themeIsDark: reader.readBoolOrNull(offsets[116]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[117]), + updatedAt: reader.readLongOrNull(offsets[118]), + useLibass: reader.readBoolOrNull(offsets[119]), + usePageTapZones: reader.readBoolOrNull(offsets[120]), + userAgent: reader.readStringOrNull(offsets[121]), ); object.chapterFilterBookmarkedList = reader.readObjectList( - offsets[20], + offsets[22], ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), ); object.chapterFilterUnreadList = reader.readObjectList( - offsets[22], + offsets[24], ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), ); object.defaultSubtitleLang = reader.readObjectOrNull( - offsets[38], + offsets[40], L10nLocaleSchema.deserialize, allOffsets, ); object.filterScanlatorList = reader.readObjectList( - offsets[48], + offsets[51], FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[77], + offsets[80], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[87]); + object.novelGridSize = reader.readLongOrNull(offsets[90]); return object; } @@ -1507,26 +1553,30 @@ P _settingsDeserializeProp

    ( ) { switch (propertyId) { case 0: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + AlgorithmWeightsSchema.deserialize, + allOffsets, + )) as P; case 1: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 2: + return (reader.readLongOrNull(offset)) as P; + case 3: + return (reader.readBoolOrNull(offset)) as P; + case 4: return (_SettingsanimeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 3: + case 5: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 4: - return (reader.readLongOrNull(offset)) as P; - case 5: - return (reader.readBoolOrNull(offset)) as P; case 6: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 7: return (reader.readBoolOrNull(offset)) as P; case 8: @@ -1536,125 +1586,125 @@ P _settingsDeserializeProp

    ( case 10: return (reader.readBoolOrNull(offset)) as P; case 11: - return (reader.readStringOrNull(offset)) as P; - case 12: - return (reader.readStringOrNull(offset)) as P; - case 13: return (reader.readBoolOrNull(offset)) as P; + case 12: + return (reader.readBoolOrNull(offset)) as P; + case 13: + return (reader.readStringOrNull(offset)) as P; case 14: + return (reader.readStringOrNull(offset)) as P; + case 15: + return (reader.readBoolOrNull(offset)) as P; + case 16: return (reader.readObjectList( offset, AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), )) as P; - case 15: + case 17: return (_SettingsbackgroundColorValueEnumMap[ reader.readByteOrNull(offset)] ?? BackgroundColor.black) as P; - case 16: - return (reader.readLongOrNull(offset)) as P; - case 17: - return (reader.readLongList(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; - case 19: return (reader.readLongOrNull(offset)) as P; + case 19: + return (reader.readLongList(offset)) as P; case 20: + return (reader.readStringOrNull(offset)) as P; + case 21: + return (reader.readLongOrNull(offset)) as P; + case 22: return (reader.readObjectList( offset, ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), )) as P; - case 21: + case 23: return (reader.readObjectList( offset, ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), )) as P; - case 22: + case 24: return (reader.readObjectList( offset, ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), )) as P; - case 23: + case 25: return (reader.readObjectList( offset, ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), )) as P; - case 24: + case 26: return (reader.readObjectList( offset, ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), )) as P; - case 25: - return (reader.readBoolOrNull(offset)) as P; - case 26: - return (reader.readBoolOrNull(offset)) as P; case 27: return (reader.readBoolOrNull(offset)) as P; case 28: + return (reader.readBoolOrNull(offset)) as P; + case 29: + return (reader.readBoolOrNull(offset)) as P; + case 30: return (_SettingscolorFilterBlendModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ColorFilterBlendMode.none) as P; - case 29: + case 31: return (reader.readLongOrNull(offset)) as P; - case 30: + case 32: return (reader.readObjectList( offset, MCookieSchema.deserialize, allOffsets, MCookie(), )) as P; - case 31: + case 33: return (reader.readBoolOrNull(offset)) as P; - case 32: + case 34: return (reader.readObjectOrNull( offset, CustomColorFilterSchema.deserialize, allOffsets, )) as P; - case 33: - return (reader.readStringOrNull(offset)) as P; - case 34: - return (reader.readLongOrNull(offset)) as P; case 35: - return (reader.readDoubleOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 36: + return (reader.readLongOrNull(offset)) as P; + case 37: + return (reader.readDoubleOrNull(offset)) as P; + case 38: return (_SettingsdefaultReaderModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ReaderMode.vertical) as P; - case 37: + case 39: return (reader.readLongOrNull(offset)) as P; - case 38: + case 40: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 39: + case 41: return (_SettingsdisableSectionTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? SectionType.all) as P; - case 40: + case 42: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 41: - return (reader.readLongOrNull(offset)) as P; - case 42: - return (reader.readStringOrNull(offset)) as P; case 43: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 44: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 45: return (reader.readBoolOrNull(offset)) as P; case 46: @@ -1662,40 +1712,40 @@ P _settingsDeserializeProp

    ( case 47: return (reader.readBoolOrNull(offset)) as P; case 48: + return (reader.readBoolOrNull(offset)) as P; + case 49: + return (reader.readBoolOrNull(offset)) as P; + case 50: + return (reader.readBoolOrNull(offset)) as P; + case 51: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 49: - return (reader.readDoubleOrNull(offset)) as P; - case 50: - return (reader.readLongOrNull(offset)) as P; - case 51: - return (reader.readBoolOrNull(offset)) as P; case 52: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 53: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 54: return (reader.readBoolOrNull(offset)) as P; case 55: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 56: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 57: return (reader.readBoolOrNull(offset)) as P; case 58: - return (reader.readStringOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 59: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 60: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 61: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 62: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 63: return (reader.readLongOrNull(offset)) as P; case 64: @@ -1715,61 +1765,61 @@ P _settingsDeserializeProp

    ( case 71: return (reader.readLongOrNull(offset)) as P; case 72: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 73: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 74: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 75: return (reader.readBoolOrNull(offset)) as P; case 76: return (reader.readBoolOrNull(offset)) as P; case 77: + return (reader.readBoolOrNull(offset)) as P; + case 78: + return (reader.readBoolOrNull(offset)) as P; + case 79: + return (reader.readBoolOrNull(offset)) as P; + case 80: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 78: + case 81: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 79: + case 82: return (reader.readLongOrNull(offset)) as P; - case 80: + case 83: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 81: - return (reader.readLongOrNull(offset)) as P; - case 82: - return (reader.readBoolOrNull(offset)) as P; - case 83: - return (reader.readStringList(offset)) as P; case 84: + return (reader.readLongOrNull(offset)) as P; + case 85: + return (reader.readBoolOrNull(offset)) as P; + case 86: + return (reader.readStringList(offset)) as P; + case 87: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 85: + case 88: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 86: - return (reader.readLongOrNull(offset)) as P; - case 87: - return (reader.readLongOrNull(offset)) as P; - case 88: - return (reader.readBoolOrNull(offset)) as P; case 89: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 90: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 91: return (reader.readBoolOrNull(offset)) as P; case 92: @@ -1777,81 +1827,81 @@ P _settingsDeserializeProp

    ( case 93: return (reader.readBoolOrNull(offset)) as P; case 94: - return (_SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offset)] ?? - NovelTextAlign.left) as P; + return (reader.readBoolOrNull(offset)) as P; case 95: return (reader.readBoolOrNull(offset)) as P; case 96: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 97: + return (_SettingsnovelTextAlignValueEnumMap[ + reader.readByteOrNull(offset)] ?? + NovelTextAlign.left) as P; + case 98: + return (reader.readBoolOrNull(offset)) as P; + case 99: + return (reader.readLongOrNull(offset)) as P; + case 100: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 98: + case 101: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 99: + case 102: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 100: - return (reader.readBoolOrNull(offset)) as P; - case 101: - return (reader.readLongOrNull(offset)) as P; - case 102: - return (reader.readBoolOrNull(offset)) as P; case 103: return (reader.readBoolOrNull(offset)) as P; case 104: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 105: return (reader.readBoolOrNull(offset)) as P; case 106: - return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; + return (reader.readBoolOrNull(offset)) as P; case 107: return (reader.readBoolOrNull(offset)) as P; case 108: + return (reader.readBoolOrNull(offset)) as P; + case 109: + return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ScaleType.fitScreen) as P; + case 110: + return (reader.readBoolOrNull(offset)) as P; + case 111: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 109: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 110: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 111: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; case 112: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 113: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 114: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 115: return (reader.readLongOrNull(offset)) as P; case 116: @@ -1859,6 +1909,12 @@ P _settingsDeserializeProp

    ( case 117: return (reader.readBoolOrNull(offset)) as P; case 118: + return (reader.readLongOrNull(offset)) as P; + case 119: + return (reader.readBoolOrNull(offset)) as P; + case 120: + return (reader.readBoolOrNull(offset)) as P; + case 121: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -2100,6 +2156,178 @@ extension SettingsQueryWhere on QueryBuilder { extension SettingsQueryFilter on QueryBuilder { + QueryBuilder + algorithmWeightsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'algorithmWeights', + )); + }); + } + + QueryBuilder + algorithmWeightsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'algorithmWeights', + )); + }); + } + + QueryBuilder + androidProxyServerIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'androidProxyServer', + )); + }); + } + + QueryBuilder + androidProxyServerIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'androidProxyServer', + )); + }); + } + + QueryBuilder + androidProxyServerEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'androidProxyServer', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'androidProxyServer', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + androidProxyServerIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'androidProxyServer', + value: '', + )); + }); + } + + QueryBuilder + androidProxyServerIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'androidProxyServer', + value: '', + )); + }); + } + QueryBuilder aniSkipTimeoutLengthIsNull() { return QueryBuilder.apply(this, (query) { @@ -5283,6 +5511,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + downloadedOnlyModeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'downloadedOnlyMode', + )); + }); + } + + QueryBuilder + downloadedOnlyModeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'downloadedOnlyMode', + )); + }); + } + + QueryBuilder + downloadedOnlyModeEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'downloadedOnlyMode', + value: value, + )); + }); + } + QueryBuilder enableAniSkipIsNull() { return QueryBuilder.apply(this, (query) { @@ -9786,6 +10042,13 @@ extension SettingsQueryFilter extension SettingsQueryObject on QueryBuilder { + QueryBuilder algorithmWeights( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'algorithmWeights'); + }); + } + QueryBuilder animeExtensionsRepoElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { @@ -9997,6 +10260,19 @@ extension SettingsQueryLinks } extension SettingsQuerySortBy on QueryBuilder { + QueryBuilder sortByAndroidProxyServer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'androidProxyServer', Sort.asc); + }); + } + + QueryBuilder + sortByAndroidProxyServerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'androidProxyServer', Sort.desc); + }); + } + QueryBuilder sortByAniSkipTimeoutLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'aniSkipTimeoutLength', Sort.asc); @@ -10428,6 +10704,19 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByDownloadedOnlyMode() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadedOnlyMode', Sort.asc); + }); + } + + QueryBuilder + sortByDownloadedOnlyModeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadedOnlyMode', Sort.desc); + }); + } + QueryBuilder sortByEnableAniSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAniSkip', Sort.asc); @@ -11242,6 +11531,19 @@ extension SettingsQuerySortBy on QueryBuilder { extension SettingsQuerySortThenBy on QueryBuilder { + QueryBuilder thenByAndroidProxyServer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'androidProxyServer', Sort.asc); + }); + } + + QueryBuilder + thenByAndroidProxyServerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'androidProxyServer', Sort.desc); + }); + } + QueryBuilder thenByAniSkipTimeoutLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'aniSkipTimeoutLength', Sort.asc); @@ -11673,6 +11975,19 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByDownloadedOnlyMode() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadedOnlyMode', Sort.asc); + }); + } + + QueryBuilder + thenByDownloadedOnlyModeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'downloadedOnlyMode', Sort.desc); + }); + } + QueryBuilder thenByEnableAniSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAniSkip', Sort.asc); @@ -12499,6 +12814,14 @@ extension SettingsQuerySortThenBy extension SettingsQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByAndroidProxyServer( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'androidProxyServer', + caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByAniSkipTimeoutLength() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'aniSkipTimeoutLength'); @@ -12725,6 +13048,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByDownloadedOnlyMode() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'downloadedOnlyMode'); + }); + } + QueryBuilder distinctByEnableAniSkip() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAniSkip'); @@ -13152,6 +13481,20 @@ extension SettingsQueryProperty }); } + QueryBuilder + algorithmWeightsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'algorithmWeights'); + }); + } + + QueryBuilder + androidProxyServerProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'androidProxyServer'); + }); + } + QueryBuilder aniSkipTimeoutLengthProperty() { return QueryBuilder.apply(this, (query) { @@ -13448,6 +13791,12 @@ extension SettingsQueryProperty }); } + QueryBuilder downloadedOnlyModeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'downloadedOnlyMode'); + }); + } + QueryBuilder enableAniSkipProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAniSkip'); @@ -20183,3 +20532,395 @@ extension PlayerSubtitleSettingsQueryFilter on QueryBuilder< extension PlayerSubtitleSettingsQueryObject on QueryBuilder< PlayerSubtitleSettings, PlayerSubtitleSettings, QFilterCondition> {} + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const AlgorithmWeightsSchema = Schema( + name: r'AlgorithmWeights', + id: -2865436974642812672, + properties: { + r'genre': PropertySchema( + id: 0, + name: r'genre', + type: IsarType.long, + ), + r'setting': PropertySchema( + id: 1, + name: r'setting', + type: IsarType.long, + ), + r'synopsis': PropertySchema( + id: 2, + name: r'synopsis', + type: IsarType.long, + ), + r'theme': PropertySchema( + id: 3, + name: r'theme', + type: IsarType.long, + ) + }, + estimateSize: _algorithmWeightsEstimateSize, + serialize: _algorithmWeightsSerialize, + deserialize: _algorithmWeightsDeserialize, + deserializeProp: _algorithmWeightsDeserializeProp, +); + +int _algorithmWeightsEstimateSize( + AlgorithmWeights object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + return bytesCount; +} + +void _algorithmWeightsSerialize( + AlgorithmWeights object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.genre); + writer.writeLong(offsets[1], object.setting); + writer.writeLong(offsets[2], object.synopsis); + writer.writeLong(offsets[3], object.theme); +} + +AlgorithmWeights _algorithmWeightsDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = AlgorithmWeights( + genre: reader.readLongOrNull(offsets[0]), + setting: reader.readLongOrNull(offsets[1]), + synopsis: reader.readLongOrNull(offsets[2]), + theme: reader.readLongOrNull(offsets[3]), + ); + return object; +} + +P _algorithmWeightsDeserializeProp

    ( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLongOrNull(offset)) as P; + case 1: + return (reader.readLongOrNull(offset)) as P; + case 2: + return (reader.readLongOrNull(offset)) as P; + case 3: + return (reader.readLongOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension AlgorithmWeightsQueryFilter + on QueryBuilder { + QueryBuilder + genreIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'genre', + )); + }); + } + + QueryBuilder + genreIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'genre', + )); + }); + } + + QueryBuilder + genreEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'genre', + value: value, + )); + }); + } + + QueryBuilder + genreGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'genre', + value: value, + )); + }); + } + + QueryBuilder + genreLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'genre', + value: value, + )); + }); + } + + QueryBuilder + genreBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'genre', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + settingIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'setting', + )); + }); + } + + QueryBuilder + settingIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'setting', + )); + }); + } + + QueryBuilder + settingEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'setting', + value: value, + )); + }); + } + + QueryBuilder + settingGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'setting', + value: value, + )); + }); + } + + QueryBuilder + settingLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'setting', + value: value, + )); + }); + } + + QueryBuilder + settingBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'setting', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + synopsisIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'synopsis', + )); + }); + } + + QueryBuilder + synopsisIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'synopsis', + )); + }); + } + + QueryBuilder + synopsisEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'synopsis', + value: value, + )); + }); + } + + QueryBuilder + synopsisGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'synopsis', + value: value, + )); + }); + } + + QueryBuilder + synopsisLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'synopsis', + value: value, + )); + }); + } + + QueryBuilder + synopsisBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'synopsis', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + themeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'theme', + )); + }); + } + + QueryBuilder + themeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'theme', + )); + }); + } + + QueryBuilder + themeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'theme', + value: value, + )); + }); + } + + QueryBuilder + themeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'theme', + value: value, + )); + }); + } + + QueryBuilder + themeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'theme', + value: value, + )); + }); + } + + QueryBuilder + themeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'theme', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension AlgorithmWeightsQueryObject + on QueryBuilder {} diff --git a/lib/models/source.dart b/lib/models/source.dart index b564cf50..8811cebe 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -191,4 +191,4 @@ class Source { } } -enum SourceCodeLanguage { dart, javascript } +enum SourceCodeLanguage { dart, javascript, mihon } diff --git a/lib/models/source.g.dart b/lib/models/source.g.dart index a2ea5965..c07e0242 100644 --- a/lib/models/source.g.dart +++ b/lib/models/source.g.dart @@ -489,10 +489,12 @@ const _SourceitemTypeValueEnumMap = { const _SourcesourceCodeLanguageEnumValueMap = { 'dart': 0, 'javascript': 1, + 'mihon': 2, }; const _SourcesourceCodeLanguageValueEnumMap = { 0: SourceCodeLanguage.dart, 1: SourceCodeLanguage.javascript, + 2: SourceCodeLanguage.mihon, }; Id _sourceGetId(Source object) { diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index b2e1defb..c05db920 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index d5256b5a..26ba780c 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -25,7 +25,56 @@ Future fetchSourcesList({ final info = await PackageInfo.fromPlatform(); final sourceList = (jsonDecode(req.body) as List) - .map((e) => Source.fromJson(e)) + .expand((e) sync* { + if (e['name'] != null && + e['pkg'] != null && + e['version'] != null && + e['code'] != null && + e['lang'] != null && + e['nsfw'] != null && + e['sources'] != null && + e['apk'] != null) { + final repoUrl = url.replaceAll("/index.min.json", ""); + final sources = e['sources'] as List; + for (final source in sources) { + final src = Source.fromJson(e) + ..apiUrl = '' + ..appMinVerReq = '' + ..dateFormat = '' + ..dateFormatLocale = '' + ..hasCloudflare = false + ..headers = '' + ..isActive = true + ..isAdded = false + ..isFullData = false + ..isNsfw = e['nsfw'] == 1 + ..isPinned = false + ..lastUsed = false + ..sourceCode = '' + ..typeSource = '' + ..versionLast = '0.0.1' + ..isObsolete = false + ..isLocal = false + ..name = source['name'] + ..lang = source['lang'] + ..baseUrl = source['baseUrl'] + ..sourceCodeUrl = "$repoUrl/apk/${e['apk']}" + ..sourceCodeLanguage = SourceCodeLanguage.mihon + ..itemType = + (e['pkg'] as String).startsWith( + "eu.kanade.tachiyomi.animeextension", + ) + ? ItemType.anime + : ItemType.manga + ..iconUrl = "$repoUrl/icon/${e['pkg']}.png" + ..notes = "Requires Android Proxy Server!"; + src.id = 'mihon-${source['id']}'.hashCode; + yield src; + } + } else { + yield Source.fromJson(e); + } + }) .where( (source) => source.itemType == itemType && @@ -74,14 +123,17 @@ Future _updateSource( ) async { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final req = await http.get(Uri.parse(source.sourceCodeUrl!)); + final sourceCode = source.sourceCodeLanguage == SourceCodeLanguage.mihon + ? base64.encode(req.bodyBytes) + : req.body; final headers = getExtensionService( - source..sourceCode = req.body, + source..sourceCode = sourceCode, ).getHeaders(); final updatedSource = Source() ..headers = jsonEncode(headers) ..isAdded = true - ..sourceCode = req.body + ..sourceCode = sourceCode ..sourceCodeUrl = source.sourceCodeUrl ..id = source.id ..apiUrl = source.apiUrl diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index af5cc986..00dd75aa 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'141ba3be28182e05480e06fbf3f1de68f868cb8e'; +String _$syncServerHash() => r'08225f80e9c249dc62e8e918acecbd593f54541f'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index 9eee8f76..96c9f674 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'c786a526fdacc875e4a7e00886b2bda546eafeae'; +String _$anilistHash() => r'fafb964252b3a5741e981cb8c2f0f2090b3b86ae'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/kitsu.g.dart b/lib/services/trackers/kitsu.g.dart index f9b58f20..6e6ce22a 100644 --- a/lib/services/trackers/kitsu.g.dart +++ b/lib/services/trackers/kitsu.g.dart @@ -6,7 +6,7 @@ part of 'kitsu.dart'; // RiverpodGenerator // ************************************************************************** -String _$kitsuHash() => r'e24e9b57cfea974110d1f7c704c306c3b58e3529'; +String _$kitsuHash() => r'd46b955c92bc4d7382d32e17827da2e2b3a8434f'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index a3d8b6ee..7bdbfcf3 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'4391ad9446d14b1fb1ffdfbc5323ef04db5140f7'; +String _$myAnimeListHash() => r'739c836ddbfc7c2c2b7593304f481e8d35074391'; /// Copied from Dart SDK class _SystemHash { From 9395888c6a36405b3413e5d5c80b247d97444200 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 20 Aug 2025 21:06:26 +0200 Subject: [PATCH 058/100] added support for Mihon extensions via ApkBridge --- lib/eval/lib.dart | 4 +- lib/eval/mihon/service.dart | 46 +- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 + lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + lib/models/source.dart | 17 + lib/models/source.g.dart | 443 ++++++++++++++---- lib/modules/browse/extension/edit_code.dart | 2 + .../global_search/global_search_screen.dart | 18 +- .../manga/detail/widgets/migrate_screen.dart | 18 +- .../more/settings/browse/browse_screen.dart | 92 ++++ .../providers/browse_state_provider.dart | 33 ++ .../providers/browse_state_provider.g.dart | 17 + lib/services/fetch_sources_list.dart | 166 ++++++- lib/services/get_chapter_pages.dart | 6 +- lib/services/get_chapter_pages.g.dart | 2 +- lib/services/get_detail.dart | 6 +- lib/services/get_detail.g.dart | 2 +- lib/services/get_filter_list.dart | 10 +- lib/services/get_html_content.dart | 8 +- lib/services/get_html_content.g.dart | 2 +- lib/services/get_latest_updates.dart | 6 +- lib/services/get_latest_updates.g.dart | 2 +- lib/services/get_popular.dart | 6 +- lib/services/get_popular.g.dart | 2 +- lib/services/get_source_baseurl.dart | 6 +- lib/services/get_source_baseurl.g.dart | 2 +- lib/services/get_source_preference.dart | 7 +- lib/services/get_video_list.dart | 8 +- lib/services/get_video_list.g.dart | 2 +- lib/services/search.dart | 6 +- lib/services/search.g.dart | 2 +- lib/services/search_.dart | 13 +- lib/services/search_.g.dart | 208 ++++++++ lib/services/supports_latest.dart | 6 +- lib/services/supports_latest.g.dart | 2 +- lib/utils/headers.dart | 5 +- lib/utils/headers.g.dart | 21 +- 51 files changed, 1105 insertions(+), 140 deletions(-) create mode 100644 lib/services/search_.g.dart diff --git a/lib/eval/lib.dart b/lib/eval/lib.dart index b066d61e..e5842e93 100644 --- a/lib/eval/lib.dart +++ b/lib/eval/lib.dart @@ -5,10 +5,10 @@ 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, "http://localhost:8080"), + SourceCodeLanguage.mihon => MihonExtensionService(source, androidProxyServer), }; } diff --git a/lib/eval/mihon/service.dart b/lib/eval/mihon/service.dart index 01d42534..eb571072 100644 --- a/lib/eval/mihon/service.dart +++ b/lib/eval/mihon/service.dart @@ -1,5 +1,6 @@ import 'dart:convert'; 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'; @@ -26,12 +27,14 @@ class MihonExtensionService implements ExtensionService { @override Map getHeaders() { - return {}; + return source.headers != null && source.headers!.isNotEmpty + ? (jsonDecode(source.headers!) as Map?)?.toMapStringString ?? {} + : {}; } @override bool get supportsLatest { - return true; + return source.supportLatest ?? false; } @override @@ -116,6 +119,7 @@ class MihonExtensionService implements ExtensionService { "method": "getSearch$name", "page": page + 1, "search": query, + // "filterList$name": _convertFilters(filters), "data": source.sourceCode, }), ); @@ -213,7 +217,7 @@ class MihonExtensionService implements ExtensionService { }), ); final data = jsonDecode(res.body) as List; - return data.map((e) => PageUrl(e['url'])).toList(); + return data.map((e) => PageUrl(e['imageUrl'])).toList(); } @override @@ -231,7 +235,7 @@ class MihonExtensionService implements ExtensionService { final tempHeaders = e['headers']['namesAndValues\$okhttp'] as List; final Map headers = {}; - for (var i = 0; i + 1 < tempHeaders.length; i++) { + for (var i = 0; i + 1 < tempHeaders.length; i += 2) { headers[tempHeaders[i]] = tempHeaders[i + 1]; } return Video( @@ -265,6 +269,7 @@ class MihonExtensionService implements ExtensionService { @override FilterList getFilterList() { + // return source.getFilterList() ?? FilterList([]); return FilterList([]); } @@ -272,4 +277,37 @@ class MihonExtensionService implements ExtensionService { List getSourcePreferences() { return []; } + + List _convertFilters(List filters) { + return filters.expand((e) sync* { + if (e is TextFilter) { + yield {"name": e.name, "state": e.state}; + } else if (e is GroupFilter) { + yield { + "name": e.name, + "state": e.state.expand((e) sync* { + if (e is CheckBoxFilter) { + yield {"name": e.name, "id": e.value, "state": e.state}; + } else if (e is TriStateFilter) { + yield { + "name": e.name, + "id": e.value, + "state": e.state, + "included": e.state == 1, + "ignored": e.state == 0, + "excluded": e.state == 2, + }; + } + }).toList(), + }; + } else if (e is SelectFilter) { + yield {"name": e.name, "state": e.state}; + } else if (e is SortFilter) { + yield { + "name": e.name, + "state": {"ascending": e.state.ascending, "index": e.state.index}, + }; + } + }).toList(); + } } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2a24b955..14215c5a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -443,6 +443,7 @@ "manga_extensions_repo": "Manga extensions repo", "anime_extensions_repo": "Anime extensions repo", "novel_extensions_repo": "Novel extensions repo", + "android_proxy_server": "Android Proxy Server (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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 15f53832..f118084b 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2733,6 +2733,12 @@ abstract class AppLocalizations { /// **'Novel extensions repo'** String get novel_extensions_repo; + /// 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 @undefined. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 2e2c3acd..2cd4e2cf 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1402,6 +1402,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get novel_extensions_repo => 'مستودع إضافات الروايات'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'غير محدد'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 1b3b235e..3457034b 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1404,6 +1404,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get novel_extensions_repo => 'Novel extensions repo'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 25d3ae6d..55d80a03 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1413,6 +1413,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get novel_extensions_repo => 'Roman-Erweiterungs-Repository'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Nicht definiert'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index e0dd0b27..9d7cb17b 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1403,6 +1403,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get novel_extensions_repo => 'Novel extensions repo'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 5a9b38fe..6f6396db 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1417,6 +1417,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get novel_extensions_repo => 'Repositorio de extensiones de novelas'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Indefinido'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index b9a90f9c..39603496 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1420,6 +1420,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get novel_extensions_repo => 'Dépôt d\'extensions de romans'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Indéfini'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 9b01d5c3..63d8d9c4 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1405,6 +1405,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get novel_extensions_repo => 'Novel extensions repo'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 97b1bff0..1da43e65 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1409,6 +1409,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get novel_extensions_repo => 'Repositori ekstensi novel'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Tidak terdefinisi'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 7bda719d..21ee58fe 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1417,6 +1417,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get novel_extensions_repo => 'Repository delle estensioni romanzi'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Non definito'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 9c27d999..2f01aa16 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1414,6 +1414,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get novel_extensions_repo => 'Repositório de extensões de romances'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Indefinido'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 5d63574d..2b208f93 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1416,6 +1416,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get novel_extensions_repo => 'Репозиторий расширений новелл'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Не определено'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 84c9aaff..688bf95f 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1403,6 +1403,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get novel_extensions_repo => 'ที่เก็บส่วนขยายโนเวล'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'ไม่ได้กำหนด'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index ddc19651..4d43d306 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1409,6 +1409,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get novel_extensions_repo => 'Roman uzantıları deposu'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => 'Tanımsız'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 3c97660f..a4cd769f 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1377,6 +1377,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get novel_extensions_repo => '小说扩展库'; + @override + String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override String get undefined => '未定义'; diff --git a/lib/models/source.dart b/lib/models/source.dart index 8811cebe..1ca0fb14 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -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,10 @@ class Source { String? headers; + bool? supportLatest; + + String? filterList; + bool? isManga; @enumerated @@ -93,6 +100,8 @@ class Source { this.versionLast = "0.0.1", this.sourceCode = '', this.headers = '', + this.supportLatest, + this.filterList, this.isManga, this.itemType = ItemType.manga, this.appMinVerReq = "", @@ -104,6 +113,10 @@ class Source { this.updatedAt = 0, }); + FilterList? getFilterList() => filterList != null + ? FilterList.fromJson(jsonDecode(filterList!) as Map) + : null; + Source.fromJson(Map json) { apiUrl = json['apiUrl']; appMinVerReq = json['appMinVerReq']; @@ -112,6 +125,8 @@ class Source { dateFormatLocale = json['dateFormatLocale']; hasCloudflare = json['hasCloudflare']; headers = json['headers']; + supportLatest = json['supportLatest']; + filterList = json['filterList']; iconUrl = json['iconUrl']; id = json['id']; isActive = json['isActive']; @@ -147,6 +162,8 @@ class Source { 'dateFormatLocale': dateFormatLocale, 'hasCloudflare': hasCloudflare, 'headers': headers, + 'supportLatest': supportLatest, + 'filterList': filterList, 'iconUrl': iconUrl, 'id': id, 'isActive': isActive, diff --git a/lib/models/source.g.dart b/lib/models/source.g.dart index c07e0242..b1f0e3fa 100644 --- a/lib/models/source.g.dart +++ b/lib/models/source.g.dart @@ -47,131 +47,141 @@ const SourceSchema = CollectionSchema( name: r'dateFormatLocale', type: IsarType.string, ), - r'hasCloudflare': PropertySchema( + r'filterList': PropertySchema( id: 6, + name: r'filterList', + type: IsarType.string, + ), + r'hasCloudflare': PropertySchema( + id: 7, name: r'hasCloudflare', type: IsarType.bool, ), r'headers': PropertySchema( - id: 7, + id: 8, name: r'headers', type: IsarType.string, ), r'iconUrl': PropertySchema( - id: 8, + id: 9, name: r'iconUrl', type: IsarType.string, ), r'isActive': PropertySchema( - id: 9, + id: 10, name: r'isActive', type: IsarType.bool, ), r'isAdded': PropertySchema( - id: 10, + id: 11, name: r'isAdded', type: IsarType.bool, ), r'isFullData': PropertySchema( - id: 11, + id: 12, name: r'isFullData', type: IsarType.bool, ), r'isLocal': PropertySchema( - id: 12, + id: 13, name: r'isLocal', type: IsarType.bool, ), r'isManga': PropertySchema( - id: 13, + id: 14, name: r'isManga', type: IsarType.bool, ), r'isNsfw': PropertySchema( - id: 14, + id: 15, name: r'isNsfw', type: IsarType.bool, ), r'isObsolete': PropertySchema( - id: 15, + id: 16, name: r'isObsolete', type: IsarType.bool, ), r'isPinned': PropertySchema( - id: 16, + id: 17, name: r'isPinned', type: IsarType.bool, ), r'isTorrent': PropertySchema( - id: 17, + id: 18, name: r'isTorrent', type: IsarType.bool, ), r'itemType': PropertySchema( - id: 18, + id: 19, name: r'itemType', type: IsarType.byte, enumMap: _SourceitemTypeEnumValueMap, ), r'lang': PropertySchema( - id: 19, + id: 20, name: r'lang', type: IsarType.string, ), r'lastUsed': PropertySchema( - id: 20, + id: 21, name: r'lastUsed', type: IsarType.bool, ), r'name': PropertySchema( - id: 21, + id: 22, name: r'name', type: IsarType.string, ), r'notes': PropertySchema( - id: 22, + id: 23, name: r'notes', type: IsarType.string, ), r'repo': PropertySchema( - id: 23, + id: 24, name: r'repo', type: IsarType.object, target: r'Repo', ), r'sourceCode': PropertySchema( - id: 24, + id: 25, name: r'sourceCode', type: IsarType.string, ), r'sourceCodeLanguage': PropertySchema( - id: 25, + id: 26, name: r'sourceCodeLanguage', type: IsarType.byte, enumMap: _SourcesourceCodeLanguageEnumValueMap, ), r'sourceCodeUrl': PropertySchema( - id: 26, + id: 27, name: r'sourceCodeUrl', type: IsarType.string, ), + r'supportLatest': PropertySchema( + id: 28, + name: r'supportLatest', + type: IsarType.bool, + ), r'typeSource': PropertySchema( - id: 27, + id: 29, name: r'typeSource', type: IsarType.string, ), r'updatedAt': PropertySchema( - id: 28, + id: 30, name: r'updatedAt', type: IsarType.long, ), r'version': PropertySchema( - id: 29, + id: 31, name: r'version', type: IsarType.string, ), r'versionLast': PropertySchema( - id: 30, + id: 32, name: r'versionLast', type: IsarType.string, ) @@ -232,6 +242,12 @@ int _sourceEstimateSize( bytesCount += 3 + value.length * 3; } } + { + final value = object.filterList; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.headers; if (value != null) { @@ -314,36 +330,38 @@ void _sourceSerialize( writer.writeString(offsets[3], object.baseUrl); writer.writeString(offsets[4], object.dateFormat); writer.writeString(offsets[5], object.dateFormatLocale); - writer.writeBool(offsets[6], object.hasCloudflare); - writer.writeString(offsets[7], object.headers); - writer.writeString(offsets[8], object.iconUrl); - writer.writeBool(offsets[9], object.isActive); - writer.writeBool(offsets[10], object.isAdded); - writer.writeBool(offsets[11], object.isFullData); - writer.writeBool(offsets[12], object.isLocal); - writer.writeBool(offsets[13], object.isManga); - writer.writeBool(offsets[14], object.isNsfw); - writer.writeBool(offsets[15], object.isObsolete); - writer.writeBool(offsets[16], object.isPinned); - writer.writeBool(offsets[17], object.isTorrent); - writer.writeByte(offsets[18], object.itemType.index); - writer.writeString(offsets[19], object.lang); - writer.writeBool(offsets[20], object.lastUsed); - writer.writeString(offsets[21], object.name); - writer.writeString(offsets[22], object.notes); + writer.writeString(offsets[6], object.filterList); + writer.writeBool(offsets[7], object.hasCloudflare); + writer.writeString(offsets[8], object.headers); + writer.writeString(offsets[9], object.iconUrl); + writer.writeBool(offsets[10], object.isActive); + writer.writeBool(offsets[11], object.isAdded); + writer.writeBool(offsets[12], object.isFullData); + writer.writeBool(offsets[13], object.isLocal); + writer.writeBool(offsets[14], object.isManga); + writer.writeBool(offsets[15], object.isNsfw); + writer.writeBool(offsets[16], object.isObsolete); + writer.writeBool(offsets[17], object.isPinned); + writer.writeBool(offsets[18], object.isTorrent); + writer.writeByte(offsets[19], object.itemType.index); + writer.writeString(offsets[20], object.lang); + writer.writeBool(offsets[21], object.lastUsed); + writer.writeString(offsets[22], object.name); + writer.writeString(offsets[23], object.notes); writer.writeObject( - offsets[23], + offsets[24], allOffsets, RepoSchema.serialize, object.repo, ); - writer.writeString(offsets[24], object.sourceCode); - writer.writeByte(offsets[25], object.sourceCodeLanguage.index); - writer.writeString(offsets[26], object.sourceCodeUrl); - writer.writeString(offsets[27], object.typeSource); - writer.writeLong(offsets[28], object.updatedAt); - writer.writeString(offsets[29], object.version); - writer.writeString(offsets[30], object.versionLast); + writer.writeString(offsets[25], object.sourceCode); + writer.writeByte(offsets[26], object.sourceCodeLanguage.index); + writer.writeString(offsets[27], object.sourceCodeUrl); + writer.writeBool(offsets[28], object.supportLatest); + writer.writeString(offsets[29], object.typeSource); + writer.writeLong(offsets[30], object.updatedAt); + writer.writeString(offsets[31], object.version); + writer.writeString(offsets[32], object.versionLast); } Source _sourceDeserialize( @@ -359,38 +377,40 @@ Source _sourceDeserialize( baseUrl: reader.readStringOrNull(offsets[3]), dateFormat: reader.readStringOrNull(offsets[4]), dateFormatLocale: reader.readStringOrNull(offsets[5]), - hasCloudflare: reader.readBoolOrNull(offsets[6]), - headers: reader.readStringOrNull(offsets[7]), - iconUrl: reader.readStringOrNull(offsets[8]), + filterList: reader.readStringOrNull(offsets[6]), + hasCloudflare: reader.readBoolOrNull(offsets[7]), + headers: reader.readStringOrNull(offsets[8]), + iconUrl: reader.readStringOrNull(offsets[9]), id: id, - isActive: reader.readBoolOrNull(offsets[9]), - isAdded: reader.readBoolOrNull(offsets[10]), - isFullData: reader.readBoolOrNull(offsets[11]), - isLocal: reader.readBoolOrNull(offsets[12]), - isManga: reader.readBoolOrNull(offsets[13]), - isNsfw: reader.readBoolOrNull(offsets[14]), - isObsolete: reader.readBoolOrNull(offsets[15]), - isPinned: reader.readBoolOrNull(offsets[16]), - itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[18])] ?? + isActive: reader.readBoolOrNull(offsets[10]), + isAdded: reader.readBoolOrNull(offsets[11]), + isFullData: reader.readBoolOrNull(offsets[12]), + isLocal: reader.readBoolOrNull(offsets[13]), + isManga: reader.readBoolOrNull(offsets[14]), + isNsfw: reader.readBoolOrNull(offsets[15]), + isObsolete: reader.readBoolOrNull(offsets[16]), + isPinned: reader.readBoolOrNull(offsets[17]), + itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[19])] ?? ItemType.manga, - lang: reader.readStringOrNull(offsets[19]), - lastUsed: reader.readBoolOrNull(offsets[20]), - name: reader.readStringOrNull(offsets[21]), - notes: reader.readStringOrNull(offsets[22]), + lang: reader.readStringOrNull(offsets[20]), + lastUsed: reader.readBoolOrNull(offsets[21]), + name: reader.readStringOrNull(offsets[22]), + notes: reader.readStringOrNull(offsets[23]), repo: reader.readObjectOrNull( - offsets[23], + offsets[24], RepoSchema.deserialize, allOffsets, ), - sourceCode: reader.readStringOrNull(offsets[24]), - sourceCodeUrl: reader.readStringOrNull(offsets[26]), - typeSource: reader.readStringOrNull(offsets[27]), - updatedAt: reader.readLongOrNull(offsets[28]), - version: reader.readStringOrNull(offsets[29]), - versionLast: reader.readStringOrNull(offsets[30]), + sourceCode: reader.readStringOrNull(offsets[25]), + sourceCodeUrl: reader.readStringOrNull(offsets[27]), + supportLatest: reader.readBoolOrNull(offsets[28]), + typeSource: reader.readStringOrNull(offsets[29]), + updatedAt: reader.readLongOrNull(offsets[30]), + version: reader.readStringOrNull(offsets[31]), + versionLast: reader.readStringOrNull(offsets[32]), ); object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[ - reader.readByteOrNull(offsets[25])] ?? + reader.readByteOrNull(offsets[26])] ?? SourceCodeLanguage.dart; return object; } @@ -415,13 +435,13 @@ P _sourceDeserializeProp

    ( case 5: return (reader.readStringOrNull(offset)) as P; case 6: - return (reader.readBoolOrNull(offset)) as P; - case 7: return (reader.readStringOrNull(offset)) as P; + case 7: + return (reader.readBoolOrNull(offset)) as P; case 8: return (reader.readStringOrNull(offset)) as P; case 9: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 10: return (reader.readBoolOrNull(offset)) as P; case 11: @@ -437,39 +457,43 @@ P _sourceDeserializeProp

    ( case 16: return (reader.readBoolOrNull(offset)) as P; case 17: - return (reader.readBool(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 18: + return (reader.readBool(offset)) as P; + case 19: return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; - case 19: - return (reader.readStringOrNull(offset)) as P; case 20: - return (reader.readBoolOrNull(offset)) as P; - case 21: return (reader.readStringOrNull(offset)) as P; + case 21: + return (reader.readBoolOrNull(offset)) as P; case 22: return (reader.readStringOrNull(offset)) as P; case 23: + return (reader.readStringOrNull(offset)) as P; + case 24: return (reader.readObjectOrNull( offset, RepoSchema.deserialize, allOffsets, )) as P; - case 24: - return (reader.readStringOrNull(offset)) as P; case 25: + return (reader.readStringOrNull(offset)) as P; + case 26: return (_SourcesourceCodeLanguageValueEnumMap[ reader.readByteOrNull(offset)] ?? SourceCodeLanguage.dart) as P; - case 26: - return (reader.readStringOrNull(offset)) as P; case 27: return (reader.readStringOrNull(offset)) as P; case 28: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 29: return (reader.readStringOrNull(offset)) as P; case 30: + return (reader.readLongOrNull(offset)) as P; + case 31: + return (reader.readStringOrNull(offset)) as P; + case 32: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -1471,6 +1495,152 @@ extension SourceQueryFilter on QueryBuilder { }); } + QueryBuilder filterListIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'filterList', + )); + }); + } + + QueryBuilder filterListIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'filterList', + )); + }); + } + + QueryBuilder filterListEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'filterList', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'filterList', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder filterListIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'filterList', + value: '', + )); + }); + } + + QueryBuilder filterListIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'filterList', + value: '', + )); + }); + } + QueryBuilder hasCloudflareIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -2954,6 +3124,32 @@ extension SourceQueryFilter on QueryBuilder { }); } + QueryBuilder supportLatestIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'supportLatest', + )); + }); + } + + QueryBuilder supportLatestIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'supportLatest', + )); + }); + } + + QueryBuilder supportLatestEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'supportLatest', + value: value, + )); + }); + } + QueryBuilder typeSourceIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -3546,6 +3742,18 @@ extension SourceQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByFilterList() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'filterList', Sort.asc); + }); + } + + QueryBuilder sortByFilterListDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'filterList', Sort.desc); + }); + } + QueryBuilder sortByHasCloudflare() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hasCloudflare', Sort.asc); @@ -3786,6 +3994,18 @@ extension SourceQuerySortBy on QueryBuilder { }); } + QueryBuilder sortBySupportLatest() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'supportLatest', Sort.asc); + }); + } + + QueryBuilder sortBySupportLatestDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'supportLatest', Sort.desc); + }); + } + QueryBuilder sortByTypeSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'typeSource', Sort.asc); @@ -3908,6 +4128,18 @@ extension SourceQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByFilterList() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'filterList', Sort.asc); + }); + } + + QueryBuilder thenByFilterListDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'filterList', Sort.desc); + }); + } + QueryBuilder thenByHasCloudflare() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hasCloudflare', Sort.asc); @@ -4160,6 +4392,18 @@ extension SourceQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenBySupportLatest() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'supportLatest', Sort.asc); + }); + } + + QueryBuilder thenBySupportLatestDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'supportLatest', Sort.desc); + }); + } + QueryBuilder thenByTypeSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'typeSource', Sort.asc); @@ -4254,6 +4498,13 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByFilterList( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'filterList', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByHasCloudflare() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'hasCloudflare'); @@ -4382,6 +4633,12 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctBySupportLatest() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'supportLatest'); + }); + } + QueryBuilder distinctByTypeSource( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4453,6 +4710,12 @@ extension SourceQueryProperty on QueryBuilder { }); } + QueryBuilder filterListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'filterList'); + }); + } + QueryBuilder hasCloudflareProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'hasCloudflare'); @@ -4580,6 +4843,12 @@ extension SourceQueryProperty on QueryBuilder { }); } + QueryBuilder supportLatestProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'supportLatest'); + }); + } + QueryBuilder typeSourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'typeSource'); diff --git a/lib/modules/browse/extension/edit_code.dart b/lib/modules/browse/extension/edit_code.dart index 1c7430ec..c3ca0f6d 100644 --- a/lib/modules/browse/extension/edit_code.dart +++ b/lib/modules/browse/extension/edit_code.dart @@ -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 { if (source != null) { final service = getExtensionService( source!, + ref.read(androidProxyServerStateProvider), ); try { diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index 6b497653..444a6219 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -119,7 +119,7 @@ class _GlobalSearchScreenState extends ConsumerState { } } -class SourceSearchScreen extends StatefulWidget { +class SourceSearchScreen extends ConsumerStatefulWidget { final String query; final Source source; @@ -130,10 +130,10 @@ class SourceSearchScreen extends StatefulWidget { }); @override - State createState() => _SourceSearchScreenState(); + ConsumerState createState() => _SourceSearchScreenState(); } -class _SourceSearchScreenState extends State { +class _SourceSearchScreenState extends ConsumerState { @override void initState() { super.initState(); @@ -146,11 +146,13 @@ class _SourceSearchScreenState extends State { _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(() { diff --git a/lib/modules/manga/detail/widgets/migrate_screen.dart b/lib/modules/manga/detail/widgets/migrate_screen.dart index 850a0c68..4c6fceb5 100644 --- a/lib/modules/manga/detail/widgets/migrate_screen.dart +++ b/lib/modules/manga/detail/widgets/migrate_screen.dart @@ -140,7 +140,7 @@ class _MigrationScreenScreenState extends ConsumerState { } } -class MigrationSourceSearchScreen extends StatefulWidget { +class MigrationSourceSearchScreen extends ConsumerStatefulWidget { final String query; final Manga manga; final TrackSearch? trackSearch; @@ -155,12 +155,12 @@ class MigrationSourceSearchScreen extends StatefulWidget { }); @override - State createState() => + ConsumerState createState() => _MigrationSourceSearchScreenState(); } class _MigrationSourceSearchScreenState - extends State { + extends ConsumerState { @override void initState() { super.initState(); @@ -173,11 +173,13 @@ class _MigrationSourceSearchScreenState _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(() { diff --git a/lib/modules/more/settings/browse/browse_screen.dart b/lib/modules/more/settings/browse/browse_screen.dart index cc9104ea..c6ac35db 100644 --- a/lib/modules/more/settings/browse/browse_screen.dart +++ b/lib/modules/more/settings/browse/browse_screen.dart @@ -20,6 +20,7 @@ class BrowseSScreen extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final androidProxyServer = ref.watch(androidProxyServerStateProvider); final onlyIncludePinnedSource = ref.watch( onlyIncludePinnedSourceStateProvider, ); @@ -51,6 +52,21 @@ class BrowseSScreen extends ConsumerWidget { ], ), ), + ListTile( + onTap: () => _showAndroidProxyServerDialog( + context, + ref, + androidProxyServer, + ), + title: Text(l10n.android_proxy_server), + subtitle: Text( + androidProxyServer, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ), ListTile( onTap: () { context.push( @@ -242,6 +258,82 @@ void _showClearAllSourcesDialog(BuildContext context, dynamic l10n) { ); } +void _showAndroidProxyServerDialog( + BuildContext context, + WidgetRef ref, + String proxyServer, +) { + final serverController = TextEditingController(text: proxyServer); + String server = proxyServer; + showDialog( + context: context, + builder: (context) => StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text( + context.l10n.android_proxy_server, + style: const TextStyle(fontSize: 30), + ), + content: SizedBox( + width: context.width(0.8), + height: context.height(0.3), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextFormField( + controller: serverController, + autofocus: true, + onChanged: (value) => setState(() { + server = value; + }), + decoration: InputDecoration( + hintText: + "Server IP (e.g., 10.0.0.5 or https://example.com)", + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: SizedBox( + width: context.width(1), + child: ElevatedButton( + onPressed: () { + ref + .read(androidProxyServerStateProvider.notifier) + .set(server); + Navigator.pop(context); + }, + child: Text(context.l10n.dialog_confirm), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); +} + void _showCleanNonLibraryDialog(BuildContext context, dynamic l10n) { showDialog( context: context, diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.dart index f8619043..628120da 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.dart @@ -10,6 +10,39 @@ import 'package:mangayomi/services/http/m_client.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'browse_state_provider.g.dart'; +@riverpod +class AndroidProxyServerState extends _$AndroidProxyServerState { + @override + String build() { + String proxyServer = + isar.settings.getSync(227)!.androidProxyServer ?? + "http://127.0.0.1:8080"; + if (!proxyServer.startsWith("http")) { + proxyServer = "http://$proxyServer"; + } + if ((proxyServer.contains("localhost") || + RegExp( + r'^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$', + ).hasMatch(proxyServer.replaceAll("://", ":").split(":")[1])) && + proxyServer.split(":").length < 3) { + proxyServer = "$proxyServer:8080"; + } + return proxyServer; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..androidProxyServer = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + @riverpod class OnlyIncludePinnedSourceState extends _$OnlyIncludePinnedSourceState { @override diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart index b892df7a..6f0c9a8c 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart @@ -157,6 +157,23 @@ class _GetRepoInfosProviderElement String get jsonUrl => (origin as GetRepoInfosProvider).jsonUrl; } +String _$androidProxyServerStateHash() => + r'c16bddb7d686a13e8f34a18dec2d983232f34c65'; + +/// See also [AndroidProxyServerState]. +@ProviderFor(AndroidProxyServerState) +final androidProxyServerStateProvider = + AutoDisposeNotifierProvider.internal( + AndroidProxyServerState.new, + name: r'androidProxyServerStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$androidProxyServerStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AndroidProxyServerState = AutoDisposeNotifier; String _$onlyIncludePinnedSourceStateHash() => r'b9f707348d5d0f7abfa8e615c1d2b35c6dbd57f3'; diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index 26ba780c..de603d49 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -1,7 +1,9 @@ import 'dart:convert'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:http_interceptor/http_interceptor.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/lib.dart'; +import 'package:mangayomi/eval/model/filter.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; @@ -67,7 +69,8 @@ Future fetchSourcesList({ ? ItemType.anime : ItemType.manga ..iconUrl = "$repoUrl/icon/${e['pkg']}.png" - ..notes = "Requires Android Proxy Server!"; + ..notes = + "Requires Android Proxy Server (ApkBridge) for installing and using the extensions!"; src.id = 'mihon-${source['id']}'.hashCode; yield src; } @@ -126,12 +129,37 @@ Future _updateSource( final sourceCode = source.sourceCodeLanguage == SourceCodeLanguage.mihon ? base64.encode(req.bodyBytes) : req.body; - final headers = getExtensionService( - source..sourceCode = sourceCode, - ).getHeaders(); + final androidProxyServer = ref.read(androidProxyServerStateProvider); + Map headers = {}; + bool? supportLatest; + FilterList? filterList; + if (source.sourceCodeLanguage == SourceCodeLanguage.mihon) { + headers = await fetchHeadersDalvik( + http, + source..sourceCode = sourceCode, + androidProxyServer, + ); + supportLatest = await fetchSupportLatestDalvik( + http, + source..sourceCode = sourceCode, + androidProxyServer, + ); + filterList = await fetchFilterListDalvik( + http, + source..sourceCode = sourceCode, + androidProxyServer, + ); + } else { + headers = getExtensionService( + source..sourceCode = sourceCode, + androidProxyServer, + ).getHeaders(); + } final updatedSource = Source() ..headers = jsonEncode(headers) + ..supportLatest = supportLatest + ..filterList = filterList != null ? jsonEncode(filterList.toJson()) : null ..isAdded = true ..sourceCode = sourceCode ..sourceCodeUrl = source.sourceCodeUrl @@ -252,3 +280,133 @@ int compareVersions(String version1, String version2) { return v1Parts.length.compareTo(v2Parts.length); } + +Future> fetchHeadersDalvik( + InterceptedClient client, + Source source, + String androidProxyServer, +) async { + try { + final name = source.itemType == ItemType.anime ? "Anime" : "Manga"; + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({"method": "headers$name", "data": source.sourceCode}), + ); + final data = jsonDecode(res.body) as List; + final Map headers = {}; + for (var i = 0; i + 1 < data.length; i += 2) { + headers[data[i]] = data[i + 1]; + } + return headers; + } catch (_) { + return {}; + } +} + +Future fetchSupportLatestDalvik( + InterceptedClient client, + Source source, + String androidProxyServer, +) async { + try { + final name = source.itemType == ItemType.anime ? "Anime" : "Manga"; + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({ + "method": "supportLatest$name", + "data": source.sourceCode, + }), + ); + return res.body.trim() == "true"; + } catch (_) { + return false; + } +} + +Future fetchFilterListDalvik( + InterceptedClient client, + Source source, + String androidProxyServer, +) async { + try { + final name = source.itemType == ItemType.anime ? "Anime" : "Manga"; + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({"method": "filters$name", "data": source.sourceCode}), + ); + final data = jsonDecode(res.body) as List; + final filters = data.expand((e) sync* { + if (e['name'] is String && + e['state'] is Map && + e['values'] is List) { + yield SortFilter( + "${e['name']}Filter", + e['name'], + SortState(e['state']['index'], e['state']['ascending'], null), + (e['values'] as List) + .map((e) => SelectFilterOption(e, e, null)) + .toList(), + null, + ); + } else if (e['name'] is String && + e['state'] is int && + (e['values'] is List || e['vals'] is List)) { + yield SelectFilter( + "${e['name']}Filter", + e['name'], + e['state'], + e['vals'] is List + ? (e['vals'] as List) + .map( + (e) => SelectFilterOption(e['first'], e['second'], null), + ) + .toList() + : e['values'] is List + ? (e['values'] as List) + .map((e) => SelectFilterOption(e, e, null)) + .toList() + : [], + "SelectFilter", + ); + } else if (e['name'] is String && e['state'] is List) { + yield GroupFilter( + "${e['name']}Filter", + e['name'], + (e['state'] as List).map((e) { + if (e['included'] is bool && + e['ignored'] is bool && + e['excluded'] is bool) { + return TriStateFilter( + null, + e['name'], + e['id'] ?? e['name'], + null, + state: e['state'], + ); + } + return CheckBoxFilter( + null, + e['name'], + e['id'] ?? e['name'], + null, + state: e['state'], + ); + }).toList(), + "GroupFilter", + ); + } else if (e['name'] is String && e['state'] is String) { + yield TextFilter( + "${e['name']}Filter", + e['name'], + null, + state: e['state'], + ); + } else if (e['name'] is String && e['state'] is int) { + yield HeaderFilter(e['name'], "${e['name']}Filter"); + } + }).toList(); + return FilterList(filters); + } catch (_) { + return null; + } +} diff --git a/lib/services/get_chapter_pages.dart b/lib/services/get_chapter_pages.dart index d073a765..290ac9f9 100644 --- a/lib/services/get_chapter_pages.dart +++ b/lib/services/get_chapter_pages.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:path/path.dart' as p; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/javascript/http.dart'; @@ -74,7 +75,10 @@ Future getChapterPages( pageUrls.add(PageUrl(isarPageUrls.urls![i], headers: headers)); } } else { - pageUrls = await getExtensionService(source).getPageList(chapter.url!); + pageUrls = await getExtensionService( + source, + ref.read(androidProxyServerStateProvider), + ).getPageList(chapter.url!); } } diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 90f0e848..38b50ef3 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart'; // RiverpodGenerator // ************************************************************************** -String _$getChapterPagesHash() => r'08f56022f03c4834c69c50d0020007fa8b26c091'; +String _$getChapterPagesHash() => r'8f6d2d661593fc5537f4dda83abea8d46d65b027'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_detail.dart b/lib/services/get_detail.dart index 9911c663..4b9c458d 100644 --- a/lib/services/get_detail.dart +++ b/lib/services/get_detail.dart @@ -1,6 +1,7 @@ import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/model/m_manga.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'get_detail.g.dart'; @@ -11,5 +12,8 @@ Future getDetail( required String url, required Source source, }) async { - return getExtensionService(source).getDetail(url); + return getExtensionService( + source, + ref.read(androidProxyServerStateProvider), + ).getDetail(url); } diff --git a/lib/services/get_detail.g.dart b/lib/services/get_detail.g.dart index 719b45dd..49f6efcd 100644 --- a/lib/services/get_detail.g.dart +++ b/lib/services/get_detail.g.dart @@ -6,7 +6,7 @@ part of 'get_detail.dart'; // RiverpodGenerator // ************************************************************************** -String _$getDetailHash() => r'84cc79aa0fd35a2d8efa95f75b85978f521c5daa'; +String _$getDetailHash() => r'6b758b79281cb00a7df2fe1903d4a67068052bca'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_filter_list.dart b/lib/services/get_filter_list.dart index 6fb387b2..b72e6182 100644 --- a/lib/services/get_filter_list.dart +++ b/lib/services/get_filter_list.dart @@ -1,6 +1,12 @@ import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/models/source.dart'; -List getFilterList({required Source source}) { - return getExtensionService(source).getFilterList().filters; +List getFilterList({ + required Source source, + String androidProxyServer = "", +}) { + return getExtensionService( + source, + androidProxyServer, + ).getFilterList().filters; } diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart index fe99da6b..856febd2 100644 --- a/lib/services/get_html_content.dart +++ b/lib/services/get_html_content.dart @@ -4,6 +4,7 @@ import 'package:epubx/epubx.dart'; import 'package:html/parser.dart'; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -48,11 +49,16 @@ Future<(String, EpubBook?)> getHtmlContent( chapter.manga.value!.source!, ); String? html; + final proxyServer = ref.read(androidProxyServerStateProvider); if (htmlContent != null) { - html = await getExtensionService(source!).cleanHtmlContent(htmlContent); + html = await getExtensionService( + source!, + proxyServer, + ).cleanHtmlContent(htmlContent); } else { html = await getExtensionService( source!, + proxyServer, ).getHtmlContent(chapter.manga.value!.name!, chapter.url!); } return (_buildHtml(html.substring(1, html.length - 1)), null); diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index 33bebfba..91231d14 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -6,7 +6,7 @@ part of 'get_html_content.dart'; // RiverpodGenerator // ************************************************************************** -String _$getHtmlContentHash() => r'19e6959d8fceb065b19c6c6d38cd1b5132a8ba94'; +String _$getHtmlContentHash() => r'c32670ed25b093761c867f5cf1cb5dfe063edc84'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_latest_updates.dart b/lib/services/get_latest_updates.dart index ad7fb062..d743a5cc 100644 --- a/lib/services/get_latest_updates.dart +++ b/lib/services/get_latest_updates.dart @@ -1,6 +1,7 @@ import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/model/m_pages.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'get_latest_updates.g.dart'; @@ -11,5 +12,8 @@ Future getLatestUpdates( required Source source, required int page, }) async { - return getExtensionService(source).getLatestUpdates(page); + return getExtensionService( + source, + ref.read(androidProxyServerStateProvider), + ).getLatestUpdates(page); } diff --git a/lib/services/get_latest_updates.g.dart b/lib/services/get_latest_updates.g.dart index 268bdc9e..d96a255f 100644 --- a/lib/services/get_latest_updates.g.dart +++ b/lib/services/get_latest_updates.g.dart @@ -6,7 +6,7 @@ part of 'get_latest_updates.dart'; // RiverpodGenerator // ************************************************************************** -String _$getLatestUpdatesHash() => r'93e1ba376d14006110e9a6c06d191ffd12b1fdfb'; +String _$getLatestUpdatesHash() => r'fd4ece1d796e079a469e5f80f456ee821ff0bc03'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_popular.dart b/lib/services/get_popular.dart index a0fedd01..1a660da8 100644 --- a/lib/services/get_popular.dart +++ b/lib/services/get_popular.dart @@ -1,6 +1,7 @@ import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/model/m_pages.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'get_popular.g.dart'; @@ -11,5 +12,8 @@ Future getPopular( required Source source, required int page, }) async { - return getExtensionService(source).getPopular(page); + return getExtensionService( + source, + ref.read(androidProxyServerStateProvider), + ).getPopular(page); } diff --git a/lib/services/get_popular.g.dart b/lib/services/get_popular.g.dart index 278d11e3..c25b6d3f 100644 --- a/lib/services/get_popular.g.dart +++ b/lib/services/get_popular.g.dart @@ -6,7 +6,7 @@ part of 'get_popular.dart'; // RiverpodGenerator // ************************************************************************** -String _$getPopularHash() => r'02291ff9c3eba594b2344b853c34b2cea7be491b'; +String _$getPopularHash() => r'5fd933ce7e2b9c2dd113b7642ed54c1a1196f638'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_source_baseurl.dart b/lib/services/get_source_baseurl.dart index 7335454c..0390837e 100644 --- a/lib/services/get_source_baseurl.dart +++ b/lib/services/get_source_baseurl.dart @@ -1,11 +1,15 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'get_source_baseurl.g.dart'; @riverpod String sourceBaseUrl(Ref ref, {required Source source}) { - return getExtensionService(source).sourceBaseUrl; + return getExtensionService( + source, + ref.read(androidProxyServerStateProvider), + ).sourceBaseUrl; } diff --git a/lib/services/get_source_baseurl.g.dart b/lib/services/get_source_baseurl.g.dart index 1c3bee54..f8621dac 100644 --- a/lib/services/get_source_baseurl.g.dart +++ b/lib/services/get_source_baseurl.g.dart @@ -6,7 +6,7 @@ part of 'get_source_baseurl.dart'; // RiverpodGenerator // ************************************************************************** -String _$sourceBaseUrlHash() => r'2eaf2f441085cec9e2f035763ef2ec64aa00f838'; +String _$sourceBaseUrlHash() => r'ead3cca719e2530502d97613e3168e0031eecde7'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_source_preference.dart b/lib/services/get_source_preference.dart index 1dff1acd..a18beffc 100644 --- a/lib/services/get_source_preference.dart +++ b/lib/services/get_source_preference.dart @@ -2,6 +2,9 @@ import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/models/source.dart'; -List getSourcePreference({required Source source}) { - return getExtensionService(source).getSourcePreferences(); +List getSourcePreference({ + required Source source, + String androidProxyServer = "", +}) { + return getExtensionService(source, androidProxyServer).getSourcePreferences(); } diff --git a/lib/services/get_video_list.dart b/lib/services/get_video_list.dart index d1bf5984..11b7c775 100644 --- a/lib/services/get_video_list.dart +++ b/lib/services/get_video_list.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/video.dart'; +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/services/torrent_server.dart'; import 'package:mangayomi/utils/utils.dart'; @@ -58,6 +59,7 @@ Future<(List

    ( case 23: return (reader.readStringOrNull(offset)) as P; case 24: + return (reader.readStringOrNull(offset)) as P; + case 25: return (reader.readObjectOrNull( offset, RepoSchema.deserialize, allOffsets, )) as P; - case 25: - return (reader.readStringOrNull(offset)) as P; case 26: + return (reader.readStringOrNull(offset)) as P; + case 27: return (_SourcesourceCodeLanguageValueEnumMap[ reader.readByteOrNull(offset)] ?? SourceCodeLanguage.dart) as P; - case 27: - return (reader.readStringOrNull(offset)) as P; case 28: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 29: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 30: - return (reader.readLongOrNull(offset)) as P; - case 31: return (reader.readStringOrNull(offset)) as P; + case 31: + return (reader.readLongOrNull(offset)) as P; case 32: return (reader.readStringOrNull(offset)) as P; + case 33: + return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -2760,6 +2775,154 @@ extension SourceQueryFilter on QueryBuilder { }); } + QueryBuilder preferenceListIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'preferenceList', + )); + }); + } + + QueryBuilder + preferenceListIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'preferenceList', + )); + }); + } + + QueryBuilder preferenceListEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'preferenceList', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'preferenceList', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder preferenceListIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'preferenceList', + value: '', + )); + }); + } + + QueryBuilder + preferenceListIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'preferenceList', + value: '', + )); + }); + } + QueryBuilder repoIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -3958,6 +4121,18 @@ extension SourceQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByPreferenceList() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'preferenceList', Sort.asc); + }); + } + + QueryBuilder sortByPreferenceListDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'preferenceList', Sort.desc); + }); + } + QueryBuilder sortBySourceCode() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceCode', Sort.asc); @@ -4356,6 +4531,18 @@ extension SourceQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByPreferenceList() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'preferenceList', Sort.asc); + }); + } + + QueryBuilder thenByPreferenceListDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'preferenceList', Sort.desc); + }); + } + QueryBuilder thenBySourceCode() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceCode', Sort.asc); @@ -4612,6 +4799,14 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByPreferenceList( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'preferenceList', + caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctBySourceCode( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4818,6 +5013,12 @@ extension SourceQueryProperty on QueryBuilder { }); } + QueryBuilder preferenceListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'preferenceList'); + }); + } + QueryBuilder repoProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'repo'); diff --git a/lib/modules/browse/extension/providers/extension_preferences_providers.dart b/lib/modules/browse/extension/providers/extension_preferences_providers.dart index 397c0c9b..b4d0b222 100644 --- a/lib/modules/browse/extension/providers/extension_preferences_providers.dart +++ b/lib/modules/browse/extension/providers/extension_preferences_providers.dart @@ -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 { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index c5a16393..654265dd 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -25,7 +25,7 @@ Future updateMangaDetail( final source = getSource(manga.lang!, manga.source!); MManga getManga; - getManga = await ref.watch( + getManga = await ref.read( getDetailProvider(url: manga.link!, source: source!).future, ); @@ -36,9 +36,11 @@ Future updateMangaDetail( .toSet() .toList() ?? []; + final tempName = getManga.name?.trim().trimLeft().trimRight(); + final tempLink = getManga.link?.trim().trimLeft().trimRight(); manga ..imageUrl = getManga.imageUrl ?? manga.imageUrl - ..name = getManga.name?.trim().trimLeft().trimRight() ?? manga.name + ..name = tempName != null && tempName.isNotEmpty ? tempName : manga.name ..genre = (genre.isEmpty ? null : genre) ?? manga.genre ?? [] ..author = getManga.author?.trim().trimLeft().trimRight() ?? manga.author ?? "" @@ -51,7 +53,7 @@ Future updateMangaDetail( getManga.description?.trim().trimLeft().trimRight() ?? manga.description ?? "" - ..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link + ..link = tempLink != null && tempLink.isNotEmpty ? tempLink : manga.link ..source = manga.source ..lang = manga.lang ..itemType = source.itemType diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 637e1db6..982c3fec 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'ce51918a48b315c3555b3de4e602bd998e00a992'; +String _$updateMangaDetailHash() => r'30185777f73eaf9eac4cce554a7ecbc9e1c0b613'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart index 6f0c9a8c..7469f448 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart @@ -158,7 +158,7 @@ class _GetRepoInfosProviderElement } String _$androidProxyServerStateHash() => - r'c16bddb7d686a13e8f34a18dec2d983232f34c65'; + r'3ac060f8a61added586dcefc889fa44c71263c5b'; /// See also [AndroidProxyServerState]. @ProviderFor(AndroidProxyServerState) diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index de603d49..ce0c105c 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -4,6 +4,7 @@ import 'package:http_interceptor/http_interceptor.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/eval/model/filter.dart'; +import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; @@ -133,6 +134,7 @@ Future _updateSource( Map headers = {}; bool? supportLatest; FilterList? filterList; + List? preferenceList; if (source.sourceCodeLanguage == SourceCodeLanguage.mihon) { headers = await fetchHeadersDalvik( http, @@ -149,6 +151,11 @@ Future _updateSource( source..sourceCode = sourceCode, androidProxyServer, ); + preferenceList = await fetchPreferencesDalvik( + http, + source..sourceCode = sourceCode, + androidProxyServer, + ); } else { headers = getExtensionService( source..sourceCode = sourceCode, @@ -160,6 +167,9 @@ Future _updateSource( ..headers = jsonEncode(headers) ..supportLatest = supportLatest ..filterList = filterList != null ? jsonEncode(filterList.toJson()) : null + ..preferenceList = preferenceList != null + ? jsonEncode(preferenceList.map((e) => e.toJson()).toList()) + : null ..isAdded = true ..sourceCode = sourceCode ..sourceCodeUrl = source.sourceCodeUrl @@ -410,3 +420,30 @@ Future fetchFilterListDalvik( return null; } } + +Future?> fetchPreferencesDalvik( + InterceptedClient client, + Source source, + String androidProxyServer, +) async { + try { + final name = source.itemType == ItemType.anime ? "Anime" : "Manga"; + final res = await client.post( + Uri.parse("$androidProxyServer/dalvik"), + body: jsonEncode({ + "method": "preferences$name", + "data": source.sourceCode, + }), + ); + final data = jsonDecode(res.body) as List; + return data + .map( + (e) => SourcePreference.fromJson(e) + ..id = null + ..sourceId = source.id, + ) + .toList(); + } catch (_) { + return null; + } +} From 7eba7bdcf2ab51c80fa9ce6666a45c23cc7b1b02 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 22 Aug 2025 17:13:28 +0200 Subject: [PATCH 061/100] added filters - fixed torrents not playing --- lib/eval/mihon/service.dart | 5 ++--- lib/eval/model/source_preference.dart | 6 +++++- .../extension/widgets/source_preference_widget.dart | 6 +++--- lib/services/get_video_list.dart | 9 ++++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/eval/mihon/service.dart b/lib/eval/mihon/service.dart index 184eae6a..dd2bacd8 100644 --- a/lib/eval/mihon/service.dart +++ b/lib/eval/mihon/service.dart @@ -122,7 +122,7 @@ class MihonExtensionService implements ExtensionService { "method": "getSearch$name", "page": max(1, page), "search": query, - // "filterList": _convertFilters(filters), + "filterList": _convertFilters(filters), "preferences": getSourcePreferences(), "data": source.sourceCode, }), @@ -289,8 +289,7 @@ class MihonExtensionService implements ExtensionService { @override FilterList getFilterList() { - // return source.getFilterList() ?? FilterList([]); - return FilterList([]); + return source.getFilterList() ?? FilterList([]); } @override diff --git a/lib/eval/model/source_preference.dart b/lib/eval/model/source_preference.dart index 5f1270d4..ff94ef8f 100644 --- a/lib/eval/model/source_preference.dart +++ b/lib/eval/model/source_preference.dart @@ -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(), entryValues: json['entryValues']?.cast(), ); diff --git a/lib/modules/browse/extension/widgets/source_preference_widget.dart b/lib/modules/browse/extension/widgets/source_preference_widget.dart index 405fd935..3611a1c6 100644 --- a/lib/modules/browse/extension/widgets/source_preference_widget.dart +++ b/lib/modules/browse/extension/widgets/source_preference_widget.dart @@ -45,15 +45,15 @@ class _SourcePreferenceWidgetState extends State { 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 ?? "", ), ); }, diff --git a/lib/services/get_video_list.dart b/lib/services/get_video_list.dart index 11b7c775..220827fc 100644 --- a/lib/services/get_video_list.dart +++ b/lib/services/get_video_list.dart @@ -11,6 +11,8 @@ import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:path/path.dart' as p; + +import '../models/source.dart'; part 'get_video_list.g.dart'; @riverpod @@ -61,7 +63,12 @@ Future<(List

    ( case 35: return (reader.readStringOrNull(offset)) as P; case 36: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 37: - return (reader.readDoubleOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 38: + return (reader.readDoubleOrNull(offset)) as P; + case 39: return (_SettingsdefaultReaderModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ReaderMode.vertical) as P; - case 39: - return (reader.readLongOrNull(offset)) as P; case 40: + return (reader.readLongOrNull(offset)) as P; + case 41: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 41: + case 42: return (_SettingsdisableSectionTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? SectionType.all) as P; - case 42: + case 43: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 43: - return (reader.readLongOrNull(offset)) as P; case 44: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 45: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 46: return (reader.readBoolOrNull(offset)) as P; case 47: @@ -1718,18 +1731,18 @@ P _settingsDeserializeProp

    ( case 50: return (reader.readBoolOrNull(offset)) as P; case 51: + return (reader.readBoolOrNull(offset)) as P; + case 52: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 52: - return (reader.readDoubleOrNull(offset)) as P; case 53: - return (reader.readLongOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 54: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 55: return (reader.readBoolOrNull(offset)) as P; case 56: @@ -1737,17 +1750,17 @@ P _settingsDeserializeProp

    ( case 57: return (reader.readBoolOrNull(offset)) as P; case 58: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 59: - return (reader.readStringOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 60: - return (reader.readBoolOrNull(offset)) as P; - case 61: return (reader.readStringOrNull(offset)) as P; - case 62: + case 61: return (reader.readBoolOrNull(offset)) as P; + case 62: + return (reader.readStringOrNull(offset)) as P; case 63: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 64: return (reader.readLongOrNull(offset)) as P; case 65: @@ -1771,7 +1784,7 @@ P _settingsDeserializeProp

    ( case 74: return (reader.readLongOrNull(offset)) as P; case 75: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 76: return (reader.readBoolOrNull(offset)) as P; case 77: @@ -1781,47 +1794,47 @@ P _settingsDeserializeProp

    ( case 79: return (reader.readBoolOrNull(offset)) as P; case 80: + return (reader.readBoolOrNull(offset)) as P; + case 81: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 81: + case 82: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 82: - return (reader.readLongOrNull(offset)) as P; case 83: + return (reader.readLongOrNull(offset)) as P; + case 84: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 84: - return (reader.readLongOrNull(offset)) as P; case 85: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 86: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 87: + return (reader.readStringList(offset)) as P; + case 88: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 88: + case 89: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 89: - return (reader.readLongOrNull(offset)) as P; case 90: return (reader.readLongOrNull(offset)) as P; case 91: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 92: return (reader.readBoolOrNull(offset)) as P; case 93: @@ -1833,39 +1846,39 @@ P _settingsDeserializeProp

    ( case 96: return (reader.readBoolOrNull(offset)) as P; case 97: + return (reader.readBoolOrNull(offset)) as P; + case 98: return (_SettingsnovelTextAlignValueEnumMap[ reader.readByteOrNull(offset)] ?? NovelTextAlign.left) as P; - case 98: - return (reader.readBoolOrNull(offset)) as P; case 99: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 100: + return (reader.readLongOrNull(offset)) as P; + case 101: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 101: + case 102: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 102: + case 103: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 103: - return (reader.readBoolOrNull(offset)) as P; case 104: - return (reader.readLongOrNull(offset)) as P; - case 105: return (reader.readBoolOrNull(offset)) as P; + case 105: + return (reader.readLongOrNull(offset)) as P; case 106: return (reader.readBoolOrNull(offset)) as P; case 107: @@ -1873,23 +1886,19 @@ P _settingsDeserializeProp

    ( case 108: return (reader.readBoolOrNull(offset)) as P; case 109: + return (reader.readBoolOrNull(offset)) as P; + case 110: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 110: - return (reader.readBoolOrNull(offset)) as P; case 111: + return (reader.readBoolOrNull(offset)) as P; + case 112: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 112: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; case 113: return (reader.readObjectOrNull( offset, @@ -1903,18 +1912,24 @@ P _settingsDeserializeProp

    ( allOffsets, )) as P; case 115: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 116: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 117: return (reader.readBoolOrNull(offset)) as P; case 118: - return (reader.readLongOrNull(offset)) as P; - case 119: return (reader.readBoolOrNull(offset)) as P; + case 119: + return (reader.readLongOrNull(offset)) as P; case 120: return (reader.readBoolOrNull(offset)) as P; case 121: + return (reader.readBoolOrNull(offset)) as P; + case 122: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -4691,6 +4706,153 @@ extension SettingsQueryFilter }); } + QueryBuilder customDnsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'customDns', + )); + }); + } + + QueryBuilder customDnsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'customDns', + )); + }); + } + + QueryBuilder customDnsEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'customDns', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'customDns', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder customDnsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'customDns', + value: '', + )); + }); + } + + QueryBuilder + customDnsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'customDns', + value: '', + )); + }); + } + QueryBuilder dateFormatIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -10575,6 +10737,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByCustomDns() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'customDns', Sort.asc); + }); + } + + QueryBuilder sortByCustomDnsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'customDns', Sort.desc); + }); + } + QueryBuilder sortByDateFormat() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'dateFormat', Sort.asc); @@ -11846,6 +12020,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByCustomDns() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'customDns', Sort.asc); + }); + } + + QueryBuilder thenByCustomDnsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'customDns', Sort.desc); + }); + } + QueryBuilder thenByDateFormat() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'dateFormat', Sort.asc); @@ -12982,6 +13168,13 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByCustomDns( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'customDns', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByDateFormat( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -13718,6 +13911,12 @@ extension SettingsQueryProperty }); } + QueryBuilder customDnsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'customDns'); + }); + } + QueryBuilder dateFormatProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'dateFormat'); @@ -17373,18 +17572,28 @@ const RepoSchema = Schema( name: r'Repo', id: 8520529424681796092, properties: { - r'jsonUrl': PropertySchema( + r'hashCode': PropertySchema( id: 0, + name: r'hashCode', + type: IsarType.long, + ), + r'hidden': PropertySchema( + id: 1, + name: r'hidden', + type: IsarType.bool, + ), + r'jsonUrl': PropertySchema( + id: 2, name: r'jsonUrl', type: IsarType.string, ), r'name': PropertySchema( - id: 1, + id: 3, name: r'name', type: IsarType.string, ), r'website': PropertySchema( - id: 2, + id: 4, name: r'website', type: IsarType.string, ) @@ -17428,9 +17637,11 @@ void _repoSerialize( List offsets, Map> allOffsets, ) { - writer.writeString(offsets[0], object.jsonUrl); - writer.writeString(offsets[1], object.name); - writer.writeString(offsets[2], object.website); + writer.writeLong(offsets[0], object.hashCode); + writer.writeBool(offsets[1], object.hidden); + writer.writeString(offsets[2], object.jsonUrl); + writer.writeString(offsets[3], object.name); + writer.writeString(offsets[4], object.website); } Repo _repoDeserialize( @@ -17440,9 +17651,10 @@ Repo _repoDeserialize( Map> allOffsets, ) { final object = Repo( - jsonUrl: reader.readStringOrNull(offsets[0]), - name: reader.readStringOrNull(offsets[1]), - website: reader.readStringOrNull(offsets[2]), + hidden: reader.readBoolOrNull(offsets[1]), + jsonUrl: reader.readStringOrNull(offsets[2]), + name: reader.readStringOrNull(offsets[3]), + website: reader.readStringOrNull(offsets[4]), ); return object; } @@ -17455,17 +17667,98 @@ P _repoDeserializeProp

    ( ) { switch (propertyId) { case 0: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLong(offset)) as P; case 1: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 2: return (reader.readStringOrNull(offset)) as P; + case 3: + return (reader.readStringOrNull(offset)) as P; + case 4: + return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } extension RepoQueryFilter on QueryBuilder { + QueryBuilder hashCodeEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hashCode', + value: value, + )); + }); + } + + QueryBuilder hashCodeGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'hashCode', + value: value, + )); + }); + } + + QueryBuilder hashCodeLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'hashCode', + value: value, + )); + }); + } + + QueryBuilder hashCodeBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'hashCode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder hiddenIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hidden', + )); + }); + } + + QueryBuilder hiddenIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hidden', + )); + }); + } + + QueryBuilder hiddenEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hidden', + value: value, + )); + }); + } + QueryBuilder jsonUrlIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( diff --git a/lib/modules/browse/extension/extension_screen.dart b/lib/modules/browse/extension/extension_screen.dart index 56cbff6f..aad2a77e 100644 --- a/lib/modules/browse/extension/extension_screen.dart +++ b/lib/modules/browse/extension/extension_screen.dart @@ -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 { 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 { final notInstalledEntries = []; for (var element in filteredData) { + if (repositories + .firstWhereOrNull((e) => e == element.repo) + ?.hidden ?? + false) { + continue; + } final isLatestVersion = element.version == element.versionLast; if (compareVersions( diff --git a/lib/modules/browse/extension/providers/extensions_provider.dart b/lib/modules/browse/extension/providers/extensions_provider.dart index c889032a..52568963 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.dart @@ -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,7 @@ Stream> getExtensionsStream(Ref ref, ItemType itemType) async* { .filter() .idIsNotNull() .and() + .repo((q) => q.hiddenIsNull().or().hiddenEqualTo(false)) .isActiveEqualTo(true) .itemTypeEqualTo(itemType) .watch(fireImmediately: true); diff --git a/lib/modules/browse/extension/providers/extensions_provider.g.dart b/lib/modules/browse/extension/providers/extensions_provider.g.dart index 555d91b1..746ffbcd 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.g.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.g.dart @@ -7,7 +7,7 @@ part of 'extensions_provider.dart'; // ************************************************************************** String _$getExtensionsStreamHash() => - r'3c5d6625c40c222f25fc8141df078dd46bcc762f'; + r'af34092ebf31c784010110af746e3ee2731297bd'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 982c3fec..3dadf120 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'30185777f73eaf9eac4cce554a7ecbc9e1c0b613'; +String _$updateMangaDetailHash() => r'44a7da7d5ef698b030c98fd5439cf9e7525350ef'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.dart index 628120da..11cd882a 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.dart @@ -76,6 +76,16 @@ class ExtensionsRepoState extends _$ExtensionsRepoState { []; } + void setVisibility(Repo repo, bool hidden) { + final value = state.map((e) { + if (e == repo) { + e.hidden = hidden; + } + return e; + }).toList(); + set(value); + } + void set(List value) { final settings = isar.settings.getSync(227)!; state = value; diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart index 7469f448..337ba3b9 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart @@ -192,7 +192,7 @@ final onlyIncludePinnedSourceStateProvider = typedef _$OnlyIncludePinnedSourceState = AutoDisposeNotifier; String _$extensionsRepoStateHash() => - r'5c23b8b7ecf83b253b76a2663a71c0c752e53a40'; + r'86edc9a3f78d72acda4b20a058031c345ee406eb'; abstract class _$ExtensionsRepoState extends BuildlessAutoDisposeNotifier> { diff --git a/lib/modules/more/settings/browse/source_repositories.dart b/lib/modules/more/settings/browse/source_repositories.dart index 27039d62..ca019635 100644 --- a/lib/modules/more/settings/browse/source_repositories.dart +++ b/lib/modules/more/settings/browse/source_repositories.dart @@ -7,6 +7,8 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/fetch_item_sources.dart'; +import 'package:mangayomi/utils/cached_network.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -19,8 +21,13 @@ class SourceRepositories extends ConsumerStatefulWidget { } class _SourceRepositoriesState extends ConsumerState { + final urlRegex = RegExp( + r'^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$', + ); List _entries = []; String urlInput = ""; + bool isRefreshing = false; + Future _launchInBrowser(Uri url) async { if (!await launchUrl(url, mode: LaunchMode.externalApplication)) { throw 'Could not launch $url'; @@ -41,6 +48,43 @@ class _SourceRepositoriesState extends ConsumerState { ItemType.anime => Text(l10n.manage_anime_repo_urls), _ => Text(l10n.manage_novel_repo_urls), }, + actions: [ + isRefreshing + ? const Padding( + padding: EdgeInsets.all(20.0), + child: SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 3), + ), + ) + : Padding( + padding: EdgeInsets.all(8.0), + child: IconButton( + splashRadius: 20, + onPressed: () async { + setState(() { + isRefreshing = true; + }); + final result = await ref.refresh( + fetchItemSourcesListProvider( + id: null, + reFresh: true, + itemType: widget.itemType, + ).future, + ); + setState(() { + isRefreshing = false; + }); + return result; + }, + icon: Icon( + Icons.refresh, + color: Theme.of(context).hintColor, + ), + ), + ), + ], ), body: data.when( data: (data) { @@ -62,6 +106,12 @@ class _SourceRepositoriesState extends ConsumerState { itemCount: _entries.length, itemBuilder: (context, index) { final repo = _entries[index]; + final isHidden = repo.hidden ?? false; + final repoAvatar = urlRegex + .firstMatch(repo.jsonUrl ?? "") + ?.group(4) + ?.split("/") + .elementAtOrNull(1); return Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Card( @@ -69,25 +119,53 @@ class _SourceRepositoriesState extends ConsumerState { padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8, - vertical: 15, + Opacity( + opacity: isHidden ? 0.3 : 1, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (repoAvatar != null) + Padding( + padding: EdgeInsets.all(8.0), + child: cachedNetworkImage( + imageUrl: + "https://github.com/$repoAvatar.png?size=64", + fit: BoxFit.contain, + width: 64, + height: 64, + errorWidget: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 15, + ), + child: Icon(Icons.label_outline_rounded), + ), + useCustomNetworkImage: false, + ), + ), + if (repoAvatar == null) + const Padding( + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 15, + ), + child: Icon(Icons.label_outline_rounded), + ), + const SizedBox(width: 10), + Expanded( + child: Text( + repo.name ?? + repo.jsonUrl ?? + "Invalid source - remove it", + style: TextStyle( + decoration: isHidden + ? TextDecoration.lineThrough + : TextDecoration.none, + ), + ), ), - child: const Icon(Icons.label_outline_rounded), - ), - const SizedBox(width: 10), - Expanded( - child: Text( - repo.name ?? - repo.jsonUrl ?? - "Invalid source - remove it", - ), - ), - ], + ], + ), ), Row( mainAxisAlignment: MainAxisAlignment.end, @@ -112,72 +190,40 @@ class _SourceRepositoriesState extends ConsumerState { ), SizedBox(width: 10), IconButton( - onPressed: () { - showDialog( - context: context, - builder: (context) { - return StatefulBuilder( - builder: (context, setState) { - return AlertDialog( - title: Text( - l10n.remove_extensions_repo, - ), - content: Text( - l10n.remove_extensions_repo, - ), - actions: [ - Row( - mainAxisAlignment: - MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text(l10n.cancel), - ), - const SizedBox(width: 15), - TextButton( - onPressed: () { - final mangaRepos = ref - .read( - extensionsRepoStateProvider( - widget.itemType, - ), - ) - .toList(); - mangaRepos.removeWhere( - (url) => - url == - _entries[index], - ); - ref - .read( - extensionsRepoStateProvider( - widget.itemType, - ).notifier, - ) - .set(mangaRepos); - ref.watch( - extensionsRepoStateProvider( - widget.itemType, - ), - ); - if (context.mounted) { - Navigator.pop(context); - } - }, - child: Text(l10n.ok), - ), - ], + onPressed: () => ref + .read( + extensionsRepoStateProvider( + widget.itemType, + ).notifier, + ) + .setVisibility(repo, !isHidden), + icon: Stack( + children: [ + const Icon(Icons.remove_red_eye_outlined), + if (!isHidden) + Positioned( + right: 8, + child: Transform.scale( + scaleX: 2.5, + child: const Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Text( + '\\', + style: TextStyle(fontSize: 17), ), ], - ); - }, - ); - }, - ); - }, + ), + ), + ), + ], + ), + ), + SizedBox(width: 10), + IconButton( + onPressed: () => + _showRemoveRepoDialog(context, index), icon: const Icon(Icons.delete_outlined), ), ], @@ -207,144 +253,7 @@ class _SourceRepositoriesState extends ConsumerState { }, ), floatingActionButton: FloatingActionButton.extended( - onPressed: () { - bool isLoading = false; - final controller = TextEditingController(); - showDialog( - context: context, - builder: (context) { - return SizedBox( - child: StatefulBuilder( - builder: (context, setState) { - return AlertDialog( - title: Text(l10n.add_extensions_repo), - content: TextFormField( - controller: controller, - autofocus: true, - keyboardType: TextInputType.url, - onChanged: (value) => setState(() {}), - validator: (value) { - if (value == null || value.isEmpty) { - return l10n.url_cannot_be_empty; - } - if (!value.endsWith('.json')) { - return l10n.url_must_end_with_dot_json; - } - try { - final uri = Uri.parse(value); - if (!uri.isAbsolute) { - return l10n.invalid_url_format; - } - return null; - } catch (e) { - return l10n.invalid_url_format; - } - }, - autovalidateMode: AutovalidateMode.onUserInteraction, - decoration: InputDecoration( - hintText: l10n.url_must_end_with_dot_json, - filled: false, - contentPadding: const EdgeInsets.all(12), - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(width: 0.4), - borderRadius: BorderRadius.circular(5), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(), - borderRadius: BorderRadius.circular(5), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: const BorderSide(), - ), - ), - ), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text(l10n.cancel), - ), - const SizedBox(width: 15), - StatefulBuilder( - builder: (context, setState) { - return TextButton( - onPressed: - controller.text.isEmpty || - !controller.text.endsWith(".json") - ? null - : () async { - setState(() => isLoading = true); - try { - final mangaRepos = ref - .read( - extensionsRepoStateProvider( - widget.itemType, - ), - ) - .toList(); - final repo = await ref.read( - getRepoInfosProvider( - jsonUrl: controller.text, - ).future, - ); - if (repo == null) { - botToast(l10n.unsupported_repo); - return; - } - mangaRepos.add(repo); - ref - .read( - extensionsRepoStateProvider( - widget.itemType, - ).notifier, - ) - .set(mangaRepos); - } catch (e, s) { - setState(() => isLoading = false); - botToast('$e\n$s'); - } - - if (context.mounted) { - Navigator.pop(context); - } - }, - child: isLoading - ? SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator(), - ) - : Text( - l10n.add, - style: TextStyle( - color: - controller.text.isEmpty || - !controller.text.endsWith( - ".json", - ) - ? Theme.of(context).primaryColor - .withValues(alpha: 0.2) - : null, - ), - ), - ); - }, - ), - ], - ), - ], - ); - }, - ), - ); - }, - ); - }, + onPressed: () => _showAddRepoDialog(context), label: Row( children: [ const Icon(Icons.add), @@ -355,4 +264,193 @@ class _SourceRepositoriesState extends ConsumerState { ), ); } + + _showRemoveRepoDialog(BuildContext context, int index) { + showDialog( + context: context, + builder: (context) { + return StatefulBuilder( + builder: (context, setState) { + final l10n = context.l10n; + return AlertDialog( + title: Text(l10n.remove_extensions_repo), + content: Text(l10n.remove_extensions_repo), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(l10n.cancel), + ), + const SizedBox(width: 15), + TextButton( + onPressed: () { + final mangaRepos = ref + .read(extensionsRepoStateProvider(widget.itemType)) + .toList(); + mangaRepos.removeWhere((url) => url == _entries[index]); + ref + .read( + extensionsRepoStateProvider( + widget.itemType, + ).notifier, + ) + .set(mangaRepos); + ref.watch(extensionsRepoStateProvider(widget.itemType)); + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text(l10n.ok), + ), + ], + ), + ], + ); + }, + ); + }, + ); + } + + _showAddRepoDialog(BuildContext context) { + bool isLoading = false; + final controller = TextEditingController(); + showDialog( + context: context, + builder: (context) { + return SizedBox( + child: StatefulBuilder( + builder: (context, setState) { + final l10n = context.l10n; + return AlertDialog( + title: Text(l10n.add_extensions_repo), + content: TextFormField( + controller: controller, + autofocus: true, + keyboardType: TextInputType.url, + onChanged: (value) => setState(() {}), + validator: (value) { + if (value == null || value.isEmpty) { + return l10n.url_cannot_be_empty; + } + if (!value.endsWith('.json')) { + return l10n.url_must_end_with_dot_json; + } + try { + final uri = Uri.parse(value); + if (!uri.isAbsolute) { + return l10n.invalid_url_format; + } + return null; + } catch (e) { + return l10n.invalid_url_format; + } + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + decoration: InputDecoration( + hintText: l10n.url_must_end_with_dot_json, + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(l10n.cancel), + ), + const SizedBox(width: 15), + StatefulBuilder( + builder: (context, setState) { + return TextButton( + onPressed: + controller.text.isEmpty || + !controller.text.endsWith(".json") + ? null + : () async { + setState(() => isLoading = true); + try { + final mangaRepos = ref + .read( + extensionsRepoStateProvider( + widget.itemType, + ), + ) + .toList(); + final repo = await ref.read( + getRepoInfosProvider( + jsonUrl: controller.text, + ).future, + ); + if (repo == null) { + botToast(l10n.unsupported_repo); + return; + } + mangaRepos.add(repo); + ref + .read( + extensionsRepoStateProvider( + widget.itemType, + ).notifier, + ) + .set(mangaRepos); + } catch (e, s) { + setState(() => isLoading = false); + botToast('$e\n$s'); + } + + if (context.mounted) { + Navigator.pop(context); + } + }, + child: isLoading + ? SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator(), + ) + : Text( + l10n.add, + style: TextStyle( + color: + controller.text.isEmpty || + !controller.text.endsWith(".json") + ? Theme.of(context).primaryColor + .withValues(alpha: 0.2) + : null, + ), + ), + ); + }, + ), + ], + ), + ], + ); + }, + ), + ); + }, + ); + } } diff --git a/lib/modules/more/settings/general/general_screen.dart b/lib/modules/more/settings/general/general_screen.dart index 379a47d9..1c69532c 100644 --- a/lib/modules/more/settings/general/general_screen.dart +++ b/lib/modules/more/settings/general/general_screen.dart @@ -34,6 +34,7 @@ class _GeneralStateScreen extends ConsumerState { @override Widget build(BuildContext context) { final l10n = l10nLocalizations(context); + final customDns = ref.watch(customDnsStateProvider); final enableDiscordRpc = ref.watch(enableDiscordRpcStateProvider); final hideDiscordRpcInIncognito = ref.watch( hideDiscordRpcInIncognitoStateProvider, @@ -48,6 +49,14 @@ class _GeneralStateScreen extends ConsumerState { body: SingleChildScrollView( child: Column( children: [ + ListTile( + onTap: () => _showCustomDnsDialog(context, ref, customDns), + title: Text(l10n.custom_dns), + subtitle: Text( + customDns, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), Container( margin: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(10.0), @@ -290,4 +299,77 @@ class _GeneralStateScreen extends ConsumerState { ), ); } + + void _showCustomDnsDialog( + BuildContext context, + WidgetRef ref, + String customDns, + ) { + final dnsController = TextEditingController(text: customDns); + String dns = customDns; + showDialog( + context: context, + builder: (context) => StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text( + context.l10n.custom_dns, + style: const TextStyle(fontSize: 30), + ), + content: SizedBox( + width: context.width(0.8), + height: context.height(0.3), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TextFormField( + controller: dnsController, + autofocus: true, + onChanged: (value) => setState(() { + dns = value; + }), + decoration: InputDecoration( + hintText: "8.8.8.8", + filled: false, + contentPadding: const EdgeInsets.all(12), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 0.4), + borderRadius: BorderRadius.circular(5), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(), + ), + ), + ), + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: SizedBox( + width: context.width(1), + child: ElevatedButton( + onPressed: () { + ref.read(customDnsStateProvider.notifier).set(dns); + Navigator.pop(context); + }, + child: Text(context.l10n.dialog_confirm), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } } diff --git a/lib/modules/more/settings/general/providers/general_state_provider.dart b/lib/modules/more/settings/general/providers/general_state_provider.dart index ee934757..0c3cbb26 100644 --- a/lib/modules/more/settings/general/providers/general_state_provider.dart +++ b/lib/modules/more/settings/general/providers/general_state_provider.dart @@ -3,6 +3,26 @@ import 'package:mangayomi/models/settings.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'general_state_provider.g.dart'; +@riverpod +class CustomDnsState extends _$CustomDnsState { + @override + String build() { + return isar.settings.getSync(227)!.customDns ?? ""; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..customDns = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + @riverpod class EnableDiscordRpcState extends _$EnableDiscordRpcState { @override diff --git a/lib/modules/more/settings/general/providers/general_state_provider.g.dart b/lib/modules/more/settings/general/providers/general_state_provider.g.dart index 7f659f36..8808d602 100644 --- a/lib/modules/more/settings/general/providers/general_state_provider.g.dart +++ b/lib/modules/more/settings/general/providers/general_state_provider.g.dart @@ -6,6 +6,22 @@ part of 'general_state_provider.dart'; // RiverpodGenerator // ************************************************************************** +String _$customDnsStateHash() => r'6061c64d742b3f873e54c1b9ef724b7c0b6350a2'; + +/// See also [CustomDnsState]. +@ProviderFor(CustomDnsState) +final customDnsStateProvider = + AutoDisposeNotifierProvider.internal( + CustomDnsState.new, + name: r'customDnsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$customDnsStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$CustomDnsState = AutoDisposeNotifier; String _$enableDiscordRpcStateHash() => r'ab8ce3b29f5d94aedbc88dcb87c7c834648270f5'; diff --git a/lib/services/get_video_list.g.dart b/lib/services/get_video_list.g.dart index 20e19a4c..e81b1a44 100644 --- a/lib/services/get_video_list.g.dart +++ b/lib/services/get_video_list.g.dart @@ -6,7 +6,7 @@ part of 'get_video_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$getVideoListHash() => r'd39e325f21e68830c0692101e6efd95b2e04bcef'; +String _$getVideoListHash() => r'a7f0b9549bc2c3b4ddb68850f13da57081d8d002'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/http/m_client.dart b/lib/services/http/m_client.dart index ee0c43ab..8b491b6d 100644 --- a/lib/services/http/m_client.dart +++ b/lib/services/http/m_client.dart @@ -54,8 +54,20 @@ class MClient { rhttp.ClientSettings? settings, bool showCloudFlareError = true, }) { + final clientSettings = customDns == null + ? settings + : settings?.copyWith( + dnsSettings: DnsSettings.dynamic( + resolver: (host) async => [customDns!], + ), + ) ?? + ClientSettings( + dnsSettings: DnsSettings.dynamic( + resolver: (host) async => [customDns!], + ), + ); return InterceptedClient.build( - client: httpClient(settings: settings, reqcopyWith: reqcopyWith), + client: httpClient(settings: clientSettings, reqcopyWith: reqcopyWith), retryPolicy: ResolveCloudFlareChallenge(showCloudFlareError), interceptors: [ MCookieManager(reqcopyWith), From 5920c0e7efd6e1226ae1aae312d5c2ce31ea96bb Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 23 Aug 2025 15:41:33 +0200 Subject: [PATCH 063/100] upgraded flex_color_scheme and d4rt --- pubspec.lock | 61 +++++++++++++++++++++------------------------------- pubspec.yaml | 4 ++-- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 5f633593..1252b144 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "76.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.3" + version: "67.0.0" analyzer: dependency: "direct overridden" description: name: analyzer - sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "6.11.0" + version: "6.4.1" analyzer_plugin: dependency: "direct overridden" description: @@ -354,10 +349,10 @@ packages: dependency: "direct main" description: name: d4rt - sha256: "4220081caf1cea231e127a8fd2801b4b55464a51f840b56bb079ce2b3792e9e6" + sha256: "802f4fed100431335d87912e97132117ad7dd2a455958c92b94995317d92402f" url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.3" dart_style: dependency: transitive description: @@ -524,10 +519,10 @@ packages: dependency: "direct main" description: name: flex_color_scheme - sha256: "3344f8f6536c6ce0473b98e9f084ef80ca89024ad3b454f9c32cf840206f4387" + sha256: "034d5720747e6af39b2ad090d82dd92d33fde68e7964f1814b714c9d49ddbd64" url: "https://pub.dev" source: hosted - version: "8.2.0" + version: "8.3.0" flex_seed_scheme: dependency: transitive description: @@ -1083,26 +1078,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.1" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -1119,14 +1114,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" - source: hosted - version: "0.1.3-main.0" marquee: dependency: "direct main" description: @@ -1172,7 +1159,7 @@ packages: dependency: transitive description: path: "libs/android/media_kit_libs_android_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1181,7 +1168,7 @@ packages: dependency: transitive description: path: "libs/ios/media_kit_libs_ios_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1190,7 +1177,7 @@ packages: dependency: transitive description: path: "libs/linux/media_kit_libs_linux" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1199,7 +1186,7 @@ packages: dependency: transitive description: path: "libs/macos/media_kit_libs_macos_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1217,7 +1204,7 @@ packages: dependency: transitive description: path: "libs/windows/media_kit_libs_windows_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1904,10 +1891,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" time: dependency: transitive description: @@ -2048,10 +2035,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" video_player: dependency: transitive description: @@ -2278,4 +2265,4 @@ packages: version: "2.2.2" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.29.0" + flutter: ">=3.35.0" diff --git a/pubspec.yaml b/pubspec.yaml index 0166b6d9..9162ec6b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: html: ^0.15.5 font_awesome_flutter: ^10.8.0 expandable_text: ^2.3.0 - flex_color_scheme: ^8.1.0 + flex_color_scheme: ^8.3.0 extended_image: ^10.0.0 photo_view: ^0.15.0 grouped_list: ^6.0.0 @@ -96,7 +96,7 @@ dependencies: git: url: https://github.com/kodjodevf/epubx.dart.git ref: dev - d4rt: 0.1.1 + d4rt: 0.1.3 hive: ^2.2.3 hive_flutter: ^1.1.0 flutter_discord_rpc_fork: From 4b348cc564101c5f767557c83c328592f2c29cad Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 23 Aug 2025 16:26:11 +0200 Subject: [PATCH 064/100] upgraded analyzer dep --- pubspec.lock | 12 ++++++------ pubspec.yaml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 1252b144..cc2a35de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "85.0.0" analyzer: dependency: "direct overridden" description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "7.7.1" analyzer_plugin: dependency: "direct overridden" description: name: analyzer_plugin - sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" + sha256: dd574a0ab77de88b7d9c12bc4b626109a5ca9078216a79041a5c24c3a1bd103c url: "https://pub.dev" source: hosted - version: "0.11.3" + version: "0.13.7" antlr4: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9162ec6b..5107ce7c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -107,14 +107,14 @@ dependencies: dependency_overrides: ffi: ^2.1.3 - analyzer: ">=5.2.0 <7.0.0" + analyzer: ^7.4.5 html: ^0.15.4 flutter_web_auth_2: git: url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git ref: 3.x-without-v1 path: flutter_web_auth_2 - analyzer_plugin: ^0.11.3 + analyzer_plugin: ^0.13.1 dev_dependencies: flutter_test: From 9278b6f8af412b3915257d2197902034d5860d8f Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 23 Aug 2025 21:55:01 +0200 Subject: [PATCH 065/100] added subtitles search --- android/app/build.gradle | 4 +- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 + lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + lib/modules/anime/anime_player_view.dart | 34 +- .../anime/widgets/search_subtitles.dart | 363 ++++++++++++++++++ lib/services/fetch_subtitles.dart | 173 +++++++++ 20 files changed, 620 insertions(+), 3 deletions(-) create mode 100644 lib/modules/anime/widgets/search_subtitles.dart create mode 100644 lib/services/fetch_subtitles.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index da765dd2..2f6efb67 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -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') -} \ No newline at end of file +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 71b82847..721f917e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -468,6 +468,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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 883b44e8..4ebb357a 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2883,6 +2883,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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index b7d8d7c4..47df2119 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1480,6 +1480,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'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 9fa64799..9ef03633 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1482,6 +1482,9 @@ class AppLocalizationsAs 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'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 6b73cf41..caf9686e 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1491,6 +1491,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'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 759848d7..d4265a21 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1481,6 +1481,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'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 99553544..4848a21b 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1498,6 +1498,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'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index a737bba2..b533dcbe 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1498,6 +1498,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'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 2d8a37f4..9216093c 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1483,6 +1483,9 @@ class AppLocalizationsHi 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'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 54d49255..dcf2da32 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1487,6 +1487,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'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 0106a1c0..79ccb1d7 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1496,6 +1496,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'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index a418c7fb..9f38ee69 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1495,6 +1495,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'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 869f1e46..1d6d567d 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1497,6 +1497,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'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 3082e05a..1437bb4c 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1481,6 +1481,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'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 6f62c41d..2b038283 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1487,6 +1487,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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 895bd0fe..47171f3b 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1453,6 +1453,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'; diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 903017fc..9cb75c60 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -37,6 +37,7 @@ 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/aniskip.dart'; +import 'package:mangayomi/services/fetch_subtitles.dart'; import 'package:mangayomi/services/get_video_list.dart'; import 'package:mangayomi/services/torrent_server.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -52,6 +53,8 @@ import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; +import 'widgets/search_subtitles.dart'; + bool _isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; class AnimePlayerView extends riv.ConsumerStatefulWidget { @@ -1296,7 +1299,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo ), ], ), - const SizedBox(height: 15), + const SizedBox(height: 30), ...videoSubtitleLast.toSet().toList().map((sub) { final title = sub.title ?? @@ -1322,6 +1325,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo child: textWidget(title, selected), ); }), + const SizedBox(height: 30), GestureDetector( onTap: () async { try { @@ -1343,6 +1347,34 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo }, child: textWidget(context.l10n.load_own_subtitles, false), ), + const SizedBox(height: 30), + GestureDetector( + onTap: () async { + try { + final subtitle = + await subtitlesSearchraggableMenu( + context, + chapter: widget.episode, + ) + as ImdbSubtitle?; + if (subtitle != null && context.mounted) { + _player.setSubtitleTrack( + SubtitleTrack.uri( + subtitle.url!, + title: subtitle.language, + language: subtitle.language, + ), + ); + } + if (!context.mounted) return; + Navigator.pop(context); + } catch (_) { + botToast("Error"); + Navigator.pop(context); + } + }, + child: textWidget(context.l10n.search_subtitles, false), + ), ], ), ); diff --git a/lib/modules/anime/widgets/search_subtitles.dart b/lib/modules/anime/widgets/search_subtitles.dart new file mode 100644 index 00000000..4b7b5897 --- /dev/null +++ b/lib/modules/anime/widgets/search_subtitles.dart @@ -0,0 +1,363 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.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/services/fetch_subtitles.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class SubtitlesWidgetSearch extends ConsumerStatefulWidget { + final Chapter chapter; + const SubtitlesWidgetSearch({required this.chapter, super.key}); + + @override + ConsumerState createState() => + _SubtitlesWidgetSearchState(); +} + +class _SubtitlesWidgetSearchState extends ConsumerState { + late final _controller = TextEditingController(text: query); + List titles = []; + List? episodes; + List? 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(); + rethrow; + } + 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), + ), + ], + ), + ], + ), + ], + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return const Divider(); + }, + ); + } +} + +subtitlesSearchraggableMenu( + BuildContext context, { + required Chapter chapter, +}) 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), + ], + ), + ), + ), + ), + ); +} diff --git a/lib/services/fetch_subtitles.dart b/lib/services/fetch_subtitles.dart new file mode 100644 index 00000000..fe8efc4e --- /dev/null +++ b/lib/services/fetch_subtitles.dart @@ -0,0 +1,173 @@ +import 'dart:convert'; +import 'package:mangayomi/services/http/m_client.dart'; + +Future> fetchImdbTitles(String query) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final url = "https://api.imdbapi.dev/search/titles?query=$query"; + final res = await http.get( + Uri.parse(url), + headers: { + "Accept": "application/json", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final data = json.decode(res.body) as Map; + return (data["titles"] as List?) + ?.map((e) => ImdbTitle.fromJson(e)) + .toList() ?? + []; + } catch (_) { + return []; + } +} + +Future?> fetchImdbEpisodes(String imdbId) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final url = "https://api.imdbapi.dev/titles/$imdbId/episodes"; + final res = await http.get( + Uri.parse(url), + headers: { + "Accept": "application/json", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final data = json.decode(res.body) as Map; + return (data["episodes"] as List?) + ?.map((e) => ImdbEpisode.fromJson(e)) + .toList(); + } catch (_) { + rethrow; + return null; + } +} + +Future?> fetchImdbSubtitles(String imdbId) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final url = "https://sub.wyzie.ru/search?id=$imdbId"; + final res = await http.get( + Uri.parse(url), + headers: { + "Accept": "application/json", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final data = json.decode(res.body) as List?; + return data + ?.map((e) => ImdbSubtitle.fromJson(e)) + .where((e) => e.url != null) + .toList(); + } catch (_) { + rethrow; + return null; + } +} + +class ImdbTitle { + final String id; + final String? type; + final String primaryTitle; + final String? originalTitle; + final String? primaryImage; + final int? startYear; + final int? endYear; + final double? aggregateRating; + final int? voteCount; + + ImdbTitle({ + required this.id, + this.type, + required this.primaryTitle, + this.originalTitle, + this.primaryImage, + this.startYear, + this.endYear, + this.aggregateRating, + this.voteCount, + }); + + factory ImdbTitle.fromJson(Map json) { + return ImdbTitle( + id: json["id"], + type: json["type"], + primaryTitle: json["primaryTitle"] ?? "???", + originalTitle: json["originalTitle"], + primaryImage: json["primaryImage"]?["url"], + startYear: json["startYear"], + endYear: json["endYear"], + aggregateRating: json["aggregateRating"] is int + ? (json["aggregateRating"] as int).toDouble() + : json["aggregateRating"], + voteCount: json["voteCount"], + ); + } +} + +class ImdbEpisode { + final String id; + final String title; + final String? primaryImage; + final String season; + final String episode; + + ImdbEpisode({ + required this.id, + required this.title, + this.primaryImage, + required this.season, + required this.episode, + }); + + factory ImdbEpisode.fromJson(Map json) { + return ImdbEpisode( + id: json["id"], + title: json["title"] ?? "???", + primaryImage: json["primaryImage"]?["url"], + season: json["season"] ?? "?", + episode: (json["episodeNumber"] as int?)?.toString() ?? "?", + ); + } +} + +class ImdbSubtitle { + final String id; + final String? url; + final String? flagUrl; + final String? format; + final String? encoding; + final String? displayLang; + final String? language; + final String? name; + final bool isHearingImpaired; + + ImdbSubtitle({ + required this.id, + this.url, + this.flagUrl, + this.format, + this.encoding, + this.displayLang, + this.language, + this.name, + required this.isHearingImpaired, + }); + + factory ImdbSubtitle.fromJson(Map json) { + return ImdbSubtitle( + id: json["id"], + url: json["url"], + flagUrl: json["flagUrl"], + format: json["format"], + encoding: json["encoding"], + displayLang: json["display"], + language: json["language"], + name: json["media"], + isHearingImpaired: json["isHearingImpaired"] ?? false, + ); + } +} From 42c3f878110bc7150424f1b309fb1390ef5f189a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 23 Aug 2025 21:58:32 +0200 Subject: [PATCH 066/100] small bug fix --- lib/modules/anime/widgets/search_subtitles.dart | 1 - lib/services/fetch_subtitles.dart | 10 ++++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/modules/anime/widgets/search_subtitles.dart b/lib/modules/anime/widgets/search_subtitles.dart index 4b7b5897..307b695a 100644 --- a/lib/modules/anime/widgets/search_subtitles.dart +++ b/lib/modules/anime/widgets/search_subtitles.dart @@ -199,7 +199,6 @@ class _SubtitlesWidgetSearchState extends ConsumerState { } } catch (e) { _errorMsg = e.toString(); - rethrow; } if (mounted) { setState(() { diff --git a/lib/services/fetch_subtitles.dart b/lib/services/fetch_subtitles.dart index fe8efc4e..4ee8d7d5 100644 --- a/lib/services/fetch_subtitles.dart +++ b/lib/services/fetch_subtitles.dart @@ -40,7 +40,6 @@ Future?> fetchImdbEpisodes(String imdbId) async { ?.map((e) => ImdbEpisode.fromJson(e)) .toList(); } catch (_) { - rethrow; return null; } } @@ -63,7 +62,6 @@ Future?> fetchImdbSubtitles(String imdbId) async { .where((e) => e.url != null) .toList(); } catch (_) { - rethrow; return null; } } @@ -100,10 +98,10 @@ class ImdbTitle { primaryImage: json["primaryImage"]?["url"], startYear: json["startYear"], endYear: json["endYear"], - aggregateRating: json["aggregateRating"] is int - ? (json["aggregateRating"] as int).toDouble() - : json["aggregateRating"], - voteCount: json["voteCount"], + aggregateRating: json["rating"]?["aggregateRating"] is int + ? (json["rating"]?["aggregateRating"] as int).toDouble() + : json["rating"]?["aggregateRating"], + voteCount: json["rating"]?["voteCount"], ); } } From b11ae203ead6f12f5af8dee079582550abe8a988 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:33:11 +0100 Subject: [PATCH 067/100] Refactor RadioListTile usage to RadioGroup in multiple screens --- .../widgets/source_preference_widget.dart | 34 +-- lib/modules/history/history_screen.dart | 1 - .../manga/detail/manga_detail_view.dart | 44 ++-- .../manga/detail/widgets/tracker_widget.dart | 71 +++--- lib/modules/manga/home/manga_home_screen.dart | 45 ++-- .../data_and_storage/data_and_storage.dart | 114 ++++----- .../appearance/appearance_screen.dart | 171 ++++++------- .../providers/theme_mode_state_provider.dart | 2 - .../settings/player/player_audio_screen.dart | 36 +-- .../player/player_decoder_screen.dart | 92 +++---- .../more/settings/player/player_screen.dart | 224 +++++++++--------- .../more/settings/reader/reader_screen.dart | 211 +++++++++-------- lib/modules/more/settings/sync/sync.dart | 46 ++-- macos/Podfile.lock | 2 +- 14 files changed, 554 insertions(+), 539 deletions(-) diff --git a/lib/modules/browse/extension/widgets/source_preference_widget.dart b/lib/modules/browse/extension/widgets/source_preference_widget.dart index 3611a1c6..0a534fd5 100644 --- a/lib/modules/browse/extension/widgets/source_preference_widget.dart +++ b/lib/modules/browse/extension/widgets/source_preference_widget.dart @@ -127,23 +127,25 @@ class _SourcePreferenceWidgetState extends State { ), 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: [ diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 99f64a61..44b964bc 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -64,7 +64,6 @@ class _HistoryScreenState extends ConsumerState } bool _isSearch = false; - // List _entriesData = []; // TODO. The variable is never used/modified @override Widget build(BuildContext context) { final hideItems = ref.watch(hideItemsStateProvider); diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index d147c826..2cd48510 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1349,29 +1349,29 @@ class _MangaDetailViewState extends ConsumerState ), Consumer( builder: (context, ref, chil) { - return Column( - children: [ - RadioListTile( - dense: true, - title: Text(l10n.source_title), - value: "e", - groupValue: "e", - selected: true, - onChanged: (value) {}, - ), - RadioListTile( - dense: true, - title: Text( - widget.itemType != ItemType.anime - ? l10n.chapter_number - : l10n.episode_number, + return RadioGroup( + groupValue: "e", + onChanged: (value) {}, + child: Column( + children: [ + RadioListTile( + dense: true, + title: Text(l10n.source_title), + value: "e", + selected: true, ), - value: "ej", - groupValue: "e", - selected: false, - onChanged: (value) {}, - ), - ], + RadioListTile( + dense: true, + title: Text( + widget.itemType != ItemType.anime + ? l10n.chapter_number + : l10n.episode_number, + ), + value: "ej", + selected: false, + ), + ], + ), ); }, ), diff --git a/lib/modules/manga/detail/widgets/tracker_widget.dart b/lib/modules/manga/detail/widgets/tracker_widget.dart index b91fe0e4..95cefb4d 100644 --- a/lib/modules/manga/detail/widgets/tracker_widget.dart +++ b/lib/modules/manga/detail/widgets/tracker_widget.dart @@ -170,50 +170,45 @@ class _TrackerWidgetState extends ConsumerState { title: Text(l10n!.status), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: ref - .read( - trackStateProvider( - track: widget.trackRes, - itemType: widget.itemType, - ).notifier, - ) - .getStatusList() - .length, - itemBuilder: (context, index) { - final status = ref + child: RadioGroup( + groupValue: toTrackStatus( + widget.trackRes.status, + widget.itemType, + widget.trackRes.syncId!, + ), + onChanged: (value) { + // Individual RadioListTile will handle the change + }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: ref .read( trackStateProvider( track: widget.trackRes, itemType: widget.itemType, ).notifier, ) - .getStatusList()[index]; - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: status, - groupValue: toTrackStatus( - widget.trackRes.status, - widget.itemType, - widget.trackRes.syncId!, - ), - onChanged: (value) { - ref - .read( - trackStateProvider( - track: widget.trackRes - ..status = status, - itemType: widget.itemType, - ).notifier, - ) - .updateManga(); - Navigator.pop(context); - }, - title: Text(getTrackStatus(status, context)), - ); - }, + .getStatusList() + .length, + itemBuilder: (context, index) { + final status = ref + .read( + trackStateProvider( + track: widget.trackRes, + itemType: widget.itemType, + ).notifier, + ) + .getStatusList()[index]; + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: status, + title: Text( + getTrackStatus(status, context), + ), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index 8d7f3797..c4dcfdba 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -238,38 +238,29 @@ class _MangaHomeScreenState extends ConsumerState { return [ PopupMenuItem( value: 0, - child: RadioListTile( - title: Text(context.l10n.comfortable_grid), - value: DisplayType.comfortableGrid, - groupValue: displayType, - onChanged: (a) { - context.pop(); - displayTypeNotifier.setMangaHomeDisplayType(a!); - }, - ), - ), - PopupMenuItem( - value: 1, - child: RadioListTile( - title: Text(context.l10n.compact_grid), - value: DisplayType.compactGrid, - groupValue: displayType, - onChanged: (a) { - context.pop(); - displayTypeNotifier.setMangaHomeDisplayType(a!); - }, - ), - ), - PopupMenuItem( - value: 2, - child: RadioListTile( - title: Text(context.l10n.list), - value: DisplayType.list, + child: RadioGroup( groupValue: displayType, onChanged: (a) { context.pop(); displayTypeNotifier.setMangaHomeDisplayType(a!); }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + RadioListTile( + title: Text(context.l10n.comfortable_grid), + value: DisplayType.comfortableGrid, + ), + RadioListTile( + title: Text(context.l10n.compact_grid), + value: DisplayType.compactGrid, + ), + RadioListTile( + title: Text(context.l10n.list), + value: DisplayType.list, + ), + ], + ), ), ), ]; diff --git a/lib/modules/more/data_and_storage/data_and_storage.dart b/lib/modules/more/data_and_storage/data_and_storage.dart index f02a0432..e2cb352f 100644 --- a/lib/modules/more/data_and_storage/data_and_storage.dart +++ b/lib/modules/more/data_and_storage/data_and_storage.dart @@ -39,50 +39,48 @@ class DataAndStorage extends ConsumerWidget { title: Text(l10n.download_location), content: SizedBox( width: context.width(0.8), - child: SuperListView( - shrinkWrap: true, - children: [ - RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: downloadLocationState.$2.isEmpty - ? downloadLocationState.$1 - : downloadLocationState.$2, - groupValue: downloadLocationState.$1, - onChanged: (value) { + child: RadioGroup( + groupValue: downloadLocationState.$2.isEmpty + ? downloadLocationState.$1 + : downloadLocationState.$2, + onChanged: (value) async { + if (value == downloadLocationState.$1) { + ref + .read(downloadLocationStateProvider.notifier) + .set(""); + Navigator.pop(context); + } else { + String? result = await FilePicker.platform + .getDirectoryPath(); + + if (result != null) { ref .read( downloadLocationStateProvider.notifier, ) - .set(""); - Navigator.pop(context); - }, - title: Text(downloadLocationState.$1), - ), - RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: downloadLocationState.$2.isEmpty - ? downloadLocationState.$1 - : downloadLocationState.$2, - groupValue: downloadLocationState.$2, - onChanged: (value) async { - String? result = await FilePicker.platform - .getDirectoryPath(); - - if (result != null) { - ref - .read( - downloadLocationStateProvider.notifier, - ) - .set(result); - } else {} - if (!context.mounted) return; - Navigator.pop(context); - }, - title: Text(l10n.custom_location), - ), - ], + .set(result); + } else {} + if (!context.mounted) return; + Navigator.pop(context); + } + }, + child: SuperListView( + shrinkWrap: true, + children: [ + RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: downloadLocationState.$1, + title: Text(downloadLocationState.$1), + ), + RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: downloadLocationState.$2, + title: Text(l10n.custom_location), + ), + ], + ), ), ), actions: [ @@ -275,24 +273,26 @@ class DataAndStorage extends ConsumerWidget { title: Text(l10n.backup_frequency), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: list.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: index, - groupValue: backupFrequency, - onChanged: (value) { - ref - .read(backupFrequencyStateProvider.notifier) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text(list[index])]), - ); + child: RadioGroup( + groupValue: backupFrequency, + onChanged: (value) { + ref + .read(backupFrequencyStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: list.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + title: Row(children: [Text(list[index])]), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/appearance/appearance_screen.dart b/lib/modules/more/settings/appearance/appearance_screen.dart index ab0e009f..c9712e31 100644 --- a/lib/modules/more/settings/appearance/appearance_screen.dart +++ b/lib/modules/more/settings/appearance/appearance_screen.dart @@ -146,25 +146,29 @@ class AppearanceScreen extends ConsumerWidget { title: Text(l10n.app_language), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: AppLocalizations.supportedLocales.length, - itemBuilder: (context, index) { - final locale = AppLocalizations.supportedLocales[index]; - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: locale, - groupValue: l10nLocale, - onChanged: (value) { - ref - .read(l10nLocaleStateProvider.notifier) - .setLocale(locale); - Navigator.pop(context); - }, - title: Text(completeLanguageName(locale.toLanguageTag())), - ); + child: RadioGroup( + groupValue: l10nLocale, + onChanged: (value) { + ref + .read(l10nLocaleStateProvider.notifier) + .setLocale(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: AppLocalizations.supportedLocales.length, + itemBuilder: (context, index) { + final locale = AppLocalizations.supportedLocales[index]; + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: locale, + title: Text( + completeLanguageName(locale.toLanguageTag()), + ), + ); + }, + ), ), ), actions: [ @@ -276,28 +280,29 @@ class AppearanceScreen extends ConsumerWidget { slivers: [ SliverPadding( padding: const EdgeInsets.all(0), - sliver: SuperSliverList.builder( - itemCount: values.length, - itemBuilder: (context, index) { - final value = values[index]; - return RadioListTile( - dense: true, - contentPadding: - const EdgeInsets.all(0), - value: value.value().fontFamily, - groupValue: appFontFamily, - onChanged: (value) { - ref - .read( - appFontFamilyProvider - .notifier, - ) - .set(value); - Navigator.pop(context); - }, - title: Text(value.key), - ); + sliver: RadioGroup( + groupValue: appFontFamily, + onChanged: (value) { + ref + .read( + appFontFamilyProvider.notifier, + ) + .set(value); + Navigator.pop(context); }, + child: SuperSliverList.builder( + itemCount: values.length, + itemBuilder: (context, index) { + final value = values[index]; + return RadioListTile( + dense: true, + contentPadding: + const EdgeInsets.all(0), + value: value.value().fontFamily, + title: Text(value.key), + ); + }, + ), ), ), ], @@ -364,28 +369,30 @@ class AppearanceScreen extends ConsumerWidget { title: Text(l10n.relative_timestamp), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: relativeTimestampsList(context).length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: index, - groupValue: relativeTimestamps, - onChanged: (value) { - ref - .read(relativeTimesTampsStateProvider.notifier) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text(relativeTimestampsList(context)[index]), - ], - ), - ); + child: RadioGroup( + groupValue: relativeTimestamps, + onChanged: (value) { + ref + .read(relativeTimesTampsStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: relativeTimestampsList(context).length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + title: Row( + children: [ + Text(relativeTimestampsList(context)[index]), + ], + ), + ); + }, + ), ), ), actions: [ @@ -431,28 +438,30 @@ class AppearanceScreen extends ConsumerWidget { title: Text(l10n.date_format), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: dateFormatsList.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: dateFormatsList[index], - groupValue: dateFormatState, - onChanged: (value) { - ref.read(dateFormatStateProvider.notifier).set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - "${dateFormatsList[index]} (${dateFormat(context: context, DateTime.now().millisecondsSinceEpoch.toString(), useRelativeTimesTamps: false, dateFormat: dateFormatsList[index], ref: ref)})", - ), - ], - ), - ); + child: RadioGroup( + groupValue: dateFormatState, + onChanged: (value) { + ref.read(dateFormatStateProvider.notifier).set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: dateFormatsList.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: dateFormatsList[index], + title: Row( + children: [ + Text( + "${dateFormatsList[index]} (${dateFormat(context: context, DateTime.now().millisecondsSinceEpoch.toString(), useRelativeTimesTamps: false, dateFormat: dateFormatsList[index], ref: ref)})", + ), + ], + ), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.dart b/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.dart index 6b661af3..bcbdfabf 100644 --- a/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.dart +++ b/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.dart @@ -1,5 +1,3 @@ -import 'dart:ui'; - import 'package:flutter/widgets.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/settings.dart'; diff --git a/lib/modules/more/settings/player/player_audio_screen.dart b/lib/modules/more/settings/player/player_audio_screen.dart index ceb75e1d..b6f64717 100644 --- a/lib/modules/more/settings/player/player_audio_screen.dart +++ b/lib/modules/more/settings/player/player_audio_screen.dart @@ -68,24 +68,26 @@ class _PlayerAudioScreenState extends ConsumerState { title: Text(context.l10n.audio_channels), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index].$1, - groupValue: audioChannel, - onChanged: (value) { - ref - .read(audioChannelStateProvider.notifier) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text(values[index].$2)]), - ); + child: RadioGroup( + groupValue: audioChannel, + onChanged: (value) { + ref + .read(audioChannelStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/player/player_decoder_screen.dart b/lib/modules/more/settings/player/player_decoder_screen.dart index 3c63f5b2..c11ad34b 100644 --- a/lib/modules/more/settings/player/player_decoder_screen.dart +++ b/lib/modules/more/settings/player/player_decoder_screen.dart @@ -49,34 +49,36 @@ class _PlayerDecoderScreenState extends ConsumerState { title: Text(context.l10n.hwdec), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index].$1, - groupValue: hwdecMode, - onChanged: (value) { - ref - .read( - hwdecModeStateProvider( - rawValue: true, - ).notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - "${values[index].$1} ${values[index].$2}", - ), - ], - ), - ); + child: RadioGroup( + groupValue: hwdecMode, + onChanged: (value) { + ref + .read( + hwdecModeStateProvider( + rawValue: true, + ).notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + title: Row( + children: [ + Text( + "${values[index].$1} ${values[index].$2}", + ), + ], + ), + ); + }, + ), ), ), actions: [ @@ -130,24 +132,26 @@ class _PlayerDecoderScreenState extends ConsumerState { title: Text(context.l10n.debanding), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index].$1, - groupValue: debandingType, - onChanged: (value) { - ref - .read(debandingStateProvider.notifier) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text(values[index].$2)]), - ); + child: RadioGroup( + groupValue: debandingType, + onChanged: (value) { + ref + .read(debandingStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index b0288bef..8792b15a 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; @@ -49,30 +47,30 @@ class _PlayerScreenState extends ConsumerState { title: Text(context.l10n.default_subtitle_language), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: AppLocalizations.supportedLocales.length, - itemBuilder: (context, index) { - final locale = - AppLocalizations.supportedLocales[index]; - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: locale, - groupValue: defaultSubtitleLang, - onChanged: (value) { - ref - .read( - defaultSubtitleLangStateProvider.notifier, - ) - .setLocale(locale); - Navigator.pop(context); - }, - title: Text( - completeLanguageName(locale.toLanguageTag()), - ), - ); + child: RadioGroup( + groupValue: defaultSubtitleLang, + onChanged: (value) { + ref + .read(defaultSubtitleLangStateProvider.notifier) + .setLocale(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: AppLocalizations.supportedLocales.length, + itemBuilder: (context, index) { + final locale = + AppLocalizations.supportedLocales[index]; + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: locale, + title: Text( + completeLanguageName(locale.toLanguageTag()), + ), + ); + }, + ), ), ), actions: [ @@ -111,27 +109,30 @@ class _PlayerScreenState extends ConsumerState { title: Text(context.l10n.markEpisodeAsSeenSetting), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index], - groupValue: markEpisodeAsSeenType, - onChanged: (value) { - ref - .read( - markEpisodeAsSeenTypeStateProvider - .notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text("${values[index]}%")]), - ); + child: RadioGroup( + groupValue: markEpisodeAsSeenType, + onChanged: (value) { + ref + .read( + markEpisodeAsSeenTypeStateProvider.notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index], + title: Row( + children: [Text("${values[index]}%")], + ), + ); + }, + ), ), ), actions: [ @@ -241,27 +242,31 @@ class _PlayerScreenState extends ConsumerState { ), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index], - groupValue: defaultDoubleTapToSkipLength, - onChanged: (value) { - ref - .read( - defaultDoubleTapToSkipLengthStateProvider - .notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text("${values[index]}s")]), - ); + child: RadioGroup( + groupValue: defaultDoubleTapToSkipLength, + onChanged: (value) { + ref + .read( + defaultDoubleTapToSkipLengthStateProvider + .notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index], + title: Row( + children: [Text("${values[index]}s")], + ), + ); + }, + ), ), ), actions: [ @@ -300,27 +305,30 @@ class _PlayerScreenState extends ConsumerState { title: Text(context.l10n.default_playback_speed_length), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index], - groupValue: defaultPlayBackSpeed, - onChanged: (value) { - ref - .read( - defaultPlayBackSpeedStateProvider - .notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row(children: [Text("x${values[index]}")]), - ); + child: RadioGroup( + groupValue: defaultPlayBackSpeed, + onChanged: (value) { + ref + .read( + defaultPlayBackSpeedStateProvider.notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index], + title: Row( + children: [Text("x${values[index]}")], + ), + ); + }, + ), ), ), actions: [ @@ -408,29 +416,31 @@ class _PlayerScreenState extends ConsumerState { ), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index], - groupValue: aniSkipTimeoutLength, - onChanged: (value) { - ref - .read( - aniSkipTimeoutLengthStateProvider - .notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [Text("${values[index]}s")], - ), - ); + child: RadioGroup( + groupValue: aniSkipTimeoutLength, + onChanged: (value) { + ref + .read( + aniSkipTimeoutLengthStateProvider + .notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index], + title: Row( + children: [Text("${values[index]}s")], + ), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/reader/reader_screen.dart b/lib/modules/more/settings/reader/reader_screen.dart index 6a36542a..b72e32c6 100644 --- a/lib/modules/more/settings/reader/reader_screen.dart +++ b/lib/modules/more/settings/reader/reader_screen.dart @@ -39,35 +39,35 @@ class ReaderScreen extends ConsumerWidget { title: Text(context.l10n.default_reading_mode), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: ReaderMode.values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: ReaderMode.values[index], - groupValue: defaultReadingMode, - onChanged: (value) { - ref - .read( - defaultReadingModeStateProvider.notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - getReaderModeName( - ReaderMode.values[index], - context, - ), - ), - ], - ), - ); + child: RadioGroup( + groupValue: defaultReadingMode, + onChanged: (value) { + ref + .read(defaultReadingModeStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: ReaderMode.values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: ReaderMode.values[index], + title: Row( + children: [ + Text( + getReaderModeName( + ReaderMode.values[index], + context, + ), + ), + ], + ), + ); + }, + ), ), ), actions: [ @@ -105,31 +105,32 @@ class ReaderScreen extends ConsumerWidget { title: Text(context.l10n.double_tap_animation_speed), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: 3, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: index, - groupValue: doubleTapAnimationSpeed, - onChanged: (value) { - ref - .read( - doubleTapAnimationSpeedStateProvider - .notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text(getAnimationSpeedName(index, context)), - ], - ), - ); + child: RadioGroup( + groupValue: doubleTapAnimationSpeed, + onChanged: (value) { + ref + .read( + doubleTapAnimationSpeedStateProvider.notifier, + ) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: 3, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + title: Row( + children: [ + Text(getAnimationSpeedName(index, context)), + ], + ), + ); + }, + ), ), ), actions: [ @@ -167,33 +168,35 @@ class ReaderScreen extends ConsumerWidget { title: Text(context.l10n.background_color), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: BackgroundColor.values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: BackgroundColor.values[index], - groupValue: backgroundColor, - onChanged: (value) { - ref - .read(backgroundColorStateProvider.notifier) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - getBackgroundColorName( - BackgroundColor.values[index], - context, - ), - ), - ], - ), - ); + child: RadioGroup( + groupValue: backgroundColor, + onChanged: (value) { + ref + .read(backgroundColorStateProvider.notifier) + .set(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: BackgroundColor.values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: BackgroundColor.values[index], + title: Row( + children: [ + Text( + getBackgroundColorName( + BackgroundColor.values[index], + context, + ), + ), + ], + ), + ); + }, + ), ), ), actions: [ @@ -301,32 +304,34 @@ class ReaderScreen extends ConsumerWidget { title: Text(context.l10n.scale_type), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: getScaleTypeNames(context).length, - itemBuilder: (context, index) { - return RadioListTile( - // dense: true, - contentPadding: const EdgeInsets.all(0), - value: index, - groupValue: scaleType.index, - onChanged: (value) { - ref - .read(scaleTypeStateProvider.notifier) - .set(ScaleType.values[value!]); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - getScaleTypeNames( - context, - )[index].toString(), - ), - ], - ), - ); + child: RadioGroup( + groupValue: scaleType.index, + onChanged: (value) { + ref + .read(scaleTypeStateProvider.notifier) + .set(ScaleType.values[value!]); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: getScaleTypeNames(context).length, + itemBuilder: (context, index) { + return RadioListTile( + // dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + title: Row( + children: [ + Text( + getScaleTypeNames( + context, + )[index].toString(), + ), + ], + ), + ); + }, + ), ), ), actions: [ diff --git a/lib/modules/more/settings/sync/sync.dart b/lib/modules/more/settings/sync/sync.dart index db68dbf6..97f01536 100644 --- a/lib/modules/more/settings/sync/sync.dart +++ b/lib/modules/more/settings/sync/sync.dart @@ -65,30 +65,30 @@ class SyncScreen extends ConsumerWidget { title: Text(l10n.sync_auto), content: SizedBox( width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: autoSyncOptions.length, - itemBuilder: (context, index) { - final optionName = autoSyncOptions.keys - .elementAt(index); - final optionValue = autoSyncOptions.values - .elementAt(index); - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: optionValue, - groupValue: syncPreference.autoSyncFrequency, - onChanged: (value) { - ref - .read( - synchingProvider(syncId: 1).notifier, - ) - .setAutoSyncFrequency(value!); - Navigator.pop(context); - }, - title: Text(optionName), - ); + child: RadioGroup( + groupValue: syncPreference.autoSyncFrequency, + onChanged: (value) { + ref + .read(synchingProvider(syncId: 1).notifier) + .setAutoSyncFrequency(value!); + Navigator.pop(context); }, + child: SuperListView.builder( + shrinkWrap: true, + itemCount: autoSyncOptions.length, + itemBuilder: (context, index) { + final optionName = autoSyncOptions.keys + .elementAt(index); + final optionValue = autoSyncOptions.values + .elementAt(index); + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: optionValue, + title: Text(optionName), + ); + }, + ), ), ), actions: [ diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 3cb86648..cafe10dc 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -164,7 +164,7 @@ SPEC CHECKSUMS: flutter_inappwebview_macos: c2d68649f9f8f1831bfcd98d73fd6256366d9d1d flutter_qjs: cb2d0cba9deade1d03b89f6c432eac126f39482a flutter_web_auth_2: 62b08da29f15a20fa63f144234622a1488d45b65 - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 isar_flutter_libs: a65381780401f81ad6bf3f2e7cd0de5698fb98c4 just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed media_kit_libs_macos_video: 85a23e549b5f480e72cae3e5634b5514bc692f65 From de3829d26c575775be760294f673c862c9b31e36 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:39:33 +0100 Subject: [PATCH 068/100] fix --- .../manga/detail/widgets/tracker_widget.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/modules/manga/detail/widgets/tracker_widget.dart b/lib/modules/manga/detail/widgets/tracker_widget.dart index 95cefb4d..dab8bc26 100644 --- a/lib/modules/manga/detail/widgets/tracker_widget.dart +++ b/lib/modules/manga/detail/widgets/tracker_widget.dart @@ -203,6 +203,19 @@ class _TrackerWidgetState extends ConsumerState { dense: true, contentPadding: const EdgeInsets.all(0), value: status, + // ignore: deprecated_member_use + onChanged: (value) { + ref + .read( + trackStateProvider( + track: widget.trackRes + ..status = status, + itemType: widget.itemType, + ).notifier, + ) + .updateManga(); + Navigator.pop(context); + }, title: Text( getTrackStatus(status, context), ), From 61575f4795b619aa73e5e9f05b22d493f346f9ea Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 24 Aug 2025 17:01:52 +0200 Subject: [PATCH 069/100] added Simkl tracker - reverted dependency versions - force workflow to use older flutter version --- .github/workflows/release.yml | 6 + assets/trackers_icons/tracker_simkl.png | Bin 0 -> 1774 bytes .../providers/track_state_providers.dart | 13 +- .../providers/track_state_providers.g.dart | 2 +- .../settings/track/myanimelist/model.dart | 2 +- lib/modules/more/settings/track/track.dart | 38 +- .../tracker_library_screen.dart | 49 +- lib/services/trackers/anilist.dart | 11 +- lib/services/trackers/anilist.g.dart | 2 +- lib/services/trackers/base_tracker.dart | 20 + lib/services/trackers/kitsu.dart | 19 +- lib/services/trackers/kitsu.g.dart | 2 +- lib/services/trackers/myanimelist.dart | 21 +- lib/services/trackers/myanimelist.g.dart | 2 +- lib/services/trackers/simkl.dart | 419 ++++++++++++++++++ lib/services/trackers/simkl.g.dart | 194 ++++++++ lib/utils/constant.dart | 7 +- pubspec.lock | 61 ++- pubspec.yaml | 6 +- 19 files changed, 824 insertions(+), 50 deletions(-) create mode 100644 assets/trackers_icons/tracker_simkl.png create mode 100644 lib/services/trackers/base_tracker.dart create mode 100644 lib/services/trackers/simkl.dart create mode 100644 lib/services/trackers/simkl.g.dart diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3b36983..2bf8a7e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -100,6 +101,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -156,6 +158,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -199,6 +202,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -266,6 +270,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -406,6 +411,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable diff --git a/assets/trackers_icons/tracker_simkl.png b/assets/trackers_icons/tracker_simkl.png new file mode 100644 index 0000000000000000000000000000000000000000..a06caf3f4b0d02d8eda9ae4fe0a853df6730cf3a GIT binary patch literal 1774 zcmb7E`8V5%7B{1{)wg{eZG~vL2hT0ueKu#`%r`+FjZWPf*87#SHZ+}YaP6iCD(9*-ya zyeE}PM50fNi##L}X@#=7U~s;*wY9XgbaHZ>zp_+U_k3`$AFO^lHa14Ew%*v-ps%k# zHa2qU5|qKHLZi{sWki zsHF+Q<8j6p&pmpS;OyiW5*+k{Vd0jHjGU6a)iu``>RO@a%@xEc8xLotqb|^Jm6Hjn zI$FJMQYrDOy&LBgHqHX}eR` z*sL;ZWA%7c?tIwTRwS9-^Rc;4*FD;TcpZ+7#3l@gta1X9>PB#-?B#Xdl_Q*}na%X5 z7C|Q7rRsine7kf?AmGn5h1ME~EV4lF?~T%&q8+^kvUWfppl=EpRf#%(r1=|C_#1k> zrrUO_Z-gqXzd+Og8)Bh3{3Z zCp=WS$BSo#UV|SSD?jdAtaSD^TzryLq+9NkzMlHG#x&DzkdwuooGi%-Rvf|29qnV# z;fto=-}95r(+ylYbppF#GuipoCtQZ=`-jPK_}Y)T4?X_y4yxgDD=*yd=sq~rSNmS& zJ(*VLyQ8i=82TGLZZ7|^NxAXV(fg4Pn5@M4<@xQfSrVz8V_I<@S!buOYg?xC`^#90 zoBCb?#P?6&o#0n($)fqS&S0ORzm~~F(x>tg9@pDyr8(5v?N*nn8SCs>BVgg4PSV-Y zdd&~@!4S2y2(}rRa}x?`FcTMhm>rC9u1QBRLIl}EkK(L7OijJ?6Y?7}E=ajp4iDrx zXYJsUssmun9d;Anc+v4L*F8}9vWYu>p_DfHC5PS9Yf4@hLVp2R@~^=w?Q6^6vrHWB zt)Jz5HF2Dh*Ch`^6>IPbPFoil+efG^rDuK&!Zg$83;p}PvMod`be#MiiSoP>&gzvU zkx0a`2+Nvzkx*RYE$xY&7DA||P|%3idN$zMdo0%gJkdWQPAc;9kCA1RM6X4~avMEe zVN@>Z%HNu0mZvq?y5)=z_wQ3n-sNVmevTr;)hWKFMsNQD&1^af=4FeLhTJe${VZ}m z0VY}5KF=!6{~L_ao2@cLP-hRX4E=7!7oq1YoN>8ItC&i~!-yEJQDAioo$iem zAatkYOA^-pv_W{j&IX}s2tb81B&r8Ip`~s9bI-{LUGIf3ys|A*Z9CD3v_D)bf?IQv zro!@J#Z~urA3mVQTb?+R*2&E2BAdd=)VrwSxWkeD|69DRP3SoHCY|2jKsGDt8sFX8 z&wJuL<#mrW*Rr{$%y(zqt(x@pf#kb`mC)*J4>m+ICarLT`%52KWmQrp>IFqL={+!Y zMq{G$%C`^fFuDasp@ARPw>Lt*!i^1?^C;#a?(8uL&9{q{fKn+s4fq9jXXwQR_3_A< zbat$Y@+C>v#weL4w;jn5+1z8&DyT2(O&fY3&B-A1aGv7w>#+Xc0JZ3?b^QmgHdX<} zf*0$w`nF7+j9axQ7CP_z-}sDQ0r-5gZwSzt;#-+W$0AV2RYxvE)mH?CnH%$a?6g#} zKd045?YQLYusTBXtH?V5+kt)ba|J!6RwFG1>Aux*7qGoG(%t^ZXQ^&z&Z%b=5HlTK z*7`TyC}_ECG!@*IpW1<4VFhCMdaEBkhEIfvda&y8ouytgG%-anm=6FYR&DPJ{{#N@Z|_I4Q5BY0Vm!aAryD8pt;P)cp literal 0 HcmV?d00001 diff --git a/lib/modules/manga/detail/providers/track_state_providers.dart b/lib/modules/manga/detail/providers/track_state_providers.dart index 8dce1d4a..4f537d15 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.dart @@ -6,8 +6,10 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/modules/tracker_library/tracker_library_screen.dart'; import 'package:mangayomi/services/trackers/anilist.dart'; +import 'package:mangayomi/services/trackers/base_tracker.dart'; import 'package:mangayomi/services/trackers/kitsu.dart'; import 'package:mangayomi/services/trackers/myanimelist.dart'; +import 'package:mangayomi/services/trackers/simkl.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'track_state_providers.g.dart'; @@ -18,7 +20,7 @@ class TrackState extends _$TrackState { return track!; } - dynamic getNotifier(int syncId) { + BaseTracker getNotifier(int syncId) { return switch (syncId) { 1 => ref.read( myAnimeListProvider(syncId: syncId, itemType: itemType).notifier, @@ -27,6 +29,7 @@ class TrackState extends _$TrackState { anilistProvider(syncId: syncId, itemType: itemType).notifier, ), 3 => ref.read(kitsuProvider(syncId: syncId, itemType: itemType).notifier), + 4 => ref.read(simklProvider(syncId: syncId, itemType: itemType).notifier), _ => throw Exception('Unsupported syncId: $syncId'), }; } @@ -106,13 +109,15 @@ class TrackState extends _$TrackState { ); final tracker = getNotifier(syncId); - if (syncId == 1) { + if (syncId == TrackerProviders.myAnimeList.syncId) { findManga = await tracker.findLibItem(newTrack, _isManga); - } else if (syncId == 2) { + } else if (syncId == TrackerProviders.anilist.syncId) { findManga = await tracker.findLibItem(newTrack, _isManga); findManga ??= await tracker.update(newTrack, _isManga); - } else if (syncId == 3) { + } else if (syncId == TrackerProviders.kitsu.syncId) { findManga = await tracker.update(newTrack, _isManga); + } else if (syncId == TrackerProviders.simkl.syncId) { + findManga = await tracker.findLibItem(newTrack, _isManga); } writeBack(findManga!); } diff --git a/lib/modules/manga/detail/providers/track_state_providers.g.dart b/lib/modules/manga/detail/providers/track_state_providers.g.dart index 480b14d7..ba38398f 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.g.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_state_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$trackStateHash() => r'b70770f8524a0d9059ffd3f52b42634c16672a0f'; +String _$trackStateHash() => r'a96b4e702c16304cb16604d6b2d7dca5d65ca8b0'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/track/myanimelist/model.dart b/lib/modules/more/settings/track/myanimelist/model.dart index 06890cf8..daa4300f 100644 --- a/lib/modules/more/settings/track/myanimelist/model.dart +++ b/lib/modules/more/settings/track/myanimelist/model.dart @@ -15,7 +15,7 @@ class OAuth { OAuth.fromJson(Map json) { tokenType = json['token_type']; - expiresIn = json['expires_in'] as int; + expiresIn = json['expires_in'] as int?; accessToken = json['access_token']; refreshToken = json['refresh_token']; clientId = json['client_id']; diff --git a/lib/modules/more/settings/track/track.dart b/lib/modules/more/settings/track/track.dart index 5d2ff978..563d6df9 100644 --- a/lib/modules/more/settings/track/track.dart +++ b/lib/modules/more/settings/track/track.dart @@ -7,10 +7,12 @@ import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart'; import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; +import 'package:mangayomi/modules/tracker_library/tracker_library_screen.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/services/trackers/anilist.dart'; import 'package:mangayomi/services/trackers/kitsu.dart'; import 'package:mangayomi/services/trackers/myanimelist.dart'; +import 'package:mangayomi/services/trackers/simkl.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class TrackScreen extends ConsumerWidget { @@ -65,16 +67,22 @@ class TrackScreen extends ConsumerWidget { ), TrackListile( onTap: () async { - await ref.read(anilistProvider(syncId: 2).notifier).login(); + await ref + .read( + anilistProvider( + syncId: TrackerProviders.anilist.syncId, + ).notifier, + ) + .login(); }, - id: 2, + id: TrackerProviders.anilist.syncId, entries: entries!, ), TrackListile( onTap: () async { _showDialogLogin(context, ref); }, - id: 3, + id: TrackerProviders.kitsu.syncId, entries: entries, ), TrackListile( @@ -82,13 +90,27 @@ class TrackScreen extends ConsumerWidget { await ref .read( myAnimeListProvider( - syncId: 1, + syncId: TrackerProviders.myAnimeList.syncId, itemType: null, ).notifier, ) .login(); }, - id: 1, + id: TrackerProviders.myAnimeList.syncId, + entries: entries, + ), + TrackListile( + onTap: () async { + await ref + .read( + simklProvider( + syncId: TrackerProviders.simkl.syncId, + itemType: null, + ).notifier, + ) + .login(); + }, + id: TrackerProviders.simkl.syncId, entries: entries, ), ListTile( @@ -231,7 +253,11 @@ void _showDialogLogin(BuildContext context, WidgetRef ref) { isLoading = true; }); final res = await ref - .read(kitsuProvider(syncId: 3).notifier) + .read( + kitsuProvider( + syncId: TrackerProviders.kitsu.syncId, + ).notifier, + ) .login(email, password); if (!res.$1) { setState(() { diff --git a/lib/modules/tracker_library/tracker_library_screen.dart b/lib/modules/tracker_library/tracker_library_screen.dart index 4affe1ba..8000d7b5 100644 --- a/lib/modules/tracker_library/tracker_library_screen.dart +++ b/lib/modules/tracker_library/tracker_library_screen.dart @@ -24,7 +24,7 @@ enum TrackerProviders { myAnimeList(syncId: 1, name: "MAL"), anilist(syncId: 2, name: "AL"), kitsu(syncId: 3, name: "Kitsu"), - trakt(syncId: 4, name: "Trakt"); + simkl(syncId: 4, name: "Simkl"); const TrackerProviders({required this.syncId, required this.name}); @@ -68,6 +68,7 @@ class _TrackerLibraryScreenState extends ConsumerState { 1 => _sectionsMAL(trackerProvider.syncId, itemType), 2 => _sectionsAL(trackerProvider.syncId, itemType), 3 => _sectionsKitsu(trackerProvider.syncId, itemType), + 4 => _sectionsSimkl(trackerProvider.syncId, itemType), _ => [], }; if (_isSearch && _query.isNotEmpty) { @@ -211,6 +212,47 @@ class _TrackerLibraryScreenState extends ConsumerState { setState(() {}); } + List _sectionsSimkl(int syncId, ItemType itemType) { + return [ + TrackLibrarySection( + name: "Continue watching movies", + syncId: syncId, + func: _fetchUserData(syncId, ItemType.manga), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Continue watching series", + syncId: syncId, + func: _fetchUserData(syncId, ItemType.anime), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Trending Movies", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.manga), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Trending Series", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.anime), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Airing Series", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.anime, rankingType: "airing"), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Top Series (All Time)", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.anime, rankingType: "best"), + itemType: ItemType.anime, + ), + ]; + } + List _sectionsMAL(int syncId, ItemType itemType) { return itemType == ItemType.anime ? [ @@ -505,6 +547,7 @@ class _TrackerLibraryScreenState extends ConsumerState { _getListile(l10n, TrackerProviders.myAnimeList.syncId), _getListile(l10n, TrackerProviders.anilist.syncId), _getListile(l10n, TrackerProviders.kitsu.syncId), + _getListile(l10n, TrackerProviders.simkl.syncId), ], ), ), @@ -561,13 +604,13 @@ class _TrackerLibraryScreenState extends ConsumerState { ), enabled: isLoggedIn, onTap: () { - if (isManga == null) { + if (isManga == null && syncId != TrackerProviders.simkl.syncId) { context.pop(); _openSwitchTypeDialog(l10n, syncId); } else { ref.read(lastTrackerLibraryLocationStateProvider.notifier).set(( syncId, - isManga, + isManga ?? true, )); context.pop(); } diff --git a/lib/services/trackers/anilist.dart b/lib/services/trackers/anilist.dart index f926897e..7cf9ce95 100644 --- a/lib/services/trackers/anilist.dart +++ b/lib/services/trackers/anilist.dart @@ -10,11 +10,12 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'base_tracker.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'anilist.g.dart'; @riverpod -class Anilist extends _$Anilist { +class Anilist extends _$Anilist implements BaseTracker { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); static final _isDesktop = Platform.isWindows || Platform.isLinux; final String _clientId = _isDesktop ? '13587' : '13588'; @@ -77,6 +78,7 @@ class Anilist extends _$Anilist { } } + @override Future update(Track track, bool isManga) async { final isNew = track.libraryId == null; final opName = isNew ? 'AddEntry' : 'UpdateEntry'; @@ -114,6 +116,7 @@ class Anilist extends _$Anilist { return track; } + @override Future> search(String search, bool isManga) async { final type = isManga ? "MANGA" : "ANIME"; final contentUnit = isManga ? "chapters" : "episodes"; @@ -169,6 +172,7 @@ class Anilist extends _$Anilist { .toList(); } + @override Future findLibItem(Track track, bool isManga) async { final userId = int.parse( ref.read(tracksProvider(syncId: syncId))!.username!, @@ -225,6 +229,7 @@ class Anilist extends _$Anilist { ..totalChapter = jsonRes['media'][contentUnit] as int? ?? 0; } + @override Future> fetchGeneralData({ bool isManga = true, String rankingType = @@ -284,6 +289,7 @@ class Anilist extends _$Anilist { .toList(); } + @override Future> fetchUserData({bool isManga = true}) async { final userId = int.parse( ref.read(tracksProvider(syncId: syncId))!.username!, @@ -454,6 +460,7 @@ class Anilist extends _$Anilist { }; } + @override List statusList(bool isManga) => [ isManga ? TrackStatus.reading : TrackStatus.watching, TrackStatus.completed, @@ -497,6 +504,7 @@ class Anilist extends _$Anilist { return {"year": date.year, "month": date.month, "day": date.day}; } + @override String displayScore(int score) { final prefs = isar.trackPreferences.getSync(syncId)!.prefs; final scoreFormat = jsonDecode(prefs!)['scoreFormat']; @@ -515,6 +523,7 @@ class Anilist extends _$Anilist { }; } + @override (int, int) getScoreValue() { final prefs = isar.trackPreferences.getSync(syncId)!.prefs; String scoreFormat = jsonDecode(prefs!)['scoreFormat']; diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index 96c9f674..a98d94c2 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'fafb964252b3a5741e981cb8c2f0f2090b3b86ae'; +String _$anilistHash() => r'9294cd3486dd6dab50593cc367045b683a5be802'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/base_tracker.dart b/lib/services/trackers/base_tracker.dart new file mode 100644 index 00000000..27bbe3c6 --- /dev/null +++ b/lib/services/trackers/base_tracker.dart @@ -0,0 +1,20 @@ +import 'package:mangayomi/models/track.dart'; +import 'package:mangayomi/models/track_search.dart'; + +abstract class BaseTracker { + Future findLibItem(Track track, bool isManga); + Future update(Track track, bool isManga); + List statusList(bool isManga); + Future> search(String query, bool isManga); + Future> fetchGeneralData({ + bool isManga, + String rankingType, + }); + Future> fetchUserData({bool isManga}); + + /// Anilist + (int, int) getScoreValue(); + + /// Anilist + String displayScore(int score); +} diff --git a/lib/services/trackers/kitsu.dart b/lib/services/trackers/kitsu.dart index 384c32c1..8b6be211 100644 --- a/lib/services/trackers/kitsu.dart +++ b/lib/services/trackers/kitsu.dart @@ -9,11 +9,12 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'base_tracker.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'kitsu.g.dart'; @riverpod -class Kitsu extends _$Kitsu { +class Kitsu extends _$Kitsu implements BaseTracker { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final String _clientId = 'dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd'; @@ -76,6 +77,7 @@ class Kitsu extends _$Kitsu { } } + @override Future update(Track track, bool isManga) async { final isNew = track.libraryId == null; final String? userId = isNew ? _getUserId() : null; @@ -127,6 +129,7 @@ class Kitsu extends _$Kitsu { return track; } + @override Future> search(String search, bool isManga) async { final accessToken = _getAccessToken(); @@ -175,6 +178,7 @@ class Kitsu extends _$Kitsu { .toList(); } + @override Future> fetchGeneralData({ bool isManga = true, String rankingType = "popularityRank", @@ -215,6 +219,7 @@ class Kitsu extends _$Kitsu { }).toList(); } + @override Future> fetchUserData({bool isManga = true}) async { final type = isManga ? "manga" : "anime"; final userId = _getUserId(); @@ -271,6 +276,7 @@ class Kitsu extends _$Kitsu { return result; } + @override Future findLibItem(Track track, bool isManga) async { final type = isManga ? "manga" : "anime"; final userId = _getUserId(); @@ -374,6 +380,7 @@ class Kitsu extends _$Kitsu { }; } + @override List statusList(bool isManga) => [ isManga ? TrackStatus.reading : TrackStatus.watching, TrackStatus.completed, @@ -411,4 +418,14 @@ class Kitsu extends _$Kitsu { String? _toKitsuScore(int score) { return score > 0 ? (score * 2).toString() : null; } + + @override + String displayScore(int score) { + throw UnimplementedError(); + } + + @override + (int, int) getScoreValue() { + throw UnimplementedError(); + } } diff --git a/lib/services/trackers/kitsu.g.dart b/lib/services/trackers/kitsu.g.dart index 6e6ce22a..645e9d65 100644 --- a/lib/services/trackers/kitsu.g.dart +++ b/lib/services/trackers/kitsu.g.dart @@ -6,7 +6,7 @@ part of 'kitsu.dart'; // RiverpodGenerator // ************************************************************************** -String _$kitsuHash() => r'd46b955c92bc4d7382d32e17827da2e2b3a8434f'; +String _$kitsuHash() => r'3f6af42dd0bb3fe543197db692598384ca5cc95f'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index eb7c9a8b..000c81fa 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -12,11 +12,12 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'base_tracker.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'myanimelist.g.dart'; @riverpod -class MyAnimeList extends _$MyAnimeList { +class MyAnimeList extends _$MyAnimeList implements BaseTracker { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); static const _baseOAuthUrl = 'https://myanimelist.net/v1/oauth2'; static const _baseApiUrl = 'https://api.myanimelist.net/v2'; @@ -118,6 +119,7 @@ class MyAnimeList extends _$MyAnimeList { ); } + @override Future> search(String query, isManga) async { final accessToken = await _getAccessToken(); final url = Uri.parse( @@ -170,6 +172,7 @@ class MyAnimeList extends _$MyAnimeList { ); } + @override Future> fetchGeneralData({ bool isManga = true, String rankingType = "airing", @@ -209,6 +212,7 @@ class MyAnimeList extends _$MyAnimeList { }).toList(); } + @override Future> fetchUserData({bool isManga = true}) async { final accessToken = await _getAccessToken(); final item = isManga ? "mangalist" : "animelist"; @@ -292,6 +296,7 @@ class MyAnimeList extends _$MyAnimeList { }; } + @override List statusList(bool isManga) => [ isManga ? TrackStatus.reading : TrackStatus.watching, TrackStatus.completed, @@ -349,7 +354,8 @@ class MyAnimeList extends _$MyAnimeList { return jsonDecode(response.body)['name']; } - Future findLibItem(Track track, bool isManga) async { + @override + Future findLibItem(Track track, bool isManga) async { final type = isManga ? "manga" : "anime"; final contentUnit = isManga ? 'num_chapters' : 'num_episodes'; final accessToken = await _getAccessToken(); @@ -391,6 +397,7 @@ class MyAnimeList extends _$MyAnimeList { return date.millisecondsSinceEpoch; } + @override Future update(Track track, bool isManga) async { final accessToken = await _getAccessToken(); final formBody = { @@ -431,4 +438,14 @@ class MyAnimeList extends _$MyAnimeList { headers: {'Authorization': 'Bearer $accessToken'}, ); } + + @override + String displayScore(int score) { + throw UnimplementedError(); + } + + @override + (int, int) getScoreValue() { + throw UnimplementedError(); + } } diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index 7bdbfcf3..6a4e72bb 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'739c836ddbfc7c2c2b7593304f481e8d35074391'; +String _$myAnimeListHash() => r'9846f76ce69f952d20cc1e8edbc5ca565cd4e7c9'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/simkl.dart b/lib/services/trackers/simkl.dart new file mode 100644 index 00000000..e4291bb5 --- /dev/null +++ b/lib/services/trackers/simkl.dart @@ -0,0 +1,419 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_qjs/quickjs/ffi.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:http_interceptor/http_interceptor.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/track.dart'; +import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/models/track_search.dart'; +import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; +import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; +import 'package:mangayomi/services/http/m_client.dart'; +import 'base_tracker.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'simkl.g.dart'; + +@riverpod +class Simkl extends _$Simkl implements BaseTracker { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + static const _baseOAuthUrl = 'https://simkl.com/oauth'; + static const _baseApiUrl = 'https://api.simkl.com'; + static final _isDesktop = (Platform.isWindows || Platform.isLinux); + static const _redirectUri = 'http://localhost:43824'; + static const _clientId = + '1e0a52930b1bdface4e30c1a94a44641475f3c80b69a5ea939562153fccffb68'; + static const _clientSecret = + 'aed1dc0fa8b9906c493b87c513b430fde75ea5cdad0087e8d129fbc5d36f9be0'; + + String getFallbackClientId(String usedId) { + return _clientId; + } + + @override + void build({required int syncId, required ItemType? itemType}) {} + + Future login() async { + final callbackUrlScheme = _isDesktop + ? 'http://localhost:43824' + : 'mangayomi'; + final loginUrl = _authUrl(); + + try { + final uri = await FlutterWebAuth2.authenticate( + url: "$loginUrl&redirect_uri=$callbackUrlScheme", + callbackUrlScheme: callbackUrlScheme, + ); + final code = Uri.parse(uri).queryParameters['code']; + if (code == null) return null; + + final oAuthData = await _getOAuth(code); + final oAuth = _buildOAuth(oAuthData, _clientId); + final username = await _getUserName(oAuth.accessToken!); + _saveOAuth(username, oAuth); + + return true; + } catch (_) { + return false; + } + } + + @override + Future> fetchGeneralData({ + bool isManga = true, + String rankingType = "trending", + }) async { + /// isManga <> isMovie + final type = isManga ? "movies" : "tv"; + final accessToken = await _getAccessToken(); + final url = Uri.parse('$_baseApiUrl/$type/$rankingType').replace( + queryParameters: { + 'extended': 'overview', + if (rankingType == "airing") 'date': 'today', + if (rankingType == "airing") 'sort': 'rank', + if (rankingType == "best") 'filter': 'all', + if (rankingType == "best") 'type': 'series', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as List?; + return data?.map((e) { + return TrackSearch( + mediaId: e['ids']?['simkl_id'] ?? e['ids']?['simkl'], + summary: e['overview'] ?? 'No summary available.', + totalChapter: 0, + coverUrl: e['fanart'] != null + ? 'https://wsrv.nl/?url=https://simkl.in/fanart/${e['fanart']}_medium.jpg' + : e['poster'] != null + ? 'https://wsrv.nl/?url=https://simkl.in/posters/${e['poster']}_m.webp' + : '', + title: e['title'] ?? 'Unknown Title', + score: (e["ratings"]?["simkl"]?["rating"] as num?)?.toDouble(), + startDate: e["release_date"] ?? "", + publishingType: isManga ? "movie" : "tv", + publishingStatus: e["status"], + trackingUrl: + "https://simkl.com/$type/${e['ids']?['simkl_id'] ?? e['ids']?['simkl']}", + syncId: syncId, + ); + }).toList() ?? + []; + } + + @override + Future> fetchUserData({bool isManga = true}) async { + final type = isManga ? "movies" : "shows"; + final nodeType = isManga ? "movie" : "show"; + final accessToken = await _getAccessToken(); + final url = Uri.parse('$_baseApiUrl/sync/all-items/$type'); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as Map?; + return (data?[type] as List?)?.map((e) { + final node = e[nodeType]; + return TrackSearch( + mediaId: node['ids']?['simkl'], + summary: 'No summary available.', + totalChapter: isManga ? 1 : e['total_episodes_count'], + coverUrl: node['poster'] != null + ? "https://wsrv.nl/?url=https://simkl.in/posters/${node['poster']}_m.jpg" + : "", + title: node['title'] ?? 'Unknown Title', + score: 0, + startDate: "", + publishingType: isManga ? "movie" : "tv", + publishingStatus: e["status"], + trackingUrl: "https://simkl.com/$type/${node['ids']?['simkl']}", + syncId: syncId, + ); + }).toList() ?? + []; + } + + @override + Future findLibItem(Track track, bool isManga) async { + final accessToken = await _getAccessToken(); + final url = Uri.parse( + '$_baseApiUrl/sync/watched/', + ).replace(queryParameters: {"extended": "episodes,specials,counters"}); + final result = await _makePostRequest(url, accessToken, [ + {"simkl": track.mediaId}, + ]); + final data = jsonDecode(result.body) as List?; + if ((data?.isNotEmpty ?? false) && + data!.firstOrNull?["result"] != "not_found") { + final node = data.firstOrNull; + if (node?["list"] is String) { + track.status = _trackFromSimklStatus(node!["list"]); + if (track.status == TrackStatus.completed && + node?["last_watched_at"] is String) { + track.finishedReadingDate = DateTime.tryParse( + node!["last_watched_at"], + )?.millisecondsSinceEpoch; + } + } + if (node?["episodes_watched"] is num) { + track.lastChapterRead = (node!["episodes_watched"] as num).toInt(); + } + if (node?["episodes_total"] is num) { + track.totalChapter = (node!["episodes_total"] as num).toInt(); + } + track.libraryId = 1; + if (node?["result"] == false) { + track.libraryId = 0; + return await update(track, isManga); + } + } + return track; + } + + @override + Future> search(String query, bool isManga) async { + final accessToken = await _getAccessToken(); + final urlMovies = Uri.parse('$_baseApiUrl/search/movies').replace( + queryParameters: { + 'q': query, + 'extended': 'full', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final resultMovies = await _makeGetRequest(urlMovies, accessToken); + final dataMovies = jsonDecode(resultMovies.body) as List?; + final movies = + dataMovies?.map((e) { + return TrackSearch( + mediaId: e['ids']?['simkl_id'] ?? e['ids']?['simkl'], + summary: e['overview'] ?? 'No summary available.', + totalChapter: 0, + coverUrl: e['poster'] != null + ? 'https://wsrv.nl/?url=https://simkl.in/posters/${e['poster']}_m.webp' + : '', + title: e['title'] ?? 'Unknown Title', + score: (e["ratings"]?["simkl"]?["rating"] as num?)?.toDouble(), + startDate: e["release_date"] ?? "", + publishingType: "movie", + publishingStatus: e["status"], + trackingUrl: + "https://simkl.com/movie/${e['ids']?['simkl_id'] ?? e['ids']?['simkl']}", + syncId: syncId, + ); + }).toList() ?? + []; + final urlSeries = Uri.parse('$_baseApiUrl/search/tv').replace( + queryParameters: { + 'q': query, + 'extended': 'full', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final resultSeries = await _makeGetRequest(urlSeries, accessToken); + final dataSeries = jsonDecode(resultSeries.body) as List?; + final series = + dataSeries?.map((e) { + return TrackSearch( + mediaId: e['ids']?['simkl_id'] ?? e['ids']?['simkl'], + summary: e['overview'] ?? 'No summary available.', + totalChapter: 0, + coverUrl: e['poster'] != null + ? 'https://wsrv.nl/?url=https://simkl.in/posters/${e['poster']}_m.webp' + : '', + title: e['title'] ?? 'Unknown Title', + score: (e["ratings"]?["simkl"]?["rating"] as num?)?.toDouble(), + startDate: e["release_date"] ?? "", + publishingType: "tv", + publishingStatus: e["status"], + trackingUrl: + "https://simkl.com/tv/${e['ids']?['simkl_id'] ?? e['ids']?['simkl']}", + syncId: syncId, + ); + }).toList() ?? + []; + return movies + series; + } + + @override + List statusList(bool isManga) => [ + TrackStatus.watching, + TrackStatus.completed, + TrackStatus.onHold, + TrackStatus.dropped, + TrackStatus.planToWatch, + ]; + + @override + Future update(Track track, bool isManga) async { + final accessToken = await _getAccessToken(); + final existRemote = track.libraryId == 1; + final isMovie = + track.trackingUrl?.replaceAll("https://simkl.com/", "").split("/")[0] == + "movie"; + final url = + Uri.parse( + existRemote + ? "$_baseApiUrl/sync/history" + : "$_baseApiUrl/sync/add-to-list", + ).replace( + queryParameters: { + 'extended': 'full', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final body = isMovie + ? { + 'movies': [ + { + if (!existRemote) 'to': _trackToSimklStatus(track), + if (existRemote) 'status': _trackToSimklStatus(track), + 'ids': {'simkl': track.mediaId}, + }, + ], + } + : { + 'shows': [ + { + if (!existRemote) 'to': _trackToSimklStatus(track), + if (existRemote) 'status': _trackToSimklStatus(track), + 'ids': {'simkl': track.mediaId}, + 'episodes': [ + for (int i = 1; i <= (track.lastChapterRead ?? 1); i++) + {'number': i}, + ], + }, + ], + }; + final result = await _makePostRequest(url, accessToken, body); + if (result.statusCode >= 200 && result.statusCode < 300) { + track.libraryId = 1; + } + if (result.statusCode == 201) { + return track; + } + final temp = (jsonDecode(result.body) as Map?)?["added"]; + final data = _extractTrackData( + temp?[isMovie ? "movies" : "shows"] as List?, + track.mediaId, + ); + return _parseTrack(track, data); + } + + Map? _extractTrackData(List? data, int? mediaId) { + return data?.firstWhereOrNull((e) => e["ids"]?["simkl"] == mediaId); + } + + Track _parseTrack(Track track, Map? data) { + if (data?["to"] is String) { + track.status = _trackFromSimklStatus(data!["to"]); + } + return track; + } + + String _trackToSimklStatus(Track track) => switch (track.status) { + TrackStatus.completed => "completed", + TrackStatus.watching => "watching", + TrackStatus.onHold => "hold", + TrackStatus.dropped => "dropped", + _ => "plantowatch", + }; + + TrackStatus _trackFromSimklStatus(String status) => switch (status) { + "completed" => TrackStatus.completed, + "watching" => TrackStatus.watching, + "hold" => TrackStatus.onHold, + "dropped" => TrackStatus.dropped, + _ => TrackStatus.planToWatch, + }; + + Future _getAccessToken() async { + final track = ref.read(tracksProvider(syncId: syncId)); + final mALOAuth = OAuth.fromJson( + jsonDecode(track!.oAuth!) as Map, + ); + return mALOAuth.accessToken!; + } + + OAuth _buildOAuth(Map json, String clientId) { + return OAuth.fromJson(json)..clientId = clientId; + } + + void _saveOAuth(String username, OAuth oAuth) { + ref + .read(tracksProvider(syncId: syncId).notifier) + .login( + TrackPreference( + syncId: syncId, + username: username, + prefs: "", + oAuth: jsonEncode(oAuth.toJson()), + ), + ); + } + + Future _getUserName(String accessToken) async { + final response = await _makeGetRequest( + Uri.parse('$_baseApiUrl/users/settings'), + accessToken, + ); + return "${jsonDecode(response.body)['account']['id']}"; + } + + String _authUrl() { + return '$_baseOAuthUrl/authorize?client_id=$_clientId&response_type=code'; + } + + Future _getOAuth(String code) async { + final params = { + 'code': code, + 'client_id': _clientId, + 'client_secret': _clientSecret, + 'redirect_uri': _redirectUri, + 'grant_type': 'authorization_code', + }; + final response = await http.post( + Uri.parse('$_baseApiUrl/oauth/token'), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode(params), + ); + return jsonDecode(response.body); + } + + Future _makeGetRequest(Uri url, String accessToken) async { + return await http.get( + url, + headers: { + 'Authorization': 'Bearer $accessToken', + 'simkl-api-key': _clientId, + 'Content-Type': 'application/json', + }, + ); + } + + Future _makePostRequest( + Uri url, + String accessToken, + Object? body, + ) async { + return await http.post( + url, + headers: { + 'Authorization': 'Bearer $accessToken', + 'simkl-api-key': _clientId, + 'Content-Type': 'application/json', + }, + body: jsonEncode(body), + ); + } + + @override + String displayScore(int score) { + throw UnimplementedError(); + } + + @override + (int, int) getScoreValue() { + throw UnimplementedError(); + } +} diff --git a/lib/services/trackers/simkl.g.dart b/lib/services/trackers/simkl.g.dart new file mode 100644 index 00000000..27abd3ed --- /dev/null +++ b/lib/services/trackers/simkl.g.dart @@ -0,0 +1,194 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'simkl.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$simklHash() => r'7385cd7925dff352509f1b51d4ab2eb6af733b15'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$Simkl extends BuildlessAutoDisposeNotifier { + late final int syncId; + late final ItemType? itemType; + + void build({ + required int syncId, + required ItemType? itemType, + }); +} + +/// See also [Simkl]. +@ProviderFor(Simkl) +const simklProvider = SimklFamily(); + +/// See also [Simkl]. +class SimklFamily extends Family { + /// See also [Simkl]. + const SimklFamily(); + + /// See also [Simkl]. + SimklProvider call({ + required int syncId, + required ItemType? itemType, + }) { + return SimklProvider( + syncId: syncId, + itemType: itemType, + ); + } + + @override + SimklProvider getProviderOverride( + covariant SimklProvider provider, + ) { + return call( + syncId: provider.syncId, + itemType: provider.itemType, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'simklProvider'; +} + +/// See also [Simkl]. +class SimklProvider extends AutoDisposeNotifierProviderImpl { + /// See also [Simkl]. + SimklProvider({ + required int syncId, + required ItemType? itemType, + }) : this._internal( + () => Simkl() + ..syncId = syncId + ..itemType = itemType, + from: simklProvider, + name: r'simklProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$simklHash, + dependencies: SimklFamily._dependencies, + allTransitiveDependencies: SimklFamily._allTransitiveDependencies, + syncId: syncId, + itemType: itemType, + ); + + SimklProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.syncId, + required this.itemType, + }) : super.internal(); + + final int syncId; + final ItemType? itemType; + + @override + void runNotifierBuild( + covariant Simkl notifier, + ) { + return notifier.build( + syncId: syncId, + itemType: itemType, + ); + } + + @override + Override overrideWith(Simkl Function() create) { + return ProviderOverride( + origin: this, + override: SimklProvider._internal( + () => create() + ..syncId = syncId + ..itemType = itemType, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + syncId: syncId, + itemType: itemType, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement createElement() { + return _SimklProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is SimklProvider && + other.syncId == syncId && + other.itemType == itemType; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, syncId.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 SimklRef on AutoDisposeNotifierProviderRef { + /// The parameter `syncId` of this provider. + int get syncId; + + /// The parameter `itemType` of this provider. + ItemType? get itemType; +} + +class _SimklProviderElement + extends AutoDisposeNotifierProviderElement with SimklRef { + _SimklProviderElement(super.provider); + + @override + int get syncId => (origin as SimklProvider).syncId; + @override + ItemType? get itemType => (origin as SimklProvider).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 diff --git a/lib/utils/constant.dart b/lib/utils/constant.dart index ac4dc606..42636d74 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -67,11 +67,16 @@ TrackStatus toTrackStatus(TrackStatus status, ItemType itemType, int syncId) { "Anilist", const Color.fromRGBO(51, 37, 50, 1), ), - _ => ( + 3 => ( "assets/trackers_icons/tracker_kitsu.webp", "Kitsu", const Color.fromRGBO(18, 25, 35, 1), ), + _ => ( + "assets/trackers_icons/tracker_simkl.png", + "Simkl", + const Color.fromARGB(255, 35, 15, 90), + ), }; } diff --git a/pubspec.lock b/pubspec.lock index cc2a35de..ce16b834 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,31 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "85.0.0" + version: "76.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" analyzer: dependency: "direct overridden" description: name: analyzer - sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "6.11.0" analyzer_plugin: dependency: "direct overridden" description: name: analyzer_plugin - sha256: dd574a0ab77de88b7d9c12bc4b626109a5ca9078216a79041a5c24c3a1bd103c + sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" url: "https://pub.dev" source: hosted - version: "0.13.7" + version: "0.11.3" antlr4: dependency: transitive description: @@ -519,10 +524,10 @@ packages: dependency: "direct main" description: name: flex_color_scheme - sha256: "034d5720747e6af39b2ad090d82dd92d33fde68e7964f1814b714c9d49ddbd64" + sha256: "3344f8f6536c6ce0473b98e9f084ef80ca89024ad3b454f9c32cf840206f4387" url: "https://pub.dev" source: hosted - version: "8.3.0" + version: "8.2.0" flex_seed_scheme: dependency: transitive description: @@ -1078,26 +1083,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.10" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" lints: dependency: transitive description: @@ -1114,6 +1119,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" + source: hosted + version: "0.1.3-main.0" marquee: dependency: "direct main" description: @@ -1159,7 +1172,7 @@ packages: dependency: transitive description: path: "libs/android/media_kit_libs_android_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: HEAD resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1168,7 +1181,7 @@ packages: dependency: transitive description: path: "libs/ios/media_kit_libs_ios_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: HEAD resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1177,7 +1190,7 @@ packages: dependency: transitive description: path: "libs/linux/media_kit_libs_linux" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: HEAD resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1186,7 +1199,7 @@ packages: dependency: transitive description: path: "libs/macos/media_kit_libs_macos_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: HEAD resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1204,7 +1217,7 @@ packages: dependency: transitive description: path: "libs/windows/media_kit_libs_windows_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: HEAD resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1891,10 +1904,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.4" time: dependency: transitive description: @@ -2035,10 +2048,10 @@ packages: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" video_player: dependency: transitive description: @@ -2265,4 +2278,4 @@ packages: version: "2.2.2" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.35.0" + flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml index 5107ce7c..b3cd8ec1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: html: ^0.15.5 font_awesome_flutter: ^10.8.0 expandable_text: ^2.3.0 - flex_color_scheme: ^8.3.0 + flex_color_scheme: ^8.1.0 extended_image: ^10.0.0 photo_view: ^0.15.0 grouped_list: ^6.0.0 @@ -107,14 +107,14 @@ dependencies: dependency_overrides: ffi: ^2.1.3 - analyzer: ^7.4.5 + analyzer: ">=5.2.0 <7.0.0" html: ^0.15.4 flutter_web_auth_2: git: url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git ref: 3.x-without-v1 path: flutter_web_auth_2 - analyzer_plugin: ^0.13.1 + analyzer_plugin: ^0.11.3 dev_dependencies: flutter_test: From b57015b6826c8884a35c581f1b86444697b4293b Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 24 Aug 2025 20:02:49 +0200 Subject: [PATCH 070/100] added watch order --- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 + lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + .../manga/detail/manga_detail_view.dart | 26 ++ .../detail/widgets/watch_order_screen.dart | 250 ++++++++++++++++++ lib/router/router.dart | 5 + lib/services/fetch_watch_order.dart | 116 ++++++++ 20 files changed, 446 insertions(+) create mode 100644 lib/modules/manga/detail/widgets/watch_order_screen.dart create mode 100644 lib/services/fetch_watch_order.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 71b82847..06f8bce0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -536,6 +536,7 @@ "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", "recommendations": "Recommendations", "recommendations_similarity": "Similarity:" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 883b44e8..55b7ec0f 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -3291,6 +3291,12 @@ abstract class AppLocalizations { /// **'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 @recommendations_similarity. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index b7d8d7c4..a0c77141 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1703,6 +1703,9 @@ class AppLocalizationsAr extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 9fa64799..8873eba1 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1705,6 +1705,9 @@ class AppLocalizationsAs extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 6b73cf41..9f8727e4 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1716,6 +1716,9 @@ class AppLocalizationsDe extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 759848d7..821db31c 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1704,6 +1704,9 @@ class AppLocalizationsEn extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 99553544..8e8398f6 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1721,6 +1721,9 @@ class AppLocalizationsEs extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index a737bba2..9c1288bc 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1722,6 +1722,9 @@ class AppLocalizationsFr extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 2d8a37f4..bc961804 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1706,6 +1706,9 @@ class AppLocalizationsHi extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 54d49255..d183d535 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1710,6 +1710,9 @@ class AppLocalizationsId extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 0106a1c0..4ee86a1e 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1719,6 +1719,9 @@ class AppLocalizationsIt extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index a418c7fb..cde6b8fa 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1718,6 +1718,9 @@ class AppLocalizationsPt extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 869f1e46..0aebcc56 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1720,6 +1720,9 @@ class AppLocalizationsRu extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 3082e05a..78e3f4a1 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1704,6 +1704,9 @@ class AppLocalizationsTh extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 6f62c41d..995a19d1 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1710,6 +1710,9 @@ class AppLocalizationsTr extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 895bd0fe..f12bd6e4 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1675,6 +1675,9 @@ class AppLocalizationsZh extends AppLocalizations { 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 recommendations_similarity => 'Similarity:'; } diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index d147c826..928e81cd 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1643,6 +1643,32 @@ class _MangaDetailViewState extends ConsumerState ), ), ), + const SizedBox(height: 15), + if (widget.manga!.itemType == ItemType.anime) + SizedBox( + width: context.width(1), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: OutlinedButton.icon( + style: ButtonStyle( + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + ), + ), + onPressed: () { + context.push( + "/watchOrder", + extra: widget.manga!.name, + ); + }, + label: Text(l10n.watch_order), + icon: Icon(Icons.arrow_right_alt_outlined), + ), + ), + ), + const SizedBox(height: 15), if (!context.isTablet) Column( children: [ diff --git a/lib/modules/manga/detail/widgets/watch_order_screen.dart b/lib/modules/manga/detail/widgets/watch_order_screen.dart new file mode 100644 index 00000000..56536e45 --- /dev/null +++ b/lib/modules/manga/detail/widgets/watch_order_screen.dart @@ -0,0 +1,250 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/fetch_watch_order.dart'; +import 'package:mangayomi/utils/constant.dart'; +import 'package:marquee/marquee.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class WatchOrderScreen extends StatefulWidget { + final String name; + + const WatchOrderScreen({super.key, required this.name}); + + @override + State createState() => _WatchOrderScreenState(); +} + +class _WatchOrderScreenState extends State { + String _errorMessage = ""; + bool _isLoading = true; + List? dataSearch; + List? data; + + @override + void initState() { + super.initState(); + _init(); + } + + Future _init() async { + try { + _errorMessage = ""; + dataSearch = await searchWatchOrder(widget.name); + if (mounted) { + setState(() { + _isLoading = false; + }); + } + } catch (e) { + if (mounted) { + setState(() { + _errorMessage = e.toString(); + _isLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Scaffold( + appBar: AppBar(title: Text(l10n.watch_order)), + body: Padding( + padding: EdgeInsetsGeometry.all(5), + child: _isLoading + ? const Center(child: CircularProgressIndicator()) + : Builder( + builder: (context) { + if (_errorMessage.isNotEmpty) { + return Center(child: Text(_errorMessage)); + } + final isSearch = dataSearch != null && dataSearch!.isNotEmpty; + final isWatchOrder = data != null && data!.isNotEmpty; + if (isSearch || isWatchOrder) { + return SuperListView.builder( + extentPrecalculationPolicy: SuperPrecalculationPolicy(), + itemCount: data?.length ?? dataSearch!.length, + itemBuilder: (context, index) { + final search = !isWatchOrder && isSearch + ? dataSearch![index] + : null; + final watchOrder = isWatchOrder ? data![index] : null; + return ListTile( + onTap: () async { + if (isWatchOrder) { + context.push( + '/globalSearch', + extra: ( + watchOrder!.nameEnglish ?? watchOrder.name, + ItemType.anime, + ), + ); + } else { + if (mounted) { + setState(() { + _isLoading = true; + _errorMessage = ""; + }); + data = await fetchWatchOrder(search!.id); + setState(() { + _isLoading = false; + }); + } + } + }, + title: Row( + children: [ + _thumbnailPreview( + context, + watchOrder?.image ?? search!.image, + ), + const SizedBox(width: 15), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle( + watchOrder?.name ?? search!.name, + context, + ), + if (watchOrder?.nameEnglish != null && + watchOrder?.nameEnglish != + watchOrder?.text) + Text( + watchOrder!.nameEnglish!, + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.clip, + ), + Text( + watchOrder?.text ?? + "${search!.type} - ${search.year}", + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.clip, + ), + ], + ), + ), + ], + ), + ); + }, + ); + } + return Center(child: Text(l10n.no_result)); + }, + ), + ), + ); + } + + Widget _buildTitle(String text, BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + // Make sure that (constraints.maxWidth - (35 + 5)) is strictly positive. + final double availableWidth = constraints.maxWidth - (35 + 5); + final textPainter = + TextPainter( + text: TextSpan(text: text, style: const TextStyle(fontSize: 13)), + maxLines: 1, + textDirection: TextDirection.ltr, + )..layout( + maxWidth: availableWidth > 0 ? availableWidth : 1.0, + ); // - Download icon size (download_page_widget.dart, Widget Build SizedBox width: 35) + + final isOverflowing = textPainter.didExceedMaxLines; + + if (isOverflowing) { + return SizedBox( + height: 20, + child: Marquee( + text: text, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold), + blankSpace: 40.0, + velocity: 30.0, + pauseAfterRound: const Duration(seconds: 1), + startPadding: 10.0, + ), + ); + } else { + return Text( + text, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + ); + } + }, + ); + } + + Widget _thumbnailPreview(BuildContext context, String? imageUrl) { + final imageProvider = CustomExtendedNetworkImageProvider( + toImgUrl(imageUrl ?? ""), + ); + return Padding( + padding: const EdgeInsets.all(3), + child: GestureDetector( + onTap: () { + _openImage(context, imageProvider); + }, + child: SizedBox( + width: 100, + height: 150, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + image: DecorationImage(image: imageProvider, fit: BoxFit.cover), + ), + ), + ), + ), + ); + } + + void _openImage(BuildContext context, ImageProvider imageProvider) { + showDialog( + context: context, + builder: (context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: Stack( + children: [ + GestureDetector( + onTap: () => Navigator.pop(context), + child: PhotoViewGallery.builder( + backgroundDecoration: const BoxDecoration( + color: Colors.transparent, + ), + itemCount: 1, + builder: (context, index) { + return PhotoViewGalleryPageOptions( + imageProvider: imageProvider, + minScale: PhotoViewComputedScale.contained, + maxScale: 2.0, + ); + }, + loadingBuilder: (context, event) { + return const ProgressCenter(); + }, + ), + ), + ], + ), + ); + }, + ); + } +} + +class SuperPrecalculationPolicy extends ExtentPrecalculationPolicy { + @override + bool shouldPrecalculateExtents(ExtentPrecalculationContext context) { + return context.numberOfItems < 100; + } +} diff --git a/lib/router/router.dart b/lib/router/router.dart index 9c4d1393..9dceecda 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -15,6 +15,7 @@ import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart'; import 'package:mangayomi/modules/calendar/calendar_screen.dart'; import 'package:mangayomi/modules/manga/detail/widgets/migrate_screen.dart'; import 'package:mangayomi/modules/manga/detail/widgets/recommendation_screen.dart'; +import 'package:mangayomi/modules/manga/detail/widgets/watch_order_screen.dart'; import 'package:mangayomi/modules/more/data_and_storage/create_backup.dart'; import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; @@ -256,6 +257,10 @@ class RouterNotifier extends ChangeNotifier { algorithmWeights: data.$3, ), ), + _genericRoute( + name: "watchOrder", + builder: (data) => WatchOrderScreen(name: data), + ), ]; GoRoute _genericRoute({ diff --git a/lib/services/fetch_watch_order.dart b/lib/services/fetch_watch_order.dart new file mode 100644 index 00000000..f3b1e1da --- /dev/null +++ b/lib/services/fetch_watch_order.dart @@ -0,0 +1,116 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:html/dom.dart'; +import 'package:mangayomi/services/http/m_client.dart'; +import 'package:mangayomi/utils/extensions/dom_extensions.dart'; + +Future> searchWatchOrder(String name) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final url = Uri.parse( + "https://chiaki.site/?/tools/autocomplete_series&term=$name", + ); + final res = await http.get( + url, + headers: { + "priority": "u=1, i", + "Referer": "https://chiaki.site/?/tools/watch_order", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final data = jsonDecode(res.body) as List?; + return data?.map((e) => WatchOrderSearch.fromJson(e)).toList() ?? []; + } catch (_) { + return []; + } +} + +Future> fetchWatchOrder(String id) async { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final res = await http.get( + Uri.parse("https://chiaki.site/?/tools/watch_order/id/$id"), + headers: { + "priority": "u=1, i", + "Referer": "https://chiaki.site/?/tools/watch_order", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + ); + final doc = Document.html(res.body); + return doc + .select("table > tbody > tr") + ?.map((e) { + final img = e.selectFirst("td > div.wo_avatar_big")?.outerHtml; + final startIdx = img?.indexOf("url('") ?? -1; + final endIdx = img?.indexOf("')", max(0, startIdx)) ?? -1; + return WatchOrderItem( + id: e.attr("data-id") ?? id, + anilistId: e.attr("data-anilist-id") ?? "", + image: startIdx != -1 && endIdx != -1 + ? "https://chiaki.site/${img?.substring(startIdx + 5, endIdx)}" + : "", + name: + e.selectFirst("td > span.wo_title")?.text ?? + "Unknown title", + nameEnglish: e.selectFirst("td > span.uk-text-small")?.text, + text: + e + .selectFirst("td > span.uk-text-muted.uk-text-small") + ?.text ?? + "", + ); + }) + .where((e) => e.name != "Unknown title") + .toList() ?? + []; + } catch (_) { + return []; + } +} + +class WatchOrderSearch { + final String id; + final String image; + final String type; + final String name; + final int year; + + WatchOrderSearch({ + required this.id, + required this.image, + required this.type, + required this.name, + required this.year, + }); + + factory WatchOrderSearch.fromJson(Map json) { + return WatchOrderSearch( + id: json["id"], + image: "https://chiaki.site/${json["image"]}", + type: json["type"], + name: json["value"], + year: json["year"], + ); + } +} + +class WatchOrderItem { + final String id; + final String anilistId; + final String image; + final String name; + final String? nameEnglish; + final String text; + + WatchOrderItem({ + required this.id, + required this.anilistId, + required this.image, + required this.name, + required this.nameEnglish, + required this.text, + }); +} From 5b806f6dd6b11313be82d55b21b04619277238b6 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 01:52:03 +0200 Subject: [PATCH 071/100] added sequels --- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 + lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + .../manga/detail/manga_detail_view.dart | 57 +++- .../detail/widgets/watch_order_screen.dart | 270 ++++++++++++------ lib/router/router.dart | 5 +- lib/services/fetch_watch_order.dart | 102 +++++++ 20 files changed, 395 insertions(+), 88 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 06f8bce0..15a7a404 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -537,6 +537,7 @@ "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:" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 55b7ec0f..15d35142 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -3297,6 +3297,12 @@ abstract class AppLocalizations { /// **'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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index a0c77141..4c46164f 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1706,6 +1706,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 8873eba1..c49a305a 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1708,6 +1708,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 9f8727e4..1dc3bb00 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1719,6 +1719,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 821db31c..4b8e6621 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1707,6 +1707,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 8e8398f6..0127c73d 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1724,6 +1724,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 9c1288bc..092a8caa 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1725,6 +1725,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index bc961804..a5fef404 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1709,6 +1709,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index d183d535..87a59234 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1713,6 +1713,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 4ee86a1e..5c55729a 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1722,6 +1722,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index cde6b8fa..9102ba51 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1721,6 +1721,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 0aebcc56..0e25702a 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1723,6 +1723,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 78e3f4a1..f99fa92d 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1707,6 +1707,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 995a19d1..2ddc11c8 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1713,6 +1713,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index f12bd6e4..b378f6b7 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1678,6 +1678,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get watch_order => 'Watch order'; + @override + String get sequels => 'Sequels'; + @override String get recommendations_similarity => 'Similarity:'; } diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 928e81cd..615c86ce 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -25,6 +25,7 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi import 'package:mangayomi/modules/more/providers/algorithm_weights_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart'; +import 'package:mangayomi/modules/tracker_library/tracker_library_screen.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'; @@ -1660,7 +1661,7 @@ class _MangaDetailViewState extends ConsumerState onPressed: () { context.push( "/watchOrder", - extra: widget.manga!.name, + extra: (widget.manga!.name, null), ); }, label: Text(l10n.watch_order), @@ -1668,6 +1669,60 @@ class _MangaDetailViewState extends ConsumerState ), ), ), + if (widget.manga!.itemType == ItemType.anime) + StreamBuilder( + stream: isar.tracks + .filter() + .idIsNotNull() + .mangaIdEqualTo(widget.manga!.id!) + .watch(fireImmediately: true), + builder: (context, snapshot) { + List? trackRes = snapshot.hasData + ? snapshot.data + : []; + final isNotSupported = + trackRes?.firstOrNull?.syncId != + TrackerProviders.myAnimeList.syncId && + trackRes?.firstOrNull?.syncId != + TrackerProviders.anilist.syncId; + if ((trackRes?.isEmpty ?? true) || (isNotSupported)) { + return Container(); + } + return Column( + children: [ + const SizedBox(height: 15), + SizedBox( + width: context.width(1), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: OutlinedButton.icon( + style: ButtonStyle( + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 30.0, + ), + ), + ), + ), + onPressed: () { + context.push( + "/watchOrder", + extra: ( + widget.manga!.name, + trackRes?.firstOrNull, + ), + ); + }, + label: Text(l10n.sequels), + icon: Icon(Icons.arrow_right_alt_outlined), + ), + ), + ), + ], + ); + }, + ), const SizedBox(height: 15), if (!context.isTablet) Column( diff --git a/lib/modules/manga/detail/widgets/watch_order_screen.dart b/lib/modules/manga/detail/widgets/watch_order_screen.dart index 56536e45..b59588dc 100644 --- a/lib/modules/manga/detail/widgets/watch_order_screen.dart +++ b/lib/modules/manga/detail/widgets/watch_order_screen.dart @@ -1,11 +1,17 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/track.dart'; +import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/modules/tracker_library/tracker_library_screen.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/services/fetch_watch_order.dart'; import 'package:mangayomi/utils/constant.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:marquee/marquee.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; @@ -13,8 +19,9 @@ import 'package:super_sliver_list/super_sliver_list.dart'; class WatchOrderScreen extends StatefulWidget { final String name; + final Track? track; - const WatchOrderScreen({super.key, required this.name}); + const WatchOrderScreen({super.key, required this.name, required this.track}); @override State createState() => _WatchOrderScreenState(); @@ -23,9 +30,12 @@ class WatchOrderScreen extends StatefulWidget { class _WatchOrderScreenState extends State { String _errorMessage = ""; bool _isLoading = true; + List? sequels; List? dataSearch; List? data; + bool get isSequels => widget.track != null; + @override void initState() { super.initState(); @@ -35,7 +45,23 @@ class _WatchOrderScreenState extends State { Future _init() async { try { _errorMessage = ""; - dataSearch = await searchWatchOrder(widget.name); + if (isSequels) { + final mediaId = widget.track!.mediaId!.toString(); + final mal = await isar.trackPreferences + .filter() + .syncIdEqualTo(TrackerProviders.myAnimeList.syncId) + .findFirst(); + final anilist = await isar.trackPreferences + .filter() + .syncIdEqualTo(TrackerProviders.anilist.syncId) + .findFirst(); + final data = await fetchSequels(mal?.username, anilist?.username); + sequels = data + .where((e) => e.reason.any((r) => r.id == mediaId)) + .toList(); + } else { + dataSearch = await searchWatchOrder(widget.name); + } if (mounted) { setState(() { _isLoading = false; @@ -55,7 +81,7 @@ class _WatchOrderScreenState extends State { Widget build(BuildContext context) { final l10n = context.l10n; return Scaffold( - appBar: AppBar(title: Text(l10n.watch_order)), + appBar: AppBar(title: Text(isSequels ? l10n.sequels : l10n.watch_order)), body: Padding( padding: EdgeInsetsGeometry.all(5), child: _isLoading @@ -65,85 +91,131 @@ class _WatchOrderScreenState extends State { if (_errorMessage.isNotEmpty) { return Center(child: Text(_errorMessage)); } - final isSearch = dataSearch != null && dataSearch!.isNotEmpty; - final isWatchOrder = data != null && data!.isNotEmpty; - if (isSearch || isWatchOrder) { - return SuperListView.builder( - extentPrecalculationPolicy: SuperPrecalculationPolicy(), - itemCount: data?.length ?? dataSearch!.length, - itemBuilder: (context, index) { - final search = !isWatchOrder && isSearch - ? dataSearch![index] - : null; - final watchOrder = isWatchOrder ? data![index] : null; - return ListTile( - onTap: () async { - if (isWatchOrder) { - context.push( - '/globalSearch', - extra: ( - watchOrder!.nameEnglish ?? watchOrder.name, - ItemType.anime, - ), - ); - } else { - if (mounted) { - setState(() { - _isLoading = true; - _errorMessage = ""; - }); - data = await fetchWatchOrder(search!.id); - setState(() { - _isLoading = false; - }); - } - } - }, - title: Row( - children: [ - _thumbnailPreview( - context, - watchOrder?.image ?? search!.image, - ), - const SizedBox(width: 15), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTitle( - watchOrder?.name ?? search!.name, - context, - ), - if (watchOrder?.nameEnglish != null && - watchOrder?.nameEnglish != - watchOrder?.text) - Text( - watchOrder!.nameEnglish!, - style: const TextStyle(fontSize: 11), - overflow: TextOverflow.clip, - ), - Text( - watchOrder?.text ?? - "${search!.type} - ${search.year}", - style: const TextStyle(fontSize: 11), - overflow: TextOverflow.clip, - ), - ], - ), - ), - ], - ), - ); - }, - ); - } - return Center(child: Text(l10n.no_result)); + return isSequels ? _buildSequels() : _buildWatchOrder(); }, ), ), ); } + Widget _buildSequels() { + if (sequels != null && sequels!.isNotEmpty) { + return SuperListView.builder( + extentPrecalculationPolicy: SuperPrecalculationPolicy(), + itemCount: sequels!.length, + itemBuilder: (context, index) { + final sequel = sequels![index]; + return StreamBuilder( + stream: isar.tracks + .filter() + .idIsNotNull() + .mediaIdEqualTo(int.tryParse(sequel.id)) + .or() + .mediaIdEqualTo(int.tryParse(sequel.anilistId ?? "")) + .watch(fireImmediately: true), + builder: (context, snapshot) { + final hasData = snapshot.hasData && snapshot.data!.isNotEmpty; + return ListTile( + onTap: () async { + context.push( + '/globalSearch', + extra: (sequel.title, ItemType.anime), + ); + }, + title: Row( + children: [ + _thumbnailPreview(context, sequel.image, hasData: hasData), + const SizedBox(width: 15), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle(sequel.title, context), + Text( + "${sequel.period} | ${sequel.type} | ${sequel.episodes} episodes | ★${sequel.score} (${sequel.scoreUsers})", + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.clip, + ), + ], + ), + ), + ], + ), + ); + }, + ); + }, + ); + } + return Center(child: Text(context.l10n.no_result)); + } + + Widget _buildWatchOrder() { + final isSearch = dataSearch != null && dataSearch!.isNotEmpty; + final isWatchOrder = data != null && data!.isNotEmpty; + if (isSearch || isWatchOrder) { + return SuperListView.builder( + extentPrecalculationPolicy: SuperPrecalculationPolicy(), + itemCount: data?.length ?? dataSearch!.length, + itemBuilder: (context, index) { + final search = !isWatchOrder && isSearch ? dataSearch![index] : null; + final watchOrder = isWatchOrder ? data![index] : null; + return ListTile( + onTap: () async { + if (isWatchOrder) { + context.push( + '/globalSearch', + extra: ( + watchOrder!.nameEnglish ?? watchOrder.name, + ItemType.anime, + ), + ); + } else { + if (mounted) { + setState(() { + _isLoading = true; + _errorMessage = ""; + }); + data = await fetchWatchOrder(search!.id); + setState(() { + _isLoading = false; + }); + } + } + }, + title: Row( + children: [ + _thumbnailPreview(context, watchOrder?.image ?? search!.image), + const SizedBox(width: 15), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle(watchOrder?.name ?? search!.name, context), + if (watchOrder?.nameEnglish != null && + watchOrder?.nameEnglish != watchOrder?.text) + Text( + watchOrder!.nameEnglish!, + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.clip, + ), + Text( + watchOrder?.text ?? "${search!.type} - ${search.year}", + style: const TextStyle(fontSize: 11), + overflow: TextOverflow.clip, + ), + ], + ), + ), + ], + ), + ); + }, + ); + } + return Center(child: Text(context.l10n.no_result)); + } + Widget _buildTitle(String text, BuildContext context) { return LayoutBuilder( builder: (context, constraints) { @@ -183,7 +255,11 @@ class _WatchOrderScreenState extends State { ); } - Widget _thumbnailPreview(BuildContext context, String? imageUrl) { + Widget _thumbnailPreview( + BuildContext context, + String? imageUrl, { + bool hasData = false, + }) { final imageProvider = CustomExtendedNetworkImageProvider( toImgUrl(imageUrl ?? ""), ); @@ -193,15 +269,39 @@ class _WatchOrderScreenState extends State { onTap: () { _openImage(context, imageProvider); }, - child: SizedBox( - width: 100, - height: 150, - child: Container( - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(5)), - image: DecorationImage(image: imageProvider, fit: BoxFit.cover), + child: Stack( + children: [ + SizedBox( + width: 100, + height: 150, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), ), - ), + Container( + width: 100, + height: 150, + color: hasData ? Colors.black.withValues(alpha: 0.7) : null, + ), + if (hasData) + Positioned( + top: 0, + left: 0, + child: Padding( + padding: const EdgeInsets.all(4), + child: Icon( + Icons.collections_bookmark, + color: context.primaryColor, + ), + ), + ), + ], ), ), ); diff --git a/lib/router/router.dart b/lib/router/router.dart index 9dceecda..d5965fe6 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -5,6 +5,7 @@ import 'package:go_router/go_router.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'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/anime/anime_player_view.dart'; @@ -257,9 +258,9 @@ class RouterNotifier extends ChangeNotifier { algorithmWeights: data.$3, ), ), - _genericRoute( + _genericRoute<(String, Track?)>( name: "watchOrder", - builder: (data) => WatchOrderScreen(name: data), + builder: (data) => WatchOrderScreen(name: data.$1, track: data.$2), ), ]; diff --git a/lib/services/fetch_watch_order.dart b/lib/services/fetch_watch_order.dart index f3b1e1da..75c06636 100644 --- a/lib/services/fetch_watch_order.dart +++ b/lib/services/fetch_watch_order.dart @@ -5,6 +5,41 @@ import 'package:html/dom.dart'; import 'package:mangayomi/services/http/m_client.dart'; import 'package:mangayomi/utils/extensions/dom_extensions.dart'; +const _sequelData = + "&types%5B%5D=1&types%5B%5D=3&types%5B%5D=2&types%5B%5D=4&types%5B%5D=9&score=0&date_from=false&date_to=false&include_ptw=1&exclude_h=1&exclude_planned=1&exclude_dropped=0&exclude_not_aired=0&exclude_short=1&exclude_short_value=3"; + +Future> fetchSequels( + String? malUsername, + String? anilistUsername, +) async { + if (malUsername == null && anilistUsername == null) { + return []; + } + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + try { + final url = Uri.parse("https://chiaki.site/?/tools/sequel_locator_fetch"); + final res = await http.post( + url, + headers: { + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "priority": "u=1, i", + "Referer": "https://chiaki.site/?/tools/watch_order", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", + }, + body: + "user=${malUsername ?? anilistUsername}&list_source=${malUsername != null ? "mal" : "anilist"}$_sequelData", + ); + final data = jsonDecode(res.body) as Map?; + return (data?["data"] as List?) + ?.map((e) => SequelItem.fromJson(e)) + .toList() ?? + []; + } catch (_) { + return []; + } +} + Future> searchWatchOrder(String name) async { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); try { @@ -71,6 +106,73 @@ Future> fetchWatchOrder(String id) async { } } +class SequelItem { + final String id; + final String? anilistId; + final String image; + final String episodes; + final String title; + final String group; + final String groupId; + final String period; + final String score; + final String scoreUsers; + final String type; + final List reason; + + SequelItem({ + required this.id, + required this.anilistId, + required this.image, + required this.episodes, + required this.title, + required this.group, + required this.groupId, + required this.period, + required this.score, + required this.scoreUsers, + required this.type, + required this.reason, + }); + + factory SequelItem.fromJson(Map json) { + return SequelItem( + id: json["id"], + anilistId: json["anilist_id"], + image: "https://chiaki.site/${json["image_url"]}", + episodes: json["episodes"], + title: json["title"], + group: json["group"], + groupId: json["group_id"], + period: json["period"], + score: json["score"], + scoreUsers: json["score_users"], + type: json["type"], + reason: + (json["reason"] as List?) + ?.map((e) => SequelReason.fromJson(e)) + .toList() ?? + [], + ); + } +} + +class SequelReason { + final String id; + final String image; + final String title; + + SequelReason({required this.id, required this.image, required this.title}); + + factory SequelReason.fromJson(Map json) { + return SequelReason( + id: json["id"], + image: "https://chiaki.site/${json["image_url"]}", + title: json["title"], + ); + } +} + class WatchOrderSearch { final String id; final String image; From f6a9c41c1dcdd17381a2763f0bfc6651122f66af Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 03:47:10 +0200 Subject: [PATCH 072/100] added Trakt.tv --- assets/trackers_icons/tracker_trakt.webp | Bin 0 -> 3032 bytes .../providers/track_state_providers.dart | 6 + .../providers/track_state_providers.g.dart | 2 +- .../manage_trackers/tracking_detail.dart | 21 +- lib/modules/more/settings/track/track.dart | 15 + .../tracker_library_screen.dart | 75 +++- lib/services/trackers/simkl.g.dart | 2 +- lib/services/trackers/trakt_tv.dart | 394 ++++++++++++++++++ lib/services/trackers/trakt_tv.g.dart | 194 +++++++++ lib/utils/constant.dart | 7 +- 10 files changed, 703 insertions(+), 13 deletions(-) create mode 100644 assets/trackers_icons/tracker_trakt.webp create mode 100644 lib/services/trackers/trakt_tv.dart create mode 100644 lib/services/trackers/trakt_tv.g.dart diff --git a/assets/trackers_icons/tracker_trakt.webp b/assets/trackers_icons/tracker_trakt.webp new file mode 100644 index 0000000000000000000000000000000000000000..beb1296744e885d0611001e705952a3853168cdd GIT binary patch literal 3032 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 a`fo>4%Zxygp{Z~k%u?r!yk$W!0000d6c5h; literal 0 HcmV?d00001 diff --git a/lib/modules/manga/detail/providers/track_state_providers.dart b/lib/modules/manga/detail/providers/track_state_providers.dart index 4f537d15..f9cd5e04 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.dart @@ -10,6 +10,7 @@ import 'package:mangayomi/services/trackers/base_tracker.dart'; import 'package:mangayomi/services/trackers/kitsu.dart'; import 'package:mangayomi/services/trackers/myanimelist.dart'; import 'package:mangayomi/services/trackers/simkl.dart'; +import 'package:mangayomi/services/trackers/trakt_tv.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'track_state_providers.g.dart'; @@ -30,6 +31,9 @@ class TrackState extends _$TrackState { ), 3 => ref.read(kitsuProvider(syncId: syncId, itemType: itemType).notifier), 4 => ref.read(simklProvider(syncId: syncId, itemType: itemType).notifier), + 5 => ref.read( + traktTvProvider(syncId: syncId, itemType: itemType).notifier, + ), _ => throw Exception('Unsupported syncId: $syncId'), }; } @@ -118,6 +122,8 @@ class TrackState extends _$TrackState { findManga = await tracker.update(newTrack, _isManga); } else if (syncId == TrackerProviders.simkl.syncId) { findManga = await tracker.findLibItem(newTrack, _isManga); + } else if (syncId == TrackerProviders.trakt.syncId) { + findManga = await tracker.findLibItem(newTrack, _isManga); } writeBack(findManga!); } diff --git a/lib/modules/manga/detail/providers/track_state_providers.g.dart b/lib/modules/manga/detail/providers/track_state_providers.g.dart index ba38398f..1eddd3cd 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.g.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_state_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$trackStateHash() => r'a96b4e702c16304cb16604d6b2d7dca5d65ca8b0'; +String _$trackStateHash() => r'0b2fa471cb843d5880f921f1c721a05b54bc1515'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart b/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart index ebd71e6e..00771288 100644 --- a/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart +++ b/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart @@ -5,6 +5,7 @@ import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; +import 'package:mangayomi/modules/tracker_library/tracker_library_screen.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/constant.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; @@ -20,10 +21,14 @@ class TrackingDetail extends StatefulWidget { class _TrackingDetailState extends State with TickerProviderStateMixin { late TabController _tabBarController; + bool get isMovies => + widget.trackerPref.syncId == TrackerProviders.simkl.syncId || + widget.trackerPref.syncId == TrackerProviders.trakt.syncId; + @override void initState() { super.initState(); - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: isMovies ? 1 : 2, vsync: this); } @override @@ -35,9 +40,10 @@ class _TrackingDetailState extends State @override Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; + return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: isMovies ? 1 : 2, child: Scaffold( appBar: AppBar( elevation: 0, @@ -51,7 +57,7 @@ class _TrackingDetailState extends State indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), + if (!isMovies) Tab(text: l10n.manga), Tab(text: l10n.anime), ], ), @@ -59,10 +65,11 @@ class _TrackingDetailState extends State body: TabBarView( controller: _tabBarController, children: [ - TrackingTab( - itemType: ItemType.manga, - syncId: widget.trackerPref.syncId!, - ), + if (!isMovies) + TrackingTab( + itemType: ItemType.manga, + syncId: widget.trackerPref.syncId!, + ), TrackingTab( itemType: ItemType.anime, syncId: widget.trackerPref.syncId!, diff --git a/lib/modules/more/settings/track/track.dart b/lib/modules/more/settings/track/track.dart index 563d6df9..bb5d24f9 100644 --- a/lib/modules/more/settings/track/track.dart +++ b/lib/modules/more/settings/track/track.dart @@ -13,6 +13,7 @@ import 'package:mangayomi/services/trackers/anilist.dart'; import 'package:mangayomi/services/trackers/kitsu.dart'; import 'package:mangayomi/services/trackers/myanimelist.dart'; import 'package:mangayomi/services/trackers/simkl.dart'; +import 'package:mangayomi/services/trackers/trakt_tv.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class TrackScreen extends ConsumerWidget { @@ -113,6 +114,20 @@ class TrackScreen extends ConsumerWidget { id: TrackerProviders.simkl.syncId, entries: entries, ), + TrackListile( + onTap: () async { + await ref + .read( + traktTvProvider( + syncId: TrackerProviders.trakt.syncId, + itemType: null, + ).notifier, + ) + .login(); + }, + id: TrackerProviders.trakt.syncId, + entries: entries, + ), ListTile( title: Padding( padding: const EdgeInsets.only(bottom: 8), diff --git a/lib/modules/tracker_library/tracker_library_screen.dart b/lib/modules/tracker_library/tracker_library_screen.dart index 8000d7b5..31700ad0 100644 --- a/lib/modules/tracker_library/tracker_library_screen.dart +++ b/lib/modules/tracker_library/tracker_library_screen.dart @@ -24,7 +24,8 @@ enum TrackerProviders { myAnimeList(syncId: 1, name: "MAL"), anilist(syncId: 2, name: "AL"), kitsu(syncId: 3, name: "Kitsu"), - simkl(syncId: 4, name: "Simkl"); + simkl(syncId: 4, name: "Simkl"), + trakt(syncId: 5, name: "Trakt"); const TrackerProviders({required this.syncId, required this.name}); @@ -69,6 +70,7 @@ class _TrackerLibraryScreenState extends ConsumerState { 2 => _sectionsAL(trackerProvider.syncId, itemType), 3 => _sectionsKitsu(trackerProvider.syncId, itemType), 4 => _sectionsSimkl(trackerProvider.syncId, itemType), + 5 => _sectionsTrakt(trackerProvider.syncId, itemType), _ => [], }; if (_isSearch && _query.isNotEmpty) { @@ -87,7 +89,10 @@ class _TrackerLibraryScreenState extends ConsumerState { return Scaffold( appBar: AppBar( title: Text( - "${trackerProvider.name} | ${itemType == ItemType.anime ? l10n.anime : l10n.manga}", + (trackerProvider.syncId == TrackerProviders.simkl.syncId || + trackerProvider.syncId == TrackerProviders.trakt.syncId) + ? trackerProvider.name + : "${trackerProvider.name} | ${itemType == ItemType.anime ? l10n.anime : l10n.manga}", ), leading: !_isSearch ? null : Container(), actions: [ @@ -212,6 +217,67 @@ class _TrackerLibraryScreenState extends ConsumerState { setState(() {}); } + List _sectionsTrakt(int syncId, ItemType itemType) { + return [ + TrackLibrarySection( + name: "Continue watching movies", + syncId: syncId, + func: _fetchUserData(syncId, ItemType.manga), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Continue watching series", + syncId: syncId, + func: _fetchUserData(syncId, ItemType.anime), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Trending Movies", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.manga), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Trending Series", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.anime), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Popular Movies", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.manga, rankingType: "popular"), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Popular Series", + syncId: syncId, + func: _fetchGeneralData(syncId, ItemType.anime, rankingType: "popular"), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Top Movies (All Time)", + syncId: syncId, + func: _fetchGeneralData( + syncId, + ItemType.manga, + rankingType: "favorited/all", + ), + itemType: ItemType.anime, + ), + TrackLibrarySection( + name: "Top Series (All Time)", + syncId: syncId, + func: _fetchGeneralData( + syncId, + ItemType.anime, + rankingType: "favorited/all", + ), + itemType: ItemType.anime, + ), + ]; + } + List _sectionsSimkl(int syncId, ItemType itemType) { return [ TrackLibrarySection( @@ -548,6 +614,7 @@ class _TrackerLibraryScreenState extends ConsumerState { _getListile(l10n, TrackerProviders.anilist.syncId), _getListile(l10n, TrackerProviders.kitsu.syncId), _getListile(l10n, TrackerProviders.simkl.syncId), + _getListile(l10n, TrackerProviders.trakt.syncId), ], ), ), @@ -604,7 +671,9 @@ class _TrackerLibraryScreenState extends ConsumerState { ), enabled: isLoggedIn, onTap: () { - if (isManga == null && syncId != TrackerProviders.simkl.syncId) { + if (isManga == null && + syncId != TrackerProviders.simkl.syncId && + syncId != TrackerProviders.trakt.syncId) { context.pop(); _openSwitchTypeDialog(l10n, syncId); } else { diff --git a/lib/services/trackers/simkl.g.dart b/lib/services/trackers/simkl.g.dart index 27abd3ed..74e9a772 100644 --- a/lib/services/trackers/simkl.g.dart +++ b/lib/services/trackers/simkl.g.dart @@ -6,7 +6,7 @@ part of 'simkl.dart'; // RiverpodGenerator // ************************************************************************** -String _$simklHash() => r'7385cd7925dff352509f1b51d4ab2eb6af733b15'; +String _$simklHash() => r'3b8ff48675ba743d39aef595dc6cd70f4bd404cf'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart new file mode 100644 index 00000000..b3cf0af5 --- /dev/null +++ b/lib/services/trackers/trakt_tv.dart @@ -0,0 +1,394 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:http_interceptor/http_interceptor.dart'; +import 'package:mangayomi/eval/model/m_bridge.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/track.dart'; +import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/models/track_search.dart'; +import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; +import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; +import 'package:mangayomi/services/http/m_client.dart'; +import 'base_tracker.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'trakt_tv.g.dart'; + +@riverpod +class TraktTv extends _$TraktTv implements BaseTracker { + final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); + static const _baseOAuthUrl = 'https://api.trakt.tv/oauth'; + static const _baseApiUrl = 'https://api.trakt.tv'; + static final _isDesktop = (Platform.isWindows || Platform.isLinux); + static const _redirectUri = 'http://localhost:43824'; + static const _clientId = + '5520c7e24da0d8d73ec80315b61b9849483583b013cb7f296c6db723eb9886a1'; + static const _clientSecret = + 'b512565ad92d4179290de257b6e435d03ee47b2e4371b3bd918081beb6121734'; + + String getFallbackClientId(String usedId) { + return _clientId; + } + + @override + void build({required int syncId, required ItemType? itemType}) {} + + Future login() async { + final callbackUrlScheme = _isDesktop + ? 'http://localhost:43824' + : 'mangayomi'; + final loginUrl = _authUrl(); + + try { + final uri = await FlutterWebAuth2.authenticate( + url: "$loginUrl&redirect_uri=$callbackUrlScheme", + callbackUrlScheme: callbackUrlScheme, + ); + final code = Uri.parse(uri).queryParameters['code']; + if (code == null) return null; + + final oAuthData = await _getOAuth(code); + final oAuth = _buildOAuth(oAuthData, _clientId); + final username = await _getUserName(oAuth.accessToken!); + _saveOAuth(username, oAuth); + + return true; + } catch (_) { + return false; + } + } + + @override + Future> fetchGeneralData({ + bool isManga = true, + String rankingType = "trending", + }) async { + /// isManga <> isMovie + final type = isManga ? "movies" : "shows"; + final accessToken = await _getAccessToken(); + final url = Uri.parse('$_baseApiUrl/$type/$rankingType').replace( + queryParameters: { + 'extended': 'full', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as List?; + return data?.map((e) { + final type = isManga ? "movie" : "show"; + final typeName = type == 'movie' ? 'movies' : 'shows'; + return TrackSearch( + mediaId: e['ids']?['trakt'] ?? e[type]?['ids']?['trakt'], + summary: + e['overview'] ?? + e[type]?['overview'] ?? + 'No summary available.', + totalChapter: + e['aired_episodes'] ?? e[type]?['aired_episodes'] ?? 1, + coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + title: e['title'] ?? e[type]?['title'] ?? 'Unknown Title', + score: double.tryParse( + (e["rating"] ?? e[type]?["rating"] as num?) + ?.toDouble() + .toStringAsFixed(2) ?? + "", + ), + startDate: e["first_aired"] ?? e[type]?["first_aired"] ?? "", + publishingType: type, + publishingStatus: e["status"] ?? e[type]["status"], + trackingUrl: + "https://trakt.tv/$typeName/${e['ids']?['slug'] ?? e[type]?['ids']?['slug']}", + syncId: syncId, + ); + }).toList() ?? + []; + } + + @override + Future> fetchUserData({bool isManga = true}) async { + final type = isManga ? "movies" : "shows"; + final accessToken = await _getAccessToken(); + final url = Uri.parse( + '$_baseApiUrl/sync/watched/$type', + ).replace(queryParameters: {"extended": "full"}); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as List?; + return data?.map((e) { + final type = e['movie'] != null ? "movie" : "show"; + final typeName = type == 'movie' ? 'movies' : 'shows'; + return TrackSearch( + mediaId: e[type]?['ids']?['trakt'], + summary: e[type]?['overview'] ?? 'No summary available.', + totalChapter: e[type]?['aired_episodes'] ?? 1, + coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + title: e[type]['title'] ?? 'Unknown Title', + score: double.tryParse( + (e[type]?["rating"] as num?)?.toDouble().toStringAsFixed(2) ?? "", + ), + startDate: e[type]?["first_aired"] ?? "", + publishingType: type, + publishingStatus: e[type]["status"], + trackingUrl: + "https://trakt.tv/$typeName/${e[type]?['ids']?['slug']}", + syncId: syncId, + ); + }).toList() ?? + []; + } + + @override + Future findLibItem(Track track, bool isManga) async { + final accessToken = await _getAccessToken(); + final isMovie = + track.trackingUrl?.replaceAll("https://trakt.tv/", "").split("/")[0] == + "movies"; + final url = Uri.parse( + '$_baseApiUrl/sync/history/${isMovie ? "movies" : "shows"}/${track.mediaId}', + ).replace(queryParameters: {"extended": "full"}); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as List?; + if (data?.isNotEmpty ?? false) { + if (!isMovie) { + track.lastChapterRead = data! + .where((e) => e["type"] == "episode") + .length; + } + if ((track.lastChapterRead ?? 0) >= (track.totalChapter ?? 0)) { + track.finishedReadingDate = DateTime.tryParse( + data!.firstOrNull?["watched_at"], + )?.millisecondsSinceEpoch; + } + return track; + } + return await update(track, isManga); + } + + @override + Future> search(String query, bool isManga) async { + final accessToken = await _getAccessToken(); + final url = Uri.parse('$_baseApiUrl/search/movie,show').replace( + queryParameters: { + 'query': query, + 'extended': 'full', + 'clientId': _clientId, + 'limit': '15', + }, + ); + final result = await _makeGetRequest(url, accessToken); + final data = jsonDecode(result.body) as List?; + return data?.map((e) { + final type = e['type']; + final typeName = e['type'] == 'movie' ? 'movies' : 'shows'; + return TrackSearch( + mediaId: e[type]?['ids']?['trakt'], + summary: e[type]?['overview'] ?? 'No summary available.', + totalChapter: e[type]?['aired_episodes'] ?? 1, + coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + title: e[type]['title'] ?? 'Unknown Title', + score: (e[type]?["rating"] as num?)?.toDouble(), + startDate: e[type]?["first_aired"] ?? "", + publishingType: type, + publishingStatus: e[type]["status"], + trackingUrl: + "https://trakt.tv/$typeName/${e[type]?['ids']?['slug']}", + syncId: syncId, + ); + }).toList() ?? + []; + } + + @override + List statusList(bool isManga) => []; + + @override + Future update(Track track, bool isManga) async { + final accessToken = await _getAccessToken(); + final isMovie = + track.trackingUrl?.replaceAll("https://trakt.tv/", "").split("/")[0] == + "movies"; + final urlRemove = Uri.parse( + "$_baseApiUrl/sync/history/remove", + ).replace(queryParameters: {'clientId': _clientId}); + final bodyRemove = isMovie + ? { + 'movies': [ + { + 'ids': {'trakt': track.mediaId}, + }, + ], + } + : { + 'shows': [ + { + 'ids': {'trakt': track.mediaId}, + }, + ], + }; + await _makePostRequest(urlRemove, accessToken, bodyRemove); + final url = Uri.parse( + "$_baseApiUrl/sync/history", + ).replace(queryParameters: {'extended': 'full', 'clientId': _clientId}); + final body = isMovie + ? { + 'movies': [ + { + 'watched_at': DateTime.now().toIso8601String(), + 'ids': {'trakt': track.mediaId}, + }, + ], + } + : { + 'shows': [ + { + 'watched_at': DateTime.now().toIso8601String(), + 'ids': {'trakt': track.mediaId}, + 'seasons': [ + { + 'number': 1, + 'episodes': [ + for (int i = 1; i <= (track.lastChapterRead ?? 1); i++) + { + 'watched_at': DateTime.now().toIso8601String(), + 'number': i, + }, + ], + }, + ], + }, + ], + }; + await _makePostRequest(url, accessToken, body); + return track; + } + + Future _getAccessToken() async { + final track = ref.read(tracksProvider(syncId: syncId)); + final mALOAuth = OAuth.fromJson( + jsonDecode(track!.oAuth!) as Map, + ); + final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); + if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!; + final refreshed = await _tryRefreshToken(mALOAuth); + if (refreshed == null) { + ref.read(tracksProvider(syncId: syncId).notifier).logout(); + botToast("Trakt.tv Token expired"); + throw Exception("Token expired"); + } + final username = await _getUserName(refreshed.accessToken!); + _saveOAuth(username, refreshed); + return refreshed.accessToken!; + } + + Future _tryRefreshToken(OAuth oldOAuth) async { + String primaryClientId = oldOAuth.clientId ?? _clientId; + + Future tryRefresh(String cid) async { + final response = await http.post( + Uri.parse('$_baseOAuthUrl/token'), + body: { + 'refresh_token': oldOAuth.refreshToken, + 'client_id': cid, + 'client_secret': _clientSecret, + 'redirect_uri': _redirectUri, + 'grant_type': 'refresh_token', + }, + headers: {'Content-Type': 'application/json'}, + ); + if (response.statusCode != 200) return null; + final body = jsonDecode(response.body) as Map; + return _buildOAuth(body, cid); + } + + return await tryRefresh(primaryClientId) ?? + await tryRefresh(getFallbackClientId(primaryClientId)); + } + + OAuth _buildOAuth(Map json, String clientId) { + return OAuth.fromJson(json) + ..expiresIn = DateTime.now() + .add(Duration(seconds: json['expires_in'])) + .millisecondsSinceEpoch + ..clientId = clientId; + } + + void _saveOAuth(String username, OAuth oAuth) { + ref + .read(tracksProvider(syncId: syncId).notifier) + .login( + TrackPreference( + syncId: syncId, + username: username, + prefs: "", + oAuth: jsonEncode(oAuth.toJson()), + ), + ); + } + + Future _getUserName(String accessToken) async { + final response = await _makeGetRequest( + Uri.parse('$_baseApiUrl/users/settings'), + accessToken, + ); + return "${jsonDecode(response.body)['user']['username']}"; + } + + String _authUrl() { + return '$_baseOAuthUrl/authorize?client_id=$_clientId&response_type=code'; + } + + Future _getOAuth(String code) async { + final params = { + 'code': code, + 'client_id': _clientId, + 'client_secret': _clientSecret, + 'redirect_uri': _redirectUri, + 'grant_type': 'authorization_code', + }; + final response = await http.post( + Uri.parse('$_baseApiUrl/oauth/token'), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode(params), + ); + return jsonDecode(response.body); + } + + Future _makeGetRequest(Uri url, String accessToken) async { + return await http.get( + url, + headers: { + 'Authorization': 'Bearer $accessToken', + 'trakt-api-key': _clientId, + 'trakt-api-version': "2", + 'Content-Type': 'application/json', + }, + ); + } + + Future _makePostRequest( + Uri url, + String accessToken, + Object? body, + ) async { + return await http.post( + url, + headers: { + 'Authorization': 'Bearer $accessToken', + 'trakt-api-key': _clientId, + 'trakt-api-version': "2", + 'Content-Type': 'application/json', + }, + body: jsonEncode(body), + ); + } + + @override + String displayScore(int score) { + throw UnimplementedError(); + } + + @override + (int, int) getScoreValue() { + throw UnimplementedError(); + } +} diff --git a/lib/services/trackers/trakt_tv.g.dart b/lib/services/trackers/trakt_tv.g.dart new file mode 100644 index 00000000..44d8f31b --- /dev/null +++ b/lib/services/trackers/trakt_tv.g.dart @@ -0,0 +1,194 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'trakt_tv.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$traktTvHash() => r'de97ae0edbc905d07af2ce8758441fba6cdd7be2'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$TraktTv extends BuildlessAutoDisposeNotifier { + late final int syncId; + late final ItemType? itemType; + + void build({ + required int syncId, + required ItemType? itemType, + }); +} + +/// See also [TraktTv]. +@ProviderFor(TraktTv) +const traktTvProvider = TraktTvFamily(); + +/// See also [TraktTv]. +class TraktTvFamily extends Family { + /// See also [TraktTv]. + const TraktTvFamily(); + + /// See also [TraktTv]. + TraktTvProvider call({ + required int syncId, + required ItemType? itemType, + }) { + return TraktTvProvider( + syncId: syncId, + itemType: itemType, + ); + } + + @override + TraktTvProvider getProviderOverride( + covariant TraktTvProvider provider, + ) { + return call( + syncId: provider.syncId, + itemType: provider.itemType, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'traktTvProvider'; +} + +/// See also [TraktTv]. +class TraktTvProvider extends AutoDisposeNotifierProviderImpl { + /// See also [TraktTv]. + TraktTvProvider({ + required int syncId, + required ItemType? itemType, + }) : this._internal( + () => TraktTv() + ..syncId = syncId + ..itemType = itemType, + from: traktTvProvider, + name: r'traktTvProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$traktTvHash, + dependencies: TraktTvFamily._dependencies, + allTransitiveDependencies: TraktTvFamily._allTransitiveDependencies, + syncId: syncId, + itemType: itemType, + ); + + TraktTvProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.syncId, + required this.itemType, + }) : super.internal(); + + final int syncId; + final ItemType? itemType; + + @override + void runNotifierBuild( + covariant TraktTv notifier, + ) { + return notifier.build( + syncId: syncId, + itemType: itemType, + ); + } + + @override + Override overrideWith(TraktTv Function() create) { + return ProviderOverride( + origin: this, + override: TraktTvProvider._internal( + () => create() + ..syncId = syncId + ..itemType = itemType, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + syncId: syncId, + itemType: itemType, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement createElement() { + return _TraktTvProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is TraktTvProvider && + other.syncId == syncId && + other.itemType == itemType; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, syncId.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 TraktTvRef on AutoDisposeNotifierProviderRef { + /// The parameter `syncId` of this provider. + int get syncId; + + /// The parameter `itemType` of this provider. + ItemType? get itemType; +} + +class _TraktTvProviderElement + extends AutoDisposeNotifierProviderElement with TraktTvRef { + _TraktTvProviderElement(super.provider); + + @override + int get syncId => (origin as TraktTvProvider).syncId; + @override + ItemType? get itemType => (origin as TraktTvProvider).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 diff --git a/lib/utils/constant.dart b/lib/utils/constant.dart index 42636d74..ae2d1393 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -72,11 +72,16 @@ TrackStatus toTrackStatus(TrackStatus status, ItemType itemType, int syncId) { "Kitsu", const Color.fromRGBO(18, 25, 35, 1), ), - _ => ( + 4 => ( "assets/trackers_icons/tracker_simkl.png", "Simkl", const Color.fromARGB(255, 35, 15, 90), ), + _ => ( + "assets/trackers_icons/tracker_trakt.webp", + "Trakt", + const Color.fromARGB(255, 90, 51, 81), + ), }; } From da79dd97e1eb08f669a21f07476f448133b8a211 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 12:11:29 +0200 Subject: [PATCH 073/100] fix images --- .../tracker_library_screen.dart | 4 +- lib/services/trackers/trakt_tv.dart | 43 ++++++++++++++++--- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib/modules/tracker_library/tracker_library_screen.dart b/lib/modules/tracker_library/tracker_library_screen.dart index 31700ad0..600c7caf 100644 --- a/lib/modules/tracker_library/tracker_library_screen.dart +++ b/lib/modules/tracker_library/tracker_library_screen.dart @@ -679,7 +679,9 @@ class _TrackerLibraryScreenState extends ConsumerState { } else { ref.read(lastTrackerLibraryLocationStateProvider.notifier).set(( syncId, - isManga ?? true, + isManga ?? + (syncId != TrackerProviders.simkl.syncId && + syncId != TrackerProviders.trakt.syncId), )); context.pop(); } diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index b3cf0af5..db114b33 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -68,7 +68,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { final accessToken = await _getAccessToken(); final url = Uri.parse('$_baseApiUrl/$type/$rankingType').replace( queryParameters: { - 'extended': 'full', + 'extended': 'full,images', 'clientId': _clientId, 'limit': '15', }, @@ -86,7 +86,15 @@ class TraktTv extends _$TraktTv implements BaseTracker { 'No summary available.', totalChapter: e['aired_episodes'] ?? e[type]?['aired_episodes'] ?? 1, - coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + coverUrl: (e['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['fanart'][0]}' + : (e[type]?['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['fanart'][0]}' + : (e['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['poster'][0]}' + : (e[type]?['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['poster'][0]}' + : '', title: e['title'] ?? e[type]?['title'] ?? 'Unknown Title', score: double.tryParse( (e["rating"] ?? e[type]?["rating"] as num?) @@ -111,7 +119,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { final accessToken = await _getAccessToken(); final url = Uri.parse( '$_baseApiUrl/sync/watched/$type', - ).replace(queryParameters: {"extended": "full"}); + ).replace(queryParameters: {"extended": "full,images"}); final result = await _makeGetRequest(url, accessToken); final data = jsonDecode(result.body) as List?; return data?.map((e) { @@ -121,7 +129,15 @@ class TraktTv extends _$TraktTv implements BaseTracker { mediaId: e[type]?['ids']?['trakt'], summary: e[type]?['overview'] ?? 'No summary available.', totalChapter: e[type]?['aired_episodes'] ?? 1, - coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + coverUrl: (e['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['fanart'][0]}' + : (e[type]?['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['fanart'][0]}' + : (e['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['poster'][0]}' + : (e[type]?['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['poster'][0]}' + : '', title: e[type]['title'] ?? 'Unknown Title', score: double.tryParse( (e[type]?["rating"] as num?)?.toDouble().toStringAsFixed(2) ?? "", @@ -170,7 +186,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { final url = Uri.parse('$_baseApiUrl/search/movie,show').replace( queryParameters: { 'query': query, - 'extended': 'full', + 'extended': 'full,images', 'clientId': _clientId, 'limit': '15', }, @@ -184,9 +200,22 @@ class TraktTv extends _$TraktTv implements BaseTracker { mediaId: e[type]?['ids']?['trakt'], summary: e[type]?['overview'] ?? 'No summary available.', totalChapter: e[type]?['aired_episodes'] ?? 1, - coverUrl: 'https://wsrv.nl/?url=wsrv.nl/lichtenstein.jpg', + coverUrl: (e['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['fanart'][0]}' + : (e[type]?['images']?['fanart'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['fanart'][0]}' + : (e['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e['images']?['poster'][0]}' + : (e[type]?['images']?['poster'] as List?)?.isNotEmpty ?? false + ? 'https://wsrv.nl/?url=${e[type]?['images']?['poster'][0]}' + : '', title: e[type]['title'] ?? 'Unknown Title', - score: (e[type]?["rating"] as num?)?.toDouble(), + score: double.tryParse( + (e["rating"] ?? e[type]?["rating"] as num?) + ?.toDouble() + .toStringAsFixed(2) ?? + "", + ), startDate: e[type]?["first_aired"] ?? "", publishingType: type, publishingStatus: e[type]["status"], From 3a577a4c9e4043ddbfa10978832ffbe3f229042e Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Mon, 25 Aug 2025 13:21:37 +0100 Subject: [PATCH 074/100] Add fixed versions packages of isar_generator and hive_generator to avoid the Analyzer plugin error --- l10n.yaml | 1 - lib/eval/model/source_preference.g.dart | 6176 +++--- lib/models/category.g.dart | 499 +- lib/models/changed.g.dart | 453 +- lib/models/chapter.g.dart | 1805 +- lib/models/custom_button.g.dart | 1039 +- lib/models/download.g.dart | 344 +- lib/models/history.g.dart | 534 +- lib/models/manga.g.dart | 2449 +-- lib/models/settings.g.dart | 15905 ++++++++-------- lib/models/source.g.dart | 3362 ++-- lib/models/sync_preference.g.dart | 1062 +- lib/models/track.g.dart | 1190 +- lib/models/track_preference.g.dart | 657 +- lib/models/update.g.dart | 530 +- .../anime_player_controller_provider.g.dart | 55 +- .../anime/providers/state_provider.g.dart | 23 +- .../providers/extensions_provider.g.dart | 44 +- .../providers/calendar_provider.g.dart | 45 +- .../history/providers/isar_providers.g.dart | 91 +- .../library/providers/add_torrent.g.dart | 50 +- .../library/providers/isar_providers.g.dart | 96 +- .../providers/library_state_provider.g.dart | 791 +- .../library/providers/local_archive.g.dart | 38 +- .../main_view/providers/migration.g.dart | 5 +- .../providers/archive_reader_providers.g.dart | 255 +- .../detail/providers/isar_providers.g.dart | 89 +- .../detail/providers/state_providers.g.dart | 591 +- .../providers/track_state_providers.g.dart | 86 +- .../update_manga_detail_providers.g.dart | 38 +- .../download/providers/convert_to_cbz.g.dart | 49 +- .../providers/download_provider.g.dart | 134 +- .../home/providers/state_provider.g.dart | 23 +- .../providers/color_filter_provider.g.dart | 62 +- .../providers/crop_borders_provider.g.dart | 44 +- .../reader_controller_provider.g.dart | 105 +- .../about/providers/check_for_update.g.dart | 53 +- .../providers/isar_providers.g.dart | 45 +- .../providers/auto_backup.g.dart | 62 +- .../data_and_storage/providers/backup.g.dart | 50 +- .../data_and_storage/providers/restore.g.dart | 206 +- .../providers/storage_usage.g.dart | 39 +- .../algorithm_weights_state_provider.g.dart | 23 +- .../downloaded_only_state_provider.g.dart | 16 +- .../incognito_mode_state_provider.g.dart | 16 +- .../providers/app_font_family.g.dart | 16 +- .../blend_level_state_provider.g.dart | 16 +- .../date_format_state_provider.g.dart | 32 +- .../flex_scheme_color_state_provider.g.dart | 16 +- ...pure_black_dark_mode_state_provider.g.dart | 16 +- .../theme_mode_state_provider.g.dart | 32 +- .../providers/browse_state_provider.g.dart | 164 +- .../providers/downloads_state_provider.g.dart | 71 +- .../providers/general_state_provider.g.dart | 103 +- .../providers/custom_buttons_provider.g.dart | 20 +- .../player_audio_state_provider.g.dart | 64 +- .../player_decoder_state_provider.g.dart | 100 +- .../providers/player_state_provider.g.dart | 183 +- .../providers/reader_state_provider.g.dart | 224 +- .../sync/providers/sync_providers.g.dart | 55 +- .../track/providers/track_providers.g.dart | 70 +- .../statistics/statistics_provider.g.dart | 53 +- .../novel_reader_controller_provider.g.dart | 55 +- lib/providers/l10n_providers.g.dart | 16 +- lib/router/router.g.dart | 21 +- lib/services/aniskip.g.dart | 7 +- lib/services/fetch_item_sources.g.dart | 38 +- lib/services/get_chapter_pages.g.dart | 44 +- lib/services/get_detail.g.dart | 53 +- lib/services/get_html_content.g.dart | 44 +- lib/services/get_latest_updates.g.dart | 54 +- lib/services/get_popular.g.dart | 53 +- lib/services/get_source_baseurl.g.dart | 48 +- lib/services/get_video_list.g.dart | 75 +- lib/services/search.g.dart | 48 +- lib/services/search_.g.dart | 48 +- lib/services/supports_latest.g.dart | 48 +- lib/services/sync_server.g.dart | 52 +- lib/services/trackers/anilist.g.dart | 72 +- lib/services/trackers/kitsu.g.dart | 70 +- lib/services/trackers/myanimelist.g.dart | 64 +- lib/utils/headers.g.dart | 43 +- plugins/hive_generator/CHANGELOG.md | 119 + plugins/hive_generator/LICENSE | 13 + plugins/hive_generator/README.md | 1 + plugins/hive_generator/analysis_options.yaml | 75 + plugins/hive_generator/build.yaml | 8 + plugins/hive_generator/example/README.md | 3 + plugins/hive_generator/example/lib/types.dart | 63 + .../hive_generator/example/lib/types.g.dart | 165 + plugins/hive_generator/example/pubspec.lock | 476 + plugins/hive_generator/example/pubspec.yaml | 9 + .../hive_generator/lib/hive_generator.dart | 6 + plugins/hive_generator/lib/src/builder.dart | 25 + .../hive_generator/lib/src/class_builder.dart | 223 + .../hive_generator/lib/src/enum_builder.dart | 50 + plugins/hive_generator/lib/src/helper.dart | 40 + .../lib/src/type_adapter_generator.dart | 170 + .../hive_generator/lib/src/type_helper.dart | 133 + plugins/hive_generator/pubspec.lock | 589 + plugins/hive_generator/pubspec.yaml | 21 + .../test/type_adapter_generator_test.dart | 12 + plugins/isar_generator/CHANGELOG.md | 1 + plugins/isar_generator/LICENSE | 202 + plugins/isar_generator/README.md | 1 + plugins/isar_generator/analysis_options.yaml | 10 + plugins/isar_generator/build.yaml | 8 + .../isar_generator/lib/isar_generator.dart | 11 + .../lib/src/code_gen/by_index_generator.dart | 119 + .../code_gen/collection_schema_generator.dart | 111 + .../code_gen/query_distinct_by_generator.dart | 27 + .../src/code_gen/query_filter_generator.dart | 278 + .../lib/src/code_gen/query_filter_length.dart | 50 + .../src/code_gen/query_link_generator.dart | 38 + .../src/code_gen/query_object_generator.dart | 29 + .../code_gen/query_property_generator.dart | 25 + .../src/code_gen/query_sort_by_generator.dart | 55 + .../src/code_gen/query_where_generator.dart | 568 + .../src/code_gen/type_adapter_generator.dart | 476 + .../lib/src/collection_generator.dart | 105 + plugins/isar_generator/lib/src/helper.dart | 183 + .../isar_generator/lib/src/isar_analyzer.dart | 502 + plugins/isar_generator/lib/src/isar_type.dart | 107 + .../isar_generator/lib/src/object_info.dart | 210 + plugins/isar_generator/pubspec.lock | 557 + plugins/isar_generator/pubspec.yaml | 26 + plugins/isar_generator/test/error_test.dart | 33 + .../test/errors/class/abstract.dart | 8 + .../errors/class/collection_supertype.dart | 19 + .../test/errors/class/constructor_named.dart | 10 + .../class/constructor_unknown_parameter.dart | 13 + .../class/constructor_wrong_parameter.dart | 13 + .../test/errors/class/enum.dart | 7 + .../test/errors/class/invalid_name.dart | 8 + .../test/errors/class/mixin.dart | 7 + .../test/errors/class/private.dart | 9 + .../test/errors/class/variable.dart | 7 + .../test/errors/id/duplicate.dart | 10 + .../test/errors/id/missing.dart | 10 + .../index/composite_double_not_last.dart | 13 + .../index/composite_non_hashed_list.dart | 13 + .../composite_string_value_not_last.dart | 13 + .../test/errors/index/contains_id.dart | 11 + .../test/errors/index/double_list_hashed.dart | 11 + .../test/errors/index/duplicate_name.dart | 14 + .../test/errors/index/duplicate_property.dart | 13 + .../test/errors/index/invalid_name.dart | 11 + .../test/errors/index/non_string_hashed.dart | 11 + .../non_string_list_hashed_elements.dart | 11 + .../test/errors/index/non_unique_replace.dart | 11 + .../test/errors/index/object_hashed.dart | 14 + .../test/errors/index/object_list_hashed.dart | 14 + .../errors/index/property_does_not_exist.dart | 11 + .../link/backlink_target_does_no_exist.dart | 16 + .../link/backlink_target_is_backlink.dart | 19 + .../link/backlink_target_not_a_link.dart | 18 + .../test/errors/link/duplicate_name.dart | 18 + .../test/errors/link/invalid_name.dart | 16 + .../isar_generator/test/errors/link/late.dart | 15 + .../test/errors/link/nullable.dart | 15 + .../errors/link/target_not_a_collection.dart | 10 + .../test/errors/link/type_nullable.dart | 15 + .../test/errors/property/duplicate_name.dart | 13 + .../test/errors/property/enum_bool_type.dart | 17 + .../errors/property/enum_double_type.dart | 17 + .../test/errors/property/enum_duplicate.dart | 21 + .../test/errors/property/enum_float_type.dart | 17 + .../test/errors/property/enum_list_type.dart | 17 + .../errors/property/enum_not_annotated.dart | 14 + .../test/errors/property/enum_null_value.dart | 17 + .../errors/property/enum_object_type.dart | 20 + .../test/errors/property/invalid_name.dart | 11 + .../test/errors/property/null_byte.dart | 10 + .../errors/property/null_byte_element.dart | 10 + .../errors/property/unsupported_type.dart | 10 + pubspec.lock | 98 +- pubspec.yaml | 19 +- 177 files changed, 27960 insertions(+), 20136 deletions(-) create mode 100644 plugins/hive_generator/CHANGELOG.md create mode 100644 plugins/hive_generator/LICENSE create mode 100644 plugins/hive_generator/README.md create mode 100644 plugins/hive_generator/analysis_options.yaml create mode 100644 plugins/hive_generator/build.yaml create mode 100644 plugins/hive_generator/example/README.md create mode 100644 plugins/hive_generator/example/lib/types.dart create mode 100644 plugins/hive_generator/example/lib/types.g.dart create mode 100644 plugins/hive_generator/example/pubspec.lock create mode 100644 plugins/hive_generator/example/pubspec.yaml create mode 100644 plugins/hive_generator/lib/hive_generator.dart create mode 100644 plugins/hive_generator/lib/src/builder.dart create mode 100644 plugins/hive_generator/lib/src/class_builder.dart create mode 100644 plugins/hive_generator/lib/src/enum_builder.dart create mode 100644 plugins/hive_generator/lib/src/helper.dart create mode 100644 plugins/hive_generator/lib/src/type_adapter_generator.dart create mode 100644 plugins/hive_generator/lib/src/type_helper.dart create mode 100644 plugins/hive_generator/pubspec.lock create mode 100644 plugins/hive_generator/pubspec.yaml create mode 100644 plugins/hive_generator/test/type_adapter_generator_test.dart create mode 100644 plugins/isar_generator/CHANGELOG.md create mode 100644 plugins/isar_generator/LICENSE create mode 100644 plugins/isar_generator/README.md create mode 100644 plugins/isar_generator/analysis_options.yaml create mode 100644 plugins/isar_generator/build.yaml create mode 100644 plugins/isar_generator/lib/isar_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/by_index_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/collection_schema_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_distinct_by_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_filter_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_filter_length.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_link_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_object_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_property_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_sort_by_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/query_where_generator.dart create mode 100644 plugins/isar_generator/lib/src/code_gen/type_adapter_generator.dart create mode 100644 plugins/isar_generator/lib/src/collection_generator.dart create mode 100644 plugins/isar_generator/lib/src/helper.dart create mode 100644 plugins/isar_generator/lib/src/isar_analyzer.dart create mode 100644 plugins/isar_generator/lib/src/isar_type.dart create mode 100644 plugins/isar_generator/lib/src/object_info.dart create mode 100644 plugins/isar_generator/pubspec.lock create mode 100644 plugins/isar_generator/pubspec.yaml create mode 100644 plugins/isar_generator/test/error_test.dart create mode 100644 plugins/isar_generator/test/errors/class/abstract.dart create mode 100644 plugins/isar_generator/test/errors/class/collection_supertype.dart create mode 100644 plugins/isar_generator/test/errors/class/constructor_named.dart create mode 100644 plugins/isar_generator/test/errors/class/constructor_unknown_parameter.dart create mode 100644 plugins/isar_generator/test/errors/class/constructor_wrong_parameter.dart create mode 100644 plugins/isar_generator/test/errors/class/enum.dart create mode 100644 plugins/isar_generator/test/errors/class/invalid_name.dart create mode 100644 plugins/isar_generator/test/errors/class/mixin.dart create mode 100644 plugins/isar_generator/test/errors/class/private.dart create mode 100644 plugins/isar_generator/test/errors/class/variable.dart create mode 100644 plugins/isar_generator/test/errors/id/duplicate.dart create mode 100644 plugins/isar_generator/test/errors/id/missing.dart create mode 100644 plugins/isar_generator/test/errors/index/composite_double_not_last.dart create mode 100644 plugins/isar_generator/test/errors/index/composite_non_hashed_list.dart create mode 100644 plugins/isar_generator/test/errors/index/composite_string_value_not_last.dart create mode 100644 plugins/isar_generator/test/errors/index/contains_id.dart create mode 100644 plugins/isar_generator/test/errors/index/double_list_hashed.dart create mode 100644 plugins/isar_generator/test/errors/index/duplicate_name.dart create mode 100644 plugins/isar_generator/test/errors/index/duplicate_property.dart create mode 100644 plugins/isar_generator/test/errors/index/invalid_name.dart create mode 100644 plugins/isar_generator/test/errors/index/non_string_hashed.dart create mode 100644 plugins/isar_generator/test/errors/index/non_string_list_hashed_elements.dart create mode 100644 plugins/isar_generator/test/errors/index/non_unique_replace.dart create mode 100644 plugins/isar_generator/test/errors/index/object_hashed.dart create mode 100644 plugins/isar_generator/test/errors/index/object_list_hashed.dart create mode 100644 plugins/isar_generator/test/errors/index/property_does_not_exist.dart create mode 100644 plugins/isar_generator/test/errors/link/backlink_target_does_no_exist.dart create mode 100644 plugins/isar_generator/test/errors/link/backlink_target_is_backlink.dart create mode 100644 plugins/isar_generator/test/errors/link/backlink_target_not_a_link.dart create mode 100644 plugins/isar_generator/test/errors/link/duplicate_name.dart create mode 100644 plugins/isar_generator/test/errors/link/invalid_name.dart create mode 100644 plugins/isar_generator/test/errors/link/late.dart create mode 100644 plugins/isar_generator/test/errors/link/nullable.dart create mode 100644 plugins/isar_generator/test/errors/link/target_not_a_collection.dart create mode 100644 plugins/isar_generator/test/errors/link/type_nullable.dart create mode 100644 plugins/isar_generator/test/errors/property/duplicate_name.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_bool_type.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_double_type.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_duplicate.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_float_type.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_list_type.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_not_annotated.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_null_value.dart create mode 100644 plugins/isar_generator/test/errors/property/enum_object_type.dart create mode 100644 plugins/isar_generator/test/errors/property/invalid_name.dart create mode 100644 plugins/isar_generator/test/errors/property/null_byte.dart create mode 100644 plugins/isar_generator/test/errors/property/null_byte_element.dart create mode 100644 plugins/isar_generator/test/errors/property/unsupported_type.dart diff --git a/l10n.yaml b/l10n.yaml index 8b0fa682..21c77020 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -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 diff --git a/lib/eval/model/source_preference.g.dart b/lib/eval/model/source_preference.g.dart index 7b70c866..0c891c46 100644 --- a/lib/eval/model/source_preference.g.dart +++ b/lib/eval/model/source_preference.g.dart @@ -21,43 +21,41 @@ const SourcePreferenceSchema = CollectionSchema( id: 0, name: r'checkBoxPreference', type: IsarType.object, + target: r'CheckBoxPreference', ), r'editTextPreference': PropertySchema( id: 1, name: r'editTextPreference', type: IsarType.object, + target: r'EditTextPreference', ), - r'key': PropertySchema( - id: 2, - name: r'key', - type: IsarType.string, - ), + r'key': PropertySchema(id: 2, name: r'key', type: IsarType.string), r'listPreference': PropertySchema( id: 3, name: r'listPreference', type: IsarType.object, + target: r'ListPreference', ), r'multiSelectListPreference': PropertySchema( id: 4, name: r'multiSelectListPreference', type: IsarType.object, + target: r'MultiSelectListPreference', ), - r'sourceId': PropertySchema( - id: 5, - name: r'sourceId', - type: IsarType.long, - ), + r'sourceId': PropertySchema(id: 5, name: r'sourceId', type: IsarType.long), r'switchPreferenceCompat': PropertySchema( id: 6, name: r'switchPreferenceCompat', type: IsarType.object, + target: r'SwitchPreferenceCompat', - ) + ), }, + estimateSize: _sourcePreferenceEstimateSize, serialize: _sourcePreferenceSerialize, deserialize: _sourcePreferenceDeserialize, @@ -70,8 +68,9 @@ const SourcePreferenceSchema = CollectionSchema( r'SwitchPreferenceCompat': SwitchPreferenceCompatSchema, r'ListPreference': ListPreferenceSchema, r'MultiSelectListPreference': MultiSelectListPreferenceSchema, - r'EditTextPreference': EditTextPreferenceSchema + r'EditTextPreference': EditTextPreferenceSchema, }, + getId: _sourcePreferenceGetId, getLinks: _sourcePreferenceGetLinks, attach: _sourcePreferenceAttach, @@ -87,17 +86,25 @@ int _sourcePreferenceEstimateSize( { final value = object.checkBoxPreference; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + CheckBoxPreferenceSchema.estimateSize( - value, allOffsets[CheckBoxPreference]!, allOffsets); + value, + allOffsets[CheckBoxPreference]!, + allOffsets, + ); } } { final value = object.editTextPreference; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + EditTextPreferenceSchema.estimateSize( - value, allOffsets[EditTextPreference]!, allOffsets); + value, + allOffsets[EditTextPreference]!, + allOffsets, + ); } } { @@ -109,25 +116,37 @@ int _sourcePreferenceEstimateSize( { final value = object.listPreference; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + ListPreferenceSchema.estimateSize( - value, allOffsets[ListPreference]!, allOffsets); + value, + allOffsets[ListPreference]!, + allOffsets, + ); } } { final value = object.multiSelectListPreference; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + MultiSelectListPreferenceSchema.estimateSize( - value, allOffsets[MultiSelectListPreference]!, allOffsets); + value, + allOffsets[MultiSelectListPreference]!, + allOffsets, + ); } } { final value = object.switchPreferenceCompat; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + SwitchPreferenceCompatSchema.estimateSize( - value, allOffsets[SwitchPreferenceCompat]!, allOffsets); + value, + allOffsets[SwitchPreferenceCompat]!, + allOffsets, + ); } } return bytesCount; @@ -197,12 +216,12 @@ SourcePreference _sourcePreferenceDeserialize( ListPreferenceSchema.deserialize, allOffsets, ), - multiSelectListPreference: - reader.readObjectOrNull( - offsets[4], - MultiSelectListPreferenceSchema.deserialize, - allOffsets, - ), + multiSelectListPreference: reader + .readObjectOrNull( + offsets[4], + MultiSelectListPreferenceSchema.deserialize, + allOffsets, + ), sourceId: reader.readLongOrNull(offsets[5]), switchPreferenceCompat: reader.readObjectOrNull( offsets[6], @@ -222,38 +241,43 @@ P _sourcePreferenceDeserializeProp

    ( switch (propertyId) { case 0: return (reader.readObjectOrNull( - offset, - CheckBoxPreferenceSchema.deserialize, - allOffsets, - )) as P; + offset, + CheckBoxPreferenceSchema.deserialize, + allOffsets, + )) + as P; case 1: return (reader.readObjectOrNull( - offset, - EditTextPreferenceSchema.deserialize, - allOffsets, - )) as P; + offset, + EditTextPreferenceSchema.deserialize, + allOffsets, + )) + as P; case 2: return (reader.readStringOrNull(offset)) as P; case 3: return (reader.readObjectOrNull( - offset, - ListPreferenceSchema.deserialize, - allOffsets, - )) as P; + offset, + ListPreferenceSchema.deserialize, + allOffsets, + )) + as P; case 4: return (reader.readObjectOrNull( - offset, - MultiSelectListPreferenceSchema.deserialize, - allOffsets, - )) as P; + offset, + MultiSelectListPreferenceSchema.deserialize, + allOffsets, + )) + as P; case 5: return (reader.readLongOrNull(offset)) as P; case 6: return (reader.readObjectOrNull( - offset, - SwitchPreferenceCompatSchema.deserialize, - allOffsets, - )) as P; + offset, + SwitchPreferenceCompatSchema.deserialize, + allOffsets, + )) + as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -268,7 +292,10 @@ List> _sourcePreferenceGetLinks(SourcePreference object) { } void _sourcePreferenceAttach( - IsarCollection col, Id id, SourcePreference object) { + IsarCollection col, + Id id, + SourcePreference object, +) { object.id = id; } @@ -284,17 +311,15 @@ extension SourcePreferenceQueryWhereSort extension SourcePreferenceQueryWhere on QueryBuilder { QueryBuilder idEqualTo( - Id id) { + 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 - idNotEqualTo(Id id) { + idNotEqualTo(Id id) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -317,7 +342,7 @@ extension SourcePreferenceQueryWhere } QueryBuilder - idGreaterThan(Id id, {bool include = false}) { + idGreaterThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -326,7 +351,7 @@ extension SourcePreferenceQueryWhere } QueryBuilder - idLessThan(Id id, {bool include = false}) { + idLessThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -341,12 +366,14 @@ extension SourcePreferenceQueryWhere 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, + ), + ); }); } } @@ -354,181 +381,183 @@ extension SourcePreferenceQueryWhere extension SourcePreferenceQueryFilter on QueryBuilder { QueryBuilder - checkBoxPreferenceIsNull() { + checkBoxPreferenceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'checkBoxPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'checkBoxPreference'), + ); }); } QueryBuilder - checkBoxPreferenceIsNotNull() { + checkBoxPreferenceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'checkBoxPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'checkBoxPreference'), + ); }); } QueryBuilder - editTextPreferenceIsNull() { + editTextPreferenceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'editTextPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'editTextPreference'), + ); }); } QueryBuilder - editTextPreferenceIsNotNull() { + editTextPreferenceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'editTextPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'editTextPreference'), + ); }); } QueryBuilder - idIsNull() { + 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 - idIsNotNull() { + 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 - idEqualTo(Id? value) { + 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), + ); }); } QueryBuilder - idGreaterThan( - Id? value, { - bool include = false, - }) { + idGreaterThan(Id? value, {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, + ), + ); }); } QueryBuilder - idLessThan( - Id? value, { - bool include = false, - }) { + idLessThan(Id? value, {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, + ), + ); }); } QueryBuilder - idBetween( + idBetween( Id? lower, Id? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'id', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - keyIsNull() { + keyIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'key', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'key'), + ); }); } QueryBuilder - keyIsNotNull() { + keyIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'key', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'key'), + ); }); } QueryBuilder - keyEqualTo( - String? value, { - bool caseSensitive = true, - }) { + keyEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyGreaterThan( + keyGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyLessThan( + keyLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyBetween( + keyBetween( String? lower, String? upper, { bool includeLower = true, @@ -536,212 +565,213 @@ extension SourcePreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'key', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'key', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyStartsWith( - String value, { - bool caseSensitive = true, - }) { + keyStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyEndsWith( - String value, { - bool caseSensitive = true, - }) { + keyEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyContains(String value, {bool caseSensitive = true}) { + keyContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyMatches(String pattern, {bool caseSensitive = true}) { + keyMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'key', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'key', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - keyIsEmpty() { + keyIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'key', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'key', value: ''), + ); }); } QueryBuilder - keyIsNotEmpty() { + keyIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'key', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'key', value: ''), + ); }); } QueryBuilder - listPreferenceIsNull() { + listPreferenceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'listPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'listPreference'), + ); }); } QueryBuilder - listPreferenceIsNotNull() { + listPreferenceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'listPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'listPreference'), + ); }); } QueryBuilder - multiSelectListPreferenceIsNull() { + multiSelectListPreferenceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'multiSelectListPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'multiSelectListPreference'), + ); }); } QueryBuilder - multiSelectListPreferenceIsNotNull() { + multiSelectListPreferenceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'multiSelectListPreference', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'multiSelectListPreference'), + ); }); } QueryBuilder - sourceIdIsNull() { + sourceIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sourceId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sourceId'), + ); }); } QueryBuilder - sourceIdIsNotNull() { + sourceIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sourceId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sourceId'), + ); }); } QueryBuilder - sourceIdEqualTo(int? value) { + sourceIdEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceId', value: value), + ); }); } QueryBuilder - sourceIdGreaterThan( - int? value, { - bool include = false, - }) { + sourceIdGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceId', + value: value, + ), + ); }); } QueryBuilder - sourceIdLessThan( - int? value, { - bool include = false, - }) { + sourceIdLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceId', + value: value, + ), + ); }); } QueryBuilder - sourceIdBetween( + sourceIdBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'sourceId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - switchPreferenceCompatIsNull() { + switchPreferenceCompatIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'switchPreferenceCompat', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'switchPreferenceCompat'), + ); }); } QueryBuilder - switchPreferenceCompatIsNotNull() { + switchPreferenceCompatIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'switchPreferenceCompat', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'switchPreferenceCompat'), + ); }); } } @@ -749,35 +779,35 @@ extension SourcePreferenceQueryFilter extension SourcePreferenceQueryObject on QueryBuilder { QueryBuilder - checkBoxPreference(FilterQuery q) { + checkBoxPreference(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'checkBoxPreference'); }); } QueryBuilder - editTextPreference(FilterQuery q) { + editTextPreference(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'editTextPreference'); }); } QueryBuilder - listPreference(FilterQuery q) { + listPreference(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'listPreference'); }); } QueryBuilder - multiSelectListPreference(FilterQuery q) { + multiSelectListPreference(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'multiSelectListPreference'); }); } QueryBuilder - switchPreferenceCompat(FilterQuery q) { + switchPreferenceCompat(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'switchPreferenceCompat'); }); @@ -796,21 +826,21 @@ extension SourcePreferenceQuerySortBy } QueryBuilder - sortByKeyDesc() { + sortByKeyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.desc); }); } QueryBuilder - sortBySourceId() { + sortBySourceId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.asc); }); } QueryBuilder - sortBySourceIdDesc() { + sortBySourceIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.desc); }); @@ -826,7 +856,7 @@ extension SourcePreferenceQuerySortThenBy } QueryBuilder - thenByIdDesc() { + thenByIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.desc); }); @@ -839,21 +869,21 @@ extension SourcePreferenceQuerySortThenBy } QueryBuilder - thenByKeyDesc() { + thenByKeyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.desc); }); } QueryBuilder - thenBySourceId() { + thenBySourceId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.asc); }); } QueryBuilder - thenBySourceIdDesc() { + thenBySourceIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.desc); }); @@ -862,15 +892,16 @@ extension SourcePreferenceQuerySortThenBy extension SourcePreferenceQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByKey( - {bool caseSensitive = true}) { + QueryBuilder distinctByKey({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'key', caseSensitive: caseSensitive); }); } QueryBuilder - distinctBySourceId() { + distinctBySourceId() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'sourceId'); }); @@ -886,14 +917,14 @@ extension SourcePreferenceQueryProperty } QueryBuilder - checkBoxPreferenceProperty() { + checkBoxPreferenceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'checkBoxPreference'); }); } QueryBuilder - editTextPreferenceProperty() { + editTextPreferenceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'editTextPreference'); }); @@ -906,14 +937,14 @@ extension SourcePreferenceQueryProperty } QueryBuilder - listPreferenceProperty() { + listPreferenceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'listPreference'); }); } QueryBuilder - multiSelectListPreferenceProperty() { + multiSelectListPreferenceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'multiSelectListPreference'); }); @@ -926,7 +957,7 @@ extension SourcePreferenceQueryProperty } QueryBuilder - switchPreferenceCompatProperty() { + switchPreferenceCompatProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'switchPreferenceCompat'); }); @@ -938,29 +969,18 @@ extension SourcePreferenceQueryProperty extension GetSourcePreferenceStringValueCollection on Isar { IsarCollection - get sourcePreferenceStringValues => this.collection(); + get sourcePreferenceStringValues => this.collection(); } const SourcePreferenceStringValueSchema = CollectionSchema( name: r'SourcePreferenceStringValue', id: 8063295595066322236, properties: { - r'key': PropertySchema( - id: 0, - name: r'key', - type: IsarType.string, - ), - r'sourceId': PropertySchema( - id: 1, - name: r'sourceId', - type: IsarType.long, - ), - r'value': PropertySchema( - id: 2, - name: r'value', - type: IsarType.string, - ) + r'key': PropertySchema(id: 0, name: r'key', type: IsarType.string), + r'sourceId': PropertySchema(id: 1, name: r'sourceId', type: IsarType.long), + r'value': PropertySchema(id: 2, name: r'value', type: IsarType.string), }, + estimateSize: _sourcePreferenceStringValueEstimateSize, serialize: _sourcePreferenceStringValueSerialize, deserialize: _sourcePreferenceStringValueDeserialize, @@ -969,6 +989,7 @@ const SourcePreferenceStringValueSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {}, + getId: _sourcePreferenceStringValueGetId, getLinks: _sourcePreferenceStringValueGetLinks, attach: _sourcePreferenceStringValueAttach, @@ -1045,39 +1066,62 @@ Id _sourcePreferenceStringValueGetId(SourcePreferenceStringValue object) { } List> _sourcePreferenceStringValueGetLinks( - SourcePreferenceStringValue object) { + SourcePreferenceStringValue object, +) { return []; } void _sourcePreferenceStringValueAttach( - IsarCollection col, Id id, SourcePreferenceStringValue object) { + IsarCollection col, + Id id, + SourcePreferenceStringValue object, +) { object.id = id; } -extension SourcePreferenceStringValueQueryWhereSort on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QWhere> { - QueryBuilder anyId() { +extension SourcePreferenceStringValueQueryWhereSort + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QWhere + > { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhere + > + anyId() { return QueryBuilder.apply(this, (query) { return query.addWhereClause(const IdWhereClause.any()); }); } } -extension SourcePreferenceStringValueQueryWhere on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QWhereClause> { - QueryBuilder idEqualTo(Id id) { +extension SourcePreferenceStringValueQueryWhere + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QWhereClause + > { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhereClause + > + idEqualTo(Id id) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: id, - upper: id, - )); + return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); }); } - QueryBuilder idNotEqualTo(Id id) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhereClause + > + idNotEqualTo(Id id) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -1099,8 +1143,12 @@ extension SourcePreferenceStringValueQueryWhere on QueryBuilder< }); } - QueryBuilder idGreaterThan(Id id, {bool include = false}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhereClause + > + idGreaterThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -1108,8 +1156,12 @@ extension SourcePreferenceStringValueQueryWhere on QueryBuilder< }); } - QueryBuilder idLessThan(Id id, {bool include = false}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhereClause + > + idLessThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -1117,150 +1169,201 @@ extension SourcePreferenceStringValueQueryWhere on QueryBuilder< }); } - QueryBuilder idBetween( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterWhereClause + > + idBetween( Id lowerId, Id upperId, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: lowerId, - includeLower: includeLower, - upper: upperId, - includeUpper: includeUpper, - )); + return query.addWhereClause( + IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + ), + ); }); } } -extension SourcePreferenceStringValueQueryFilter on QueryBuilder< +extension SourcePreferenceStringValueQueryFilter + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QFilterCondition + > { + QueryBuilder< SourcePreferenceStringValue, SourcePreferenceStringValue, - QFilterCondition> { - QueryBuilder idEqualTo(Id value) { + 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), + ); }); } - QueryBuilder idGreaterThan( - Id value, { - bool include = false, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + idGreaterThan(Id value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'id', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + ), + ); }); } - QueryBuilder idLessThan( - Id value, { - bool include = false, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + idLessThan(Id value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'id', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + ), + ); }); } - QueryBuilder idBetween( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + idBetween( Id lower, Id upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'id', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder keyIsNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'key', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'key'), + ); }); } - QueryBuilder keyIsNotNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'key', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'key'), + ); }); } - QueryBuilder keyEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyGreaterThan( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyLessThan( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyBetween( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyBetween( String? lower, String? upper, { bool includeLower = true, @@ -1268,229 +1371,303 @@ extension SourcePreferenceStringValueQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'key', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'key', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - keyContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'key', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'key', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - keyMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'key', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'key', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder keyIsEmpty() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'key', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'key', value: ''), + ); }); } - QueryBuilder keyIsNotEmpty() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + keyIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'key', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'key', value: ''), + ); }); } - QueryBuilder sourceIdIsNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sourceId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sourceId'), + ); }); } - QueryBuilder sourceIdIsNotNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sourceId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sourceId'), + ); }); } - QueryBuilder sourceIdEqualTo(int? value) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceId', value: value), + ); }); } - QueryBuilder sourceIdGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceId', + value: value, + ), + ); }); } - QueryBuilder sourceIdLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'sourceId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceId', + value: value, + ), + ); }); } - QueryBuilder sourceIdBetween( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + sourceIdBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'sourceId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder valueIsNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'value'), + ); }); } - QueryBuilder valueIsNotNull() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'value'), + ); }); } - QueryBuilder valueEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueGreaterThan( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueLessThan( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueBetween( + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueBetween( String? lower, String? upper, { bool includeLower = true, @@ -1498,253 +1675,371 @@ extension SourcePreferenceStringValueQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'value', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'value', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - valueContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - valueMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'value', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'value', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valueIsEmpty() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'value', value: ''), + ); }); } - QueryBuilder valueIsNotEmpty() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterFilterCondition + > + valueIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'value', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'value', value: ''), + ); }); } } -extension SourcePreferenceStringValueQueryObject on QueryBuilder< - SourcePreferenceStringValue, - SourcePreferenceStringValue, - QFilterCondition> {} +extension SourcePreferenceStringValueQueryObject + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QFilterCondition + > {} -extension SourcePreferenceStringValueQueryLinks on QueryBuilder< - SourcePreferenceStringValue, - SourcePreferenceStringValue, - QFilterCondition> {} +extension SourcePreferenceStringValueQueryLinks + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QFilterCondition + > {} -extension SourcePreferenceStringValueQuerySortBy on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QSortBy> { - QueryBuilder sortByKey() { +extension SourcePreferenceStringValueQuerySortBy + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QSortBy + > { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortByKey() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.asc); }); } - QueryBuilder sortByKeyDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortByKeyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.desc); }); } - QueryBuilder sortBySourceId() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortBySourceId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.asc); }); } - QueryBuilder sortBySourceIdDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortBySourceIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.desc); }); } - QueryBuilder sortByValue() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortByValue() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'value', Sort.asc); }); } - QueryBuilder sortByValueDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + sortByValueDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'value', Sort.desc); }); } } -extension SourcePreferenceStringValueQuerySortThenBy on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QSortThenBy> { - QueryBuilder thenById() { +extension SourcePreferenceStringValueQuerySortThenBy + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QSortThenBy + > { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); }); } - QueryBuilder thenByIdDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenByIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.desc); }); } - QueryBuilder thenByKey() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenByKey() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.asc); }); } - QueryBuilder thenByKeyDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenByKeyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'key', Sort.desc); }); } - QueryBuilder thenBySourceId() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenBySourceId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.asc); }); } - QueryBuilder thenBySourceIdDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenBySourceIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'sourceId', Sort.desc); }); } - QueryBuilder thenByValue() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenByValue() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'value', Sort.asc); }); } - QueryBuilder thenByValueDesc() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QAfterSortBy + > + thenByValueDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'value', Sort.desc); }); } } -extension SourcePreferenceStringValueQueryWhereDistinct on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QDistinct> { - QueryBuilder distinctByKey({bool caseSensitive = true}) { +extension SourcePreferenceStringValueQueryWhereDistinct + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QDistinct + > { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QDistinct + > + distinctByKey({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'key', caseSensitive: caseSensitive); }); } - QueryBuilder distinctBySourceId() { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QDistinct + > + distinctBySourceId() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'sourceId'); }); } - QueryBuilder distinctByValue({bool caseSensitive = true}) { + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QDistinct + > + distinctByValue({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'value', caseSensitive: caseSensitive); }); } } -extension SourcePreferenceStringValueQueryProperty on QueryBuilder< - SourcePreferenceStringValue, SourcePreferenceStringValue, QQueryProperty> { +extension SourcePreferenceStringValueQueryProperty + on + QueryBuilder< + SourcePreferenceStringValue, + SourcePreferenceStringValue, + QQueryProperty + > { QueryBuilder - idProperty() { + idProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'id'); }); } QueryBuilder - keyProperty() { + keyProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'key'); }); } QueryBuilder - sourceIdProperty() { + sourceIdProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sourceId'); }); } QueryBuilder - valueProperty() { + valueProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'value'); }); @@ -1762,22 +2057,11 @@ const CheckBoxPreferenceSchema = Schema( name: r'CheckBoxPreference', id: -2147338366782458830, properties: { - r'summary': PropertySchema( - id: 0, - name: r'summary', - type: IsarType.string, - ), - r'title': PropertySchema( - id: 1, - name: r'title', - type: IsarType.string, - ), - r'value': PropertySchema( - id: 2, - name: r'value', - type: IsarType.bool, - ) + r'summary': PropertySchema(id: 0, name: r'summary', type: IsarType.string), + r'title': PropertySchema(id: 1, name: r'title', type: IsarType.string), + r'value': PropertySchema(id: 2, name: r'value', type: IsarType.bool), }, + estimateSize: _checkBoxPreferenceEstimateSize, serialize: _checkBoxPreferenceSerialize, deserialize: _checkBoxPreferenceDeserialize, @@ -1851,71 +2135,74 @@ P _checkBoxPreferenceDeserializeProp

    ( extension CheckBoxPreferenceQueryFilter on QueryBuilder { QueryBuilder - summaryIsNull() { + summaryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'summary'), + ); }); } QueryBuilder - summaryIsNotNull() { + summaryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'summary'), + ); }); } QueryBuilder - summaryEqualTo( - String? value, { - bool caseSensitive = true, - }) { + summaryEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryGreaterThan( + summaryGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryLessThan( + summaryLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryBetween( + summaryBetween( String? lower, String? upper, { bool includeLower = true, @@ -1923,153 +2210,158 @@ extension CheckBoxPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'summary', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'summary', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryStartsWith( - String value, { - bool caseSensitive = true, - }) { + summaryStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryEndsWith( - String value, { - bool caseSensitive = true, - }) { + summaryEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryContains(String value, {bool caseSensitive = true}) { + summaryContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryMatches(String pattern, {bool caseSensitive = true}) { + summaryMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'summary', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'summary', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryIsEmpty() { + summaryIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'summary', value: ''), + ); }); } QueryBuilder - summaryIsNotEmpty() { + summaryIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'summary', value: ''), + ); }); } QueryBuilder - titleIsNull() { + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } QueryBuilder - titleIsNotNull() { + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } QueryBuilder - titleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + titleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleGreaterThan( + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleLessThan( + titleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleBetween( + titleBetween( String? lower, String? upper, { bool includeLower = true, @@ -2077,112 +2369,113 @@ extension CheckBoxPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleEndsWith( - String value, { - bool caseSensitive = true, - }) { + titleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleContains(String value, {bool caseSensitive = true}) { + titleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleMatches(String pattern, {bool caseSensitive = true}) { + titleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleIsEmpty() { + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } QueryBuilder - titleIsNotEmpty() { + titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } QueryBuilder - valueIsNull() { + valueIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'value'), + ); }); } QueryBuilder - valueIsNotNull() { + valueIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'value'), + ); }); } QueryBuilder - valueEqualTo(bool? value) { + valueEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'value', value: value), + ); }); } } @@ -2197,22 +2490,11 @@ const SwitchPreferenceCompatSchema = Schema( name: r'SwitchPreferenceCompat', id: 3452971972865195760, properties: { - r'summary': PropertySchema( - id: 0, - name: r'summary', - type: IsarType.string, - ), - r'title': PropertySchema( - id: 1, - name: r'title', - type: IsarType.string, - ), - r'value': PropertySchema( - id: 2, - name: r'value', - type: IsarType.bool, - ) + r'summary': PropertySchema(id: 0, name: r'summary', type: IsarType.string), + r'title': PropertySchema(id: 1, name: r'title', type: IsarType.string), + r'value': PropertySchema(id: 2, name: r'value', type: IsarType.bool), }, + estimateSize: _switchPreferenceCompatEstimateSize, serialize: _switchPreferenceCompatSerialize, deserialize: _switchPreferenceCompatDeserialize, @@ -2283,74 +2565,106 @@ P _switchPreferenceCompatDeserializeProp

    ( } } -extension SwitchPreferenceCompatQueryFilter on QueryBuilder< - SwitchPreferenceCompat, SwitchPreferenceCompat, QFilterCondition> { - QueryBuilder summaryIsNull() { +extension SwitchPreferenceCompatQueryFilter + on + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QFilterCondition + > { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'summary'), + ); }); } - QueryBuilder summaryIsNotNull() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'summary'), + ); }); } - QueryBuilder summaryEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryGreaterThan( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryLessThan( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryBetween( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryBetween( String? lower, String? upper, { bool includeLower = true, @@ -2358,155 +2672,206 @@ extension SwitchPreferenceCompatQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'summary', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'summary', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - summaryContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - summaryMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'summary', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'summary', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryIsEmpty() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'summary', value: ''), + ); }); } - QueryBuilder summaryIsNotEmpty() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + summaryIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'summary', value: ''), + ); }); } - QueryBuilder titleIsNull() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } - QueryBuilder titleIsNotNull() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } - QueryBuilder titleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleGreaterThan( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleLessThan( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleBetween( + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleBetween( String? lower, String? upper, { bool includeLower = true, @@ -2514,120 +2879,160 @@ extension SwitchPreferenceCompatQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - titleContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - titleMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleIsEmpty() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } - QueryBuilder titleIsNotEmpty() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } - QueryBuilder valueIsNull() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + valueIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'value'), + ); }); } - QueryBuilder valueIsNotNull() { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + valueIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'value'), + ); }); } - QueryBuilder valueEqualTo(bool? value) { + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QAfterFilterCondition + > + valueEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'value', value: value), + ); }); } } -extension SwitchPreferenceCompatQueryObject on QueryBuilder< - SwitchPreferenceCompat, SwitchPreferenceCompat, QFilterCondition> {} +extension SwitchPreferenceCompatQueryObject + on + QueryBuilder< + SwitchPreferenceCompat, + SwitchPreferenceCompat, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -2646,22 +3051,15 @@ const ListPreferenceSchema = Schema( name: r'entryValues', type: IsarType.stringList, ), - r'summary': PropertySchema( - id: 2, - name: r'summary', - type: IsarType.string, - ), - r'title': PropertySchema( - id: 3, - name: r'title', - type: IsarType.string, - ), + r'summary': PropertySchema(id: 2, name: r'summary', type: IsarType.string), + r'title': PropertySchema(id: 3, name: r'title', type: IsarType.string), r'valueIndex': PropertySchema( id: 4, name: r'valueIndex', type: IsarType.long, - ) + ), }, + estimateSize: _listPreferenceEstimateSize, serialize: _listPreferenceSerialize, deserialize: _listPreferenceDeserialize, @@ -2767,71 +3165,74 @@ P _listPreferenceDeserializeProp

    ( extension ListPreferenceQueryFilter on QueryBuilder { QueryBuilder - entriesIsNull() { + entriesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'entries', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'entries'), + ); }); } QueryBuilder - entriesIsNotNull() { + entriesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'entries', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'entries'), + ); }); } QueryBuilder - entriesElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + entriesElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entriesElementGreaterThan( + entriesElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entriesElementLessThan( + entriesElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entriesElementBetween( + entriesElementBetween( String lower, String upper, { bool includeLower = true, @@ -2839,160 +3240,126 @@ extension ListPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'entries', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'entries', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entries', - value: '', - )); - }); - } - - QueryBuilder - entriesElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'entries', - value: '', - )); - }); - } - - QueryBuilder - entriesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'entries', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entriesIsEmpty() { + entriesElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entriesIsNotEmpty() { + entriesElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entriesLengthLessThan( - int length, { - bool include = false, - }) { + entriesElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entriesLengthGreaterThan( - int length, { - bool include = false, - }) { + entriesElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'entries', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entriesLengthBetween( + entriesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'entries', value: ''), + ); + }); + } + + QueryBuilder + entriesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'entries', value: ''), + ); + }); + } + + QueryBuilder + entriesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', length, true, length, true); + }); + } + + QueryBuilder + entriesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, true, 0, true); + }); + } + + QueryBuilder + entriesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, false, 999999, true); + }); + } + + QueryBuilder + entriesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, true, length, include); + }); + } + + QueryBuilder + entriesLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', length, include, 999999, true); + }); + } + + QueryBuilder + entriesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -3010,71 +3377,74 @@ extension ListPreferenceQueryFilter } QueryBuilder - entryValuesIsNull() { + entryValuesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'entryValues', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'entryValues'), + ); }); } QueryBuilder - entryValuesIsNotNull() { + entryValuesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'entryValues', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'entryValues'), + ); }); } QueryBuilder - entryValuesElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + entryValuesElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entryValuesElementGreaterThan( + entryValuesElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entryValuesElementLessThan( + entryValuesElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - entryValuesElementBetween( + entryValuesElementBetween( String lower, String upper, { bool includeLower = true, @@ -3082,160 +3452,126 @@ extension ListPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'entryValues', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'entryValues', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entryValues', - value: '', - )); - }); - } - - QueryBuilder - entryValuesElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'entryValues', - value: '', - )); - }); - } - - QueryBuilder - entryValuesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'entryValues', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entryValuesIsEmpty() { + entryValuesElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entryValuesIsNotEmpty() { + entryValuesElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entryValuesLengthLessThan( - int length, { - bool include = false, - }) { + entryValuesElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entryValuesLengthGreaterThan( - int length, { - bool include = false, - }) { + entryValuesElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'entryValues', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - entryValuesLengthBetween( + entryValuesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'entryValues', value: ''), + ); + }); + } + + QueryBuilder + entryValuesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'entryValues', value: ''), + ); + }); + } + + QueryBuilder + entryValuesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', length, true, length, true); + }); + } + + QueryBuilder + entryValuesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, true, 0, true); + }); + } + + QueryBuilder + entryValuesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, false, 999999, true); + }); + } + + QueryBuilder + entryValuesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, true, length, include); + }); + } + + QueryBuilder + entryValuesLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', length, include, 999999, true); + }); + } + + QueryBuilder + entryValuesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -3253,71 +3589,74 @@ extension ListPreferenceQueryFilter } QueryBuilder - summaryIsNull() { + summaryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'summary'), + ); }); } QueryBuilder - summaryIsNotNull() { + summaryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'summary'), + ); }); } QueryBuilder - summaryEqualTo( - String? value, { - bool caseSensitive = true, - }) { + summaryEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryGreaterThan( + summaryGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryLessThan( + summaryLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryBetween( + summaryBetween( String? lower, String? upper, { bool includeLower = true, @@ -3325,153 +3664,158 @@ extension ListPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'summary', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'summary', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryStartsWith( - String value, { - bool caseSensitive = true, - }) { + summaryStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryEndsWith( - String value, { - bool caseSensitive = true, - }) { + summaryEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryContains(String value, {bool caseSensitive = true}) { + summaryContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryMatches(String pattern, {bool caseSensitive = true}) { + summaryMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'summary', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'summary', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryIsEmpty() { + summaryIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'summary', value: ''), + ); }); } QueryBuilder - summaryIsNotEmpty() { + summaryIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'summary', value: ''), + ); }); } QueryBuilder - titleIsNull() { + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } QueryBuilder - titleIsNotNull() { + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } QueryBuilder - titleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + titleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleGreaterThan( + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleLessThan( + titleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleBetween( + titleBetween( String? lower, String? upper, { bool includeLower = true, @@ -3479,158 +3823,159 @@ extension ListPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleEndsWith( - String value, { - bool caseSensitive = true, - }) { + titleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleContains(String value, {bool caseSensitive = true}) { + titleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleMatches(String pattern, {bool caseSensitive = true}) { + titleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleIsEmpty() { + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } QueryBuilder - titleIsNotEmpty() { + titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } QueryBuilder - valueIndexIsNull() { + valueIndexIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'valueIndex', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'valueIndex'), + ); }); } QueryBuilder - valueIndexIsNotNull() { + valueIndexIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'valueIndex', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'valueIndex'), + ); }); } QueryBuilder - valueIndexEqualTo(int? value) { + valueIndexEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'valueIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'valueIndex', value: value), + ); }); } QueryBuilder - valueIndexGreaterThan( - int? value, { - bool include = false, - }) { + valueIndexGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'valueIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'valueIndex', + value: value, + ), + ); }); } QueryBuilder - valueIndexLessThan( - int? value, { - bool include = false, - }) { + valueIndexLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'valueIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'valueIndex', + value: value, + ), + ); }); } QueryBuilder - valueIndexBetween( + valueIndexBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'valueIndex', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'valueIndex', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -3655,22 +4000,15 @@ const MultiSelectListPreferenceSchema = Schema( name: r'entryValues', type: IsarType.stringList, ), - r'summary': PropertySchema( - id: 2, - name: r'summary', - type: IsarType.string, - ), - r'title': PropertySchema( - id: 3, - name: r'title', - type: IsarType.string, - ), + r'summary': PropertySchema(id: 2, name: r'summary', type: IsarType.string), + r'title': PropertySchema(id: 3, name: r'title', type: IsarType.string), r'values': PropertySchema( id: 4, name: r'values', type: IsarType.stringList, - ) + ), }, + estimateSize: _multiSelectListPreferenceEstimateSize, serialize: _multiSelectListPreferenceSerialize, deserialize: _multiSelectListPreferenceDeserialize, @@ -3785,74 +4123,106 @@ P _multiSelectListPreferenceDeserializeProp

    ( } } -extension MultiSelectListPreferenceQueryFilter on QueryBuilder< - MultiSelectListPreference, MultiSelectListPreference, QFilterCondition> { - QueryBuilder entriesIsNull() { +extension MultiSelectListPreferenceQueryFilter + on + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QFilterCondition + > { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'entries', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'entries'), + ); }); } - QueryBuilder entriesIsNotNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'entries', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'entries'), + ); }); } - QueryBuilder entriesElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entriesElementGreaterThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entriesElementLessThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entriesElementBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementBetween( String lower, String upper, { bool includeLower = true, @@ -3860,162 +4230,174 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'entries', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entriesElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entriesElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'entries', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entriesElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'entries', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entriesElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entries', - value: '', - )); - }); - } - - QueryBuilder entriesElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'entries', - value: '', - )); - }); - } - - QueryBuilder entriesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'entries', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entriesIsEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entriesIsNotEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entriesLengthLessThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entriesLengthGreaterThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entries', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'entries', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entriesLengthBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'entries', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'entries', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', length, true, length, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, true, 0, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, false, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', 0, true, length, include); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entries', length, include, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entriesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4032,72 +4414,99 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< }); } - QueryBuilder entryValuesIsNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'entryValues', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'entryValues'), + ); }); } - QueryBuilder entryValuesIsNotNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'entryValues', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'entryValues'), + ); }); } - QueryBuilder entryValuesElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entryValuesElementGreaterThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entryValuesElementLessThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder entryValuesElementBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementBetween( String lower, String upper, { bool includeLower = true, @@ -4105,162 +4514,174 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'entryValues', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entryValuesElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entryValuesElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'entryValues', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - entryValuesElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'entryValues', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder entryValuesElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'entryValues', - value: '', - )); - }); - } - - QueryBuilder entryValuesElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'entryValues', - value: '', - )); - }); - } - - QueryBuilder entryValuesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'entryValues', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entryValuesIsEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entryValuesIsNotEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entryValuesLengthLessThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'entryValues', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entryValuesLengthGreaterThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'entryValues', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'entryValues', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder entryValuesLengthBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'entryValues', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'entryValues', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', length, true, length, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, true, 0, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, false, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', 0, true, length, include); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'entryValues', length, include, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + entryValuesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4277,72 +4698,99 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< }); } - QueryBuilder summaryIsNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'summary'), + ); }); } - QueryBuilder summaryIsNotNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'summary'), + ); }); } - QueryBuilder summaryEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryGreaterThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryLessThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryBetween( String? lower, String? upper, { bool includeLower = true, @@ -4350,155 +4798,206 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'summary', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'summary', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - summaryContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - summaryMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'summary', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'summary', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder summaryIsEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'summary', value: ''), + ); }); } - QueryBuilder summaryIsNotEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + summaryIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'summary', value: ''), + ); }); } - QueryBuilder titleIsNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } - QueryBuilder titleIsNotNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } - QueryBuilder titleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleGreaterThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleLessThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleBetween( String? lower, String? upper, { bool includeLower = true, @@ -4506,155 +5005,206 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleEndsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - titleContains(String value, {bool caseSensitive = true}) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder - titleMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleIsEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } - QueryBuilder titleIsNotEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } - QueryBuilder valuesIsNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'values', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'values'), + ); }); } - QueryBuilder valuesIsNotNull() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'values', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'values'), + ); }); } - QueryBuilder valuesElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valuesElementGreaterThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valuesElementLessThan( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder valuesElementBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementBetween( String lower, String upper, { bool includeLower = true, @@ -4662,162 +5212,174 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'values', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder valuesElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder valuesElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - valuesElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'values', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - valuesElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'values', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder valuesElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'values', - value: '', - )); - }); - } - - QueryBuilder valuesElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'values', - value: '', - )); - }); - } - - QueryBuilder valuesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'values', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'values', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder valuesIsEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'values', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder valuesIsNotEmpty() { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'values', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder valuesLengthLessThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'values', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'values', + value: value, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder valuesLengthGreaterThan( - int length, { - bool include = false, - }) { + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'values', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'values', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } - QueryBuilder valuesLengthBetween( + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'values', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'values', value: ''), + ); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'values', length, true, length, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'values', 0, true, 0, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'values', 0, false, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'values', 0, true, length, include); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'values', length, include, 999999, true); + }); + } + + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QAfterFilterCondition + > + valuesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4835,8 +5397,13 @@ extension MultiSelectListPreferenceQueryFilter on QueryBuilder< } } -extension MultiSelectListPreferenceQueryObject on QueryBuilder< - MultiSelectListPreference, MultiSelectListPreference, QFilterCondition> {} +extension MultiSelectListPreferenceQueryObject + on + QueryBuilder< + MultiSelectListPreference, + MultiSelectListPreference, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -4855,27 +5422,12 @@ const EditTextPreferenceSchema = Schema( name: r'dialogTitle', type: IsarType.string, ), - r'summary': PropertySchema( - id: 2, - name: r'summary', - type: IsarType.string, - ), - r'text': PropertySchema( - id: 3, - name: r'text', - type: IsarType.string, - ), - r'title': PropertySchema( - id: 4, - name: r'title', - type: IsarType.string, - ), - r'value': PropertySchema( - id: 5, - name: r'value', - type: IsarType.string, - ) + r'summary': PropertySchema(id: 2, name: r'summary', type: IsarType.string), + r'text': PropertySchema(id: 3, name: r'text', type: IsarType.string), + r'title': PropertySchema(id: 4, name: r'title', type: IsarType.string), + r'value': PropertySchema(id: 5, name: r'value', type: IsarType.string), }, + estimateSize: _editTextPreferenceEstimateSize, serialize: _editTextPreferenceSerialize, deserialize: _editTextPreferenceDeserialize, @@ -4985,71 +5537,74 @@ P _editTextPreferenceDeserializeProp

    ( extension EditTextPreferenceQueryFilter on QueryBuilder { QueryBuilder - dialogMessageIsNull() { + dialogMessageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dialogMessage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dialogMessage'), + ); }); } QueryBuilder - dialogMessageIsNotNull() { + dialogMessageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dialogMessage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dialogMessage'), + ); }); } QueryBuilder - dialogMessageEqualTo( - String? value, { - bool caseSensitive = true, - }) { + dialogMessageEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageGreaterThan( + dialogMessageGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageLessThan( + dialogMessageLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageBetween( + dialogMessageBetween( String? lower, String? upper, { bool includeLower = true, @@ -5057,153 +5612,158 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dialogMessage', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dialogMessage', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageStartsWith( - String value, { - bool caseSensitive = true, - }) { + dialogMessageStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageEndsWith( - String value, { - bool caseSensitive = true, - }) { + dialogMessageEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageContains(String value, {bool caseSensitive = true}) { + dialogMessageContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dialogMessage', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dialogMessage', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageMatches(String pattern, {bool caseSensitive = true}) { + dialogMessageMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dialogMessage', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dialogMessage', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogMessageIsEmpty() { + dialogMessageIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dialogMessage', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dialogMessage', value: ''), + ); }); } QueryBuilder - dialogMessageIsNotEmpty() { + dialogMessageIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dialogMessage', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dialogMessage', value: ''), + ); }); } QueryBuilder - dialogTitleIsNull() { + dialogTitleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dialogTitle', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dialogTitle'), + ); }); } QueryBuilder - dialogTitleIsNotNull() { + dialogTitleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dialogTitle', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dialogTitle'), + ); }); } QueryBuilder - dialogTitleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + dialogTitleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleGreaterThan( + dialogTitleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleLessThan( + dialogTitleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleBetween( + dialogTitleBetween( String? lower, String? upper, { bool includeLower = true, @@ -5211,153 +5771,158 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dialogTitle', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dialogTitle', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleStartsWith( - String value, { - bool caseSensitive = true, - }) { + dialogTitleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleEndsWith( - String value, { - bool caseSensitive = true, - }) { + dialogTitleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleContains(String value, {bool caseSensitive = true}) { + dialogTitleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dialogTitle', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dialogTitle', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleMatches(String pattern, {bool caseSensitive = true}) { + dialogTitleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dialogTitle', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dialogTitle', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dialogTitleIsEmpty() { + dialogTitleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dialogTitle', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dialogTitle', value: ''), + ); }); } QueryBuilder - dialogTitleIsNotEmpty() { + dialogTitleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dialogTitle', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dialogTitle', value: ''), + ); }); } QueryBuilder - summaryIsNull() { + summaryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'summary'), + ); }); } QueryBuilder - summaryIsNotNull() { + summaryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'summary', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'summary'), + ); }); } QueryBuilder - summaryEqualTo( - String? value, { - bool caseSensitive = true, - }) { + summaryEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryGreaterThan( + summaryGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryLessThan( + summaryLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryBetween( + summaryBetween( String? lower, String? upper, { bool includeLower = true, @@ -5365,153 +5930,158 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'summary', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'summary', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryStartsWith( - String value, { - bool caseSensitive = true, - }) { + summaryStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryEndsWith( - String value, { - bool caseSensitive = true, - }) { + summaryEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryContains(String value, {bool caseSensitive = true}) { + summaryContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'summary', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'summary', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryMatches(String pattern, {bool caseSensitive = true}) { + summaryMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'summary', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'summary', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - summaryIsEmpty() { + summaryIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'summary', value: ''), + ); }); } QueryBuilder - summaryIsNotEmpty() { + summaryIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'summary', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'summary', value: ''), + ); }); } QueryBuilder - textIsNull() { + textIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'text', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'text'), + ); }); } QueryBuilder - textIsNotNull() { + textIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'text', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'text'), + ); }); } QueryBuilder - textEqualTo( - String? value, { - bool caseSensitive = true, - }) { + textEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textGreaterThan( + textGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textLessThan( + textLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textBetween( + textBetween( String? lower, String? upper, { bool includeLower = true, @@ -5519,153 +6089,158 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'text', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'text', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textStartsWith( - String value, { - bool caseSensitive = true, - }) { + textStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textEndsWith( - String value, { - bool caseSensitive = true, - }) { + textEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textContains(String value, {bool caseSensitive = true}) { + textContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'text', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'text', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textMatches(String pattern, {bool caseSensitive = true}) { + textMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'text', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'text', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - textIsEmpty() { + textIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'text', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'text', value: ''), + ); }); } QueryBuilder - textIsNotEmpty() { + textIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'text', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'text', value: ''), + ); }); } QueryBuilder - titleIsNull() { + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } QueryBuilder - titleIsNotNull() { + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } QueryBuilder - titleEqualTo( - String? value, { - bool caseSensitive = true, - }) { + titleEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleGreaterThan( + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleLessThan( + titleLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleBetween( + titleBetween( String? lower, String? upper, { bool includeLower = true, @@ -5673,153 +6248,158 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleEndsWith( - String value, { - bool caseSensitive = true, - }) { + titleEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleContains(String value, {bool caseSensitive = true}) { + titleContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleMatches(String pattern, {bool caseSensitive = true}) { + titleMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleIsEmpty() { + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } QueryBuilder - titleIsNotEmpty() { + titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } QueryBuilder - valueIsNull() { + valueIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'value'), + ); }); } QueryBuilder - valueIsNotNull() { + valueIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'value', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'value'), + ); }); } QueryBuilder - valueEqualTo( - String? value, { - bool caseSensitive = true, - }) { + valueEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueGreaterThan( + valueGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueLessThan( + valueLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueBetween( + valueBetween( String? lower, String? upper, { bool includeLower = true, @@ -5827,84 +6407,86 @@ extension EditTextPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'value', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'value', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueStartsWith( - String value, { - bool caseSensitive = true, - }) { + valueStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueEndsWith( - String value, { - bool caseSensitive = true, - }) { + valueEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueContains(String value, {bool caseSensitive = true}) { + valueContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'value', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'value', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueMatches(String pattern, {bool caseSensitive = true}) { + valueMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'value', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'value', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - valueIsEmpty() { + valueIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'value', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'value', value: ''), + ); }); } QueryBuilder - valueIsNotEmpty() { + valueIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'value', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'value', value: ''), + ); }); } } diff --git a/lib/models/category.g.dart b/lib/models/category.g.dart index e026164c..05aa7bc3 100644 --- a/lib/models/category.g.dart +++ b/lib/models/category.g.dart @@ -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

    ( 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

    ( } } -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 { extension CategoryQueryWhere on QueryBuilder { QueryBuilder 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 { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder 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 { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder 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 { 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 { extension CategoryQueryFilter on QueryBuilder { QueryBuilder 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 - 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 distinctByName( - {bool caseSensitive = true}) { + QueryBuilder distinctByName({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'name', caseSensitive: caseSensitive); }); diff --git a/lib/models/changed.g.dart b/lib/models/changed.g.dart index 9bd4fe39..1b2e17ea 100644 --- a/lib/models/changed.g.dart +++ b/lib/models/changed.g.dart @@ -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

    ( ) { 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> _changedPartGetLinks(ChangedPart object) { } void _changedPartAttach( - IsarCollection col, Id id, ChangedPart object) { + IsarCollection col, + Id id, + ChangedPart object, +) { object.id = id; } @@ -160,15 +159,13 @@ extension ChangedPartQueryWhere on QueryBuilder { QueryBuilder 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 idNotEqualTo( - Id id) { + Id id, + ) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -190,8 +187,10 @@ extension ChangedPartQueryWhere }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder 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 idLessThan(Id id, - {bool include = false}) { + QueryBuilder 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 { QueryBuilder - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 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 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 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 - 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 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 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 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 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 - 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 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 - 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 distinctByData( - {bool caseSensitive = true}) { + QueryBuilder distinctByData({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'data', caseSensitive: caseSensitive); }); diff --git a/lib/models/chapter.g.dart b/lib/models/chapter.g.dart index acc08cac..4fae9ea1 100644 --- a/lib/models/chapter.g.dart +++ b/lib/models/chapter.g.dart @@ -47,31 +47,15 @@ const ChapterSchema = CollectionSchema( name: r'isBookmarked', type: IsarType.bool, ), - r'isFiller': PropertySchema( - id: 6, - name: r'isFiller', - type: IsarType.bool, - ), - r'isRead': PropertySchema( - id: 7, - name: r'isRead', - type: IsarType.bool, - ), + r'isFiller': PropertySchema(id: 6, name: r'isFiller', type: IsarType.bool), + r'isRead': PropertySchema(id: 7, name: r'isRead', type: IsarType.bool), r'lastPageRead': PropertySchema( id: 8, name: r'lastPageRead', type: IsarType.string, ), - r'mangaId': PropertySchema( - id: 9, - name: r'mangaId', - type: IsarType.long, - ), - r'name': PropertySchema( - id: 10, - name: r'name', - type: IsarType.string, - ), + r'mangaId': PropertySchema(id: 9, name: r'mangaId', type: IsarType.long), + r'name': PropertySchema(id: 10, name: r'name', type: IsarType.string), r'scanlator': PropertySchema( id: 11, name: r'scanlator', @@ -87,12 +71,9 @@ const ChapterSchema = CollectionSchema( name: r'updatedAt', type: IsarType.long, ), - r'url': PropertySchema( - id: 14, - name: r'url', - type: IsarType.string, - ) + r'url': PropertySchema(id: 14, name: r'url', type: IsarType.string), }, + estimateSize: _chapterEstimateSize, serialize: _chapterSerialize, deserialize: _chapterDeserialize, @@ -105,9 +86,10 @@ const ChapterSchema = CollectionSchema( name: r'manga', target: r'Manga', single: true, - ) + ), }, embeddedSchemas: {}, + getId: _chapterGetId, getLinks: _chapterGetLinks, attach: _chapterAttach, @@ -299,10 +281,7 @@ extension ChapterQueryWhereSort on QueryBuilder { extension ChapterQueryWhere on QueryBuilder { QueryBuilder 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)); }); } @@ -328,8 +307,10 @@ extension ChapterQueryWhere on QueryBuilder { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder idGreaterThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -337,8 +318,10 @@ extension ChapterQueryWhere on QueryBuilder { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -353,12 +336,14 @@ extension ChapterQueryWhere on QueryBuilder { 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, + ), + ); }); } } @@ -367,17 +352,17 @@ extension ChapterQueryFilter on QueryBuilder { QueryBuilder archivePathIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'archivePath', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'archivePath'), + ); }); } QueryBuilder archivePathIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'archivePath', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'archivePath'), + ); }); } @@ -386,11 +371,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -400,12 +387,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -415,12 +404,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -432,14 +423,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'archivePath', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'archivePath', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -448,11 +441,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -461,70 +456,76 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder archivePathContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'archivePath', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'archivePath', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder archivePathMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'archivePath', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'archivePath', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder archivePathIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'archivePath', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'archivePath', value: ''), + ); }); } QueryBuilder - archivePathIsNotEmpty() { + archivePathIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'archivePath', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'archivePath', value: ''), + ); }); } QueryBuilder dateUploadIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dateUpload', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dateUpload'), + ); }); } QueryBuilder dateUploadIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dateUpload', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dateUpload'), + ); }); } @@ -533,11 +534,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -547,12 +550,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -562,12 +567,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -579,14 +586,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dateUpload', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dateUpload', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -595,11 +604,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -608,69 +619,75 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateUploadContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dateUpload', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dateUpload', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateUploadMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dateUpload', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dateUpload', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateUploadIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateUpload', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dateUpload', value: ''), + ); }); } QueryBuilder dateUploadIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dateUpload', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dateUpload', value: ''), + ); }); } QueryBuilder descriptionIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'description', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'description'), + ); }); } QueryBuilder descriptionIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'description', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'description'), + ); }); } @@ -679,11 +696,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -693,12 +712,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -708,12 +729,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -725,14 +748,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'description', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'description', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -741,11 +766,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -754,71 +781,77 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'description', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'description', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'description', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'description', value: ''), + ); }); } QueryBuilder - descriptionIsNotEmpty() { + descriptionIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'description', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'description', value: ''), + ); }); } QueryBuilder downloadSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'downloadSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'downloadSize'), + ); }); } QueryBuilder - downloadSizeIsNotNull() { + downloadSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'downloadSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'downloadSize'), + ); }); } @@ -827,11 +860,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -841,12 +876,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -856,12 +893,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -873,14 +912,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'downloadSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'downloadSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -889,11 +930,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -902,70 +945,76 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder downloadSizeContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'downloadSize', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'downloadSize', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder downloadSizeMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'downloadSize', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'downloadSize', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder downloadSizeIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadSize', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'downloadSize', value: ''), + ); }); } QueryBuilder - downloadSizeIsNotEmpty() { + downloadSizeIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'downloadSize', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'downloadSize', value: ''), + ); }); } QueryBuilder durationIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'duration', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'duration'), + ); }); } QueryBuilder durationIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'duration', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'duration'), + ); }); } @@ -974,11 +1023,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -988,12 +1039,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1003,12 +1056,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1020,14 +1075,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'duration', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'duration', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1036,11 +1093,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1049,78 +1108,83 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder durationContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'duration', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'duration', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder durationMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'duration', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'duration', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder durationIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'duration', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'duration', value: ''), + ); }); } QueryBuilder durationIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'duration', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'duration', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -1129,11 +1193,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1142,11 +1208,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1157,109 +1225,111 @@ extension ChapterQueryFilter 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 isBookmarkedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isBookmarked', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isBookmarked'), + ); }); } QueryBuilder - isBookmarkedIsNotNull() { + isBookmarkedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isBookmarked', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isBookmarked'), + ); }); } QueryBuilder isBookmarkedEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isBookmarked', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isBookmarked', value: value), + ); }); } QueryBuilder isFillerIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isFiller', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isFiller'), + ); }); } QueryBuilder isFillerIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isFiller', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isFiller'), + ); }); } QueryBuilder isFillerEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isFiller', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isFiller', value: value), + ); }); } QueryBuilder isReadIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isRead', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isRead'), + ); }); } QueryBuilder isReadIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isRead', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isRead'), + ); }); } QueryBuilder isReadEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isRead', value: value), + ); }); } QueryBuilder lastPageReadIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastPageRead', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastPageRead'), + ); }); } QueryBuilder - lastPageReadIsNotNull() { + lastPageReadIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastPageRead', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastPageRead'), + ); }); } @@ -1268,11 +1338,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1282,12 +1354,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1297,12 +1371,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1314,14 +1390,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastPageRead', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastPageRead', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1330,11 +1408,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1343,80 +1423,86 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder lastPageReadContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'lastPageRead', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder lastPageReadMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lastPageRead', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'lastPageRead', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder lastPageReadIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastPageRead', value: ''), + ); }); } QueryBuilder - lastPageReadIsNotEmpty() { + lastPageReadIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lastPageRead', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'lastPageRead', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -1425,11 +1511,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1438,11 +1526,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1453,29 +1543,31 @@ extension ChapterQueryFilter 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 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 nameIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'name', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'name'), + ); }); } @@ -1484,11 +1576,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1498,12 +1592,14 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1513,12 +1609,14 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1530,14 +1628,16 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1546,11 +1646,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1559,69 +1661,75 @@ extension ChapterQueryFilter 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 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 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 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 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 scanlatorIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'scanlator', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'scanlator'), + ); }); } QueryBuilder scanlatorIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'scanlator', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'scanlator'), + ); }); } @@ -1630,11 +1738,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1644,12 +1754,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1659,12 +1771,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1676,14 +1790,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'scanlator', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'scanlator', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1692,11 +1808,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1705,70 +1823,76 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder scanlatorContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'scanlator', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'scanlator', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder scanlatorMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'scanlator', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'scanlator', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder scanlatorIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'scanlator', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'scanlator', value: ''), + ); }); } QueryBuilder scanlatorIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'scanlator', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'scanlator', value: ''), + ); }); } QueryBuilder thumbnailUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'thumbnailUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'thumbnailUrl'), + ); }); } QueryBuilder - thumbnailUrlIsNotNull() { + thumbnailUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'thumbnailUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'thumbnailUrl'), + ); }); } @@ -1777,11 +1901,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1791,12 +1917,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1806,12 +1934,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1823,14 +1953,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'thumbnailUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'thumbnailUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1839,11 +1971,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1852,80 +1986,86 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder thumbnailUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'thumbnailUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'thumbnailUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder thumbnailUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'thumbnailUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'thumbnailUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder thumbnailUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'thumbnailUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'thumbnailUrl', value: ''), + ); }); } QueryBuilder - thumbnailUrlIsNotEmpty() { + thumbnailUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'thumbnailUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'thumbnailUrl', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -1934,11 +2074,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1947,11 +2089,13 @@ extension ChapterQueryFilter 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, + ), + ); }); } @@ -1962,29 +2106,31 @@ extension ChapterQueryFilter 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, + ), + ); }); } QueryBuilder urlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'url', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'url'), + ); }); } QueryBuilder urlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'url', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'url'), + ); }); } @@ -1993,11 +2139,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2007,12 +2155,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2022,12 +2172,14 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2039,14 +2191,16 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'url', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'url', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2055,11 +2209,13 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2068,53 +2224,59 @@ extension ChapterQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder urlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'url', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'url', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder urlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'url', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'url', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder urlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'url', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'url', value: ''), + ); }); } QueryBuilder urlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'url', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'url', value: ''), + ); }); } } @@ -2125,7 +2287,8 @@ extension ChapterQueryObject extension ChapterQueryLinks on QueryBuilder { QueryBuilder manga( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'manga'); }); @@ -2517,36 +2680,41 @@ extension ChapterQuerySortThenBy extension ChapterQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByArchivePath( - {bool caseSensitive = true}) { + QueryBuilder distinctByArchivePath({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'archivePath', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDateUpload( - {bool caseSensitive = true}) { + QueryBuilder distinctByDateUpload({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'dateUpload', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDescription( - {bool caseSensitive = true}) { + QueryBuilder distinctByDescription({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'description', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDownloadSize( - {bool caseSensitive = true}) { + QueryBuilder distinctByDownloadSize({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'downloadSize', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDuration( - {bool caseSensitive = true}) { + QueryBuilder distinctByDuration({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'duration', caseSensitive: caseSensitive); }); @@ -2570,8 +2738,9 @@ extension ChapterQueryWhereDistinct }); } - QueryBuilder distinctByLastPageRead( - {bool caseSensitive = true}) { + QueryBuilder distinctByLastPageRead({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastPageRead', caseSensitive: caseSensitive); }); @@ -2583,22 +2752,25 @@ extension ChapterQueryWhereDistinct }); } - QueryBuilder distinctByName( - {bool caseSensitive = true}) { + QueryBuilder distinctByName({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'name', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByScanlator( - {bool caseSensitive = true}) { + QueryBuilder distinctByScanlator({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'scanlator', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByThumbnailUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByThumbnailUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'thumbnailUrl', caseSensitive: caseSensitive); }); @@ -2610,8 +2782,9 @@ extension ChapterQueryWhereDistinct }); } - QueryBuilder distinctByUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'url', caseSensitive: caseSensitive); }); diff --git a/lib/models/custom_button.g.dart b/lib/models/custom_button.g.dart index a08db717..37b81a20 100644 --- a/lib/models/custom_button.g.dart +++ b/lib/models/custom_button.g.dart @@ -37,22 +37,15 @@ const CustomButtonSchema = CollectionSchema( name: r'isFavourite', type: IsarType.bool, ), - r'pos': PropertySchema( - id: 4, - name: r'pos', - type: IsarType.long, - ), - r'title': PropertySchema( - id: 5, - name: r'title', - type: IsarType.string, - ), + r'pos': PropertySchema(id: 4, name: r'pos', type: IsarType.long), + r'title': PropertySchema(id: 5, name: r'title', type: IsarType.string), r'updatedAt': PropertySchema( id: 6, name: r'updatedAt', type: IsarType.long, - ) + ), }, + estimateSize: _customButtonEstimateSize, serialize: _customButtonSerialize, deserialize: _customButtonDeserialize, @@ -61,6 +54,7 @@ const CustomButtonSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {}, + getId: _customButtonGetId, getLinks: _customButtonGetLinks, attach: _customButtonAttach, @@ -169,7 +163,10 @@ List> _customButtonGetLinks(CustomButton object) { } void _customButtonAttach( - IsarCollection col, Id id, CustomButton object) { + IsarCollection col, + Id id, + CustomButton object, +) { object.id = id; } @@ -186,15 +183,13 @@ extension CustomButtonQueryWhere on QueryBuilder { QueryBuilder 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 idNotEqualTo( - Id id) { + Id id, + ) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -217,8 +212,9 @@ extension CustomButtonQueryWhere } QueryBuilder idGreaterThan( - Id id, - {bool include = false}) { + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -226,8 +222,10 @@ extension CustomButtonQueryWhere }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -242,12 +240,14 @@ extension CustomButtonQueryWhere 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, + ), + ); }); } } @@ -255,71 +255,74 @@ extension CustomButtonQueryWhere extension CustomButtonQueryFilter on QueryBuilder { QueryBuilder - codeLongPressIsNull() { + codeLongPressIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'codeLongPress', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'codeLongPress'), + ); }); } QueryBuilder - codeLongPressIsNotNull() { + codeLongPressIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'codeLongPress', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'codeLongPress'), + ); }); } QueryBuilder - codeLongPressEqualTo( - String? value, { - bool caseSensitive = true, - }) { + codeLongPressEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressGreaterThan( + codeLongPressGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressLessThan( + codeLongPressLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressBetween( + codeLongPressBetween( String? lower, String? upper, { bool includeLower = true, @@ -327,153 +330,158 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'codeLongPress', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'codeLongPress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressStartsWith( - String value, { - bool caseSensitive = true, - }) { + codeLongPressStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressEndsWith( - String value, { - bool caseSensitive = true, - }) { + codeLongPressEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressContains(String value, {bool caseSensitive = true}) { + codeLongPressContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'codeLongPress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressMatches(String pattern, {bool caseSensitive = true}) { + codeLongPressMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'codeLongPress', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'codeLongPress', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeLongPressIsEmpty() { + codeLongPressIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codeLongPress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'codeLongPress', value: ''), + ); }); } QueryBuilder - codeLongPressIsNotEmpty() { + codeLongPressIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'codeLongPress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'codeLongPress', value: ''), + ); }); } QueryBuilder - codePressIsNull() { + codePressIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'codePress', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'codePress'), + ); }); } QueryBuilder - codePressIsNotNull() { + codePressIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'codePress', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'codePress'), + ); }); } QueryBuilder - codePressEqualTo( - String? value, { - bool caseSensitive = true, - }) { + codePressEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressGreaterThan( + codePressGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressLessThan( + codePressLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressBetween( + codePressBetween( String? lower, String? upper, { bool includeLower = true, @@ -481,153 +489,158 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'codePress', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'codePress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressStartsWith( - String value, { - bool caseSensitive = true, - }) { + codePressStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressEndsWith( - String value, { - bool caseSensitive = true, - }) { + codePressEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressContains(String value, {bool caseSensitive = true}) { + codePressContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'codePress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressMatches(String pattern, {bool caseSensitive = true}) { + codePressMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'codePress', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'codePress', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codePressIsEmpty() { + codePressIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codePress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'codePress', value: ''), + ); }); } QueryBuilder - codePressIsNotEmpty() { + codePressIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'codePress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'codePress', value: ''), + ); }); } QueryBuilder - codeStartupIsNull() { + codeStartupIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'codeStartup', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'codeStartup'), + ); }); } QueryBuilder - codeStartupIsNotNull() { + codeStartupIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'codeStartup', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'codeStartup'), + ); }); } QueryBuilder - codeStartupEqualTo( - String? value, { - bool caseSensitive = true, - }) { + codeStartupEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupGreaterThan( + codeStartupGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupLessThan( + codeStartupLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupBetween( + codeStartupBetween( String? lower, String? upper, { bool includeLower = true, @@ -635,111 +648,113 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'codeStartup', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'codeStartup', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupStartsWith( - String value, { - bool caseSensitive = true, - }) { + codeStartupStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupEndsWith( - String value, { - bool caseSensitive = true, - }) { + codeStartupEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupContains(String value, {bool caseSensitive = true}) { + codeStartupContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'codeStartup', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupMatches(String pattern, {bool caseSensitive = true}) { + codeStartupMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'codeStartup', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'codeStartup', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - codeStartupIsEmpty() { + codeStartupIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'codeStartup', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'codeStartup', value: ''), + ); }); } QueryBuilder - codeStartupIsNotEmpty() { + codeStartupIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'codeStartup', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'codeStartup', value: ''), + ); }); } QueryBuilder 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 - idIsNotNull() { + 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 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), + ); }); } @@ -748,11 +763,13 @@ extension CustomButtonQueryFilter 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, + ), + ); }); } @@ -761,11 +778,13 @@ extension CustomButtonQueryFilter 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, + ), + ); }); } @@ -776,82 +795,82 @@ extension CustomButtonQueryFilter 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 - isFavouriteIsNull() { + isFavouriteIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isFavourite', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isFavourite'), + ); }); } QueryBuilder - isFavouriteIsNotNull() { + isFavouriteIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isFavourite', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isFavourite'), + ); }); } QueryBuilder - isFavouriteEqualTo(bool? value) { + isFavouriteEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isFavourite', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isFavourite', value: value), + ); }); } QueryBuilder 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 - posIsNotNull() { + 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 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), + ); }); } QueryBuilder - posGreaterThan( - int? value, { - bool include = false, - }) { + posGreaterThan(int? value, {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, + ), + ); }); } @@ -860,11 +879,13 @@ extension CustomButtonQueryFilter 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, + ), + ); }); } @@ -875,31 +896,33 @@ extension CustomButtonQueryFilter 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 - titleIsNull() { + titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } QueryBuilder - titleIsNotNull() { + titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } @@ -908,27 +931,31 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleGreaterThan( + titleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -938,12 +965,14 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -955,28 +984,29 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - titleStartsWith( - String value, { - bool caseSensitive = true, - }) { + titleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -985,129 +1015,134 @@ extension CustomButtonQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder titleContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder titleMatches( - String pattern, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - titleIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); - }); - } - - QueryBuilder - titleIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); - }); - } - - QueryBuilder - updatedAtIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'updatedAt', - )); - }); - } - - QueryBuilder - updatedAtIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'updatedAt', - )); - }); - } - - QueryBuilder - updatedAtEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'updatedAt', - value: value, - )); - }); - } - - QueryBuilder - updatedAtGreaterThan( - int? value, { - bool include = false, + String pattern, { + bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'updatedAt', - value: value, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - updatedAtLessThan( - int? value, { - bool include = false, - }) { + titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'updatedAt', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } QueryBuilder - updatedAtBetween( + titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); + }); + } + + QueryBuilder + updatedAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'updatedAt'), + ); + }); + } + + QueryBuilder + updatedAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'updatedAt'), + ); + }); + } + + QueryBuilder + updatedAtEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'updatedAt', value: value), + ); + }); + } + + QueryBuilder + updatedAtGreaterThan(int? value, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'updatedAt', + value: value, + ), + ); + }); + } + + QueryBuilder + updatedAtLessThan(int? value, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'updatedAt', + value: value, + ), + ); + }); + } + + QueryBuilder + updatedAtBetween( int? lower, int? upper, { bool includeLower = true, 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, + ), + ); }); } } @@ -1127,7 +1162,7 @@ extension CustomButtonQuerySortBy } QueryBuilder - sortByCodeLongPressDesc() { + sortByCodeLongPressDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'codeLongPress', Sort.desc); }); @@ -1152,7 +1187,7 @@ extension CustomButtonQuerySortBy } QueryBuilder - sortByCodeStartupDesc() { + sortByCodeStartupDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'codeStartup', Sort.desc); }); @@ -1165,7 +1200,7 @@ extension CustomButtonQuerySortBy } QueryBuilder - sortByIsFavouriteDesc() { + sortByIsFavouriteDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isFavourite', Sort.desc); }); @@ -1217,7 +1252,7 @@ extension CustomButtonQuerySortThenBy } QueryBuilder - thenByCodeLongPressDesc() { + thenByCodeLongPressDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'codeLongPress', Sort.desc); }); @@ -1242,7 +1277,7 @@ extension CustomButtonQuerySortThenBy } QueryBuilder - thenByCodeStartupDesc() { + thenByCodeStartupDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'codeStartup', Sort.desc); }); @@ -1267,7 +1302,7 @@ extension CustomButtonQuerySortThenBy } QueryBuilder - thenByIsFavouriteDesc() { + thenByIsFavouriteDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isFavourite', Sort.desc); }); @@ -1312,23 +1347,28 @@ extension CustomButtonQuerySortThenBy extension CustomButtonQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByCodeLongPress( - {bool caseSensitive = true}) { + QueryBuilder distinctByCodeLongPress({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'codeLongPress', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'codeLongPress', + caseSensitive: caseSensitive, + ); }); } - QueryBuilder distinctByCodePress( - {bool caseSensitive = true}) { + QueryBuilder distinctByCodePress({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'codePress', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByCodeStartup( - {bool caseSensitive = true}) { + QueryBuilder distinctByCodeStartup({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'codeStartup', caseSensitive: caseSensitive); }); @@ -1346,8 +1386,9 @@ extension CustomButtonQueryWhereDistinct }); } - QueryBuilder distinctByTitle( - {bool caseSensitive = true}) { + QueryBuilder distinctByTitle({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'title', caseSensitive: caseSensitive); }); @@ -1369,7 +1410,7 @@ extension CustomButtonQueryProperty } QueryBuilder - codeLongPressProperty() { + codeLongPressProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'codeLongPress'); }); diff --git a/lib/models/download.g.dart b/lib/models/download.g.dart index 1ad51ed3..376e2df3 100644 --- a/lib/models/download.g.dart +++ b/lib/models/download.g.dart @@ -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 { extension DownloadQueryWhere on QueryBuilder { QueryBuilder 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 { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder 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 { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder 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 { 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 { QueryBuilder 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 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 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 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 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 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 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 - 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 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 - 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 - 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 - 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 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 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 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 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 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 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 { QueryBuilder chapter( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'chapter'); }); diff --git a/lib/models/history.g.dart b/lib/models/history.g.dart index 1ac47242..2fde9356 100644 --- a/lib/models/history.g.dart +++ b/lib/models/history.g.dart @@ -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

    ( 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

    ( } } -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 { extension HistoryQueryWhere on QueryBuilder { QueryBuilder 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 { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder 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 { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder 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 { 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 { QueryBuilder 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 { QueryBuilder chapter( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'chapter'); }); @@ -933,8 +970,9 @@ extension HistoryQueryWhereDistinct }); } - QueryBuilder distinctByDate( - {bool caseSensitive = true}) { + QueryBuilder distinctByDate({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'date', caseSensitive: caseSensitive); }); diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index 79ed73d7..fae7cabc 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -17,16 +17,8 @@ const MangaSchema = CollectionSchema( name: r'Manga', id: -5643034226035087553, properties: { - r'artist': PropertySchema( - id: 0, - name: r'artist', - type: IsarType.string, - ), - r'author': PropertySchema( - id: 1, - name: r'author', - type: IsarType.string, - ), + r'artist': PropertySchema(id: 0, name: r'artist', type: IsarType.string), + r'author': PropertySchema(id: 1, name: r'author', type: IsarType.string), r'categories': PropertySchema( id: 2, name: r'categories', @@ -52,16 +44,8 @@ const MangaSchema = CollectionSchema( name: r'description', type: IsarType.string, ), - r'favorite': PropertySchema( - id: 7, - name: r'favorite', - type: IsarType.bool, - ), - r'genre': PropertySchema( - id: 8, - name: r'genre', - type: IsarType.stringList, - ), + r'favorite': PropertySchema(id: 7, name: r'favorite', type: IsarType.bool), + r'genre': PropertySchema(id: 8, name: r'genre', type: IsarType.stringList), r'imageUrl': PropertySchema( id: 9, name: r'imageUrl', @@ -72,52 +56,28 @@ const MangaSchema = CollectionSchema( name: r'isLocalArchive', type: IsarType.bool, ), - r'isManga': PropertySchema( - id: 11, - name: r'isManga', - type: IsarType.bool, - ), + r'isManga': PropertySchema(id: 11, name: r'isManga', type: IsarType.bool), r'itemType': PropertySchema( id: 12, name: r'itemType', type: IsarType.byte, enumMap: _MangaitemTypeEnumValueMap, ), - r'lang': PropertySchema( - id: 13, - name: r'lang', - type: IsarType.string, - ), - r'lastRead': PropertySchema( - id: 14, - name: r'lastRead', - type: IsarType.long, - ), + r'lang': PropertySchema(id: 13, name: r'lang', type: IsarType.string), + r'lastRead': PropertySchema(id: 14, name: r'lastRead', type: IsarType.long), r'lastUpdate': PropertySchema( id: 15, name: r'lastUpdate', type: IsarType.long, ), - r'link': PropertySchema( - id: 16, - name: r'link', - type: IsarType.string, - ), - r'name': PropertySchema( - id: 17, - name: r'name', - type: IsarType.string, - ), + r'link': PropertySchema(id: 16, name: r'link', type: IsarType.string), + r'name': PropertySchema(id: 17, name: r'name', type: IsarType.string), r'smartUpdateDays': PropertySchema( id: 18, name: r'smartUpdateDays', type: IsarType.long, ), - r'source': PropertySchema( - id: 19, - name: r'source', - type: IsarType.string, - ), + r'source': PropertySchema(id: 19, name: r'source', type: IsarType.string), r'status': PropertySchema( id: 20, name: r'status', @@ -128,8 +88,9 @@ const MangaSchema = CollectionSchema( id: 21, name: r'updatedAt', type: IsarType.long, - ) + ), }, + estimateSize: _mangaEstimateSize, serialize: _mangaSerialize, deserialize: _mangaDeserialize, @@ -143,9 +104,10 @@ const MangaSchema = CollectionSchema( target: r'Chapter', single: false, linkName: r'manga', - ) + ), }, embeddedSchemas: {}, + getId: _mangaGetId, getLinks: _mangaGetLinks, attach: _mangaAttach, @@ -289,7 +251,8 @@ Manga _mangaDeserialize( imageUrl: reader.readStringOrNull(offsets[9]), isLocalArchive: reader.readBoolOrNull(offsets[10]), isManga: reader.readBoolOrNull(offsets[11]), - itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? + itemType: + _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? ItemType.manga, lang: reader.readStringOrNull(offsets[13]), lastRead: reader.readLongOrNull(offsets[14]), @@ -298,7 +261,8 @@ Manga _mangaDeserialize( name: reader.readStringOrNull(offsets[17]), smartUpdateDays: reader.readLongOrNull(offsets[18]), source: reader.readStringOrNull(offsets[19]), - status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[20])] ?? + status: + _MangastatusValueEnumMap[reader.readByteOrNull(offsets[20])] ?? Status.ongoing, updatedAt: reader.readLongOrNull(offsets[21]), ); @@ -338,7 +302,8 @@ P _mangaDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 12: return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ItemType.manga) as P; + ItemType.manga) + as P; case 13: return (reader.readStringOrNull(offset)) as P; case 14: @@ -355,7 +320,8 @@ P _mangaDeserializeProp

    ( return (reader.readStringOrNull(offset)) as P; case 20: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? - Status.ongoing) as P; + Status.ongoing) + as P; case 21: return (reader.readLongOrNull(offset)) as P; default: @@ -363,11 +329,7 @@ P _mangaDeserializeProp

    ( } } -const _MangaitemTypeEnumValueMap = { - 'manga': 0, - 'anime': 1, - 'novel': 2, -}; +const _MangaitemTypeEnumValueMap = {'manga': 0, 'anime': 1, 'novel': 2}; const _MangaitemTypeValueEnumMap = { 0: ItemType.manga, 1: ItemType.anime, @@ -414,10 +376,7 @@ extension MangaQueryWhereSort on QueryBuilder { extension MangaQueryWhere on QueryBuilder { QueryBuilder 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)); }); } @@ -443,8 +402,10 @@ extension MangaQueryWhere on QueryBuilder { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder idGreaterThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -452,8 +413,10 @@ extension MangaQueryWhere on QueryBuilder { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -468,12 +431,14 @@ extension MangaQueryWhere on QueryBuilder { 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, + ), + ); }); } } @@ -481,17 +446,17 @@ extension MangaQueryWhere on QueryBuilder { extension MangaQueryFilter on QueryBuilder { QueryBuilder artistIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'artist', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'artist'), + ); }); } QueryBuilder artistIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'artist', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'artist'), + ); }); } @@ -500,11 +465,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -514,12 +481,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -529,12 +498,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -546,14 +517,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'artist', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'artist', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -562,11 +535,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -575,68 +550,75 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder artistContains(String value, - {bool caseSensitive = true}) { + QueryBuilder artistContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'artist', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder artistMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'artist', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'artist', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder artistIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'artist', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'artist', value: ''), + ); }); } QueryBuilder artistIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'artist', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'artist', value: ''), + ); }); } QueryBuilder authorIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'author', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'author'), + ); }); } QueryBuilder authorIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'author', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'author'), + ); }); } @@ -645,11 +627,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -659,12 +643,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -674,12 +660,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -691,14 +679,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'author', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'author', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -707,11 +697,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -720,92 +712,98 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder authorContains(String value, - {bool caseSensitive = true}) { + QueryBuilder authorContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'author', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'author', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder authorMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'author', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'author', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder authorIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'author', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'author', value: ''), + ); }); } QueryBuilder authorIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'author', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'author', value: ''), + ); }); } QueryBuilder categoriesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'categories', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'categories'), + ); }); } QueryBuilder categoriesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'categories', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'categories'), + ); }); } QueryBuilder categoriesElementEqualTo( - int value) { + int value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'categories', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'categories', value: value), + ); }); } QueryBuilder - categoriesElementGreaterThan( - int value, { - bool include = false, - }) { + categoriesElementGreaterThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'categories', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'categories', + value: value, + ), + ); }); } @@ -814,11 +812,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'categories', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'categories', + value: value, + ), + ); }); } @@ -829,50 +829,35 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'categories', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'categories', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder categoriesLengthEqualTo( - int length) { + int length, + ) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'categories', - length, - true, - length, - true, - ); + return query.listLength(r'categories', length, true, length, true); }); } QueryBuilder categoriesIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'categories', - 0, - true, - 0, - true, - ); + return query.listLength(r'categories', 0, true, 0, true); }); } QueryBuilder categoriesIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'categories', - 0, - false, - 999999, - true, - ); + return query.listLength(r'categories', 0, false, 999999, true); }); } @@ -881,13 +866,7 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'categories', - 0, - true, - length, - include, - ); + return query.listLength(r'categories', 0, true, length, include); }); } @@ -896,13 +875,7 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'categories', - length, - include, - 999999, - true, - ); + return query.listLength(r'categories', length, include, 999999, true); }); } @@ -924,71 +897,74 @@ extension MangaQueryFilter on QueryBuilder { } QueryBuilder - customCoverFromTrackerIsNull() { + customCoverFromTrackerIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'customCoverFromTracker', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'customCoverFromTracker'), + ); }); } QueryBuilder - customCoverFromTrackerIsNotNull() { + customCoverFromTrackerIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'customCoverFromTracker', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'customCoverFromTracker'), + ); }); } QueryBuilder - customCoverFromTrackerEqualTo( - String? value, { - bool caseSensitive = true, - }) { + customCoverFromTrackerEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerGreaterThan( + customCoverFromTrackerGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerLessThan( + customCoverFromTrackerLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerBetween( + customCoverFromTrackerBetween( String? lower, String? upper, { bool includeLower = true, @@ -996,221 +972,193 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'customCoverFromTracker', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'customCoverFromTracker', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerStartsWith( - String value, { - bool caseSensitive = true, - }) { + customCoverFromTrackerStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerEndsWith( - String value, { - bool caseSensitive = true, - }) { + customCoverFromTrackerEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerContains(String value, - {bool caseSensitive = true}) { + customCoverFromTrackerContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'customCoverFromTracker', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'customCoverFromTracker', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerMatches(String pattern, - {bool caseSensitive = true}) { + customCoverFromTrackerMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'customCoverFromTracker', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'customCoverFromTracker', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - customCoverFromTrackerIsEmpty() { + customCoverFromTrackerIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customCoverFromTracker', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'customCoverFromTracker', value: ''), + ); }); } QueryBuilder - customCoverFromTrackerIsNotEmpty() { + customCoverFromTrackerIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'customCoverFromTracker', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + property: r'customCoverFromTracker', + value: '', + ), + ); }); } QueryBuilder customCoverImageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'customCoverImage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'customCoverImage'), + ); }); } QueryBuilder - customCoverImageIsNotNull() { + customCoverImageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'customCoverImage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'customCoverImage'), + ); }); } QueryBuilder - customCoverImageElementEqualTo(int value) { + customCoverImageElementEqualTo(int value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customCoverImage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'customCoverImage', value: value), + ); }); } QueryBuilder - customCoverImageElementGreaterThan( - int value, { - bool include = false, - }) { + customCoverImageElementGreaterThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'customCoverImage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'customCoverImage', + value: value, + ), + ); }); } QueryBuilder - customCoverImageElementLessThan( - int value, { - bool include = false, - }) { + customCoverImageElementLessThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'customCoverImage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'customCoverImage', + value: value, + ), + ); }); } QueryBuilder - customCoverImageElementBetween( + customCoverImageElementBetween( int lower, int upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'customCoverImage', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'customCoverImage', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - customCoverImageLengthEqualTo(int length) { + customCoverImageLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'customCoverImage', - length, - true, - length, - true, - ); + return query.listLength(r'customCoverImage', length, true, length, true); }); } QueryBuilder customCoverImageIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'customCoverImage', - 0, - true, - 0, - true, - ); + return query.listLength(r'customCoverImage', 0, true, 0, true); }); } QueryBuilder - customCoverImageIsNotEmpty() { + customCoverImageIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'customCoverImage', - 0, - false, - 999999, - true, - ); + return query.listLength(r'customCoverImage', 0, false, 999999, true); }); } QueryBuilder - customCoverImageLengthLessThan( - int length, { - bool include = false, - }) { + customCoverImageLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'customCoverImage', - 0, - true, - length, - include, - ); + return query.listLength(r'customCoverImage', 0, true, length, include); }); } QueryBuilder - customCoverImageLengthGreaterThan( - int length, { - bool include = false, - }) { + customCoverImageLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'customCoverImage', @@ -1223,7 +1171,7 @@ extension MangaQueryFilter on QueryBuilder { } QueryBuilder - customCoverImageLengthBetween( + customCoverImageLengthBetween( int lower, int upper, { bool includeLower = true, @@ -1242,27 +1190,27 @@ extension MangaQueryFilter on QueryBuilder { QueryBuilder dateAddedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dateAdded', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dateAdded'), + ); }); } QueryBuilder dateAddedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dateAdded', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dateAdded'), + ); }); } QueryBuilder dateAddedEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateAdded', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dateAdded', value: value), + ); }); } @@ -1271,11 +1219,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dateAdded', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dateAdded', + value: value, + ), + ); }); } @@ -1284,11 +1234,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dateAdded', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dateAdded', + value: value, + ), + ); }); } @@ -1299,29 +1251,31 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dateAdded', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dateAdded', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder descriptionIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'description', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'description'), + ); }); } QueryBuilder descriptionIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'description', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'description'), + ); }); } @@ -1330,11 +1284,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1344,12 +1300,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1359,12 +1317,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1376,14 +1336,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'description', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'description', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1392,11 +1354,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1405,95 +1369,101 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'description', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'description', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'description', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'description', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder descriptionIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'description', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'description', value: ''), + ); }); } QueryBuilder descriptionIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'description', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'description', value: ''), + ); }); } QueryBuilder favoriteIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'favorite', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'favorite'), + ); }); } QueryBuilder favoriteIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'favorite', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'favorite'), + ); }); } QueryBuilder favoriteEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'favorite', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'favorite', value: value), + ); }); } QueryBuilder genreIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'genre', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'genre'), + ); }); } QueryBuilder genreIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'genre', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'genre'), + ); }); } @@ -1502,11 +1472,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1516,12 +1488,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1531,12 +1505,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1548,14 +1524,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'genre', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'genre', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1564,11 +1542,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1577,90 +1557,79 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder genreElementContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'genre', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'genre', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder genreElementMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'genre', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'genre', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder genreElementIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'genre', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'genre', value: ''), + ); }); } QueryBuilder genreElementIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'genre', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'genre', value: ''), + ); }); } QueryBuilder genreLengthEqualTo( - int length) { + int length, + ) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'genre', - length, - true, - length, - true, - ); + return query.listLength(r'genre', length, true, length, true); }); } QueryBuilder genreIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'genre', - 0, - true, - 0, - true, - ); + return query.listLength(r'genre', 0, true, 0, true); }); } QueryBuilder genreIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'genre', - 0, - false, - 999999, - true, - ); + return query.listLength(r'genre', 0, false, 999999, true); }); } @@ -1669,13 +1638,7 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'genre', - 0, - true, - length, - include, - ); + return query.listLength(r'genre', 0, true, length, include); }); } @@ -1684,13 +1647,7 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'genre', - length, - include, - 999999, - true, - ); + return query.listLength(r'genre', length, include, 999999, true); }); } @@ -1713,26 +1670,25 @@ extension MangaQueryFilter on QueryBuilder { QueryBuilder 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 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 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), + ); }); } @@ -1741,11 +1697,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -1754,11 +1712,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -1769,29 +1729,31 @@ extension MangaQueryFilter on QueryBuilder { 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 imageUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'imageUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'imageUrl'), + ); }); } QueryBuilder imageUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'imageUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'imageUrl'), + ); }); } @@ -1800,11 +1762,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1814,12 +1778,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1829,12 +1795,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1846,14 +1814,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'imageUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'imageUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1862,11 +1832,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1875,115 +1847,121 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder imageUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'imageUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'imageUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder imageUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'imageUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'imageUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder imageUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'imageUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'imageUrl', value: ''), + ); }); } QueryBuilder imageUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'imageUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'imageUrl', value: ''), + ); }); } QueryBuilder isLocalArchiveIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isLocalArchive', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isLocalArchive'), + ); }); } QueryBuilder isLocalArchiveIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isLocalArchive', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isLocalArchive'), + ); }); } QueryBuilder isLocalArchiveEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isLocalArchive', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isLocalArchive', value: value), + ); }); } QueryBuilder 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 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 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 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), + ); }); } @@ -1992,11 +1970,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2005,11 +1985,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2020,29 +2002,31 @@ extension MangaQueryFilter on QueryBuilder { 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 langIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lang', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lang'), + ); }); } QueryBuilder langIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lang', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lang'), + ); }); } @@ -2051,11 +2035,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2065,12 +2051,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2080,12 +2068,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2097,14 +2087,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lang', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lang', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2113,11 +2105,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2126,77 +2120,85 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder langContains(String value, - {bool caseSensitive = true}) { + QueryBuilder langContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder langMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder langMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lang', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'lang', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder langIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lang', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lang', value: ''), + ); }); } QueryBuilder langIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lang', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'lang', value: ''), + ); }); } QueryBuilder lastReadIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastRead', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastRead'), + ); }); } QueryBuilder lastReadIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastRead', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastRead'), + ); }); } QueryBuilder lastReadEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastRead', value: value), + ); }); } @@ -2205,11 +2207,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastRead', + value: value, + ), + ); }); } @@ -2218,11 +2222,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastRead', + value: value, + ), + ); }); } @@ -2233,39 +2239,41 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastRead', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastRead', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder lastUpdateIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastUpdate', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastUpdate'), + ); }); } QueryBuilder lastUpdateIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastUpdate', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastUpdate'), + ); }); } QueryBuilder lastUpdateEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastUpdate', value: value), + ); }); } @@ -2274,11 +2282,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastUpdate', + value: value, + ), + ); }); } @@ -2287,11 +2297,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastUpdate', + value: value, + ), + ); }); } @@ -2302,29 +2314,31 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastUpdate', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastUpdate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder linkIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'link', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'link'), + ); }); } QueryBuilder linkIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'link', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'link'), + ); }); } @@ -2333,11 +2347,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2347,12 +2363,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2362,12 +2380,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2379,14 +2399,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'link', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'link', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2395,11 +2417,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2408,67 +2432,75 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder linkContains(String value, - {bool caseSensitive = true}) { + QueryBuilder linkContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'link', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'link', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder linkMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder linkMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'link', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'link', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder linkIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'link', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'link', value: ''), + ); }); } QueryBuilder linkIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'link', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'link', value: ''), + ); }); } QueryBuilder 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 nameIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'name', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'name'), + ); }); } @@ -2477,11 +2509,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2491,12 +2525,14 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2506,12 +2542,14 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2523,14 +2561,16 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2539,11 +2579,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2552,77 +2594,85 @@ extension MangaQueryFilter on QueryBuilder { 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 nameContains(String value, - {bool caseSensitive = true}) { + QueryBuilder nameContains( + 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 nameMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder nameMatches( + 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 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 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 smartUpdateDaysIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'smartUpdateDays', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'smartUpdateDays'), + ); }); } QueryBuilder smartUpdateDaysIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'smartUpdateDays', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'smartUpdateDays'), + ); }); } QueryBuilder smartUpdateDaysEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'smartUpdateDays', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'smartUpdateDays', value: value), + ); }); } @@ -2631,11 +2681,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'smartUpdateDays', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'smartUpdateDays', + value: value, + ), + ); }); } @@ -2644,11 +2696,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'smartUpdateDays', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'smartUpdateDays', + value: value, + ), + ); }); } @@ -2659,29 +2713,31 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'smartUpdateDays', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'smartUpdateDays', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder sourceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'source', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'source'), + ); }); } QueryBuilder sourceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'source', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'source'), + ); }); } @@ -2690,11 +2746,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2704,12 +2762,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2719,12 +2779,14 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2736,14 +2798,16 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'source', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'source', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2752,11 +2816,13 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2765,62 +2831,69 @@ extension MangaQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder sourceContains(String value, - {bool caseSensitive = true}) { + QueryBuilder sourceContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'source', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'source', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'source', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'source', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'source', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'source', value: ''), + ); }); } QueryBuilder sourceIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'source', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'source', value: ''), + ); }); } QueryBuilder statusEqualTo( - Status value) { + Status value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'status', value: value), + ); }); } @@ -2829,11 +2902,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'status', + value: value, + ), + ); }); } @@ -2842,11 +2917,13 @@ extension MangaQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'status', + value: value, + ), + ); }); } @@ -2857,39 +2934,41 @@ extension MangaQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'status', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'status', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -2898,11 +2977,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2911,11 +2992,13 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2926,13 +3009,15 @@ extension MangaQueryFilter on QueryBuilder { 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, + ), + ); }); } } @@ -2941,14 +3026,16 @@ extension MangaQueryObject on QueryBuilder {} extension MangaQueryLinks on QueryBuilder { QueryBuilder chapters( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'chapters'); }); } QueryBuilder chaptersLengthEqualTo( - int length) { + int length, + ) { return QueryBuilder.apply(this, (query) { return query.linkLength(r'chapters', length, true, length, true); }); @@ -2992,7 +3079,12 @@ extension MangaQueryLinks on QueryBuilder { }) { return QueryBuilder.apply(this, (query) { return query.linkLength( - r'chapters', lower, includeLower, upper, includeUpper); + r'chapters', + lower, + includeLower, + upper, + includeUpper, + ); }); } } @@ -3470,15 +3562,17 @@ extension MangaQuerySortThenBy on QueryBuilder { } extension MangaQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByArtist( - {bool caseSensitive = true}) { + QueryBuilder distinctByArtist({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'artist', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByAuthor( - {bool caseSensitive = true}) { + QueryBuilder distinctByAuthor({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'author', caseSensitive: caseSensitive); }); @@ -3490,11 +3584,14 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByCustomCoverFromTracker( - {bool caseSensitive = true}) { + QueryBuilder distinctByCustomCoverFromTracker({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'customCoverFromTracker', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'customCoverFromTracker', + caseSensitive: caseSensitive, + ); }); } @@ -3510,8 +3607,9 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByDescription( - {bool caseSensitive = true}) { + QueryBuilder distinctByDescription({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'description', caseSensitive: caseSensitive); }); @@ -3529,8 +3627,9 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByImageUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByImageUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'imageUrl', caseSensitive: caseSensitive); }); @@ -3554,8 +3653,9 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByLang( - {bool caseSensitive = true}) { + QueryBuilder distinctByLang({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lang', caseSensitive: caseSensitive); }); @@ -3573,15 +3673,17 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByLink( - {bool caseSensitive = true}) { + QueryBuilder distinctByLink({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'link', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByName( - {bool caseSensitive = true}) { + QueryBuilder distinctByName({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'name', caseSensitive: caseSensitive); }); @@ -3593,8 +3695,9 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctBySource( - {bool caseSensitive = true}) { + QueryBuilder distinctBySource({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'source', caseSensitive: caseSensitive); }); @@ -3639,7 +3742,7 @@ extension MangaQueryProperty on QueryBuilder { } QueryBuilder - customCoverFromTrackerProperty() { + customCoverFromTrackerProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'customCoverFromTracker'); }); diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 87152f6e..e4d71841 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -21,6 +21,7 @@ const SettingsSchema = CollectionSchema( id: 0, name: r'algorithmWeights', type: IsarType.object, + target: r'AlgorithmWeights', ), r'androidProxyServer': PropertySchema( @@ -48,6 +49,7 @@ const SettingsSchema = CollectionSchema( id: 5, name: r'animeExtensionsRepo', type: IsarType.objectList, + target: r'Repo', ), r'animeGridSize': PropertySchema( @@ -115,6 +117,7 @@ const SettingsSchema = CollectionSchema( id: 18, name: r'autoScrollPages', type: IsarType.objectList, + target: r'AutoScrollPages', ), r'backgroundColor': PropertySchema( @@ -147,30 +150,35 @@ const SettingsSchema = CollectionSchema( id: 24, name: r'chapterFilterBookmarkedList', type: IsarType.objectList, + target: r'ChapterFilterBookmarked', ), r'chapterFilterDownloadedList': PropertySchema( id: 25, name: r'chapterFilterDownloadedList', type: IsarType.objectList, + target: r'ChapterFilterDownloaded', ), r'chapterFilterUnreadList': PropertySchema( id: 26, name: r'chapterFilterUnreadList', type: IsarType.objectList, + target: r'ChapterFilterUnread', ), r'chapterPageIndexList': PropertySchema( id: 27, name: r'chapterPageIndexList', type: IsarType.objectList, + target: r'ChapterPageIndex', ), r'chapterPageUrlsList': PropertySchema( id: 28, name: r'chapterPageUrlsList', type: IsarType.objectList, + target: r'ChapterPageurls', ), r'checkForAppUpdates': PropertySchema( @@ -203,6 +211,7 @@ const SettingsSchema = CollectionSchema( id: 34, name: r'cookiesList', type: IsarType.objectList, + target: r'MCookie', ), r'cropBorders': PropertySchema( @@ -214,6 +223,7 @@ const SettingsSchema = CollectionSchema( id: 36, name: r'customColorFilter', type: IsarType.object, + target: r'CustomColorFilter', ), r'customDns': PropertySchema( @@ -257,6 +267,7 @@ const SettingsSchema = CollectionSchema( id: 44, name: r'defaultSubtitleLang', type: IsarType.object, + target: r'L10nLocale', ), r'disableSectionType': PropertySchema( @@ -325,6 +336,7 @@ const SettingsSchema = CollectionSchema( id: 57, name: r'filterScanlatorList', type: IsarType.objectList, + target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( @@ -471,12 +483,14 @@ const SettingsSchema = CollectionSchema( id: 86, name: r'locale', type: IsarType.object, + target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( id: 87, name: r'mangaExtensionsRepo', type: IsarType.objectList, + target: r'Repo', ), r'mangaGridSize': PropertySchema( @@ -515,6 +529,7 @@ const SettingsSchema = CollectionSchema( id: 94, name: r'novelExtensionsRepo', type: IsarType.objectList, + target: r'Repo', ), r'novelFontSize': PropertySchema( @@ -577,18 +592,21 @@ const SettingsSchema = CollectionSchema( id: 106, name: r'personalPageModeList', type: IsarType.objectList, + target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( id: 107, name: r'personalReaderModeList', type: IsarType.objectList, + target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( id: 108, name: r'playerSubtitleSettings', type: IsarType.object, + target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( @@ -636,24 +654,28 @@ const SettingsSchema = CollectionSchema( id: 117, name: r'sortChapterList', type: IsarType.objectList, + target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( id: 118, name: r'sortLibraryAnime', type: IsarType.object, + target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( id: 119, name: r'sortLibraryManga', type: IsarType.object, + target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( id: 120, name: r'sortLibraryNovel', type: IsarType.object, + target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( @@ -705,8 +727,9 @@ const SettingsSchema = CollectionSchema( id: 130, name: r'volumeBoostCap', type: IsarType.long, - ) + ), }, + estimateSize: _settingsEstimateSize, serialize: _settingsSerialize, deserialize: _settingsDeserialize, @@ -719,7 +742,7 @@ const SettingsSchema = CollectionSchema( name: r'sources', target: r'Sources', single: false, - ) + ), }, embeddedSchemas: { r'SortLibraryManga': SortLibraryMangaSchema, @@ -738,8 +761,9 @@ const SettingsSchema = CollectionSchema( r'CustomColorFilter': CustomColorFilterSchema, r'PlayerSubtitleSettings': PlayerSubtitleSettingsSchema, r'Repo': RepoSchema, - r'AlgorithmWeights': AlgorithmWeightsSchema + r'AlgorithmWeights': AlgorithmWeightsSchema, }, + getId: _settingsGetId, getLinks: _settingsGetLinks, attach: _settingsAttach, @@ -755,9 +779,13 @@ int _settingsEstimateSize( { final value = object.algorithmWeights; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + AlgorithmWeightsSchema.estimateSize( - value, allOffsets[AlgorithmWeights]!, allOffsets); + value, + allOffsets[AlgorithmWeights]!, + allOffsets, + ); } } { @@ -805,8 +833,11 @@ int _settingsEstimateSize( final offsets = allOffsets[AutoScrollPages]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - AutoScrollPagesSchema.estimateSize(value, offsets, allOffsets); + bytesCount += AutoScrollPagesSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -832,7 +863,10 @@ int _settingsEstimateSize( for (var i = 0; i < list.length; i++) { final value = list[i]; bytesCount += ChapterFilterBookmarkedSchema.estimateSize( - value, offsets, allOffsets); + value, + offsets, + allOffsets, + ); } } } @@ -846,7 +880,10 @@ int _settingsEstimateSize( for (var i = 0; i < list.length; i++) { final value = list[i]; bytesCount += ChapterFilterDownloadedSchema.estimateSize( - value, offsets, allOffsets); + value, + offsets, + allOffsets, + ); } } } @@ -860,7 +897,10 @@ int _settingsEstimateSize( for (var i = 0; i < list.length; i++) { final value = list[i]; bytesCount += ChapterFilterUnreadSchema.estimateSize( - value, offsets, allOffsets); + value, + offsets, + allOffsets, + ); } } } @@ -873,8 +913,11 @@ int _settingsEstimateSize( final offsets = allOffsets[ChapterPageIndex]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - ChapterPageIndexSchema.estimateSize(value, offsets, allOffsets); + bytesCount += ChapterPageIndexSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -887,8 +930,11 @@ int _settingsEstimateSize( final offsets = allOffsets[ChapterPageurls]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - ChapterPageurlsSchema.estimateSize(value, offsets, allOffsets); + bytesCount += ChapterPageurlsSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -909,9 +955,13 @@ int _settingsEstimateSize( { final value = object.customColorFilter; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + CustomColorFilterSchema.estimateSize( - value, allOffsets[CustomColorFilter]!, allOffsets); + value, + allOffsets[CustomColorFilter]!, + allOffsets, + ); } } { @@ -929,9 +979,13 @@ int _settingsEstimateSize( { final value = object.defaultSubtitleLang; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + L10nLocaleSchema.estimateSize( - value, allOffsets[L10nLocale]!, allOffsets); + value, + allOffsets[L10nLocale]!, + allOffsets, + ); } } { @@ -948,8 +1002,11 @@ int _settingsEstimateSize( final offsets = allOffsets[FilterScanlator]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - FilterScanlatorSchema.estimateSize(value, offsets, allOffsets); + bytesCount += FilterScanlatorSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -981,9 +1038,13 @@ int _settingsEstimateSize( { final value = object.locale; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + L10nLocaleSchema.estimateSize( - value, allOffsets[L10nLocale]!, allOffsets); + value, + allOffsets[L10nLocale]!, + allOffsets, + ); } } { @@ -1032,8 +1093,11 @@ int _settingsEstimateSize( final offsets = allOffsets[PersonalPageMode]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - PersonalPageModeSchema.estimateSize(value, offsets, allOffsets); + bytesCount += PersonalPageModeSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -1046,8 +1110,11 @@ int _settingsEstimateSize( final offsets = allOffsets[PersonalReaderMode]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - PersonalReaderModeSchema.estimateSize(value, offsets, allOffsets); + bytesCount += PersonalReaderModeSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -1055,9 +1122,13 @@ int _settingsEstimateSize( { final value = object.playerSubtitleSettings; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + PlayerSubtitleSettingsSchema.estimateSize( - value, allOffsets[PlayerSubtitleSettings]!, allOffsets); + value, + allOffsets[PlayerSubtitleSettings]!, + allOffsets, + ); } } { @@ -1068,8 +1139,11 @@ int _settingsEstimateSize( final offsets = allOffsets[SortChapter]!; for (var i = 0; i < list.length; i++) { final value = list[i]; - bytesCount += - SortChapterSchema.estimateSize(value, offsets, allOffsets); + bytesCount += SortChapterSchema.estimateSize( + value, + offsets, + allOffsets, + ); } } } @@ -1077,25 +1151,37 @@ int _settingsEstimateSize( { final value = object.sortLibraryAnime; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + SortLibraryMangaSchema.estimateSize( - value, allOffsets[SortLibraryManga]!, allOffsets); + value, + allOffsets[SortLibraryManga]!, + allOffsets, + ); } } { final value = object.sortLibraryManga; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + SortLibraryMangaSchema.estimateSize( - value, allOffsets[SortLibraryManga]!, allOffsets); + value, + allOffsets[SortLibraryManga]!, + allOffsets, + ); } } { final value = object.sortLibraryNovel; if (value != null) { - bytesCount += 3 + + bytesCount += + 3 + SortLibraryMangaSchema.estimateSize( - value, allOffsets[SortLibraryManga]!, allOffsets); + value, + allOffsets[SortLibraryManga]!, + allOffsets, + ); } } { @@ -1371,8 +1457,10 @@ Settings _settingsDeserialize( androidProxyServer: reader.readStringOrNull(offsets[1]), aniSkipTimeoutLength: reader.readLongOrNull(offsets[2]), animatePageTransitions: reader.readBoolOrNull(offsets[3]), - animeDisplayType: _SettingsanimeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[4])] ?? + animeDisplayType: + _SettingsanimeDisplayTypeValueEnumMap[reader.readByteOrNull( + offsets[4], + )] ?? DisplayType.compactGrid, animeExtensionsRepo: reader.readObjectList( offsets[5], @@ -1388,8 +1476,10 @@ Settings _settingsDeserialize( animeLibraryShowLanguage: reader.readBoolOrNull(offsets[11]), animeLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[12]), appFontFamily: reader.readStringOrNull(offsets[13]), - audioChannels: _SettingsaudioChannelsValueEnumMap[ - reader.readByteOrNull(offsets[14])] ?? + audioChannels: + _SettingsaudioChannelsValueEnumMap[reader.readByteOrNull( + offsets[14], + )] ?? AudioChannel.autoSafe, audioPreferredLanguages: reader.readStringOrNull(offsets[15]), autoBackupLocation: reader.readStringOrNull(offsets[16]), @@ -1400,8 +1490,10 @@ Settings _settingsDeserialize( allOffsets, AutoScrollPages(), ), - backgroundColor: _SettingsbackgroundColorValueEnumMap[ - reader.readByteOrNull(offsets[19])] ?? + backgroundColor: + _SettingsbackgroundColorValueEnumMap[reader.readByteOrNull( + offsets[19], + )] ?? BackgroundColor.black, backupFrequency: reader.readLongOrNull(offsets[20]), backupListOptions: reader.readLongList(offsets[21]), @@ -1428,8 +1520,10 @@ Settings _settingsDeserialize( checkForAppUpdates: reader.readBoolOrNull(offsets[29]), checkForExtensionUpdates: reader.readBoolOrNull(offsets[30]), clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[31]), - colorFilterBlendMode: _SettingscolorFilterBlendModeValueEnumMap[ - reader.readByteOrNull(offsets[32])] ?? + colorFilterBlendMode: + _SettingscolorFilterBlendModeValueEnumMap[reader.readByteOrNull( + offsets[32], + )] ?? ColorFilterBlendMode.none, concurrentDownloads: reader.readLongOrNull(offsets[33]), cookiesList: reader.readObjectList( @@ -1446,21 +1540,27 @@ Settings _settingsDeserialize( ), customDns: reader.readStringOrNull(offsets[37]), dateFormat: reader.readStringOrNull(offsets[38]), - debandingType: _SettingsdebandingTypeValueEnumMap[ - reader.readByteOrNull(offsets[39])] ?? + debandingType: + _SettingsdebandingTypeValueEnumMap[reader.readByteOrNull( + offsets[39], + )] ?? DebandingType.none, defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[40]), defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[41]), - defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ - reader.readByteOrNull(offsets[42])] ?? + defaultReaderMode: + _SettingsdefaultReaderModeValueEnumMap[reader.readByteOrNull( + offsets[42], + )] ?? ReaderMode.vertical, defaultSkipIntroLength: reader.readLongOrNull(offsets[43]), - disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ - reader.readByteOrNull(offsets[45])] ?? + disableSectionType: + _SettingsdisableSectionTypeValueEnumMap[reader.readByteOrNull( + offsets[45], + )] ?? SectionType.all, displayType: _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[46])] ?? - DisplayType.compactGrid, + DisplayType.compactGrid, doubleTapAnimationSpeed: reader.readLongOrNull(offsets[47]), downloadLocation: reader.readStringOrNull(offsets[48]), downloadOnlyOnWifi: reader.readBoolOrNull(offsets[49]), @@ -1507,14 +1607,18 @@ Settings _settingsDeserialize( Repo(), ), mangaGridSize: reader.readLongOrNull(offsets[88]), - mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[89])] ?? + mangaHomeDisplayType: + _SettingsmangaHomeDisplayTypeValueEnumMap[reader.readByteOrNull( + offsets[89], + )] ?? DisplayType.comfortableGrid, markEpisodeAsSeenType: reader.readLongOrNull(offsets[90]), mergeLibraryNavMobile: reader.readBoolOrNull(offsets[91]), navigationOrder: reader.readStringList(offsets[92]), - novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[93])] ?? + novelDisplayType: + _SettingsnovelDisplayTypeValueEnumMap[reader.readByteOrNull( + offsets[93], + )] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( offsets[94], @@ -1529,8 +1633,10 @@ Settings _settingsDeserialize( novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[100]), novelLibraryShowLanguage: reader.readBoolOrNull(offsets[101]), novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[102]), - novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[103])] ?? + novelTextAlign: + _SettingsnovelTextAlignValueEnumMap[reader.readByteOrNull( + offsets[103], + )] ?? NovelTextAlign.left, onlyIncludePinnedSources: reader.readBoolOrNull(offsets[104]), pagePreloadAmount: reader.readLongOrNull(offsets[105]), @@ -1559,7 +1665,7 @@ Settings _settingsDeserialize( saveAsCBZArchive: reader.readBoolOrNull(offsets[114]), scaleType: _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[115])] ?? - ScaleType.fitScreen, + ScaleType.fitScreen, showPagesNumber: reader.readBoolOrNull(offsets[116]), sortChapterList: reader.readObjectList( offsets[117], @@ -1593,13 +1699,13 @@ Settings _settingsDeserialize( userAgent: reader.readStringOrNull(offsets[129]), volumeBoostCap: reader.readLongOrNull(offsets[130]), ); - object.chapterFilterBookmarkedList = - reader.readObjectList( - offsets[24], - ChapterFilterBookmarkedSchema.deserialize, - allOffsets, - ChapterFilterBookmarked(), - ); + object.chapterFilterBookmarkedList = reader + .readObjectList( + offsets[24], + ChapterFilterBookmarkedSchema.deserialize, + allOffsets, + ChapterFilterBookmarked(), + ); object.chapterFilterUnreadList = reader.readObjectList( offsets[26], ChapterFilterUnreadSchema.deserialize, @@ -1635,10 +1741,11 @@ P _settingsDeserializeProp

    ( switch (propertyId) { case 0: return (reader.readObjectOrNull( - offset, - AlgorithmWeightsSchema.deserialize, - allOffsets, - )) as P; + offset, + AlgorithmWeightsSchema.deserialize, + allOffsets, + )) + as P; case 1: return (reader.readStringOrNull(offset)) as P; case 2: @@ -1646,16 +1753,19 @@ P _settingsDeserializeProp

    ( case 3: return (reader.readBoolOrNull(offset)) as P; case 4: - return (_SettingsanimeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.compactGrid) as P; + return (_SettingsanimeDisplayTypeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + DisplayType.compactGrid) + as P; case 5: return (reader.readObjectList( - offset, - RepoSchema.deserialize, - allOffsets, - Repo(), - )) as P; + offset, + RepoSchema.deserialize, + allOffsets, + Repo(), + )) + as P; case 6: return (reader.readLongOrNull(offset)) as P; case 7: @@ -1673,9 +1783,11 @@ P _settingsDeserializeProp

    ( case 13: return (reader.readStringOrNull(offset)) as P; case 14: - return (_SettingsaudioChannelsValueEnumMap[ - reader.readByteOrNull(offset)] ?? - AudioChannel.autoSafe) as P; + return (_SettingsaudioChannelsValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + AudioChannel.autoSafe) + as P; case 15: return (reader.readStringOrNull(offset)) as P; case 16: @@ -1684,15 +1796,18 @@ P _settingsDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 18: return (reader.readObjectList( - offset, - AutoScrollPagesSchema.deserialize, - allOffsets, - AutoScrollPages(), - )) as P; + offset, + AutoScrollPagesSchema.deserialize, + allOffsets, + AutoScrollPages(), + )) + as P; case 19: - return (_SettingsbackgroundColorValueEnumMap[ - reader.readByteOrNull(offset)] ?? - BackgroundColor.black) as P; + return (_SettingsbackgroundColorValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + BackgroundColor.black) + as P; case 20: return (reader.readLongOrNull(offset)) as P; case 21: @@ -1703,39 +1818,44 @@ P _settingsDeserializeProp

    ( return (reader.readLongOrNull(offset)) as P; case 24: return (reader.readObjectList( - offset, - ChapterFilterBookmarkedSchema.deserialize, - allOffsets, - ChapterFilterBookmarked(), - )) as P; + offset, + ChapterFilterBookmarkedSchema.deserialize, + allOffsets, + ChapterFilterBookmarked(), + )) + as P; case 25: return (reader.readObjectList( - offset, - ChapterFilterDownloadedSchema.deserialize, - allOffsets, - ChapterFilterDownloaded(), - )) as P; + offset, + ChapterFilterDownloadedSchema.deserialize, + allOffsets, + ChapterFilterDownloaded(), + )) + as P; case 26: return (reader.readObjectList( - offset, - ChapterFilterUnreadSchema.deserialize, - allOffsets, - ChapterFilterUnread(), - )) as P; + offset, + ChapterFilterUnreadSchema.deserialize, + allOffsets, + ChapterFilterUnread(), + )) + as P; case 27: return (reader.readObjectList( - offset, - ChapterPageIndexSchema.deserialize, - allOffsets, - ChapterPageIndex(), - )) as P; + offset, + ChapterPageIndexSchema.deserialize, + allOffsets, + ChapterPageIndex(), + )) + as P; case 28: return (reader.readObjectList( - offset, - ChapterPageurlsSchema.deserialize, - allOffsets, - ChapterPageurls(), - )) as P; + offset, + ChapterPageurlsSchema.deserialize, + allOffsets, + ChapterPageurls(), + )) + as P; case 29: return (reader.readBoolOrNull(offset)) as P; case 30: @@ -1743,57 +1863,69 @@ P _settingsDeserializeProp

    ( case 31: return (reader.readBoolOrNull(offset)) as P; case 32: - return (_SettingscolorFilterBlendModeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - ColorFilterBlendMode.none) as P; + return (_SettingscolorFilterBlendModeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + ColorFilterBlendMode.none) + as P; case 33: return (reader.readLongOrNull(offset)) as P; case 34: return (reader.readObjectList( - offset, - MCookieSchema.deserialize, - allOffsets, - MCookie(), - )) as P; + offset, + MCookieSchema.deserialize, + allOffsets, + MCookie(), + )) + as P; case 35: return (reader.readBoolOrNull(offset)) as P; case 36: return (reader.readObjectOrNull( - offset, - CustomColorFilterSchema.deserialize, - allOffsets, - )) as P; + offset, + CustomColorFilterSchema.deserialize, + allOffsets, + )) + as P; case 37: return (reader.readStringOrNull(offset)) as P; case 38: return (reader.readStringOrNull(offset)) as P; case 39: - return (_SettingsdebandingTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DebandingType.none) as P; + return (_SettingsdebandingTypeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + DebandingType.none) + as P; case 40: return (reader.readLongOrNull(offset)) as P; case 41: return (reader.readDoubleOrNull(offset)) as P; case 42: - return (_SettingsdefaultReaderModeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - ReaderMode.vertical) as P; + return (_SettingsdefaultReaderModeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + ReaderMode.vertical) + as P; case 43: return (reader.readLongOrNull(offset)) as P; case 44: return (reader.readObjectOrNull( - offset, - L10nLocaleSchema.deserialize, - allOffsets, - )) as P; + offset, + L10nLocaleSchema.deserialize, + allOffsets, + )) + as P; case 45: - return (_SettingsdisableSectionTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - SectionType.all) as P; + return (_SettingsdisableSectionTypeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + SectionType.all) + as P; case 46: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - DisplayType.compactGrid) as P; + DisplayType.compactGrid) + as P; case 47: return (reader.readLongOrNull(offset)) as P; case 48: @@ -1816,11 +1948,12 @@ P _settingsDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 57: return (reader.readObjectList( - offset, - FilterScanlatorSchema.deserialize, - allOffsets, - FilterScanlator(), - )) as P; + offset, + FilterScanlatorSchema.deserialize, + allOffsets, + FilterScanlator(), + )) + as P; case 58: return (reader.readDoubleOrNull(offset)) as P; case 59: @@ -1879,23 +2012,27 @@ P _settingsDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 86: return (reader.readObjectOrNull( - offset, - L10nLocaleSchema.deserialize, - allOffsets, - )) as P; + offset, + L10nLocaleSchema.deserialize, + allOffsets, + )) + as P; case 87: return (reader.readObjectList( - offset, - RepoSchema.deserialize, - allOffsets, - Repo(), - )) as P; + offset, + RepoSchema.deserialize, + allOffsets, + Repo(), + )) + as P; case 88: return (reader.readLongOrNull(offset)) as P; case 89: - return (_SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.comfortableGrid) as P; + return (_SettingsmangaHomeDisplayTypeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + DisplayType.comfortableGrid) + as P; case 90: return (reader.readLongOrNull(offset)) as P; case 91: @@ -1903,16 +2040,19 @@ P _settingsDeserializeProp

    ( case 92: return (reader.readStringList(offset)) as P; case 93: - return (_SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.comfortableGrid) as P; + return (_SettingsnovelDisplayTypeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + DisplayType.comfortableGrid) + as P; case 94: return (reader.readObjectList( - offset, - RepoSchema.deserialize, - allOffsets, - Repo(), - )) as P; + offset, + RepoSchema.deserialize, + allOffsets, + Repo(), + )) + as P; case 95: return (reader.readLongOrNull(offset)) as P; case 96: @@ -1930,33 +2070,38 @@ P _settingsDeserializeProp

    ( case 102: return (reader.readBoolOrNull(offset)) as P; case 103: - return (_SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offset)] ?? - NovelTextAlign.left) as P; + return (_SettingsnovelTextAlignValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + NovelTextAlign.left) + as P; case 104: return (reader.readBoolOrNull(offset)) as P; case 105: return (reader.readLongOrNull(offset)) as P; case 106: return (reader.readObjectList( - offset, - PersonalPageModeSchema.deserialize, - allOffsets, - PersonalPageMode(), - )) as P; + offset, + PersonalPageModeSchema.deserialize, + allOffsets, + PersonalPageMode(), + )) + as P; case 107: return (reader.readObjectList( - offset, - PersonalReaderModeSchema.deserialize, - allOffsets, - PersonalReaderMode(), - )) as P; + offset, + PersonalReaderModeSchema.deserialize, + allOffsets, + PersonalReaderMode(), + )) + as P; case 108: return (reader.readObjectOrNull( - offset, - PlayerSubtitleSettingsSchema.deserialize, - allOffsets, - )) as P; + offset, + PlayerSubtitleSettingsSchema.deserialize, + allOffsets, + )) + as P; case 109: return (reader.readBoolOrNull(offset)) as P; case 110: @@ -1971,34 +2116,39 @@ P _settingsDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 115: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; + ScaleType.fitScreen) + as P; case 116: return (reader.readBoolOrNull(offset)) as P; case 117: return (reader.readObjectList( - offset, - SortChapterSchema.deserialize, - allOffsets, - SortChapter(), - )) as P; + offset, + SortChapterSchema.deserialize, + allOffsets, + SortChapter(), + )) + as P; case 118: return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) + as P; case 119: return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) + as P; case 120: return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) + as P; case 121: return (reader.readLongOrNull(offset)) as P; case 122: @@ -2092,11 +2242,7 @@ const _SettingscolorFilterBlendModeValueEnumMap = { 11: ColorFilterBlendMode.plus, 12: ColorFilterBlendMode.exclusion, }; -const _SettingsdebandingTypeEnumValueMap = { - 'none': 0, - 'cpu': 1, - 'gpu': 2, -}; +const _SettingsdebandingTypeEnumValueMap = {'none': 0, 'cpu': 1, 'gpu': 2}; const _SettingsdebandingTypeValueEnumMap = { 0: DebandingType.none, 1: DebandingType.cpu, @@ -2217,10 +2363,7 @@ extension SettingsQueryWhereSort on QueryBuilder { extension SettingsQueryWhere on QueryBuilder { QueryBuilder 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)); }); } @@ -2246,8 +2389,10 @@ extension SettingsQueryWhere on QueryBuilder { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder idGreaterThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -2255,8 +2400,10 @@ extension SettingsQueryWhere on QueryBuilder { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -2271,12 +2418,14 @@ extension SettingsQueryWhere on QueryBuilder { 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, + ), + ); }); } } @@ -2284,89 +2433,92 @@ extension SettingsQueryWhere on QueryBuilder { extension SettingsQueryFilter on QueryBuilder { QueryBuilder - algorithmWeightsIsNull() { + algorithmWeightsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'algorithmWeights', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'algorithmWeights'), + ); }); } QueryBuilder - algorithmWeightsIsNotNull() { + algorithmWeightsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'algorithmWeights', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'algorithmWeights'), + ); }); } QueryBuilder - androidProxyServerIsNull() { + androidProxyServerIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'androidProxyServer', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'androidProxyServer'), + ); }); } QueryBuilder - androidProxyServerIsNotNull() { + androidProxyServerIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'androidProxyServer', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'androidProxyServer'), + ); }); } QueryBuilder - androidProxyServerEqualTo( - String? value, { - bool caseSensitive = true, - }) { + androidProxyServerEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerGreaterThan( + androidProxyServerGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerLessThan( + androidProxyServerLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerBetween( + androidProxyServerBetween( String? lower, String? upper, { bool includeLower = true, @@ -2374,265 +2526,270 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'androidProxyServer', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'androidProxyServer', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerStartsWith( - String value, { - bool caseSensitive = true, - }) { + androidProxyServerStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerEndsWith( - String value, { - bool caseSensitive = true, - }) { + androidProxyServerEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerContains(String value, {bool caseSensitive = true}) { + androidProxyServerContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'androidProxyServer', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'androidProxyServer', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerMatches(String pattern, {bool caseSensitive = true}) { + androidProxyServerMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'androidProxyServer', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'androidProxyServer', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - androidProxyServerIsEmpty() { + androidProxyServerIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'androidProxyServer', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'androidProxyServer', value: ''), + ); }); } QueryBuilder - androidProxyServerIsNotEmpty() { + androidProxyServerIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'androidProxyServer', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'androidProxyServer', value: ''), + ); }); } QueryBuilder - aniSkipTimeoutLengthIsNull() { + aniSkipTimeoutLengthIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'aniSkipTimeoutLength', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'aniSkipTimeoutLength'), + ); }); } QueryBuilder - aniSkipTimeoutLengthIsNotNull() { + aniSkipTimeoutLengthIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'aniSkipTimeoutLength', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'aniSkipTimeoutLength'), + ); }); } QueryBuilder - aniSkipTimeoutLengthEqualTo(int? value) { + aniSkipTimeoutLengthEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'aniSkipTimeoutLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'aniSkipTimeoutLength', + value: value, + ), + ); }); } QueryBuilder - aniSkipTimeoutLengthGreaterThan( - int? value, { - bool include = false, - }) { + aniSkipTimeoutLengthGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'aniSkipTimeoutLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'aniSkipTimeoutLength', + value: value, + ), + ); }); } QueryBuilder - aniSkipTimeoutLengthLessThan( - int? value, { - bool include = false, - }) { + aniSkipTimeoutLengthLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'aniSkipTimeoutLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'aniSkipTimeoutLength', + value: value, + ), + ); }); } QueryBuilder - aniSkipTimeoutLengthBetween( + aniSkipTimeoutLengthBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'aniSkipTimeoutLength', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'aniSkipTimeoutLength', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - animatePageTransitionsIsNull() { + animatePageTransitionsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animatePageTransitions', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animatePageTransitions'), + ); }); } QueryBuilder - animatePageTransitionsIsNotNull() { + animatePageTransitionsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animatePageTransitions', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'animatePageTransitions'), + ); }); } QueryBuilder - animatePageTransitionsEqualTo(bool? value) { + animatePageTransitionsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animatePageTransitions', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animatePageTransitions', + value: value, + ), + ); }); } QueryBuilder - animeDisplayTypeEqualTo(DisplayType value) { + animeDisplayTypeEqualTo(DisplayType value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'animeDisplayType', value: value), + ); }); } QueryBuilder - animeDisplayTypeGreaterThan( - DisplayType value, { - bool include = false, - }) { + animeDisplayTypeGreaterThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'animeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'animeDisplayType', + value: value, + ), + ); }); } QueryBuilder - animeDisplayTypeLessThan( - DisplayType value, { - bool include = false, - }) { + animeDisplayTypeLessThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'animeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'animeDisplayType', + value: value, + ), + ); }); } QueryBuilder - animeDisplayTypeBetween( + animeDisplayTypeBetween( DisplayType lower, DisplayType upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'animeDisplayType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'animeDisplayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - animeExtensionsRepoIsNull() { + animeExtensionsRepoIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animeExtensionsRepo'), + ); }); } QueryBuilder - animeExtensionsRepoIsNotNull() { + animeExtensionsRepoIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'animeExtensionsRepo'), + ); }); } QueryBuilder - animeExtensionsRepoLengthEqualTo(int length) { + animeExtensionsRepoLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'animeExtensionsRepo', @@ -2645,52 +2802,28 @@ extension SettingsQueryFilter } QueryBuilder - animeExtensionsRepoIsEmpty() { + animeExtensionsRepoIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'animeExtensionsRepo', - 0, - true, - 0, - true, - ); + return query.listLength(r'animeExtensionsRepo', 0, true, 0, true); }); } QueryBuilder - animeExtensionsRepoIsNotEmpty() { + animeExtensionsRepoIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'animeExtensionsRepo', - 0, - false, - 999999, - true, - ); + return query.listLength(r'animeExtensionsRepo', 0, false, 999999, true); }); } QueryBuilder - animeExtensionsRepoLengthLessThan( - int length, { - bool include = false, - }) { + animeExtensionsRepoLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'animeExtensionsRepo', - 0, - true, - length, - include, - ); + return query.listLength(r'animeExtensionsRepo', 0, true, length, include); }); } QueryBuilder - animeExtensionsRepoLengthGreaterThan( - int length, { - bool include = false, - }) { + animeExtensionsRepoLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'animeExtensionsRepo', @@ -2703,7 +2836,7 @@ extension SettingsQueryFilter } QueryBuilder - animeExtensionsRepoLengthBetween( + animeExtensionsRepoLengthBetween( int lower, int upper, { bool includeLower = true, @@ -2721,44 +2854,43 @@ extension SettingsQueryFilter } QueryBuilder - animeGridSizeIsNull() { + animeGridSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animeGridSize'), + ); }); } QueryBuilder - animeGridSizeIsNotNull() { + animeGridSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'animeGridSize'), + ); }); } QueryBuilder animeGridSizeEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'animeGridSize', value: value), + ); }); } QueryBuilder - animeGridSizeGreaterThan( - int? value, { - bool include = false, - }) { + animeGridSizeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'animeGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'animeGridSize', + value: value, + ), + ); }); } @@ -2767,11 +2899,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'animeGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'animeGridSize', + value: value, + ), + ); }); } @@ -2782,199 +2916,227 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'animeGridSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'animeGridSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - animeLibraryDownloadedChaptersIsNull() { + animeLibraryDownloadedChaptersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'animeLibraryDownloadedChapters', + ), + ); }); } QueryBuilder - animeLibraryDownloadedChaptersIsNotNull() { + animeLibraryDownloadedChaptersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'animeLibraryDownloadedChapters', + ), + ); }); } QueryBuilder - animeLibraryDownloadedChaptersEqualTo(bool? value) { + animeLibraryDownloadedChaptersEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryDownloadedChapters', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryDownloadedChapters', + value: value, + ), + ); }); } QueryBuilder - animeLibraryLocalSourceIsNull() { + animeLibraryLocalSourceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animeLibraryLocalSource'), + ); }); } QueryBuilder - animeLibraryLocalSourceIsNotNull() { + animeLibraryLocalSourceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'animeLibraryLocalSource'), + ); }); } QueryBuilder - animeLibraryLocalSourceEqualTo(bool? value) { + animeLibraryLocalSourceEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryLocalSource', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryLocalSource', + value: value, + ), + ); }); } QueryBuilder - animeLibraryShowCategoryTabsIsNull() { + animeLibraryShowCategoryTabsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animeLibraryShowCategoryTabs'), + ); }); } QueryBuilder - animeLibraryShowCategoryTabsIsNotNull() { + animeLibraryShowCategoryTabsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'animeLibraryShowCategoryTabs', + ), + ); }); } QueryBuilder - animeLibraryShowCategoryTabsEqualTo(bool? value) { + animeLibraryShowCategoryTabsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryShowCategoryTabs', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryShowCategoryTabs', + value: value, + ), + ); }); } QueryBuilder - animeLibraryShowContinueReadingButtonIsNull() { + animeLibraryShowContinueReadingButtonIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'animeLibraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - animeLibraryShowContinueReadingButtonIsNotNull() { + animeLibraryShowContinueReadingButtonIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'animeLibraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - animeLibraryShowContinueReadingButtonEqualTo(bool? value) { + animeLibraryShowContinueReadingButtonEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryShowContinueReadingButton', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryShowContinueReadingButton', + value: value, + ), + ); }); } QueryBuilder - animeLibraryShowLanguageIsNull() { + animeLibraryShowLanguageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'animeLibraryShowLanguage'), + ); }); } QueryBuilder - animeLibraryShowLanguageIsNotNull() { + animeLibraryShowLanguageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'animeLibraryShowLanguage'), + ); }); } QueryBuilder - animeLibraryShowLanguageEqualTo(bool? value) { + animeLibraryShowLanguageEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryShowLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryShowLanguage', + value: value, + ), + ); }); } QueryBuilder - animeLibraryShowNumbersOfItemsIsNull() { + animeLibraryShowNumbersOfItemsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'animeLibraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'animeLibraryShowNumbersOfItems', + ), + ); }); } QueryBuilder - animeLibraryShowNumbersOfItemsIsNotNull() { + animeLibraryShowNumbersOfItemsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'animeLibraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'animeLibraryShowNumbersOfItems', + ), + ); }); } QueryBuilder - animeLibraryShowNumbersOfItemsEqualTo(bool? value) { + animeLibraryShowNumbersOfItemsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'animeLibraryShowNumbersOfItems', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'animeLibraryShowNumbersOfItems', + value: value, + ), + ); }); } QueryBuilder - appFontFamilyIsNull() { + appFontFamilyIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'appFontFamily', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'appFontFamily'), + ); }); } QueryBuilder - appFontFamilyIsNotNull() { + appFontFamilyIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'appFontFamily', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'appFontFamily'), + ); }); } @@ -2983,27 +3145,31 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - appFontFamilyGreaterThan( + appFontFamilyGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3013,12 +3179,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3030,28 +3198,29 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'appFontFamily', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'appFontFamily', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - appFontFamilyStartsWith( - String value, { - bool caseSensitive = true, - }) { + appFontFamilyStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3060,79 +3229,84 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder appFontFamilyContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'appFontFamily', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'appFontFamily', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder appFontFamilyMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'appFontFamily', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'appFontFamily', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - appFontFamilyIsEmpty() { + appFontFamilyIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'appFontFamily', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'appFontFamily', value: ''), + ); }); } QueryBuilder - appFontFamilyIsNotEmpty() { + appFontFamilyIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'appFontFamily', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'appFontFamily', value: ''), + ); }); } QueryBuilder audioChannelsEqualTo( - AudioChannel value) { + AudioChannel value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'audioChannels', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'audioChannels', value: value), + ); }); } QueryBuilder - audioChannelsGreaterThan( - AudioChannel value, { - bool include = false, - }) { + audioChannelsGreaterThan(AudioChannel value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'audioChannels', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'audioChannels', + value: value, + ), + ); }); } @@ -3141,11 +3315,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'audioChannels', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'audioChannels', + value: value, + ), + ); }); } @@ -3156,82 +3332,87 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'audioChannels', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'audioChannels', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - audioPreferredLanguagesIsNull() { + audioPreferredLanguagesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'audioPreferredLanguages', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'audioPreferredLanguages'), + ); }); } QueryBuilder - audioPreferredLanguagesIsNotNull() { + audioPreferredLanguagesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'audioPreferredLanguages', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'audioPreferredLanguages'), + ); }); } QueryBuilder - audioPreferredLanguagesEqualTo( - String? value, { - bool caseSensitive = true, - }) { + audioPreferredLanguagesEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesGreaterThan( + audioPreferredLanguagesGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesLessThan( + audioPreferredLanguagesLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesBetween( + audioPreferredLanguagesBetween( String? lower, String? upper, { bool includeLower = true, @@ -3239,155 +3420,164 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'audioPreferredLanguages', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'audioPreferredLanguages', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesStartsWith( - String value, { - bool caseSensitive = true, - }) { + audioPreferredLanguagesStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesEndsWith( - String value, { - bool caseSensitive = true, - }) { + audioPreferredLanguagesEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesContains(String value, - {bool caseSensitive = true}) { + audioPreferredLanguagesContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'audioPreferredLanguages', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesMatches(String pattern, - {bool caseSensitive = true}) { + audioPreferredLanguagesMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'audioPreferredLanguages', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'audioPreferredLanguages', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - audioPreferredLanguagesIsEmpty() { + audioPreferredLanguagesIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'audioPreferredLanguages', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: '', + ), + ); }); } QueryBuilder - audioPreferredLanguagesIsNotEmpty() { + audioPreferredLanguagesIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'audioPreferredLanguages', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + property: r'audioPreferredLanguages', + value: '', + ), + ); }); } QueryBuilder - autoBackupLocationIsNull() { + autoBackupLocationIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'autoBackupLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'autoBackupLocation'), + ); }); } QueryBuilder - autoBackupLocationIsNotNull() { + autoBackupLocationIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'autoBackupLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'autoBackupLocation'), + ); }); } QueryBuilder - autoBackupLocationEqualTo( - String? value, { - bool caseSensitive = true, - }) { + autoBackupLocationEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - autoBackupLocationGreaterThan( + autoBackupLocationGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - autoBackupLocationLessThan( + autoBackupLocationLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - autoBackupLocationBetween( + autoBackupLocationBetween( String? lower, String? upper, { bool includeLower = true, @@ -3395,193 +3585,167 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'autoBackupLocation', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - autoBackupLocationStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - autoBackupLocationEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - autoBackupLocationContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'autoBackupLocation', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - autoBackupLocationMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'autoBackupLocation', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - autoBackupLocationIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'autoBackupLocation', - value: '', - )); - }); - } - - QueryBuilder - autoBackupLocationIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'autoBackupLocation', - value: '', - )); - }); - } - - QueryBuilder - autoExtensionsUpdatesIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'autoExtensionsUpdates', - )); - }); - } - - QueryBuilder - autoExtensionsUpdatesIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'autoExtensionsUpdates', - )); - }); - } - - QueryBuilder - autoExtensionsUpdatesEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'autoExtensionsUpdates', - value: value, - )); - }); - } - - QueryBuilder - autoScrollPagesIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'autoScrollPages', - )); - }); - } - - QueryBuilder - autoScrollPagesIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'autoScrollPages', - )); - }); - } - - QueryBuilder - autoScrollPagesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'autoScrollPages', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'autoBackupLocation', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - autoScrollPagesIsEmpty() { + autoBackupLocationStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'autoScrollPages', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - autoScrollPagesIsNotEmpty() { + autoBackupLocationEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'autoScrollPages', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - autoScrollPagesLengthLessThan( - int length, { - bool include = false, - }) { + autoBackupLocationContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'autoScrollPages', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'autoBackupLocation', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - autoScrollPagesLengthGreaterThan( - int length, { - bool include = false, - }) { + autoBackupLocationMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.matches( + property: r'autoBackupLocation', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + autoBackupLocationIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'autoBackupLocation', value: ''), + ); + }); + } + + QueryBuilder + autoBackupLocationIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'autoBackupLocation', value: ''), + ); + }); + } + + QueryBuilder + autoExtensionsUpdatesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'autoExtensionsUpdates'), + ); + }); + } + + QueryBuilder + autoExtensionsUpdatesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'autoExtensionsUpdates'), + ); + }); + } + + QueryBuilder + autoExtensionsUpdatesEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'autoExtensionsUpdates', + value: value, + ), + ); + }); + } + + QueryBuilder + autoScrollPagesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'autoScrollPages'), + ); + }); + } + + QueryBuilder + autoScrollPagesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'autoScrollPages'), + ); + }); + } + + QueryBuilder + autoScrollPagesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'autoScrollPages', length, true, length, true); + }); + } + + QueryBuilder + autoScrollPagesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'autoScrollPages', 0, true, 0, true); + }); + } + + QueryBuilder + autoScrollPagesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'autoScrollPages', 0, false, 999999, true); + }); + } + + QueryBuilder + autoScrollPagesLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'autoScrollPages', 0, true, length, include); + }); + } + + QueryBuilder + autoScrollPagesLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'autoScrollPages', @@ -3594,7 +3758,7 @@ extension SettingsQueryFilter } QueryBuilder - autoScrollPagesLengthBetween( + autoScrollPagesLengthBetween( int lower, int upper, { bool includeLower = true, @@ -3612,269 +3776,236 @@ extension SettingsQueryFilter } QueryBuilder - backgroundColorEqualTo(BackgroundColor value) { + backgroundColorEqualTo(BackgroundColor value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backgroundColor', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backgroundColor', value: value), + ); }); } QueryBuilder - backgroundColorGreaterThan( - BackgroundColor value, { - bool include = false, - }) { + backgroundColorGreaterThan(BackgroundColor value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backgroundColor', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backgroundColor', + value: value, + ), + ); }); } QueryBuilder - backgroundColorLessThan( - BackgroundColor value, { - bool include = false, - }) { + backgroundColorLessThan(BackgroundColor value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backgroundColor', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backgroundColor', + value: value, + ), + ); }); } QueryBuilder - backgroundColorBetween( + backgroundColorBetween( BackgroundColor lower, BackgroundColor upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backgroundColor', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backgroundColor', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - backupFrequencyIsNull() { + backupFrequencyIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backupFrequency', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backupFrequency'), + ); }); } QueryBuilder - backupFrequencyIsNotNull() { + backupFrequencyIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backupFrequency', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backupFrequency'), + ); }); } QueryBuilder - backupFrequencyEqualTo(int? value) { + backupFrequencyEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backupFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backupFrequency', value: value), + ); }); } QueryBuilder - backupFrequencyGreaterThan( - int? value, { - bool include = false, - }) { + backupFrequencyGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backupFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backupFrequency', + value: value, + ), + ); }); } QueryBuilder - backupFrequencyLessThan( - int? value, { - bool include = false, - }) { + backupFrequencyLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backupFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backupFrequency', + value: value, + ), + ); }); } QueryBuilder - backupFrequencyBetween( + backupFrequencyBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backupFrequency', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backupFrequency', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - backupListOptionsIsNull() { + backupListOptionsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backupListOptions', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backupListOptions'), + ); }); } QueryBuilder - backupListOptionsIsNotNull() { + backupListOptionsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backupListOptions', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backupListOptions'), + ); }); } QueryBuilder - backupListOptionsElementEqualTo(int value) { + backupListOptionsElementEqualTo(int value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backupListOptions', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backupListOptions', value: value), + ); }); } QueryBuilder - backupListOptionsElementGreaterThan( - int value, { - bool include = false, - }) { + backupListOptionsElementGreaterThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backupListOptions', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backupListOptions', + value: value, + ), + ); }); } QueryBuilder - backupListOptionsElementLessThan( - int value, { - bool include = false, - }) { + backupListOptionsElementLessThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backupListOptions', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backupListOptions', + value: value, + ), + ); }); } QueryBuilder - backupListOptionsElementBetween( + backupListOptionsElementBetween( int lower, int upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backupListOptions', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - backupListOptionsLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'backupListOptions', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'backupListOptions', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), ); }); } QueryBuilder - backupListOptionsIsEmpty() { + backupListOptionsLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'backupListOptions', - 0, - true, - 0, - true, - ); + return query.listLength(r'backupListOptions', length, true, length, true); }); } QueryBuilder - backupListOptionsIsNotEmpty() { + backupListOptionsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'backupListOptions', - 0, - false, - 999999, - true, - ); + return query.listLength(r'backupListOptions', 0, true, 0, true); }); } QueryBuilder - backupListOptionsLengthLessThan( - int length, { - bool include = false, - }) { + backupListOptionsIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'backupListOptions', - 0, - true, - length, - include, - ); + return query.listLength(r'backupListOptions', 0, false, 999999, true); }); } QueryBuilder - backupListOptionsLengthGreaterThan( - int length, { - bool include = false, - }) { + backupListOptionsLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'backupListOptions', 0, true, length, include); + }); + } + + QueryBuilder + backupListOptionsLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'backupListOptions', @@ -3887,7 +4018,7 @@ extension SettingsQueryFilter } QueryBuilder - backupListOptionsLengthBetween( + backupListOptionsLengthBetween( int lower, int upper, { bool includeLower = true, @@ -3905,71 +4036,74 @@ extension SettingsQueryFilter } QueryBuilder - btServerAddressIsNull() { + btServerAddressIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'btServerAddress', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'btServerAddress'), + ); }); } QueryBuilder - btServerAddressIsNotNull() { + btServerAddressIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'btServerAddress', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'btServerAddress'), + ); }); } QueryBuilder - btServerAddressEqualTo( - String? value, { - bool caseSensitive = true, - }) { + btServerAddressEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressGreaterThan( + btServerAddressGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressLessThan( + btServerAddressLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressBetween( + btServerAddressBetween( String? lower, String? upper, { bool includeLower = true, @@ -3977,125 +4111,126 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'btServerAddress', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'btServerAddress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressStartsWith( - String value, { - bool caseSensitive = true, - }) { + btServerAddressStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressEndsWith( - String value, { - bool caseSensitive = true, - }) { + btServerAddressEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressContains(String value, {bool caseSensitive = true}) { + btServerAddressContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'btServerAddress', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'btServerAddress', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressMatches(String pattern, {bool caseSensitive = true}) { + btServerAddressMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'btServerAddress', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'btServerAddress', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - btServerAddressIsEmpty() { + btServerAddressIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'btServerAddress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'btServerAddress', value: ''), + ); }); } QueryBuilder - btServerAddressIsNotEmpty() { + btServerAddressIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'btServerAddress', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'btServerAddress', value: ''), + ); }); } QueryBuilder btServerPortIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'btServerPort', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'btServerPort'), + ); }); } QueryBuilder - btServerPortIsNotNull() { + btServerPortIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'btServerPort', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'btServerPort'), + ); }); } QueryBuilder btServerPortEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'btServerPort', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'btServerPort', value: value), + ); }); } QueryBuilder - btServerPortGreaterThan( - int? value, { - bool include = false, - }) { + btServerPortGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'btServerPort', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'btServerPort', + value: value, + ), + ); }); } @@ -4104,11 +4239,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'btServerPort', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'btServerPort', + value: value, + ), + ); }); } @@ -4119,36 +4256,40 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'btServerPort', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'btServerPort', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - chapterFilterBookmarkedListIsNull() { + chapterFilterBookmarkedListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterFilterBookmarkedList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterFilterBookmarkedList'), + ); }); } QueryBuilder - chapterFilterBookmarkedListIsNotNull() { + chapterFilterBookmarkedListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterFilterBookmarkedList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'chapterFilterBookmarkedList', + ), + ); }); } QueryBuilder - chapterFilterBookmarkedListLengthEqualTo(int length) { + chapterFilterBookmarkedListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterBookmarkedList', @@ -4161,20 +4302,14 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterBookmarkedListIsEmpty() { + chapterFilterBookmarkedListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterFilterBookmarkedList', - 0, - true, - 0, - true, - ); + return query.listLength(r'chapterFilterBookmarkedList', 0, true, 0, true); }); } QueryBuilder - chapterFilterBookmarkedListIsNotEmpty() { + chapterFilterBookmarkedListIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterBookmarkedList', @@ -4187,7 +4322,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterBookmarkedListLengthLessThan( + chapterFilterBookmarkedListLengthLessThan( int length, { bool include = false, }) { @@ -4203,7 +4338,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterBookmarkedListLengthGreaterThan( + chapterFilterBookmarkedListLengthGreaterThan( int length, { bool include = false, }) { @@ -4219,7 +4354,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterBookmarkedListLengthBetween( + chapterFilterBookmarkedListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4237,25 +4372,27 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterDownloadedListIsNull() { + chapterFilterDownloadedListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterFilterDownloadedList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterFilterDownloadedList'), + ); }); } QueryBuilder - chapterFilterDownloadedListIsNotNull() { + chapterFilterDownloadedListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterFilterDownloadedList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'chapterFilterDownloadedList', + ), + ); }); } QueryBuilder - chapterFilterDownloadedListLengthEqualTo(int length) { + chapterFilterDownloadedListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterDownloadedList', @@ -4268,20 +4405,14 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterDownloadedListIsEmpty() { + chapterFilterDownloadedListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterFilterDownloadedList', - 0, - true, - 0, - true, - ); + return query.listLength(r'chapterFilterDownloadedList', 0, true, 0, true); }); } QueryBuilder - chapterFilterDownloadedListIsNotEmpty() { + chapterFilterDownloadedListIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterDownloadedList', @@ -4294,7 +4425,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterDownloadedListLengthLessThan( + chapterFilterDownloadedListLengthLessThan( int length, { bool include = false, }) { @@ -4310,7 +4441,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterDownloadedListLengthGreaterThan( + chapterFilterDownloadedListLengthGreaterThan( int length, { bool include = false, }) { @@ -4326,7 +4457,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterDownloadedListLengthBetween( + chapterFilterDownloadedListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4344,25 +4475,25 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterUnreadListIsNull() { + chapterFilterUnreadListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterFilterUnreadList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterFilterUnreadList'), + ); }); } QueryBuilder - chapterFilterUnreadListIsNotNull() { + chapterFilterUnreadListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterFilterUnreadList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'chapterFilterUnreadList'), + ); }); } QueryBuilder - chapterFilterUnreadListLengthEqualTo(int length) { + chapterFilterUnreadListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterUnreadList', @@ -4375,20 +4506,14 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterUnreadListIsEmpty() { + chapterFilterUnreadListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterFilterUnreadList', - 0, - true, - 0, - true, - ); + return query.listLength(r'chapterFilterUnreadList', 0, true, 0, true); }); } QueryBuilder - chapterFilterUnreadListIsNotEmpty() { + chapterFilterUnreadListIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterUnreadList', @@ -4401,10 +4526,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterUnreadListLengthLessThan( - int length, { - bool include = false, - }) { + chapterFilterUnreadListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterUnreadList', @@ -4417,10 +4539,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterUnreadListLengthGreaterThan( - int length, { - bool include = false, - }) { + chapterFilterUnreadListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterFilterUnreadList', @@ -4433,7 +4552,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterFilterUnreadListLengthBetween( + chapterFilterUnreadListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4451,25 +4570,25 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageIndexListIsNull() { + chapterPageIndexListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterPageIndexList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterPageIndexList'), + ); }); } QueryBuilder - chapterPageIndexListIsNotNull() { + chapterPageIndexListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterPageIndexList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'chapterPageIndexList'), + ); }); } QueryBuilder - chapterPageIndexListLengthEqualTo(int length) { + chapterPageIndexListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterPageIndexList', @@ -4482,36 +4601,21 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageIndexListIsEmpty() { + chapterPageIndexListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterPageIndexList', - 0, - true, - 0, - true, - ); + return query.listLength(r'chapterPageIndexList', 0, true, 0, true); }); } QueryBuilder - chapterPageIndexListIsNotEmpty() { + chapterPageIndexListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterPageIndexList', - 0, - false, - 999999, - true, - ); + return query.listLength(r'chapterPageIndexList', 0, false, 999999, true); }); } QueryBuilder - chapterPageIndexListLengthLessThan( - int length, { - bool include = false, - }) { + chapterPageIndexListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterPageIndexList', @@ -4524,10 +4628,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageIndexListLengthGreaterThan( - int length, { - bool include = false, - }) { + chapterPageIndexListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterPageIndexList', @@ -4540,7 +4641,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageIndexListLengthBetween( + chapterPageIndexListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4558,25 +4659,25 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageUrlsListIsNull() { + chapterPageUrlsListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterPageUrlsList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterPageUrlsList'), + ); }); } QueryBuilder - chapterPageUrlsListIsNotNull() { + chapterPageUrlsListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterPageUrlsList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'chapterPageUrlsList'), + ); }); } QueryBuilder - chapterPageUrlsListLengthEqualTo(int length) { + chapterPageUrlsListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterPageUrlsList', @@ -4589,52 +4690,28 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageUrlsListIsEmpty() { + chapterPageUrlsListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterPageUrlsList', - 0, - true, - 0, - true, - ); + return query.listLength(r'chapterPageUrlsList', 0, true, 0, true); }); } QueryBuilder - chapterPageUrlsListIsNotEmpty() { + chapterPageUrlsListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterPageUrlsList', - 0, - false, - 999999, - true, - ); + return query.listLength(r'chapterPageUrlsList', 0, false, 999999, true); }); } QueryBuilder - chapterPageUrlsListLengthLessThan( - int length, { - bool include = false, - }) { + chapterPageUrlsListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'chapterPageUrlsList', - 0, - true, - length, - include, - ); + return query.listLength(r'chapterPageUrlsList', 0, true, length, include); }); } QueryBuilder - chapterPageUrlsListLengthGreaterThan( - int length, { - bool include = false, - }) { + chapterPageUrlsListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'chapterPageUrlsList', @@ -4647,7 +4724,7 @@ extension SettingsQueryFilter } QueryBuilder - chapterPageUrlsListLengthBetween( + chapterPageUrlsListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4665,308 +4742,284 @@ extension SettingsQueryFilter } QueryBuilder - checkForAppUpdatesIsNull() { + checkForAppUpdatesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'checkForAppUpdates', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'checkForAppUpdates'), + ); }); } QueryBuilder - checkForAppUpdatesIsNotNull() { + checkForAppUpdatesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'checkForAppUpdates', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'checkForAppUpdates'), + ); }); } QueryBuilder - checkForAppUpdatesEqualTo(bool? value) { + checkForAppUpdatesEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'checkForAppUpdates', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'checkForAppUpdates', value: value), + ); }); } QueryBuilder - checkForExtensionUpdatesIsNull() { + checkForExtensionUpdatesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'checkForExtensionUpdates', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'checkForExtensionUpdates'), + ); }); } QueryBuilder - checkForExtensionUpdatesIsNotNull() { + checkForExtensionUpdatesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'checkForExtensionUpdates', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'checkForExtensionUpdates'), + ); }); } QueryBuilder - checkForExtensionUpdatesEqualTo(bool? value) { + checkForExtensionUpdatesEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'checkForExtensionUpdates', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'checkForExtensionUpdates', + value: value, + ), + ); }); } QueryBuilder - clearChapterCacheOnAppLaunchIsNull() { + clearChapterCacheOnAppLaunchIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'clearChapterCacheOnAppLaunch', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'clearChapterCacheOnAppLaunch'), + ); }); } QueryBuilder - clearChapterCacheOnAppLaunchIsNotNull() { + clearChapterCacheOnAppLaunchIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'clearChapterCacheOnAppLaunch', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'clearChapterCacheOnAppLaunch', + ), + ); }); } QueryBuilder - clearChapterCacheOnAppLaunchEqualTo(bool? value) { + clearChapterCacheOnAppLaunchEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'clearChapterCacheOnAppLaunch', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'clearChapterCacheOnAppLaunch', + value: value, + ), + ); }); } QueryBuilder - colorFilterBlendModeEqualTo(ColorFilterBlendMode value) { + colorFilterBlendModeEqualTo(ColorFilterBlendMode value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'colorFilterBlendMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'colorFilterBlendMode', + value: value, + ), + ); }); } QueryBuilder - colorFilterBlendModeGreaterThan( + colorFilterBlendModeGreaterThan( ColorFilterBlendMode value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'colorFilterBlendMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'colorFilterBlendMode', + value: value, + ), + ); }); } QueryBuilder - colorFilterBlendModeLessThan( + colorFilterBlendModeLessThan( ColorFilterBlendMode value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'colorFilterBlendMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'colorFilterBlendMode', + value: value, + ), + ); }); } QueryBuilder - colorFilterBlendModeBetween( + colorFilterBlendModeBetween( ColorFilterBlendMode lower, ColorFilterBlendMode upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'colorFilterBlendMode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'colorFilterBlendMode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - concurrentDownloadsIsNull() { + concurrentDownloadsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'concurrentDownloads', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'concurrentDownloads'), + ); }); } QueryBuilder - concurrentDownloadsIsNotNull() { + concurrentDownloadsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'concurrentDownloads', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'concurrentDownloads'), + ); }); } QueryBuilder - concurrentDownloadsEqualTo(int? value) { + concurrentDownloadsEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'concurrentDownloads', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'concurrentDownloads', value: value), + ); }); } QueryBuilder - concurrentDownloadsGreaterThan( - int? value, { - bool include = false, - }) { + concurrentDownloadsGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'concurrentDownloads', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'concurrentDownloads', + value: value, + ), + ); }); } QueryBuilder - concurrentDownloadsLessThan( - int? value, { - bool include = false, - }) { + concurrentDownloadsLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'concurrentDownloads', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'concurrentDownloads', + value: value, + ), + ); }); } QueryBuilder - concurrentDownloadsBetween( + concurrentDownloadsBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'concurrentDownloads', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'concurrentDownloads', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder cookiesListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'cookiesList', - )); - }); - } - - QueryBuilder - cookiesListIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'cookiesList', - )); - }); - } - - QueryBuilder - cookiesListLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'cookiesList', - length, - true, - length, - true, + return query.addFilterCondition( + const FilterCondition.isNull(property: r'cookiesList'), ); }); } + QueryBuilder + cookiesListIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'cookiesList'), + ); + }); + } + + QueryBuilder + cookiesListLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'cookiesList', length, true, length, true); + }); + } + QueryBuilder cookiesListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'cookiesList', - 0, - true, - 0, - true, - ); + return query.listLength(r'cookiesList', 0, true, 0, true); }); } QueryBuilder - cookiesListIsNotEmpty() { + cookiesListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'cookiesList', - 0, - false, - 999999, - true, - ); + return query.listLength(r'cookiesList', 0, false, 999999, true); }); } QueryBuilder - cookiesListLengthLessThan( - int length, { - bool include = false, - }) { + cookiesListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'cookiesList', - 0, - true, - length, - include, - ); + return query.listLength(r'cookiesList', 0, true, length, include); }); } QueryBuilder - cookiesListLengthGreaterThan( - int length, { - bool include = false, - }) { + cookiesListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'cookiesList', - length, - include, - 999999, - true, - ); + return query.listLength(r'cookiesList', length, include, 999999, true); }); } QueryBuilder - cookiesListLengthBetween( + cookiesListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -4985,62 +5038,62 @@ extension SettingsQueryFilter QueryBuilder cropBordersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'cropBorders', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'cropBorders'), + ); }); } QueryBuilder - cropBordersIsNotNull() { + cropBordersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'cropBorders', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'cropBorders'), + ); }); } QueryBuilder cropBordersEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'cropBorders', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'cropBorders', value: value), + ); }); } QueryBuilder - customColorFilterIsNull() { + customColorFilterIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'customColorFilter', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'customColorFilter'), + ); }); } QueryBuilder - customColorFilterIsNotNull() { + customColorFilterIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'customColorFilter', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'customColorFilter'), + ); }); } QueryBuilder customDnsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'customDns', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'customDns'), + ); }); } QueryBuilder customDnsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'customDns', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'customDns'), + ); }); } @@ -5049,11 +5102,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5063,12 +5118,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5078,12 +5135,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5095,14 +5154,16 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'customDns', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'customDns', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5111,11 +5172,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5124,71 +5187,77 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder customDnsContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'customDns', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'customDns', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder customDnsMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'customDns', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'customDns', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder customDnsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customDns', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'customDns', value: ''), + ); }); } QueryBuilder - customDnsIsNotEmpty() { + customDnsIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'customDns', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'customDns', value: ''), + ); }); } QueryBuilder dateFormatIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dateFormat', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dateFormat'), + ); }); } QueryBuilder - dateFormatIsNotNull() { + dateFormatIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dateFormat', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dateFormat'), + ); }); } @@ -5197,11 +5266,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5211,12 +5282,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5226,12 +5299,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5243,14 +5318,16 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dateFormat', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dateFormat', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5259,11 +5336,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -5272,78 +5351,83 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dateFormat', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dateFormat', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormat', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dateFormat', value: ''), + ); }); } QueryBuilder - dateFormatIsNotEmpty() { + dateFormatIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dateFormat', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dateFormat', value: ''), + ); }); } QueryBuilder debandingTypeEqualTo( - DebandingType value) { + DebandingType value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'debandingType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'debandingType', value: value), + ); }); } QueryBuilder - debandingTypeGreaterThan( - DebandingType value, { - bool include = false, - }) { + debandingTypeGreaterThan(DebandingType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'debandingType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'debandingType', + value: value, + ), + ); }); } @@ -5352,11 +5436,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'debandingType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'debandingType', + value: value, + ), + ); }); } @@ -5367,156 +5453,168 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'debandingType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'debandingType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthIsNull() { + defaultDoubleTapToSkipLengthIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'defaultDoubleTapToSkipLength', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'defaultDoubleTapToSkipLength'), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthIsNotNull() { + defaultDoubleTapToSkipLengthIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'defaultDoubleTapToSkipLength', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'defaultDoubleTapToSkipLength', + ), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthEqualTo(int? value) { + defaultDoubleTapToSkipLengthEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'defaultDoubleTapToSkipLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'defaultDoubleTapToSkipLength', + value: value, + ), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthGreaterThan( - int? value, { - bool include = false, - }) { + defaultDoubleTapToSkipLengthGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'defaultDoubleTapToSkipLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'defaultDoubleTapToSkipLength', + value: value, + ), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthLessThan( - int? value, { - bool include = false, - }) { + defaultDoubleTapToSkipLengthLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'defaultDoubleTapToSkipLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'defaultDoubleTapToSkipLength', + value: value, + ), + ); }); } QueryBuilder - defaultDoubleTapToSkipLengthBetween( + defaultDoubleTapToSkipLengthBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'defaultDoubleTapToSkipLength', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'defaultDoubleTapToSkipLength', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - defaultPlayBackSpeedIsNull() { + defaultPlayBackSpeedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'defaultPlayBackSpeed', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'defaultPlayBackSpeed'), + ); }); } QueryBuilder - defaultPlayBackSpeedIsNotNull() { + defaultPlayBackSpeedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'defaultPlayBackSpeed', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'defaultPlayBackSpeed'), + ); }); } QueryBuilder - defaultPlayBackSpeedEqualTo( - double? value, { - double epsilon = Query.epsilon, - }) { + defaultPlayBackSpeedEqualTo(double? value, {double epsilon = Query.epsilon}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'defaultPlayBackSpeed', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'defaultPlayBackSpeed', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - defaultPlayBackSpeedGreaterThan( + defaultPlayBackSpeedGreaterThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'defaultPlayBackSpeed', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'defaultPlayBackSpeed', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - defaultPlayBackSpeedLessThan( + defaultPlayBackSpeedLessThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'defaultPlayBackSpeed', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'defaultPlayBackSpeed', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - defaultPlayBackSpeedBetween( + defaultPlayBackSpeedBetween( double? lower, double? upper, { bool includeLower = true, @@ -5524,242 +5622,244 @@ extension SettingsQueryFilter double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'defaultPlayBackSpeed', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'defaultPlayBackSpeed', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - defaultReaderModeEqualTo(ReaderMode value) { + defaultReaderModeEqualTo(ReaderMode value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'defaultReaderMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'defaultReaderMode', value: value), + ); }); } QueryBuilder - defaultReaderModeGreaterThan( - ReaderMode value, { - bool include = false, - }) { + defaultReaderModeGreaterThan(ReaderMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'defaultReaderMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'defaultReaderMode', + value: value, + ), + ); }); } QueryBuilder - defaultReaderModeLessThan( - ReaderMode value, { - bool include = false, - }) { + defaultReaderModeLessThan(ReaderMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'defaultReaderMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'defaultReaderMode', + value: value, + ), + ); }); } QueryBuilder - defaultReaderModeBetween( + defaultReaderModeBetween( ReaderMode lower, ReaderMode upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'defaultReaderMode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'defaultReaderMode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - defaultSkipIntroLengthIsNull() { + defaultSkipIntroLengthIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'defaultSkipIntroLength', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'defaultSkipIntroLength'), + ); }); } QueryBuilder - defaultSkipIntroLengthIsNotNull() { + defaultSkipIntroLengthIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'defaultSkipIntroLength', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'defaultSkipIntroLength'), + ); }); } QueryBuilder - defaultSkipIntroLengthEqualTo(int? value) { + defaultSkipIntroLengthEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'defaultSkipIntroLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'defaultSkipIntroLength', + value: value, + ), + ); }); } QueryBuilder - defaultSkipIntroLengthGreaterThan( - int? value, { - bool include = false, - }) { + defaultSkipIntroLengthGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'defaultSkipIntroLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'defaultSkipIntroLength', + value: value, + ), + ); }); } QueryBuilder - defaultSkipIntroLengthLessThan( - int? value, { - bool include = false, - }) { + defaultSkipIntroLengthLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'defaultSkipIntroLength', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'defaultSkipIntroLength', + value: value, + ), + ); }); } QueryBuilder - defaultSkipIntroLengthBetween( + defaultSkipIntroLengthBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'defaultSkipIntroLength', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'defaultSkipIntroLength', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - defaultSubtitleLangIsNull() { + defaultSubtitleLangIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'defaultSubtitleLang', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'defaultSubtitleLang'), + ); }); } QueryBuilder - defaultSubtitleLangIsNotNull() { + defaultSubtitleLangIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'defaultSubtitleLang', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'defaultSubtitleLang'), + ); }); } QueryBuilder - disableSectionTypeEqualTo(SectionType value) { + disableSectionTypeEqualTo(SectionType value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'disableSectionType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'disableSectionType', value: value), + ); }); } QueryBuilder - disableSectionTypeGreaterThan( - SectionType value, { - bool include = false, - }) { + disableSectionTypeGreaterThan(SectionType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'disableSectionType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'disableSectionType', + value: value, + ), + ); }); } QueryBuilder - disableSectionTypeLessThan( - SectionType value, { - bool include = false, - }) { + disableSectionTypeLessThan(SectionType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'disableSectionType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'disableSectionType', + value: value, + ), + ); }); } QueryBuilder - disableSectionTypeBetween( + disableSectionTypeBetween( SectionType lower, SectionType upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'disableSectionType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'disableSectionType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder displayTypeEqualTo( - DisplayType value) { + DisplayType value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'displayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'displayType', value: value), + ); }); } QueryBuilder - displayTypeGreaterThan( - DisplayType value, { - bool include = false, - }) { + displayTypeGreaterThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'displayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'displayType', + value: value, + ), + ); }); } @@ -5768,11 +5868,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'displayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'displayType', + value: value, + ), + ); }); } @@ -5783,156 +5885,163 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'displayType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'displayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - doubleTapAnimationSpeedIsNull() { + doubleTapAnimationSpeedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'doubleTapAnimationSpeed', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'doubleTapAnimationSpeed'), + ); }); } QueryBuilder - doubleTapAnimationSpeedIsNotNull() { + doubleTapAnimationSpeedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'doubleTapAnimationSpeed', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'doubleTapAnimationSpeed'), + ); }); } QueryBuilder - doubleTapAnimationSpeedEqualTo(int? value) { + doubleTapAnimationSpeedEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'doubleTapAnimationSpeed', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'doubleTapAnimationSpeed', + value: value, + ), + ); }); } QueryBuilder - doubleTapAnimationSpeedGreaterThan( - int? value, { - bool include = false, - }) { + doubleTapAnimationSpeedGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'doubleTapAnimationSpeed', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'doubleTapAnimationSpeed', + value: value, + ), + ); }); } QueryBuilder - doubleTapAnimationSpeedLessThan( - int? value, { - bool include = false, - }) { + doubleTapAnimationSpeedLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'doubleTapAnimationSpeed', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'doubleTapAnimationSpeed', + value: value, + ), + ); }); } QueryBuilder - doubleTapAnimationSpeedBetween( + doubleTapAnimationSpeedBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'doubleTapAnimationSpeed', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'doubleTapAnimationSpeed', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - downloadLocationIsNull() { + downloadLocationIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'downloadLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'downloadLocation'), + ); }); } QueryBuilder - downloadLocationIsNotNull() { + downloadLocationIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'downloadLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'downloadLocation'), + ); }); } QueryBuilder - downloadLocationEqualTo( - String? value, { - bool caseSensitive = true, - }) { + downloadLocationEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationGreaterThan( + downloadLocationGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationLessThan( + downloadLocationLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationBetween( + downloadLocationBetween( String? lower, String? upper, { bool includeLower = true, @@ -5940,331 +6049,336 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'downloadLocation', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'downloadLocation', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationStartsWith( - String value, { - bool caseSensitive = true, - }) { + downloadLocationStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationEndsWith( - String value, { - bool caseSensitive = true, - }) { + downloadLocationEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationContains(String value, {bool caseSensitive = true}) { + downloadLocationContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'downloadLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'downloadLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationMatches(String pattern, {bool caseSensitive = true}) { + downloadLocationMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'downloadLocation', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'downloadLocation', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - downloadLocationIsEmpty() { + downloadLocationIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadLocation', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'downloadLocation', value: ''), + ); }); } QueryBuilder - downloadLocationIsNotEmpty() { + downloadLocationIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'downloadLocation', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'downloadLocation', value: ''), + ); }); } QueryBuilder - downloadOnlyOnWifiIsNull() { + downloadOnlyOnWifiIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'downloadOnlyOnWifi', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'downloadOnlyOnWifi'), + ); }); } QueryBuilder - downloadOnlyOnWifiIsNotNull() { + downloadOnlyOnWifiIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'downloadOnlyOnWifi', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'downloadOnlyOnWifi'), + ); }); } QueryBuilder - downloadOnlyOnWifiEqualTo(bool? value) { + downloadOnlyOnWifiEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadOnlyOnWifi', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'downloadOnlyOnWifi', value: value), + ); }); } QueryBuilder - downloadedOnlyModeIsNull() { + downloadedOnlyModeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'downloadedOnlyMode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'downloadedOnlyMode'), + ); }); } QueryBuilder - downloadedOnlyModeIsNotNull() { + downloadedOnlyModeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'downloadedOnlyMode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'downloadedOnlyMode'), + ); }); } QueryBuilder - downloadedOnlyModeEqualTo(bool? value) { + downloadedOnlyModeEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'downloadedOnlyMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'downloadedOnlyMode', value: value), + ); }); } QueryBuilder - enableAniSkipIsNull() { + enableAniSkipIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableAniSkip', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableAniSkip'), + ); }); } QueryBuilder - enableAniSkipIsNotNull() { + enableAniSkipIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableAniSkip', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'enableAniSkip'), + ); }); } QueryBuilder enableAniSkipEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableAniSkip', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'enableAniSkip', value: value), + ); }); } QueryBuilder - enableAudioPitchCorrectionIsNull() { + enableAudioPitchCorrectionIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableAudioPitchCorrection', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableAudioPitchCorrection'), + ); }); } QueryBuilder - enableAudioPitchCorrectionIsNotNull() { + enableAudioPitchCorrectionIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableAudioPitchCorrection', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'enableAudioPitchCorrection', + ), + ); }); } QueryBuilder - enableAudioPitchCorrectionEqualTo(bool? value) { + enableAudioPitchCorrectionEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableAudioPitchCorrection', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'enableAudioPitchCorrection', + value: value, + ), + ); }); } QueryBuilder - enableAutoSkipIsNull() { + enableAutoSkipIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableAutoSkip', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableAutoSkip'), + ); }); } QueryBuilder - enableAutoSkipIsNotNull() { + enableAutoSkipIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableAutoSkip', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'enableAutoSkip'), + ); }); } QueryBuilder enableAutoSkipEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableAutoSkip', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'enableAutoSkip', value: value), + ); }); } QueryBuilder - enableCustomColorFilterIsNull() { + enableCustomColorFilterIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableCustomColorFilter', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableCustomColorFilter'), + ); }); } QueryBuilder - enableCustomColorFilterIsNotNull() { + enableCustomColorFilterIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableCustomColorFilter', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'enableCustomColorFilter'), + ); }); } QueryBuilder - enableCustomColorFilterEqualTo(bool? value) { + enableCustomColorFilterEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableCustomColorFilter', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'enableCustomColorFilter', + value: value, + ), + ); }); } QueryBuilder - enableDiscordRpcIsNull() { + enableDiscordRpcIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableDiscordRpc', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableDiscordRpc'), + ); }); } QueryBuilder - enableDiscordRpcIsNotNull() { + enableDiscordRpcIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableDiscordRpc', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'enableDiscordRpc'), + ); }); } QueryBuilder - enableDiscordRpcEqualTo(bool? value) { + enableDiscordRpcEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableDiscordRpc', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'enableDiscordRpc', value: value), + ); }); } QueryBuilder - enableGpuNextIsNull() { + enableGpuNextIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'enableGpuNext', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableGpuNext'), + ); }); } QueryBuilder - enableGpuNextIsNotNull() { + enableGpuNextIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'enableGpuNext', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'enableGpuNext'), + ); }); } QueryBuilder enableGpuNextEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'enableGpuNext', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'enableGpuNext', value: value), + ); }); } QueryBuilder - filterScanlatorListIsNull() { + filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'filterScanlatorList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'filterScanlatorList'), + ); }); } QueryBuilder - filterScanlatorListIsNotNull() { + filterScanlatorListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'filterScanlatorList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'filterScanlatorList'), + ); }); } QueryBuilder - filterScanlatorListLengthEqualTo(int length) { + filterScanlatorListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'filterScanlatorList', @@ -6277,52 +6391,28 @@ extension SettingsQueryFilter } QueryBuilder - filterScanlatorListIsEmpty() { + filterScanlatorListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'filterScanlatorList', - 0, - true, - 0, - true, - ); + return query.listLength(r'filterScanlatorList', 0, true, 0, true); }); } QueryBuilder - filterScanlatorListIsNotEmpty() { + filterScanlatorListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'filterScanlatorList', - 0, - false, - 999999, - true, - ); + return query.listLength(r'filterScanlatorList', 0, false, 999999, true); }); } QueryBuilder - filterScanlatorListLengthLessThan( - int length, { - bool include = false, - }) { + filterScanlatorListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'filterScanlatorList', - 0, - true, - length, - include, - ); + return query.listLength(r'filterScanlatorList', 0, true, length, include); }); } QueryBuilder - filterScanlatorListLengthGreaterThan( - int length, { - bool include = false, - }) { + filterScanlatorListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'filterScanlatorList', @@ -6335,7 +6425,7 @@ extension SettingsQueryFilter } QueryBuilder - filterScanlatorListLengthBetween( + filterScanlatorListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -6353,71 +6443,80 @@ extension SettingsQueryFilter } QueryBuilder - flexColorSchemeBlendLevelIsNull() { + flexColorSchemeBlendLevelIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'flexColorSchemeBlendLevel', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'flexColorSchemeBlendLevel'), + ); }); } QueryBuilder - flexColorSchemeBlendLevelIsNotNull() { + flexColorSchemeBlendLevelIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'flexColorSchemeBlendLevel', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'flexColorSchemeBlendLevel'), + ); }); } QueryBuilder - flexColorSchemeBlendLevelEqualTo( + flexColorSchemeBlendLevelEqualTo( double? value, { double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'flexColorSchemeBlendLevel', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'flexColorSchemeBlendLevel', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - flexColorSchemeBlendLevelGreaterThan( + flexColorSchemeBlendLevelGreaterThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'flexColorSchemeBlendLevel', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'flexColorSchemeBlendLevel', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - flexColorSchemeBlendLevelLessThan( + flexColorSchemeBlendLevelLessThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'flexColorSchemeBlendLevel', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'flexColorSchemeBlendLevel', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - flexColorSchemeBlendLevelBetween( + flexColorSchemeBlendLevelBetween( double? lower, double? upper, { bool includeLower = true, @@ -6425,267 +6524,274 @@ extension SettingsQueryFilter double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'flexColorSchemeBlendLevel', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'flexColorSchemeBlendLevel', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - flexSchemeColorIndexIsNull() { + flexSchemeColorIndexIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'flexSchemeColorIndex', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'flexSchemeColorIndex'), + ); }); } QueryBuilder - flexSchemeColorIndexIsNotNull() { + flexSchemeColorIndexIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'flexSchemeColorIndex', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'flexSchemeColorIndex'), + ); }); } QueryBuilder - flexSchemeColorIndexEqualTo(int? value) { + flexSchemeColorIndexEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'flexSchemeColorIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'flexSchemeColorIndex', + value: value, + ), + ); }); } QueryBuilder - flexSchemeColorIndexGreaterThan( - int? value, { - bool include = false, - }) { + flexSchemeColorIndexGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'flexSchemeColorIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'flexSchemeColorIndex', + value: value, + ), + ); }); } QueryBuilder - flexSchemeColorIndexLessThan( - int? value, { - bool include = false, - }) { + flexSchemeColorIndexLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'flexSchemeColorIndex', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'flexSchemeColorIndex', + value: value, + ), + ); }); } QueryBuilder - flexSchemeColorIndexBetween( + flexSchemeColorIndexBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'flexSchemeColorIndex', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'flexSchemeColorIndex', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - followSystemThemeIsNull() { + followSystemThemeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'followSystemTheme', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'followSystemTheme'), + ); }); } QueryBuilder - followSystemThemeIsNotNull() { + followSystemThemeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'followSystemTheme', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'followSystemTheme'), + ); }); } QueryBuilder - followSystemThemeEqualTo(bool? value) { + followSystemThemeEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'followSystemTheme', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'followSystemTheme', value: value), + ); }); } QueryBuilder - fullScreenPlayerIsNull() { + fullScreenPlayerIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'fullScreenPlayer', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'fullScreenPlayer'), + ); }); } QueryBuilder - fullScreenPlayerIsNotNull() { + fullScreenPlayerIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'fullScreenPlayer', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'fullScreenPlayer'), + ); }); } QueryBuilder - fullScreenPlayerEqualTo(bool? value) { + fullScreenPlayerEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'fullScreenPlayer', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'fullScreenPlayer', value: value), + ); }); } QueryBuilder - fullScreenReaderIsNull() { + fullScreenReaderIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'fullScreenReader', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'fullScreenReader'), + ); }); } QueryBuilder - fullScreenReaderIsNotNull() { + fullScreenReaderIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'fullScreenReader', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'fullScreenReader'), + ); }); } QueryBuilder - fullScreenReaderEqualTo(bool? value) { + fullScreenReaderEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'fullScreenReader', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'fullScreenReader', value: value), + ); }); } QueryBuilder - hideDiscordRpcInIncognitoIsNull() { + hideDiscordRpcInIncognitoIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hideDiscordRpcInIncognito', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'hideDiscordRpcInIncognito'), + ); }); } QueryBuilder - hideDiscordRpcInIncognitoIsNotNull() { + hideDiscordRpcInIncognitoIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hideDiscordRpcInIncognito', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'hideDiscordRpcInIncognito'), + ); }); } QueryBuilder - hideDiscordRpcInIncognitoEqualTo(bool? value) { + hideDiscordRpcInIncognitoEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideDiscordRpcInIncognito', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'hideDiscordRpcInIncognito', + value: value, + ), + ); }); } QueryBuilder hideItemsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hideItems', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'hideItems'), + ); }); } QueryBuilder hideItemsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hideItems', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'hideItems'), + ); }); } QueryBuilder - hideItemsElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + hideItemsElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - hideItemsElementGreaterThan( + hideItemsElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - hideItemsElementLessThan( + hideItemsElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - hideItemsElementBetween( + hideItemsElementBetween( String lower, String upper, { bool includeLower = true, @@ -6693,159 +6799,125 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'hideItems', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - hideItemsElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - hideItemsElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - hideItemsElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'hideItems', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - hideItemsElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'hideItems', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - hideItemsElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideItems', - value: '', - )); - }); - } - - QueryBuilder - hideItemsElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'hideItems', - value: '', - )); - }); - } - - QueryBuilder - hideItemsLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'hideItems', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'hideItems', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } + QueryBuilder + hideItemsElementStartsWith(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + hideItemsElementEndsWith(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + hideItemsElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.contains( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + hideItemsElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.matches( + property: r'hideItems', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + hideItemsElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'hideItems', value: ''), + ); + }); + } + + QueryBuilder + hideItemsElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'hideItems', value: ''), + ); + }); + } + + QueryBuilder + hideItemsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'hideItems', length, true, length, true); + }); + } + QueryBuilder hideItemsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'hideItems', - 0, - true, - 0, - true, - ); + return query.listLength(r'hideItems', 0, true, 0, true); }); } QueryBuilder - hideItemsIsNotEmpty() { + hideItemsIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'hideItems', - 0, - false, - 999999, - true, - ); + return query.listLength(r'hideItems', 0, false, 999999, true); }); } QueryBuilder - hideItemsLengthLessThan( - int length, { - bool include = false, - }) { + hideItemsLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'hideItems', - 0, - true, - length, - include, - ); + return query.listLength(r'hideItems', 0, true, length, include); }); } QueryBuilder - hideItemsLengthGreaterThan( - int length, { - bool include = false, - }) { + hideItemsLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'hideItems', - length, - include, - 999999, - true, - ); + return query.listLength(r'hideItems', length, include, 999999, true); }); } QueryBuilder - hideItemsLengthBetween( + hideItemsLengthBetween( int lower, int upper, { bool includeLower = true, @@ -6864,17 +6936,17 @@ extension SettingsQueryFilter QueryBuilder hwdecModeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hwdecMode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'hwdecMode'), + ); }); } QueryBuilder hwdecModeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hwdecMode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'hwdecMode'), + ); }); } @@ -6883,11 +6955,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -6897,12 +6971,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -6912,12 +6988,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -6929,14 +7007,16 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'hwdecMode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'hwdecMode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -6945,11 +7025,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -6958,79 +7040,84 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hwdecModeContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'hwdecMode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'hwdecMode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hwdecModeMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'hwdecMode', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'hwdecMode', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hwdecModeIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hwdecMode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'hwdecMode', value: ''), + ); }); } QueryBuilder - hwdecModeIsNotEmpty() { + hwdecModeIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'hwdecMode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'hwdecMode', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -7039,11 +7126,13 @@ extension SettingsQueryFilter 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, + ), + ); }); } @@ -7052,11 +7141,13 @@ extension SettingsQueryFilter 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, + ), + ); }); } @@ -7067,110 +7158,120 @@ extension SettingsQueryFilter 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 - incognitoModeIsNull() { + incognitoModeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'incognitoMode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'incognitoMode'), + ); }); } QueryBuilder - incognitoModeIsNotNull() { + incognitoModeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'incognitoMode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'incognitoMode'), + ); }); } QueryBuilder incognitoModeEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'incognitoMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'incognitoMode', value: value), + ); }); } QueryBuilder - lastTrackerLibraryLocationIsNull() { + lastTrackerLibraryLocationIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastTrackerLibraryLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastTrackerLibraryLocation'), + ); }); } QueryBuilder - lastTrackerLibraryLocationIsNotNull() { + lastTrackerLibraryLocationIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastTrackerLibraryLocation', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'lastTrackerLibraryLocation', + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationEqualTo( + lastTrackerLibraryLocationEqualTo( String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationGreaterThan( + lastTrackerLibraryLocationGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationLessThan( + lastTrackerLibraryLocationLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationBetween( + lastTrackerLibraryLocationBetween( String? lower, String? upper, { bool includeLower = true, @@ -7178,1181 +7279,1301 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastTrackerLibraryLocation', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastTrackerLibraryLocation', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationStartsWith( + lastTrackerLibraryLocationStartsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationEndsWith( + lastTrackerLibraryLocationEndsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationContains(String value, - {bool caseSensitive = true}) { + lastTrackerLibraryLocationContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lastTrackerLibraryLocation', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'lastTrackerLibraryLocation', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationMatches(String pattern, - {bool caseSensitive = true}) { + lastTrackerLibraryLocationMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lastTrackerLibraryLocation', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'lastTrackerLibraryLocation', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationIsEmpty() { + lastTrackerLibraryLocationIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastTrackerLibraryLocation', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'lastTrackerLibraryLocation', + value: '', + ), + ); }); } QueryBuilder - lastTrackerLibraryLocationIsNotEmpty() { + lastTrackerLibraryLocationIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lastTrackerLibraryLocation', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + property: r'lastTrackerLibraryLocation', + value: '', + ), + ); }); } QueryBuilder - libraryDownloadedChaptersIsNull() { + libraryDownloadedChaptersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryDownloadedChapters'), + ); }); } QueryBuilder - libraryDownloadedChaptersIsNotNull() { + libraryDownloadedChaptersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryDownloadedChapters'), + ); }); } QueryBuilder - libraryDownloadedChaptersEqualTo(bool? value) { + libraryDownloadedChaptersEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryDownloadedChapters', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryDownloadedChapters', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeIsNull() { + libraryFilterAnimeBookMarkedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterAnimeBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterAnimeBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeIsNotNull() { + libraryFilterAnimeBookMarkedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterAnimeBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterAnimeBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeEqualTo(int? value) { + libraryFilterAnimeBookMarkedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterAnimeBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterAnimeBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeGreaterThan( + libraryFilterAnimeBookMarkedTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterAnimeBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterAnimeBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeBookMarkedTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterAnimeBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterAnimeBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeBetween( + libraryFilterAnimeBookMarkedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterAnimeBookMarkedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterAnimeBookMarkedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeIsNull() { + libraryFilterAnimeDownloadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterAnimeDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterAnimeDownloadType', + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeIsNotNull() { + libraryFilterAnimeDownloadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterAnimeDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterAnimeDownloadType', + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeEqualTo(int? value) { + libraryFilterAnimeDownloadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterAnimeDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterAnimeDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeGreaterThan( + libraryFilterAnimeDownloadTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterAnimeDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterAnimeDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeDownloadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterAnimeDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterAnimeDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeDownloadTypeBetween( + libraryFilterAnimeDownloadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterAnimeDownloadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterAnimeDownloadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeIsNull() { + libraryFilterAnimeStartedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterAnimeStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterAnimeStartedType', + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeIsNotNull() { + libraryFilterAnimeStartedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterAnimeStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterAnimeStartedType', + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeEqualTo(int? value) { + libraryFilterAnimeStartedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterAnimeStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterAnimeStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeGreaterThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeStartedTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterAnimeStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterAnimeStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeStartedTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterAnimeStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterAnimeStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeStartedTypeBetween( + libraryFilterAnimeStartedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterAnimeStartedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterAnimeStartedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeIsNull() { + libraryFilterAnimeUnreadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterAnimeUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryFilterAnimeUnreadType'), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeIsNotNull() { + libraryFilterAnimeUnreadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterAnimeUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterAnimeUnreadType', + ), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeEqualTo(int? value) { + libraryFilterAnimeUnreadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterAnimeUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterAnimeUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeGreaterThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeUnreadTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterAnimeUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterAnimeUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterAnimeUnreadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterAnimeUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterAnimeUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterAnimeUnreadTypeBetween( + libraryFilterAnimeUnreadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterAnimeUnreadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterAnimeUnreadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeIsNull() { + libraryFilterMangasBookMarkedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterMangasBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterMangasBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeIsNotNull() { + libraryFilterMangasBookMarkedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterMangasBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterMangasBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeEqualTo(int? value) { + libraryFilterMangasBookMarkedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterMangasBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterMangasBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeGreaterThan( + libraryFilterMangasBookMarkedTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterMangasBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterMangasBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeLessThan( + libraryFilterMangasBookMarkedTypeLessThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterMangasBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterMangasBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeBetween( + libraryFilterMangasBookMarkedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterMangasBookMarkedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterMangasBookMarkedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeIsNull() { + libraryFilterMangasDownloadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterMangasDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterMangasDownloadType', + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeIsNotNull() { + libraryFilterMangasDownloadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterMangasDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterMangasDownloadType', + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeEqualTo(int? value) { + libraryFilterMangasDownloadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterMangasDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterMangasDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeGreaterThan( + libraryFilterMangasDownloadTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterMangasDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterMangasDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterMangasDownloadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterMangasDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterMangasDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasDownloadTypeBetween( + libraryFilterMangasDownloadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterMangasDownloadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterMangasDownloadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeIsNull() { + libraryFilterMangasStartedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterMangasStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterMangasStartedType', + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeIsNotNull() { + libraryFilterMangasStartedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterMangasStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterMangasStartedType', + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeEqualTo(int? value) { + libraryFilterMangasStartedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterMangasStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterMangasStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeGreaterThan( + libraryFilterMangasStartedTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterMangasStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterMangasStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterMangasStartedTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterMangasStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterMangasStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasStartedTypeBetween( + libraryFilterMangasStartedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterMangasStartedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterMangasStartedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeIsNull() { + libraryFilterMangasUnreadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterMangasUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterMangasUnreadType', + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeIsNotNull() { + libraryFilterMangasUnreadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterMangasUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterMangasUnreadType', + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeEqualTo(int? value) { + libraryFilterMangasUnreadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterMangasUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterMangasUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeGreaterThan( - int? value, { - bool include = false, - }) { + libraryFilterMangasUnreadTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterMangasUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterMangasUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterMangasUnreadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterMangasUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterMangasUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterMangasUnreadTypeBetween( + libraryFilterMangasUnreadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterMangasUnreadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterMangasUnreadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeIsNull() { + libraryFilterNovelBookMarkedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterNovelBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterNovelBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeIsNotNull() { + libraryFilterNovelBookMarkedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterNovelBookMarkedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterNovelBookMarkedType', + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeEqualTo(int? value) { + libraryFilterNovelBookMarkedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterNovelBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterNovelBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeGreaterThan( + libraryFilterNovelBookMarkedTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterNovelBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelBookMarkedTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterNovelBookMarkedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeBetween( + libraryFilterNovelBookMarkedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterNovelBookMarkedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterNovelBookMarkedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeIsNull() { + libraryFilterNovelDownloadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterNovelDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterNovelDownloadType', + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeIsNotNull() { + libraryFilterNovelDownloadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterNovelDownloadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterNovelDownloadType', + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeEqualTo(int? value) { + libraryFilterNovelDownloadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterNovelDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterNovelDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeGreaterThan( + libraryFilterNovelDownloadTypeGreaterThan( int? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterNovelDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelDownloadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterNovelDownloadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelDownloadTypeBetween( + libraryFilterNovelDownloadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterNovelDownloadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterNovelDownloadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeIsNull() { + libraryFilterNovelStartedTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterNovelStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryFilterNovelStartedType', + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeIsNotNull() { + libraryFilterNovelStartedTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterNovelStartedType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterNovelStartedType', + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeEqualTo(int? value) { + libraryFilterNovelStartedTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterNovelStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterNovelStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeGreaterThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelStartedTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterNovelStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelStartedTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterNovelStartedType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelStartedTypeBetween( + libraryFilterNovelStartedTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterNovelStartedType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterNovelStartedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeIsNull() { + libraryFilterNovelUnreadTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryFilterNovelUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryFilterNovelUnreadType'), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeIsNotNull() { + libraryFilterNovelUnreadTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryFilterNovelUnreadType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryFilterNovelUnreadType', + ), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeEqualTo(int? value) { + libraryFilterNovelUnreadTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryFilterNovelUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryFilterNovelUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeGreaterThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelUnreadTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryFilterNovelUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeLessThan( - int? value, { - bool include = false, - }) { + libraryFilterNovelUnreadTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryFilterNovelUnreadType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + ), + ); }); } QueryBuilder - libraryFilterNovelUnreadTypeBetween( + libraryFilterNovelUnreadTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryFilterNovelUnreadType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryFilterNovelUnreadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - libraryLocalSourceIsNull() { + libraryLocalSourceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryLocalSource'), + ); }); } QueryBuilder - libraryLocalSourceIsNotNull() { + libraryLocalSourceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryLocalSource'), + ); }); } QueryBuilder - libraryLocalSourceEqualTo(bool? value) { + libraryLocalSourceEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryLocalSource', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'libraryLocalSource', value: value), + ); }); } QueryBuilder - libraryShowCategoryTabsIsNull() { + libraryShowCategoryTabsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryShowCategoryTabs'), + ); }); } QueryBuilder - libraryShowCategoryTabsIsNotNull() { + libraryShowCategoryTabsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryShowCategoryTabs'), + ); }); } QueryBuilder - libraryShowCategoryTabsEqualTo(bool? value) { + libraryShowCategoryTabsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryShowCategoryTabs', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryShowCategoryTabs', + value: value, + ), + ); }); } QueryBuilder - libraryShowContinueReadingButtonIsNull() { + libraryShowContinueReadingButtonIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'libraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - libraryShowContinueReadingButtonIsNotNull() { + libraryShowContinueReadingButtonIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'libraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - libraryShowContinueReadingButtonEqualTo(bool? value) { + libraryShowContinueReadingButtonEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryShowContinueReadingButton', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryShowContinueReadingButton', + value: value, + ), + ); }); } QueryBuilder - libraryShowLanguageIsNull() { + libraryShowLanguageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryShowLanguage'), + ); }); } QueryBuilder - libraryShowLanguageIsNotNull() { + libraryShowLanguageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryShowLanguage'), + ); }); } QueryBuilder - libraryShowLanguageEqualTo(bool? value) { + libraryShowLanguageEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryShowLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'libraryShowLanguage', value: value), + ); }); } QueryBuilder - libraryShowNumbersOfItemsIsNull() { + libraryShowNumbersOfItemsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryShowNumbersOfItems'), + ); }); } QueryBuilder - libraryShowNumbersOfItemsIsNotNull() { + libraryShowNumbersOfItemsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryShowNumbersOfItems'), + ); }); } QueryBuilder - libraryShowNumbersOfItemsEqualTo(bool? value) { + libraryShowNumbersOfItemsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryShowNumbersOfItems', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'libraryShowNumbersOfItems', + value: value, + ), + ); }); } QueryBuilder localeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'locale', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'locale'), + ); }); } QueryBuilder localeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'locale', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'locale'), + ); }); } QueryBuilder - mangaExtensionsRepoIsNull() { + mangaExtensionsRepoIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'mangaExtensionsRepo'), + ); }); } QueryBuilder - mangaExtensionsRepoIsNotNull() { + mangaExtensionsRepoIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'mangaExtensionsRepo'), + ); }); } QueryBuilder - mangaExtensionsRepoLengthEqualTo(int length) { + mangaExtensionsRepoLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'mangaExtensionsRepo', @@ -8365,52 +8586,28 @@ extension SettingsQueryFilter } QueryBuilder - mangaExtensionsRepoIsEmpty() { + mangaExtensionsRepoIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'mangaExtensionsRepo', - 0, - true, - 0, - true, - ); + return query.listLength(r'mangaExtensionsRepo', 0, true, 0, true); }); } QueryBuilder - mangaExtensionsRepoIsNotEmpty() { + mangaExtensionsRepoIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'mangaExtensionsRepo', - 0, - false, - 999999, - true, - ); + return query.listLength(r'mangaExtensionsRepo', 0, false, 999999, true); }); } QueryBuilder - mangaExtensionsRepoLengthLessThan( - int length, { - bool include = false, - }) { + mangaExtensionsRepoLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'mangaExtensionsRepo', - 0, - true, - length, - include, - ); + return query.listLength(r'mangaExtensionsRepo', 0, true, length, include); }); } QueryBuilder - mangaExtensionsRepoLengthGreaterThan( - int length, { - bool include = false, - }) { + mangaExtensionsRepoLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'mangaExtensionsRepo', @@ -8423,7 +8620,7 @@ extension SettingsQueryFilter } QueryBuilder - mangaExtensionsRepoLengthBetween( + mangaExtensionsRepoLengthBetween( int lower, int upper, { bool includeLower = true, @@ -8441,44 +8638,43 @@ extension SettingsQueryFilter } QueryBuilder - mangaGridSizeIsNull() { + mangaGridSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'mangaGridSize'), + ); }); } QueryBuilder - mangaGridSizeIsNotNull() { + mangaGridSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'mangaGridSize'), + ); }); } QueryBuilder mangaGridSizeEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'mangaGridSize', value: value), + ); }); } QueryBuilder - mangaGridSizeGreaterThan( - int? value, { - bool include = false, - }) { + mangaGridSizeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'mangaGridSize', + value: value, + ), + ); }); } @@ -8487,11 +8683,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'mangaGridSize', + value: value, + ), + ); }); } @@ -8502,240 +8700,251 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaGridSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'mangaGridSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - mangaHomeDisplayTypeEqualTo(DisplayType value) { + mangaHomeDisplayTypeEqualTo(DisplayType value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaHomeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'mangaHomeDisplayType', + value: value, + ), + ); }); } QueryBuilder - mangaHomeDisplayTypeGreaterThan( - DisplayType value, { - bool include = false, - }) { + mangaHomeDisplayTypeGreaterThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaHomeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'mangaHomeDisplayType', + value: value, + ), + ); }); } QueryBuilder - mangaHomeDisplayTypeLessThan( - DisplayType value, { - bool include = false, - }) { + mangaHomeDisplayTypeLessThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaHomeDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'mangaHomeDisplayType', + value: value, + ), + ); }); } QueryBuilder - mangaHomeDisplayTypeBetween( + mangaHomeDisplayTypeBetween( DisplayType lower, DisplayType upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaHomeDisplayType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'mangaHomeDisplayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - markEpisodeAsSeenTypeIsNull() { + markEpisodeAsSeenTypeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'markEpisodeAsSeenType', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'markEpisodeAsSeenType'), + ); }); } QueryBuilder - markEpisodeAsSeenTypeIsNotNull() { + markEpisodeAsSeenTypeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'markEpisodeAsSeenType', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'markEpisodeAsSeenType'), + ); }); } QueryBuilder - markEpisodeAsSeenTypeEqualTo(int? value) { + markEpisodeAsSeenTypeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'markEpisodeAsSeenType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'markEpisodeAsSeenType', + value: value, + ), + ); }); } QueryBuilder - markEpisodeAsSeenTypeGreaterThan( - int? value, { - bool include = false, - }) { + markEpisodeAsSeenTypeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'markEpisodeAsSeenType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'markEpisodeAsSeenType', + value: value, + ), + ); }); } QueryBuilder - markEpisodeAsSeenTypeLessThan( - int? value, { - bool include = false, - }) { + markEpisodeAsSeenTypeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'markEpisodeAsSeenType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'markEpisodeAsSeenType', + value: value, + ), + ); }); } QueryBuilder - markEpisodeAsSeenTypeBetween( + markEpisodeAsSeenTypeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'markEpisodeAsSeenType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'markEpisodeAsSeenType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - mergeLibraryNavMobileIsNull() { + mergeLibraryNavMobileIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mergeLibraryNavMobile', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'mergeLibraryNavMobile'), + ); }); } QueryBuilder - mergeLibraryNavMobileIsNotNull() { + mergeLibraryNavMobileIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mergeLibraryNavMobile', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'mergeLibraryNavMobile'), + ); }); } QueryBuilder - mergeLibraryNavMobileEqualTo(bool? value) { + mergeLibraryNavMobileEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mergeLibraryNavMobile', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'mergeLibraryNavMobile', + value: value, + ), + ); }); } QueryBuilder - navigationOrderIsNull() { + navigationOrderIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'navigationOrder', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'navigationOrder'), + ); }); } QueryBuilder - navigationOrderIsNotNull() { + navigationOrderIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'navigationOrder', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'navigationOrder'), + ); }); } QueryBuilder - navigationOrderElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + navigationOrderElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - navigationOrderElementGreaterThan( + navigationOrderElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - navigationOrderElementLessThan( + navigationOrderElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - navigationOrderElementBetween( + navigationOrderElementBetween( String lower, String upper, { bool includeLower = true, @@ -8743,149 +8952,119 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'navigationOrder', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - navigationOrderElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - navigationOrderElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - navigationOrderElementContains(String value, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'navigationOrder', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - navigationOrderElementMatches(String pattern, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'navigationOrder', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - navigationOrderElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'navigationOrder', - value: '', - )); - }); - } - - QueryBuilder - navigationOrderElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'navigationOrder', - value: '', - )); - }); - } - - QueryBuilder - navigationOrderLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'navigationOrder', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'navigationOrder', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - navigationOrderIsEmpty() { + navigationOrderElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'navigationOrder', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - navigationOrderIsNotEmpty() { + navigationOrderElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'navigationOrder', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - navigationOrderLengthLessThan( - int length, { - bool include = false, - }) { + navigationOrderElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'navigationOrder', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - navigationOrderLengthGreaterThan( - int length, { - bool include = false, - }) { + navigationOrderElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.matches( + property: r'navigationOrder', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + navigationOrderElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'navigationOrder', value: ''), + ); + }); + } + + QueryBuilder + navigationOrderElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'navigationOrder', value: ''), + ); + }); + } + + QueryBuilder + navigationOrderLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'navigationOrder', length, true, length, true); + }); + } + + QueryBuilder + navigationOrderIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'navigationOrder', 0, true, 0, true); + }); + } + + QueryBuilder + navigationOrderIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'navigationOrder', 0, false, 999999, true); + }); + } + + QueryBuilder + navigationOrderLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'navigationOrder', 0, true, length, include); + }); + } + + QueryBuilder + navigationOrderLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'navigationOrder', @@ -8898,7 +9077,7 @@ extension SettingsQueryFilter } QueryBuilder - navigationOrderLengthBetween( + navigationOrderLengthBetween( int lower, int upper, { bool includeLower = true, @@ -8916,81 +9095,80 @@ extension SettingsQueryFilter } QueryBuilder - novelDisplayTypeEqualTo(DisplayType value) { + novelDisplayTypeEqualTo(DisplayType value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'novelDisplayType', value: value), + ); }); } QueryBuilder - novelDisplayTypeGreaterThan( - DisplayType value, { - bool include = false, - }) { + novelDisplayTypeGreaterThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'novelDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'novelDisplayType', + value: value, + ), + ); }); } QueryBuilder - novelDisplayTypeLessThan( - DisplayType value, { - bool include = false, - }) { + novelDisplayTypeLessThan(DisplayType value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'novelDisplayType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'novelDisplayType', + value: value, + ), + ); }); } QueryBuilder - novelDisplayTypeBetween( + novelDisplayTypeBetween( DisplayType lower, DisplayType upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'novelDisplayType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'novelDisplayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - novelExtensionsRepoIsNull() { + novelExtensionsRepoIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelExtensionsRepo'), + ); }); } QueryBuilder - novelExtensionsRepoIsNotNull() { + novelExtensionsRepoIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelExtensionsRepo', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'novelExtensionsRepo'), + ); }); } QueryBuilder - novelExtensionsRepoLengthEqualTo(int length) { + novelExtensionsRepoLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'novelExtensionsRepo', @@ -9003,52 +9181,28 @@ extension SettingsQueryFilter } QueryBuilder - novelExtensionsRepoIsEmpty() { + novelExtensionsRepoIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'novelExtensionsRepo', - 0, - true, - 0, - true, - ); + return query.listLength(r'novelExtensionsRepo', 0, true, 0, true); }); } QueryBuilder - novelExtensionsRepoIsNotEmpty() { + novelExtensionsRepoIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'novelExtensionsRepo', - 0, - false, - 999999, - true, - ); + return query.listLength(r'novelExtensionsRepo', 0, false, 999999, true); }); } QueryBuilder - novelExtensionsRepoLengthLessThan( - int length, { - bool include = false, - }) { + novelExtensionsRepoLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'novelExtensionsRepo', - 0, - true, - length, - include, - ); + return query.listLength(r'novelExtensionsRepo', 0, true, length, include); }); } QueryBuilder - novelExtensionsRepoLengthGreaterThan( - int length, { - bool include = false, - }) { + novelExtensionsRepoLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'novelExtensionsRepo', @@ -9061,7 +9215,7 @@ extension SettingsQueryFilter } QueryBuilder - novelExtensionsRepoLengthBetween( + novelExtensionsRepoLengthBetween( int lower, int upper, { bool includeLower = true, @@ -9079,44 +9233,43 @@ extension SettingsQueryFilter } QueryBuilder - novelFontSizeIsNull() { + novelFontSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelFontSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelFontSize'), + ); }); } QueryBuilder - novelFontSizeIsNotNull() { + novelFontSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelFontSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'novelFontSize'), + ); }); } QueryBuilder novelFontSizeEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelFontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'novelFontSize', value: value), + ); }); } QueryBuilder - novelFontSizeGreaterThan( - int? value, { - bool include = false, - }) { + novelFontSizeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'novelFontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'novelFontSize', + value: value, + ), + ); }); } @@ -9125,11 +9278,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'novelFontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'novelFontSize', + value: value, + ), + ); }); } @@ -9140,55 +9295,56 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'novelFontSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'novelFontSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - novelGridSizeIsNull() { + novelGridSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelGridSize'), + ); }); } QueryBuilder - novelGridSizeIsNotNull() { + novelGridSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelGridSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'novelGridSize'), + ); }); } QueryBuilder novelGridSizeEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'novelGridSize', value: value), + ); }); } QueryBuilder - novelGridSizeGreaterThan( - int? value, { - bool include = false, - }) { + novelGridSizeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'novelGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'novelGridSize', + value: value, + ), + ); }); } @@ -9197,11 +9353,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'novelGridSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'novelGridSize', + value: value, + ), + ); }); } @@ -9212,219 +9370,245 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'novelGridSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'novelGridSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - novelLibraryDownloadedChaptersIsNull() { + novelLibraryDownloadedChaptersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'novelLibraryDownloadedChapters', + ), + ); }); } QueryBuilder - novelLibraryDownloadedChaptersIsNotNull() { + novelLibraryDownloadedChaptersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryDownloadedChapters', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'novelLibraryDownloadedChapters', + ), + ); }); } QueryBuilder - novelLibraryDownloadedChaptersEqualTo(bool? value) { + novelLibraryDownloadedChaptersEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryDownloadedChapters', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryDownloadedChapters', + value: value, + ), + ); }); } QueryBuilder - novelLibraryLocalSourceIsNull() { + novelLibraryLocalSourceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelLibraryLocalSource'), + ); }); } QueryBuilder - novelLibraryLocalSourceIsNotNull() { + novelLibraryLocalSourceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryLocalSource', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'novelLibraryLocalSource'), + ); }); } QueryBuilder - novelLibraryLocalSourceEqualTo(bool? value) { + novelLibraryLocalSourceEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryLocalSource', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryLocalSource', + value: value, + ), + ); }); } QueryBuilder - novelLibraryShowCategoryTabsIsNull() { + novelLibraryShowCategoryTabsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelLibraryShowCategoryTabs'), + ); }); } QueryBuilder - novelLibraryShowCategoryTabsIsNotNull() { + novelLibraryShowCategoryTabsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryShowCategoryTabs', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'novelLibraryShowCategoryTabs', + ), + ); }); } QueryBuilder - novelLibraryShowCategoryTabsEqualTo(bool? value) { + novelLibraryShowCategoryTabsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryShowCategoryTabs', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryShowCategoryTabs', + value: value, + ), + ); }); } QueryBuilder - novelLibraryShowContinueReadingButtonIsNull() { + novelLibraryShowContinueReadingButtonIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'novelLibraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - novelLibraryShowContinueReadingButtonIsNotNull() { + novelLibraryShowContinueReadingButtonIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryShowContinueReadingButton', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'novelLibraryShowContinueReadingButton', + ), + ); }); } QueryBuilder - novelLibraryShowContinueReadingButtonEqualTo(bool? value) { + novelLibraryShowContinueReadingButtonEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryShowContinueReadingButton', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryShowContinueReadingButton', + value: value, + ), + ); }); } QueryBuilder - novelLibraryShowLanguageIsNull() { + novelLibraryShowLanguageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'novelLibraryShowLanguage'), + ); }); } QueryBuilder - novelLibraryShowLanguageIsNotNull() { + novelLibraryShowLanguageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryShowLanguage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'novelLibraryShowLanguage'), + ); }); } QueryBuilder - novelLibraryShowLanguageEqualTo(bool? value) { + novelLibraryShowLanguageEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryShowLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryShowLanguage', + value: value, + ), + ); }); } QueryBuilder - novelLibraryShowNumbersOfItemsIsNull() { + novelLibraryShowNumbersOfItemsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'novelLibraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'novelLibraryShowNumbersOfItems', + ), + ); }); } QueryBuilder - novelLibraryShowNumbersOfItemsIsNotNull() { + novelLibraryShowNumbersOfItemsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'novelLibraryShowNumbersOfItems', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'novelLibraryShowNumbersOfItems', + ), + ); }); } QueryBuilder - novelLibraryShowNumbersOfItemsEqualTo(bool? value) { + novelLibraryShowNumbersOfItemsEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelLibraryShowNumbersOfItems', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'novelLibraryShowNumbersOfItems', + value: value, + ), + ); }); } QueryBuilder novelTextAlignEqualTo( - NovelTextAlign value) { + NovelTextAlign value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'novelTextAlign', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'novelTextAlign', value: value), + ); }); } QueryBuilder - novelTextAlignGreaterThan( - NovelTextAlign value, { - bool include = false, - }) { + novelTextAlignGreaterThan(NovelTextAlign value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'novelTextAlign', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'novelTextAlign', + value: value, + ), + ); }); } QueryBuilder - novelTextAlignLessThan( - NovelTextAlign value, { - bool include = false, - }) { + novelTextAlignLessThan(NovelTextAlign value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'novelTextAlign', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'novelTextAlign', + value: value, + ), + ); }); } @@ -9435,138 +9619,141 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'novelTextAlign', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'novelTextAlign', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - onlyIncludePinnedSourcesIsNull() { + onlyIncludePinnedSourcesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'onlyIncludePinnedSources', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'onlyIncludePinnedSources'), + ); }); } QueryBuilder - onlyIncludePinnedSourcesIsNotNull() { + onlyIncludePinnedSourcesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'onlyIncludePinnedSources', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'onlyIncludePinnedSources'), + ); }); } QueryBuilder - onlyIncludePinnedSourcesEqualTo(bool? value) { + onlyIncludePinnedSourcesEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'onlyIncludePinnedSources', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'onlyIncludePinnedSources', + value: value, + ), + ); }); } QueryBuilder - pagePreloadAmountIsNull() { + pagePreloadAmountIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'pagePreloadAmount', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'pagePreloadAmount'), + ); }); } QueryBuilder - pagePreloadAmountIsNotNull() { + pagePreloadAmountIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'pagePreloadAmount', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'pagePreloadAmount'), + ); }); } QueryBuilder - pagePreloadAmountEqualTo(int? value) { + pagePreloadAmountEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'pagePreloadAmount', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'pagePreloadAmount', value: value), + ); }); } QueryBuilder - pagePreloadAmountGreaterThan( - int? value, { - bool include = false, - }) { + pagePreloadAmountGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'pagePreloadAmount', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'pagePreloadAmount', + value: value, + ), + ); }); } QueryBuilder - pagePreloadAmountLessThan( - int? value, { - bool include = false, - }) { + pagePreloadAmountLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'pagePreloadAmount', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'pagePreloadAmount', + value: value, + ), + ); }); } QueryBuilder - pagePreloadAmountBetween( + pagePreloadAmountBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'pagePreloadAmount', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'pagePreloadAmount', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - personalPageModeListIsNull() { + personalPageModeListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'personalPageModeList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'personalPageModeList'), + ); }); } QueryBuilder - personalPageModeListIsNotNull() { + personalPageModeListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'personalPageModeList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'personalPageModeList'), + ); }); } QueryBuilder - personalPageModeListLengthEqualTo(int length) { + personalPageModeListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalPageModeList', @@ -9579,36 +9766,21 @@ extension SettingsQueryFilter } QueryBuilder - personalPageModeListIsEmpty() { + personalPageModeListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'personalPageModeList', - 0, - true, - 0, - true, - ); + return query.listLength(r'personalPageModeList', 0, true, 0, true); }); } QueryBuilder - personalPageModeListIsNotEmpty() { + personalPageModeListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'personalPageModeList', - 0, - false, - 999999, - true, - ); + return query.listLength(r'personalPageModeList', 0, false, 999999, true); }); } QueryBuilder - personalPageModeListLengthLessThan( - int length, { - bool include = false, - }) { + personalPageModeListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalPageModeList', @@ -9621,10 +9793,7 @@ extension SettingsQueryFilter } QueryBuilder - personalPageModeListLengthGreaterThan( - int length, { - bool include = false, - }) { + personalPageModeListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalPageModeList', @@ -9637,7 +9806,7 @@ extension SettingsQueryFilter } QueryBuilder - personalPageModeListLengthBetween( + personalPageModeListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -9655,25 +9824,25 @@ extension SettingsQueryFilter } QueryBuilder - personalReaderModeListIsNull() { + personalReaderModeListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'personalReaderModeList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'personalReaderModeList'), + ); }); } QueryBuilder - personalReaderModeListIsNotNull() { + personalReaderModeListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'personalReaderModeList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'personalReaderModeList'), + ); }); } QueryBuilder - personalReaderModeListLengthEqualTo(int length) { + personalReaderModeListLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalReaderModeList', @@ -9686,20 +9855,14 @@ extension SettingsQueryFilter } QueryBuilder - personalReaderModeListIsEmpty() { + personalReaderModeListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'personalReaderModeList', - 0, - true, - 0, - true, - ); + return query.listLength(r'personalReaderModeList', 0, true, 0, true); }); } QueryBuilder - personalReaderModeListIsNotEmpty() { + personalReaderModeListIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalReaderModeList', @@ -9712,10 +9875,7 @@ extension SettingsQueryFilter } QueryBuilder - personalReaderModeListLengthLessThan( - int length, { - bool include = false, - }) { + personalReaderModeListLengthLessThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalReaderModeList', @@ -9728,10 +9888,7 @@ extension SettingsQueryFilter } QueryBuilder - personalReaderModeListLengthGreaterThan( - int length, { - bool include = false, - }) { + personalReaderModeListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'personalReaderModeList', @@ -9744,7 +9901,7 @@ extension SettingsQueryFilter } QueryBuilder - personalReaderModeListLengthBetween( + personalReaderModeListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -9762,243 +9919,245 @@ extension SettingsQueryFilter } QueryBuilder - playerSubtitleSettingsIsNull() { + playerSubtitleSettingsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'playerSubtitleSettings', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'playerSubtitleSettings'), + ); }); } QueryBuilder - playerSubtitleSettingsIsNotNull() { + playerSubtitleSettingsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'playerSubtitleSettings', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'playerSubtitleSettings'), + ); }); } QueryBuilder - pureBlackDarkModeIsNull() { + pureBlackDarkModeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'pureBlackDarkMode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'pureBlackDarkMode'), + ); }); } QueryBuilder - pureBlackDarkModeIsNotNull() { + pureBlackDarkModeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'pureBlackDarkMode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'pureBlackDarkMode'), + ); }); } QueryBuilder - pureBlackDarkModeEqualTo(bool? value) { + pureBlackDarkModeEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'pureBlackDarkMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'pureBlackDarkMode', value: value), + ); }); } QueryBuilder - relativeTimesTampsIsNull() { + relativeTimesTampsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'relativeTimesTamps', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'relativeTimesTamps'), + ); }); } QueryBuilder - relativeTimesTampsIsNotNull() { + relativeTimesTampsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'relativeTimesTamps', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'relativeTimesTamps'), + ); }); } QueryBuilder - relativeTimesTampsEqualTo(int? value) { + relativeTimesTampsEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'relativeTimesTamps', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'relativeTimesTamps', value: value), + ); }); } QueryBuilder - relativeTimesTampsGreaterThan( - int? value, { - bool include = false, - }) { + relativeTimesTampsGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'relativeTimesTamps', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'relativeTimesTamps', + value: value, + ), + ); }); } QueryBuilder - relativeTimesTampsLessThan( - int? value, { - bool include = false, - }) { + relativeTimesTampsLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'relativeTimesTamps', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'relativeTimesTamps', + value: value, + ), + ); }); } QueryBuilder - relativeTimesTampsBetween( + relativeTimesTampsBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'relativeTimesTamps', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'relativeTimesTamps', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - rpcShowCoverImageIsNull() { + rpcShowCoverImageIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'rpcShowCoverImage', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'rpcShowCoverImage'), + ); }); } QueryBuilder - rpcShowCoverImageIsNotNull() { + rpcShowCoverImageIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'rpcShowCoverImage', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'rpcShowCoverImage'), + ); }); } QueryBuilder - rpcShowCoverImageEqualTo(bool? value) { + rpcShowCoverImageEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'rpcShowCoverImage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'rpcShowCoverImage', value: value), + ); }); } QueryBuilder - rpcShowReadingWatchingProgressIsNull() { + rpcShowReadingWatchingProgressIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'rpcShowReadingWatchingProgress', - )); + return query.addFilterCondition( + const FilterCondition.isNull( + property: r'rpcShowReadingWatchingProgress', + ), + ); }); } QueryBuilder - rpcShowReadingWatchingProgressIsNotNull() { + rpcShowReadingWatchingProgressIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'rpcShowReadingWatchingProgress', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'rpcShowReadingWatchingProgress', + ), + ); }); } QueryBuilder - rpcShowReadingWatchingProgressEqualTo(bool? value) { + rpcShowReadingWatchingProgressEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'rpcShowReadingWatchingProgress', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'rpcShowReadingWatchingProgress', + value: value, + ), + ); }); } QueryBuilder rpcShowTitleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'rpcShowTitle', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'rpcShowTitle'), + ); }); } QueryBuilder - rpcShowTitleIsNotNull() { + rpcShowTitleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'rpcShowTitle', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'rpcShowTitle'), + ); }); } QueryBuilder rpcShowTitleEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'rpcShowTitle', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'rpcShowTitle', value: value), + ); }); } QueryBuilder - saveAsCBZArchiveIsNull() { + saveAsCBZArchiveIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'saveAsCBZArchive', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'saveAsCBZArchive'), + ); }); } QueryBuilder - saveAsCBZArchiveIsNotNull() { + saveAsCBZArchiveIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'saveAsCBZArchive', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'saveAsCBZArchive'), + ); }); } QueryBuilder - saveAsCBZArchiveEqualTo(bool? value) { + saveAsCBZArchiveEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'saveAsCBZArchive', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'saveAsCBZArchive', value: value), + ); }); } QueryBuilder scaleTypeEqualTo( - ScaleType value) { + ScaleType value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'scaleType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'scaleType', value: value), + ); }); } @@ -10007,11 +10166,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'scaleType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'scaleType', + value: value, + ), + ); }); } @@ -10020,11 +10181,13 @@ extension SettingsQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'scaleType', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'scaleType', + value: value, + ), + ); }); } @@ -10035,122 +10198,93 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'scaleType', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - showPagesNumberIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'showPagesNumber', - )); - }); - } - - QueryBuilder - showPagesNumberIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'showPagesNumber', - )); - }); - } - - QueryBuilder - showPagesNumberEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'showPagesNumber', - value: value, - )); - }); - } - - QueryBuilder - sortChapterListIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sortChapterList', - )); - }); - } - - QueryBuilder - sortChapterListIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sortChapterList', - )); - }); - } - - QueryBuilder - sortChapterListLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'sortChapterList', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'scaleType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), ); }); } QueryBuilder - sortChapterListIsEmpty() { + showPagesNumberIsNull() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'sortChapterList', - 0, - true, - 0, - true, + return query.addFilterCondition( + const FilterCondition.isNull(property: r'showPagesNumber'), ); }); } QueryBuilder - sortChapterListIsNotEmpty() { + showPagesNumberIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'sortChapterList', - 0, - false, - 999999, - true, + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'showPagesNumber'), ); }); } QueryBuilder - sortChapterListLengthLessThan( - int length, { - bool include = false, - }) { + showPagesNumberEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'sortChapterList', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.equalTo(property: r'showPagesNumber', value: value), ); }); } QueryBuilder - sortChapterListLengthGreaterThan( - int length, { - bool include = false, - }) { + sortChapterListIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sortChapterList'), + ); + }); + } + + QueryBuilder + sortChapterListIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sortChapterList'), + ); + }); + } + + QueryBuilder + sortChapterListLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'sortChapterList', length, true, length, true); + }); + } + + QueryBuilder + sortChapterListIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'sortChapterList', 0, true, 0, true); + }); + } + + QueryBuilder + sortChapterListIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'sortChapterList', 0, false, 999999, true); + }); + } + + QueryBuilder + sortChapterListLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'sortChapterList', 0, true, length, include); + }); + } + + QueryBuilder + sortChapterListLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.listLength( r'sortChapterList', @@ -10163,7 +10297,7 @@ extension SettingsQueryFilter } QueryBuilder - sortChapterListLengthBetween( + sortChapterListLengthBetween( int lower, int upper, { bool includeLower = true, @@ -10181,211 +10315,214 @@ extension SettingsQueryFilter } QueryBuilder - sortLibraryAnimeIsNull() { + sortLibraryAnimeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sortLibraryAnime', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sortLibraryAnime'), + ); }); } QueryBuilder - sortLibraryAnimeIsNotNull() { + sortLibraryAnimeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sortLibraryAnime', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sortLibraryAnime'), + ); }); } QueryBuilder - sortLibraryMangaIsNull() { + sortLibraryMangaIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sortLibraryManga', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sortLibraryManga'), + ); }); } QueryBuilder - sortLibraryMangaIsNotNull() { + sortLibraryMangaIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sortLibraryManga', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sortLibraryManga'), + ); }); } QueryBuilder - sortLibraryNovelIsNull() { + sortLibraryNovelIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sortLibraryNovel', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sortLibraryNovel'), + ); }); } QueryBuilder - sortLibraryNovelIsNotNull() { + sortLibraryNovelIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sortLibraryNovel', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sortLibraryNovel'), + ); }); } QueryBuilder - startDatebackupIsNull() { + startDatebackupIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'startDatebackup', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'startDatebackup'), + ); }); } QueryBuilder - startDatebackupIsNotNull() { + startDatebackupIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'startDatebackup', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'startDatebackup'), + ); }); } QueryBuilder - startDatebackupEqualTo(int? value) { + startDatebackupEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'startDatebackup', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'startDatebackup', value: value), + ); }); } QueryBuilder - startDatebackupGreaterThan( - int? value, { - bool include = false, - }) { + startDatebackupGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'startDatebackup', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'startDatebackup', + value: value, + ), + ); }); } QueryBuilder - startDatebackupLessThan( - int? value, { - bool include = false, - }) { + startDatebackupLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'startDatebackup', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'startDatebackup', + value: value, + ), + ); }); } QueryBuilder - startDatebackupBetween( + startDatebackupBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'startDatebackup', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'startDatebackup', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder themeIsDarkIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'themeIsDark', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'themeIsDark'), + ); }); } QueryBuilder - themeIsDarkIsNotNull() { + themeIsDarkIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'themeIsDark', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'themeIsDark'), + ); }); } QueryBuilder themeIsDarkEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'themeIsDark', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'themeIsDark', value: value), + ); }); } QueryBuilder - updateProgressAfterReadingIsNull() { + updateProgressAfterReadingIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'updateProgressAfterReading', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'updateProgressAfterReading'), + ); }); } QueryBuilder - updateProgressAfterReadingIsNotNull() { + updateProgressAfterReadingIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'updateProgressAfterReading', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'updateProgressAfterReading', + ), + ); }); } QueryBuilder - updateProgressAfterReadingEqualTo(bool? value) { + updateProgressAfterReadingEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'updateProgressAfterReading', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'updateProgressAfterReading', + value: value, + ), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -10394,11 +10531,13 @@ extension SettingsQueryFilter 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, + ), + ); }); } @@ -10407,11 +10546,13 @@ extension SettingsQueryFilter 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, + ), + ); }); } @@ -10422,137 +10563,138 @@ extension SettingsQueryFilter 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, + ), + ); }); } QueryBuilder useLibassIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useLibass', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'useLibass'), + ); }); } QueryBuilder useLibassIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useLibass', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'useLibass'), + ); }); } QueryBuilder useLibassEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useLibass', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'useLibass', value: value), + ); }); } QueryBuilder useMpvConfigIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useMpvConfig', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'useMpvConfig'), + ); }); } QueryBuilder - useMpvConfigIsNotNull() { + useMpvConfigIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useMpvConfig', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'useMpvConfig'), + ); }); } QueryBuilder useMpvConfigEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useMpvConfig', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'useMpvConfig', value: value), + ); }); } QueryBuilder - usePageTapZonesIsNull() { + usePageTapZonesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'usePageTapZones', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'usePageTapZones'), + ); }); } QueryBuilder - usePageTapZonesIsNotNull() { + usePageTapZonesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'usePageTapZones', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'usePageTapZones'), + ); }); } QueryBuilder - usePageTapZonesEqualTo(bool? value) { + usePageTapZonesEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'usePageTapZones', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'usePageTapZones', value: value), + ); }); } QueryBuilder useYUV420PIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useYUV420P', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'useYUV420P'), + ); }); } QueryBuilder - useYUV420PIsNotNull() { + useYUV420PIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useYUV420P', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'useYUV420P'), + ); }); } QueryBuilder useYUV420PEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useYUV420P', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'useYUV420P', value: value), + ); }); } QueryBuilder userAgentIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'userAgent', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'userAgent'), + ); }); } QueryBuilder userAgentIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'userAgent', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'userAgent'), + ); }); } @@ -10561,11 +10703,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -10575,12 +10719,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -10590,12 +10736,14 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -10607,14 +10755,16 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'userAgent', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'userAgent', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -10623,11 +10773,13 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -10636,110 +10788,114 @@ extension SettingsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder userAgentContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'userAgent', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'userAgent', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder userAgentMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'userAgent', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'userAgent', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder userAgentIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'userAgent', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'userAgent', value: ''), + ); }); } QueryBuilder - userAgentIsNotEmpty() { + userAgentIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'userAgent', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'userAgent', value: ''), + ); }); } QueryBuilder - volumeBoostCapIsNull() { + volumeBoostCapIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'volumeBoostCap', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'volumeBoostCap'), + ); }); } QueryBuilder - volumeBoostCapIsNotNull() { + volumeBoostCapIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'volumeBoostCap', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'volumeBoostCap'), + ); }); } QueryBuilder volumeBoostCapEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'volumeBoostCap', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'volumeBoostCap', value: value), + ); }); } QueryBuilder - volumeBoostCapGreaterThan( - int? value, { - bool include = false, - }) { + volumeBoostCapGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'volumeBoostCap', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'volumeBoostCap', + value: value, + ), + ); }); } QueryBuilder - volumeBoostCapLessThan( - int? value, { - bool include = false, - }) { + volumeBoostCapLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'volumeBoostCap', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'volumeBoostCap', + value: value, + ), + ); }); } @@ -10750,13 +10906,15 @@ extension SettingsQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'volumeBoostCap', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'volumeBoostCap', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -10764,156 +10922,162 @@ extension SettingsQueryFilter extension SettingsQueryObject on QueryBuilder { QueryBuilder algorithmWeights( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'algorithmWeights'); }); } QueryBuilder - animeExtensionsRepoElement(FilterQuery q) { + animeExtensionsRepoElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'animeExtensionsRepo'); }); } QueryBuilder - autoScrollPagesElement(FilterQuery q) { + autoScrollPagesElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'autoScrollPages'); }); } QueryBuilder - chapterFilterBookmarkedListElement( - FilterQuery q) { + chapterFilterBookmarkedListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'chapterFilterBookmarkedList'); }); } QueryBuilder - chapterFilterDownloadedListElement( - FilterQuery q) { + chapterFilterDownloadedListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'chapterFilterDownloadedList'); }); } QueryBuilder - chapterFilterUnreadListElement(FilterQuery q) { + chapterFilterUnreadListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'chapterFilterUnreadList'); }); } QueryBuilder - chapterPageIndexListElement(FilterQuery q) { + chapterPageIndexListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'chapterPageIndexList'); }); } QueryBuilder - chapterPageUrlsListElement(FilterQuery q) { + chapterPageUrlsListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'chapterPageUrlsList'); }); } QueryBuilder cookiesListElement( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'cookiesList'); }); } QueryBuilder customColorFilter( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'customColorFilter'); }); } QueryBuilder defaultSubtitleLang( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'defaultSubtitleLang'); }); } QueryBuilder - filterScanlatorListElement(FilterQuery q) { + filterScanlatorListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'filterScanlatorList'); }); } QueryBuilder locale( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'locale'); }); } QueryBuilder - mangaExtensionsRepoElement(FilterQuery q) { + mangaExtensionsRepoElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'mangaExtensionsRepo'); }); } QueryBuilder - novelExtensionsRepoElement(FilterQuery q) { + novelExtensionsRepoElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'novelExtensionsRepo'); }); } QueryBuilder - personalPageModeListElement(FilterQuery q) { + personalPageModeListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'personalPageModeList'); }); } QueryBuilder - personalReaderModeListElement(FilterQuery q) { + personalReaderModeListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'personalReaderModeList'); }); } QueryBuilder - playerSubtitleSettings(FilterQuery q) { + playerSubtitleSettings(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'playerSubtitleSettings'); }); } QueryBuilder - sortChapterListElement(FilterQuery q) { + sortChapterListElement(FilterQuery q) { return QueryBuilder.apply(this, (query) { return query.object(q, r'sortChapterList'); }); } QueryBuilder sortLibraryAnime( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'sortLibraryAnime'); }); } QueryBuilder sortLibraryManga( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'sortLibraryManga'); }); } QueryBuilder sortLibraryNovel( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'sortLibraryNovel'); }); @@ -10923,14 +11087,16 @@ extension SettingsQueryObject extension SettingsQueryLinks on QueryBuilder { QueryBuilder sources( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'sources'); }); } QueryBuilder sourcesLengthEqualTo( - int length) { + int length, + ) { return QueryBuilder.apply(this, (query) { return query.linkLength(r'sources', length, true, length, true); }); @@ -10958,10 +11124,7 @@ extension SettingsQueryLinks } QueryBuilder - sourcesLengthGreaterThan( - int length, { - bool include = false, - }) { + sourcesLengthGreaterThan(int length, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.linkLength(r'sources', length, include, 999999, true); }); @@ -10975,7 +11138,12 @@ extension SettingsQueryLinks }) { return QueryBuilder.apply(this, (query) { return query.linkLength( - r'sources', lower, includeLower, upper, includeUpper); + r'sources', + lower, + includeLower, + upper, + includeUpper, + ); }); } } @@ -10988,7 +11156,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAndroidProxyServerDesc() { + sortByAndroidProxyServerDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'androidProxyServer', Sort.desc); }); @@ -11001,21 +11169,21 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAniSkipTimeoutLengthDesc() { + sortByAniSkipTimeoutLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'aniSkipTimeoutLength', Sort.desc); }); } QueryBuilder - sortByAnimatePageTransitions() { + sortByAnimatePageTransitions() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animatePageTransitions', Sort.asc); }); } QueryBuilder - sortByAnimatePageTransitionsDesc() { + sortByAnimatePageTransitionsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animatePageTransitions', Sort.desc); }); @@ -11046,86 +11214,90 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAnimeLibraryDownloadedChapters() { + sortByAnimeLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryDownloadedChapters', Sort.asc); }); } QueryBuilder - sortByAnimeLibraryDownloadedChaptersDesc() { + sortByAnimeLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryDownloadedChapters', Sort.desc); }); } QueryBuilder - sortByAnimeLibraryLocalSource() { + sortByAnimeLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryLocalSource', Sort.asc); }); } QueryBuilder - sortByAnimeLibraryLocalSourceDesc() { + sortByAnimeLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryLocalSource', Sort.desc); }); } QueryBuilder - sortByAnimeLibraryShowCategoryTabs() { + sortByAnimeLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - sortByAnimeLibraryShowCategoryTabsDesc() { + sortByAnimeLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - sortByAnimeLibraryShowContinueReadingButton() { + sortByAnimeLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'animeLibraryShowContinueReadingButton', Sort.asc); + r'animeLibraryShowContinueReadingButton', + Sort.asc, + ); }); } QueryBuilder - sortByAnimeLibraryShowContinueReadingButtonDesc() { + sortByAnimeLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'animeLibraryShowContinueReadingButton', Sort.desc); + r'animeLibraryShowContinueReadingButton', + Sort.desc, + ); }); } QueryBuilder - sortByAnimeLibraryShowLanguage() { + sortByAnimeLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowLanguage', Sort.asc); }); } QueryBuilder - sortByAnimeLibraryShowLanguageDesc() { + sortByAnimeLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowLanguage', Sort.desc); }); } QueryBuilder - sortByAnimeLibraryShowNumbersOfItems() { + sortByAnimeLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - sortByAnimeLibraryShowNumbersOfItemsDesc() { + sortByAnimeLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowNumbersOfItems', Sort.desc); }); @@ -11156,14 +11328,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAudioPreferredLanguages() { + sortByAudioPreferredLanguages() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'audioPreferredLanguages', Sort.asc); }); } QueryBuilder - sortByAudioPreferredLanguagesDesc() { + sortByAudioPreferredLanguagesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'audioPreferredLanguages', Sort.desc); }); @@ -11176,7 +11348,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAutoBackupLocationDesc() { + sortByAutoBackupLocationDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.desc); }); @@ -11189,7 +11361,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByAutoExtensionsUpdatesDesc() { + sortByAutoExtensionsUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoExtensionsUpdates', Sort.desc); }); @@ -11250,35 +11422,35 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByCheckForAppUpdatesDesc() { + sortByCheckForAppUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForAppUpdates', Sort.desc); }); } QueryBuilder - sortByCheckForExtensionUpdates() { + sortByCheckForExtensionUpdates() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForExtensionUpdates', Sort.asc); }); } QueryBuilder - sortByCheckForExtensionUpdatesDesc() { + sortByCheckForExtensionUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForExtensionUpdates', Sort.desc); }); } QueryBuilder - sortByClearChapterCacheOnAppLaunch() { + sortByClearChapterCacheOnAppLaunch() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'clearChapterCacheOnAppLaunch', Sort.asc); }); } QueryBuilder - sortByClearChapterCacheOnAppLaunchDesc() { + sortByClearChapterCacheOnAppLaunchDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'clearChapterCacheOnAppLaunch', Sort.desc); }); @@ -11291,7 +11463,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByColorFilterBlendModeDesc() { + sortByColorFilterBlendModeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'colorFilterBlendMode', Sort.desc); }); @@ -11304,7 +11476,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByConcurrentDownloadsDesc() { + sortByConcurrentDownloadsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'concurrentDownloads', Sort.desc); }); @@ -11359,14 +11531,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDefaultDoubleTapToSkipLength() { + sortByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultDoubleTapToSkipLength', Sort.asc); }); } QueryBuilder - sortByDefaultDoubleTapToSkipLengthDesc() { + sortByDefaultDoubleTapToSkipLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultDoubleTapToSkipLength', Sort.desc); }); @@ -11379,7 +11551,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDefaultPlayBackSpeedDesc() { + sortByDefaultPlayBackSpeedDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultPlayBackSpeed', Sort.desc); }); @@ -11398,14 +11570,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDefaultSkipIntroLength() { + sortByDefaultSkipIntroLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultSkipIntroLength', Sort.asc); }); } QueryBuilder - sortByDefaultSkipIntroLengthDesc() { + sortByDefaultSkipIntroLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultSkipIntroLength', Sort.desc); }); @@ -11418,7 +11590,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDisableSectionTypeDesc() { + sortByDisableSectionTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'disableSectionType', Sort.desc); }); @@ -11437,14 +11609,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDoubleTapAnimationSpeed() { + sortByDoubleTapAnimationSpeed() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'doubleTapAnimationSpeed', Sort.asc); }); } QueryBuilder - sortByDoubleTapAnimationSpeedDesc() { + sortByDoubleTapAnimationSpeedDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'doubleTapAnimationSpeed', Sort.desc); }); @@ -11469,7 +11641,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDownloadOnlyOnWifiDesc() { + sortByDownloadOnlyOnWifiDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'downloadOnlyOnWifi', Sort.desc); }); @@ -11482,7 +11654,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByDownloadedOnlyModeDesc() { + sortByDownloadedOnlyModeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'downloadedOnlyMode', Sort.desc); }); @@ -11501,14 +11673,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByEnableAudioPitchCorrection() { + sortByEnableAudioPitchCorrection() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); }); } QueryBuilder - sortByEnableAudioPitchCorrectionDesc() { + sortByEnableAudioPitchCorrectionDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); }); @@ -11527,14 +11699,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByEnableCustomColorFilter() { + sortByEnableCustomColorFilter() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableCustomColorFilter', Sort.asc); }); } QueryBuilder - sortByEnableCustomColorFilterDesc() { + sortByEnableCustomColorFilterDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableCustomColorFilter', Sort.desc); }); @@ -11565,14 +11737,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByFlexColorSchemeBlendLevel() { + sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexColorSchemeBlendLevel', Sort.asc); }); } QueryBuilder - sortByFlexColorSchemeBlendLevelDesc() { + sortByFlexColorSchemeBlendLevelDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexColorSchemeBlendLevel', Sort.desc); }); @@ -11585,7 +11757,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByFlexSchemeColorIndexDesc() { + sortByFlexSchemeColorIndexDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexSchemeColorIndex', Sort.desc); }); @@ -11628,14 +11800,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByHideDiscordRpcInIncognito() { + sortByHideDiscordRpcInIncognito() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hideDiscordRpcInIncognito', Sort.asc); }); } QueryBuilder - sortByHideDiscordRpcInIncognitoDesc() { + sortByHideDiscordRpcInIncognitoDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hideDiscordRpcInIncognito', Sort.desc); }); @@ -11666,196 +11838,196 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByLastTrackerLibraryLocation() { + sortByLastTrackerLibraryLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastTrackerLibraryLocation', Sort.asc); }); } QueryBuilder - sortByLastTrackerLibraryLocationDesc() { + sortByLastTrackerLibraryLocationDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastTrackerLibraryLocation', Sort.desc); }); } QueryBuilder - sortByLibraryDownloadedChapters() { + sortByLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryDownloadedChapters', Sort.asc); }); } QueryBuilder - sortByLibraryDownloadedChaptersDesc() { + sortByLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryDownloadedChapters', Sort.desc); }); } QueryBuilder - sortByLibraryFilterAnimeBookMarkedType() { + sortByLibraryFilterAnimeBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeBookMarkedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterAnimeBookMarkedTypeDesc() { + sortByLibraryFilterAnimeBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeBookMarkedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterAnimeDownloadType() { + sortByLibraryFilterAnimeDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeDownloadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterAnimeDownloadTypeDesc() { + sortByLibraryFilterAnimeDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeDownloadType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterAnimeStartedType() { + sortByLibraryFilterAnimeStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeStartedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterAnimeStartedTypeDesc() { + sortByLibraryFilterAnimeStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeStartedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterAnimeUnreadType() { + sortByLibraryFilterAnimeUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeUnreadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterAnimeUnreadTypeDesc() { + sortByLibraryFilterAnimeUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeUnreadType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterMangasBookMarkedType() { + sortByLibraryFilterMangasBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasBookMarkedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterMangasBookMarkedTypeDesc() { + sortByLibraryFilterMangasBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasBookMarkedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterMangasDownloadType() { + sortByLibraryFilterMangasDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasDownloadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterMangasDownloadTypeDesc() { + sortByLibraryFilterMangasDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasDownloadType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterMangasStartedType() { + sortByLibraryFilterMangasStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasStartedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterMangasStartedTypeDesc() { + sortByLibraryFilterMangasStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasStartedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterMangasUnreadType() { + sortByLibraryFilterMangasUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasUnreadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterMangasUnreadTypeDesc() { + sortByLibraryFilterMangasUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasUnreadType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterNovelBookMarkedType() { + sortByLibraryFilterNovelBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterNovelBookMarkedTypeDesc() { + sortByLibraryFilterNovelBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterNovelDownloadType() { + sortByLibraryFilterNovelDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterNovelDownloadTypeDesc() { + sortByLibraryFilterNovelDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterNovelStartedType() { + sortByLibraryFilterNovelStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterNovelStartedTypeDesc() { + sortByLibraryFilterNovelStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); }); } QueryBuilder - sortByLibraryFilterNovelUnreadType() { + sortByLibraryFilterNovelUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); }); } QueryBuilder - sortByLibraryFilterNovelUnreadTypeDesc() { + sortByLibraryFilterNovelUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); }); @@ -11868,35 +12040,35 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByLibraryLocalSourceDesc() { + sortByLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.desc); }); } QueryBuilder - sortByLibraryShowCategoryTabs() { + sortByLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - sortByLibraryShowCategoryTabsDesc() { + sortByLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - sortByLibraryShowContinueReadingButton() { + sortByLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowContinueReadingButton', Sort.asc); }); } QueryBuilder - sortByLibraryShowContinueReadingButtonDesc() { + sortByLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowContinueReadingButton', Sort.desc); }); @@ -11909,21 +12081,21 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByLibraryShowLanguageDesc() { + sortByLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowLanguage', Sort.desc); }); } QueryBuilder - sortByLibraryShowNumbersOfItems() { + sortByLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - sortByLibraryShowNumbersOfItemsDesc() { + sortByLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowNumbersOfItems', Sort.desc); }); @@ -11948,7 +12120,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByMangaHomeDisplayTypeDesc() { + sortByMangaHomeDisplayTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mangaHomeDisplayType', Sort.desc); }); @@ -11961,7 +12133,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByMarkEpisodeAsSeenTypeDesc() { + sortByMarkEpisodeAsSeenTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'markEpisodeAsSeenType', Sort.desc); }); @@ -11974,7 +12146,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByMergeLibraryNavMobileDesc() { + sortByMergeLibraryNavMobileDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mergeLibraryNavMobile', Sort.desc); }); @@ -12017,86 +12189,90 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByNovelLibraryDownloadedChapters() { + sortByNovelLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); }); } QueryBuilder - sortByNovelLibraryDownloadedChaptersDesc() { + sortByNovelLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); }); } QueryBuilder - sortByNovelLibraryLocalSource() { + sortByNovelLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); }); } QueryBuilder - sortByNovelLibraryLocalSourceDesc() { + sortByNovelLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); }); } QueryBuilder - sortByNovelLibraryShowCategoryTabs() { + sortByNovelLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - sortByNovelLibraryShowCategoryTabsDesc() { + sortByNovelLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - sortByNovelLibraryShowContinueReadingButton() { + sortByNovelLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'novelLibraryShowContinueReadingButton', Sort.asc); + r'novelLibraryShowContinueReadingButton', + Sort.asc, + ); }); } QueryBuilder - sortByNovelLibraryShowContinueReadingButtonDesc() { + sortByNovelLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'novelLibraryShowContinueReadingButton', Sort.desc); + r'novelLibraryShowContinueReadingButton', + Sort.desc, + ); }); } QueryBuilder - sortByNovelLibraryShowLanguage() { + sortByNovelLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); }); } QueryBuilder - sortByNovelLibraryShowLanguageDesc() { + sortByNovelLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); }); } QueryBuilder - sortByNovelLibraryShowNumbersOfItems() { + sortByNovelLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - sortByNovelLibraryShowNumbersOfItemsDesc() { + sortByNovelLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); }); @@ -12115,14 +12291,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByOnlyIncludePinnedSources() { + sortByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'onlyIncludePinnedSources', Sort.asc); }); } QueryBuilder - sortByOnlyIncludePinnedSourcesDesc() { + sortByOnlyIncludePinnedSourcesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'onlyIncludePinnedSources', Sort.desc); }); @@ -12159,7 +12335,7 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByRelativeTimesTampsDesc() { + sortByRelativeTimesTampsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'relativeTimesTamps', Sort.desc); }); @@ -12178,14 +12354,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByRpcShowReadingWatchingProgress() { + sortByRpcShowReadingWatchingProgress() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'rpcShowReadingWatchingProgress', Sort.asc); }); } QueryBuilder - sortByRpcShowReadingWatchingProgressDesc() { + sortByRpcShowReadingWatchingProgressDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'rpcShowReadingWatchingProgress', Sort.desc); }); @@ -12264,14 +12440,14 @@ extension SettingsQuerySortBy on QueryBuilder { } QueryBuilder - sortByUpdateProgressAfterReading() { + sortByUpdateProgressAfterReading() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updateProgressAfterReading', Sort.asc); }); } QueryBuilder - sortByUpdateProgressAfterReadingDesc() { + sortByUpdateProgressAfterReadingDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updateProgressAfterReading', Sort.desc); }); @@ -12371,7 +12547,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAndroidProxyServerDesc() { + thenByAndroidProxyServerDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'androidProxyServer', Sort.desc); }); @@ -12384,21 +12560,21 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAniSkipTimeoutLengthDesc() { + thenByAniSkipTimeoutLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'aniSkipTimeoutLength', Sort.desc); }); } QueryBuilder - thenByAnimatePageTransitions() { + thenByAnimatePageTransitions() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animatePageTransitions', Sort.asc); }); } QueryBuilder - thenByAnimatePageTransitionsDesc() { + thenByAnimatePageTransitionsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animatePageTransitions', Sort.desc); }); @@ -12429,86 +12605,90 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAnimeLibraryDownloadedChapters() { + thenByAnimeLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryDownloadedChapters', Sort.asc); }); } QueryBuilder - thenByAnimeLibraryDownloadedChaptersDesc() { + thenByAnimeLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryDownloadedChapters', Sort.desc); }); } QueryBuilder - thenByAnimeLibraryLocalSource() { + thenByAnimeLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryLocalSource', Sort.asc); }); } QueryBuilder - thenByAnimeLibraryLocalSourceDesc() { + thenByAnimeLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryLocalSource', Sort.desc); }); } QueryBuilder - thenByAnimeLibraryShowCategoryTabs() { + thenByAnimeLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - thenByAnimeLibraryShowCategoryTabsDesc() { + thenByAnimeLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - thenByAnimeLibraryShowContinueReadingButton() { + thenByAnimeLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'animeLibraryShowContinueReadingButton', Sort.asc); + r'animeLibraryShowContinueReadingButton', + Sort.asc, + ); }); } QueryBuilder - thenByAnimeLibraryShowContinueReadingButtonDesc() { + thenByAnimeLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'animeLibraryShowContinueReadingButton', Sort.desc); + r'animeLibraryShowContinueReadingButton', + Sort.desc, + ); }); } QueryBuilder - thenByAnimeLibraryShowLanguage() { + thenByAnimeLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowLanguage', Sort.asc); }); } QueryBuilder - thenByAnimeLibraryShowLanguageDesc() { + thenByAnimeLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowLanguage', Sort.desc); }); } QueryBuilder - thenByAnimeLibraryShowNumbersOfItems() { + thenByAnimeLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - thenByAnimeLibraryShowNumbersOfItemsDesc() { + thenByAnimeLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'animeLibraryShowNumbersOfItems', Sort.desc); }); @@ -12539,14 +12719,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAudioPreferredLanguages() { + thenByAudioPreferredLanguages() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'audioPreferredLanguages', Sort.asc); }); } QueryBuilder - thenByAudioPreferredLanguagesDesc() { + thenByAudioPreferredLanguagesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'audioPreferredLanguages', Sort.desc); }); @@ -12559,7 +12739,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAutoBackupLocationDesc() { + thenByAutoBackupLocationDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.desc); }); @@ -12572,7 +12752,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByAutoExtensionsUpdatesDesc() { + thenByAutoExtensionsUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoExtensionsUpdates', Sort.desc); }); @@ -12633,35 +12813,35 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByCheckForAppUpdatesDesc() { + thenByCheckForAppUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForAppUpdates', Sort.desc); }); } QueryBuilder - thenByCheckForExtensionUpdates() { + thenByCheckForExtensionUpdates() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForExtensionUpdates', Sort.asc); }); } QueryBuilder - thenByCheckForExtensionUpdatesDesc() { + thenByCheckForExtensionUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'checkForExtensionUpdates', Sort.desc); }); } QueryBuilder - thenByClearChapterCacheOnAppLaunch() { + thenByClearChapterCacheOnAppLaunch() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'clearChapterCacheOnAppLaunch', Sort.asc); }); } QueryBuilder - thenByClearChapterCacheOnAppLaunchDesc() { + thenByClearChapterCacheOnAppLaunchDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'clearChapterCacheOnAppLaunch', Sort.desc); }); @@ -12674,7 +12854,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByColorFilterBlendModeDesc() { + thenByColorFilterBlendModeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'colorFilterBlendMode', Sort.desc); }); @@ -12687,7 +12867,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByConcurrentDownloadsDesc() { + thenByConcurrentDownloadsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'concurrentDownloads', Sort.desc); }); @@ -12742,14 +12922,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDefaultDoubleTapToSkipLength() { + thenByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultDoubleTapToSkipLength', Sort.asc); }); } QueryBuilder - thenByDefaultDoubleTapToSkipLengthDesc() { + thenByDefaultDoubleTapToSkipLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultDoubleTapToSkipLength', Sort.desc); }); @@ -12762,7 +12942,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDefaultPlayBackSpeedDesc() { + thenByDefaultPlayBackSpeedDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultPlayBackSpeed', Sort.desc); }); @@ -12781,14 +12961,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDefaultSkipIntroLength() { + thenByDefaultSkipIntroLength() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultSkipIntroLength', Sort.asc); }); } QueryBuilder - thenByDefaultSkipIntroLengthDesc() { + thenByDefaultSkipIntroLengthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'defaultSkipIntroLength', Sort.desc); }); @@ -12801,7 +12981,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDisableSectionTypeDesc() { + thenByDisableSectionTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'disableSectionType', Sort.desc); }); @@ -12820,14 +13000,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDoubleTapAnimationSpeed() { + thenByDoubleTapAnimationSpeed() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'doubleTapAnimationSpeed', Sort.asc); }); } QueryBuilder - thenByDoubleTapAnimationSpeedDesc() { + thenByDoubleTapAnimationSpeedDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'doubleTapAnimationSpeed', Sort.desc); }); @@ -12852,7 +13032,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDownloadOnlyOnWifiDesc() { + thenByDownloadOnlyOnWifiDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'downloadOnlyOnWifi', Sort.desc); }); @@ -12865,7 +13045,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByDownloadedOnlyModeDesc() { + thenByDownloadedOnlyModeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'downloadedOnlyMode', Sort.desc); }); @@ -12884,14 +13064,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByEnableAudioPitchCorrection() { + thenByEnableAudioPitchCorrection() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); }); } QueryBuilder - thenByEnableAudioPitchCorrectionDesc() { + thenByEnableAudioPitchCorrectionDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); }); @@ -12910,14 +13090,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByEnableCustomColorFilter() { + thenByEnableCustomColorFilter() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableCustomColorFilter', Sort.asc); }); } QueryBuilder - thenByEnableCustomColorFilterDesc() { + thenByEnableCustomColorFilterDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableCustomColorFilter', Sort.desc); }); @@ -12948,14 +13128,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByFlexColorSchemeBlendLevel() { + thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexColorSchemeBlendLevel', Sort.asc); }); } QueryBuilder - thenByFlexColorSchemeBlendLevelDesc() { + thenByFlexColorSchemeBlendLevelDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexColorSchemeBlendLevel', Sort.desc); }); @@ -12968,7 +13148,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByFlexSchemeColorIndexDesc() { + thenByFlexSchemeColorIndexDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'flexSchemeColorIndex', Sort.desc); }); @@ -13011,14 +13191,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByHideDiscordRpcInIncognito() { + thenByHideDiscordRpcInIncognito() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hideDiscordRpcInIncognito', Sort.asc); }); } QueryBuilder - thenByHideDiscordRpcInIncognitoDesc() { + thenByHideDiscordRpcInIncognitoDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'hideDiscordRpcInIncognito', Sort.desc); }); @@ -13061,196 +13241,196 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByLastTrackerLibraryLocation() { + thenByLastTrackerLibraryLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastTrackerLibraryLocation', Sort.asc); }); } QueryBuilder - thenByLastTrackerLibraryLocationDesc() { + thenByLastTrackerLibraryLocationDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastTrackerLibraryLocation', Sort.desc); }); } QueryBuilder - thenByLibraryDownloadedChapters() { + thenByLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryDownloadedChapters', Sort.asc); }); } QueryBuilder - thenByLibraryDownloadedChaptersDesc() { + thenByLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryDownloadedChapters', Sort.desc); }); } QueryBuilder - thenByLibraryFilterAnimeBookMarkedType() { + thenByLibraryFilterAnimeBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeBookMarkedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterAnimeBookMarkedTypeDesc() { + thenByLibraryFilterAnimeBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeBookMarkedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterAnimeDownloadType() { + thenByLibraryFilterAnimeDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeDownloadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterAnimeDownloadTypeDesc() { + thenByLibraryFilterAnimeDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeDownloadType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterAnimeStartedType() { + thenByLibraryFilterAnimeStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeStartedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterAnimeStartedTypeDesc() { + thenByLibraryFilterAnimeStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeStartedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterAnimeUnreadType() { + thenByLibraryFilterAnimeUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeUnreadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterAnimeUnreadTypeDesc() { + thenByLibraryFilterAnimeUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterAnimeUnreadType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterMangasBookMarkedType() { + thenByLibraryFilterMangasBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasBookMarkedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterMangasBookMarkedTypeDesc() { + thenByLibraryFilterMangasBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasBookMarkedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterMangasDownloadType() { + thenByLibraryFilterMangasDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasDownloadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterMangasDownloadTypeDesc() { + thenByLibraryFilterMangasDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasDownloadType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterMangasStartedType() { + thenByLibraryFilterMangasStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasStartedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterMangasStartedTypeDesc() { + thenByLibraryFilterMangasStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasStartedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterMangasUnreadType() { + thenByLibraryFilterMangasUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasUnreadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterMangasUnreadTypeDesc() { + thenByLibraryFilterMangasUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterMangasUnreadType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterNovelBookMarkedType() { + thenByLibraryFilterNovelBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterNovelBookMarkedTypeDesc() { + thenByLibraryFilterNovelBookMarkedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterNovelDownloadType() { + thenByLibraryFilterNovelDownloadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterNovelDownloadTypeDesc() { + thenByLibraryFilterNovelDownloadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterNovelStartedType() { + thenByLibraryFilterNovelStartedType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterNovelStartedTypeDesc() { + thenByLibraryFilterNovelStartedTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); }); } QueryBuilder - thenByLibraryFilterNovelUnreadType() { + thenByLibraryFilterNovelUnreadType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); }); } QueryBuilder - thenByLibraryFilterNovelUnreadTypeDesc() { + thenByLibraryFilterNovelUnreadTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); }); @@ -13263,35 +13443,35 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByLibraryLocalSourceDesc() { + thenByLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.desc); }); } QueryBuilder - thenByLibraryShowCategoryTabs() { + thenByLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - thenByLibraryShowCategoryTabsDesc() { + thenByLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - thenByLibraryShowContinueReadingButton() { + thenByLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowContinueReadingButton', Sort.asc); }); } QueryBuilder - thenByLibraryShowContinueReadingButtonDesc() { + thenByLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowContinueReadingButton', Sort.desc); }); @@ -13304,21 +13484,21 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByLibraryShowLanguageDesc() { + thenByLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowLanguage', Sort.desc); }); } QueryBuilder - thenByLibraryShowNumbersOfItems() { + thenByLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - thenByLibraryShowNumbersOfItemsDesc() { + thenByLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryShowNumbersOfItems', Sort.desc); }); @@ -13343,7 +13523,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByMangaHomeDisplayTypeDesc() { + thenByMangaHomeDisplayTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mangaHomeDisplayType', Sort.desc); }); @@ -13356,7 +13536,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByMarkEpisodeAsSeenTypeDesc() { + thenByMarkEpisodeAsSeenTypeDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'markEpisodeAsSeenType', Sort.desc); }); @@ -13369,7 +13549,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByMergeLibraryNavMobileDesc() { + thenByMergeLibraryNavMobileDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mergeLibraryNavMobile', Sort.desc); }); @@ -13412,86 +13592,90 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByNovelLibraryDownloadedChapters() { + thenByNovelLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); }); } QueryBuilder - thenByNovelLibraryDownloadedChaptersDesc() { + thenByNovelLibraryDownloadedChaptersDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); }); } QueryBuilder - thenByNovelLibraryLocalSource() { + thenByNovelLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); }); } QueryBuilder - thenByNovelLibraryLocalSourceDesc() { + thenByNovelLibraryLocalSourceDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); }); } QueryBuilder - thenByNovelLibraryShowCategoryTabs() { + thenByNovelLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); }); } QueryBuilder - thenByNovelLibraryShowCategoryTabsDesc() { + thenByNovelLibraryShowCategoryTabsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); }); } QueryBuilder - thenByNovelLibraryShowContinueReadingButton() { + thenByNovelLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'novelLibraryShowContinueReadingButton', Sort.asc); + r'novelLibraryShowContinueReadingButton', + Sort.asc, + ); }); } QueryBuilder - thenByNovelLibraryShowContinueReadingButtonDesc() { + thenByNovelLibraryShowContinueReadingButtonDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy( - r'novelLibraryShowContinueReadingButton', Sort.desc); + r'novelLibraryShowContinueReadingButton', + Sort.desc, + ); }); } QueryBuilder - thenByNovelLibraryShowLanguage() { + thenByNovelLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); }); } QueryBuilder - thenByNovelLibraryShowLanguageDesc() { + thenByNovelLibraryShowLanguageDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); }); } QueryBuilder - thenByNovelLibraryShowNumbersOfItems() { + thenByNovelLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); }); } QueryBuilder - thenByNovelLibraryShowNumbersOfItemsDesc() { + thenByNovelLibraryShowNumbersOfItemsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); }); @@ -13510,14 +13694,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByOnlyIncludePinnedSources() { + thenByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'onlyIncludePinnedSources', Sort.asc); }); } QueryBuilder - thenByOnlyIncludePinnedSourcesDesc() { + thenByOnlyIncludePinnedSourcesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'onlyIncludePinnedSources', Sort.desc); }); @@ -13554,7 +13738,7 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByRelativeTimesTampsDesc() { + thenByRelativeTimesTampsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'relativeTimesTamps', Sort.desc); }); @@ -13573,14 +13757,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByRpcShowReadingWatchingProgress() { + thenByRpcShowReadingWatchingProgress() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'rpcShowReadingWatchingProgress', Sort.asc); }); } QueryBuilder - thenByRpcShowReadingWatchingProgressDesc() { + thenByRpcShowReadingWatchingProgressDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'rpcShowReadingWatchingProgress', Sort.desc); }); @@ -13659,14 +13843,14 @@ extension SettingsQuerySortThenBy } QueryBuilder - thenByUpdateProgressAfterReading() { + thenByUpdateProgressAfterReading() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updateProgressAfterReading', Sort.asc); }); } QueryBuilder - thenByUpdateProgressAfterReadingDesc() { + thenByUpdateProgressAfterReadingDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'updateProgressAfterReading', Sort.desc); }); @@ -13759,11 +13943,14 @@ extension SettingsQuerySortThenBy extension SettingsQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByAndroidProxyServer( - {bool caseSensitive = true}) { + QueryBuilder distinctByAndroidProxyServer({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'androidProxyServer', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'androidProxyServer', + caseSensitive: caseSensitive, + ); }); } @@ -13774,7 +13961,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByAnimatePageTransitions() { + distinctByAnimatePageTransitions() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animatePageTransitions'); }); @@ -13793,52 +13980,55 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByAnimeLibraryDownloadedChapters() { + distinctByAnimeLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryDownloadedChapters'); }); } QueryBuilder - distinctByAnimeLibraryLocalSource() { + distinctByAnimeLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryLocalSource'); }); } QueryBuilder - distinctByAnimeLibraryShowCategoryTabs() { + distinctByAnimeLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryShowCategoryTabs'); }); } QueryBuilder - distinctByAnimeLibraryShowContinueReadingButton() { + distinctByAnimeLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryShowContinueReadingButton'); }); } QueryBuilder - distinctByAnimeLibraryShowLanguage() { + distinctByAnimeLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryShowLanguage'); }); } QueryBuilder - distinctByAnimeLibraryShowNumbersOfItems() { + distinctByAnimeLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'animeLibraryShowNumbersOfItems'); }); } - QueryBuilder distinctByAppFontFamily( - {bool caseSensitive = true}) { + QueryBuilder distinctByAppFontFamily({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'appFontFamily', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'appFontFamily', + caseSensitive: caseSensitive, + ); }); } @@ -13848,24 +14038,29 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByAudioPreferredLanguages( - {bool caseSensitive = true}) { + QueryBuilder + distinctByAudioPreferredLanguages({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'audioPreferredLanguages', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'audioPreferredLanguages', + caseSensitive: caseSensitive, + ); }); } - QueryBuilder distinctByAutoBackupLocation( - {bool caseSensitive = true}) { + QueryBuilder distinctByAutoBackupLocation({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'autoBackupLocation', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'autoBackupLocation', + caseSensitive: caseSensitive, + ); }); } QueryBuilder - distinctByAutoExtensionsUpdates() { + distinctByAutoExtensionsUpdates() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'autoExtensionsUpdates'); }); @@ -13889,11 +14084,14 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByBtServerAddress( - {bool caseSensitive = true}) { + QueryBuilder distinctByBtServerAddress({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'btServerAddress', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'btServerAddress', + caseSensitive: caseSensitive, + ); }); } @@ -13910,14 +14108,14 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByCheckForExtensionUpdates() { + distinctByCheckForExtensionUpdates() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'checkForExtensionUpdates'); }); } QueryBuilder - distinctByClearChapterCacheOnAppLaunch() { + distinctByClearChapterCacheOnAppLaunch() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'clearChapterCacheOnAppLaunch'); }); @@ -13941,15 +14139,17 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByCustomDns( - {bool caseSensitive = true}) { + QueryBuilder distinctByCustomDns({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'customDns', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDateFormat( - {bool caseSensitive = true}) { + QueryBuilder distinctByDateFormat({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'dateFormat', caseSensitive: caseSensitive); }); @@ -13962,7 +14162,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByDefaultDoubleTapToSkipLength() { + distinctByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'defaultDoubleTapToSkipLength'); }); @@ -13981,7 +14181,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByDefaultSkipIntroLength() { + distinctByDefaultSkipIntroLength() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'defaultSkipIntroLength'); }); @@ -14000,17 +14200,20 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByDoubleTapAnimationSpeed() { + distinctByDoubleTapAnimationSpeed() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'doubleTapAnimationSpeed'); }); } - QueryBuilder distinctByDownloadLocation( - {bool caseSensitive = true}) { + QueryBuilder distinctByDownloadLocation({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'downloadLocation', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'downloadLocation', + caseSensitive: caseSensitive, + ); }); } @@ -14033,7 +14236,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByEnableAudioPitchCorrection() { + distinctByEnableAudioPitchCorrection() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAudioPitchCorrection'); }); @@ -14046,7 +14249,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByEnableCustomColorFilter() { + distinctByEnableCustomColorFilter() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableCustomColorFilter'); }); @@ -14065,7 +14268,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByFlexColorSchemeBlendLevel() { + distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'flexColorSchemeBlendLevel'); }); @@ -14096,7 +14299,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByHideDiscordRpcInIncognito() { + distinctByHideDiscordRpcInIncognito() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'hideDiscordRpcInIncognito'); }); @@ -14108,8 +14311,9 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByHwdecMode( - {bool caseSensitive = true}) { + QueryBuilder distinctByHwdecMode({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'hwdecMode', caseSensitive: caseSensitive); }); @@ -14122,99 +14326,101 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByLastTrackerLibraryLocation({bool caseSensitive = true}) { + distinctByLastTrackerLibraryLocation({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'lastTrackerLibraryLocation', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'lastTrackerLibraryLocation', + caseSensitive: caseSensitive, + ); }); } QueryBuilder - distinctByLibraryDownloadedChapters() { + distinctByLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryDownloadedChapters'); }); } QueryBuilder - distinctByLibraryFilterAnimeBookMarkedType() { + distinctByLibraryFilterAnimeBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterAnimeBookMarkedType'); }); } QueryBuilder - distinctByLibraryFilterAnimeDownloadType() { + distinctByLibraryFilterAnimeDownloadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterAnimeDownloadType'); }); } QueryBuilder - distinctByLibraryFilterAnimeStartedType() { + distinctByLibraryFilterAnimeStartedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterAnimeStartedType'); }); } QueryBuilder - distinctByLibraryFilterAnimeUnreadType() { + distinctByLibraryFilterAnimeUnreadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterAnimeUnreadType'); }); } QueryBuilder - distinctByLibraryFilterMangasBookMarkedType() { + distinctByLibraryFilterMangasBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterMangasBookMarkedType'); }); } QueryBuilder - distinctByLibraryFilterMangasDownloadType() { + distinctByLibraryFilterMangasDownloadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterMangasDownloadType'); }); } QueryBuilder - distinctByLibraryFilterMangasStartedType() { + distinctByLibraryFilterMangasStartedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterMangasStartedType'); }); } QueryBuilder - distinctByLibraryFilterMangasUnreadType() { + distinctByLibraryFilterMangasUnreadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterMangasUnreadType'); }); } QueryBuilder - distinctByLibraryFilterNovelBookMarkedType() { + distinctByLibraryFilterNovelBookMarkedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterNovelBookMarkedType'); }); } QueryBuilder - distinctByLibraryFilterNovelDownloadType() { + distinctByLibraryFilterNovelDownloadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterNovelDownloadType'); }); } QueryBuilder - distinctByLibraryFilterNovelStartedType() { + distinctByLibraryFilterNovelStartedType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterNovelStartedType'); }); } QueryBuilder - distinctByLibraryFilterNovelUnreadType() { + distinctByLibraryFilterNovelUnreadType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryFilterNovelUnreadType'); }); @@ -14227,14 +14433,14 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByLibraryShowCategoryTabs() { + distinctByLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryShowCategoryTabs'); }); } QueryBuilder - distinctByLibraryShowContinueReadingButton() { + distinctByLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryShowContinueReadingButton'); }); @@ -14247,7 +14453,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByLibraryShowNumbersOfItems() { + distinctByLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryShowNumbersOfItems'); }); @@ -14266,14 +14472,14 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByMarkEpisodeAsSeenType() { + distinctByMarkEpisodeAsSeenType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'markEpisodeAsSeenType'); }); } QueryBuilder - distinctByMergeLibraryNavMobile() { + distinctByMergeLibraryNavMobile() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'mergeLibraryNavMobile'); }); @@ -14304,42 +14510,42 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByNovelLibraryDownloadedChapters() { + distinctByNovelLibraryDownloadedChapters() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryDownloadedChapters'); }); } QueryBuilder - distinctByNovelLibraryLocalSource() { + distinctByNovelLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryLocalSource'); }); } QueryBuilder - distinctByNovelLibraryShowCategoryTabs() { + distinctByNovelLibraryShowCategoryTabs() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryShowCategoryTabs'); }); } QueryBuilder - distinctByNovelLibraryShowContinueReadingButton() { + distinctByNovelLibraryShowContinueReadingButton() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryShowContinueReadingButton'); }); } QueryBuilder - distinctByNovelLibraryShowLanguage() { + distinctByNovelLibraryShowLanguage() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryShowLanguage'); }); } QueryBuilder - distinctByNovelLibraryShowNumbersOfItems() { + distinctByNovelLibraryShowNumbersOfItems() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelLibraryShowNumbersOfItems'); }); @@ -14352,7 +14558,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByOnlyIncludePinnedSources() { + distinctByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'onlyIncludePinnedSources'); }); @@ -14383,7 +14589,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByRpcShowReadingWatchingProgress() { + distinctByRpcShowReadingWatchingProgress() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'rpcShowReadingWatchingProgress'); }); @@ -14426,7 +14632,7 @@ extension SettingsQueryWhereDistinct } QueryBuilder - distinctByUpdateProgressAfterReading() { + distinctByUpdateProgressAfterReading() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'updateProgressAfterReading'); }); @@ -14462,8 +14668,9 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByUserAgent( - {bool caseSensitive = true}) { + QueryBuilder distinctByUserAgent({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'userAgent', caseSensitive: caseSensitive); }); @@ -14485,42 +14692,42 @@ extension SettingsQueryProperty } QueryBuilder - algorithmWeightsProperty() { + algorithmWeightsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'algorithmWeights'); }); } QueryBuilder - androidProxyServerProperty() { + androidProxyServerProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'androidProxyServer'); }); } QueryBuilder - aniSkipTimeoutLengthProperty() { + aniSkipTimeoutLengthProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'aniSkipTimeoutLength'); }); } QueryBuilder - animatePageTransitionsProperty() { + animatePageTransitionsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animatePageTransitions'); }); } QueryBuilder - animeDisplayTypeProperty() { + animeDisplayTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeDisplayType'); }); } QueryBuilder?, QQueryOperations> - animeExtensionsRepoProperty() { + animeExtensionsRepoProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeExtensionsRepo'); }); @@ -14533,42 +14740,42 @@ extension SettingsQueryProperty } QueryBuilder - animeLibraryDownloadedChaptersProperty() { + animeLibraryDownloadedChaptersProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryDownloadedChapters'); }); } QueryBuilder - animeLibraryLocalSourceProperty() { + animeLibraryLocalSourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryLocalSource'); }); } QueryBuilder - animeLibraryShowCategoryTabsProperty() { + animeLibraryShowCategoryTabsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryShowCategoryTabs'); }); } QueryBuilder - animeLibraryShowContinueReadingButtonProperty() { + animeLibraryShowContinueReadingButtonProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryShowContinueReadingButton'); }); } QueryBuilder - animeLibraryShowLanguageProperty() { + animeLibraryShowLanguageProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryShowLanguage'); }); } QueryBuilder - animeLibraryShowNumbersOfItemsProperty() { + animeLibraryShowNumbersOfItemsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'animeLibraryShowNumbersOfItems'); }); @@ -14581,42 +14788,42 @@ extension SettingsQueryProperty } QueryBuilder - audioChannelsProperty() { + audioChannelsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'audioChannels'); }); } QueryBuilder - audioPreferredLanguagesProperty() { + audioPreferredLanguagesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'audioPreferredLanguages'); }); } QueryBuilder - autoBackupLocationProperty() { + autoBackupLocationProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'autoBackupLocation'); }); } QueryBuilder - autoExtensionsUpdatesProperty() { + autoExtensionsUpdatesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'autoExtensionsUpdates'); }); } QueryBuilder?, QQueryOperations> - autoScrollPagesProperty() { + autoScrollPagesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'autoScrollPages'); }); } QueryBuilder - backgroundColorProperty() { + backgroundColorProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'backgroundColor'); }); @@ -14629,7 +14836,7 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - backupListOptionsProperty() { + backupListOptionsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'backupListOptions'); }); @@ -14648,35 +14855,35 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - chapterFilterBookmarkedListProperty() { + chapterFilterBookmarkedListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'chapterFilterBookmarkedList'); }); } QueryBuilder?, QQueryOperations> - chapterFilterDownloadedListProperty() { + chapterFilterDownloadedListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'chapterFilterDownloadedList'); }); } QueryBuilder?, QQueryOperations> - chapterFilterUnreadListProperty() { + chapterFilterUnreadListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'chapterFilterUnreadList'); }); } QueryBuilder?, QQueryOperations> - chapterPageIndexListProperty() { + chapterPageIndexListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'chapterPageIndexList'); }); } QueryBuilder?, QQueryOperations> - chapterPageUrlsListProperty() { + chapterPageUrlsListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'chapterPageUrlsList'); }); @@ -14689,21 +14896,21 @@ extension SettingsQueryProperty } QueryBuilder - checkForExtensionUpdatesProperty() { + checkForExtensionUpdatesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'checkForExtensionUpdates'); }); } QueryBuilder - clearChapterCacheOnAppLaunchProperty() { + clearChapterCacheOnAppLaunchProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'clearChapterCacheOnAppLaunch'); }); } QueryBuilder - colorFilterBlendModeProperty() { + colorFilterBlendModeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'colorFilterBlendMode'); }); @@ -14716,7 +14923,7 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - cookiesListProperty() { + cookiesListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'cookiesList'); }); @@ -14729,7 +14936,7 @@ extension SettingsQueryProperty } QueryBuilder - customColorFilterProperty() { + customColorFilterProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'customColorFilter'); }); @@ -14748,49 +14955,49 @@ extension SettingsQueryProperty } QueryBuilder - debandingTypeProperty() { + debandingTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'debandingType'); }); } QueryBuilder - defaultDoubleTapToSkipLengthProperty() { + defaultDoubleTapToSkipLengthProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'defaultDoubleTapToSkipLength'); }); } QueryBuilder - defaultPlayBackSpeedProperty() { + defaultPlayBackSpeedProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'defaultPlayBackSpeed'); }); } QueryBuilder - defaultReaderModeProperty() { + defaultReaderModeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'defaultReaderMode'); }); } QueryBuilder - defaultSkipIntroLengthProperty() { + defaultSkipIntroLengthProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'defaultSkipIntroLength'); }); } QueryBuilder - defaultSubtitleLangProperty() { + defaultSubtitleLangProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'defaultSubtitleLang'); }); } QueryBuilder - disableSectionTypeProperty() { + disableSectionTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'disableSectionType'); }); @@ -14803,7 +15010,7 @@ extension SettingsQueryProperty } QueryBuilder - doubleTapAnimationSpeedProperty() { + doubleTapAnimationSpeedProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'doubleTapAnimationSpeed'); }); @@ -14834,7 +15041,7 @@ extension SettingsQueryProperty } QueryBuilder - enableAudioPitchCorrectionProperty() { + enableAudioPitchCorrectionProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAudioPitchCorrection'); }); @@ -14847,7 +15054,7 @@ extension SettingsQueryProperty } QueryBuilder - enableCustomColorFilterProperty() { + enableCustomColorFilterProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableCustomColorFilter'); }); @@ -14866,21 +15073,21 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - filterScanlatorListProperty() { + filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'filterScanlatorList'); }); } QueryBuilder - flexColorSchemeBlendLevelProperty() { + flexColorSchemeBlendLevelProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'flexColorSchemeBlendLevel'); }); } QueryBuilder - flexSchemeColorIndexProperty() { + flexSchemeColorIndexProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'flexSchemeColorIndex'); }); @@ -14905,7 +15112,7 @@ extension SettingsQueryProperty } QueryBuilder - hideDiscordRpcInIncognitoProperty() { + hideDiscordRpcInIncognitoProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'hideDiscordRpcInIncognito'); }); @@ -14930,98 +15137,98 @@ extension SettingsQueryProperty } QueryBuilder - lastTrackerLibraryLocationProperty() { + lastTrackerLibraryLocationProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lastTrackerLibraryLocation'); }); } QueryBuilder - libraryDownloadedChaptersProperty() { + libraryDownloadedChaptersProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryDownloadedChapters'); }); } QueryBuilder - libraryFilterAnimeBookMarkedTypeProperty() { + libraryFilterAnimeBookMarkedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterAnimeBookMarkedType'); }); } QueryBuilder - libraryFilterAnimeDownloadTypeProperty() { + libraryFilterAnimeDownloadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterAnimeDownloadType'); }); } QueryBuilder - libraryFilterAnimeStartedTypeProperty() { + libraryFilterAnimeStartedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterAnimeStartedType'); }); } QueryBuilder - libraryFilterAnimeUnreadTypeProperty() { + libraryFilterAnimeUnreadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterAnimeUnreadType'); }); } QueryBuilder - libraryFilterMangasBookMarkedTypeProperty() { + libraryFilterMangasBookMarkedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterMangasBookMarkedType'); }); } QueryBuilder - libraryFilterMangasDownloadTypeProperty() { + libraryFilterMangasDownloadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterMangasDownloadType'); }); } QueryBuilder - libraryFilterMangasStartedTypeProperty() { + libraryFilterMangasStartedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterMangasStartedType'); }); } QueryBuilder - libraryFilterMangasUnreadTypeProperty() { + libraryFilterMangasUnreadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterMangasUnreadType'); }); } QueryBuilder - libraryFilterNovelBookMarkedTypeProperty() { + libraryFilterNovelBookMarkedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterNovelBookMarkedType'); }); } QueryBuilder - libraryFilterNovelDownloadTypeProperty() { + libraryFilterNovelDownloadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterNovelDownloadType'); }); } QueryBuilder - libraryFilterNovelStartedTypeProperty() { + libraryFilterNovelStartedTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterNovelStartedType'); }); } QueryBuilder - libraryFilterNovelUnreadTypeProperty() { + libraryFilterNovelUnreadTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryFilterNovelUnreadType'); }); @@ -15034,28 +15241,28 @@ extension SettingsQueryProperty } QueryBuilder - libraryShowCategoryTabsProperty() { + libraryShowCategoryTabsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryShowCategoryTabs'); }); } QueryBuilder - libraryShowContinueReadingButtonProperty() { + libraryShowContinueReadingButtonProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryShowContinueReadingButton'); }); } QueryBuilder - libraryShowLanguageProperty() { + libraryShowLanguageProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryShowLanguage'); }); } QueryBuilder - libraryShowNumbersOfItemsProperty() { + libraryShowNumbersOfItemsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryShowNumbersOfItems'); }); @@ -15068,7 +15275,7 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - mangaExtensionsRepoProperty() { + mangaExtensionsRepoProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'mangaExtensionsRepo'); }); @@ -15081,42 +15288,42 @@ extension SettingsQueryProperty } QueryBuilder - mangaHomeDisplayTypeProperty() { + mangaHomeDisplayTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'mangaHomeDisplayType'); }); } QueryBuilder - markEpisodeAsSeenTypeProperty() { + markEpisodeAsSeenTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'markEpisodeAsSeenType'); }); } QueryBuilder - mergeLibraryNavMobileProperty() { + mergeLibraryNavMobileProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'mergeLibraryNavMobile'); }); } QueryBuilder?, QQueryOperations> - navigationOrderProperty() { + navigationOrderProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'navigationOrder'); }); } QueryBuilder - novelDisplayTypeProperty() { + novelDisplayTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelDisplayType'); }); } QueryBuilder?, QQueryOperations> - novelExtensionsRepoProperty() { + novelExtensionsRepoProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelExtensionsRepo'); }); @@ -15135,56 +15342,56 @@ extension SettingsQueryProperty } QueryBuilder - novelLibraryDownloadedChaptersProperty() { + novelLibraryDownloadedChaptersProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryDownloadedChapters'); }); } QueryBuilder - novelLibraryLocalSourceProperty() { + novelLibraryLocalSourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryLocalSource'); }); } QueryBuilder - novelLibraryShowCategoryTabsProperty() { + novelLibraryShowCategoryTabsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryShowCategoryTabs'); }); } QueryBuilder - novelLibraryShowContinueReadingButtonProperty() { + novelLibraryShowContinueReadingButtonProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryShowContinueReadingButton'); }); } QueryBuilder - novelLibraryShowLanguageProperty() { + novelLibraryShowLanguageProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryShowLanguage'); }); } QueryBuilder - novelLibraryShowNumbersOfItemsProperty() { + novelLibraryShowNumbersOfItemsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelLibraryShowNumbersOfItems'); }); } QueryBuilder - novelTextAlignProperty() { + novelTextAlignProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelTextAlign'); }); } QueryBuilder - onlyIncludePinnedSourcesProperty() { + onlyIncludePinnedSourcesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'onlyIncludePinnedSources'); }); @@ -15197,21 +15404,21 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - personalPageModeListProperty() { + personalPageModeListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'personalPageModeList'); }); } QueryBuilder?, QQueryOperations> - personalReaderModeListProperty() { + personalReaderModeListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'personalReaderModeList'); }); } QueryBuilder - playerSubtitleSettingsProperty() { + playerSubtitleSettingsProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'playerSubtitleSettings'); }); @@ -15236,7 +15443,7 @@ extension SettingsQueryProperty } QueryBuilder - rpcShowReadingWatchingProgressProperty() { + rpcShowReadingWatchingProgressProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'rpcShowReadingWatchingProgress'); }); @@ -15267,28 +15474,28 @@ extension SettingsQueryProperty } QueryBuilder?, QQueryOperations> - sortChapterListProperty() { + sortChapterListProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sortChapterList'); }); } QueryBuilder - sortLibraryAnimeProperty() { + sortLibraryAnimeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sortLibraryAnime'); }); } QueryBuilder - sortLibraryMangaProperty() { + sortLibraryMangaProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sortLibraryManga'); }); } QueryBuilder - sortLibraryNovelProperty() { + sortLibraryNovelProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sortLibraryNovel'); }); @@ -15307,7 +15514,7 @@ extension SettingsQueryProperty } QueryBuilder - updateProgressAfterReadingProperty() { + updateProgressAfterReadingProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'updateProgressAfterReading'); }); @@ -15367,17 +15574,10 @@ const MCookieSchema = Schema( name: r'MCookie', id: -1854909335245943751, properties: { - r'cookie': PropertySchema( - id: 0, - name: r'cookie', - type: IsarType.string, - ), - r'host': PropertySchema( - id: 1, - name: r'host', - type: IsarType.string, - ) + r'cookie': PropertySchema(id: 0, name: r'cookie', type: IsarType.string), + r'host': PropertySchema(id: 1, name: r'host', type: IsarType.string), }, + estimateSize: _mCookieEstimateSize, serialize: _mCookieSerialize, deserialize: _mCookieDeserialize, @@ -15448,17 +15648,17 @@ extension MCookieQueryFilter on QueryBuilder { QueryBuilder cookieIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'cookie', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'cookie'), + ); }); } QueryBuilder cookieIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'cookie', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'cookie'), + ); }); } @@ -15467,11 +15667,13 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15481,12 +15683,14 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15496,12 +15700,14 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15513,14 +15719,16 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'cookie', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'cookie', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15529,11 +15737,13 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15542,69 +15752,75 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder cookieContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'cookie', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'cookie', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder cookieMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'cookie', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'cookie', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder cookieIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'cookie', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'cookie', value: ''), + ); }); } QueryBuilder cookieIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'cookie', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'cookie', value: ''), + ); }); } QueryBuilder hostIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'host', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'host'), + ); }); } QueryBuilder hostIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'host', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'host'), + ); }); } @@ -15613,11 +15829,13 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15627,12 +15845,14 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15642,12 +15862,14 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15659,14 +15881,16 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'host', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'host', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15675,11 +15899,13 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -15688,53 +15914,59 @@ extension MCookieQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hostContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'host', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'host', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hostMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'host', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'host', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder hostIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'host', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'host', value: ''), + ); }); } QueryBuilder hostIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'host', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'host', value: ''), + ); }); } } @@ -15749,17 +15981,10 @@ const SortLibraryMangaSchema = Schema( name: r'SortLibraryManga', id: -8485569296691672246, properties: { - r'index': PropertySchema( - id: 0, - name: r'index', - type: IsarType.long, - ), - r'reverse': PropertySchema( - id: 1, - name: r'reverse', - type: IsarType.bool, - ) + r'index': PropertySchema(id: 0, name: r'index', type: IsarType.long), + r'reverse': PropertySchema(id: 1, name: r'reverse', type: IsarType.bool), }, + estimateSize: _sortLibraryMangaEstimateSize, serialize: _sortLibraryMangaSerialize, deserialize: _sortLibraryMangaDeserialize, @@ -15817,104 +16042,102 @@ P _sortLibraryMangaDeserializeProp

    ( extension SortLibraryMangaQueryFilter on QueryBuilder { QueryBuilder - indexIsNull() { + indexIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'index'), + ); }); } QueryBuilder - indexIsNotNull() { + indexIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'index'), + ); }); } QueryBuilder - indexEqualTo(int? value) { + indexEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'index', value: value), + ); }); } QueryBuilder - indexGreaterThan( - int? value, { - bool include = false, - }) { + indexGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'index', + value: value, + ), + ); }); } QueryBuilder - indexLessThan( - int? value, { - bool include = false, - }) { + indexLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'index', + value: value, + ), + ); }); } QueryBuilder - indexBetween( + indexBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'index', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'index', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - reverseIsNull() { + reverseIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'reverse', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'reverse'), + ); }); } QueryBuilder - reverseIsNotNull() { + reverseIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'reverse', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'reverse'), + ); }); } QueryBuilder - reverseEqualTo(bool? value) { + reverseEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'reverse', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'reverse', value: value), + ); }); } } @@ -15929,22 +16152,11 @@ const SortChapterSchema = Schema( name: r'SortChapter', id: -468129901904543096, properties: { - r'index': PropertySchema( - id: 0, - name: r'index', - type: IsarType.long, - ), - r'mangaId': PropertySchema( - id: 1, - name: r'mangaId', - type: IsarType.long, - ), - r'reverse': PropertySchema( - id: 2, - name: r'reverse', - type: IsarType.bool, - ) + r'index': PropertySchema(id: 0, name: r'index', type: IsarType.long), + r'mangaId': PropertySchema(id: 1, name: r'mangaId', type: IsarType.long), + r'reverse': PropertySchema(id: 2, name: r'reverse', type: IsarType.bool), }, + estimateSize: _sortChapterEstimateSize, serialize: _sortChapterSerialize, deserialize: _sortChapterDeserialize, @@ -16007,42 +16219,41 @@ extension SortChapterQueryFilter on QueryBuilder { QueryBuilder indexIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'index'), + ); }); } QueryBuilder - indexIsNotNull() { + indexIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'index'), + ); }); } QueryBuilder indexEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'index', value: value), + ); }); } QueryBuilder - indexGreaterThan( - int? value, { - bool include = false, - }) { + indexGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'index', + value: value, + ), + ); }); } @@ -16051,11 +16262,13 @@ extension SortChapterQueryFilter bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'index', + value: value, + ), + ); }); } @@ -16066,55 +16279,56 @@ extension SortChapterQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'index', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'index', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } @@ -16123,11 +16337,13 @@ extension SortChapterQueryFilter 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, + ), + ); }); } @@ -16138,41 +16354,43 @@ extension SortChapterQueryFilter 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 - reverseIsNull() { + reverseIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'reverse', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'reverse'), + ); }); } QueryBuilder - reverseIsNotNull() { + reverseIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'reverse', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'reverse'), + ); }); } QueryBuilder reverseEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'reverse', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'reverse', value: value), + ); }); } } @@ -16187,17 +16405,10 @@ const ChapterFilterDownloadedSchema = Schema( name: r'ChapterFilterDownloaded', id: -5772236935601996927, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), - r'type': PropertySchema( - id: 1, - name: r'type', - type: IsarType.long, - ) + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), + r'type': PropertySchema(id: 1, name: r'type', type: IsarType.long), }, + estimateSize: _chapterFilterDownloadedEstimateSize, serialize: _chapterFilterDownloadedSerialize, deserialize: _chapterFilterDownloadedDeserialize, @@ -16252,159 +16463,215 @@ P _chapterFilterDownloadedDeserializeProp

    ( } } -extension ChapterFilterDownloadedQueryFilter on QueryBuilder< - ChapterFilterDownloaded, ChapterFilterDownloaded, QFilterCondition> { - QueryBuilder mangaIdIsNull() { +extension ChapterFilterDownloadedQueryFilter + on + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QFilterCondition + > { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + 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 mangaIdIsNotNull() { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + 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 mangaIdEqualTo(int? value) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + mangaIdEqualTo(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), + ); }); } - QueryBuilder mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + mangaIdGreaterThan(int? value, {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, + ), + ); }); } - QueryBuilder mangaIdLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + mangaIdLessThan(int? value, {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, + ), + ); }); } - QueryBuilder mangaIdBetween( + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 typeIsNull() { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'type'), + ); }); } - QueryBuilder typeIsNotNull() { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'type'), + ); }); } - QueryBuilder typeEqualTo(int? value) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'type', value: value), + ); }); } - QueryBuilder typeGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + ), + ); }); } - QueryBuilder typeLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + ), + ); }); } - QueryBuilder typeBetween( + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QAfterFilterCondition + > + typeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'type', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } -extension ChapterFilterDownloadedQueryObject on QueryBuilder< - ChapterFilterDownloaded, ChapterFilterDownloaded, QFilterCondition> {} +extension ChapterFilterDownloadedQueryObject + on + QueryBuilder< + ChapterFilterDownloaded, + ChapterFilterDownloaded, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -16413,17 +16680,10 @@ const ChapterFilterUnreadSchema = Schema( name: r'ChapterFilterUnread', id: 2999193805790237469, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), - r'type': PropertySchema( - id: 1, - name: r'type', - type: IsarType.long, - ) + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), + r'type': PropertySchema(id: 1, name: r'type', type: IsarType.long), }, + estimateSize: _chapterFilterUnreadEstimateSize, serialize: _chapterFilterUnreadSerialize, deserialize: _chapterFilterUnreadDeserialize, @@ -16478,159 +16738,167 @@ P _chapterFilterUnreadDeserializeProp

    ( } } -extension ChapterFilterUnreadQueryFilter on QueryBuilder { +extension ChapterFilterUnreadQueryFilter + on + QueryBuilder< + ChapterFilterUnread, + ChapterFilterUnread, + QFilterCondition + > { QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 - mangaIdEqualTo(int? value) { + mangaIdEqualTo(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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { + mangaIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdBetween( + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - typeIsNull() { + typeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'type'), + ); }); } QueryBuilder - typeIsNotNull() { + typeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'type'), + ); }); } QueryBuilder - typeEqualTo(int? value) { + typeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'type', value: value), + ); }); } QueryBuilder - typeGreaterThan( - int? value, { - bool include = false, - }) { + typeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + ), + ); }); } QueryBuilder - typeLessThan( - int? value, { - bool include = false, - }) { + typeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + ), + ); }); } QueryBuilder - typeBetween( + typeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'type', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } -extension ChapterFilterUnreadQueryObject on QueryBuilder {} +extension ChapterFilterUnreadQueryObject + on + QueryBuilder< + ChapterFilterUnread, + ChapterFilterUnread, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -16639,17 +16907,10 @@ const ChapterFilterBookmarkedSchema = Schema( name: r'ChapterFilterBookmarked', id: -4183165879060895626, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), - r'type': PropertySchema( - id: 1, - name: r'type', - type: IsarType.long, - ) + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), + r'type': PropertySchema(id: 1, name: r'type', type: IsarType.long), }, + estimateSize: _chapterFilterBookmarkedEstimateSize, serialize: _chapterFilterBookmarkedSerialize, deserialize: _chapterFilterBookmarkedDeserialize, @@ -16704,159 +16965,215 @@ P _chapterFilterBookmarkedDeserializeProp

    ( } } -extension ChapterFilterBookmarkedQueryFilter on QueryBuilder< - ChapterFilterBookmarked, ChapterFilterBookmarked, QFilterCondition> { - QueryBuilder mangaIdIsNull() { +extension ChapterFilterBookmarkedQueryFilter + on + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QFilterCondition + > { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + 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 mangaIdIsNotNull() { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + 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 mangaIdEqualTo(int? value) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + mangaIdEqualTo(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), + ); }); } - QueryBuilder mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + mangaIdGreaterThan(int? value, {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, + ), + ); }); } - QueryBuilder mangaIdLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + mangaIdLessThan(int? value, {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, + ), + ); }); } - QueryBuilder mangaIdBetween( + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 typeIsNull() { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'type'), + ); }); } - QueryBuilder typeIsNotNull() { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'type', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'type'), + ); }); } - QueryBuilder typeEqualTo(int? value) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'type', value: value), + ); }); } - QueryBuilder typeGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + ), + ); }); } - QueryBuilder typeLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'type', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + ), + ); }); } - QueryBuilder typeBetween( + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QAfterFilterCondition + > + typeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'type', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } -extension ChapterFilterBookmarkedQueryObject on QueryBuilder< - ChapterFilterBookmarked, ChapterFilterBookmarked, QFilterCondition> {} +extension ChapterFilterBookmarkedQueryObject + on + QueryBuilder< + ChapterFilterBookmarked, + ChapterFilterBookmarked, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -16880,12 +17197,9 @@ const ChapterPageurlsSchema = Schema( name: r'headers', type: IsarType.stringList, ), - r'urls': PropertySchema( - id: 3, - name: r'urls', - type: IsarType.stringList, - ) + r'urls': PropertySchema(id: 3, name: r'urls', type: IsarType.stringList), }, + estimateSize: _chapterPageurlsEstimateSize, serialize: _chapterPageurlsSerialize, deserialize: _chapterPageurlsDeserialize, @@ -16981,145 +17295,147 @@ P _chapterPageurlsDeserializeProp

    ( extension ChapterPageurlsQueryFilter on QueryBuilder { QueryBuilder - chapterIdIsNull() { + 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 - chapterIdIsNotNull() { + 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 - chapterIdEqualTo(int? value) { + chapterIdEqualTo(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), + ); }); } QueryBuilder - chapterIdGreaterThan( - int? value, { - bool include = false, - }) { + chapterIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - chapterIdLessThan( - int? value, { - bool include = false, - }) { + chapterIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - chapterIdBetween( + chapterIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - chapterUrlIsNull() { + chapterUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'chapterUrl'), + ); }); } QueryBuilder - chapterUrlIsNotNull() { + chapterUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'chapterUrl'), + ); }); } QueryBuilder - chapterUrlEqualTo( - String? value, { - bool caseSensitive = true, - }) { + chapterUrlEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlGreaterThan( + chapterUrlGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlLessThan( + chapterUrlLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlBetween( + chapterUrlBetween( String? lower, String? upper, { bool includeLower = true, @@ -17127,153 +17443,158 @@ extension ChapterPageurlsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'chapterUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'chapterUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlStartsWith( - String value, { - bool caseSensitive = true, - }) { + chapterUrlStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlEndsWith( - String value, { - bool caseSensitive = true, - }) { + chapterUrlEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlContains(String value, {bool caseSensitive = true}) { + chapterUrlContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'chapterUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'chapterUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlMatches(String pattern, {bool caseSensitive = true}) { + chapterUrlMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'chapterUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'chapterUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - chapterUrlIsEmpty() { + chapterUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'chapterUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'chapterUrl', value: ''), + ); }); } QueryBuilder - chapterUrlIsNotEmpty() { + chapterUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'chapterUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'chapterUrl', value: ''), + ); }); } QueryBuilder - headersIsNull() { + headersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'headers', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'headers'), + ); }); } QueryBuilder - headersIsNotNull() { + headersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'headers', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'headers'), + ); }); } QueryBuilder - headersElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + headersElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - headersElementGreaterThan( + headersElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - headersElementLessThan( + headersElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - headersElementBetween( + headersElementBetween( String lower, String upper, { bool includeLower = true, @@ -17281,160 +17602,126 @@ extension ChapterPageurlsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'headers', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - headersElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - headersElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - headersElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - headersElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'headers', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - headersElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'headers', - value: '', - )); - }); - } - - QueryBuilder - headersElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'headers', - value: '', - )); - }); - } - - QueryBuilder - headersLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'headers', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'headers', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - headersIsEmpty() { + headersElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'headers', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - headersIsNotEmpty() { + headersElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'headers', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - headersLengthLessThan( - int length, { - bool include = false, - }) { + headersElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'headers', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - headersLengthGreaterThan( - int length, { - bool include = false, - }) { + headersElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'headers', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'headers', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - headersLengthBetween( + headersElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'headers', value: ''), + ); + }); + } + + QueryBuilder + headersElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'headers', value: ''), + ); + }); + } + + QueryBuilder + headersLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'headers', length, true, length, true); + }); + } + + QueryBuilder + headersIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'headers', 0, true, 0, true); + }); + } + + QueryBuilder + headersIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'headers', 0, false, 999999, true); + }); + } + + QueryBuilder + headersLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'headers', 0, true, length, include); + }); + } + + QueryBuilder + headersLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'headers', length, include, 999999, true); + }); + } + + QueryBuilder + headersLengthBetween( int lower, int upper, { bool includeLower = true, @@ -17452,71 +17739,74 @@ extension ChapterPageurlsQueryFilter } QueryBuilder - urlsIsNull() { + urlsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'urls', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'urls'), + ); }); } QueryBuilder - urlsIsNotNull() { + urlsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'urls', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'urls'), + ); }); } QueryBuilder - urlsElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + urlsElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - urlsElementGreaterThan( + urlsElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - urlsElementLessThan( + urlsElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - urlsElementBetween( + urlsElementBetween( String lower, String upper, { bool includeLower = true, @@ -17524,160 +17814,126 @@ extension ChapterPageurlsQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'urls', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - urlsElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - urlsElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - urlsElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'urls', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - urlsElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'urls', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - urlsElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'urls', - value: '', - )); - }); - } - - QueryBuilder - urlsElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'urls', - value: '', - )); - }); - } - - QueryBuilder - urlsLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'urls', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'urls', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - urlsIsEmpty() { + urlsElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'urls', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - urlsIsNotEmpty() { + urlsElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'urls', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - urlsLengthLessThan( - int length, { - bool include = false, - }) { + urlsElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'urls', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'urls', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - urlsLengthGreaterThan( - int length, { - bool include = false, - }) { + urlsElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'urls', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'urls', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - urlsLengthBetween( + urlsElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'urls', value: ''), + ); + }); + } + + QueryBuilder + urlsElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'urls', value: ''), + ); + }); + } + + QueryBuilder + urlsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'urls', length, true, length, true); + }); + } + + QueryBuilder + urlsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'urls', 0, true, 0, true); + }); + } + + QueryBuilder + urlsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'urls', 0, false, 999999, true); + }); + } + + QueryBuilder + urlsLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'urls', 0, true, length, include); + }); + } + + QueryBuilder + urlsLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'urls', length, include, 999999, true); + }); + } + + QueryBuilder + urlsLengthBetween( int lower, int upper, { bool includeLower = true, @@ -17710,12 +17966,9 @@ const ChapterPageIndexSchema = Schema( name: r'chapterId', type: IsarType.long, ), - r'index': PropertySchema( - id: 1, - name: r'index', - type: IsarType.long, - ) + r'index': PropertySchema(id: 1, name: r'index', type: IsarType.long), }, + estimateSize: _chapterPageIndexEstimateSize, serialize: _chapterPageIndexSerialize, deserialize: _chapterPageIndexDeserialize, @@ -17773,150 +18026,148 @@ P _chapterPageIndexDeserializeProp

    ( extension ChapterPageIndexQueryFilter on QueryBuilder { QueryBuilder - chapterIdIsNull() { + 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 - chapterIdIsNotNull() { + 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 - chapterIdEqualTo(int? value) { + chapterIdEqualTo(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), + ); }); } QueryBuilder - chapterIdGreaterThan( - int? value, { - bool include = false, - }) { + chapterIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - chapterIdLessThan( - int? value, { - bool include = false, - }) { + chapterIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - chapterIdBetween( + chapterIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - indexIsNull() { + indexIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'index'), + ); }); } QueryBuilder - indexIsNotNull() { + indexIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'index', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'index'), + ); }); } QueryBuilder - indexEqualTo(int? value) { + indexEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'index', value: value), + ); }); } QueryBuilder - indexGreaterThan( - int? value, { - bool include = false, - }) { + indexGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'index', + value: value, + ), + ); }); } QueryBuilder - indexLessThan( - int? value, { - bool include = false, - }) { + indexLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'index', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'index', + value: value, + ), + ); }); } QueryBuilder - indexBetween( + indexBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'index', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'index', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -17931,18 +18182,15 @@ const PersonalReaderModeSchema = Schema( name: r'PersonalReaderMode', id: -1072936262658804338, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), r'readerMode': PropertySchema( id: 1, name: r'readerMode', type: IsarType.byte, enumMap: _PersonalReaderModereaderModeEnumValueMap, - ) + ), }, + estimateSize: _personalReaderModeEstimateSize, serialize: _personalReaderModeSerialize, deserialize: _personalReaderModeDeserialize, @@ -17976,8 +18224,10 @@ PersonalReaderMode _personalReaderModeDeserialize( ) { final object = PersonalReaderMode( mangaId: reader.readLongOrNull(offsets[0]), - readerMode: _PersonalReaderModereaderModeValueEnumMap[ - reader.readByteOrNull(offsets[1])] ?? + readerMode: + _PersonalReaderModereaderModeValueEnumMap[reader.readByteOrNull( + offsets[1], + )] ?? ReaderMode.vertical, ); return object; @@ -17993,9 +18243,11 @@ P _personalReaderModeDeserializeProp

    ( case 0: return (reader.readLongOrNull(offset)) as P; case 1: - return (_PersonalReaderModereaderModeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - ReaderMode.vertical) as P; + return (_PersonalReaderModereaderModeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + ReaderMode.vertical) + as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -18021,132 +18273,130 @@ const _PersonalReaderModereaderModeValueEnumMap = { extension PersonalReaderModeQueryFilter on QueryBuilder { QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 - mangaIdEqualTo(int? value) { + mangaIdEqualTo(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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { + mangaIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdBetween( + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - readerModeEqualTo(ReaderMode value) { + readerModeEqualTo(ReaderMode value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'readerMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'readerMode', value: value), + ); }); } QueryBuilder - readerModeGreaterThan( - ReaderMode value, { - bool include = false, - }) { + readerModeGreaterThan(ReaderMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'readerMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'readerMode', + value: value, + ), + ); }); } QueryBuilder - readerModeLessThan( - ReaderMode value, { - bool include = false, - }) { + readerModeLessThan(ReaderMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'readerMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'readerMode', + value: value, + ), + ); }); } QueryBuilder - readerModeBetween( + readerModeBetween( ReaderMode lower, ReaderMode upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'readerMode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'readerMode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -18166,17 +18416,14 @@ const AutoScrollPagesSchema = Schema( name: r'autoScroll', type: IsarType.bool, ), - r'mangaId': PropertySchema( - id: 1, - name: r'mangaId', - type: IsarType.long, - ), + r'mangaId': PropertySchema(id: 1, name: r'mangaId', type: IsarType.long), r'pageOffset': PropertySchema( id: 2, name: r'pageOffset', type: IsarType.double, - ) + ), }, + estimateSize: _autoScrollPagesEstimateSize, serialize: _autoScrollPagesSerialize, deserialize: _autoScrollPagesDeserialize, @@ -18238,173 +18485,177 @@ P _autoScrollPagesDeserializeProp

    ( extension AutoScrollPagesQueryFilter on QueryBuilder { QueryBuilder - autoScrollIsNull() { + autoScrollIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'autoScroll', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'autoScroll'), + ); }); } QueryBuilder - autoScrollIsNotNull() { + autoScrollIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'autoScroll', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'autoScroll'), + ); }); } QueryBuilder - autoScrollEqualTo(bool? value) { + autoScrollEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'autoScroll', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'autoScroll', value: value), + ); }); } QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 - mangaIdEqualTo(int? value) { + mangaIdEqualTo(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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { + mangaIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdBetween( + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - pageOffsetIsNull() { + pageOffsetIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'pageOffset', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'pageOffset'), + ); }); } QueryBuilder - pageOffsetIsNotNull() { + pageOffsetIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'pageOffset', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'pageOffset'), + ); }); } QueryBuilder - pageOffsetEqualTo( - double? value, { - double epsilon = Query.epsilon, - }) { + pageOffsetEqualTo(double? value, {double epsilon = Query.epsilon}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'pageOffset', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'pageOffset', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - pageOffsetGreaterThan( + pageOffsetGreaterThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'pageOffset', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'pageOffset', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - pageOffsetLessThan( + pageOffsetLessThan( double? value, { bool include = false, double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'pageOffset', - value: value, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'pageOffset', + value: value, + + epsilon: epsilon, + ), + ); }); } QueryBuilder - pageOffsetBetween( + pageOffsetBetween( double? lower, double? upper, { bool includeLower = true, @@ -18412,14 +18663,17 @@ extension AutoScrollPagesQueryFilter double epsilon = Query.epsilon, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'pageOffset', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - epsilon: epsilon, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'pageOffset', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + + epsilon: epsilon, + ), + ); }); } } @@ -18434,32 +18688,13 @@ const RepoSchema = Schema( name: r'Repo', id: 8520529424681796092, properties: { - r'hashCode': PropertySchema( - id: 0, - name: r'hashCode', - type: IsarType.long, - ), - r'hidden': PropertySchema( - id: 1, - name: r'hidden', - type: IsarType.bool, - ), - r'jsonUrl': PropertySchema( - id: 2, - name: r'jsonUrl', - type: IsarType.string, - ), - r'name': PropertySchema( - id: 3, - name: r'name', - type: IsarType.string, - ), - r'website': PropertySchema( - id: 4, - name: r'website', - type: IsarType.string, - ) + r'hashCode': PropertySchema(id: 0, name: r'hashCode', type: IsarType.long), + r'hidden': PropertySchema(id: 1, name: r'hidden', type: IsarType.bool), + r'jsonUrl': PropertySchema(id: 2, name: r'jsonUrl', type: IsarType.string), + r'name': PropertySchema(id: 3, name: r'name', type: IsarType.string), + r'website': PropertySchema(id: 4, name: r'website', type: IsarType.string), }, + estimateSize: _repoEstimateSize, serialize: _repoSerialize, deserialize: _repoDeserialize, @@ -18546,10 +18781,9 @@ P _repoDeserializeProp

    ( extension RepoQueryFilter on QueryBuilder { QueryBuilder hashCodeEqualTo(int value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hashCode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'hashCode', value: value), + ); }); } @@ -18558,11 +18792,13 @@ extension RepoQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'hashCode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'hashCode', + value: value, + ), + ); }); } @@ -18571,11 +18807,13 @@ extension RepoQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'hashCode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'hashCode', + value: value, + ), + ); }); } @@ -18586,54 +18824,55 @@ extension RepoQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'hashCode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'hashCode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder hiddenIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hidden', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'hidden'), + ); }); } QueryBuilder hiddenIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hidden', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'hidden'), + ); }); } QueryBuilder hiddenEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hidden', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'hidden', value: value), + ); }); } QueryBuilder jsonUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'jsonUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'jsonUrl'), + ); }); } QueryBuilder jsonUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'jsonUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'jsonUrl'), + ); }); } @@ -18642,11 +18881,13 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18656,12 +18897,14 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18671,12 +18914,14 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18688,14 +18933,16 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'jsonUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'jsonUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18704,11 +18951,13 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18717,67 +18966,75 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder jsonUrlContains(String value, - {bool caseSensitive = true}) { + QueryBuilder jsonUrlContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'jsonUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'jsonUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder jsonUrlMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder jsonUrlMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'jsonUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'jsonUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder jsonUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'jsonUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'jsonUrl', value: ''), + ); }); } QueryBuilder jsonUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'jsonUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'jsonUrl', value: ''), + ); }); } QueryBuilder 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 nameIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'name', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'name'), + ); }); } @@ -18786,11 +19043,13 @@ extension RepoQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -18800,12 +19059,14 @@ extension RepoQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -18815,12 +19076,14 @@ extension RepoQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -18832,14 +19095,16 @@ extension RepoQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -18848,11 +19113,13 @@ extension RepoQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -18861,67 +19128,75 @@ extension RepoQueryFilter on QueryBuilder { 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 nameContains(String value, - {bool caseSensitive = true}) { + QueryBuilder nameContains( + 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 nameMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder nameMatches( + 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 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 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 websiteIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'website', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'website'), + ); }); } QueryBuilder websiteIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'website', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'website'), + ); }); } @@ -18930,11 +19205,13 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18944,12 +19221,14 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18959,12 +19238,14 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18976,14 +19257,16 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'website', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'website', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -18992,11 +19275,13 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -19005,51 +19290,59 @@ extension RepoQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder websiteContains(String value, - {bool caseSensitive = true}) { + QueryBuilder websiteContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'website', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'website', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder websiteMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder websiteMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'website', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'website', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder websiteIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'website', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'website', value: ''), + ); }); } QueryBuilder websiteIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'website', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'website', value: ''), + ); }); } } @@ -19063,18 +19356,15 @@ const PersonalPageModeSchema = Schema( name: r'PersonalPageMode', id: -7061860019786197792, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), r'pageMode': PropertySchema( id: 1, name: r'pageMode', type: IsarType.byte, enumMap: _PersonalPageModepageModeEnumValueMap, - ) + ), }, + estimateSize: _personalPageModeEstimateSize, serialize: _personalPageModeSerialize, deserialize: _personalPageModeDeserialize, @@ -19108,8 +19398,10 @@ PersonalPageMode _personalPageModeDeserialize( ) { final object = PersonalPageMode( mangaId: reader.readLongOrNull(offsets[0]), - pageMode: _PersonalPageModepageModeValueEnumMap[ - reader.readByteOrNull(offsets[1])] ?? + pageMode: + _PersonalPageModepageModeValueEnumMap[reader.readByteOrNull( + offsets[1], + )] ?? PageMode.onePage, ); return object; @@ -19125,18 +19417,17 @@ P _personalPageModeDeserializeProp

    ( case 0: return (reader.readLongOrNull(offset)) as P; case 1: - return (_PersonalPageModepageModeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - PageMode.onePage) as P; + return (_PersonalPageModepageModeValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + PageMode.onePage) + as P; default: throw IsarError('Unknown property with id $propertyId'); } } -const _PersonalPageModepageModeEnumValueMap = { - 'onePage': 0, - 'doublePage': 1, -}; +const _PersonalPageModepageModeEnumValueMap = {'onePage': 0, 'doublePage': 1}; const _PersonalPageModepageModeValueEnumMap = { 0: PageMode.onePage, 1: PageMode.doublePage, @@ -19145,132 +19436,130 @@ const _PersonalPageModepageModeValueEnumMap = { extension PersonalPageModeQueryFilter on QueryBuilder { QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 - mangaIdEqualTo(int? value) { + mangaIdEqualTo(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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { + mangaIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdBetween( + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - pageModeEqualTo(PageMode value) { + pageModeEqualTo(PageMode value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'pageMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'pageMode', value: value), + ); }); } QueryBuilder - pageModeGreaterThan( - PageMode value, { - bool include = false, - }) { + pageModeGreaterThan(PageMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'pageMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'pageMode', + value: value, + ), + ); }); } QueryBuilder - pageModeLessThan( - PageMode value, { - bool include = false, - }) { + pageModeLessThan(PageMode value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'pageMode', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'pageMode', + value: value, + ), + ); }); } QueryBuilder - pageModeBetween( + pageModeBetween( PageMode lower, PageMode upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'pageMode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'pageMode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -19285,17 +19574,14 @@ const FilterScanlatorSchema = Schema( name: r'FilterScanlator', id: 3007689993900015493, properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ), + r'mangaId': PropertySchema(id: 0, name: r'mangaId', type: IsarType.long), r'scanlators': PropertySchema( id: 1, name: r'scanlators', type: IsarType.stringList, - ) + ), }, + estimateSize: _filterScanlatorEstimateSize, serialize: _filterScanlatorSerialize, deserialize: _filterScanlatorDeserialize, @@ -19365,145 +19651,147 @@ P _filterScanlatorDeserializeProp

    ( extension FilterScanlatorQueryFilter on QueryBuilder { QueryBuilder - mangaIdIsNull() { + 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 - mangaIdIsNotNull() { + 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 - mangaIdEqualTo(int? value) { + mangaIdEqualTo(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), + ); }); } QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { + mangaIdGreaterThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { + mangaIdLessThan(int? value, {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, + ), + ); }); } QueryBuilder - mangaIdBetween( + mangaIdBetween( int? lower, int? upper, { bool includeLower = true, 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 - scanlatorsIsNull() { + scanlatorsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'scanlators', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'scanlators'), + ); }); } QueryBuilder - scanlatorsIsNotNull() { + scanlatorsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'scanlators', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'scanlators'), + ); }); } QueryBuilder - scanlatorsElementEqualTo( - String value, { - bool caseSensitive = true, - }) { + scanlatorsElementEqualTo(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - scanlatorsElementGreaterThan( + scanlatorsElementGreaterThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - scanlatorsElementLessThan( + scanlatorsElementLessThan( String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - scanlatorsElementBetween( + scanlatorsElementBetween( String lower, String upper, { bool includeLower = true, @@ -19511,160 +19799,126 @@ extension FilterScanlatorQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'scanlators', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - scanlatorsElementStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - scanlatorsElementEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - scanlatorsElementContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'scanlators', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - scanlatorsElementMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'scanlators', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - scanlatorsElementIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'scanlators', - value: '', - )); - }); - } - - QueryBuilder - scanlatorsElementIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'scanlators', - value: '', - )); - }); - } - - QueryBuilder - scanlatorsLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'scanlators', - length, - true, - length, - true, + return query.addFilterCondition( + FilterCondition.between( + property: r'scanlators', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - scanlatorsIsEmpty() { + scanlatorsElementStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'scanlators', - 0, - true, - 0, - true, + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - scanlatorsIsNotEmpty() { + scanlatorsElementEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'scanlators', - 0, - false, - 999999, - true, + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - scanlatorsLengthLessThan( - int length, { - bool include = false, - }) { + scanlatorsElementContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'scanlators', - 0, - true, - length, - include, + return query.addFilterCondition( + FilterCondition.contains( + property: r'scanlators', + value: value, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - scanlatorsLengthGreaterThan( - int length, { - bool include = false, - }) { + scanlatorsElementMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'scanlators', - length, - include, - 999999, - true, + return query.addFilterCondition( + FilterCondition.matches( + property: r'scanlators', + wildcard: pattern, + caseSensitive: caseSensitive, + ), ); }); } QueryBuilder - scanlatorsLengthBetween( + scanlatorsElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'scanlators', value: ''), + ); + }); + } + + QueryBuilder + scanlatorsElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'scanlators', value: ''), + ); + }); + } + + QueryBuilder + scanlatorsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'scanlators', length, true, length, true); + }); + } + + QueryBuilder + scanlatorsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'scanlators', 0, true, 0, true); + }); + } + + QueryBuilder + scanlatorsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'scanlators', 0, false, 999999, true); + }); + } + + QueryBuilder + scanlatorsLengthLessThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'scanlators', 0, true, length, include); + }); + } + + QueryBuilder + scanlatorsLengthGreaterThan(int length, {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.listLength(r'scanlators', length, include, 999999, true); + }); + } + + QueryBuilder + scanlatorsLengthBetween( int lower, int upper, { bool includeLower = true, @@ -19701,8 +19955,9 @@ const L10nLocaleSchema = Schema( id: 1, name: r'languageCode', type: IsarType.string, - ) + ), }, + estimateSize: _l10nLocaleEstimateSize, serialize: _l10nLocaleSerialize, deserialize: _l10nLocaleDeserialize, @@ -19772,71 +20027,74 @@ P _l10nLocaleDeserializeProp

    ( extension L10nLocaleQueryFilter on QueryBuilder { QueryBuilder - countryCodeIsNull() { + countryCodeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'countryCode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'countryCode'), + ); }); } QueryBuilder - countryCodeIsNotNull() { + countryCodeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'countryCode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'countryCode'), + ); }); } QueryBuilder - countryCodeEqualTo( - String? value, { - bool caseSensitive = true, - }) { + countryCodeEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeGreaterThan( + countryCodeGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeLessThan( + countryCodeLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeBetween( + countryCodeBetween( String? lower, String? upper, { bool includeLower = true, @@ -19844,153 +20102,158 @@ extension L10nLocaleQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'countryCode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'countryCode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeStartsWith( - String value, { - bool caseSensitive = true, - }) { + countryCodeStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeEndsWith( - String value, { - bool caseSensitive = true, - }) { + countryCodeEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeContains(String value, {bool caseSensitive = true}) { + countryCodeContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'countryCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'countryCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeMatches(String pattern, {bool caseSensitive = true}) { + countryCodeMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'countryCode', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'countryCode', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - countryCodeIsEmpty() { + countryCodeIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'countryCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'countryCode', value: ''), + ); }); } QueryBuilder - countryCodeIsNotEmpty() { + countryCodeIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'countryCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'countryCode', value: ''), + ); }); } QueryBuilder - languageCodeIsNull() { + languageCodeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'languageCode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'languageCode'), + ); }); } QueryBuilder - languageCodeIsNotNull() { + languageCodeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'languageCode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'languageCode'), + ); }); } QueryBuilder - languageCodeEqualTo( - String? value, { - bool caseSensitive = true, - }) { + languageCodeEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeGreaterThan( + languageCodeGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeLessThan( + languageCodeLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeBetween( + languageCodeBetween( String? lower, String? upper, { bool includeLower = true, @@ -19998,84 +20261,86 @@ extension L10nLocaleQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'languageCode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'languageCode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeStartsWith( - String value, { - bool caseSensitive = true, - }) { + languageCodeStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeEndsWith( - String value, { - bool caseSensitive = true, - }) { + languageCodeEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeContains(String value, {bool caseSensitive = true}) { + languageCodeContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'languageCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'languageCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeMatches(String pattern, {bool caseSensitive = true}) { + languageCodeMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'languageCode', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'languageCode', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - languageCodeIsEmpty() { + languageCodeIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'languageCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'languageCode', value: ''), + ); }); } QueryBuilder - languageCodeIsNotEmpty() { + languageCodeIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'languageCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'languageCode', value: ''), + ); }); } } @@ -20090,27 +20355,12 @@ const CustomColorFilterSchema = Schema( name: r'CustomColorFilter', id: -2363592387931876829, properties: { - r'a': PropertySchema( - id: 0, - name: r'a', - type: IsarType.long, - ), - r'b': PropertySchema( - id: 1, - name: r'b', - type: IsarType.long, - ), - r'g': PropertySchema( - id: 2, - name: r'g', - type: IsarType.long, - ), - r'r': PropertySchema( - id: 3, - name: r'r', - type: IsarType.long, - ) + r'a': PropertySchema(id: 0, name: r'a', type: IsarType.long), + r'b': PropertySchema(id: 1, name: r'b', type: IsarType.long), + r'g': PropertySchema(id: 2, name: r'g', type: IsarType.long), + r'r': PropertySchema(id: 3, name: r'r', type: IsarType.long), }, + estimateSize: _customColorFilterEstimateSize, serialize: _customColorFilterSerialize, deserialize: _customColorFilterDeserialize, @@ -20176,298 +20426,294 @@ P _customColorFilterDeserializeProp

    ( extension CustomColorFilterQueryFilter on QueryBuilder { QueryBuilder - aIsNull() { + aIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'a', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'a'), + ); }); } QueryBuilder - aIsNotNull() { + aIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'a', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'a'), + ); }); } QueryBuilder - aEqualTo(int? value) { + aEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'a', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'a', value: value), + ); }); } QueryBuilder - aGreaterThan( - int? value, { - bool include = false, - }) { + aGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'a', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'a', + value: value, + ), + ); }); } QueryBuilder - aLessThan( - int? value, { - bool include = false, - }) { + aLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'a', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'a', + value: value, + ), + ); }); } QueryBuilder - aBetween( + aBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'a', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'a', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - bIsNull() { + bIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'b', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'b'), + ); }); } QueryBuilder - bIsNotNull() { + bIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'b', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'b'), + ); }); } QueryBuilder - bEqualTo(int? value) { + bEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'b', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'b', value: value), + ); }); } QueryBuilder - bGreaterThan( - int? value, { - bool include = false, - }) { + bGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'b', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'b', + value: value, + ), + ); }); } QueryBuilder - bLessThan( - int? value, { - bool include = false, - }) { + bLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'b', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'b', + value: value, + ), + ); }); } QueryBuilder - bBetween( + bBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'b', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'b', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - gIsNull() { + gIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'g', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'g'), + ); }); } QueryBuilder - gIsNotNull() { + gIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'g', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'g'), + ); }); } QueryBuilder - gEqualTo(int? value) { + gEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'g', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'g', value: value), + ); }); } QueryBuilder - gGreaterThan( - int? value, { - bool include = false, - }) { + gGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'g', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'g', + value: value, + ), + ); }); } QueryBuilder - gLessThan( - int? value, { - bool include = false, - }) { + gLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'g', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'g', + value: value, + ), + ); }); } QueryBuilder - gBetween( + gBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'g', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'g', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - rIsNull() { + rIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'r', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'r'), + ); }); } QueryBuilder - rIsNotNull() { + rIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'r', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'r'), + ); }); } QueryBuilder - rEqualTo(int? value) { + rEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'r', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'r', value: value), + ); }); } QueryBuilder - rGreaterThan( - int? value, { - bool include = false, - }) { + rGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'r', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'r', + value: value, + ), + ); }); } QueryBuilder - rLessThan( - int? value, { - bool include = false, - }) { + rLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'r', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'r', + value: value, + ), + ); }); } QueryBuilder - rBetween( + rBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'r', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'r', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } @@ -20522,11 +20768,7 @@ const PlayerSubtitleSettingsSchema = Schema( name: r'borderColorR', type: IsarType.long, ), - r'fontSize': PropertySchema( - id: 8, - name: r'fontSize', - type: IsarType.long, - ), + r'fontSize': PropertySchema(id: 8, name: r'fontSize', type: IsarType.long), r'textColorA': PropertySchema( id: 9, name: r'textColorA', @@ -20547,17 +20789,14 @@ const PlayerSubtitleSettingsSchema = Schema( name: r'textColorR', type: IsarType.long, ), - r'useBold': PropertySchema( - id: 13, - name: r'useBold', - type: IsarType.bool, - ), + r'useBold': PropertySchema(id: 13, name: r'useBold', type: IsarType.bool), r'useItalic': PropertySchema( id: 14, name: r'useItalic', type: IsarType.bool, - ) + ), }, + estimateSize: _playerSubtitleSettingsEstimateSize, serialize: _playerSubtitleSettingsSerialize, deserialize: _playerSubtitleSettingsDeserialize, @@ -20664,1029 +20903,1360 @@ P _playerSubtitleSettingsDeserializeProp

    ( } } -extension PlayerSubtitleSettingsQueryFilter on QueryBuilder< - PlayerSubtitleSettings, PlayerSubtitleSettings, QFilterCondition> { - QueryBuilder backgroundColorAIsNull() { +extension PlayerSubtitleSettingsQueryFilter + on + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QFilterCondition + > { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorAIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backgroundColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backgroundColorA'), + ); }); } - QueryBuilder backgroundColorAIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorAIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backgroundColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backgroundColorA'), + ); }); } - QueryBuilder backgroundColorAEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorAEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backgroundColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backgroundColorA', value: value), + ); }); } - QueryBuilder backgroundColorAGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorAGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backgroundColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backgroundColorA', + value: value, + ), + ); }); } - QueryBuilder backgroundColorALessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorALessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backgroundColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backgroundColorA', + value: value, + ), + ); }); } - QueryBuilder backgroundColorABetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorABetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backgroundColorA', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backgroundColorA', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder backgroundColorBIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backgroundColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backgroundColorB'), + ); }); } - QueryBuilder backgroundColorBIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backgroundColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backgroundColorB'), + ); }); } - QueryBuilder backgroundColorBEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backgroundColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backgroundColorB', value: value), + ); }); } - QueryBuilder backgroundColorBGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backgroundColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backgroundColorB', + value: value, + ), + ); }); } - QueryBuilder backgroundColorBLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backgroundColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backgroundColorB', + value: value, + ), + ); }); } - QueryBuilder backgroundColorBBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorBBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backgroundColorB', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backgroundColorB', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder backgroundColorGIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backgroundColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backgroundColorG'), + ); }); } - QueryBuilder backgroundColorGIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backgroundColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backgroundColorG'), + ); }); } - QueryBuilder backgroundColorGEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backgroundColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backgroundColorG', value: value), + ); }); } - QueryBuilder backgroundColorGGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backgroundColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backgroundColorG', + value: value, + ), + ); }); } - QueryBuilder backgroundColorGLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backgroundColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backgroundColorG', + value: value, + ), + ); }); } - QueryBuilder backgroundColorGBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorGBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backgroundColorG', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backgroundColorG', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder backgroundColorRIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorRIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'backgroundColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'backgroundColorR'), + ); }); } - QueryBuilder backgroundColorRIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorRIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'backgroundColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'backgroundColorR'), + ); }); } - QueryBuilder backgroundColorREqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorREqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'backgroundColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'backgroundColorR', value: value), + ); }); } - QueryBuilder backgroundColorRGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorRGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'backgroundColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'backgroundColorR', + value: value, + ), + ); }); } - QueryBuilder backgroundColorRLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorRLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'backgroundColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'backgroundColorR', + value: value, + ), + ); }); } - QueryBuilder backgroundColorRBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + backgroundColorRBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'backgroundColorR', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'backgroundColorR', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder borderColorAIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorAIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'borderColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'borderColorA'), + ); }); } - QueryBuilder borderColorAIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorAIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'borderColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'borderColorA'), + ); }); } - QueryBuilder borderColorAEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorAEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'borderColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'borderColorA', value: value), + ); }); } - QueryBuilder borderColorAGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorAGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'borderColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'borderColorA', + value: value, + ), + ); }); } - QueryBuilder borderColorALessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorALessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'borderColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'borderColorA', + value: value, + ), + ); }); } - QueryBuilder borderColorABetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorABetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'borderColorA', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'borderColorA', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder borderColorBIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'borderColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'borderColorB'), + ); }); } - QueryBuilder borderColorBIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'borderColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'borderColorB'), + ); }); } - QueryBuilder borderColorBEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'borderColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'borderColorB', value: value), + ); }); } - QueryBuilder borderColorBGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'borderColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'borderColorB', + value: value, + ), + ); }); } - QueryBuilder borderColorBLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'borderColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'borderColorB', + value: value, + ), + ); }); } - QueryBuilder borderColorBBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorBBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'borderColorB', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'borderColorB', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder borderColorGIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'borderColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'borderColorG'), + ); }); } - QueryBuilder borderColorGIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'borderColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'borderColorG'), + ); }); } - QueryBuilder borderColorGEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'borderColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'borderColorG', value: value), + ); }); } - QueryBuilder borderColorGGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'borderColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'borderColorG', + value: value, + ), + ); }); } - QueryBuilder borderColorGLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'borderColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'borderColorG', + value: value, + ), + ); }); } - QueryBuilder borderColorGBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorGBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'borderColorG', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'borderColorG', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder borderColorRIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorRIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'borderColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'borderColorR'), + ); }); } - QueryBuilder borderColorRIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorRIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'borderColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'borderColorR'), + ); }); } - QueryBuilder borderColorREqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorREqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'borderColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'borderColorR', value: value), + ); }); } - QueryBuilder borderColorRGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorRGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'borderColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'borderColorR', + value: value, + ), + ); }); } - QueryBuilder borderColorRLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorRLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'borderColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'borderColorR', + value: value, + ), + ); }); } - QueryBuilder borderColorRBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + borderColorRBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'borderColorR', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'borderColorR', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder fontSizeIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'fontSize', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'fontSize'), + ); }); } - QueryBuilder fontSizeIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'fontSize', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'fontSize'), + ); }); } - QueryBuilder fontSizeEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'fontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'fontSize', value: value), + ); }); } - QueryBuilder fontSizeGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'fontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'fontSize', + value: value, + ), + ); }); } - QueryBuilder fontSizeLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'fontSize', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'fontSize', + value: value, + ), + ); }); } - QueryBuilder fontSizeBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + fontSizeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'fontSize', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'fontSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder textColorAIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorAIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'textColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'textColorA'), + ); }); } - QueryBuilder textColorAIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorAIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'textColorA', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'textColorA'), + ); }); } - QueryBuilder textColorAEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorAEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'textColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'textColorA', value: value), + ); }); } - QueryBuilder textColorAGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorAGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'textColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'textColorA', + value: value, + ), + ); }); } - QueryBuilder textColorALessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorALessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'textColorA', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'textColorA', + value: value, + ), + ); }); } - QueryBuilder textColorABetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorABetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'textColorA', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'textColorA', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder textColorBIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'textColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'textColorB'), + ); }); } - QueryBuilder textColorBIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'textColorB', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'textColorB'), + ); }); } - QueryBuilder textColorBEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'textColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'textColorB', value: value), + ); }); } - QueryBuilder textColorBGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'textColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'textColorB', + value: value, + ), + ); }); } - QueryBuilder textColorBLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'textColorB', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'textColorB', + value: value, + ), + ); }); } - QueryBuilder textColorBBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorBBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'textColorB', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'textColorB', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder textColorGIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'textColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'textColorG'), + ); }); } - QueryBuilder textColorGIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'textColorG', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'textColorG'), + ); }); } - QueryBuilder textColorGEqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'textColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'textColorG', value: value), + ); }); } - QueryBuilder textColorGGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'textColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'textColorG', + value: value, + ), + ); }); } - QueryBuilder textColorGLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'textColorG', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'textColorG', + value: value, + ), + ); }); } - QueryBuilder textColorGBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorGBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'textColorG', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'textColorG', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder textColorRIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorRIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'textColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'textColorR'), + ); }); } - QueryBuilder textColorRIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorRIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'textColorR', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'textColorR'), + ); }); } - QueryBuilder textColorREqualTo(int? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorREqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'textColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'textColorR', value: value), + ); }); } - QueryBuilder textColorRGreaterThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorRGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'textColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'textColorR', + value: value, + ), + ); }); } - QueryBuilder textColorRLessThan( - int? value, { - bool include = false, - }) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorRLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'textColorR', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'textColorR', + value: value, + ), + ); }); } - QueryBuilder textColorRBetween( + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + textColorRBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'textColorR', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'textColorR', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } - QueryBuilder useBoldIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useBoldIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useBold', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'useBold'), + ); }); } - QueryBuilder useBoldIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useBoldIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useBold', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'useBold'), + ); }); } - QueryBuilder useBoldEqualTo(bool? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useBoldEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useBold', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'useBold', value: value), + ); }); } - QueryBuilder useItalicIsNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useItalicIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useItalic', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'useItalic'), + ); }); } - QueryBuilder useItalicIsNotNull() { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useItalicIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useItalic', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'useItalic'), + ); }); } - QueryBuilder useItalicEqualTo(bool? value) { + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QAfterFilterCondition + > + useItalicEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useItalic', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'useItalic', value: value), + ); }); } } -extension PlayerSubtitleSettingsQueryObject on QueryBuilder< - PlayerSubtitleSettings, PlayerSubtitleSettings, QFilterCondition> {} +extension PlayerSubtitleSettingsQueryObject + on + QueryBuilder< + PlayerSubtitleSettings, + PlayerSubtitleSettings, + QFilterCondition + > {} // coverage:ignore-file // ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types @@ -21695,27 +22265,12 @@ const AlgorithmWeightsSchema = Schema( name: r'AlgorithmWeights', id: -2865436974642812672, properties: { - r'genre': PropertySchema( - id: 0, - name: r'genre', - type: IsarType.long, - ), - r'setting': PropertySchema( - id: 1, - name: r'setting', - type: IsarType.long, - ), - r'synopsis': PropertySchema( - id: 2, - name: r'synopsis', - type: IsarType.long, - ), - r'theme': PropertySchema( - id: 3, - name: r'theme', - type: IsarType.long, - ) + r'genre': PropertySchema(id: 0, name: r'genre', type: IsarType.long), + r'setting': PropertySchema(id: 1, name: r'setting', type: IsarType.long), + r'synopsis': PropertySchema(id: 2, name: r'synopsis', type: IsarType.long), + r'theme': PropertySchema(id: 3, name: r'theme', type: IsarType.long), }, + estimateSize: _algorithmWeightsEstimateSize, serialize: _algorithmWeightsSerialize, deserialize: _algorithmWeightsDeserialize, @@ -21781,298 +22336,294 @@ P _algorithmWeightsDeserializeProp

    ( extension AlgorithmWeightsQueryFilter on QueryBuilder { QueryBuilder - genreIsNull() { + genreIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'genre', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'genre'), + ); }); } QueryBuilder - genreIsNotNull() { + genreIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'genre', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'genre'), + ); }); } QueryBuilder - genreEqualTo(int? value) { + genreEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'genre', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'genre', value: value), + ); }); } QueryBuilder - genreGreaterThan( - int? value, { - bool include = false, - }) { + genreGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'genre', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'genre', + value: value, + ), + ); }); } QueryBuilder - genreLessThan( - int? value, { - bool include = false, - }) { + genreLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'genre', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'genre', + value: value, + ), + ); }); } QueryBuilder - genreBetween( + genreBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'genre', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'genre', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - settingIsNull() { + settingIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'setting', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'setting'), + ); }); } QueryBuilder - settingIsNotNull() { + settingIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'setting', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'setting'), + ); }); } QueryBuilder - settingEqualTo(int? value) { + settingEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'setting', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'setting', value: value), + ); }); } QueryBuilder - settingGreaterThan( - int? value, { - bool include = false, - }) { + settingGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'setting', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'setting', + value: value, + ), + ); }); } QueryBuilder - settingLessThan( - int? value, { - bool include = false, - }) { + settingLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'setting', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'setting', + value: value, + ), + ); }); } QueryBuilder - settingBetween( + settingBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'setting', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'setting', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - synopsisIsNull() { + synopsisIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'synopsis', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'synopsis'), + ); }); } QueryBuilder - synopsisIsNotNull() { + synopsisIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'synopsis', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'synopsis'), + ); }); } QueryBuilder - synopsisEqualTo(int? value) { + synopsisEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'synopsis', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'synopsis', value: value), + ); }); } QueryBuilder - synopsisGreaterThan( - int? value, { - bool include = false, - }) { + synopsisGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'synopsis', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'synopsis', + value: value, + ), + ); }); } QueryBuilder - synopsisLessThan( - int? value, { - bool include = false, - }) { + synopsisLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'synopsis', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'synopsis', + value: value, + ), + ); }); } QueryBuilder - synopsisBetween( + synopsisBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'synopsis', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'synopsis', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - themeIsNull() { + themeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'theme', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'theme'), + ); }); } QueryBuilder - themeIsNotNull() { + themeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'theme', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'theme'), + ); }); } QueryBuilder - themeEqualTo(int? value) { + themeEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'theme', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'theme', value: value), + ); }); } QueryBuilder - themeGreaterThan( - int? value, { - bool include = false, - }) { + themeGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'theme', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'theme', + value: value, + ), + ); }); } QueryBuilder - themeLessThan( - int? value, { - bool include = false, - }) { + themeLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'theme', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'theme', + value: value, + ), + ); }); } QueryBuilder - themeBetween( + themeBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'theme', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'theme', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } } diff --git a/lib/models/source.g.dart b/lib/models/source.g.dart index d7327fd2..bf2d532c 100644 --- a/lib/models/source.g.dart +++ b/lib/models/source.g.dart @@ -22,21 +22,13 @@ const SourceSchema = CollectionSchema( name: r'additionalParams', type: IsarType.string, ), - r'apiUrl': PropertySchema( - id: 1, - name: r'apiUrl', - type: IsarType.string, - ), + r'apiUrl': PropertySchema(id: 1, name: r'apiUrl', type: IsarType.string), r'appMinVerReq': PropertySchema( id: 2, name: r'appMinVerReq', type: IsarType.string, ), - r'baseUrl': PropertySchema( - id: 3, - name: r'baseUrl', - type: IsarType.string, - ), + r'baseUrl': PropertySchema(id: 3, name: r'baseUrl', type: IsarType.string), r'dateFormat': PropertySchema( id: 4, name: r'dateFormat', @@ -57,56 +49,24 @@ const SourceSchema = CollectionSchema( name: r'hasCloudflare', type: IsarType.bool, ), - r'headers': PropertySchema( - id: 8, - name: r'headers', - type: IsarType.string, - ), - r'iconUrl': PropertySchema( - id: 9, - name: r'iconUrl', - type: IsarType.string, - ), - r'isActive': PropertySchema( - id: 10, - name: r'isActive', - type: IsarType.bool, - ), - r'isAdded': PropertySchema( - id: 11, - name: r'isAdded', - type: IsarType.bool, - ), + r'headers': PropertySchema(id: 8, name: r'headers', type: IsarType.string), + r'iconUrl': PropertySchema(id: 9, name: r'iconUrl', type: IsarType.string), + r'isActive': PropertySchema(id: 10, name: r'isActive', type: IsarType.bool), + r'isAdded': PropertySchema(id: 11, name: r'isAdded', type: IsarType.bool), r'isFullData': PropertySchema( id: 12, name: r'isFullData', type: IsarType.bool, ), - r'isLocal': PropertySchema( - id: 13, - name: r'isLocal', - type: IsarType.bool, - ), - r'isManga': PropertySchema( - id: 14, - name: r'isManga', - type: IsarType.bool, - ), - r'isNsfw': PropertySchema( - id: 15, - name: r'isNsfw', - type: IsarType.bool, - ), + r'isLocal': PropertySchema(id: 13, name: r'isLocal', type: IsarType.bool), + r'isManga': PropertySchema(id: 14, name: r'isManga', type: IsarType.bool), + r'isNsfw': PropertySchema(id: 15, name: r'isNsfw', type: IsarType.bool), r'isObsolete': PropertySchema( id: 16, name: r'isObsolete', type: IsarType.bool, ), - r'isPinned': PropertySchema( - id: 17, - name: r'isPinned', - type: IsarType.bool, - ), + r'isPinned': PropertySchema(id: 17, name: r'isPinned', type: IsarType.bool), r'isTorrent': PropertySchema( id: 18, name: r'isTorrent', @@ -118,26 +78,10 @@ const SourceSchema = CollectionSchema( type: IsarType.byte, enumMap: _SourceitemTypeEnumValueMap, ), - r'lang': PropertySchema( - id: 20, - name: r'lang', - type: IsarType.string, - ), - r'lastUsed': PropertySchema( - id: 21, - name: r'lastUsed', - type: IsarType.bool, - ), - r'name': PropertySchema( - id: 22, - name: r'name', - type: IsarType.string, - ), - r'notes': PropertySchema( - id: 23, - name: r'notes', - type: IsarType.string, - ), + r'lang': PropertySchema(id: 20, name: r'lang', type: IsarType.string), + r'lastUsed': PropertySchema(id: 21, name: r'lastUsed', type: IsarType.bool), + r'name': PropertySchema(id: 22, name: r'name', type: IsarType.string), + r'notes': PropertySchema(id: 23, name: r'notes', type: IsarType.string), r'preferenceList': PropertySchema( id: 24, name: r'preferenceList', @@ -147,6 +91,7 @@ const SourceSchema = CollectionSchema( id: 25, name: r'repo', type: IsarType.object, + target: r'Repo', ), r'sourceCode': PropertySchema( @@ -180,17 +125,14 @@ const SourceSchema = CollectionSchema( name: r'updatedAt', type: IsarType.long, ), - r'version': PropertySchema( - id: 32, - name: r'version', - type: IsarType.string, - ), + r'version': PropertySchema(id: 32, name: r'version', type: IsarType.string), r'versionLast': PropertySchema( id: 33, name: r'versionLast', type: IsarType.string, - ) + ), }, + estimateSize: _sourceEstimateSize, serialize: _sourceSerialize, deserialize: _sourceDeserialize, @@ -199,6 +141,7 @@ const SourceSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {r'Repo': RepoSchema}, + getId: _sourceGetId, getLinks: _sourceGetLinks, attach: _sourceAttach, @@ -402,7 +345,8 @@ Source _sourceDeserialize( isNsfw: reader.readBoolOrNull(offsets[15]), isObsolete: reader.readBoolOrNull(offsets[16]), isPinned: reader.readBoolOrNull(offsets[17]), - itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[19])] ?? + itemType: + _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[19])] ?? ItemType.manga, lang: reader.readStringOrNull(offsets[20]), lastUsed: reader.readBoolOrNull(offsets[21]), @@ -422,8 +366,10 @@ Source _sourceDeserialize( version: reader.readStringOrNull(offsets[32]), versionLast: reader.readStringOrNull(offsets[33]), ); - object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[ - reader.readByteOrNull(offsets[27])] ?? + object.sourceCodeLanguage = + _SourcesourceCodeLanguageValueEnumMap[reader.readByteOrNull( + offsets[27], + )] ?? SourceCodeLanguage.dart; return object; } @@ -475,7 +421,8 @@ P _sourceDeserializeProp

    ( return (reader.readBool(offset)) as P; case 19: return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ItemType.manga) as P; + ItemType.manga) + as P; case 20: return (reader.readStringOrNull(offset)) as P; case 21: @@ -488,16 +435,19 @@ P _sourceDeserializeProp

    ( return (reader.readStringOrNull(offset)) as P; case 25: return (reader.readObjectOrNull( - offset, - RepoSchema.deserialize, - allOffsets, - )) as P; + offset, + RepoSchema.deserialize, + allOffsets, + )) + as P; case 26: return (reader.readStringOrNull(offset)) as P; case 27: - return (_SourcesourceCodeLanguageValueEnumMap[ - reader.readByteOrNull(offset)] ?? - SourceCodeLanguage.dart) as P; + return (_SourcesourceCodeLanguageValueEnumMap[reader.readByteOrNull( + offset, + )] ?? + SourceCodeLanguage.dart) + as P; case 28: return (reader.readStringOrNull(offset)) as P; case 29: @@ -515,11 +465,7 @@ P _sourceDeserializeProp

    ( } } -const _SourceitemTypeEnumValueMap = { - 'manga': 0, - 'anime': 1, - 'novel': 2, -}; +const _SourceitemTypeEnumValueMap = {'manga': 0, 'anime': 1, 'novel': 2}; const _SourceitemTypeValueEnumMap = { 0: ItemType.manga, 1: ItemType.anime, @@ -559,10 +505,7 @@ extension SourceQueryWhereSort on QueryBuilder { extension SourceQueryWhere on QueryBuilder { QueryBuilder 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)); }); } @@ -588,8 +531,10 @@ extension SourceQueryWhere on QueryBuilder { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder idGreaterThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -597,8 +542,10 @@ extension SourceQueryWhere on QueryBuilder { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -613,12 +560,14 @@ extension SourceQueryWhere on QueryBuilder { 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, + ), + ); }); } } @@ -626,18 +575,18 @@ extension SourceQueryWhere on QueryBuilder { extension SourceQueryFilter on QueryBuilder { QueryBuilder additionalParamsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'additionalParams', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'additionalParams'), + ); }); } QueryBuilder - additionalParamsIsNotNull() { + additionalParamsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'additionalParams', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'additionalParams'), + ); }); } @@ -646,27 +595,31 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - additionalParamsGreaterThan( + additionalParamsGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -676,12 +629,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -693,28 +648,29 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'additionalParams', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'additionalParams', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - additionalParamsStartsWith( - String value, { - bool caseSensitive = true, - }) { + additionalParamsStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -723,71 +679,77 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder additionalParamsContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'additionalParams', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'additionalParams', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder additionalParamsMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'additionalParams', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'additionalParams', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - additionalParamsIsEmpty() { + additionalParamsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'additionalParams', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'additionalParams', value: ''), + ); }); } QueryBuilder - additionalParamsIsNotEmpty() { + additionalParamsIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'additionalParams', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'additionalParams', value: ''), + ); }); } QueryBuilder apiUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'apiUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'apiUrl'), + ); }); } QueryBuilder apiUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'apiUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'apiUrl'), + ); }); } @@ -796,11 +758,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -810,12 +774,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -825,12 +791,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -842,14 +810,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'apiUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'apiUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -858,11 +828,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -871,69 +843,75 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder apiUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'apiUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'apiUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder apiUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'apiUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'apiUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder apiUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'apiUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'apiUrl', value: ''), + ); }); } QueryBuilder apiUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'apiUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'apiUrl', value: ''), + ); }); } QueryBuilder appMinVerReqIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'appMinVerReq', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'appMinVerReq'), + ); }); } QueryBuilder appMinVerReqIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'appMinVerReq', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'appMinVerReq'), + ); }); } @@ -942,11 +920,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -956,12 +936,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -971,12 +953,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -988,14 +972,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'appMinVerReq', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'appMinVerReq', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1004,11 +990,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1017,69 +1005,75 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder appMinVerReqContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'appMinVerReq', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'appMinVerReq', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder appMinVerReqMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'appMinVerReq', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'appMinVerReq', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder appMinVerReqIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'appMinVerReq', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'appMinVerReq', value: ''), + ); }); } QueryBuilder appMinVerReqIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'appMinVerReq', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'appMinVerReq', value: ''), + ); }); } QueryBuilder baseUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'baseUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'baseUrl'), + ); }); } QueryBuilder baseUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'baseUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'baseUrl'), + ); }); } @@ -1088,11 +1082,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1102,12 +1098,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1117,12 +1115,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1134,14 +1134,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'baseUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'baseUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1150,11 +1152,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1163,69 +1167,75 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder baseUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'baseUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'baseUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder baseUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'baseUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'baseUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder baseUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'baseUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'baseUrl', value: ''), + ); }); } QueryBuilder baseUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'baseUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'baseUrl', value: ''), + ); }); } QueryBuilder dateFormatIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dateFormat', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dateFormat'), + ); }); } QueryBuilder dateFormatIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dateFormat', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dateFormat'), + ); }); } @@ -1234,11 +1244,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1248,12 +1260,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1263,12 +1277,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1280,14 +1296,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dateFormat', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dateFormat', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1296,11 +1314,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1309,70 +1329,76 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dateFormat', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dateFormat', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dateFormat', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dateFormat', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormat', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dateFormat', value: ''), + ); }); } QueryBuilder dateFormatIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dateFormat', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dateFormat', value: ''), + ); }); } QueryBuilder dateFormatLocaleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'dateFormatLocale', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'dateFormatLocale'), + ); }); } QueryBuilder - dateFormatLocaleIsNotNull() { + dateFormatLocaleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'dateFormatLocale', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'dateFormatLocale'), + ); }); } @@ -1381,27 +1407,31 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dateFormatLocaleGreaterThan( + dateFormatLocaleGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1411,12 +1441,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1428,28 +1460,29 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'dateFormatLocale', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'dateFormatLocale', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dateFormatLocaleStartsWith( - String value, { - bool caseSensitive = true, - }) { + dateFormatLocaleStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1458,71 +1491,77 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatLocaleContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'dateFormatLocale', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'dateFormatLocale', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder dateFormatLocaleMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'dateFormatLocale', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'dateFormatLocale', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - dateFormatLocaleIsEmpty() { + dateFormatLocaleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'dateFormatLocale', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'dateFormatLocale', value: ''), + ); }); } QueryBuilder - dateFormatLocaleIsNotEmpty() { + dateFormatLocaleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'dateFormatLocale', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'dateFormatLocale', value: ''), + ); }); } QueryBuilder filterListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'filterList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'filterList'), + ); }); } QueryBuilder filterListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'filterList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'filterList'), + ); }); } @@ -1531,11 +1570,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1545,12 +1586,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1560,12 +1603,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1577,14 +1622,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'filterList', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'filterList', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1593,11 +1640,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1606,95 +1655,101 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder filterListContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'filterList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'filterList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder filterListMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'filterList', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'filterList', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder filterListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'filterList', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'filterList', value: ''), + ); }); } QueryBuilder filterListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'filterList', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'filterList', value: ''), + ); }); } QueryBuilder hasCloudflareIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hasCloudflare', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'hasCloudflare'), + ); }); } QueryBuilder hasCloudflareIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hasCloudflare', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'hasCloudflare'), + ); }); } QueryBuilder hasCloudflareEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hasCloudflare', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'hasCloudflare', value: value), + ); }); } QueryBuilder headersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'headers', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'headers'), + ); }); } QueryBuilder headersIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'headers', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'headers'), + ); }); } @@ -1703,11 +1758,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1717,12 +1774,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1732,12 +1791,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1749,14 +1810,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'headers', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'headers', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1765,11 +1828,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1778,69 +1843,75 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder headersContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'headers', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'headers', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder headersMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'headers', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'headers', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder headersIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'headers', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'headers', value: ''), + ); }); } QueryBuilder headersIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'headers', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'headers', value: ''), + ); }); } QueryBuilder iconUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'iconUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'iconUrl'), + ); }); } QueryBuilder iconUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'iconUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'iconUrl'), + ); }); } @@ -1849,11 +1920,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1863,12 +1936,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1878,12 +1953,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1895,14 +1972,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'iconUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'iconUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1911,11 +1990,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1924,78 +2005,83 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder iconUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'iconUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'iconUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder iconUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'iconUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'iconUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder iconUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'iconUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'iconUrl', value: ''), + ); }); } QueryBuilder iconUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'iconUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'iconUrl', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -2004,11 +2090,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2017,11 +2105,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2032,241 +2122,243 @@ extension SourceQueryFilter on QueryBuilder { 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 isActiveIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isActive', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isActive'), + ); }); } QueryBuilder isActiveIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isActive', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isActive'), + ); }); } QueryBuilder isActiveEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isActive', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isActive', value: value), + ); }); } QueryBuilder isAddedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isAdded', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isAdded'), + ); }); } QueryBuilder isAddedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isAdded', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isAdded'), + ); }); } QueryBuilder isAddedEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isAdded', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isAdded', value: value), + ); }); } QueryBuilder isFullDataIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isFullData', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isFullData'), + ); }); } QueryBuilder isFullDataIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isFullData', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isFullData'), + ); }); } QueryBuilder isFullDataEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isFullData', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isFullData', value: value), + ); }); } QueryBuilder isLocalIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isLocal', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isLocal'), + ); }); } QueryBuilder isLocalIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isLocal', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isLocal'), + ); }); } QueryBuilder isLocalEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isLocal', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isLocal', value: value), + ); }); } QueryBuilder 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 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 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 isNsfwIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isNsfw', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isNsfw'), + ); }); } QueryBuilder isNsfwIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isNsfw', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isNsfw'), + ); }); } QueryBuilder isNsfwEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isNsfw', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isNsfw', value: value), + ); }); } QueryBuilder isObsoleteIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isObsolete', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isObsolete'), + ); }); } QueryBuilder isObsoleteIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isObsolete', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isObsolete'), + ); }); } QueryBuilder isObsoleteEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isObsolete', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isObsolete', value: value), + ); }); } QueryBuilder isPinnedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isPinned', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'isPinned'), + ); }); } QueryBuilder isPinnedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isPinned', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'isPinned'), + ); }); } QueryBuilder isPinnedEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isPinned', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isPinned', value: value), + ); }); } QueryBuilder isTorrentEqualTo( - bool value) { + bool value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isTorrent', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'isTorrent', value: value), + ); }); } QueryBuilder 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), + ); }); } @@ -2275,11 +2367,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2288,11 +2382,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2303,29 +2399,31 @@ extension SourceQueryFilter on QueryBuilder { 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 langIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lang', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lang'), + ); }); } QueryBuilder langIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lang', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lang'), + ); }); } @@ -2334,11 +2432,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2348,12 +2448,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2363,12 +2465,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2380,14 +2484,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lang', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lang', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2396,11 +2502,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2409,94 +2517,101 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder langContains(String value, - {bool caseSensitive = true}) { + QueryBuilder langContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lang', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'lang', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder langMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lang', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'lang', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder langIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lang', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lang', value: ''), + ); }); } QueryBuilder langIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lang', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'lang', value: ''), + ); }); } QueryBuilder lastUsedIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastUsed', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastUsed'), + ); }); } QueryBuilder lastUsedIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastUsed', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastUsed'), + ); }); } QueryBuilder lastUsedEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastUsed', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastUsed', value: value), + ); }); } QueryBuilder 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 nameIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'name', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'name'), + ); }); } @@ -2505,11 +2620,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2519,12 +2636,14 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2534,12 +2653,14 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2551,14 +2672,16 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2567,11 +2690,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -2580,68 +2705,75 @@ extension SourceQueryFilter on QueryBuilder { 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 nameContains(String value, - {bool caseSensitive = true}) { + QueryBuilder nameContains( + 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 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 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 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 notesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'notes', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'notes'), + ); }); } QueryBuilder notesIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'notes', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'notes'), + ); }); } @@ -2650,11 +2782,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2664,12 +2798,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2679,12 +2815,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2696,14 +2834,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'notes', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'notes', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2712,11 +2852,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2725,70 +2867,76 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder notesContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'notes', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'notes', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder notesMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'notes', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'notes', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder notesIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'notes', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'notes', value: ''), + ); }); } QueryBuilder notesIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'notes', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'notes', value: ''), + ); }); } QueryBuilder preferenceListIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'preferenceList', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'preferenceList'), + ); }); } QueryBuilder - preferenceListIsNotNull() { + preferenceListIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'preferenceList', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'preferenceList'), + ); }); } @@ -2797,11 +2945,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2811,12 +2961,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2826,12 +2978,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2843,14 +2997,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'preferenceList', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'preferenceList', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2859,11 +3015,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2872,86 +3030,92 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder preferenceListContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'preferenceList', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'preferenceList', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder preferenceListMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'preferenceList', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'preferenceList', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder preferenceListIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'preferenceList', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'preferenceList', value: ''), + ); }); } QueryBuilder - preferenceListIsNotEmpty() { + preferenceListIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'preferenceList', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'preferenceList', value: ''), + ); }); } QueryBuilder repoIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'repo', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'repo'), + ); }); } QueryBuilder repoIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'repo', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'repo'), + ); }); } QueryBuilder sourceCodeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sourceCode', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sourceCode'), + ); }); } QueryBuilder sourceCodeIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sourceCode', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sourceCode'), + ); }); } @@ -2960,11 +3124,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2974,12 +3140,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -2989,12 +3157,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3006,14 +3176,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'sourceCode', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceCode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3022,11 +3194,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3035,91 +3209,98 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'sourceCode', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'sourceCode', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'sourceCode', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'sourceCode', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceCode', value: ''), + ); }); } QueryBuilder sourceCodeIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'sourceCode', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'sourceCode', value: ''), + ); }); } QueryBuilder sourceCodeLanguageEqualTo( - SourceCodeLanguage value) { + SourceCodeLanguage value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceCodeLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceCodeLanguage', value: value), + ); }); } QueryBuilder - sourceCodeLanguageGreaterThan( + sourceCodeLanguageGreaterThan( SourceCodeLanguage value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'sourceCodeLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceCodeLanguage', + value: value, + ), + ); }); } QueryBuilder - sourceCodeLanguageLessThan( - SourceCodeLanguage value, { - bool include = false, - }) { + sourceCodeLanguageLessThan(SourceCodeLanguage value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'sourceCodeLanguage', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceCodeLanguage', + value: value, + ), + ); }); } @@ -3130,29 +3311,31 @@ extension SourceQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'sourceCodeLanguage', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceCodeLanguage', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder sourceCodeUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'sourceCodeUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sourceCodeUrl'), + ); }); } QueryBuilder sourceCodeUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'sourceCodeUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sourceCodeUrl'), + ); }); } @@ -3161,11 +3344,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3175,12 +3360,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3190,12 +3377,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3207,14 +3396,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'sourceCodeUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceCodeUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3223,11 +3414,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3236,96 +3429,102 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'sourceCodeUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'sourceCodeUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'sourceCodeUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'sourceCodeUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder sourceCodeUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'sourceCodeUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceCodeUrl', value: ''), + ); }); } QueryBuilder - sourceCodeUrlIsNotEmpty() { + sourceCodeUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'sourceCodeUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'sourceCodeUrl', value: ''), + ); }); } QueryBuilder supportLatestIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'supportLatest', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'supportLatest'), + ); }); } QueryBuilder supportLatestIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'supportLatest', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'supportLatest'), + ); }); } QueryBuilder supportLatestEqualTo( - bool? value) { + bool? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'supportLatest', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'supportLatest', value: value), + ); }); } QueryBuilder typeSourceIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'typeSource', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'typeSource'), + ); }); } QueryBuilder typeSourceIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'typeSource', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'typeSource'), + ); }); } @@ -3334,11 +3533,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3348,12 +3549,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3363,12 +3566,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3380,14 +3585,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'typeSource', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'typeSource', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3396,11 +3603,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3409,79 +3618,85 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder typeSourceContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'typeSource', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'typeSource', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder typeSourceMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'typeSource', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'typeSource', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder typeSourceIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'typeSource', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'typeSource', value: ''), + ); }); } QueryBuilder typeSourceIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'typeSource', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'typeSource', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -3490,11 +3705,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -3503,11 +3720,13 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -3518,29 +3737,31 @@ extension SourceQueryFilter on QueryBuilder { 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, + ), + ); }); } QueryBuilder versionIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'version', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'version'), + ); }); } QueryBuilder versionIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'version', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'version'), + ); }); } @@ -3549,11 +3770,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3563,12 +3786,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3578,12 +3803,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3595,14 +3822,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'version', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'version', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3611,11 +3840,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3624,69 +3855,75 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'version', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'version', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'version', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'version', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'version', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'version', value: ''), + ); }); } QueryBuilder versionIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'version', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'version', value: ''), + ); }); } QueryBuilder versionLastIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'versionLast', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'versionLast'), + ); }); } QueryBuilder versionLastIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'versionLast', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'versionLast'), + ); }); } @@ -3695,11 +3932,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3709,12 +3948,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3724,12 +3965,14 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3741,14 +3984,16 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'versionLast', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'versionLast', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3757,11 +4002,13 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -3770,60 +4017,67 @@ extension SourceQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionLastContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'versionLast', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'versionLast', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionLastMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'versionLast', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'versionLast', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder versionLastIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'versionLast', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'versionLast', value: ''), + ); }); } QueryBuilder versionLastIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'versionLast', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'versionLast', value: ''), + ); }); } } extension SourceQueryObject on QueryBuilder { QueryBuilder repo( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.object(q, r'repo'); }); @@ -4641,52 +4895,63 @@ extension SourceQuerySortThenBy on QueryBuilder { } extension SourceQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByAdditionalParams( - {bool caseSensitive = true}) { + QueryBuilder distinctByAdditionalParams({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'additionalParams', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'additionalParams', + caseSensitive: caseSensitive, + ); }); } - QueryBuilder distinctByApiUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByApiUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'apiUrl', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByAppMinVerReq( - {bool caseSensitive = true}) { + QueryBuilder distinctByAppMinVerReq({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'appMinVerReq', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByBaseUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByBaseUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'baseUrl', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDateFormat( - {bool caseSensitive = true}) { + QueryBuilder distinctByDateFormat({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'dateFormat', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDateFormatLocale( - {bool caseSensitive = true}) { + QueryBuilder distinctByDateFormatLocale({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'dateFormatLocale', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'dateFormatLocale', + caseSensitive: caseSensitive, + ); }); } - QueryBuilder distinctByFilterList( - {bool caseSensitive = true}) { + QueryBuilder distinctByFilterList({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'filterList', caseSensitive: caseSensitive); }); @@ -4698,15 +4963,17 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByHeaders( - {bool caseSensitive = true}) { + QueryBuilder distinctByHeaders({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'headers', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByIconUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByIconUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'iconUrl', caseSensitive: caseSensitive); }); @@ -4772,8 +5039,9 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByLang( - {bool caseSensitive = true}) { + QueryBuilder distinctByLang({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lang', caseSensitive: caseSensitive); }); @@ -4785,30 +5053,36 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByName( - {bool caseSensitive = true}) { + QueryBuilder distinctByName({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'name', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByNotes( - {bool caseSensitive = true}) { + QueryBuilder distinctByNotes({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'notes', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByPreferenceList( - {bool caseSensitive = true}) { + QueryBuilder distinctByPreferenceList({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'preferenceList', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'preferenceList', + caseSensitive: caseSensitive, + ); }); } - QueryBuilder distinctBySourceCode( - {bool caseSensitive = true}) { + QueryBuilder distinctBySourceCode({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'sourceCode', caseSensitive: caseSensitive); }); @@ -4820,11 +5094,14 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctBySourceCodeUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctBySourceCodeUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'sourceCodeUrl', - caseSensitive: caseSensitive); + return query.addDistinctBy( + r'sourceCodeUrl', + caseSensitive: caseSensitive, + ); }); } @@ -4834,8 +5111,9 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByTypeSource( - {bool caseSensitive = true}) { + QueryBuilder distinctByTypeSource({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'typeSource', caseSensitive: caseSensitive); }); @@ -4847,15 +5125,17 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByVersion( - {bool caseSensitive = true}) { + QueryBuilder distinctByVersion({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'version', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByVersionLast( - {bool caseSensitive = true}) { + QueryBuilder distinctByVersionLast({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'versionLast', caseSensitive: caseSensitive); }); @@ -5032,7 +5312,7 @@ extension SourceQueryProperty on QueryBuilder { } QueryBuilder - sourceCodeLanguageProperty() { + sourceCodeLanguageProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'sourceCodeLanguage'); }); diff --git a/lib/models/sync_preference.g.dart b/lib/models/sync_preference.g.dart index 0efcbc0e..1248547c 100644 --- a/lib/models/sync_preference.g.dart +++ b/lib/models/sync_preference.g.dart @@ -27,11 +27,7 @@ const SyncPreferenceSchema = CollectionSchema( name: r'autoSyncFrequency', type: IsarType.long, ), - r'email': PropertySchema( - id: 2, - name: r'email', - type: IsarType.string, - ), + r'email': PropertySchema(id: 2, name: r'email', type: IsarType.string), r'lastSyncHistory': PropertySchema( id: 3, name: r'lastSyncHistory', @@ -47,21 +43,13 @@ const SyncPreferenceSchema = CollectionSchema( name: r'lastSyncUpdate', type: IsarType.long, ), - r'server': PropertySchema( - id: 6, - name: r'server', - type: IsarType.string, - ), + r'server': PropertySchema(id: 6, name: r'server', type: IsarType.string), r'syncHistories': PropertySchema( id: 7, name: r'syncHistories', type: IsarType.bool, ), - r'syncOn': PropertySchema( - id: 8, - name: r'syncOn', - type: IsarType.bool, - ), + r'syncOn': PropertySchema(id: 8, name: r'syncOn', type: IsarType.bool), r'syncSettings': PropertySchema( id: 9, name: r'syncSettings', @@ -71,8 +59,9 @@ const SyncPreferenceSchema = CollectionSchema( id: 10, name: r'syncUpdates', type: IsarType.bool, - ) + ), }, + estimateSize: _syncPreferenceEstimateSize, serialize: _syncPreferenceSerialize, deserialize: _syncPreferenceDeserialize, @@ -81,6 +70,7 @@ const SyncPreferenceSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {}, + getId: _syncPreferenceGetId, getLinks: _syncPreferenceGetLinks, attach: _syncPreferenceAttach, @@ -199,7 +189,10 @@ List> _syncPreferenceGetLinks(SyncPreference object) { } void _syncPreferenceAttach( - IsarCollection col, Id id, SyncPreference object) { + IsarCollection col, + Id id, + SyncPreference object, +) { object.syncId = id; } @@ -215,17 +208,17 @@ extension SyncPreferenceQueryWhereSort extension SyncPreferenceQueryWhere on QueryBuilder { QueryBuilder syncIdEqualTo( - Id syncId) { + Id syncId, + ) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: syncId, - upper: syncId, - )); + return query.addWhereClause( + IdWhereClause.between(lower: syncId, upper: syncId), + ); }); } QueryBuilder - syncIdNotEqualTo(Id syncId) { + syncIdNotEqualTo(Id syncId) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -248,7 +241,7 @@ extension SyncPreferenceQueryWhere } QueryBuilder - syncIdGreaterThan(Id syncId, {bool include = false}) { + syncIdGreaterThan(Id syncId, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: syncId, includeLower: include), @@ -257,7 +250,7 @@ extension SyncPreferenceQueryWhere } QueryBuilder - syncIdLessThan(Id syncId, {bool include = false}) { + syncIdLessThan(Id syncId, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: syncId, includeUpper: include), @@ -272,12 +265,14 @@ extension SyncPreferenceQueryWhere bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: lowerSyncId, - includeLower: includeLower, - upper: upperSyncId, - includeUpper: includeUpper, - )); + return query.addWhereClause( + IdWhereClause.between( + lower: lowerSyncId, + includeLower: includeLower, + upper: upperSyncId, + includeUpper: includeUpper, + ), + ); }); } } @@ -285,71 +280,74 @@ extension SyncPreferenceQueryWhere extension SyncPreferenceQueryFilter on QueryBuilder { QueryBuilder - authTokenIsNull() { + authTokenIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'authToken', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'authToken'), + ); }); } QueryBuilder - authTokenIsNotNull() { + authTokenIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'authToken', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'authToken'), + ); }); } QueryBuilder - authTokenEqualTo( - String? value, { - bool caseSensitive = true, - }) { + authTokenEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenGreaterThan( + authTokenGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenLessThan( + authTokenLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenBetween( + authTokenBetween( String? lower, String? upper, { bool includeLower = true, @@ -357,209 +355,213 @@ extension SyncPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'authToken', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'authToken', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenStartsWith( - String value, { - bool caseSensitive = true, - }) { + authTokenStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenEndsWith( - String value, { - bool caseSensitive = true, - }) { + authTokenEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenContains(String value, {bool caseSensitive = true}) { + authTokenContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'authToken', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'authToken', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenMatches(String pattern, {bool caseSensitive = true}) { + authTokenMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'authToken', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'authToken', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - authTokenIsEmpty() { + authTokenIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'authToken', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'authToken', value: ''), + ); }); } QueryBuilder - authTokenIsNotEmpty() { + authTokenIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'authToken', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'authToken', value: ''), + ); }); } QueryBuilder - autoSyncFrequencyEqualTo(int value) { + autoSyncFrequencyEqualTo(int value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'autoSyncFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'autoSyncFrequency', value: value), + ); }); } QueryBuilder - autoSyncFrequencyGreaterThan( - int value, { - bool include = false, - }) { + autoSyncFrequencyGreaterThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'autoSyncFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'autoSyncFrequency', + value: value, + ), + ); }); } QueryBuilder - autoSyncFrequencyLessThan( - int value, { - bool include = false, - }) { + autoSyncFrequencyLessThan(int value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'autoSyncFrequency', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'autoSyncFrequency', + value: value, + ), + ); }); } QueryBuilder - autoSyncFrequencyBetween( + autoSyncFrequencyBetween( int lower, int upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'autoSyncFrequency', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'autoSyncFrequency', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - emailIsNull() { + emailIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'email', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'email'), + ); }); } QueryBuilder - emailIsNotNull() { + emailIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'email', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'email'), + ); }); } QueryBuilder - emailEqualTo( - String? value, { - bool caseSensitive = true, - }) { + emailEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailGreaterThan( + emailGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailLessThan( + emailLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailBetween( + emailBetween( String? lower, String? upper, { bool includeLower = true, @@ -567,375 +569,377 @@ extension SyncPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'email', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'email', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailStartsWith( - String value, { - bool caseSensitive = true, - }) { + emailStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailEndsWith( - String value, { - bool caseSensitive = true, - }) { + emailEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailContains(String value, {bool caseSensitive = true}) { + emailContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'email', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'email', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailMatches(String pattern, {bool caseSensitive = true}) { + emailMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'email', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'email', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - emailIsEmpty() { + emailIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'email', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'email', value: ''), + ); }); } QueryBuilder - emailIsNotEmpty() { + emailIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'email', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'email', value: ''), + ); }); } QueryBuilder - lastSyncHistoryIsNull() { + lastSyncHistoryIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastSyncHistory', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastSyncHistory'), + ); }); } QueryBuilder - lastSyncHistoryIsNotNull() { + lastSyncHistoryIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastSyncHistory', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastSyncHistory'), + ); }); } QueryBuilder - lastSyncHistoryEqualTo(int? value) { + lastSyncHistoryEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastSyncHistory', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastSyncHistory', value: value), + ); }); } QueryBuilder - lastSyncHistoryGreaterThan( - int? value, { - bool include = false, - }) { + lastSyncHistoryGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastSyncHistory', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastSyncHistory', + value: value, + ), + ); }); } QueryBuilder - lastSyncHistoryLessThan( - int? value, { - bool include = false, - }) { + lastSyncHistoryLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastSyncHistory', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastSyncHistory', + value: value, + ), + ); }); } QueryBuilder - lastSyncHistoryBetween( + lastSyncHistoryBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastSyncHistory', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastSyncHistory', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - lastSyncMangaIsNull() { + lastSyncMangaIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastSyncManga', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastSyncManga'), + ); }); } QueryBuilder - lastSyncMangaIsNotNull() { + lastSyncMangaIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastSyncManga', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastSyncManga'), + ); }); } QueryBuilder - lastSyncMangaEqualTo(int? value) { + lastSyncMangaEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastSyncManga', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastSyncManga', value: value), + ); }); } QueryBuilder - lastSyncMangaGreaterThan( - int? value, { - bool include = false, - }) { + lastSyncMangaGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastSyncManga', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastSyncManga', + value: value, + ), + ); }); } QueryBuilder - lastSyncMangaLessThan( - int? value, { - bool include = false, - }) { + lastSyncMangaLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastSyncManga', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastSyncManga', + value: value, + ), + ); }); } QueryBuilder - lastSyncMangaBetween( + lastSyncMangaBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastSyncManga', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastSyncManga', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - lastSyncUpdateIsNull() { + lastSyncUpdateIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastSyncUpdate', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastSyncUpdate'), + ); }); } QueryBuilder - lastSyncUpdateIsNotNull() { + lastSyncUpdateIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastSyncUpdate', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastSyncUpdate'), + ); }); } QueryBuilder - lastSyncUpdateEqualTo(int? value) { + lastSyncUpdateEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastSyncUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastSyncUpdate', value: value), + ); }); } QueryBuilder - lastSyncUpdateGreaterThan( - int? value, { - bool include = false, - }) { + lastSyncUpdateGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastSyncUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastSyncUpdate', + value: value, + ), + ); }); } QueryBuilder - lastSyncUpdateLessThan( - int? value, { - bool include = false, - }) { + lastSyncUpdateLessThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastSyncUpdate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastSyncUpdate', + value: value, + ), + ); }); } QueryBuilder - lastSyncUpdateBetween( + lastSyncUpdateBetween( int? lower, int? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastSyncUpdate', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastSyncUpdate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - serverIsNull() { + serverIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'server', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'server'), + ); }); } QueryBuilder - serverIsNotNull() { + serverIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'server', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'server'), + ); }); } QueryBuilder - serverEqualTo( - String? value, { - bool caseSensitive = true, - }) { + serverEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverGreaterThan( + serverGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverLessThan( + serverLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverBetween( + serverBetween( String? lower, String? upper, { bool includeLower = true, @@ -943,198 +947,195 @@ extension SyncPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'server', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'server', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverStartsWith( - String value, { - bool caseSensitive = true, - }) { + serverStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverEndsWith( - String value, { - bool caseSensitive = true, - }) { + serverEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverContains(String value, {bool caseSensitive = true}) { + serverContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'server', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'server', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverMatches(String pattern, {bool caseSensitive = true}) { + serverMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'server', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'server', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - serverIsEmpty() { + serverIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'server', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'server', value: ''), + ); }); } QueryBuilder - serverIsNotEmpty() { + serverIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'server', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'server', value: ''), + ); }); } QueryBuilder - syncHistoriesEqualTo(bool value) { + syncHistoriesEqualTo(bool value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncHistories', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncHistories', value: value), + ); }); } QueryBuilder - syncIdIsNull() { + syncIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'syncId'), + ); }); } QueryBuilder - syncIdIsNotNull() { + syncIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'syncId'), + ); }); } QueryBuilder - syncIdEqualTo(Id? value) { + syncIdEqualTo(Id? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncId', value: value), + ); }); } QueryBuilder - syncIdGreaterThan( - Id? value, { - bool include = false, - }) { + syncIdGreaterThan(Id? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } QueryBuilder - syncIdLessThan( - Id? value, { - bool include = false, - }) { + syncIdLessThan(Id? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } QueryBuilder - syncIdBetween( + syncIdBetween( Id? lower, Id? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'syncId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'syncId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - syncOnEqualTo(bool value) { + syncOnEqualTo(bool value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncOn', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncOn', value: value), + ); }); } QueryBuilder - syncSettingsEqualTo(bool value) { + syncSettingsEqualTo(bool value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncSettings', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncSettings', value: value), + ); }); } QueryBuilder - syncUpdatesEqualTo(bool value) { + syncUpdatesEqualTo(bool value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncUpdates', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncUpdates', value: value), + ); }); } } @@ -1154,21 +1155,21 @@ extension SyncPreferenceQuerySortBy } QueryBuilder - sortByAuthTokenDesc() { + sortByAuthTokenDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'authToken', Sort.desc); }); } QueryBuilder - sortByAutoSyncFrequency() { + sortByAutoSyncFrequency() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoSyncFrequency', Sort.asc); }); } QueryBuilder - sortByAutoSyncFrequencyDesc() { + sortByAutoSyncFrequencyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoSyncFrequency', Sort.desc); }); @@ -1187,42 +1188,42 @@ extension SyncPreferenceQuerySortBy } QueryBuilder - sortByLastSyncHistory() { + sortByLastSyncHistory() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncHistory', Sort.asc); }); } QueryBuilder - sortByLastSyncHistoryDesc() { + sortByLastSyncHistoryDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncHistory', Sort.desc); }); } QueryBuilder - sortByLastSyncManga() { + sortByLastSyncManga() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncManga', Sort.asc); }); } QueryBuilder - sortByLastSyncMangaDesc() { + sortByLastSyncMangaDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncManga', Sort.desc); }); } QueryBuilder - sortByLastSyncUpdate() { + sortByLastSyncUpdate() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncUpdate', Sort.asc); }); } QueryBuilder - sortByLastSyncUpdateDesc() { + sortByLastSyncUpdateDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncUpdate', Sort.desc); }); @@ -1235,21 +1236,21 @@ extension SyncPreferenceQuerySortBy } QueryBuilder - sortByServerDesc() { + sortByServerDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'server', Sort.desc); }); } QueryBuilder - sortBySyncHistories() { + sortBySyncHistories() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncHistories', Sort.asc); }); } QueryBuilder - sortBySyncHistoriesDesc() { + sortBySyncHistoriesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncHistories', Sort.desc); }); @@ -1262,35 +1263,35 @@ extension SyncPreferenceQuerySortBy } QueryBuilder - sortBySyncOnDesc() { + sortBySyncOnDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncOn', Sort.desc); }); } QueryBuilder - sortBySyncSettings() { + sortBySyncSettings() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncSettings', Sort.asc); }); } QueryBuilder - sortBySyncSettingsDesc() { + sortBySyncSettingsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncSettings', Sort.desc); }); } QueryBuilder - sortBySyncUpdates() { + sortBySyncUpdates() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncUpdates', Sort.asc); }); } QueryBuilder - sortBySyncUpdatesDesc() { + sortBySyncUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncUpdates', Sort.desc); }); @@ -1306,21 +1307,21 @@ extension SyncPreferenceQuerySortThenBy } QueryBuilder - thenByAuthTokenDesc() { + thenByAuthTokenDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'authToken', Sort.desc); }); } QueryBuilder - thenByAutoSyncFrequency() { + thenByAutoSyncFrequency() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoSyncFrequency', Sort.asc); }); } QueryBuilder - thenByAutoSyncFrequencyDesc() { + thenByAutoSyncFrequencyDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoSyncFrequency', Sort.desc); }); @@ -1339,42 +1340,42 @@ extension SyncPreferenceQuerySortThenBy } QueryBuilder - thenByLastSyncHistory() { + thenByLastSyncHistory() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncHistory', Sort.asc); }); } QueryBuilder - thenByLastSyncHistoryDesc() { + thenByLastSyncHistoryDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncHistory', Sort.desc); }); } QueryBuilder - thenByLastSyncManga() { + thenByLastSyncManga() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncManga', Sort.asc); }); } QueryBuilder - thenByLastSyncMangaDesc() { + thenByLastSyncMangaDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncManga', Sort.desc); }); } QueryBuilder - thenByLastSyncUpdate() { + thenByLastSyncUpdate() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncUpdate', Sort.asc); }); } QueryBuilder - thenByLastSyncUpdateDesc() { + thenByLastSyncUpdateDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastSyncUpdate', Sort.desc); }); @@ -1387,21 +1388,21 @@ extension SyncPreferenceQuerySortThenBy } QueryBuilder - thenByServerDesc() { + thenByServerDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'server', Sort.desc); }); } QueryBuilder - thenBySyncHistories() { + thenBySyncHistories() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncHistories', Sort.asc); }); } QueryBuilder - thenBySyncHistoriesDesc() { + thenBySyncHistoriesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncHistories', Sort.desc); }); @@ -1414,7 +1415,7 @@ extension SyncPreferenceQuerySortThenBy } QueryBuilder - thenBySyncIdDesc() { + thenBySyncIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncId', Sort.desc); }); @@ -1427,35 +1428,35 @@ extension SyncPreferenceQuerySortThenBy } QueryBuilder - thenBySyncOnDesc() { + thenBySyncOnDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncOn', Sort.desc); }); } QueryBuilder - thenBySyncSettings() { + thenBySyncSettings() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncSettings', Sort.asc); }); } QueryBuilder - thenBySyncSettingsDesc() { + thenBySyncSettingsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncSettings', Sort.desc); }); } QueryBuilder - thenBySyncUpdates() { + thenBySyncUpdates() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncUpdates', Sort.asc); }); } QueryBuilder - thenBySyncUpdatesDesc() { + thenBySyncUpdatesDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncUpdates', Sort.desc); }); @@ -1464,57 +1465,60 @@ extension SyncPreferenceQuerySortThenBy extension SyncPreferenceQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByAuthToken( - {bool caseSensitive = true}) { + QueryBuilder distinctByAuthToken({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'authToken', caseSensitive: caseSensitive); }); } QueryBuilder - distinctByAutoSyncFrequency() { + distinctByAutoSyncFrequency() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'autoSyncFrequency'); }); } - QueryBuilder distinctByEmail( - {bool caseSensitive = true}) { + QueryBuilder distinctByEmail({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'email', caseSensitive: caseSensitive); }); } QueryBuilder - distinctByLastSyncHistory() { + distinctByLastSyncHistory() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastSyncHistory'); }); } QueryBuilder - distinctByLastSyncManga() { + distinctByLastSyncManga() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastSyncManga'); }); } QueryBuilder - distinctByLastSyncUpdate() { + distinctByLastSyncUpdate() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastSyncUpdate'); }); } - QueryBuilder distinctByServer( - {bool caseSensitive = true}) { + QueryBuilder distinctByServer({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'server', caseSensitive: caseSensitive); }); } QueryBuilder - distinctBySyncHistories() { + distinctBySyncHistories() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'syncHistories'); }); @@ -1527,14 +1531,14 @@ extension SyncPreferenceQueryWhereDistinct } QueryBuilder - distinctBySyncSettings() { + distinctBySyncSettings() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'syncSettings'); }); } QueryBuilder - distinctBySyncUpdates() { + distinctBySyncUpdates() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'syncUpdates'); }); @@ -1556,7 +1560,7 @@ extension SyncPreferenceQueryProperty } QueryBuilder - autoSyncFrequencyProperty() { + autoSyncFrequencyProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'autoSyncFrequency'); }); @@ -1569,7 +1573,7 @@ extension SyncPreferenceQueryProperty } QueryBuilder - lastSyncHistoryProperty() { + lastSyncHistoryProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lastSyncHistory'); }); @@ -1582,7 +1586,7 @@ extension SyncPreferenceQueryProperty } QueryBuilder - lastSyncUpdateProperty() { + lastSyncUpdateProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lastSyncUpdate'); }); diff --git a/lib/models/track.g.dart b/lib/models/track.g.dart index d4c66669..c5602505 100644 --- a/lib/models/track.g.dart +++ b/lib/models/track.g.dart @@ -22,11 +22,7 @@ const TrackSchema = CollectionSchema( name: r'finishedReadingDate', type: IsarType.long, ), - r'isManga': PropertySchema( - id: 1, - name: r'isManga', - type: IsarType.bool, - ), + r'isManga': PropertySchema(id: 1, name: r'isManga', type: IsarType.bool), r'itemType': PropertySchema( id: 2, name: r'itemType', @@ -43,21 +39,9 @@ const TrackSchema = CollectionSchema( name: r'libraryId', type: IsarType.long, ), - r'mangaId': PropertySchema( - id: 5, - name: r'mangaId', - type: IsarType.long, - ), - r'mediaId': PropertySchema( - id: 6, - name: r'mediaId', - type: IsarType.long, - ), - r'score': PropertySchema( - id: 7, - name: r'score', - type: IsarType.long, - ), + r'mangaId': PropertySchema(id: 5, name: r'mangaId', type: IsarType.long), + r'mediaId': PropertySchema(id: 6, name: r'mediaId', type: IsarType.long), + r'score': PropertySchema(id: 7, name: r'score', type: IsarType.long), r'startedReadingDate': PropertySchema( id: 8, name: r'startedReadingDate', @@ -69,16 +53,8 @@ const TrackSchema = CollectionSchema( type: IsarType.byte, enumMap: _TrackstatusEnumValueMap, ), - r'syncId': PropertySchema( - id: 10, - name: r'syncId', - type: IsarType.long, - ), - r'title': PropertySchema( - id: 11, - name: r'title', - type: IsarType.string, - ), + r'syncId': PropertySchema(id: 10, name: r'syncId', type: IsarType.long), + r'title': PropertySchema(id: 11, name: r'title', type: IsarType.string), r'totalChapter': PropertySchema( id: 12, name: r'totalChapter', @@ -93,8 +69,9 @@ const TrackSchema = CollectionSchema( id: 14, name: r'updatedAt', type: IsarType.long, - ) + ), }, + estimateSize: _trackEstimateSize, serialize: _trackSerialize, deserialize: _trackDeserialize, @@ -103,6 +80,7 @@ const TrackSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {}, + getId: _trackGetId, getLinks: _trackGetLinks, attach: _trackAttach, @@ -163,7 +141,8 @@ Track _trackDeserialize( finishedReadingDate: reader.readLongOrNull(offsets[0]), id: id, isManga: reader.readBoolOrNull(offsets[1]), - itemType: _TrackitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + itemType: + _TrackitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? ItemType.manga, lastChapterRead: reader.readLongOrNull(offsets[3]), libraryId: reader.readLongOrNull(offsets[4]), @@ -171,7 +150,8 @@ Track _trackDeserialize( mediaId: reader.readLongOrNull(offsets[6]), score: reader.readLongOrNull(offsets[7]), startedReadingDate: reader.readLongOrNull(offsets[8]), - status: _TrackstatusValueEnumMap[reader.readByteOrNull(offsets[9])] ?? + status: + _TrackstatusValueEnumMap[reader.readByteOrNull(offsets[9])] ?? TrackStatus.reading, syncId: reader.readLongOrNull(offsets[10]), title: reader.readStringOrNull(offsets[11]), @@ -195,7 +175,8 @@ P _trackDeserializeProp

    ( return (reader.readBoolOrNull(offset)) as P; case 2: return (_TrackitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ItemType.manga) as P; + ItemType.manga) + as P; case 3: return (reader.readLongOrNull(offset)) as P; case 4: @@ -210,7 +191,8 @@ P _trackDeserializeProp

    ( return (reader.readLongOrNull(offset)) as P; case 9: return (_TrackstatusValueEnumMap[reader.readByteOrNull(offset)] ?? - TrackStatus.reading) as P; + TrackStatus.reading) + as P; case 10: return (reader.readLongOrNull(offset)) as P; case 11: @@ -226,11 +208,7 @@ P _trackDeserializeProp

    ( } } -const _TrackitemTypeEnumValueMap = { - 'manga': 0, - 'anime': 1, - 'novel': 2, -}; +const _TrackitemTypeEnumValueMap = {'manga': 0, 'anime': 1, 'novel': 2}; const _TrackitemTypeValueEnumMap = { 0: ItemType.manga, 1: ItemType.anime, @@ -282,10 +260,7 @@ extension TrackQueryWhereSort on QueryBuilder { extension TrackQueryWhere on QueryBuilder { QueryBuilder 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)); }); } @@ -311,8 +286,10 @@ extension TrackQueryWhere on QueryBuilder { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder idGreaterThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: id, includeLower: include), @@ -320,8 +297,10 @@ extension TrackQueryWhere on QueryBuilder { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder idLessThan( + Id id, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: id, includeUpper: include), @@ -336,56 +315,57 @@ extension TrackQueryWhere on QueryBuilder { 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, + ), + ); }); } } extension TrackQueryFilter on QueryBuilder { QueryBuilder - finishedReadingDateIsNull() { + finishedReadingDateIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'finishedReadingDate', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'finishedReadingDate'), + ); }); } QueryBuilder - finishedReadingDateIsNotNull() { + finishedReadingDateIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'finishedReadingDate', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'finishedReadingDate'), + ); }); } QueryBuilder finishedReadingDateEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'finishedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'finishedReadingDate', value: value), + ); }); } QueryBuilder - finishedReadingDateGreaterThan( - int? value, { - bool include = false, - }) { + finishedReadingDateGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'finishedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'finishedReadingDate', + value: value, + ), + ); }); } @@ -394,11 +374,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'finishedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'finishedReadingDate', + value: value, + ), + ); }); } @@ -409,38 +391,39 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'finishedReadingDate', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'finishedReadingDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -449,11 +432,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -462,11 +447,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -477,49 +464,51 @@ extension TrackQueryFilter on QueryBuilder { 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 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 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 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 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), + ); }); } @@ -528,11 +517,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -541,11 +532,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -556,39 +549,41 @@ extension TrackQueryFilter on QueryBuilder { 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 lastChapterReadIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastChapterRead', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'lastChapterRead'), + ); }); } QueryBuilder lastChapterReadIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastChapterRead', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'lastChapterRead'), + ); }); } QueryBuilder lastChapterReadEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastChapterRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'lastChapterRead', value: value), + ); }); } @@ -597,11 +592,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastChapterRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'lastChapterRead', + value: value, + ), + ); }); } @@ -610,11 +607,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastChapterRead', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'lastChapterRead', + value: value, + ), + ); }); } @@ -625,39 +624,41 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastChapterRead', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'lastChapterRead', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder libraryIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'libraryId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'libraryId'), + ); }); } QueryBuilder libraryIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'libraryId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'libraryId'), + ); }); } QueryBuilder libraryIdEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'libraryId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'libraryId', value: value), + ); }); } @@ -666,11 +667,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'libraryId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'libraryId', + value: value, + ), + ); }); } @@ -679,11 +682,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'libraryId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'libraryId', + value: value, + ), + ); }); } @@ -694,38 +699,39 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'libraryId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'libraryId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder 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 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 mangaIdEqualTo(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), + ); }); } @@ -734,11 +740,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -747,11 +755,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -762,38 +772,39 @@ extension TrackQueryFilter on QueryBuilder { 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 mediaIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mediaId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'mediaId'), + ); }); } QueryBuilder mediaIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mediaId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'mediaId'), + ); }); } QueryBuilder mediaIdEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mediaId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'mediaId', value: value), + ); }); } @@ -802,11 +813,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mediaId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'mediaId', + value: value, + ), + ); }); } @@ -815,11 +828,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mediaId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'mediaId', + value: value, + ), + ); }); } @@ -830,38 +845,39 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mediaId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'mediaId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder scoreIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'score', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'score'), + ); }); } QueryBuilder scoreIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'score', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'score'), + ); }); } QueryBuilder scoreEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'score', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'score', value: value), + ); }); } @@ -870,11 +886,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'score', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'score', + value: value, + ), + ); }); } @@ -883,11 +901,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'score', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'score', + value: value, + ), + ); }); } @@ -898,54 +918,55 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'score', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'score', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder startedReadingDateIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'startedReadingDate', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'startedReadingDate'), + ); }); } QueryBuilder - startedReadingDateIsNotNull() { + startedReadingDateIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'startedReadingDate', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'startedReadingDate'), + ); }); } QueryBuilder startedReadingDateEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'startedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'startedReadingDate', value: value), + ); }); } QueryBuilder - startedReadingDateGreaterThan( - int? value, { - bool include = false, - }) { + startedReadingDateGreaterThan(int? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'startedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'startedReadingDate', + value: value, + ), + ); }); } @@ -954,11 +975,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'startedReadingDate', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'startedReadingDate', + value: value, + ), + ); }); } @@ -969,23 +992,25 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'startedReadingDate', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'startedReadingDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder statusEqualTo( - TrackStatus value) { + TrackStatus value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'status', value: value), + ); }); } @@ -994,11 +1019,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'status', + value: value, + ), + ); }); } @@ -1007,11 +1034,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'status', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'status', + value: value, + ), + ); }); } @@ -1022,38 +1051,39 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'status', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'status', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder syncIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'syncId'), + ); }); } QueryBuilder syncIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'syncId'), + ); }); } QueryBuilder syncIdEqualTo(int? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncId', value: value), + ); }); } @@ -1062,11 +1092,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } @@ -1075,11 +1107,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } @@ -1090,29 +1124,31 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'syncId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'syncId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder titleIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'title'), + ); }); } QueryBuilder titleIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'title', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'title'), + ); }); } @@ -1121,11 +1157,13 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1135,12 +1173,14 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1150,12 +1190,14 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1167,14 +1209,16 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'title', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1183,11 +1227,13 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1196,77 +1242,85 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleContains(String value, - {bool caseSensitive = true}) { + QueryBuilder titleContains( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'title', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } - QueryBuilder titleMatches(String pattern, - {bool caseSensitive = true}) { + QueryBuilder titleMatches( + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'title', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder titleIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'title', value: ''), + ); }); } QueryBuilder titleIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'title', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'title', value: ''), + ); }); } QueryBuilder totalChapterIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'totalChapter', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'totalChapter'), + ); }); } QueryBuilder totalChapterIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'totalChapter', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'totalChapter'), + ); }); } QueryBuilder totalChapterEqualTo( - int? value) { + int? value, + ) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'totalChapter', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'totalChapter', value: value), + ); }); } @@ -1275,11 +1329,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'totalChapter', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'totalChapter', + value: value, + ), + ); }); } @@ -1288,11 +1344,13 @@ extension TrackQueryFilter on QueryBuilder { bool include = false, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'totalChapter', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'totalChapter', + value: value, + ), + ); }); } @@ -1303,29 +1361,31 @@ extension TrackQueryFilter on QueryBuilder { bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'totalChapter', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'totalChapter', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder trackingUrlIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'trackingUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'trackingUrl'), + ); }); } QueryBuilder trackingUrlIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'trackingUrl', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'trackingUrl'), + ); }); } @@ -1334,11 +1394,13 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1348,12 +1410,14 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1363,12 +1427,14 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1380,14 +1446,16 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'trackingUrl', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'trackingUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1396,11 +1464,13 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } @@ -1409,79 +1479,85 @@ extension TrackQueryFilter on QueryBuilder { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder trackingUrlContains( - String value, - {bool caseSensitive = true}) { + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'trackingUrl', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'trackingUrl', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder trackingUrlMatches( - String pattern, - {bool caseSensitive = true}) { + String pattern, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'trackingUrl', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'trackingUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder trackingUrlIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'trackingUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'trackingUrl', value: ''), + ); }); } QueryBuilder trackingUrlIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'trackingUrl', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'trackingUrl', value: ''), + ); }); } QueryBuilder 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 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 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), + ); }); } @@ -1490,11 +1566,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -1503,11 +1581,13 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } @@ -1518,13 +1598,15 @@ extension TrackQueryFilter on QueryBuilder { 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, + ), + ); }); } } @@ -1976,8 +2058,9 @@ extension TrackQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByTitle( - {bool caseSensitive = true}) { + QueryBuilder distinctByTitle({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'title', caseSensitive: caseSensitive); }); @@ -1989,8 +2072,9 @@ extension TrackQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByTrackingUrl( - {bool caseSensitive = true}) { + QueryBuilder distinctByTrackingUrl({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'trackingUrl', caseSensitive: caseSensitive); }); diff --git a/lib/models/track_preference.g.dart b/lib/models/track_preference.g.dart index 4262e332..cb1c8491 100644 --- a/lib/models/track_preference.g.dart +++ b/lib/models/track_preference.g.dart @@ -17,22 +17,15 @@ const TrackPreferenceSchema = CollectionSchema( name: r'Track Preference', id: -7260395670212271073, properties: { - r'oAuth': PropertySchema( - id: 0, - name: r'oAuth', - type: IsarType.string, - ), - r'prefs': PropertySchema( - id: 1, - name: r'prefs', - type: IsarType.string, - ), + r'oAuth': PropertySchema(id: 0, name: r'oAuth', type: IsarType.string), + r'prefs': PropertySchema(id: 1, name: r'prefs', type: IsarType.string), r'username': PropertySchema( id: 2, name: r'username', type: IsarType.string, - ) + ), }, + estimateSize: _trackPreferenceEstimateSize, serialize: _trackPreferenceSerialize, deserialize: _trackPreferenceDeserialize, @@ -41,6 +34,7 @@ const TrackPreferenceSchema = CollectionSchema( indexes: {}, links: {}, embeddedSchemas: {}, + getId: _trackPreferenceGetId, getLinks: _trackPreferenceGetLinks, attach: _trackPreferenceAttach, @@ -127,7 +121,10 @@ List> _trackPreferenceGetLinks(TrackPreference object) { } void _trackPreferenceAttach( - IsarCollection col, Id id, TrackPreference object) { + IsarCollection col, + Id id, + TrackPreference object, +) { object.syncId = id; } @@ -143,17 +140,16 @@ extension TrackPreferenceQueryWhereSort extension TrackPreferenceQueryWhere on QueryBuilder { QueryBuilder - syncIdEqualTo(Id syncId) { + syncIdEqualTo(Id syncId) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: syncId, - upper: syncId, - )); + return query.addWhereClause( + IdWhereClause.between(lower: syncId, upper: syncId), + ); }); } QueryBuilder - syncIdNotEqualTo(Id syncId) { + syncIdNotEqualTo(Id syncId) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query @@ -176,7 +172,7 @@ extension TrackPreferenceQueryWhere } QueryBuilder - syncIdGreaterThan(Id syncId, {bool include = false}) { + syncIdGreaterThan(Id syncId, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.greaterThan(lower: syncId, includeLower: include), @@ -185,7 +181,7 @@ extension TrackPreferenceQueryWhere } QueryBuilder - syncIdLessThan(Id syncId, {bool include = false}) { + syncIdLessThan(Id syncId, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( IdWhereClause.lessThan(upper: syncId, includeUpper: include), @@ -194,19 +190,21 @@ extension TrackPreferenceQueryWhere } QueryBuilder - syncIdBetween( + syncIdBetween( Id lowerSyncId, Id upperSyncId, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: lowerSyncId, - includeLower: includeLower, - upper: upperSyncId, - includeUpper: includeUpper, - )); + return query.addWhereClause( + IdWhereClause.between( + lower: lowerSyncId, + includeLower: includeLower, + upper: upperSyncId, + includeUpper: includeUpper, + ), + ); }); } } @@ -214,71 +212,74 @@ extension TrackPreferenceQueryWhere extension TrackPreferenceQueryFilter on QueryBuilder { QueryBuilder - oAuthIsNull() { + oAuthIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'oAuth', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'oAuth'), + ); }); } QueryBuilder - oAuthIsNotNull() { + oAuthIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'oAuth', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'oAuth'), + ); }); } QueryBuilder - oAuthEqualTo( - String? value, { - bool caseSensitive = true, - }) { + oAuthEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthGreaterThan( + oAuthGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthLessThan( + oAuthLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthBetween( + oAuthBetween( String? lower, String? upper, { bool includeLower = true, @@ -286,153 +287,158 @@ extension TrackPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'oAuth', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'oAuth', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthStartsWith( - String value, { - bool caseSensitive = true, - }) { + oAuthStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthEndsWith( - String value, { - bool caseSensitive = true, - }) { + oAuthEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthContains(String value, {bool caseSensitive = true}) { + oAuthContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'oAuth', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'oAuth', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthMatches(String pattern, {bool caseSensitive = true}) { + oAuthMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'oAuth', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'oAuth', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - oAuthIsEmpty() { + oAuthIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'oAuth', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'oAuth', value: ''), + ); }); } QueryBuilder - oAuthIsNotEmpty() { + oAuthIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'oAuth', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'oAuth', value: ''), + ); }); } QueryBuilder - prefsIsNull() { + prefsIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'prefs', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'prefs'), + ); }); } QueryBuilder - prefsIsNotNull() { + prefsIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'prefs', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'prefs'), + ); }); } QueryBuilder - prefsEqualTo( - String? value, { - bool caseSensitive = true, - }) { + prefsEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsGreaterThan( + prefsGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsLessThan( + prefsLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsBetween( + prefsBetween( String? lower, String? upper, { bool includeLower = true, @@ -440,227 +446,231 @@ extension TrackPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'prefs', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'prefs', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsStartsWith( - String value, { - bool caseSensitive = true, - }) { + prefsStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsEndsWith( - String value, { - bool caseSensitive = true, - }) { + prefsEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsContains(String value, {bool caseSensitive = true}) { + prefsContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'prefs', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'prefs', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsMatches(String pattern, {bool caseSensitive = true}) { + prefsMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'prefs', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'prefs', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - prefsIsEmpty() { + prefsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'prefs', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'prefs', value: ''), + ); }); } QueryBuilder - prefsIsNotEmpty() { + prefsIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'prefs', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'prefs', value: ''), + ); }); } QueryBuilder - syncIdIsNull() { + syncIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'syncId'), + ); }); } QueryBuilder - syncIdIsNotNull() { + syncIdIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncId', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'syncId'), + ); }); } QueryBuilder - syncIdEqualTo(Id? value) { + syncIdEqualTo(Id? value) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'syncId', value: value), + ); }); } QueryBuilder - syncIdGreaterThan( - Id? value, { - bool include = false, - }) { + syncIdGreaterThan(Id? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } QueryBuilder - syncIdLessThan( - Id? value, { - bool include = false, - }) { + syncIdLessThan(Id? value, {bool include = false}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'syncId', - value: value, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'syncId', + value: value, + ), + ); }); } QueryBuilder - syncIdBetween( + syncIdBetween( Id? lower, Id? upper, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'syncId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'syncId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); }); } QueryBuilder - usernameIsNull() { + usernameIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'username', - )); + return query.addFilterCondition( + const FilterCondition.isNull(property: r'username'), + ); }); } QueryBuilder - usernameIsNotNull() { + usernameIsNotNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'username', - )); + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'username'), + ); }); } QueryBuilder - usernameEqualTo( - String? value, { - bool caseSensitive = true, - }) { + usernameEqualTo(String? value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameGreaterThan( + usernameGreaterThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameLessThan( + usernameLessThan( String? value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameBetween( + usernameBetween( String? lower, String? upper, { bool includeLower = true, @@ -668,84 +678,86 @@ extension TrackPreferenceQueryFilter bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'username', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.between( + property: r'username', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameStartsWith( - String value, { - bool caseSensitive = true, - }) { + usernameStartsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.startsWith( + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameEndsWith( - String value, { - bool caseSensitive = true, - }) { + usernameEndsWith(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.endsWith( + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameContains(String value, {bool caseSensitive = true}) { + usernameContains(String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'username', - value: value, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.contains( + property: r'username', + value: value, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameMatches(String pattern, {bool caseSensitive = true}) { + usernameMatches(String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'username', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.addFilterCondition( + FilterCondition.matches( + property: r'username', + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); }); } QueryBuilder - usernameIsEmpty() { + usernameIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'username', - value: '', - )); + return query.addFilterCondition( + FilterCondition.equalTo(property: r'username', value: ''), + ); }); } QueryBuilder - usernameIsNotEmpty() { + usernameIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'username', - value: '', - )); + return query.addFilterCondition( + FilterCondition.greaterThan(property: r'username', value: ''), + ); }); } } @@ -765,7 +777,7 @@ extension TrackPreferenceQuerySortBy } QueryBuilder - sortByOAuthDesc() { + sortByOAuthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'oAuth', Sort.desc); }); @@ -778,21 +790,21 @@ extension TrackPreferenceQuerySortBy } QueryBuilder - sortByPrefsDesc() { + sortByPrefsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'prefs', Sort.desc); }); } QueryBuilder - sortByUsername() { + sortByUsername() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'username', Sort.asc); }); } QueryBuilder - sortByUsernameDesc() { + sortByUsernameDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'username', Sort.desc); }); @@ -808,7 +820,7 @@ extension TrackPreferenceQuerySortThenBy } QueryBuilder - thenByOAuthDesc() { + thenByOAuthDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'oAuth', Sort.desc); }); @@ -821,7 +833,7 @@ extension TrackPreferenceQuerySortThenBy } QueryBuilder - thenByPrefsDesc() { + thenByPrefsDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'prefs', Sort.desc); }); @@ -834,21 +846,21 @@ extension TrackPreferenceQuerySortThenBy } QueryBuilder - thenBySyncIdDesc() { + thenBySyncIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncId', Sort.desc); }); } QueryBuilder - thenByUsername() { + thenByUsername() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'username', Sort.asc); }); } QueryBuilder - thenByUsernameDesc() { + thenByUsernameDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'username', Sort.desc); }); @@ -857,22 +869,25 @@ extension TrackPreferenceQuerySortThenBy extension TrackPreferenceQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByOAuth( - {bool caseSensitive = true}) { + QueryBuilder distinctByOAuth({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'oAuth', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByPrefs( - {bool caseSensitive = true}) { + QueryBuilder distinctByPrefs({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'prefs', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByUsername( - {bool caseSensitive = true}) { + QueryBuilder distinctByUsername({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'username', caseSensitive: caseSensitive); }); diff --git a/lib/models/update.g.dart b/lib/models/update.g.dart index 074eedc5..ea5502ed 100644 --- a/lib/models/update.g.dart +++ b/lib/models/update.g.dart @@ -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 { extension UpdateQueryWhere on QueryBuilder { QueryBuilder 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 { }); } - QueryBuilder idGreaterThan(Id id, - {bool include = false}) { + QueryBuilder 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 { }); } - QueryBuilder idLessThan(Id id, - {bool include = false}) { + QueryBuilder 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 { 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 { extension UpdateQueryFilter on QueryBuilder { QueryBuilder 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 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 { 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 { 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 { 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 { 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 { 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 { 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 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 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 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 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 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 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 { 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 { 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 { 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 { 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 { 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 { 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 dateContains(String value, - {bool caseSensitive = true}) { + QueryBuilder 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 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 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 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 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 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 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 { 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 { 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 { 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 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 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 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 { 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 { 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 { 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 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 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 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 { 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 { 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 { 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 {} extension UpdateQueryLinks on QueryBuilder { QueryBuilder chapter( - FilterQuery q) { + FilterQuery q, + ) { return QueryBuilder.apply(this, (query) { return query.link(q, r'chapter'); }); @@ -845,15 +893,17 @@ extension UpdateQuerySortThenBy on QueryBuilder { } extension UpdateQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByChapterName( - {bool caseSensitive = true}) { + QueryBuilder distinctByChapterName({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'chapterName', caseSensitive: caseSensitive); }); } - QueryBuilder distinctByDate( - {bool caseSensitive = true}) { + QueryBuilder distinctByDate({ + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'date', caseSensitive: caseSensitive); }); diff --git a/lib/modules/anime/providers/anime_player_controller_provider.g.dart b/lib/modules/anime/providers/anime_player_controller_provider.g.dart index 7dcd7ad8..5ca0995e 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.g.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.g.dart @@ -34,9 +34,7 @@ abstract class _$AnimeStreamController extends BuildlessAutoDisposeNotifier { 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 { 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? _dependencies = null; @@ -85,21 +77,19 @@ class AnimeStreamControllerFamily extends Family { class AnimeStreamControllerProvider extends AutoDisposeNotifierProviderImpl { /// 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 - 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 diff --git a/lib/modules/anime/providers/state_provider.g.dart b/lib/modules/anime/providers/state_provider.g.dart index 5f6ac99d..b97a147a 100644 --- a/lib/modules/anime/providers/state_provider.g.dart +++ b/lib/modules/anime/providers/state_provider.g.dart @@ -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; // ignore_for_file: type=lint diff --git a/lib/modules/browse/extension/providers/extensions_provider.g.dart b/lib/modules/browse/extension/providers/extensions_provider.g.dart index 746ffbcd..87a285f5 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.g.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.g.dart @@ -40,21 +40,15 @@ class GetExtensionsStreamFamily extends Family>> { 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? _dependencies = null; @@ -76,24 +70,19 @@ class GetExtensionsStreamFamily extends Family>> { class GetExtensionsStreamProvider extends AutoDisposeStreamProvider> { /// 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 diff --git a/lib/modules/calendar/providers/calendar_provider.g.dart b/lib/modules/calendar/providers/calendar_provider.g.dart index 520fa4d7..6f71ba0b 100644 --- a/lib/modules/calendar/providers/calendar_provider.g.dart +++ b/lib/modules/calendar/providers/calendar_provider.g.dart @@ -39,21 +39,15 @@ class GetCalendarStreamFamily extends Family>> { const GetCalendarStreamFamily(); /// See also [getCalendarStream]. - GetCalendarStreamProvider call({ - ItemType? itemType, - }) { - return GetCalendarStreamProvider( - itemType: itemType, - ); + GetCalendarStreamProvider call({ItemType? itemType}) { + return GetCalendarStreamProvider(itemType: itemType); } @override GetCalendarStreamProvider getProviderOverride( covariant GetCalendarStreamProvider provider, ) { - return call( - itemType: provider.itemType, - ); + return call(itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -74,24 +68,20 @@ class GetCalendarStreamFamily extends Family>> { /// See also [getCalendarStream]. class GetCalendarStreamProvider extends AutoDisposeStreamProvider> { /// 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({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, { @@ -157,5 +147,6 @@ class _GetCalendarStreamProviderElement @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 diff --git a/lib/modules/history/providers/isar_providers.g.dart b/lib/modules/history/providers/isar_providers.g.dart index 41a4934f..813a7a40 100644 --- a/lib/modules/history/providers/isar_providers.g.dart +++ b/lib/modules/history/providers/isar_providers.g.dart @@ -44,20 +44,14 @@ class GetAllHistoryStreamFamily extends Family>> { 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? _dependencies = null; @@ -79,27 +73,24 @@ class GetAllHistoryStreamFamily extends Family>> { class GetAllHistoryStreamProvider extends AutoDisposeStreamProvider> { /// 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>> { 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? _dependencies = null; @@ -229,27 +214,24 @@ class GetAllUpdateStreamFamily extends Family>> { class GetAllUpdateStreamProvider extends AutoDisposeStreamProvider> { /// 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 diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index 5bb915b0..8faef450 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -45,22 +45,14 @@ class AddTorrentFromUrlOrFromFileFamily extends Family { 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? _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 diff --git a/lib/modules/library/providers/isar_providers.g.dart b/lib/modules/library/providers/isar_providers.g.dart index 6f13f7a5..d102ebbe 100644 --- a/lib/modules/library/providers/isar_providers.g.dart +++ b/lib/modules/library/providers/isar_providers.g.dart @@ -53,10 +53,7 @@ class GetAllMangaStreamFamily extends Family>> { GetAllMangaStreamProvider getProviderOverride( covariant GetAllMangaStreamProvider provider, ) { - return call( - categoryId: provider.categoryId, - itemType: provider.itemType, - ); + return call(categoryId: provider.categoryId, itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -81,23 +78,22 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { 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? _dependencies = null; @@ -226,24 +218,22 @@ class GetAllMangaWithoutCategoriesStreamFamily class GetAllMangaWithoutCategoriesStreamProvider extends AutoDisposeStreamProvider> { /// 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> Function(GetAllMangaWithoutCategoriesStreamRef provider) - create, + create, ) { return ProviderOverride( origin: this, @@ -320,14 +310,14 @@ String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27'; @ProviderFor(getSettingsStream) final getSettingsStreamProvider = AutoDisposeStreamProvider>.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 diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index e4cc60af..a0845ee9 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -35,10 +35,7 @@ abstract class _$LibraryDisplayTypeState late final ItemType itemType; late final Settings settings; - DisplayType build({ - required ItemType itemType, - required Settings settings, - }); + DisplayType build({required ItemType itemType, required Settings settings}); } /// See also [LibraryDisplayTypeState]. @@ -65,10 +62,7 @@ class LibraryDisplayTypeStateFamily extends Family { LibraryDisplayTypeStateProvider getProviderOverride( covariant LibraryDisplayTypeStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -87,28 +81,28 @@ class LibraryDisplayTypeStateFamily extends Family { } /// See also [LibraryDisplayTypeState]. -class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< - LibraryDisplayTypeState, DisplayType> { +class LibraryDisplayTypeStateProvider + extends + AutoDisposeNotifierProviderImpl { /// See also [LibraryDisplayTypeState]. LibraryDisplayTypeStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryDisplayTypeState() - ..itemType = itemType - ..settings = settings, - from: libraryDisplayTypeStateProvider, - name: r'libraryDisplayTypeStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryDisplayTypeStateHash, - dependencies: LibraryDisplayTypeStateFamily._dependencies, - allTransitiveDependencies: - LibraryDisplayTypeStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryDisplayTypeState() + ..itemType = itemType + ..settings = settings, + from: libraryDisplayTypeStateProvider, + name: r'libraryDisplayTypeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryDisplayTypeStateHash, + dependencies: LibraryDisplayTypeStateFamily._dependencies, + allTransitiveDependencies: + LibraryDisplayTypeStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryDisplayTypeStateProvider._internal( super._createNotifier, { @@ -125,13 +119,8 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< final Settings settings; @override - DisplayType runNotifierBuild( - covariant LibraryDisplayTypeState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + DisplayType runNotifierBuild(covariant LibraryDisplayTypeState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -155,7 +144,7 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryDisplayTypeStateProviderElement(this); } @@ -188,8 +177,9 @@ mixin LibraryDisplayTypeStateRef } class _LibraryDisplayTypeStateProviderElement - extends AutoDisposeNotifierProviderElement with LibraryDisplayTypeStateRef { + extends + AutoDisposeNotifierProviderElement + with LibraryDisplayTypeStateRef { _LibraryDisplayTypeStateProviderElement(super.provider); @override @@ -205,9 +195,7 @@ abstract class _$LibraryGridSizeState extends BuildlessAutoDisposeNotifier { late final ItemType itemType; - int? build({ - required ItemType itemType, - }); + int? build({required ItemType itemType}); } /// See also [LibraryGridSizeState]. @@ -220,21 +208,15 @@ class LibraryGridSizeStateFamily extends Family { const LibraryGridSizeStateFamily(); /// See also [LibraryGridSizeState]. - LibraryGridSizeStateProvider call({ - required ItemType itemType, - }) { - return LibraryGridSizeStateProvider( - itemType: itemType, - ); + LibraryGridSizeStateProvider call({required ItemType itemType}) { + return LibraryGridSizeStateProvider(itemType: itemType); } @override LibraryGridSizeStateProvider getProviderOverride( covariant LibraryGridSizeStateProvider provider, ) { - return call( - itemType: provider.itemType, - ); + return call(itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -256,21 +238,19 @@ class LibraryGridSizeStateFamily extends Family { class LibraryGridSizeStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryGridSizeState]. - LibraryGridSizeStateProvider({ - required ItemType itemType, - }) : this._internal( - () => LibraryGridSizeState()..itemType = itemType, - from: libraryGridSizeStateProvider, - name: r'libraryGridSizeStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryGridSizeStateHash, - dependencies: LibraryGridSizeStateFamily._dependencies, - allTransitiveDependencies: - LibraryGridSizeStateFamily._allTransitiveDependencies, - itemType: itemType, - ); + LibraryGridSizeStateProvider({required ItemType itemType}) + : this._internal( + () => LibraryGridSizeState()..itemType = itemType, + from: libraryGridSizeStateProvider, + name: r'libraryGridSizeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryGridSizeStateHash, + dependencies: LibraryGridSizeStateFamily._dependencies, + allTransitiveDependencies: + LibraryGridSizeStateFamily._allTransitiveDependencies, + itemType: itemType, + ); LibraryGridSizeStateProvider._internal( super._createNotifier, { @@ -285,12 +265,8 @@ class LibraryGridSizeStateProvider final ItemType itemType; @override - int? runNotifierBuild( - covariant LibraryGridSizeState notifier, - ) { - return notifier.build( - itemType: itemType, - ); + int? runNotifierBuild(covariant LibraryGridSizeState notifier) { + return notifier.build(itemType: itemType); } @override @@ -311,7 +287,7 @@ class LibraryGridSizeStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryGridSizeStateProviderElement(this); } @@ -418,23 +394,22 @@ class MangaFilterDownloadedStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => MangaFilterDownloadedState() - ..mangaList = mangaList - ..itemType = itemType - ..settings = settings, - from: mangaFilterDownloadedStateProvider, - name: r'mangaFilterDownloadedStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangaFilterDownloadedStateHash, - dependencies: MangaFilterDownloadedStateFamily._dependencies, - allTransitiveDependencies: - MangaFilterDownloadedStateFamily._allTransitiveDependencies, - mangaList: mangaList, - itemType: itemType, - settings: settings, - ); + () => MangaFilterDownloadedState() + ..mangaList = mangaList + ..itemType = itemType + ..settings = settings, + from: mangaFilterDownloadedStateProvider, + name: r'mangaFilterDownloadedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangaFilterDownloadedStateHash, + dependencies: MangaFilterDownloadedStateFamily._dependencies, + allTransitiveDependencies: + MangaFilterDownloadedStateFamily._allTransitiveDependencies, + mangaList: mangaList, + itemType: itemType, + settings: settings, + ); MangaFilterDownloadedStateProvider._internal( super._createNotifier, { @@ -453,9 +428,7 @@ class MangaFilterDownloadedStateProvider final Settings settings; @override - int runNotifierBuild( - covariant MangaFilterDownloadedState notifier, - ) { + int runNotifierBuild(covariant MangaFilterDownloadedState notifier) { return notifier.build( mangaList: mangaList, itemType: itemType, @@ -486,7 +459,7 @@ class MangaFilterDownloadedStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangaFilterDownloadedStateProviderElement(this); } @@ -611,23 +584,22 @@ class MangaFilterUnreadStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => MangaFilterUnreadState() - ..mangaList = mangaList - ..itemType = itemType - ..settings = settings, - from: mangaFilterUnreadStateProvider, - name: r'mangaFilterUnreadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangaFilterUnreadStateHash, - dependencies: MangaFilterUnreadStateFamily._dependencies, - allTransitiveDependencies: - MangaFilterUnreadStateFamily._allTransitiveDependencies, - mangaList: mangaList, - itemType: itemType, - settings: settings, - ); + () => MangaFilterUnreadState() + ..mangaList = mangaList + ..itemType = itemType + ..settings = settings, + from: mangaFilterUnreadStateProvider, + name: r'mangaFilterUnreadStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangaFilterUnreadStateHash, + dependencies: MangaFilterUnreadStateFamily._dependencies, + allTransitiveDependencies: + MangaFilterUnreadStateFamily._allTransitiveDependencies, + mangaList: mangaList, + itemType: itemType, + settings: settings, + ); MangaFilterUnreadStateProvider._internal( super._createNotifier, { @@ -646,9 +618,7 @@ class MangaFilterUnreadStateProvider final Settings settings; @override - int runNotifierBuild( - covariant MangaFilterUnreadState notifier, - ) { + int runNotifierBuild(covariant MangaFilterUnreadState notifier) { return notifier.build( mangaList: mangaList, itemType: itemType, @@ -679,7 +649,7 @@ class MangaFilterUnreadStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangaFilterUnreadStateProviderElement(this); } @@ -802,23 +772,22 @@ class MangaFilterStartedStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => MangaFilterStartedState() - ..mangaList = mangaList - ..itemType = itemType - ..settings = settings, - from: mangaFilterStartedStateProvider, - name: r'mangaFilterStartedStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangaFilterStartedStateHash, - dependencies: MangaFilterStartedStateFamily._dependencies, - allTransitiveDependencies: - MangaFilterStartedStateFamily._allTransitiveDependencies, - mangaList: mangaList, - itemType: itemType, - settings: settings, - ); + () => MangaFilterStartedState() + ..mangaList = mangaList + ..itemType = itemType + ..settings = settings, + from: mangaFilterStartedStateProvider, + name: r'mangaFilterStartedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangaFilterStartedStateHash, + dependencies: MangaFilterStartedStateFamily._dependencies, + allTransitiveDependencies: + MangaFilterStartedStateFamily._allTransitiveDependencies, + mangaList: mangaList, + itemType: itemType, + settings: settings, + ); MangaFilterStartedStateProvider._internal( super._createNotifier, { @@ -837,9 +806,7 @@ class MangaFilterStartedStateProvider final Settings settings; @override - int runNotifierBuild( - covariant MangaFilterStartedState notifier, - ) { + int runNotifierBuild(covariant MangaFilterStartedState notifier) { return notifier.build( mangaList: mangaList, itemType: itemType, @@ -870,7 +837,7 @@ class MangaFilterStartedStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangaFilterStartedStateProviderElement(this); } @@ -993,23 +960,22 @@ class MangaFilterBookmarkedStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => MangaFilterBookmarkedState() - ..mangaList = mangaList - ..itemType = itemType - ..settings = settings, - from: mangaFilterBookmarkedStateProvider, - name: r'mangaFilterBookmarkedStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangaFilterBookmarkedStateHash, - dependencies: MangaFilterBookmarkedStateFamily._dependencies, - allTransitiveDependencies: - MangaFilterBookmarkedStateFamily._allTransitiveDependencies, - mangaList: mangaList, - itemType: itemType, - settings: settings, - ); + () => MangaFilterBookmarkedState() + ..mangaList = mangaList + ..itemType = itemType + ..settings = settings, + from: mangaFilterBookmarkedStateProvider, + name: r'mangaFilterBookmarkedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangaFilterBookmarkedStateHash, + dependencies: MangaFilterBookmarkedStateFamily._dependencies, + allTransitiveDependencies: + MangaFilterBookmarkedStateFamily._allTransitiveDependencies, + mangaList: mangaList, + itemType: itemType, + settings: settings, + ); MangaFilterBookmarkedStateProvider._internal( super._createNotifier, { @@ -1028,9 +994,7 @@ class MangaFilterBookmarkedStateProvider final Settings settings; @override - int runNotifierBuild( - covariant MangaFilterBookmarkedState notifier, - ) { + int runNotifierBuild(covariant MangaFilterBookmarkedState notifier) { return notifier.build( mangaList: mangaList, itemType: itemType, @@ -1061,7 +1025,7 @@ class MangaFilterBookmarkedStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangaFilterBookmarkedStateProviderElement(this); } @@ -1186,23 +1150,22 @@ class MangasFilterResultStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => MangasFilterResultState() - ..mangaList = mangaList - ..itemType = itemType - ..settings = settings, - from: mangasFilterResultStateProvider, - name: r'mangasFilterResultStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangasFilterResultStateHash, - dependencies: MangasFilterResultStateFamily._dependencies, - allTransitiveDependencies: - MangasFilterResultStateFamily._allTransitiveDependencies, - mangaList: mangaList, - itemType: itemType, - settings: settings, - ); + () => MangasFilterResultState() + ..mangaList = mangaList + ..itemType = itemType + ..settings = settings, + from: mangasFilterResultStateProvider, + name: r'mangasFilterResultStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangasFilterResultStateHash, + dependencies: MangasFilterResultStateFamily._dependencies, + allTransitiveDependencies: + MangasFilterResultStateFamily._allTransitiveDependencies, + mangaList: mangaList, + itemType: itemType, + settings: settings, + ); MangasFilterResultStateProvider._internal( super._createNotifier, { @@ -1221,9 +1184,7 @@ class MangasFilterResultStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant MangasFilterResultState notifier, - ) { + bool runNotifierBuild(covariant MangasFilterResultState notifier) { return notifier.build( mangaList: mangaList, itemType: itemType, @@ -1254,7 +1215,7 @@ class MangasFilterResultStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangasFilterResultStateProviderElement(this); } @@ -1312,10 +1273,7 @@ abstract class _$LibraryShowCategoryTabsState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryShowCategoryTabsState]. @@ -1343,10 +1301,7 @@ class LibraryShowCategoryTabsStateFamily extends Family { LibraryShowCategoryTabsStateProvider getProviderOverride( covariant LibraryShowCategoryTabsStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -1366,28 +1321,27 @@ class LibraryShowCategoryTabsStateFamily extends Family { /// See also [LibraryShowCategoryTabsState]. class LibraryShowCategoryTabsStateProvider - extends AutoDisposeNotifierProviderImpl { + extends + AutoDisposeNotifierProviderImpl { /// See also [LibraryShowCategoryTabsState]. LibraryShowCategoryTabsStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryShowCategoryTabsState() - ..itemType = itemType - ..settings = settings, - from: libraryShowCategoryTabsStateProvider, - name: r'libraryShowCategoryTabsStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryShowCategoryTabsStateHash, - dependencies: LibraryShowCategoryTabsStateFamily._dependencies, - allTransitiveDependencies: - LibraryShowCategoryTabsStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryShowCategoryTabsState() + ..itemType = itemType + ..settings = settings, + from: libraryShowCategoryTabsStateProvider, + name: r'libraryShowCategoryTabsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryShowCategoryTabsStateHash, + dependencies: LibraryShowCategoryTabsStateFamily._dependencies, + allTransitiveDependencies: + LibraryShowCategoryTabsStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryShowCategoryTabsStateProvider._internal( super._createNotifier, { @@ -1404,13 +1358,8 @@ class LibraryShowCategoryTabsStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant LibraryShowCategoryTabsState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + bool runNotifierBuild(covariant LibraryShowCategoryTabsState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -1434,7 +1383,7 @@ class LibraryShowCategoryTabsStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryShowCategoryTabsStateProviderElement(this); } @@ -1466,8 +1415,9 @@ mixin LibraryShowCategoryTabsStateRef on AutoDisposeNotifierProviderRef { } class _LibraryShowCategoryTabsStateProviderElement - extends AutoDisposeNotifierProviderElement with LibraryShowCategoryTabsStateRef { + extends + AutoDisposeNotifierProviderElement + with LibraryShowCategoryTabsStateRef { _LibraryShowCategoryTabsStateProviderElement(super.provider); @override @@ -1486,10 +1436,7 @@ abstract class _$LibraryDownloadedChaptersState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryDownloadedChaptersState]. @@ -1517,10 +1464,7 @@ class LibraryDownloadedChaptersStateFamily extends Family { LibraryDownloadedChaptersStateProvider getProviderOverride( covariant LibraryDownloadedChaptersStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -1540,28 +1484,27 @@ class LibraryDownloadedChaptersStateFamily extends Family { /// See also [LibraryDownloadedChaptersState]. class LibraryDownloadedChaptersStateProvider - extends AutoDisposeNotifierProviderImpl { + extends + AutoDisposeNotifierProviderImpl { /// See also [LibraryDownloadedChaptersState]. LibraryDownloadedChaptersStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryDownloadedChaptersState() - ..itemType = itemType - ..settings = settings, - from: libraryDownloadedChaptersStateProvider, - name: r'libraryDownloadedChaptersStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryDownloadedChaptersStateHash, - dependencies: LibraryDownloadedChaptersStateFamily._dependencies, - allTransitiveDependencies: - LibraryDownloadedChaptersStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryDownloadedChaptersState() + ..itemType = itemType + ..settings = settings, + from: libraryDownloadedChaptersStateProvider, + name: r'libraryDownloadedChaptersStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryDownloadedChaptersStateHash, + dependencies: LibraryDownloadedChaptersStateFamily._dependencies, + allTransitiveDependencies: + LibraryDownloadedChaptersStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryDownloadedChaptersStateProvider._internal( super._createNotifier, { @@ -1578,13 +1521,8 @@ class LibraryDownloadedChaptersStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant LibraryDownloadedChaptersState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + bool runNotifierBuild(covariant LibraryDownloadedChaptersState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -1608,7 +1546,7 @@ class LibraryDownloadedChaptersStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryDownloadedChaptersStateProviderElement(this); } @@ -1641,8 +1579,9 @@ mixin LibraryDownloadedChaptersStateRef } class _LibraryDownloadedChaptersStateProviderElement - extends AutoDisposeNotifierProviderElement with LibraryDownloadedChaptersStateRef { + extends + AutoDisposeNotifierProviderElement + with LibraryDownloadedChaptersStateRef { _LibraryDownloadedChaptersStateProviderElement(super.provider); @override @@ -1661,10 +1600,7 @@ abstract class _$LibraryLanguageState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryLanguageState]. @@ -1681,20 +1617,14 @@ class LibraryLanguageStateFamily extends Family { required ItemType itemType, required Settings settings, }) { - return LibraryLanguageStateProvider( - itemType: itemType, - settings: settings, - ); + return LibraryLanguageStateProvider(itemType: itemType, settings: settings); } @override LibraryLanguageStateProvider getProviderOverride( covariant LibraryLanguageStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -1720,21 +1650,20 @@ class LibraryLanguageStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryLanguageState() - ..itemType = itemType - ..settings = settings, - from: libraryLanguageStateProvider, - name: r'libraryLanguageStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryLanguageStateHash, - dependencies: LibraryLanguageStateFamily._dependencies, - allTransitiveDependencies: - LibraryLanguageStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryLanguageState() + ..itemType = itemType + ..settings = settings, + from: libraryLanguageStateProvider, + name: r'libraryLanguageStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryLanguageStateHash, + dependencies: LibraryLanguageStateFamily._dependencies, + allTransitiveDependencies: + LibraryLanguageStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryLanguageStateProvider._internal( super._createNotifier, { @@ -1751,13 +1680,8 @@ class LibraryLanguageStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant LibraryLanguageState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + bool runNotifierBuild(covariant LibraryLanguageState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -1781,7 +1705,7 @@ class LibraryLanguageStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryLanguageStateProviderElement(this); } @@ -1831,10 +1755,7 @@ abstract class _$LibraryLocalSourceState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryLocalSourceState]. @@ -1861,10 +1782,7 @@ class LibraryLocalSourceStateFamily extends Family { LibraryLocalSourceStateProvider getProviderOverride( covariant LibraryLocalSourceStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -1890,21 +1808,20 @@ class LibraryLocalSourceStateProvider required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryLocalSourceState() - ..itemType = itemType - ..settings = settings, - from: libraryLocalSourceStateProvider, - name: r'libraryLocalSourceStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryLocalSourceStateHash, - dependencies: LibraryLocalSourceStateFamily._dependencies, - allTransitiveDependencies: - LibraryLocalSourceStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryLocalSourceState() + ..itemType = itemType + ..settings = settings, + from: libraryLocalSourceStateProvider, + name: r'libraryLocalSourceStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryLocalSourceStateHash, + dependencies: LibraryLocalSourceStateFamily._dependencies, + allTransitiveDependencies: + LibraryLocalSourceStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryLocalSourceStateProvider._internal( super._createNotifier, { @@ -1921,13 +1838,8 @@ class LibraryLocalSourceStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant LibraryLocalSourceState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + bool runNotifierBuild(covariant LibraryLocalSourceState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -1951,7 +1863,7 @@ class LibraryLocalSourceStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryLocalSourceStateProviderElement(this); } @@ -2001,10 +1913,7 @@ abstract class _$LibraryShowNumbersOfItemsState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryShowNumbersOfItemsState]. @@ -2032,10 +1941,7 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { LibraryShowNumbersOfItemsStateProvider getProviderOverride( covariant LibraryShowNumbersOfItemsStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -2055,28 +1961,27 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { /// See also [LibraryShowNumbersOfItemsState]. class LibraryShowNumbersOfItemsStateProvider - extends AutoDisposeNotifierProviderImpl { + extends + AutoDisposeNotifierProviderImpl { /// See also [LibraryShowNumbersOfItemsState]. LibraryShowNumbersOfItemsStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryShowNumbersOfItemsState() - ..itemType = itemType - ..settings = settings, - from: libraryShowNumbersOfItemsStateProvider, - name: r'libraryShowNumbersOfItemsStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryShowNumbersOfItemsStateHash, - dependencies: LibraryShowNumbersOfItemsStateFamily._dependencies, - allTransitiveDependencies: - LibraryShowNumbersOfItemsStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryShowNumbersOfItemsState() + ..itemType = itemType + ..settings = settings, + from: libraryShowNumbersOfItemsStateProvider, + name: r'libraryShowNumbersOfItemsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryShowNumbersOfItemsStateHash, + dependencies: LibraryShowNumbersOfItemsStateFamily._dependencies, + allTransitiveDependencies: + LibraryShowNumbersOfItemsStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryShowNumbersOfItemsStateProvider._internal( super._createNotifier, { @@ -2093,13 +1998,8 @@ class LibraryShowNumbersOfItemsStateProvider final Settings settings; @override - bool runNotifierBuild( - covariant LibraryShowNumbersOfItemsState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + bool runNotifierBuild(covariant LibraryShowNumbersOfItemsState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -2123,7 +2023,7 @@ class LibraryShowNumbersOfItemsStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _LibraryShowNumbersOfItemsStateProviderElement(this); } @@ -2156,8 +2056,9 @@ mixin LibraryShowNumbersOfItemsStateRef } class _LibraryShowNumbersOfItemsStateProviderElement - extends AutoDisposeNotifierProviderElement with LibraryShowNumbersOfItemsStateRef { + extends + AutoDisposeNotifierProviderElement + with LibraryShowNumbersOfItemsStateRef { _LibraryShowNumbersOfItemsStateProviderElement(super.provider); @override @@ -2176,10 +2077,7 @@ abstract class _$LibraryShowContinueReadingButtonState late final ItemType itemType; late final Settings settings; - bool build({ - required ItemType itemType, - required Settings settings, - }); + bool build({required ItemType itemType, required Settings settings}); } /// See also [LibraryShowContinueReadingButtonState]. @@ -2207,10 +2105,7 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { LibraryShowContinueReadingButtonStateProvider getProviderOverride( covariant LibraryShowContinueReadingButtonStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -2230,29 +2125,31 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { /// See also [LibraryShowContinueReadingButtonState]. class LibraryShowContinueReadingButtonStateProvider - extends AutoDisposeNotifierProviderImpl< - LibraryShowContinueReadingButtonState, bool> { + extends + AutoDisposeNotifierProviderImpl< + LibraryShowContinueReadingButtonState, + bool + > { /// See also [LibraryShowContinueReadingButtonState]. LibraryShowContinueReadingButtonStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => LibraryShowContinueReadingButtonState() - ..itemType = itemType - ..settings = settings, - from: libraryShowContinueReadingButtonStateProvider, - name: r'libraryShowContinueReadingButtonStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$libraryShowContinueReadingButtonStateHash, - dependencies: - LibraryShowContinueReadingButtonStateFamily._dependencies, - allTransitiveDependencies: LibraryShowContinueReadingButtonStateFamily - ._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => LibraryShowContinueReadingButtonState() + ..itemType = itemType + ..settings = settings, + from: libraryShowContinueReadingButtonStateProvider, + name: r'libraryShowContinueReadingButtonStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$libraryShowContinueReadingButtonStateHash, + dependencies: + LibraryShowContinueReadingButtonStateFamily._dependencies, + allTransitiveDependencies: LibraryShowContinueReadingButtonStateFamily + ._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); LibraryShowContinueReadingButtonStateProvider._internal( super._createNotifier, { @@ -2272,15 +2169,13 @@ class LibraryShowContinueReadingButtonStateProvider bool runNotifierBuild( covariant LibraryShowContinueReadingButtonState notifier, ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + return notifier.build(itemType: itemType, settings: settings); } @override Override overrideWith( - LibraryShowContinueReadingButtonState Function() create) { + LibraryShowContinueReadingButtonState Function() create, + ) { return ProviderOverride( origin: this, override: LibraryShowContinueReadingButtonStateProvider._internal( @@ -2299,8 +2194,11 @@ class LibraryShowContinueReadingButtonStateProvider } @override - AutoDisposeNotifierProviderElement createElement() { + AutoDisposeNotifierProviderElement< + LibraryShowContinueReadingButtonState, + bool + > + createElement() { return _LibraryShowContinueReadingButtonStateProviderElement(this); } @@ -2333,9 +2231,12 @@ mixin LibraryShowContinueReadingButtonStateRef } class _LibraryShowContinueReadingButtonStateProviderElement - extends AutoDisposeNotifierProviderElement< - LibraryShowContinueReadingButtonState, - bool> with LibraryShowContinueReadingButtonStateRef { + extends + AutoDisposeNotifierProviderElement< + LibraryShowContinueReadingButtonState, + bool + > + with LibraryShowContinueReadingButtonStateRef { _LibraryShowContinueReadingButtonStateProviderElement(super.provider); @override @@ -2384,10 +2285,7 @@ class SortLibraryMangaStateFamily extends Family { SortLibraryMangaStateProvider getProviderOverride( covariant SortLibraryMangaStateProvider provider, ) { - return call( - itemType: provider.itemType, - settings: provider.settings, - ); + return call(itemType: provider.itemType, settings: provider.settings); } static const Iterable? _dependencies = null; @@ -2406,28 +2304,31 @@ class SortLibraryMangaStateFamily extends Family { } /// See also [SortLibraryMangaState]. -class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< - SortLibraryMangaState, SortLibraryManga> { +class SortLibraryMangaStateProvider + extends + AutoDisposeNotifierProviderImpl< + SortLibraryMangaState, + SortLibraryManga + > { /// See also [SortLibraryMangaState]. SortLibraryMangaStateProvider({ required ItemType itemType, required Settings settings, }) : this._internal( - () => SortLibraryMangaState() - ..itemType = itemType - ..settings = settings, - from: sortLibraryMangaStateProvider, - name: r'sortLibraryMangaStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$sortLibraryMangaStateHash, - dependencies: SortLibraryMangaStateFamily._dependencies, - allTransitiveDependencies: - SortLibraryMangaStateFamily._allTransitiveDependencies, - itemType: itemType, - settings: settings, - ); + () => SortLibraryMangaState() + ..itemType = itemType + ..settings = settings, + from: sortLibraryMangaStateProvider, + name: r'sortLibraryMangaStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$sortLibraryMangaStateHash, + dependencies: SortLibraryMangaStateFamily._dependencies, + allTransitiveDependencies: + SortLibraryMangaStateFamily._allTransitiveDependencies, + itemType: itemType, + settings: settings, + ); SortLibraryMangaStateProvider._internal( super._createNotifier, { @@ -2444,13 +2345,8 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< final Settings settings; @override - SortLibraryManga runNotifierBuild( - covariant SortLibraryMangaState notifier, - ) { - return notifier.build( - itemType: itemType, - settings: settings, - ); + SortLibraryManga runNotifierBuild(covariant SortLibraryMangaState notifier) { + return notifier.build(itemType: itemType, settings: settings); } @override @@ -2474,7 +2370,7 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _SortLibraryMangaStateProviderElement(this); } @@ -2507,8 +2403,12 @@ mixin SortLibraryMangaStateRef } class _SortLibraryMangaStateProviderElement - extends AutoDisposeNotifierProviderElement with SortLibraryMangaStateRef { + extends + AutoDisposeNotifierProviderElement< + SortLibraryMangaState, + SortLibraryManga + > + with SortLibraryMangaStateRef { _SortLibraryMangaStateProviderElement(super.provider); @override @@ -2523,14 +2423,14 @@ String _$mangasListStateHash() => r'bbd2e3600ec22a774b1774ae3c221815e52bfef6'; @ProviderFor(MangasListState) final mangasListStateProvider = AutoDisposeNotifierProvider>.internal( - MangasListState.new, - name: r'mangasListStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangasListStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + MangasListState.new, + name: r'mangasListStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangasListStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$MangasListState = AutoDisposeNotifier>; String _$mangasSetIsReadStateHash() => @@ -2541,10 +2441,7 @@ abstract class _$MangasSetIsReadState late final List mangaIds; late final bool markAsRead; - void build({ - required List mangaIds, - required bool markAsRead, - }); + void build({required List mangaIds, required bool markAsRead}); } /// See also [MangasSetIsReadState]. @@ -2571,10 +2468,7 @@ class MangasSetIsReadStateFamily extends Family { MangasSetIsReadStateProvider getProviderOverride( covariant MangasSetIsReadStateProvider provider, ) { - return call( - mangaIds: provider.mangaIds, - markAsRead: provider.markAsRead, - ); + return call(mangaIds: provider.mangaIds, markAsRead: provider.markAsRead); } static const Iterable? _dependencies = null; @@ -2600,21 +2494,20 @@ class MangasSetIsReadStateProvider required List mangaIds, required bool markAsRead, }) : this._internal( - () => MangasSetIsReadState() - ..mangaIds = mangaIds - ..markAsRead = markAsRead, - from: mangasSetIsReadStateProvider, - name: r'mangasSetIsReadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangasSetIsReadStateHash, - dependencies: MangasSetIsReadStateFamily._dependencies, - allTransitiveDependencies: - MangasSetIsReadStateFamily._allTransitiveDependencies, - mangaIds: mangaIds, - markAsRead: markAsRead, - ); + () => MangasSetIsReadState() + ..mangaIds = mangaIds + ..markAsRead = markAsRead, + from: mangasSetIsReadStateProvider, + name: r'mangasSetIsReadStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangasSetIsReadStateHash, + dependencies: MangasSetIsReadStateFamily._dependencies, + allTransitiveDependencies: + MangasSetIsReadStateFamily._allTransitiveDependencies, + mangaIds: mangaIds, + markAsRead: markAsRead, + ); MangasSetIsReadStateProvider._internal( super._createNotifier, { @@ -2631,13 +2524,8 @@ class MangasSetIsReadStateProvider final bool markAsRead; @override - void runNotifierBuild( - covariant MangasSetIsReadState notifier, - ) { - return notifier.build( - mangaIds: mangaIds, - markAsRead: markAsRead, - ); + void runNotifierBuild(covariant MangasSetIsReadState notifier) { + return notifier.build(mangaIds: mangaIds, markAsRead: markAsRead); } @override @@ -2661,7 +2549,7 @@ class MangasSetIsReadStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _MangasSetIsReadStateProviderElement(this); } @@ -2702,5 +2590,6 @@ class _MangasSetIsReadStateProviderElement @override bool get markAsRead => (origin as MangasSetIsReadStateProvider).markAsRead; } + // 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 diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index 254f479c..13ff5dda 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -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 diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index 740c5b32..dada02b0 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -13,8 +13,9 @@ String _$migrationHash() => r'2a82120544e693a3162da887a3ca1b3066f3799f'; final migrationProvider = AutoDisposeFutureProvider.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, ); diff --git a/lib/modules/manga/archive_reader/providers/archive_reader_providers.g.dart b/lib/modules/manga/archive_reader/providers/archive_reader_providers.g.dart index d960195b..1c3a57e9 100644 --- a/lib/modules/manga/archive_reader/providers/archive_reader_providers.g.dart +++ b/lib/modules/manga/archive_reader/providers/archive_reader_providers.g.dart @@ -36,27 +36,24 @@ const getArchivesDataFromDirectoryProvider = GetArchivesDataFromDirectoryFamily(); /// See also [getArchivesDataFromDirectory]. -class GetArchivesDataFromDirectoryFamily extends Family< - AsyncValue>> { +class GetArchivesDataFromDirectoryFamily + extends + Family< + AsyncValue> + > { /// 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? _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> 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? _dependencies = null; @@ -217,24 +217,22 @@ class GetArchiveDataFromDirectoryFamily class GetArchiveDataFromDirectoryProvider extends AutoDisposeFutureProvider> { /// 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> 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> { /// 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? _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> { 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? _dependencies = null; @@ -492,24 +487,19 @@ class GetArchiveDataFromFileFamily extends Family> { class GetArchiveDataFromFileProvider extends AutoDisposeFutureProvider { /// 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 diff --git a/lib/modules/manga/detail/providers/isar_providers.g.dart b/lib/modules/manga/detail/providers/isar_providers.g.dart index 83a5fc70..b01028ea 100644 --- a/lib/modules/manga/detail/providers/isar_providers.g.dart +++ b/lib/modules/manga/detail/providers/isar_providers.g.dart @@ -40,21 +40,15 @@ class GetMangaDetailStreamFamily extends Family> { const GetMangaDetailStreamFamily(); /// See also [getMangaDetailStream]. - GetMangaDetailStreamProvider call({ - required int mangaId, - }) { - return GetMangaDetailStreamProvider( - mangaId: mangaId, - ); + GetMangaDetailStreamProvider call({required int mangaId}) { + return GetMangaDetailStreamProvider(mangaId: mangaId); } @override GetMangaDetailStreamProvider getProviderOverride( covariant GetMangaDetailStreamProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -75,24 +69,22 @@ class GetMangaDetailStreamFamily extends Family> { /// See also [getMangaDetailStream]. class GetMangaDetailStreamProvider extends AutoDisposeStreamProvider { /// See also [getMangaDetailStream]. - GetMangaDetailStreamProvider({ - required int mangaId, - }) : this._internal( - (ref) => getMangaDetailStream( - ref as GetMangaDetailStreamRef, - mangaId: mangaId, - ), - from: getMangaDetailStreamProvider, - name: r'getMangaDetailStreamProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getMangaDetailStreamHash, - dependencies: GetMangaDetailStreamFamily._dependencies, - allTransitiveDependencies: - GetMangaDetailStreamFamily._allTransitiveDependencies, + GetMangaDetailStreamProvider({required int mangaId}) + : this._internal( + (ref) => getMangaDetailStream( + ref as GetMangaDetailStreamRef, mangaId: mangaId, - ); + ), + from: getMangaDetailStreamProvider, + name: r'getMangaDetailStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getMangaDetailStreamHash, + dependencies: GetMangaDetailStreamFamily._dependencies, + allTransitiveDependencies: + GetMangaDetailStreamFamily._allTransitiveDependencies, + mangaId: mangaId, + ); GetMangaDetailStreamProvider._internal( super._createNotifier, { @@ -171,21 +163,15 @@ class GetChaptersStreamFamily extends Family>> { const GetChaptersStreamFamily(); /// See also [getChaptersStream]. - GetChaptersStreamProvider call({ - required int mangaId, - }) { - return GetChaptersStreamProvider( - mangaId: mangaId, - ); + GetChaptersStreamProvider call({required int mangaId}) { + return GetChaptersStreamProvider(mangaId: mangaId); } @override GetChaptersStreamProvider getProviderOverride( covariant GetChaptersStreamProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -207,24 +193,20 @@ class GetChaptersStreamFamily extends Family>> { class GetChaptersStreamProvider extends AutoDisposeStreamProvider> { /// See also [getChaptersStream]. - GetChaptersStreamProvider({ - required int mangaId, - }) : this._internal( - (ref) => getChaptersStream( - ref as GetChaptersStreamRef, - mangaId: mangaId, - ), - from: getChaptersStreamProvider, - name: r'getChaptersStreamProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getChaptersStreamHash, - dependencies: GetChaptersStreamFamily._dependencies, - allTransitiveDependencies: - GetChaptersStreamFamily._allTransitiveDependencies, - mangaId: mangaId, - ); + GetChaptersStreamProvider({required int mangaId}) + : this._internal( + (ref) => + getChaptersStream(ref as GetChaptersStreamRef, mangaId: mangaId), + from: getChaptersStreamProvider, + name: r'getChaptersStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getChaptersStreamHash, + dependencies: GetChaptersStreamFamily._dependencies, + allTransitiveDependencies: + GetChaptersStreamFamily._allTransitiveDependencies, + mangaId: mangaId, + ); GetChaptersStreamProvider._internal( super._createNotifier, { @@ -290,5 +272,6 @@ class _GetChaptersStreamProviderElement @override int get mangaId => (origin as GetChaptersStreamProvider).mangaId; } + // 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 diff --git a/lib/modules/manga/detail/providers/state_providers.g.dart b/lib/modules/manga/detail/providers/state_providers.g.dart index ee0d3d3f..47ae74c7 100644 --- a/lib/modules/manga/detail/providers/state_providers.g.dart +++ b/lib/modules/manga/detail/providers/state_providers.g.dart @@ -12,14 +12,14 @@ String _$chaptersListStateHash() => r'251609214d127964e84d4616d2c3a7afa4fd80b4'; @ProviderFor(ChaptersListState) final chaptersListStateProvider = AutoDisposeNotifierProvider>.internal( - ChaptersListState.new, - name: r'chaptersListStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$chaptersListStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + ChaptersListState.new, + name: r'chaptersListStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chaptersListStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ChaptersListState = AutoDisposeNotifier>; String _$isLongPressedStateHash() => @@ -29,14 +29,14 @@ String _$isLongPressedStateHash() => @ProviderFor(IsLongPressedState) final isLongPressedStateProvider = AutoDisposeNotifierProvider.internal( - IsLongPressedState.new, - name: r'isLongPressedStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$isLongPressedStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + IsLongPressedState.new, + name: r'isLongPressedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$isLongPressedStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$IsLongPressedState = AutoDisposeNotifier; String _$isExtendedStateHash() => r'e386098118bdebf67d489a4a2f49b017e02b27bf'; @@ -45,14 +45,14 @@ String _$isExtendedStateHash() => r'e386098118bdebf67d489a4a2f49b017e02b27bf'; @ProviderFor(IsExtendedState) final isExtendedStateProvider = AutoDisposeNotifierProvider.internal( - IsExtendedState.new, - name: r'isExtendedStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$isExtendedStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + IsExtendedState.new, + name: r'isExtendedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$isExtendedStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$IsExtendedState = AutoDisposeNotifier; String _$sortChapterStateHash() => r'a6e547fd4badfa14ecb9270054c7e166dfc6e238'; @@ -82,9 +82,7 @@ abstract class _$SortChapterState extends BuildlessAutoDisposeNotifier { late final int mangaId; - SortChapter build({ - required int mangaId, - }); + SortChapter build({required int mangaId}); } /// See also [SortChapterState]. @@ -97,21 +95,15 @@ class SortChapterStateFamily extends Family { const SortChapterStateFamily(); /// See also [SortChapterState]. - SortChapterStateProvider call({ - required int mangaId, - }) { - return SortChapterStateProvider( - mangaId: mangaId, - ); + SortChapterStateProvider call({required int mangaId}) { + return SortChapterStateProvider(mangaId: mangaId); } @override SortChapterStateProvider getProviderOverride( covariant SortChapterStateProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -133,21 +125,19 @@ class SortChapterStateFamily extends Family { class SortChapterStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [SortChapterState]. - SortChapterStateProvider({ - required int mangaId, - }) : this._internal( - () => SortChapterState()..mangaId = mangaId, - from: sortChapterStateProvider, - name: r'sortChapterStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$sortChapterStateHash, - dependencies: SortChapterStateFamily._dependencies, - allTransitiveDependencies: - SortChapterStateFamily._allTransitiveDependencies, - mangaId: mangaId, - ); + SortChapterStateProvider({required int mangaId}) + : this._internal( + () => SortChapterState()..mangaId = mangaId, + from: sortChapterStateProvider, + name: r'sortChapterStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$sortChapterStateHash, + dependencies: SortChapterStateFamily._dependencies, + allTransitiveDependencies: + SortChapterStateFamily._allTransitiveDependencies, + mangaId: mangaId, + ); SortChapterStateProvider._internal( super._createNotifier, { @@ -162,12 +152,8 @@ class SortChapterStateProvider final int mangaId; @override - SortChapter runNotifierBuild( - covariant SortChapterState notifier, - ) { - return notifier.build( - mangaId: mangaId, - ); + SortChapter runNotifierBuild(covariant SortChapterState notifier) { + return notifier.build(mangaId: mangaId); } @override @@ -188,7 +174,7 @@ class SortChapterStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _SortChapterStateProviderElement(this); } @@ -229,9 +215,7 @@ abstract class _$ChapterFilterDownloadedState extends BuildlessAutoDisposeNotifier { late final int mangaId; - int build({ - required int mangaId, - }); + int build({required int mangaId}); } /// See also [ChapterFilterDownloadedState]. @@ -245,21 +229,15 @@ class ChapterFilterDownloadedStateFamily extends Family { const ChapterFilterDownloadedStateFamily(); /// See also [ChapterFilterDownloadedState]. - ChapterFilterDownloadedStateProvider call({ - required int mangaId, - }) { - return ChapterFilterDownloadedStateProvider( - mangaId: mangaId, - ); + ChapterFilterDownloadedStateProvider call({required int mangaId}) { + return ChapterFilterDownloadedStateProvider(mangaId: mangaId); } @override ChapterFilterDownloadedStateProvider getProviderOverride( covariant ChapterFilterDownloadedStateProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -281,21 +259,19 @@ class ChapterFilterDownloadedStateFamily extends Family { class ChapterFilterDownloadedStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterFilterDownloadedState]. - ChapterFilterDownloadedStateProvider({ - required int mangaId, - }) : this._internal( - () => ChapterFilterDownloadedState()..mangaId = mangaId, - from: chapterFilterDownloadedStateProvider, - name: r'chapterFilterDownloadedStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterFilterDownloadedStateHash, - dependencies: ChapterFilterDownloadedStateFamily._dependencies, - allTransitiveDependencies: - ChapterFilterDownloadedStateFamily._allTransitiveDependencies, - mangaId: mangaId, - ); + ChapterFilterDownloadedStateProvider({required int mangaId}) + : this._internal( + () => ChapterFilterDownloadedState()..mangaId = mangaId, + from: chapterFilterDownloadedStateProvider, + name: r'chapterFilterDownloadedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterFilterDownloadedStateHash, + dependencies: ChapterFilterDownloadedStateFamily._dependencies, + allTransitiveDependencies: + ChapterFilterDownloadedStateFamily._allTransitiveDependencies, + mangaId: mangaId, + ); ChapterFilterDownloadedStateProvider._internal( super._createNotifier, { @@ -310,12 +286,8 @@ class ChapterFilterDownloadedStateProvider final int mangaId; @override - int runNotifierBuild( - covariant ChapterFilterDownloadedState notifier, - ) { - return notifier.build( - mangaId: mangaId, - ); + int runNotifierBuild(covariant ChapterFilterDownloadedState notifier) { + return notifier.build(mangaId: mangaId); } @override @@ -336,7 +308,7 @@ class ChapterFilterDownloadedStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterFilterDownloadedStateProviderElement(this); } @@ -363,8 +335,9 @@ mixin ChapterFilterDownloadedStateRef on AutoDisposeNotifierProviderRef { } class _ChapterFilterDownloadedStateProviderElement - extends AutoDisposeNotifierProviderElement with ChapterFilterDownloadedStateRef { + extends + AutoDisposeNotifierProviderElement + with ChapterFilterDownloadedStateRef { _ChapterFilterDownloadedStateProviderElement(super.provider); @override @@ -378,9 +351,7 @@ abstract class _$ChapterFilterUnreadState extends BuildlessAutoDisposeNotifier { late final int mangaId; - int build({ - required int mangaId, - }); + int build({required int mangaId}); } /// See also [ChapterFilterUnreadState]. @@ -393,21 +364,15 @@ class ChapterFilterUnreadStateFamily extends Family { const ChapterFilterUnreadStateFamily(); /// See also [ChapterFilterUnreadState]. - ChapterFilterUnreadStateProvider call({ - required int mangaId, - }) { - return ChapterFilterUnreadStateProvider( - mangaId: mangaId, - ); + ChapterFilterUnreadStateProvider call({required int mangaId}) { + return ChapterFilterUnreadStateProvider(mangaId: mangaId); } @override ChapterFilterUnreadStateProvider getProviderOverride( covariant ChapterFilterUnreadStateProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -429,21 +394,19 @@ class ChapterFilterUnreadStateFamily extends Family { class ChapterFilterUnreadStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterFilterUnreadState]. - ChapterFilterUnreadStateProvider({ - required int mangaId, - }) : this._internal( - () => ChapterFilterUnreadState()..mangaId = mangaId, - from: chapterFilterUnreadStateProvider, - name: r'chapterFilterUnreadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterFilterUnreadStateHash, - dependencies: ChapterFilterUnreadStateFamily._dependencies, - allTransitiveDependencies: - ChapterFilterUnreadStateFamily._allTransitiveDependencies, - mangaId: mangaId, - ); + ChapterFilterUnreadStateProvider({required int mangaId}) + : this._internal( + () => ChapterFilterUnreadState()..mangaId = mangaId, + from: chapterFilterUnreadStateProvider, + name: r'chapterFilterUnreadStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterFilterUnreadStateHash, + dependencies: ChapterFilterUnreadStateFamily._dependencies, + allTransitiveDependencies: + ChapterFilterUnreadStateFamily._allTransitiveDependencies, + mangaId: mangaId, + ); ChapterFilterUnreadStateProvider._internal( super._createNotifier, { @@ -458,12 +421,8 @@ class ChapterFilterUnreadStateProvider final int mangaId; @override - int runNotifierBuild( - covariant ChapterFilterUnreadState notifier, - ) { - return notifier.build( - mangaId: mangaId, - ); + int runNotifierBuild(covariant ChapterFilterUnreadState notifier) { + return notifier.build(mangaId: mangaId); } @override @@ -484,7 +443,7 @@ class ChapterFilterUnreadStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterFilterUnreadStateProviderElement(this); } @@ -526,9 +485,7 @@ abstract class _$ChapterFilterBookmarkedState extends BuildlessAutoDisposeNotifier { late final int mangaId; - int build({ - required int mangaId, - }); + int build({required int mangaId}); } /// See also [ChapterFilterBookmarkedState]. @@ -542,21 +499,15 @@ class ChapterFilterBookmarkedStateFamily extends Family { const ChapterFilterBookmarkedStateFamily(); /// See also [ChapterFilterBookmarkedState]. - ChapterFilterBookmarkedStateProvider call({ - required int mangaId, - }) { - return ChapterFilterBookmarkedStateProvider( - mangaId: mangaId, - ); + ChapterFilterBookmarkedStateProvider call({required int mangaId}) { + return ChapterFilterBookmarkedStateProvider(mangaId: mangaId); } @override ChapterFilterBookmarkedStateProvider getProviderOverride( covariant ChapterFilterBookmarkedStateProvider provider, ) { - return call( - mangaId: provider.mangaId, - ); + return call(mangaId: provider.mangaId); } static const Iterable? _dependencies = null; @@ -578,21 +529,19 @@ class ChapterFilterBookmarkedStateFamily extends Family { class ChapterFilterBookmarkedStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterFilterBookmarkedState]. - ChapterFilterBookmarkedStateProvider({ - required int mangaId, - }) : this._internal( - () => ChapterFilterBookmarkedState()..mangaId = mangaId, - from: chapterFilterBookmarkedStateProvider, - name: r'chapterFilterBookmarkedStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterFilterBookmarkedStateHash, - dependencies: ChapterFilterBookmarkedStateFamily._dependencies, - allTransitiveDependencies: - ChapterFilterBookmarkedStateFamily._allTransitiveDependencies, - mangaId: mangaId, - ); + ChapterFilterBookmarkedStateProvider({required int mangaId}) + : this._internal( + () => ChapterFilterBookmarkedState()..mangaId = mangaId, + from: chapterFilterBookmarkedStateProvider, + name: r'chapterFilterBookmarkedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterFilterBookmarkedStateHash, + dependencies: ChapterFilterBookmarkedStateFamily._dependencies, + allTransitiveDependencies: + ChapterFilterBookmarkedStateFamily._allTransitiveDependencies, + mangaId: mangaId, + ); ChapterFilterBookmarkedStateProvider._internal( super._createNotifier, { @@ -607,12 +556,8 @@ class ChapterFilterBookmarkedStateProvider final int mangaId; @override - int runNotifierBuild( - covariant ChapterFilterBookmarkedState notifier, - ) { - return notifier.build( - mangaId: mangaId, - ); + int runNotifierBuild(covariant ChapterFilterBookmarkedState notifier) { + return notifier.build(mangaId: mangaId); } @override @@ -633,7 +578,7 @@ class ChapterFilterBookmarkedStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterFilterBookmarkedStateProviderElement(this); } @@ -660,8 +605,9 @@ mixin ChapterFilterBookmarkedStateRef on AutoDisposeNotifierProviderRef { } class _ChapterFilterBookmarkedStateProviderElement - extends AutoDisposeNotifierProviderElement with ChapterFilterBookmarkedStateRef { + extends + AutoDisposeNotifierProviderElement + with ChapterFilterBookmarkedStateRef { _ChapterFilterBookmarkedStateProviderElement(super.provider); @override @@ -675,9 +621,7 @@ abstract class _$ChapterFilterResultState extends BuildlessAutoDisposeNotifier { late final Manga manga; - bool build({ - required Manga manga, - }); + bool build({required Manga manga}); } /// See also [ChapterFilterResultState]. @@ -690,21 +634,15 @@ class ChapterFilterResultStateFamily extends Family { const ChapterFilterResultStateFamily(); /// See also [ChapterFilterResultState]. - ChapterFilterResultStateProvider call({ - required Manga manga, - }) { - return ChapterFilterResultStateProvider( - manga: manga, - ); + ChapterFilterResultStateProvider call({required Manga manga}) { + return ChapterFilterResultStateProvider(manga: manga); } @override ChapterFilterResultStateProvider getProviderOverride( covariant ChapterFilterResultStateProvider provider, ) { - return call( - manga: provider.manga, - ); + return call(manga: provider.manga); } static const Iterable? _dependencies = null; @@ -726,21 +664,19 @@ class ChapterFilterResultStateFamily extends Family { class ChapterFilterResultStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterFilterResultState]. - ChapterFilterResultStateProvider({ - required Manga manga, - }) : this._internal( - () => ChapterFilterResultState()..manga = manga, - from: chapterFilterResultStateProvider, - name: r'chapterFilterResultStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterFilterResultStateHash, - dependencies: ChapterFilterResultStateFamily._dependencies, - allTransitiveDependencies: - ChapterFilterResultStateFamily._allTransitiveDependencies, - manga: manga, - ); + ChapterFilterResultStateProvider({required Manga manga}) + : this._internal( + () => ChapterFilterResultState()..manga = manga, + from: chapterFilterResultStateProvider, + name: r'chapterFilterResultStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterFilterResultStateHash, + dependencies: ChapterFilterResultStateFamily._dependencies, + allTransitiveDependencies: + ChapterFilterResultStateFamily._allTransitiveDependencies, + manga: manga, + ); ChapterFilterResultStateProvider._internal( super._createNotifier, { @@ -755,12 +691,8 @@ class ChapterFilterResultStateProvider final Manga manga; @override - bool runNotifierBuild( - covariant ChapterFilterResultState notifier, - ) { - return notifier.build( - manga: manga, - ); + bool runNotifierBuild(covariant ChapterFilterResultState notifier) { + return notifier.build(manga: manga); } @override @@ -781,7 +713,7 @@ class ChapterFilterResultStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterFilterResultStateProviderElement(this); } @@ -822,9 +754,7 @@ abstract class _$ChapterSetIsBookmarkState extends BuildlessAutoDisposeNotifier { late final Manga manga; - void build({ - required Manga manga, - }); + void build({required Manga manga}); } /// See also [ChapterSetIsBookmarkState]. @@ -837,21 +767,15 @@ class ChapterSetIsBookmarkStateFamily extends Family { const ChapterSetIsBookmarkStateFamily(); /// See also [ChapterSetIsBookmarkState]. - ChapterSetIsBookmarkStateProvider call({ - required Manga manga, - }) { - return ChapterSetIsBookmarkStateProvider( - manga: manga, - ); + ChapterSetIsBookmarkStateProvider call({required Manga manga}) { + return ChapterSetIsBookmarkStateProvider(manga: manga); } @override ChapterSetIsBookmarkStateProvider getProviderOverride( covariant ChapterSetIsBookmarkStateProvider provider, ) { - return call( - manga: provider.manga, - ); + return call(manga: provider.manga); } static const Iterable? _dependencies = null; @@ -873,21 +797,19 @@ class ChapterSetIsBookmarkStateFamily extends Family { class ChapterSetIsBookmarkStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterSetIsBookmarkState]. - ChapterSetIsBookmarkStateProvider({ - required Manga manga, - }) : this._internal( - () => ChapterSetIsBookmarkState()..manga = manga, - from: chapterSetIsBookmarkStateProvider, - name: r'chapterSetIsBookmarkStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterSetIsBookmarkStateHash, - dependencies: ChapterSetIsBookmarkStateFamily._dependencies, - allTransitiveDependencies: - ChapterSetIsBookmarkStateFamily._allTransitiveDependencies, - manga: manga, - ); + ChapterSetIsBookmarkStateProvider({required Manga manga}) + : this._internal( + () => ChapterSetIsBookmarkState()..manga = manga, + from: chapterSetIsBookmarkStateProvider, + name: r'chapterSetIsBookmarkStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterSetIsBookmarkStateHash, + dependencies: ChapterSetIsBookmarkStateFamily._dependencies, + allTransitiveDependencies: + ChapterSetIsBookmarkStateFamily._allTransitiveDependencies, + manga: manga, + ); ChapterSetIsBookmarkStateProvider._internal( super._createNotifier, { @@ -902,12 +824,8 @@ class ChapterSetIsBookmarkStateProvider final Manga manga; @override - void runNotifierBuild( - covariant ChapterSetIsBookmarkState notifier, - ) { - return notifier.build( - manga: manga, - ); + void runNotifierBuild(covariant ChapterSetIsBookmarkState notifier) { + return notifier.build(manga: manga); } @override @@ -928,7 +846,7 @@ class ChapterSetIsBookmarkStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterSetIsBookmarkStateProviderElement(this); } @@ -969,9 +887,7 @@ abstract class _$ChapterSetIsReadState extends BuildlessAutoDisposeNotifier { late final Manga manga; - void build({ - required Manga manga, - }); + void build({required Manga manga}); } /// See also [ChapterSetIsReadState]. @@ -984,21 +900,15 @@ class ChapterSetIsReadStateFamily extends Family { const ChapterSetIsReadStateFamily(); /// See also [ChapterSetIsReadState]. - ChapterSetIsReadStateProvider call({ - required Manga manga, - }) { - return ChapterSetIsReadStateProvider( - manga: manga, - ); + ChapterSetIsReadStateProvider call({required Manga manga}) { + return ChapterSetIsReadStateProvider(manga: manga); } @override ChapterSetIsReadStateProvider getProviderOverride( covariant ChapterSetIsReadStateProvider provider, ) { - return call( - manga: provider.manga, - ); + return call(manga: provider.manga); } static const Iterable? _dependencies = null; @@ -1020,21 +930,19 @@ class ChapterSetIsReadStateFamily extends Family { class ChapterSetIsReadStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterSetIsReadState]. - ChapterSetIsReadStateProvider({ - required Manga manga, - }) : this._internal( - () => ChapterSetIsReadState()..manga = manga, - from: chapterSetIsReadStateProvider, - name: r'chapterSetIsReadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterSetIsReadStateHash, - dependencies: ChapterSetIsReadStateFamily._dependencies, - allTransitiveDependencies: - ChapterSetIsReadStateFamily._allTransitiveDependencies, - manga: manga, - ); + ChapterSetIsReadStateProvider({required Manga manga}) + : this._internal( + () => ChapterSetIsReadState()..manga = manga, + from: chapterSetIsReadStateProvider, + name: r'chapterSetIsReadStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterSetIsReadStateHash, + dependencies: ChapterSetIsReadStateFamily._dependencies, + allTransitiveDependencies: + ChapterSetIsReadStateFamily._allTransitiveDependencies, + manga: manga, + ); ChapterSetIsReadStateProvider._internal( super._createNotifier, { @@ -1049,12 +957,8 @@ class ChapterSetIsReadStateProvider final Manga manga; @override - void runNotifierBuild( - covariant ChapterSetIsReadState notifier, - ) { - return notifier.build( - manga: manga, - ); + void runNotifierBuild(covariant ChapterSetIsReadState notifier) { + return notifier.build(manga: manga); } @override @@ -1075,7 +979,7 @@ class ChapterSetIsReadStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterSetIsReadStateProviderElement(this); } @@ -1116,9 +1020,7 @@ abstract class _$ChapterSetDownloadState extends BuildlessAutoDisposeNotifier { late final Manga manga; - void build({ - required Manga manga, - }); + void build({required Manga manga}); } /// See also [ChapterSetDownloadState]. @@ -1131,21 +1033,15 @@ class ChapterSetDownloadStateFamily extends Family { const ChapterSetDownloadStateFamily(); /// See also [ChapterSetDownloadState]. - ChapterSetDownloadStateProvider call({ - required Manga manga, - }) { - return ChapterSetDownloadStateProvider( - manga: manga, - ); + ChapterSetDownloadStateProvider call({required Manga manga}) { + return ChapterSetDownloadStateProvider(manga: manga); } @override ChapterSetDownloadStateProvider getProviderOverride( covariant ChapterSetDownloadStateProvider provider, ) { - return call( - manga: provider.manga, - ); + return call(manga: provider.manga); } static const Iterable? _dependencies = null; @@ -1167,21 +1063,19 @@ class ChapterSetDownloadStateFamily extends Family { class ChapterSetDownloadStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [ChapterSetDownloadState]. - ChapterSetDownloadStateProvider({ - required Manga manga, - }) : this._internal( - () => ChapterSetDownloadState()..manga = manga, - from: chapterSetDownloadStateProvider, - name: r'chapterSetDownloadStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$chapterSetDownloadStateHash, - dependencies: ChapterSetDownloadStateFamily._dependencies, - allTransitiveDependencies: - ChapterSetDownloadStateFamily._allTransitiveDependencies, - manga: manga, - ); + ChapterSetDownloadStateProvider({required Manga manga}) + : this._internal( + () => ChapterSetDownloadState()..manga = manga, + from: chapterSetDownloadStateProvider, + name: r'chapterSetDownloadStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chapterSetDownloadStateHash, + dependencies: ChapterSetDownloadStateFamily._dependencies, + allTransitiveDependencies: + ChapterSetDownloadStateFamily._allTransitiveDependencies, + manga: manga, + ); ChapterSetDownloadStateProvider._internal( super._createNotifier, { @@ -1196,12 +1090,8 @@ class ChapterSetDownloadStateProvider final Manga manga; @override - void runNotifierBuild( - covariant ChapterSetDownloadState notifier, - ) { - return notifier.build( - manga: manga, - ); + void runNotifierBuild(covariant ChapterSetDownloadState notifier) { + return notifier.build(manga: manga); } @override @@ -1222,7 +1112,7 @@ class ChapterSetDownloadStateProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _ChapterSetDownloadStateProviderElement(this); } @@ -1263,26 +1153,27 @@ String _$chaptersListttStateHash() => @ProviderFor(ChaptersListttState) final chaptersListttStateProvider = AutoDisposeNotifierProvider>.internal( - ChaptersListttState.new, - name: r'chaptersListttStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$chaptersListttStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + ChaptersListttState.new, + name: r'chaptersListttStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$chaptersListttStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ChaptersListttState = AutoDisposeNotifier>; String _$scanlatorsFilterStateHash() => r'8da89864801cd7620029d28cfb3f9bee3c67cba8'; -abstract class _$ScanlatorsFilterState extends BuildlessAutoDisposeNotifier< - (List, List, List)> { +abstract class _$ScanlatorsFilterState + extends + BuildlessAutoDisposeNotifier< + (List, List, List) + > { late final Manga manga; - (List, List, List) build( - Manga manga, - ); + (List, List, List) build(Manga manga); } /// See also [ScanlatorsFilterState]. @@ -1296,21 +1187,15 @@ class ScanlatorsFilterStateFamily const ScanlatorsFilterStateFamily(); /// See also [ScanlatorsFilterState]. - ScanlatorsFilterStateProvider call( - Manga manga, - ) { - return ScanlatorsFilterStateProvider( - manga, - ); + ScanlatorsFilterStateProvider call(Manga manga) { + return ScanlatorsFilterStateProvider(manga); } @override ScanlatorsFilterStateProvider getProviderOverride( covariant ScanlatorsFilterStateProvider provider, ) { - return call( - provider.manga, - ); + return call(provider.manga); } static const Iterable? _dependencies = null; @@ -1329,24 +1214,26 @@ class ScanlatorsFilterStateFamily } /// See also [ScanlatorsFilterState]. -class ScanlatorsFilterStateProvider extends AutoDisposeNotifierProviderImpl< - ScanlatorsFilterState, (List, List, List)> { +class ScanlatorsFilterStateProvider + extends + AutoDisposeNotifierProviderImpl< + ScanlatorsFilterState, + (List, List, List) + > { /// See also [ScanlatorsFilterState]. - ScanlatorsFilterStateProvider( - Manga manga, - ) : this._internal( - () => ScanlatorsFilterState()..manga = manga, - from: scanlatorsFilterStateProvider, - name: r'scanlatorsFilterStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$scanlatorsFilterStateHash, - dependencies: ScanlatorsFilterStateFamily._dependencies, - allTransitiveDependencies: - ScanlatorsFilterStateFamily._allTransitiveDependencies, - manga: manga, - ); + ScanlatorsFilterStateProvider(Manga manga) + : this._internal( + () => ScanlatorsFilterState()..manga = manga, + from: scanlatorsFilterStateProvider, + name: r'scanlatorsFilterStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$scanlatorsFilterStateHash, + dependencies: ScanlatorsFilterStateFamily._dependencies, + allTransitiveDependencies: + ScanlatorsFilterStateFamily._allTransitiveDependencies, + manga: manga, + ); ScanlatorsFilterStateProvider._internal( super._createNotifier, { @@ -1364,9 +1251,7 @@ class ScanlatorsFilterStateProvider extends AutoDisposeNotifierProviderImpl< (List, List, List) runNotifierBuild( covariant ScanlatorsFilterState notifier, ) { - return notifier.build( - manga, - ); + return notifier.build(manga); } @override @@ -1386,8 +1271,11 @@ class ScanlatorsFilterStateProvider extends AutoDisposeNotifierProviderImpl< } @override - AutoDisposeNotifierProviderElement, List, List)> createElement() { + AutoDisposeNotifierProviderElement< + ScanlatorsFilterState, + (List, List, List) + > + createElement() { return _ScanlatorsFilterStateProviderElement(this); } @@ -1407,20 +1295,27 @@ class ScanlatorsFilterStateProvider extends AutoDisposeNotifierProviderImpl< @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -mixin ScanlatorsFilterStateRef on AutoDisposeNotifierProviderRef< - (List, List, List)> { +mixin ScanlatorsFilterStateRef + on + AutoDisposeNotifierProviderRef< + (List, List, List) + > { /// The parameter `manga` of this provider. Manga get manga; } class _ScanlatorsFilterStateProviderElement - extends AutoDisposeNotifierProviderElement, List, List)> + extends + AutoDisposeNotifierProviderElement< + ScanlatorsFilterState, + (List, List, List) + > with ScanlatorsFilterStateRef { _ScanlatorsFilterStateProviderElement(super.provider); @override Manga get manga => (origin as ScanlatorsFilterStateProvider).manga; } + // 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 diff --git a/lib/modules/manga/detail/providers/track_state_providers.g.dart b/lib/modules/manga/detail/providers/track_state_providers.g.dart index 480b14d7..521d9adf 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.g.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.g.dart @@ -33,10 +33,7 @@ abstract class _$TrackState extends BuildlessAutoDisposeNotifier { late final Track? track; late final ItemType? itemType; - Track build({ - Track? track, - required ItemType? itemType, - }); + Track build({Track? track, required ItemType? itemType}); } /// See also [TrackState]. @@ -49,24 +46,15 @@ class TrackStateFamily extends Family { const TrackStateFamily(); /// See also [TrackState]. - TrackStateProvider call({ - Track? track, - required ItemType? itemType, - }) { - return TrackStateProvider( - track: track, - itemType: itemType, - ); + TrackStateProvider call({Track? track, required ItemType? itemType}) { + return TrackStateProvider(track: track, itemType: itemType); } @override TrackStateProvider getProviderOverride( covariant TrackStateProvider provider, ) { - return call( - track: provider.track, - itemType: provider.itemType, - ); + return call(track: provider.track, itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -88,25 +76,21 @@ class TrackStateFamily extends Family { class TrackStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [TrackState]. - TrackStateProvider({ - Track? track, - required ItemType? itemType, - }) : this._internal( - () => TrackState() - ..track = track - ..itemType = itemType, - from: trackStateProvider, - name: r'trackStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$trackStateHash, - dependencies: TrackStateFamily._dependencies, - allTransitiveDependencies: - TrackStateFamily._allTransitiveDependencies, - track: track, - itemType: itemType, - ); + TrackStateProvider({Track? track, required ItemType? itemType}) + : this._internal( + () => TrackState() + ..track = track + ..itemType = itemType, + from: trackStateProvider, + name: r'trackStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$trackStateHash, + dependencies: TrackStateFamily._dependencies, + allTransitiveDependencies: TrackStateFamily._allTransitiveDependencies, + track: track, + itemType: itemType, + ); TrackStateProvider._internal( super._createNotifier, { @@ -123,13 +107,8 @@ class TrackStateProvider final ItemType? itemType; @override - Track runNotifierBuild( - covariant TrackState notifier, - ) { - return notifier.build( - track: track, - itemType: itemType, - ); + Track runNotifierBuild(covariant TrackState notifier) { + return notifier.build(track: track, itemType: itemType); } @override @@ -199,16 +178,19 @@ String _$lastTrackerLibraryLocationStateHash() => /// See also [LastTrackerLibraryLocationState]. @ProviderFor(LastTrackerLibraryLocationState) -final lastTrackerLibraryLocationStateProvider = AutoDisposeNotifierProvider< - LastTrackerLibraryLocationState, (int, bool)>.internal( - LastTrackerLibraryLocationState.new, - name: r'lastTrackerLibraryLocationStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$lastTrackerLibraryLocationStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final lastTrackerLibraryLocationStateProvider = + AutoDisposeNotifierProvider< + LastTrackerLibraryLocationState, + (int, bool) + >.internal( + LastTrackerLibraryLocationState.new, + name: r'lastTrackerLibraryLocationStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$lastTrackerLibraryLocationStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$LastTrackerLibraryLocationState = AutoDisposeNotifier<(int, bool)>; // ignore_for_file: type=lint diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 3aeb4233..d653d649 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -85,25 +85,24 @@ class UpdateMangaDetailProvider extends AutoDisposeFutureProvider { required bool isInit, bool showToast = true, }) : this._internal( - (ref) => updateMangaDetail( - ref as UpdateMangaDetailRef, - mangaId: mangaId, - isInit: isInit, - showToast: showToast, - ), - from: updateMangaDetailProvider, - name: r'updateMangaDetailProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$updateMangaDetailHash, - dependencies: UpdateMangaDetailFamily._dependencies, - allTransitiveDependencies: - UpdateMangaDetailFamily._allTransitiveDependencies, - mangaId: mangaId, - isInit: isInit, - showToast: showToast, - ); + (ref) => updateMangaDetail( + ref as UpdateMangaDetailRef, + mangaId: mangaId, + isInit: isInit, + showToast: showToast, + ), + from: updateMangaDetailProvider, + name: r'updateMangaDetailProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$updateMangaDetailHash, + dependencies: UpdateMangaDetailFamily._dependencies, + allTransitiveDependencies: + UpdateMangaDetailFamily._allTransitiveDependencies, + mangaId: mangaId, + isInit: isInit, + showToast: showToast, + ); UpdateMangaDetailProvider._internal( super._createNotifier, { @@ -190,5 +189,6 @@ class _UpdateMangaDetailProviderElement @override bool get showToast => (origin as UpdateMangaDetailProvider).showToast; } + // 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 diff --git a/lib/modules/manga/download/providers/convert_to_cbz.g.dart b/lib/modules/manga/download/providers/convert_to_cbz.g.dart index 000181b1..db166ef8 100644 --- a/lib/modules/manga/download/providers/convert_to_cbz.g.dart +++ b/lib/modules/manga/download/providers/convert_to_cbz.g.dart @@ -45,12 +45,7 @@ class ConvertToCBZFamily extends Family>> { String chapterName, List pageList, ) { - return ConvertToCBZProvider( - chapterDir, - mangaDir, - chapterName, - pageList, - ); + return ConvertToCBZProvider(chapterDir, mangaDir, chapterName, pageList); } @override @@ -89,27 +84,26 @@ class ConvertToCBZProvider extends AutoDisposeFutureProvider> { String chapterName, List pageList, ) : this._internal( - (ref) => convertToCBZ( - ref as ConvertToCBZRef, - chapterDir, - mangaDir, - chapterName, - pageList, - ), - from: convertToCBZProvider, - name: r'convertToCBZProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$convertToCBZHash, - dependencies: ConvertToCBZFamily._dependencies, - allTransitiveDependencies: - ConvertToCBZFamily._allTransitiveDependencies, - chapterDir: chapterDir, - mangaDir: mangaDir, - chapterName: chapterName, - pageList: pageList, - ); + (ref) => convertToCBZ( + ref as ConvertToCBZRef, + chapterDir, + mangaDir, + chapterName, + pageList, + ), + from: convertToCBZProvider, + name: r'convertToCBZProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$convertToCBZHash, + dependencies: ConvertToCBZFamily._dependencies, + allTransitiveDependencies: + ConvertToCBZFamily._allTransitiveDependencies, + chapterDir: chapterDir, + mangaDir: mangaDir, + chapterName: chapterName, + pageList: pageList, + ); ConvertToCBZProvider._internal( super._createNotifier, { @@ -206,5 +200,6 @@ class _ConvertToCBZProviderElement @override List get pageList => (origin as ConvertToCBZProvider).pageList; } + // 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 diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index c9b1a55f..e6f037e2 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -40,21 +40,15 @@ class AddDownloadToQueueFamily extends Family> { const AddDownloadToQueueFamily(); /// See also [addDownloadToQueue]. - AddDownloadToQueueProvider call({ - required Chapter chapter, - }) { - return AddDownloadToQueueProvider( - chapter: chapter, - ); + AddDownloadToQueueProvider call({required Chapter chapter}) { + return AddDownloadToQueueProvider(chapter: chapter); } @override AddDownloadToQueueProvider getProviderOverride( covariant AddDownloadToQueueProvider provider, ) { - return call( - chapter: provider.chapter, - ); + return call(chapter: provider.chapter); } static const Iterable? _dependencies = null; @@ -75,24 +69,20 @@ class AddDownloadToQueueFamily extends Family> { /// See also [addDownloadToQueue]. class AddDownloadToQueueProvider extends AutoDisposeFutureProvider { /// See also [addDownloadToQueue]. - AddDownloadToQueueProvider({ - required Chapter chapter, - }) : this._internal( - (ref) => addDownloadToQueue( - ref as AddDownloadToQueueRef, - chapter: chapter, - ), - from: addDownloadToQueueProvider, - name: r'addDownloadToQueueProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$addDownloadToQueueHash, - dependencies: AddDownloadToQueueFamily._dependencies, - allTransitiveDependencies: - AddDownloadToQueueFamily._allTransitiveDependencies, - chapter: chapter, - ); + AddDownloadToQueueProvider({required Chapter chapter}) + : this._internal( + (ref) => + addDownloadToQueue(ref as AddDownloadToQueueRef, chapter: chapter), + from: addDownloadToQueueProvider, + name: r'addDownloadToQueueProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$addDownloadToQueueHash, + dependencies: AddDownloadToQueueFamily._dependencies, + allTransitiveDependencies: + AddDownloadToQueueFamily._allTransitiveDependencies, + chapter: chapter, + ); AddDownloadToQueueProvider._internal( super._createNotifier, { @@ -151,7 +141,8 @@ mixin AddDownloadToQueueRef on AutoDisposeFutureProviderRef { } class _AddDownloadToQueueProviderElement - extends AutoDisposeFutureProviderElement with AddDownloadToQueueRef { + extends AutoDisposeFutureProviderElement + with AddDownloadToQueueRef { _AddDownloadToQueueProviderElement(super.provider); @override @@ -216,25 +207,24 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider { bool? useWifi, void Function()? callback, }) : this._internal( - (ref) => downloadChapter( - ref as DownloadChapterRef, - chapter: chapter, - useWifi: useWifi, - callback: callback, - ), - from: downloadChapterProvider, - name: r'downloadChapterProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$downloadChapterHash, - dependencies: DownloadChapterFamily._dependencies, - allTransitiveDependencies: - DownloadChapterFamily._allTransitiveDependencies, - chapter: chapter, - useWifi: useWifi, - callback: callback, - ); + (ref) => downloadChapter( + ref as DownloadChapterRef, + chapter: chapter, + useWifi: useWifi, + callback: callback, + ), + from: downloadChapterProvider, + name: r'downloadChapterProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$downloadChapterHash, + dependencies: DownloadChapterFamily._dependencies, + allTransitiveDependencies: + DownloadChapterFamily._allTransitiveDependencies, + chapter: chapter, + useWifi: useWifi, + callback: callback, + ); DownloadChapterProvider._internal( super._createNotifier, { @@ -310,7 +300,8 @@ mixin DownloadChapterRef on AutoDisposeFutureProviderRef { } class _DownloadChapterProviderElement - extends AutoDisposeFutureProviderElement with DownloadChapterRef { + extends AutoDisposeFutureProviderElement + with DownloadChapterRef { _DownloadChapterProviderElement(super.provider); @override @@ -333,21 +324,15 @@ class ProcessDownloadsFamily extends Family> { const ProcessDownloadsFamily(); /// See also [processDownloads]. - ProcessDownloadsProvider call({ - bool? useWifi, - }) { - return ProcessDownloadsProvider( - useWifi: useWifi, - ); + ProcessDownloadsProvider call({bool? useWifi}) { + return ProcessDownloadsProvider(useWifi: useWifi); } @override ProcessDownloadsProvider getProviderOverride( covariant ProcessDownloadsProvider provider, ) { - return call( - useWifi: provider.useWifi, - ); + return call(useWifi: provider.useWifi); } static const Iterable? _dependencies = null; @@ -368,24 +353,19 @@ class ProcessDownloadsFamily extends Family> { /// See also [processDownloads]. class ProcessDownloadsProvider extends AutoDisposeFutureProvider { /// See also [processDownloads]. - ProcessDownloadsProvider({ - bool? useWifi, - }) : this._internal( - (ref) => processDownloads( - ref as ProcessDownloadsRef, - useWifi: useWifi, - ), - from: processDownloadsProvider, - name: r'processDownloadsProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$processDownloadsHash, - dependencies: ProcessDownloadsFamily._dependencies, - allTransitiveDependencies: - ProcessDownloadsFamily._allTransitiveDependencies, - useWifi: useWifi, - ); + ProcessDownloadsProvider({bool? useWifi}) + : this._internal( + (ref) => processDownloads(ref as ProcessDownloadsRef, useWifi: useWifi), + from: processDownloadsProvider, + name: r'processDownloadsProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$processDownloadsHash, + dependencies: ProcessDownloadsFamily._dependencies, + allTransitiveDependencies: + ProcessDownloadsFamily._allTransitiveDependencies, + useWifi: useWifi, + ); ProcessDownloadsProvider._internal( super._createNotifier, { @@ -444,11 +424,13 @@ mixin ProcessDownloadsRef on AutoDisposeFutureProviderRef { } class _ProcessDownloadsProviderElement - extends AutoDisposeFutureProviderElement with ProcessDownloadsRef { + extends AutoDisposeFutureProviderElement + with ProcessDownloadsRef { _ProcessDownloadsProviderElement(super.provider); @override bool? get useWifi => (origin as ProcessDownloadsProvider).useWifi; } + // 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 diff --git a/lib/modules/manga/home/providers/state_provider.g.dart b/lib/modules/manga/home/providers/state_provider.g.dart index a4e0c874..fdf8bac5 100644 --- a/lib/modules/manga/home/providers/state_provider.g.dart +++ b/lib/modules/manga/home/providers/state_provider.g.dart @@ -11,16 +11,19 @@ String _$mangaHomeDisplayTypeStateHash() => /// See also [MangaHomeDisplayTypeState]. @ProviderFor(MangaHomeDisplayTypeState) -final mangaHomeDisplayTypeStateProvider = AutoDisposeNotifierProvider< - MangaHomeDisplayTypeState, DisplayType>.internal( - MangaHomeDisplayTypeState.new, - name: r'mangaHomeDisplayTypeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$mangaHomeDisplayTypeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final mangaHomeDisplayTypeStateProvider = + AutoDisposeNotifierProvider< + MangaHomeDisplayTypeState, + DisplayType + >.internal( + MangaHomeDisplayTypeState.new, + name: r'mangaHomeDisplayTypeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mangaHomeDisplayTypeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$MangaHomeDisplayTypeState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/manga/reader/providers/color_filter_provider.g.dart b/lib/modules/manga/reader/providers/color_filter_provider.g.dart index c8258663..5dea2ff9 100644 --- a/lib/modules/manga/reader/providers/color_filter_provider.g.dart +++ b/lib/modules/manga/reader/providers/color_filter_provider.g.dart @@ -11,16 +11,19 @@ String _$customColorFilterStateHash() => /// See also [CustomColorFilterState]. @ProviderFor(CustomColorFilterState) -final customColorFilterStateProvider = AutoDisposeNotifierProvider< - CustomColorFilterState, CustomColorFilter?>.internal( - CustomColorFilterState.new, - name: r'customColorFilterStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$customColorFilterStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final customColorFilterStateProvider = + AutoDisposeNotifierProvider< + CustomColorFilterState, + CustomColorFilter? + >.internal( + CustomColorFilterState.new, + name: r'customColorFilterStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$customColorFilterStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$CustomColorFilterState = AutoDisposeNotifier; String _$enableCustomColorFilterStateHash() => @@ -30,14 +33,14 @@ String _$enableCustomColorFilterStateHash() => @ProviderFor(EnableCustomColorFilterState) final enableCustomColorFilterStateProvider = AutoDisposeNotifierProvider.internal( - EnableCustomColorFilterState.new, - name: r'enableCustomColorFilterStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableCustomColorFilterStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + EnableCustomColorFilterState.new, + name: r'enableCustomColorFilterStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableCustomColorFilterStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$EnableCustomColorFilterState = AutoDisposeNotifier; String _$colorFilterBlendModeStateHash() => @@ -45,16 +48,19 @@ String _$colorFilterBlendModeStateHash() => /// See also [ColorFilterBlendModeState]. @ProviderFor(ColorFilterBlendModeState) -final colorFilterBlendModeStateProvider = AutoDisposeNotifierProvider< - ColorFilterBlendModeState, ColorFilterBlendMode>.internal( - ColorFilterBlendModeState.new, - name: r'colorFilterBlendModeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$colorFilterBlendModeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final colorFilterBlendModeStateProvider = + AutoDisposeNotifierProvider< + ColorFilterBlendModeState, + ColorFilterBlendMode + >.internal( + ColorFilterBlendModeState.new, + name: r'colorFilterBlendModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$colorFilterBlendModeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ColorFilterBlendModeState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/manga/reader/providers/crop_borders_provider.g.dart b/lib/modules/manga/reader/providers/crop_borders_provider.g.dart index e90bc38f..1d839ce9 100644 --- a/lib/modules/manga/reader/providers/crop_borders_provider.g.dart +++ b/lib/modules/manga/reader/providers/crop_borders_provider.g.dart @@ -43,20 +43,14 @@ class CropBordersFamily extends Family> { required UChapDataPreload data, required bool cropBorder, }) { - return CropBordersProvider( - data: data, - cropBorder: cropBorder, - ); + return CropBordersProvider(data: data, cropBorder: cropBorder); } @override CropBordersProvider getProviderOverride( covariant CropBordersProvider provider, ) { - return call( - data: provider.data, - cropBorder: provider.cropBorder, - ); + return call(data: provider.data, cropBorder: provider.cropBorder); } static const Iterable? _dependencies = null; @@ -81,23 +75,22 @@ class CropBordersProvider extends FutureProvider { required UChapDataPreload data, required bool cropBorder, }) : this._internal( - (ref) => cropBorders( - ref as CropBordersRef, - data: data, - cropBorder: cropBorder, - ), - from: cropBordersProvider, - name: r'cropBordersProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$cropBordersHash, - dependencies: CropBordersFamily._dependencies, - allTransitiveDependencies: - CropBordersFamily._allTransitiveDependencies, - data: data, - cropBorder: cropBorder, - ); + (ref) => cropBorders( + ref as CropBordersRef, + data: data, + cropBorder: cropBorder, + ), + from: cropBordersProvider, + name: r'cropBordersProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$cropBordersHash, + dependencies: CropBordersFamily._dependencies, + allTransitiveDependencies: + CropBordersFamily._allTransitiveDependencies, + data: data, + cropBorder: cropBorder, + ); CropBordersProvider._internal( super._createNotifier, { @@ -173,5 +166,6 @@ class _CropBordersProviderElement extends FutureProviderElement @override bool get cropBorder => (origin as CropBordersProvider).cropBorder; } + // 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 diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart index 753d9d00..35ac8a22 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart @@ -32,9 +32,7 @@ class _SystemHash { abstract class _$CurrentIndex extends BuildlessAutoDisposeNotifier { late final Chapter chapter; - int build( - Chapter chapter, - ); + int build(Chapter chapter); } /// See also [CurrentIndex]. @@ -47,21 +45,15 @@ class CurrentIndexFamily extends Family { const CurrentIndexFamily(); /// See also [CurrentIndex]. - CurrentIndexProvider call( - Chapter chapter, - ) { - return CurrentIndexProvider( - chapter, - ); + CurrentIndexProvider call(Chapter chapter) { + return CurrentIndexProvider(chapter); } @override CurrentIndexProvider getProviderOverride( covariant CurrentIndexProvider provider, ) { - return call( - provider.chapter, - ); + return call(provider.chapter); } static const Iterable? _dependencies = null; @@ -83,21 +75,19 @@ class CurrentIndexFamily extends Family { class CurrentIndexProvider extends AutoDisposeNotifierProviderImpl { /// See also [CurrentIndex]. - CurrentIndexProvider( - Chapter chapter, - ) : this._internal( - () => CurrentIndex()..chapter = chapter, - from: currentIndexProvider, - name: r'currentIndexProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$currentIndexHash, - dependencies: CurrentIndexFamily._dependencies, - allTransitiveDependencies: - CurrentIndexFamily._allTransitiveDependencies, - chapter: chapter, - ); + CurrentIndexProvider(Chapter chapter) + : this._internal( + () => CurrentIndex()..chapter = chapter, + from: currentIndexProvider, + name: r'currentIndexProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$currentIndexHash, + dependencies: CurrentIndexFamily._dependencies, + allTransitiveDependencies: + CurrentIndexFamily._allTransitiveDependencies, + chapter: chapter, + ); CurrentIndexProvider._internal( super._createNotifier, { @@ -112,12 +102,8 @@ class CurrentIndexProvider final Chapter chapter; @override - int runNotifierBuild( - covariant CurrentIndex notifier, - ) { - return notifier.build( - chapter, - ); + int runNotifierBuild(covariant CurrentIndex notifier) { + return notifier.build(chapter); } @override @@ -176,9 +162,7 @@ String _$readerControllerHash() => r'8b2995dcf849eddff308a105a2e06c9534096fac'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; - void build({ - required Chapter chapter, - }); + void build({required Chapter chapter}); } /// See also [ReaderController]. @@ -191,21 +175,15 @@ class ReaderControllerFamily extends Family { const ReaderControllerFamily(); /// See also [ReaderController]. - ReaderControllerProvider call({ - required Chapter chapter, - }) { - return ReaderControllerProvider( - chapter: chapter, - ); + ReaderControllerProvider call({required Chapter chapter}) { + return ReaderControllerProvider(chapter: chapter); } @override ReaderControllerProvider getProviderOverride( covariant ReaderControllerProvider provider, ) { - return call( - chapter: provider.chapter, - ); + return call(chapter: provider.chapter); } static const Iterable? _dependencies = null; @@ -227,21 +205,19 @@ class ReaderControllerFamily extends Family { class ReaderControllerProvider extends AutoDisposeNotifierProviderImpl { /// See also [ReaderController]. - ReaderControllerProvider({ - required Chapter chapter, - }) : this._internal( - () => ReaderController()..chapter = chapter, - from: readerControllerProvider, - name: r'readerControllerProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$readerControllerHash, - dependencies: ReaderControllerFamily._dependencies, - allTransitiveDependencies: - ReaderControllerFamily._allTransitiveDependencies, - chapter: chapter, - ); + ReaderControllerProvider({required Chapter chapter}) + : this._internal( + () => ReaderController()..chapter = chapter, + from: readerControllerProvider, + name: r'readerControllerProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$readerControllerHash, + dependencies: ReaderControllerFamily._dependencies, + allTransitiveDependencies: + ReaderControllerFamily._allTransitiveDependencies, + chapter: chapter, + ); ReaderControllerProvider._internal( super._createNotifier, { @@ -256,12 +232,8 @@ class ReaderControllerProvider final Chapter chapter; @override - void runNotifierBuild( - covariant ReaderController notifier, - ) { - return notifier.build( - chapter: chapter, - ); + void runNotifierBuild(covariant ReaderController notifier) { + return notifier.build(chapter: chapter); } @override @@ -314,5 +286,6 @@ class _ReaderControllerProviderElement @override Chapter get chapter => (origin as ReaderControllerProvider).chapter; } + // 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 diff --git a/lib/modules/more/about/providers/check_for_update.g.dart b/lib/modules/more/about/providers/check_for_update.g.dart index a1f5b632..3fbcfa6b 100644 --- a/lib/modules/more/about/providers/check_for_update.g.dart +++ b/lib/modules/more/about/providers/check_for_update.g.dart @@ -39,24 +39,15 @@ class CheckForUpdateFamily extends Family> { const CheckForUpdateFamily(); /// See also [checkForUpdate]. - CheckForUpdateProvider call({ - BuildContext? context, - bool? manualUpdate, - }) { - return CheckForUpdateProvider( - context: context, - manualUpdate: manualUpdate, - ); + CheckForUpdateProvider call({BuildContext? context, bool? manualUpdate}) { + return CheckForUpdateProvider(context: context, manualUpdate: manualUpdate); } @override CheckForUpdateProvider getProviderOverride( covariant CheckForUpdateProvider provider, ) { - return call( - context: provider.context, - manualUpdate: provider.manualUpdate, - ); + return call(context: provider.context, manualUpdate: provider.manualUpdate); } static const Iterable? _dependencies = null; @@ -77,27 +68,24 @@ class CheckForUpdateFamily extends Family> { /// See also [checkForUpdate]. class CheckForUpdateProvider extends AutoDisposeFutureProvider { /// See also [checkForUpdate]. - CheckForUpdateProvider({ - BuildContext? context, - bool? manualUpdate, - }) : this._internal( - (ref) => checkForUpdate( - ref as CheckForUpdateRef, - context: context, - manualUpdate: manualUpdate, - ), - from: checkForUpdateProvider, - name: r'checkForUpdateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$checkForUpdateHash, - dependencies: CheckForUpdateFamily._dependencies, - allTransitiveDependencies: - CheckForUpdateFamily._allTransitiveDependencies, + CheckForUpdateProvider({BuildContext? context, bool? manualUpdate}) + : this._internal( + (ref) => checkForUpdate( + ref as CheckForUpdateRef, context: context, manualUpdate: manualUpdate, - ); + ), + from: checkForUpdateProvider, + name: r'checkForUpdateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$checkForUpdateHash, + dependencies: CheckForUpdateFamily._dependencies, + allTransitiveDependencies: + CheckForUpdateFamily._allTransitiveDependencies, + context: context, + manualUpdate: manualUpdate, + ); CheckForUpdateProvider._internal( super._createNotifier, { @@ -165,7 +153,8 @@ mixin CheckForUpdateRef on AutoDisposeFutureProviderRef { } class _CheckForUpdateProviderElement - extends AutoDisposeFutureProviderElement with CheckForUpdateRef { + extends AutoDisposeFutureProviderElement + with CheckForUpdateRef { _CheckForUpdateProviderElement(super.provider); @override diff --git a/lib/modules/more/categories/providers/isar_providers.g.dart b/lib/modules/more/categories/providers/isar_providers.g.dart index 83069840..b6f818a0 100644 --- a/lib/modules/more/categories/providers/isar_providers.g.dart +++ b/lib/modules/more/categories/providers/isar_providers.g.dart @@ -40,21 +40,15 @@ class GetMangaCategorieStreamFamily extends Family>> { const GetMangaCategorieStreamFamily(); /// See also [getMangaCategorieStream]. - GetMangaCategorieStreamProvider call({ - required ItemType itemType, - }) { - return GetMangaCategorieStreamProvider( - itemType: itemType, - ); + GetMangaCategorieStreamProvider call({required ItemType itemType}) { + return GetMangaCategorieStreamProvider(itemType: itemType); } @override GetMangaCategorieStreamProvider getProviderOverride( covariant GetMangaCategorieStreamProvider provider, ) { - return call( - itemType: provider.itemType, - ); + return call(itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -76,24 +70,22 @@ class GetMangaCategorieStreamFamily extends Family>> { class GetMangaCategorieStreamProvider extends AutoDisposeStreamProvider> { /// See also [getMangaCategorieStream]. - GetMangaCategorieStreamProvider({ - required ItemType itemType, - }) : this._internal( - (ref) => getMangaCategorieStream( - ref as GetMangaCategorieStreamRef, - itemType: itemType, - ), - from: getMangaCategorieStreamProvider, - name: r'getMangaCategorieStreamProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getMangaCategorieStreamHash, - dependencies: GetMangaCategorieStreamFamily._dependencies, - allTransitiveDependencies: - GetMangaCategorieStreamFamily._allTransitiveDependencies, + GetMangaCategorieStreamProvider({required ItemType itemType}) + : this._internal( + (ref) => getMangaCategorieStream( + ref as GetMangaCategorieStreamRef, itemType: itemType, - ); + ), + from: getMangaCategorieStreamProvider, + name: r'getMangaCategorieStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getMangaCategorieStreamHash, + dependencies: GetMangaCategorieStreamFamily._dependencies, + allTransitiveDependencies: + GetMangaCategorieStreamFamily._allTransitiveDependencies, + itemType: itemType, + ); GetMangaCategorieStreamProvider._internal( super._createNotifier, { @@ -161,5 +153,6 @@ class _GetMangaCategorieStreamProviderElement @override ItemType get itemType => (origin as GetMangaCategorieStreamProvider).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 diff --git a/lib/modules/more/data_and_storage/providers/auto_backup.g.dart b/lib/modules/more/data_and_storage/providers/auto_backup.g.dart index 3bfe8569..c75ce92f 100644 --- a/lib/modules/more/data_and_storage/providers/auto_backup.g.dart +++ b/lib/modules/more/data_and_storage/providers/auto_backup.g.dart @@ -30,14 +30,14 @@ String _$backupFrequencyStateHash() => @ProviderFor(BackupFrequencyState) final backupFrequencyStateProvider = AutoDisposeNotifierProvider.internal( - BackupFrequencyState.new, - name: r'backupFrequencyStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$backupFrequencyStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + BackupFrequencyState.new, + name: r'backupFrequencyStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$backupFrequencyStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$BackupFrequencyState = AutoDisposeNotifier; String _$backupFrequencyOptionsStateHash() => @@ -45,16 +45,19 @@ String _$backupFrequencyOptionsStateHash() => /// See also [BackupFrequencyOptionsState]. @ProviderFor(BackupFrequencyOptionsState) -final backupFrequencyOptionsStateProvider = AutoDisposeNotifierProvider< - BackupFrequencyOptionsState, List>.internal( - BackupFrequencyOptionsState.new, - name: r'backupFrequencyOptionsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$backupFrequencyOptionsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final backupFrequencyOptionsStateProvider = + AutoDisposeNotifierProvider< + BackupFrequencyOptionsState, + List + >.internal( + BackupFrequencyOptionsState.new, + name: r'backupFrequencyOptionsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$backupFrequencyOptionsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$BackupFrequencyOptionsState = AutoDisposeNotifier>; String _$autoBackupLocationStateHash() => @@ -62,16 +65,19 @@ String _$autoBackupLocationStateHash() => /// See also [AutoBackupLocationState]. @ProviderFor(AutoBackupLocationState) -final autoBackupLocationStateProvider = AutoDisposeNotifierProvider< - AutoBackupLocationState, (String, String)>.internal( - AutoBackupLocationState.new, - name: r'autoBackupLocationStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$autoBackupLocationStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final autoBackupLocationStateProvider = + AutoDisposeNotifierProvider< + AutoBackupLocationState, + (String, String) + >.internal( + AutoBackupLocationState.new, + name: r'autoBackupLocationStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$autoBackupLocationStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AutoBackupLocationState = AutoDisposeNotifier<(String, String)>; // ignore_for_file: type=lint diff --git a/lib/modules/more/data_and_storage/providers/backup.g.dart b/lib/modules/more/data_and_storage/providers/backup.g.dart index a1ba26b7..707ef93d 100644 --- a/lib/modules/more/data_and_storage/providers/backup.g.dart +++ b/lib/modules/more/data_and_storage/providers/backup.g.dart @@ -44,17 +44,11 @@ class DoBackUpFamily extends Family> { required String path, required BuildContext? context, }) { - return DoBackUpProvider( - list: list, - path: path, - context: context, - ); + return DoBackUpProvider(list: list, path: path, context: context); } @override - DoBackUpProvider getProviderOverride( - covariant DoBackUpProvider provider, - ) { + DoBackUpProvider getProviderOverride(covariant DoBackUpProvider provider) { return call( list: provider.list, path: provider.path, @@ -85,24 +79,23 @@ class DoBackUpProvider extends AutoDisposeFutureProvider { required String path, required BuildContext? context, }) : this._internal( - (ref) => doBackUp( - ref as DoBackUpRef, - list: list, - path: path, - context: context, - ), - from: doBackUpProvider, - name: r'doBackUpProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$doBackUpHash, - dependencies: DoBackUpFamily._dependencies, - allTransitiveDependencies: DoBackUpFamily._allTransitiveDependencies, - list: list, - path: path, - context: context, - ); + (ref) => doBackUp( + ref as DoBackUpRef, + list: list, + path: path, + context: context, + ), + from: doBackUpProvider, + name: r'doBackUpProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$doBackUpHash, + dependencies: DoBackUpFamily._dependencies, + allTransitiveDependencies: DoBackUpFamily._allTransitiveDependencies, + list: list, + path: path, + context: context, + ); DoBackUpProvider._internal( super._createNotifier, { @@ -121,9 +114,7 @@ class DoBackUpProvider extends AutoDisposeFutureProvider { final BuildContext? context; @override - Override overrideWith( - FutureOr Function(DoBackUpRef provider) create, - ) { + Override overrideWith(FutureOr Function(DoBackUpRef provider) create) { return ProviderOverride( origin: this, override: DoBackUpProvider._internal( @@ -188,5 +179,6 @@ class _DoBackUpProviderElement extends AutoDisposeFutureProviderElement @override BuildContext? get context => (origin as DoBackUpProvider).context; } + // 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 diff --git a/lib/modules/more/data_and_storage/providers/restore.g.dart b/lib/modules/more/data_and_storage/providers/restore.g.dart index 4d55b176..1dfb5b14 100644 --- a/lib/modules/more/data_and_storage/providers/restore.g.dart +++ b/lib/modules/more/data_and_storage/providers/restore.g.dart @@ -43,20 +43,12 @@ class DoRestoreFamily extends Family { required String path, required BuildContext context, }) { - return DoRestoreProvider( - path: path, - context: context, - ); + return DoRestoreProvider(path: path, context: context); } @override - DoRestoreProvider getProviderOverride( - covariant DoRestoreProvider provider, - ) { - return call( - path: provider.path, - context: provider.context, - ); + DoRestoreProvider getProviderOverride(covariant DoRestoreProvider provider) { + return call(path: provider.path, context: provider.context); } static const Iterable? _dependencies = null; @@ -77,26 +69,19 @@ class DoRestoreFamily extends Family { /// See also [doRestore]. class DoRestoreProvider extends AutoDisposeProvider { /// See also [doRestore]. - DoRestoreProvider({ - required String path, - required BuildContext context, - }) : this._internal( - (ref) => doRestore( - ref as DoRestoreRef, - path: path, - context: context, - ), - from: doRestoreProvider, - name: r'doRestoreProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$doRestoreHash, - dependencies: DoRestoreFamily._dependencies, - allTransitiveDependencies: DoRestoreFamily._allTransitiveDependencies, - path: path, - context: context, - ); + DoRestoreProvider({required String path, required BuildContext context}) + : this._internal( + (ref) => doRestore(ref as DoRestoreRef, path: path, context: context), + from: doRestoreProvider, + name: r'doRestoreProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$doRestoreHash, + dependencies: DoRestoreFamily._dependencies, + allTransitiveDependencies: DoRestoreFamily._allTransitiveDependencies, + path: path, + context: context, + ); DoRestoreProvider._internal( super._createNotifier, { @@ -113,9 +98,7 @@ class DoRestoreProvider extends AutoDisposeProvider { final BuildContext context; @override - Override overrideWith( - void Function(DoRestoreRef provider) create, - ) { + Override overrideWith(void Function(DoRestoreRef provider) create) { return ProviderOverride( origin: this, override: DoRestoreProvider._internal( @@ -185,24 +168,15 @@ class RestoreBackupFamily extends Family { const RestoreBackupFamily(); /// See also [restoreBackup]. - RestoreBackupProvider call( - Map backup, { - bool full = true, - }) { - return RestoreBackupProvider( - backup, - full: full, - ); + RestoreBackupProvider call(Map backup, {bool full = true}) { + return RestoreBackupProvider(backup, full: full); } @override RestoreBackupProvider getProviderOverride( covariant RestoreBackupProvider provider, ) { - return call( - provider.backup, - full: provider.full, - ); + return call(provider.backup, full: provider.full); } static const Iterable? _dependencies = null; @@ -223,27 +197,20 @@ class RestoreBackupFamily extends Family { /// See also [restoreBackup]. class RestoreBackupProvider extends AutoDisposeProvider { /// See also [restoreBackup]. - RestoreBackupProvider( - Map backup, { - bool full = true, - }) : this._internal( - (ref) => restoreBackup( - ref as RestoreBackupRef, - backup, - full: full, - ), - from: restoreBackupProvider, - name: r'restoreBackupProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$restoreBackupHash, - dependencies: RestoreBackupFamily._dependencies, - allTransitiveDependencies: - RestoreBackupFamily._allTransitiveDependencies, - backup: backup, - full: full, - ); + RestoreBackupProvider(Map backup, {bool full = true}) + : this._internal( + (ref) => restoreBackup(ref as RestoreBackupRef, backup, full: full), + from: restoreBackupProvider, + name: r'restoreBackupProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreBackupHash, + dependencies: RestoreBackupFamily._dependencies, + allTransitiveDependencies: + RestoreBackupFamily._allTransitiveDependencies, + backup: backup, + full: full, + ); RestoreBackupProvider._internal( super._createNotifier, { @@ -260,9 +227,7 @@ class RestoreBackupProvider extends AutoDisposeProvider { final bool full; @override - Override overrideWith( - void Function(RestoreBackupRef provider) create, - ) { + Override overrideWith(void Function(RestoreBackupRef provider) create) { return ProviderOverride( origin: this, override: RestoreBackupProvider._internal( @@ -333,21 +298,15 @@ class RestoreKotatsuBackupFamily extends Family { const RestoreKotatsuBackupFamily(); /// See also [restoreKotatsuBackup]. - RestoreKotatsuBackupProvider call( - Archive archive, - ) { - return RestoreKotatsuBackupProvider( - archive, - ); + RestoreKotatsuBackupProvider call(Archive archive) { + return RestoreKotatsuBackupProvider(archive); } @override RestoreKotatsuBackupProvider getProviderOverride( covariant RestoreKotatsuBackupProvider provider, ) { - return call( - provider.archive, - ); + return call(provider.archive); } static const Iterable? _dependencies = null; @@ -368,24 +327,19 @@ class RestoreKotatsuBackupFamily extends Family { /// See also [restoreKotatsuBackup]. class RestoreKotatsuBackupProvider extends AutoDisposeProvider { /// See also [restoreKotatsuBackup]. - RestoreKotatsuBackupProvider( - Archive archive, - ) : this._internal( - (ref) => restoreKotatsuBackup( - ref as RestoreKotatsuBackupRef, - archive, - ), - from: restoreKotatsuBackupProvider, - name: r'restoreKotatsuBackupProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$restoreKotatsuBackupHash, - dependencies: RestoreKotatsuBackupFamily._dependencies, - allTransitiveDependencies: - RestoreKotatsuBackupFamily._allTransitiveDependencies, - archive: archive, - ); + RestoreKotatsuBackupProvider(Archive archive) + : this._internal( + (ref) => restoreKotatsuBackup(ref as RestoreKotatsuBackupRef, archive), + from: restoreKotatsuBackupProvider, + name: r'restoreKotatsuBackupProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreKotatsuBackupHash, + dependencies: RestoreKotatsuBackupFamily._dependencies, + allTransitiveDependencies: + RestoreKotatsuBackupFamily._allTransitiveDependencies, + archive: archive, + ); RestoreKotatsuBackupProvider._internal( super._createNotifier, { @@ -444,7 +398,8 @@ mixin RestoreKotatsuBackupRef on AutoDisposeProviderRef { } class _RestoreKotatsuBackupProviderElement - extends AutoDisposeProviderElement with RestoreKotatsuBackupRef { + extends AutoDisposeProviderElement + with RestoreKotatsuBackupRef { _RestoreKotatsuBackupProviderElement(super.provider); @override @@ -464,24 +419,15 @@ class RestoreTachiBkBackupFamily extends Family { const RestoreTachiBkBackupFamily(); /// See also [restoreTachiBkBackup]. - RestoreTachiBkBackupProvider call( - String path, - BackupType bkType, - ) { - return RestoreTachiBkBackupProvider( - path, - bkType, - ); + RestoreTachiBkBackupProvider call(String path, BackupType bkType) { + return RestoreTachiBkBackupProvider(path, bkType); } @override RestoreTachiBkBackupProvider getProviderOverride( covariant RestoreTachiBkBackupProvider provider, ) { - return call( - provider.path, - provider.bkType, - ); + return call(provider.path, provider.bkType); } static const Iterable? _dependencies = null; @@ -502,27 +448,21 @@ class RestoreTachiBkBackupFamily extends Family { /// See also [restoreTachiBkBackup]. class RestoreTachiBkBackupProvider extends AutoDisposeProvider { /// See also [restoreTachiBkBackup]. - RestoreTachiBkBackupProvider( - String path, - BackupType bkType, - ) : this._internal( - (ref) => restoreTachiBkBackup( - ref as RestoreTachiBkBackupRef, - path, - bkType, - ), - from: restoreTachiBkBackupProvider, - name: r'restoreTachiBkBackupProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$restoreTachiBkBackupHash, - dependencies: RestoreTachiBkBackupFamily._dependencies, - allTransitiveDependencies: - RestoreTachiBkBackupFamily._allTransitiveDependencies, - path: path, - bkType: bkType, - ); + RestoreTachiBkBackupProvider(String path, BackupType bkType) + : this._internal( + (ref) => + restoreTachiBkBackup(ref as RestoreTachiBkBackupRef, path, bkType), + from: restoreTachiBkBackupProvider, + name: r'restoreTachiBkBackupProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreTachiBkBackupHash, + dependencies: RestoreTachiBkBackupFamily._dependencies, + allTransitiveDependencies: + RestoreTachiBkBackupFamily._allTransitiveDependencies, + path: path, + bkType: bkType, + ); RestoreTachiBkBackupProvider._internal( super._createNotifier, { @@ -590,7 +530,8 @@ mixin RestoreTachiBkBackupRef on AutoDisposeProviderRef { } class _RestoreTachiBkBackupProviderElement - extends AutoDisposeProviderElement with RestoreTachiBkBackupRef { + extends AutoDisposeProviderElement + with RestoreTachiBkBackupRef { _RestoreTachiBkBackupProviderElement(super.provider); @override @@ -598,5 +539,6 @@ class _RestoreTachiBkBackupProviderElement @override BackupType get bkType => (origin as RestoreTachiBkBackupProvider).bkType; } + // 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 diff --git a/lib/modules/more/data_and_storage/providers/storage_usage.g.dart b/lib/modules/more/data_and_storage/providers/storage_usage.g.dart index d8aecde6..3b83d55b 100644 --- a/lib/modules/more/data_and_storage/providers/storage_usage.g.dart +++ b/lib/modules/more/data_and_storage/providers/storage_usage.g.dart @@ -13,14 +13,14 @@ String _$totalChapterCacheSizeStateHash() => @ProviderFor(TotalChapterCacheSizeState) final totalChapterCacheSizeStateProvider = AutoDisposeNotifierProvider.internal( - TotalChapterCacheSizeState.new, - name: r'totalChapterCacheSizeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$totalChapterCacheSizeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + TotalChapterCacheSizeState.new, + name: r'totalChapterCacheSizeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$totalChapterCacheSizeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$TotalChapterCacheSizeState = AutoDisposeNotifier; String _$clearChapterCacheOnAppLaunchStateHash() => @@ -28,16 +28,19 @@ String _$clearChapterCacheOnAppLaunchStateHash() => /// See also [ClearChapterCacheOnAppLaunchState]. @ProviderFor(ClearChapterCacheOnAppLaunchState) -final clearChapterCacheOnAppLaunchStateProvider = AutoDisposeNotifierProvider< - ClearChapterCacheOnAppLaunchState, bool>.internal( - ClearChapterCacheOnAppLaunchState.new, - name: r'clearChapterCacheOnAppLaunchStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$clearChapterCacheOnAppLaunchStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final clearChapterCacheOnAppLaunchStateProvider = + AutoDisposeNotifierProvider< + ClearChapterCacheOnAppLaunchState, + bool + >.internal( + ClearChapterCacheOnAppLaunchState.new, + name: r'clearChapterCacheOnAppLaunchStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$clearChapterCacheOnAppLaunchStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ClearChapterCacheOnAppLaunchState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/providers/algorithm_weights_state_provider.g.dart b/lib/modules/more/providers/algorithm_weights_state_provider.g.dart index 0374b79d..7eb3187e 100644 --- a/lib/modules/more/providers/algorithm_weights_state_provider.g.dart +++ b/lib/modules/more/providers/algorithm_weights_state_provider.g.dart @@ -11,16 +11,19 @@ String _$algorithmWeightsStateHash() => /// See also [AlgorithmWeightsState]. @ProviderFor(AlgorithmWeightsState) -final algorithmWeightsStateProvider = AutoDisposeNotifierProvider< - AlgorithmWeightsState, AlgorithmWeights>.internal( - AlgorithmWeightsState.new, - name: r'algorithmWeightsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$algorithmWeightsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final algorithmWeightsStateProvider = + AutoDisposeNotifierProvider< + AlgorithmWeightsState, + AlgorithmWeights + >.internal( + AlgorithmWeightsState.new, + name: r'algorithmWeightsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$algorithmWeightsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AlgorithmWeightsState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/providers/downloaded_only_state_provider.g.dart b/lib/modules/more/providers/downloaded_only_state_provider.g.dart index 1d1d7ddb..25102793 100644 --- a/lib/modules/more/providers/downloaded_only_state_provider.g.dart +++ b/lib/modules/more/providers/downloaded_only_state_provider.g.dart @@ -13,14 +13,14 @@ String _$downloadedOnlyStateHash() => @ProviderFor(DownloadedOnlyState) final downloadedOnlyStateProvider = AutoDisposeNotifierProvider.internal( - DownloadedOnlyState.new, - name: r'downloadedOnlyStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$downloadedOnlyStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DownloadedOnlyState.new, + name: r'downloadedOnlyStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$downloadedOnlyStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DownloadedOnlyState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/providers/incognito_mode_state_provider.g.dart b/lib/modules/more/providers/incognito_mode_state_provider.g.dart index b70a5e8a..65fb08a7 100644 --- a/lib/modules/more/providers/incognito_mode_state_provider.g.dart +++ b/lib/modules/more/providers/incognito_mode_state_provider.g.dart @@ -13,14 +13,14 @@ String _$incognitoModeStateHash() => @ProviderFor(IncognitoModeState) final incognitoModeStateProvider = AutoDisposeNotifierProvider.internal( - IncognitoModeState.new, - name: r'incognitoModeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$incognitoModeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + IncognitoModeState.new, + name: r'incognitoModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$incognitoModeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$IncognitoModeState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/app_font_family.g.dart b/lib/modules/more/settings/appearance/providers/app_font_family.g.dart index ae4f26da..1dfc605b 100644 --- a/lib/modules/more/settings/appearance/providers/app_font_family.g.dart +++ b/lib/modules/more/settings/appearance/providers/app_font_family.g.dart @@ -12,14 +12,14 @@ String _$appFontFamilyHash() => r'edc7d34d3b1aa149fdbd95fa0b07d9746b7279b1'; @ProviderFor(AppFontFamily) final appFontFamilyProvider = AutoDisposeNotifierProvider.internal( - AppFontFamily.new, - name: r'appFontFamilyProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$appFontFamilyHash, - dependencies: null, - allTransitiveDependencies: null, -); + AppFontFamily.new, + name: r'appFontFamilyProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$appFontFamilyHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AppFontFamily = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/blend_level_state_provider.g.dart b/lib/modules/more/settings/appearance/providers/blend_level_state_provider.g.dart index e81f2f27..ecba2e20 100644 --- a/lib/modules/more/settings/appearance/providers/blend_level_state_provider.g.dart +++ b/lib/modules/more/settings/appearance/providers/blend_level_state_provider.g.dart @@ -12,14 +12,14 @@ String _$blendLevelStateHash() => r'78024b3432868c3b901419bbd919c3f84a4cf713'; @ProviderFor(BlendLevelState) final blendLevelStateProvider = AutoDisposeNotifierProvider.internal( - BlendLevelState.new, - name: r'blendLevelStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$blendLevelStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + BlendLevelState.new, + name: r'blendLevelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$blendLevelStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$BlendLevelState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/date_format_state_provider.g.dart b/lib/modules/more/settings/appearance/providers/date_format_state_provider.g.dart index 10bcc13e..2b54cb10 100644 --- a/lib/modules/more/settings/appearance/providers/date_format_state_provider.g.dart +++ b/lib/modules/more/settings/appearance/providers/date_format_state_provider.g.dart @@ -12,14 +12,14 @@ String _$dateFormatStateHash() => r'9b11f72b8fa535b74873365618089dfca957e445'; @ProviderFor(DateFormatState) final dateFormatStateProvider = AutoDisposeNotifierProvider.internal( - DateFormatState.new, - name: r'dateFormatStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$dateFormatStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DateFormatState.new, + name: r'dateFormatStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$dateFormatStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DateFormatState = AutoDisposeNotifier; String _$relativeTimesTampsStateHash() => @@ -29,14 +29,14 @@ String _$relativeTimesTampsStateHash() => @ProviderFor(RelativeTimesTampsState) final relativeTimesTampsStateProvider = AutoDisposeNotifierProvider.internal( - RelativeTimesTampsState.new, - name: r'relativeTimesTampsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$relativeTimesTampsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + RelativeTimesTampsState.new, + name: r'relativeTimesTampsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$relativeTimesTampsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$RelativeTimesTampsState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.g.dart b/lib/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.g.dart index 997d1b1b..8f587b6c 100644 --- a/lib/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.g.dart +++ b/lib/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.g.dart @@ -13,14 +13,14 @@ String _$flexSchemeColorStateHash() => @ProviderFor(FlexSchemeColorState) final flexSchemeColorStateProvider = AutoDisposeNotifierProvider.internal( - FlexSchemeColorState.new, - name: r'flexSchemeColorStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$flexSchemeColorStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + FlexSchemeColorState.new, + name: r'flexSchemeColorStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$flexSchemeColorStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$FlexSchemeColorState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.g.dart b/lib/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.g.dart index 0ff37ab7..b70282e6 100644 --- a/lib/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.g.dart +++ b/lib/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.g.dart @@ -13,14 +13,14 @@ String _$pureBlackDarkModeStateHash() => @ProviderFor(PureBlackDarkModeState) final pureBlackDarkModeStateProvider = AutoDisposeNotifierProvider.internal( - PureBlackDarkModeState.new, - name: r'pureBlackDarkModeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$pureBlackDarkModeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + PureBlackDarkModeState.new, + name: r'pureBlackDarkModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$pureBlackDarkModeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$PureBlackDarkModeState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.g.dart b/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.g.dart index 8241fae7..eb0a6767 100644 --- a/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.g.dart +++ b/lib/modules/more/settings/appearance/providers/theme_mode_state_provider.g.dart @@ -12,14 +12,14 @@ String _$themeModeStateHash() => r'f1a29fab544a04b3f1d9c269e08f5b83ec51e0c3'; @ProviderFor(ThemeModeState) final themeModeStateProvider = AutoDisposeNotifierProvider.internal( - ThemeModeState.new, - name: r'themeModeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$themeModeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + ThemeModeState.new, + name: r'themeModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$themeModeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ThemeModeState = AutoDisposeNotifier; String _$followSystemThemeStateHash() => @@ -29,14 +29,14 @@ String _$followSystemThemeStateHash() => @ProviderFor(FollowSystemThemeState) final followSystemThemeStateProvider = AutoDisposeNotifierProvider.internal( - FollowSystemThemeState.new, - name: r'followSystemThemeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$followSystemThemeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + FollowSystemThemeState.new, + name: r'followSystemThemeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$followSystemThemeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$FollowSystemThemeState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart index 337ba3b9..557f3a7e 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.g.dart @@ -39,21 +39,15 @@ class GetRepoInfosFamily extends Family> { const GetRepoInfosFamily(); /// See also [getRepoInfos]. - GetRepoInfosProvider call({ - required String jsonUrl, - }) { - return GetRepoInfosProvider( - jsonUrl: jsonUrl, - ); + GetRepoInfosProvider call({required String jsonUrl}) { + return GetRepoInfosProvider(jsonUrl: jsonUrl); } @override GetRepoInfosProvider getProviderOverride( covariant GetRepoInfosProvider provider, ) { - return call( - jsonUrl: provider.jsonUrl, - ); + return call(jsonUrl: provider.jsonUrl); } static const Iterable? _dependencies = null; @@ -74,24 +68,19 @@ class GetRepoInfosFamily extends Family> { /// See also [getRepoInfos]. class GetRepoInfosProvider extends AutoDisposeFutureProvider { /// See also [getRepoInfos]. - GetRepoInfosProvider({ - required String jsonUrl, - }) : this._internal( - (ref) => getRepoInfos( - ref as GetRepoInfosRef, - jsonUrl: jsonUrl, - ), - from: getRepoInfosProvider, - name: r'getRepoInfosProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getRepoInfosHash, - dependencies: GetRepoInfosFamily._dependencies, - allTransitiveDependencies: - GetRepoInfosFamily._allTransitiveDependencies, - jsonUrl: jsonUrl, - ); + GetRepoInfosProvider({required String jsonUrl}) + : this._internal( + (ref) => getRepoInfos(ref as GetRepoInfosRef, jsonUrl: jsonUrl), + from: getRepoInfosProvider, + name: r'getRepoInfosProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getRepoInfosHash, + dependencies: GetRepoInfosFamily._dependencies, + allTransitiveDependencies: + GetRepoInfosFamily._allTransitiveDependencies, + jsonUrl: jsonUrl, + ); GetRepoInfosProvider._internal( super._createNotifier, { @@ -150,7 +139,8 @@ mixin GetRepoInfosRef on AutoDisposeFutureProviderRef { } class _GetRepoInfosProviderElement - extends AutoDisposeFutureProviderElement with GetRepoInfosRef { + extends AutoDisposeFutureProviderElement + with GetRepoInfosRef { _GetRepoInfosProviderElement(super.provider); @override @@ -164,14 +154,14 @@ String _$androidProxyServerStateHash() => @ProviderFor(AndroidProxyServerState) final androidProxyServerStateProvider = AutoDisposeNotifierProvider.internal( - AndroidProxyServerState.new, - name: r'androidProxyServerStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$androidProxyServerStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AndroidProxyServerState.new, + name: r'androidProxyServerStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$androidProxyServerStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AndroidProxyServerState = AutoDisposeNotifier; String _$onlyIncludePinnedSourceStateHash() => @@ -181,14 +171,14 @@ String _$onlyIncludePinnedSourceStateHash() => @ProviderFor(OnlyIncludePinnedSourceState) final onlyIncludePinnedSourceStateProvider = AutoDisposeNotifierProvider.internal( - OnlyIncludePinnedSourceState.new, - name: r'onlyIncludePinnedSourceStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$onlyIncludePinnedSourceStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + OnlyIncludePinnedSourceState.new, + name: r'onlyIncludePinnedSourceStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$onlyIncludePinnedSourceStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$OnlyIncludePinnedSourceState = AutoDisposeNotifier; String _$extensionsRepoStateHash() => @@ -198,9 +188,7 @@ abstract class _$ExtensionsRepoState extends BuildlessAutoDisposeNotifier> { late final ItemType itemType; - List build( - ItemType itemType, - ); + List build(ItemType itemType); } /// See also [ExtensionsRepoState]. @@ -213,21 +201,15 @@ class ExtensionsRepoStateFamily extends Family> { const ExtensionsRepoStateFamily(); /// See also [ExtensionsRepoState]. - ExtensionsRepoStateProvider call( - ItemType itemType, - ) { - return ExtensionsRepoStateProvider( - itemType, - ); + ExtensionsRepoStateProvider call(ItemType itemType) { + return ExtensionsRepoStateProvider(itemType); } @override ExtensionsRepoStateProvider getProviderOverride( covariant ExtensionsRepoStateProvider provider, ) { - return call( - provider.itemType, - ); + return call(provider.itemType); } static const Iterable? _dependencies = null; @@ -249,21 +231,19 @@ class ExtensionsRepoStateFamily extends Family> { class ExtensionsRepoStateProvider extends AutoDisposeNotifierProviderImpl> { /// See also [ExtensionsRepoState]. - ExtensionsRepoStateProvider( - ItemType itemType, - ) : this._internal( - () => ExtensionsRepoState()..itemType = itemType, - from: extensionsRepoStateProvider, - name: r'extensionsRepoStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$extensionsRepoStateHash, - dependencies: ExtensionsRepoStateFamily._dependencies, - allTransitiveDependencies: - ExtensionsRepoStateFamily._allTransitiveDependencies, - itemType: itemType, - ); + ExtensionsRepoStateProvider(ItemType itemType) + : this._internal( + () => ExtensionsRepoState()..itemType = itemType, + from: extensionsRepoStateProvider, + name: r'extensionsRepoStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$extensionsRepoStateHash, + dependencies: ExtensionsRepoStateFamily._dependencies, + allTransitiveDependencies: + ExtensionsRepoStateFamily._allTransitiveDependencies, + itemType: itemType, + ); ExtensionsRepoStateProvider._internal( super._createNotifier, { @@ -278,12 +258,8 @@ class ExtensionsRepoStateProvider final ItemType itemType; @override - List runNotifierBuild( - covariant ExtensionsRepoState notifier, - ) { - return notifier.build( - itemType, - ); + List runNotifierBuild(covariant ExtensionsRepoState notifier) { + return notifier.build(itemType); } @override @@ -304,7 +280,7 @@ class ExtensionsRepoStateProvider @override AutoDisposeNotifierProviderElement> - createElement() { + createElement() { return _ExtensionsRepoStateProviderElement(this); } @@ -345,14 +321,14 @@ String _$autoUpdateExtensionsStateHash() => @ProviderFor(AutoUpdateExtensionsState) final autoUpdateExtensionsStateProvider = AutoDisposeNotifierProvider.internal( - AutoUpdateExtensionsState.new, - name: r'autoUpdateExtensionsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$autoUpdateExtensionsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AutoUpdateExtensionsState.new, + name: r'autoUpdateExtensionsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$autoUpdateExtensionsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AutoUpdateExtensionsState = AutoDisposeNotifier; String _$checkForExtensionsUpdateStateHash() => @@ -362,14 +338,14 @@ String _$checkForExtensionsUpdateStateHash() => @ProviderFor(CheckForExtensionsUpdateState) final checkForExtensionsUpdateStateProvider = AutoDisposeNotifierProvider.internal( - CheckForExtensionsUpdateState.new, - name: r'checkForExtensionsUpdateStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$checkForExtensionsUpdateStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + CheckForExtensionsUpdateState.new, + name: r'checkForExtensionsUpdateStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$checkForExtensionsUpdateStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$CheckForExtensionsUpdateState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/downloads/providers/downloads_state_provider.g.dart b/lib/modules/more/settings/downloads/providers/downloads_state_provider.g.dart index c3da7aa6..a89fef39 100644 --- a/lib/modules/more/settings/downloads/providers/downloads_state_provider.g.dart +++ b/lib/modules/more/settings/downloads/providers/downloads_state_provider.g.dart @@ -12,14 +12,14 @@ String _$onlyOnWifiStateHash() => r'ea6df18bb5dc5019a00fca258d45cb0dfee0dffe'; @ProviderFor(OnlyOnWifiState) final onlyOnWifiStateProvider = AutoDisposeNotifierProvider.internal( - OnlyOnWifiState.new, - name: r'onlyOnWifiStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$onlyOnWifiStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + OnlyOnWifiState.new, + name: r'onlyOnWifiStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$onlyOnWifiStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$OnlyOnWifiState = AutoDisposeNotifier; String _$saveAsCBZArchiveStateHash() => @@ -29,14 +29,14 @@ String _$saveAsCBZArchiveStateHash() => @ProviderFor(SaveAsCBZArchiveState) final saveAsCBZArchiveStateProvider = AutoDisposeNotifierProvider.internal( - SaveAsCBZArchiveState.new, - name: r'saveAsCBZArchiveStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$saveAsCBZArchiveStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + SaveAsCBZArchiveState.new, + name: r'saveAsCBZArchiveStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$saveAsCBZArchiveStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$SaveAsCBZArchiveState = AutoDisposeNotifier; String _$downloadLocationStateHash() => @@ -44,16 +44,19 @@ String _$downloadLocationStateHash() => /// See also [DownloadLocationState]. @ProviderFor(DownloadLocationState) -final downloadLocationStateProvider = AutoDisposeNotifierProvider< - DownloadLocationState, (String, String)>.internal( - DownloadLocationState.new, - name: r'downloadLocationStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$downloadLocationStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final downloadLocationStateProvider = + AutoDisposeNotifierProvider< + DownloadLocationState, + (String, String) + >.internal( + DownloadLocationState.new, + name: r'downloadLocationStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$downloadLocationStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DownloadLocationState = AutoDisposeNotifier<(String, String)>; String _$concurrentDownloadsStateHash() => @@ -63,14 +66,14 @@ String _$concurrentDownloadsStateHash() => @ProviderFor(ConcurrentDownloadsState) final concurrentDownloadsStateProvider = AutoDisposeNotifierProvider.internal( - ConcurrentDownloadsState.new, - name: r'concurrentDownloadsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$concurrentDownloadsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + ConcurrentDownloadsState.new, + name: r'concurrentDownloadsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$concurrentDownloadsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ConcurrentDownloadsState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/general/providers/general_state_provider.g.dart b/lib/modules/more/settings/general/providers/general_state_provider.g.dart index 8808d602..8022ce18 100644 --- a/lib/modules/more/settings/general/providers/general_state_provider.g.dart +++ b/lib/modules/more/settings/general/providers/general_state_provider.g.dart @@ -12,14 +12,14 @@ String _$customDnsStateHash() => r'6061c64d742b3f873e54c1b9ef724b7c0b6350a2'; @ProviderFor(CustomDnsState) final customDnsStateProvider = AutoDisposeNotifierProvider.internal( - CustomDnsState.new, - name: r'customDnsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$customDnsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + CustomDnsState.new, + name: r'customDnsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$customDnsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$CustomDnsState = AutoDisposeNotifier; String _$enableDiscordRpcStateHash() => @@ -29,14 +29,14 @@ String _$enableDiscordRpcStateHash() => @ProviderFor(EnableDiscordRpcState) final enableDiscordRpcStateProvider = AutoDisposeNotifierProvider.internal( - EnableDiscordRpcState.new, - name: r'enableDiscordRpcStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableDiscordRpcStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + EnableDiscordRpcState.new, + name: r'enableDiscordRpcStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableDiscordRpcStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$EnableDiscordRpcState = AutoDisposeNotifier; String _$hideDiscordRpcInIncognitoStateHash() => @@ -46,14 +46,14 @@ String _$hideDiscordRpcInIncognitoStateHash() => @ProviderFor(HideDiscordRpcInIncognitoState) final hideDiscordRpcInIncognitoStateProvider = AutoDisposeNotifierProvider.internal( - HideDiscordRpcInIncognitoState.new, - name: r'hideDiscordRpcInIncognitoStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$hideDiscordRpcInIncognitoStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + HideDiscordRpcInIncognitoState.new, + name: r'hideDiscordRpcInIncognitoStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideDiscordRpcInIncognitoStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$HideDiscordRpcInIncognitoState = AutoDisposeNotifier; String _$rpcShowReadingWatchingProgressStateHash() => @@ -61,16 +61,19 @@ String _$rpcShowReadingWatchingProgressStateHash() => /// See also [RpcShowReadingWatchingProgressState]. @ProviderFor(RpcShowReadingWatchingProgressState) -final rpcShowReadingWatchingProgressStateProvider = AutoDisposeNotifierProvider< - RpcShowReadingWatchingProgressState, bool>.internal( - RpcShowReadingWatchingProgressState.new, - name: r'rpcShowReadingWatchingProgressStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$rpcShowReadingWatchingProgressStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final rpcShowReadingWatchingProgressStateProvider = + AutoDisposeNotifierProvider< + RpcShowReadingWatchingProgressState, + bool + >.internal( + RpcShowReadingWatchingProgressState.new, + name: r'rpcShowReadingWatchingProgressStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$rpcShowReadingWatchingProgressStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$RpcShowReadingWatchingProgressState = AutoDisposeNotifier; String _$rpcShowTitleStateHash() => r'b784b58365a72b54cbe46b1582c97c2f9b8057a2'; @@ -79,14 +82,14 @@ String _$rpcShowTitleStateHash() => r'b784b58365a72b54cbe46b1582c97c2f9b8057a2'; @ProviderFor(RpcShowTitleState) final rpcShowTitleStateProvider = AutoDisposeNotifierProvider.internal( - RpcShowTitleState.new, - name: r'rpcShowTitleStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$rpcShowTitleStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + RpcShowTitleState.new, + name: r'rpcShowTitleStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$rpcShowTitleStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$RpcShowTitleState = AutoDisposeNotifier; String _$rpcShowCoverImageStateHash() => @@ -96,14 +99,14 @@ String _$rpcShowCoverImageStateHash() => @ProviderFor(RpcShowCoverImageState) final rpcShowCoverImageStateProvider = AutoDisposeNotifierProvider.internal( - RpcShowCoverImageState.new, - name: r'rpcShowCoverImageStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$rpcShowCoverImageStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + RpcShowCoverImageState.new, + name: r'rpcShowCoverImageStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$rpcShowCoverImageStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$RpcShowCoverImageState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart index c8157b2f..84f11731 100644 --- a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart @@ -13,18 +13,18 @@ String _$getCustomButtonsStreamHash() => @ProviderFor(getCustomButtonsStream) final getCustomButtonsStreamProvider = AutoDisposeStreamProvider>.internal( - getCustomButtonsStream, - name: r'getCustomButtonsStreamProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$getCustomButtonsStreamHash, - dependencies: null, - allTransitiveDependencies: null, -); + getCustomButtonsStream, + name: r'getCustomButtonsStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getCustomButtonsStreamHash, + dependencies: null, + allTransitiveDependencies: null, + ); @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -typedef GetCustomButtonsStreamRef - = AutoDisposeStreamProviderRef>; +typedef GetCustomButtonsStreamRef = + AutoDisposeStreamProviderRef>; // 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 diff --git a/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart index 7d66dfe9..d1d90083 100644 --- a/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart @@ -13,14 +13,14 @@ String _$audioPreferredLangStateHash() => @ProviderFor(AudioPreferredLangState) final audioPreferredLangStateProvider = AutoDisposeNotifierProvider.internal( - AudioPreferredLangState.new, - name: r'audioPreferredLangStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$audioPreferredLangStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AudioPreferredLangState.new, + name: r'audioPreferredLangStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioPreferredLangStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AudioPreferredLangState = AutoDisposeNotifier; String _$enableAudioPitchCorrectionStateHash() => @@ -30,14 +30,14 @@ String _$enableAudioPitchCorrectionStateHash() => @ProviderFor(EnableAudioPitchCorrectionState) final enableAudioPitchCorrectionStateProvider = AutoDisposeNotifierProvider.internal( - EnableAudioPitchCorrectionState.new, - name: r'enableAudioPitchCorrectionStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableAudioPitchCorrectionStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + EnableAudioPitchCorrectionState.new, + name: r'enableAudioPitchCorrectionStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAudioPitchCorrectionStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$EnableAudioPitchCorrectionState = AutoDisposeNotifier; String _$audioChannelStateHash() => r'e71ffa85c37d545fb7b22e9539241b4926a2d384'; @@ -46,14 +46,14 @@ String _$audioChannelStateHash() => r'e71ffa85c37d545fb7b22e9539241b4926a2d384'; @ProviderFor(AudioChannelState) final audioChannelStateProvider = AutoDisposeNotifierProvider.internal( - AudioChannelState.new, - name: r'audioChannelStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$audioChannelStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AudioChannelState.new, + name: r'audioChannelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioChannelStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AudioChannelState = AutoDisposeNotifier; String _$volumeBoostCapStateHash() => @@ -63,14 +63,14 @@ String _$volumeBoostCapStateHash() => @ProviderFor(VolumeBoostCapState) final volumeBoostCapStateProvider = AutoDisposeNotifierProvider.internal( - VolumeBoostCapState.new, - name: r'volumeBoostCapStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$volumeBoostCapStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + VolumeBoostCapState.new, + name: r'volumeBoostCapStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$volumeBoostCapStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$VolumeBoostCapState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart index 79f0d622..51883fba 100644 --- a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart @@ -32,9 +32,7 @@ class _SystemHash { abstract class _$HwdecModeState extends BuildlessAutoDisposeNotifier { late final bool rawValue; - String build({ - bool rawValue = false, - }); + String build({bool rawValue = false}); } /// See also [HwdecModeState]. @@ -47,21 +45,15 @@ class HwdecModeStateFamily extends Family { const HwdecModeStateFamily(); /// See also [HwdecModeState]. - HwdecModeStateProvider call({ - bool rawValue = false, - }) { - return HwdecModeStateProvider( - rawValue: rawValue, - ); + HwdecModeStateProvider call({bool rawValue = false}) { + return HwdecModeStateProvider(rawValue: rawValue); } @override HwdecModeStateProvider getProviderOverride( covariant HwdecModeStateProvider provider, ) { - return call( - rawValue: provider.rawValue, - ); + return call(rawValue: provider.rawValue); } static const Iterable? _dependencies = null; @@ -83,21 +75,19 @@ class HwdecModeStateFamily extends Family { class HwdecModeStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [HwdecModeState]. - HwdecModeStateProvider({ - bool rawValue = false, - }) : this._internal( - () => HwdecModeState()..rawValue = rawValue, - from: hwdecModeStateProvider, - name: r'hwdecModeStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$hwdecModeStateHash, - dependencies: HwdecModeStateFamily._dependencies, - allTransitiveDependencies: - HwdecModeStateFamily._allTransitiveDependencies, - rawValue: rawValue, - ); + HwdecModeStateProvider({bool rawValue = false}) + : this._internal( + () => HwdecModeState()..rawValue = rawValue, + from: hwdecModeStateProvider, + name: r'hwdecModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hwdecModeStateHash, + dependencies: HwdecModeStateFamily._dependencies, + allTransitiveDependencies: + HwdecModeStateFamily._allTransitiveDependencies, + rawValue: rawValue, + ); HwdecModeStateProvider._internal( super._createNotifier, { @@ -112,12 +102,8 @@ class HwdecModeStateProvider final bool rawValue; @override - String runNotifierBuild( - covariant HwdecModeState notifier, - ) { - return notifier.build( - rawValue: rawValue, - ); + String runNotifierBuild(covariant HwdecModeState notifier) { + return notifier.build(rawValue: rawValue); } @override @@ -177,14 +163,14 @@ String _$debandingStateHash() => r'b93e2fc826d98cc8bce1aab9a92900353e4d3958'; @ProviderFor(DebandingState) final debandingStateProvider = AutoDisposeNotifierProvider.internal( - DebandingState.new, - name: r'debandingStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$debandingStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DebandingState.new, + name: r'debandingStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$debandingStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DebandingState = AutoDisposeNotifier; String _$useGpuNextStateHash() => r'cfc109cd7db66e359e9523102a84aa8cf37bf243'; @@ -193,14 +179,14 @@ String _$useGpuNextStateHash() => r'cfc109cd7db66e359e9523102a84aa8cf37bf243'; @ProviderFor(UseGpuNextState) final useGpuNextStateProvider = AutoDisposeNotifierProvider.internal( - UseGpuNextState.new, - name: r'useGpuNextStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$useGpuNextStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UseGpuNextState.new, + name: r'useGpuNextStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useGpuNextStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UseGpuNextState = AutoDisposeNotifier; String _$useYUV420PStateHash() => r'c600001eff34b2b8df31ba604413b8b20edc3044'; @@ -209,14 +195,14 @@ String _$useYUV420PStateHash() => r'c600001eff34b2b8df31ba604413b8b20edc3044'; @ProviderFor(UseYUV420PState) final useYUV420PStateProvider = AutoDisposeNotifierProvider.internal( - UseYUV420PState.new, - name: r'useYUV420PStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$useYUV420PStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UseYUV420PState.new, + name: r'useYUV420PStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useYUV420PStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UseYUV420PState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 58df635c..2d022eac 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -13,14 +13,14 @@ String _$defaultSubtitleLangStateHash() => @ProviderFor(DefaultSubtitleLangState) final defaultSubtitleLangStateProvider = AutoDisposeNotifierProvider.internal( - DefaultSubtitleLangState.new, - name: r'defaultSubtitleLangStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$defaultSubtitleLangStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DefaultSubtitleLangState.new, + name: r'defaultSubtitleLangStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultSubtitleLangStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DefaultSubtitleLangState = AutoDisposeNotifier; String _$markEpisodeAsSeenTypeStateHash() => @@ -30,14 +30,14 @@ String _$markEpisodeAsSeenTypeStateHash() => @ProviderFor(MarkEpisodeAsSeenTypeState) final markEpisodeAsSeenTypeStateProvider = AutoDisposeNotifierProvider.internal( - MarkEpisodeAsSeenTypeState.new, - name: r'markEpisodeAsSeenTypeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$markEpisodeAsSeenTypeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + MarkEpisodeAsSeenTypeState.new, + name: r'markEpisodeAsSeenTypeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$markEpisodeAsSeenTypeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$MarkEpisodeAsSeenTypeState = AutoDisposeNotifier; String _$defaultSkipIntroLengthStateHash() => @@ -47,14 +47,14 @@ String _$defaultSkipIntroLengthStateHash() => @ProviderFor(DefaultSkipIntroLengthState) final defaultSkipIntroLengthStateProvider = AutoDisposeNotifierProvider.internal( - DefaultSkipIntroLengthState.new, - name: r'defaultSkipIntroLengthStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$defaultSkipIntroLengthStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DefaultSkipIntroLengthState.new, + name: r'defaultSkipIntroLengthStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultSkipIntroLengthStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DefaultSkipIntroLengthState = AutoDisposeNotifier; String _$defaultDoubleTapToSkipLengthStateHash() => @@ -62,16 +62,19 @@ String _$defaultDoubleTapToSkipLengthStateHash() => /// See also [DefaultDoubleTapToSkipLengthState]. @ProviderFor(DefaultDoubleTapToSkipLengthState) -final defaultDoubleTapToSkipLengthStateProvider = AutoDisposeNotifierProvider< - DefaultDoubleTapToSkipLengthState, int>.internal( - DefaultDoubleTapToSkipLengthState.new, - name: r'defaultDoubleTapToSkipLengthStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$defaultDoubleTapToSkipLengthStateHash, - dependencies: null, - allTransitiveDependencies: null, -); +final defaultDoubleTapToSkipLengthStateProvider = + AutoDisposeNotifierProvider< + DefaultDoubleTapToSkipLengthState, + int + >.internal( + DefaultDoubleTapToSkipLengthState.new, + name: r'defaultDoubleTapToSkipLengthStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultDoubleTapToSkipLengthStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DefaultDoubleTapToSkipLengthState = AutoDisposeNotifier; String _$defaultPlayBackSpeedStateHash() => @@ -81,14 +84,14 @@ String _$defaultPlayBackSpeedStateHash() => @ProviderFor(DefaultPlayBackSpeedState) final defaultPlayBackSpeedStateProvider = AutoDisposeNotifierProvider.internal( - DefaultPlayBackSpeedState.new, - name: r'defaultPlayBackSpeedStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$defaultPlayBackSpeedStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DefaultPlayBackSpeedState.new, + name: r'defaultPlayBackSpeedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultPlayBackSpeedStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DefaultPlayBackSpeedState = AutoDisposeNotifier; String _$fullScreenPlayerStateHash() => @@ -98,14 +101,14 @@ String _$fullScreenPlayerStateHash() => @ProviderFor(FullScreenPlayerState) final fullScreenPlayerStateProvider = AutoDisposeNotifierProvider.internal( - FullScreenPlayerState.new, - name: r'fullScreenPlayerStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$fullScreenPlayerStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + FullScreenPlayerState.new, + name: r'fullScreenPlayerStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$fullScreenPlayerStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$FullScreenPlayerState = AutoDisposeNotifier; String _$enableAniSkipStateHash() => @@ -115,14 +118,14 @@ String _$enableAniSkipStateHash() => @ProviderFor(EnableAniSkipState) final enableAniSkipStateProvider = AutoDisposeNotifierProvider.internal( - EnableAniSkipState.new, - name: r'enableAniSkipStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableAniSkipStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + EnableAniSkipState.new, + name: r'enableAniSkipStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAniSkipStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$EnableAniSkipState = AutoDisposeNotifier; String _$enableAutoSkipStateHash() => @@ -132,14 +135,14 @@ String _$enableAutoSkipStateHash() => @ProviderFor(EnableAutoSkipState) final enableAutoSkipStateProvider = AutoDisposeNotifierProvider.internal( - EnableAutoSkipState.new, - name: r'enableAutoSkipStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$enableAutoSkipStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + EnableAutoSkipState.new, + name: r'enableAutoSkipStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAutoSkipStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$EnableAutoSkipState = AutoDisposeNotifier; String _$aniSkipTimeoutLengthStateHash() => @@ -149,14 +152,14 @@ String _$aniSkipTimeoutLengthStateHash() => @ProviderFor(AniSkipTimeoutLengthState) final aniSkipTimeoutLengthStateProvider = AutoDisposeNotifierProvider.internal( - AniSkipTimeoutLengthState.new, - name: r'aniSkipTimeoutLengthStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$aniSkipTimeoutLengthStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AniSkipTimeoutLengthState.new, + name: r'aniSkipTimeoutLengthStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$aniSkipTimeoutLengthStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AniSkipTimeoutLengthState = AutoDisposeNotifier; String _$useLibassStateHash() => r'aa8024f8b754117dfe80594f85155b05311a3152'; @@ -165,14 +168,14 @@ String _$useLibassStateHash() => r'aa8024f8b754117dfe80594f85155b05311a3152'; @ProviderFor(UseLibassState) final useLibassStateProvider = AutoDisposeNotifierProvider.internal( - UseLibassState.new, - name: r'useLibassStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$useLibassStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UseLibassState.new, + name: r'useLibassStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useLibassStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UseLibassState = AutoDisposeNotifier; String _$useMpvConfigStateHash() => r'f91e6a7dbd3c5f7674ba74842521ecfca01c78b0'; @@ -181,14 +184,14 @@ String _$useMpvConfigStateHash() => r'f91e6a7dbd3c5f7674ba74842521ecfca01c78b0'; @ProviderFor(UseMpvConfigState) final useMpvConfigStateProvider = AutoDisposeNotifierProvider.internal( - UseMpvConfigState.new, - name: r'useMpvConfigStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$useMpvConfigStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UseMpvConfigState.new, + name: r'useMpvConfigStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useMpvConfigStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UseMpvConfigState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart index ef3f1215..480f14af 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart @@ -13,14 +13,14 @@ String _$defaultReadingModeStateHash() => @ProviderFor(DefaultReadingModeState) final defaultReadingModeStateProvider = AutoDisposeNotifierProvider.internal( - DefaultReadingModeState.new, - name: r'defaultReadingModeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$defaultReadingModeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DefaultReadingModeState.new, + name: r'defaultReadingModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultReadingModeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DefaultReadingModeState = AutoDisposeNotifier; String _$animatePageTransitionsStateHash() => @@ -30,14 +30,14 @@ String _$animatePageTransitionsStateHash() => @ProviderFor(AnimatePageTransitionsState) final animatePageTransitionsStateProvider = AutoDisposeNotifierProvider.internal( - AnimatePageTransitionsState.new, - name: r'animatePageTransitionsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$animatePageTransitionsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + AnimatePageTransitionsState.new, + name: r'animatePageTransitionsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$animatePageTransitionsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$AnimatePageTransitionsState = AutoDisposeNotifier; String _$doubleTapAnimationSpeedStateHash() => @@ -47,14 +47,14 @@ String _$doubleTapAnimationSpeedStateHash() => @ProviderFor(DoubleTapAnimationSpeedState) final doubleTapAnimationSpeedStateProvider = AutoDisposeNotifierProvider.internal( - DoubleTapAnimationSpeedState.new, - name: r'doubleTapAnimationSpeedStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$doubleTapAnimationSpeedStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + DoubleTapAnimationSpeedState.new, + name: r'doubleTapAnimationSpeedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$doubleTapAnimationSpeedStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DoubleTapAnimationSpeedState = AutoDisposeNotifier; String _$cropBordersStateHash() => r'b8a38a59e240909f81a5faad44b54d3ced025de8'; @@ -63,14 +63,14 @@ String _$cropBordersStateHash() => r'b8a38a59e240909f81a5faad44b54d3ced025de8'; @ProviderFor(CropBordersState) final cropBordersStateProvider = AutoDisposeNotifierProvider.internal( - CropBordersState.new, - name: r'cropBordersStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$cropBordersStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + CropBordersState.new, + name: r'cropBordersStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$cropBordersStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$CropBordersState = AutoDisposeNotifier; String _$scaleTypeStateHash() => r'07f29cba7193242795134b6d37bb393210a191a1'; @@ -79,14 +79,14 @@ String _$scaleTypeStateHash() => r'07f29cba7193242795134b6d37bb393210a191a1'; @ProviderFor(ScaleTypeState) final scaleTypeStateProvider = AutoDisposeNotifierProvider.internal( - ScaleTypeState.new, - name: r'scaleTypeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$scaleTypeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + ScaleTypeState.new, + name: r'scaleTypeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$scaleTypeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ScaleTypeState = AutoDisposeNotifier; String _$pagePreloadAmountStateHash() => @@ -96,14 +96,14 @@ String _$pagePreloadAmountStateHash() => @ProviderFor(PagePreloadAmountState) final pagePreloadAmountStateProvider = AutoDisposeNotifierProvider.internal( - PagePreloadAmountState.new, - name: r'pagePreloadAmountStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$pagePreloadAmountStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + PagePreloadAmountState.new, + name: r'pagePreloadAmountStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$pagePreloadAmountStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$PagePreloadAmountState = AutoDisposeNotifier; String _$backgroundColorStateHash() => @@ -113,14 +113,14 @@ String _$backgroundColorStateHash() => @ProviderFor(BackgroundColorState) final backgroundColorStateProvider = AutoDisposeNotifierProvider.internal( - BackgroundColorState.new, - name: r'backgroundColorStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$backgroundColorStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + BackgroundColorState.new, + name: r'backgroundColorStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$backgroundColorStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$BackgroundColorState = AutoDisposeNotifier; String _$usePageTapZonesStateHash() => @@ -130,14 +130,14 @@ String _$usePageTapZonesStateHash() => @ProviderFor(UsePageTapZonesState) final usePageTapZonesStateProvider = AutoDisposeNotifierProvider.internal( - UsePageTapZonesState.new, - name: r'usePageTapZonesStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$usePageTapZonesStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UsePageTapZonesState.new, + name: r'usePageTapZonesStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$usePageTapZonesStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UsePageTapZonesState = AutoDisposeNotifier; String _$fullScreenReaderStateHash() => @@ -147,14 +147,14 @@ String _$fullScreenReaderStateHash() => @ProviderFor(FullScreenReaderState) final fullScreenReaderStateProvider = AutoDisposeNotifierProvider.internal( - FullScreenReaderState.new, - name: r'fullScreenReaderStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$fullScreenReaderStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + FullScreenReaderState.new, + name: r'fullScreenReaderStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$fullScreenReaderStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$FullScreenReaderState = AutoDisposeNotifier; String _$navigationOrderStateHash() => @@ -164,14 +164,14 @@ String _$navigationOrderStateHash() => @ProviderFor(NavigationOrderState) final navigationOrderStateProvider = AutoDisposeNotifierProvider>.internal( - NavigationOrderState.new, - name: r'navigationOrderStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$navigationOrderStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + NavigationOrderState.new, + name: r'navigationOrderStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$navigationOrderStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$NavigationOrderState = AutoDisposeNotifier>; String _$hideItemsStateHash() => r'3e719a5dfb38c1510214f7bcd8dbd786a13c4566'; @@ -180,14 +180,14 @@ String _$hideItemsStateHash() => r'3e719a5dfb38c1510214f7bcd8dbd786a13c4566'; @ProviderFor(HideItemsState) final hideItemsStateProvider = AutoDisposeNotifierProvider>.internal( - HideItemsState.new, - name: r'hideItemsStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$hideItemsStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + HideItemsState.new, + name: r'hideItemsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideItemsStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$HideItemsState = AutoDisposeNotifier>; String _$mergeLibraryNavMobileStateHash() => @@ -197,14 +197,14 @@ String _$mergeLibraryNavMobileStateHash() => @ProviderFor(MergeLibraryNavMobileState) final mergeLibraryNavMobileStateProvider = AutoDisposeNotifierProvider.internal( - MergeLibraryNavMobileState.new, - name: r'mergeLibraryNavMobileStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$mergeLibraryNavMobileStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + MergeLibraryNavMobileState.new, + name: r'mergeLibraryNavMobileStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$mergeLibraryNavMobileStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$MergeLibraryNavMobileState = AutoDisposeNotifier; String _$novelFontSizeStateHash() => @@ -214,14 +214,14 @@ String _$novelFontSizeStateHash() => @ProviderFor(NovelFontSizeState) final novelFontSizeStateProvider = AutoDisposeNotifierProvider.internal( - NovelFontSizeState.new, - name: r'novelFontSizeStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$novelFontSizeStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + NovelFontSizeState.new, + name: r'novelFontSizeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelFontSizeStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$NovelFontSizeState = AutoDisposeNotifier; String _$novelTextAlignStateHash() => @@ -231,14 +231,14 @@ String _$novelTextAlignStateHash() => @ProviderFor(NovelTextAlignState) final novelTextAlignStateProvider = AutoDisposeNotifierProvider.internal( - NovelTextAlignState.new, - name: r'novelTextAlignStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$novelTextAlignStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + NovelTextAlignState.new, + name: r'novelTextAlignStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelTextAlignStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$NovelTextAlignState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/settings/sync/providers/sync_providers.g.dart b/lib/modules/more/settings/sync/providers/sync_providers.g.dart index 798745a0..13329b37 100644 --- a/lib/modules/more/settings/sync/providers/sync_providers.g.dart +++ b/lib/modules/more/settings/sync/providers/sync_providers.g.dart @@ -32,9 +32,7 @@ class _SystemHash { abstract class _$Synching extends BuildlessAutoDisposeNotifier { late final int? syncId; - SyncPreference build({ - required int? syncId, - }); + SyncPreference build({required int? syncId}); } /// See also [Synching]. @@ -47,21 +45,13 @@ class SynchingFamily extends Family { const SynchingFamily(); /// See also [Synching]. - SynchingProvider call({ - required int? syncId, - }) { - return SynchingProvider( - syncId: syncId, - ); + SynchingProvider call({required int? syncId}) { + return SynchingProvider(syncId: syncId); } @override - SynchingProvider getProviderOverride( - covariant SynchingProvider provider, - ) { - return call( - syncId: provider.syncId, - ); + SynchingProvider getProviderOverride(covariant SynchingProvider provider) { + return call(syncId: provider.syncId); } static const Iterable? _dependencies = null; @@ -83,20 +73,18 @@ class SynchingFamily extends Family { class SynchingProvider extends AutoDisposeNotifierProviderImpl { /// See also [Synching]. - SynchingProvider({ - required int? syncId, - }) : this._internal( - () => Synching()..syncId = syncId, - from: synchingProvider, - name: r'synchingProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$synchingHash, - dependencies: SynchingFamily._dependencies, - allTransitiveDependencies: SynchingFamily._allTransitiveDependencies, - syncId: syncId, - ); + SynchingProvider({required int? syncId}) + : this._internal( + () => Synching()..syncId = syncId, + from: synchingProvider, + name: r'synchingProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$synchingHash, + dependencies: SynchingFamily._dependencies, + allTransitiveDependencies: SynchingFamily._allTransitiveDependencies, + syncId: syncId, + ); SynchingProvider._internal( super._createNotifier, { @@ -111,12 +99,8 @@ class SynchingProvider final int? syncId; @override - SyncPreference runNotifierBuild( - covariant Synching notifier, - ) { - return notifier.build( - syncId: syncId, - ); + SyncPreference runNotifierBuild(covariant Synching notifier) { + return notifier.build(syncId: syncId); } @override @@ -169,5 +153,6 @@ class _SynchingProviderElement @override int? get syncId => (origin as SynchingProvider).syncId; } + // 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 diff --git a/lib/modules/more/settings/track/providers/track_providers.g.dart b/lib/modules/more/settings/track/providers/track_providers.g.dart index 80dc2447..d46626a2 100644 --- a/lib/modules/more/settings/track/providers/track_providers.g.dart +++ b/lib/modules/more/settings/track/providers/track_providers.g.dart @@ -32,9 +32,7 @@ class _SystemHash { abstract class _$Tracks extends BuildlessAutoDisposeNotifier { late final int? syncId; - TrackPreference? build({ - required int? syncId, - }); + TrackPreference? build({required int? syncId}); } /// See also [Tracks]. @@ -47,21 +45,13 @@ class TracksFamily extends Family { const TracksFamily(); /// See also [Tracks]. - TracksProvider call({ - required int? syncId, - }) { - return TracksProvider( - syncId: syncId, - ); + TracksProvider call({required int? syncId}) { + return TracksProvider(syncId: syncId); } @override - TracksProvider getProviderOverride( - covariant TracksProvider provider, - ) { - return call( - syncId: provider.syncId, - ); + TracksProvider getProviderOverride(covariant TracksProvider provider) { + return call(syncId: provider.syncId); } static const Iterable? _dependencies = null; @@ -83,20 +73,18 @@ class TracksFamily extends Family { class TracksProvider extends AutoDisposeNotifierProviderImpl { /// See also [Tracks]. - TracksProvider({ - required int? syncId, - }) : this._internal( - () => Tracks()..syncId = syncId, - from: tracksProvider, - name: r'tracksProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$tracksHash, - dependencies: TracksFamily._dependencies, - allTransitiveDependencies: TracksFamily._allTransitiveDependencies, - syncId: syncId, - ); + TracksProvider({required int? syncId}) + : this._internal( + () => Tracks()..syncId = syncId, + from: tracksProvider, + name: r'tracksProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$tracksHash, + dependencies: TracksFamily._dependencies, + allTransitiveDependencies: TracksFamily._allTransitiveDependencies, + syncId: syncId, + ); TracksProvider._internal( super._createNotifier, { @@ -111,12 +99,8 @@ class TracksProvider final int? syncId; @override - TrackPreference? runNotifierBuild( - covariant Tracks notifier, - ) { - return notifier.build( - syncId: syncId, - ); + TrackPreference? runNotifierBuild(covariant Tracks notifier) { + return notifier.build(syncId: syncId); } @override @@ -177,14 +161,14 @@ String _$updateProgressAfterReadingStateHash() => @ProviderFor(UpdateProgressAfterReadingState) final updateProgressAfterReadingStateProvider = AutoDisposeNotifierProvider.internal( - UpdateProgressAfterReadingState.new, - name: r'updateProgressAfterReadingStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$updateProgressAfterReadingStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + UpdateProgressAfterReadingState.new, + name: r'updateProgressAfterReadingStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$updateProgressAfterReadingStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$UpdateProgressAfterReadingState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/modules/more/statistics/statistics_provider.g.dart b/lib/modules/more/statistics/statistics_provider.g.dart index 178007ee..c7611028 100644 --- a/lib/modules/more/statistics/statistics_provider.g.dart +++ b/lib/modules/more/statistics/statistics_provider.g.dart @@ -32,9 +32,7 @@ class _SystemHash { abstract class _$StatisticsState extends BuildlessAutoDisposeNotifier { late final ItemType itemType; - void build( - ItemType itemType, - ); + void build(ItemType itemType); } /// See also [StatisticsState]. @@ -47,21 +45,15 @@ class StatisticsStateFamily extends Family { const StatisticsStateFamily(); /// See also [StatisticsState]. - StatisticsStateProvider call( - ItemType itemType, - ) { - return StatisticsStateProvider( - itemType, - ); + StatisticsStateProvider call(ItemType itemType) { + return StatisticsStateProvider(itemType); } @override StatisticsStateProvider getProviderOverride( covariant StatisticsStateProvider provider, ) { - return call( - provider.itemType, - ); + return call(provider.itemType); } static const Iterable? _dependencies = null; @@ -83,21 +75,19 @@ class StatisticsStateFamily extends Family { class StatisticsStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [StatisticsState]. - StatisticsStateProvider( - ItemType itemType, - ) : this._internal( - () => StatisticsState()..itemType = itemType, - from: statisticsStateProvider, - name: r'statisticsStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$statisticsStateHash, - dependencies: StatisticsStateFamily._dependencies, - allTransitiveDependencies: - StatisticsStateFamily._allTransitiveDependencies, - itemType: itemType, - ); + StatisticsStateProvider(ItemType itemType) + : this._internal( + () => StatisticsState()..itemType = itemType, + from: statisticsStateProvider, + name: r'statisticsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$statisticsStateHash, + dependencies: StatisticsStateFamily._dependencies, + allTransitiveDependencies: + StatisticsStateFamily._allTransitiveDependencies, + itemType: itemType, + ); StatisticsStateProvider._internal( super._createNotifier, { @@ -112,12 +102,8 @@ class StatisticsStateProvider final ItemType itemType; @override - void runNotifierBuild( - covariant StatisticsState notifier, - ) { - return notifier.build( - itemType, - ); + void runNotifierBuild(covariant StatisticsState notifier) { + return notifier.build(itemType); } @override @@ -170,5 +156,6 @@ class _StatisticsStateProviderElement @override ItemType get itemType => (origin as StatisticsStateProvider).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 diff --git a/lib/modules/novel/novel_reader_controller_provider.g.dart b/lib/modules/novel/novel_reader_controller_provider.g.dart index 1ddf7923..42f2d479 100644 --- a/lib/modules/novel/novel_reader_controller_provider.g.dart +++ b/lib/modules/novel/novel_reader_controller_provider.g.dart @@ -34,9 +34,7 @@ abstract class _$NovelReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; - void build({ - required Chapter chapter, - }); + void build({required Chapter chapter}); } /// See also [NovelReaderController]. @@ -49,21 +47,15 @@ class NovelReaderControllerFamily extends Family { const NovelReaderControllerFamily(); /// See also [NovelReaderController]. - NovelReaderControllerProvider call({ - required Chapter chapter, - }) { - return NovelReaderControllerProvider( - chapter: chapter, - ); + NovelReaderControllerProvider call({required Chapter chapter}) { + return NovelReaderControllerProvider(chapter: chapter); } @override NovelReaderControllerProvider getProviderOverride( covariant NovelReaderControllerProvider provider, ) { - return call( - chapter: provider.chapter, - ); + return call(chapter: provider.chapter); } static const Iterable? _dependencies = null; @@ -85,21 +77,19 @@ class NovelReaderControllerFamily extends Family { class NovelReaderControllerProvider extends AutoDisposeNotifierProviderImpl { /// See also [NovelReaderController]. - NovelReaderControllerProvider({ - required Chapter chapter, - }) : this._internal( - () => NovelReaderController()..chapter = chapter, - from: novelReaderControllerProvider, - name: r'novelReaderControllerProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$novelReaderControllerHash, - dependencies: NovelReaderControllerFamily._dependencies, - allTransitiveDependencies: - NovelReaderControllerFamily._allTransitiveDependencies, - chapter: chapter, - ); + NovelReaderControllerProvider({required Chapter chapter}) + : this._internal( + () => NovelReaderController()..chapter = chapter, + from: novelReaderControllerProvider, + name: r'novelReaderControllerProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelReaderControllerHash, + dependencies: NovelReaderControllerFamily._dependencies, + allTransitiveDependencies: + NovelReaderControllerFamily._allTransitiveDependencies, + chapter: chapter, + ); NovelReaderControllerProvider._internal( super._createNotifier, { @@ -114,12 +104,8 @@ class NovelReaderControllerProvider final Chapter chapter; @override - void runNotifierBuild( - covariant NovelReaderController notifier, - ) { - return notifier.build( - chapter: chapter, - ); + void runNotifierBuild(covariant NovelReaderController notifier) { + return notifier.build(chapter: chapter); } @override @@ -140,7 +126,7 @@ class NovelReaderControllerProvider @override AutoDisposeNotifierProviderElement - createElement() { + createElement() { return _NovelReaderControllerProviderElement(this); } @@ -173,5 +159,6 @@ class _NovelReaderControllerProviderElement @override Chapter get chapter => (origin as NovelReaderControllerProvider).chapter; } + // 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 diff --git a/lib/providers/l10n_providers.g.dart b/lib/providers/l10n_providers.g.dart index 32e309dc..20482874 100644 --- a/lib/providers/l10n_providers.g.dart +++ b/lib/providers/l10n_providers.g.dart @@ -12,14 +12,14 @@ String _$l10nLocaleStateHash() => r'eb373ea1cc24b6d826f395755bbe0e445f592b0d'; @ProviderFor(L10nLocaleState) final l10nLocaleStateProvider = AutoDisposeNotifierProvider.internal( - L10nLocaleState.new, - name: r'l10nLocaleStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$l10nLocaleStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + L10nLocaleState.new, + name: r'l10nLocaleStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$l10nLocaleStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$L10nLocaleState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/router/router.g.dart b/lib/router/router.g.dart index d87a4020..950a0ee3 100644 --- a/lib/router/router.g.dart +++ b/lib/router/router.g.dart @@ -13,8 +13,9 @@ String _$routerHash() => r'fe1b18b9e03bd3df71cf66eabd78f0da3ac36247'; final routerProvider = AutoDisposeProvider.internal( router, name: r'routerProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$routerHash, + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$routerHash, dependencies: null, allTransitiveDependencies: null, ); @@ -29,14 +30,14 @@ String _$routerCurrentLocationStateHash() => @ProviderFor(RouterCurrentLocationState) final routerCurrentLocationStateProvider = AutoDisposeNotifierProvider.internal( - RouterCurrentLocationState.new, - name: r'routerCurrentLocationStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$routerCurrentLocationStateHash, - dependencies: null, - allTransitiveDependencies: null, -); + RouterCurrentLocationState.new, + name: r'routerCurrentLocationStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$routerCurrentLocationStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$RouterCurrentLocationState = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index c05db920..95f27f5b 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,15 +6,16 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; +String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; /// See also [AniSkip]. @ProviderFor(AniSkip) final aniSkipProvider = AutoDisposeNotifierProvider.internal( AniSkip.new, name: r'aniSkipProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$aniSkipHash, + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$aniSkipHash, dependencies: null, allTransitiveDependencies: null, ); diff --git a/lib/services/fetch_item_sources.g.dart b/lib/services/fetch_item_sources.g.dart index e39993b3..e8f42101 100644 --- a/lib/services/fetch_item_sources.g.dart +++ b/lib/services/fetch_item_sources.g.dart @@ -86,25 +86,24 @@ class FetchItemSourcesListProvider extends FutureProvider { required bool reFresh, required ItemType itemType, }) : this._internal( - (ref) => fetchItemSourcesList( - ref as FetchItemSourcesListRef, - id: id, - reFresh: reFresh, - itemType: itemType, - ), - from: fetchItemSourcesListProvider, - name: r'fetchItemSourcesListProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$fetchItemSourcesListHash, - dependencies: FetchItemSourcesListFamily._dependencies, - allTransitiveDependencies: - FetchItemSourcesListFamily._allTransitiveDependencies, - id: id, - reFresh: reFresh, - itemType: itemType, - ); + (ref) => fetchItemSourcesList( + ref as FetchItemSourcesListRef, + id: id, + reFresh: reFresh, + itemType: itemType, + ), + from: fetchItemSourcesListProvider, + name: r'fetchItemSourcesListProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$fetchItemSourcesListHash, + dependencies: FetchItemSourcesListFamily._dependencies, + allTransitiveDependencies: + FetchItemSourcesListFamily._allTransitiveDependencies, + id: id, + reFresh: reFresh, + itemType: itemType, + ); FetchItemSourcesListProvider._internal( super._createNotifier, { @@ -190,5 +189,6 @@ class _FetchItemSourcesListProviderElement extends FutureProviderElement @override ItemType get itemType => (origin as FetchItemSourcesListProvider).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 diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 38b50ef3..1e1a160a 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -39,21 +39,15 @@ class GetChapterPagesFamily extends Family> { const GetChapterPagesFamily(); /// See also [getChapterPages]. - GetChapterPagesProvider call({ - required Chapter chapter, - }) { - return GetChapterPagesProvider( - chapter: chapter, - ); + GetChapterPagesProvider call({required Chapter chapter}) { + return GetChapterPagesProvider(chapter: chapter); } @override GetChapterPagesProvider getProviderOverride( covariant GetChapterPagesProvider provider, ) { - return call( - chapter: provider.chapter, - ); + return call(chapter: provider.chapter); } static const Iterable? _dependencies = null; @@ -75,24 +69,19 @@ class GetChapterPagesFamily extends Family> { class GetChapterPagesProvider extends AutoDisposeFutureProvider { /// See also [getChapterPages]. - GetChapterPagesProvider({ - required Chapter chapter, - }) : this._internal( - (ref) => getChapterPages( - ref as GetChapterPagesRef, - chapter: chapter, - ), - from: getChapterPagesProvider, - name: r'getChapterPagesProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getChapterPagesHash, - dependencies: GetChapterPagesFamily._dependencies, - allTransitiveDependencies: - GetChapterPagesFamily._allTransitiveDependencies, - chapter: chapter, - ); + GetChapterPagesProvider({required Chapter chapter}) + : this._internal( + (ref) => getChapterPages(ref as GetChapterPagesRef, chapter: chapter), + from: getChapterPagesProvider, + name: r'getChapterPagesProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getChapterPagesHash, + dependencies: GetChapterPagesFamily._dependencies, + allTransitiveDependencies: + GetChapterPagesFamily._allTransitiveDependencies, + chapter: chapter, + ); GetChapterPagesProvider._internal( super._createNotifier, { @@ -158,5 +147,6 @@ class _GetChapterPagesProviderElement @override Chapter get chapter => (origin as GetChapterPagesProvider).chapter; } + // 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 diff --git a/lib/services/get_detail.g.dart b/lib/services/get_detail.g.dart index 49f6efcd..97b734a1 100644 --- a/lib/services/get_detail.g.dart +++ b/lib/services/get_detail.g.dart @@ -39,24 +39,13 @@ class GetDetailFamily extends Family> { const GetDetailFamily(); /// See also [getDetail]. - GetDetailProvider call({ - required String url, - required Source source, - }) { - return GetDetailProvider( - url: url, - source: source, - ); + GetDetailProvider call({required String url, required Source source}) { + return GetDetailProvider(url: url, source: source); } @override - GetDetailProvider getProviderOverride( - covariant GetDetailProvider provider, - ) { - return call( - url: provider.url, - source: provider.source, - ); + GetDetailProvider getProviderOverride(covariant GetDetailProvider provider) { + return call(url: provider.url, source: provider.source); } static const Iterable? _dependencies = null; @@ -77,26 +66,19 @@ class GetDetailFamily extends Family> { /// See also [getDetail]. class GetDetailProvider extends AutoDisposeFutureProvider { /// See also [getDetail]. - GetDetailProvider({ - required String url, - required Source source, - }) : this._internal( - (ref) => getDetail( - ref as GetDetailRef, - url: url, - source: source, - ), - from: getDetailProvider, - name: r'getDetailProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getDetailHash, - dependencies: GetDetailFamily._dependencies, - allTransitiveDependencies: GetDetailFamily._allTransitiveDependencies, - url: url, - source: source, - ); + GetDetailProvider({required String url, required Source source}) + : this._internal( + (ref) => getDetail(ref as GetDetailRef, url: url, source: source), + from: getDetailProvider, + name: r'getDetailProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getDetailHash, + dependencies: GetDetailFamily._dependencies, + allTransitiveDependencies: GetDetailFamily._allTransitiveDependencies, + url: url, + source: source, + ); GetDetailProvider._internal( super._createNotifier, { @@ -172,5 +154,6 @@ class _GetDetailProviderElement extends AutoDisposeFutureProviderElement @override Source get source => (origin as GetDetailProvider).source; } + // 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 diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index 91231d14..3d7dd0dc 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -39,21 +39,15 @@ class GetHtmlContentFamily extends Family> { const GetHtmlContentFamily(); /// See also [getHtmlContent]. - GetHtmlContentProvider call({ - required Chapter chapter, - }) { - return GetHtmlContentProvider( - chapter: chapter, - ); + GetHtmlContentProvider call({required Chapter chapter}) { + return GetHtmlContentProvider(chapter: chapter); } @override GetHtmlContentProvider getProviderOverride( covariant GetHtmlContentProvider provider, ) { - return call( - chapter: provider.chapter, - ); + return call(chapter: provider.chapter); } static const Iterable? _dependencies = null; @@ -75,24 +69,19 @@ class GetHtmlContentFamily extends Family> { class GetHtmlContentProvider extends AutoDisposeFutureProvider<(String, EpubBook?)> { /// See also [getHtmlContent]. - GetHtmlContentProvider({ - required Chapter chapter, - }) : this._internal( - (ref) => getHtmlContent( - ref as GetHtmlContentRef, - chapter: chapter, - ), - from: getHtmlContentProvider, - name: r'getHtmlContentProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getHtmlContentHash, - dependencies: GetHtmlContentFamily._dependencies, - allTransitiveDependencies: - GetHtmlContentFamily._allTransitiveDependencies, - chapter: chapter, - ); + GetHtmlContentProvider({required Chapter chapter}) + : this._internal( + (ref) => getHtmlContent(ref as GetHtmlContentRef, chapter: chapter), + from: getHtmlContentProvider, + name: r'getHtmlContentProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getHtmlContentHash, + dependencies: GetHtmlContentFamily._dependencies, + allTransitiveDependencies: + GetHtmlContentFamily._allTransitiveDependencies, + chapter: chapter, + ); GetHtmlContentProvider._internal( super._createNotifier, { @@ -158,5 +147,6 @@ class _GetHtmlContentProviderElement @override Chapter get chapter => (origin as GetHtmlContentProvider).chapter; } + // 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 diff --git a/lib/services/get_latest_updates.g.dart b/lib/services/get_latest_updates.g.dart index d96a255f..d6b6cfb3 100644 --- a/lib/services/get_latest_updates.g.dart +++ b/lib/services/get_latest_updates.g.dart @@ -39,24 +39,15 @@ class GetLatestUpdatesFamily extends Family> { const GetLatestUpdatesFamily(); /// See also [getLatestUpdates]. - GetLatestUpdatesProvider call({ - required Source source, - required int page, - }) { - return GetLatestUpdatesProvider( - source: source, - page: page, - ); + GetLatestUpdatesProvider call({required Source source, required int page}) { + return GetLatestUpdatesProvider(source: source, page: page); } @override GetLatestUpdatesProvider getProviderOverride( covariant GetLatestUpdatesProvider provider, ) { - return call( - source: provider.source, - page: provider.page, - ); + return call(source: provider.source, page: provider.page); } static const Iterable? _dependencies = null; @@ -77,27 +68,24 @@ class GetLatestUpdatesFamily extends Family> { /// See also [getLatestUpdates]. class GetLatestUpdatesProvider extends AutoDisposeFutureProvider { /// See also [getLatestUpdates]. - GetLatestUpdatesProvider({ - required Source source, - required int page, - }) : this._internal( - (ref) => getLatestUpdates( - ref as GetLatestUpdatesRef, - source: source, - page: page, - ), - from: getLatestUpdatesProvider, - name: r'getLatestUpdatesProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getLatestUpdatesHash, - dependencies: GetLatestUpdatesFamily._dependencies, - allTransitiveDependencies: - GetLatestUpdatesFamily._allTransitiveDependencies, + GetLatestUpdatesProvider({required Source source, required int page}) + : this._internal( + (ref) => getLatestUpdates( + ref as GetLatestUpdatesRef, source: source, page: page, - ); + ), + from: getLatestUpdatesProvider, + name: r'getLatestUpdatesProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getLatestUpdatesHash, + dependencies: GetLatestUpdatesFamily._dependencies, + allTransitiveDependencies: + GetLatestUpdatesFamily._allTransitiveDependencies, + source: source, + page: page, + ); GetLatestUpdatesProvider._internal( super._createNotifier, { @@ -165,7 +153,8 @@ mixin GetLatestUpdatesRef on AutoDisposeFutureProviderRef { } class _GetLatestUpdatesProviderElement - extends AutoDisposeFutureProviderElement with GetLatestUpdatesRef { + extends AutoDisposeFutureProviderElement + with GetLatestUpdatesRef { _GetLatestUpdatesProviderElement(super.provider); @override @@ -173,5 +162,6 @@ class _GetLatestUpdatesProviderElement @override int get page => (origin as GetLatestUpdatesProvider).page; } + // 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 diff --git a/lib/services/get_popular.g.dart b/lib/services/get_popular.g.dart index c25b6d3f..0b9f61bf 100644 --- a/lib/services/get_popular.g.dart +++ b/lib/services/get_popular.g.dart @@ -39,24 +39,15 @@ class GetPopularFamily extends Family> { const GetPopularFamily(); /// See also [getPopular]. - GetPopularProvider call({ - required Source source, - required int page, - }) { - return GetPopularProvider( - source: source, - page: page, - ); + GetPopularProvider call({required Source source, required int page}) { + return GetPopularProvider(source: source, page: page); } @override GetPopularProvider getProviderOverride( covariant GetPopularProvider provider, ) { - return call( - source: provider.source, - page: provider.page, - ); + return call(source: provider.source, page: provider.page); } static const Iterable? _dependencies = null; @@ -77,27 +68,19 @@ class GetPopularFamily extends Family> { /// See also [getPopular]. class GetPopularProvider extends AutoDisposeFutureProvider { /// See also [getPopular]. - GetPopularProvider({ - required Source source, - required int page, - }) : this._internal( - (ref) => getPopular( - ref as GetPopularRef, - source: source, - page: page, - ), - from: getPopularProvider, - name: r'getPopularProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$getPopularHash, - dependencies: GetPopularFamily._dependencies, - allTransitiveDependencies: - GetPopularFamily._allTransitiveDependencies, - source: source, - page: page, - ); + GetPopularProvider({required Source source, required int page}) + : this._internal( + (ref) => getPopular(ref as GetPopularRef, source: source, page: page), + from: getPopularProvider, + name: r'getPopularProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getPopularHash, + dependencies: GetPopularFamily._dependencies, + allTransitiveDependencies: GetPopularFamily._allTransitiveDependencies, + source: source, + page: page, + ); GetPopularProvider._internal( super._createNotifier, { @@ -165,7 +148,8 @@ mixin GetPopularRef on AutoDisposeFutureProviderRef { } class _GetPopularProviderElement - extends AutoDisposeFutureProviderElement with GetPopularRef { + extends AutoDisposeFutureProviderElement + with GetPopularRef { _GetPopularProviderElement(super.provider); @override @@ -173,5 +157,6 @@ class _GetPopularProviderElement @override int get page => (origin as GetPopularProvider).page; } + // 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 diff --git a/lib/services/get_source_baseurl.g.dart b/lib/services/get_source_baseurl.g.dart index f8621dac..b9bed44c 100644 --- a/lib/services/get_source_baseurl.g.dart +++ b/lib/services/get_source_baseurl.g.dart @@ -39,21 +39,15 @@ class SourceBaseUrlFamily extends Family { const SourceBaseUrlFamily(); /// See also [sourceBaseUrl]. - SourceBaseUrlProvider call({ - required Source source, - }) { - return SourceBaseUrlProvider( - source: source, - ); + SourceBaseUrlProvider call({required Source source}) { + return SourceBaseUrlProvider(source: source); } @override SourceBaseUrlProvider getProviderOverride( covariant SourceBaseUrlProvider provider, ) { - return call( - source: provider.source, - ); + return call(source: provider.source); } static const Iterable? _dependencies = null; @@ -74,24 +68,19 @@ class SourceBaseUrlFamily extends Family { /// See also [sourceBaseUrl]. class SourceBaseUrlProvider extends AutoDisposeProvider { /// See also [sourceBaseUrl]. - SourceBaseUrlProvider({ - required Source source, - }) : this._internal( - (ref) => sourceBaseUrl( - ref as SourceBaseUrlRef, - source: source, - ), - from: sourceBaseUrlProvider, - name: r'sourceBaseUrlProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$sourceBaseUrlHash, - dependencies: SourceBaseUrlFamily._dependencies, - allTransitiveDependencies: - SourceBaseUrlFamily._allTransitiveDependencies, - source: source, - ); + SourceBaseUrlProvider({required Source source}) + : this._internal( + (ref) => sourceBaseUrl(ref as SourceBaseUrlRef, source: source), + from: sourceBaseUrlProvider, + name: r'sourceBaseUrlProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$sourceBaseUrlHash, + dependencies: SourceBaseUrlFamily._dependencies, + allTransitiveDependencies: + SourceBaseUrlFamily._allTransitiveDependencies, + source: source, + ); SourceBaseUrlProvider._internal( super._createNotifier, { @@ -106,9 +95,7 @@ class SourceBaseUrlProvider extends AutoDisposeProvider { final Source source; @override - Override overrideWith( - String Function(SourceBaseUrlRef provider) create, - ) { + Override overrideWith(String Function(SourceBaseUrlRef provider) create) { return ProviderOverride( origin: this, override: SourceBaseUrlProvider._internal( @@ -156,5 +143,6 @@ class _SourceBaseUrlProviderElement extends AutoDisposeProviderElement @override Source get source => (origin as SourceBaseUrlProvider).source; } + // 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 diff --git a/lib/services/get_video_list.g.dart b/lib/services/get_video_list.g.dart index 087ab36d..c97d8f04 100644 --- a/lib/services/get_video_list.g.dart +++ b/lib/services/get_video_list.g.dart @@ -40,21 +40,15 @@ class GetVideoListFamily const GetVideoListFamily(); /// See also [getVideoList]. - GetVideoListProvider call({ - required Chapter episode, - }) { - return GetVideoListProvider( - episode: episode, - ); + GetVideoListProvider call({required Chapter episode}) { + return GetVideoListProvider(episode: episode); } @override GetVideoListProvider getProviderOverride( covariant GetVideoListProvider provider, ) { - return call( - episode: provider.episode, - ); + return call(episode: provider.episode); } static const Iterable? _dependencies = null; @@ -73,27 +67,25 @@ class GetVideoListFamily } /// See also [getVideoList]. -class GetVideoListProvider extends AutoDisposeFutureProvider< - (List

    ( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, + ) { + switch (propertyId) {'''; + + for (var i = 0; i < object.objectProperties.length; i++) { + final property = object.objectProperties[i]; + final deser = _deserializeProperty(object, property, 'offset'); + code += 'case $i: return ($deser) as P;'; + } + + return ''' + $code + default: + throw IsarError('Unknown property with id \$propertyId'); + } + } + '''; +} + +String _deserializeProperty( + ObjectInfo object, + ObjectProperty property, + String propertyOffset, +) { + if (property.isId) { + return 'id'; + } + + final deser = _deserialize(property, propertyOffset); + + var defaultValue = ''; + if (!property.nullable) { + if (property.userDefaultValue != null) { + defaultValue = '?? ${property.userDefaultValue}'; + } else if (property.isarType == IsarType.object) { + defaultValue = '?? ${property.typeClassName}()'; + } else if (property.isarType.isList) { + defaultValue = '?? []'; + } else if (property.isEnum) { + defaultValue = '?? ${property.defaultEnumElement}'; + } + } + + if (property.isEnum) { + if (property.isarType.isList) { + final elDefault = + !property.elementNullable ? '?? ${property.defaultEnumElement}' : ''; + return '$deser?.map((e) => ${property.valueEnumMapName(object)}[e] ' + '$elDefault).toList() $defaultValue'; + } else { + return '${property.valueEnumMapName(object)}[$deser] $defaultValue'; + } + } else { + return '$deser $defaultValue'; + } +} + +String _deserialize(ObjectProperty property, String propertyOffset) { + final orNull = + property.nullable || property.userDefaultValue != null || property.isEnum + ? 'OrNull' + : ''; + final orElNull = property.elementNullable ? 'OrNull' : ''; + + switch (property.isarType) { + case IsarType.bool: + return 'reader.readBool$orNull($propertyOffset)'; + case IsarType.byte: + return 'reader.readByte$orNull($propertyOffset)'; + case IsarType.int: + return 'reader.readInt$orNull($propertyOffset)'; + case IsarType.float: + return 'reader.readFloat$orNull($propertyOffset)'; + case IsarType.long: + return 'reader.readLong$orNull($propertyOffset)'; + case IsarType.double: + return 'reader.readDouble$orNull($propertyOffset)'; + case IsarType.dateTime: + return 'reader.readDateTime$orNull($propertyOffset)'; + case IsarType.string: + return 'reader.readString$orNull($propertyOffset)'; + case IsarType.object: + return ''' + reader.readObjectOrNull<${property.typeClassName}>( + $propertyOffset, + ${property.targetSchema}.deserialize, + allOffsets, + )'''; + case IsarType.boolList: + return 'reader.readBool${orElNull}List($propertyOffset)'; + case IsarType.byteList: + return 'reader.readByteList($propertyOffset)'; + case IsarType.intList: + return 'reader.readInt${orElNull}List($propertyOffset)'; + case IsarType.floatList: + return 'reader.readFloat${orElNull}List($propertyOffset)'; + case IsarType.longList: + return 'reader.readLong${orElNull}List($propertyOffset)'; + case IsarType.doubleList: + return 'reader.readDouble${orElNull}List($propertyOffset)'; + case IsarType.dateTimeList: + return 'reader.readDateTime${orElNull}List($propertyOffset)'; + case IsarType.stringList: + return 'reader.readString${orElNull}List($propertyOffset)'; + case IsarType.objectList: + return ''' + reader.readObject${orElNull}List<${property.typeClassName}>( + $propertyOffset, + ${property.targetSchema}.deserialize, + allOffsets, + ${!property.elementNullable ? '${property.typeClassName}(),' : ''} + )'''; + } +} + +String generateGetId(ObjectInfo object) { + final defaultVal = object.idProperty.nullable ? '?? Isar.autoIncrement' : ''; + return ''' + Id ${object.getIdName}(${object.dartName} object) { + return object.${object.idProperty.dartName} $defaultVal; + } + '''; +} + +String generateGetLinks(ObjectInfo object) { + return ''' + List> ${object.getLinksName}(${object.dartName} object) { + return [${object.links.map((e) => 'object.${e.dartName}').join(',')}]; + } + '''; +} + +String generateAttach(ObjectInfo object) { + var code = ''' + void ${object.attachName}(IsarCollection col, Id id, ${object.dartName} object) {'''; + + if (object.idProperty.assignable) { + code += 'object.${object.idProperty.dartName} = id;'; + } + + for (final link in object.links) { + // ignore: leading_newlines_in_multiline_strings + code += '''object.${link.dartName}.attach( + col, + col.isar.collection<${link.targetCollectionDartName}>(), + r'${link.isarName}', + id + );'''; + } + return '$code}'; +} + +String generateEnumMaps(ObjectInfo object) { + var code = ''; + for (final property in object.properties) { + final enumName = property.typeClassName; + if (property.isEnum) { + code += 'const ${property.enumValueMapName(object)} = {'; + for (final enumElementName in property.enumMap!.keys) { + final value = property.enumMap![enumElementName]; + if (value is String) { + code += "r'$enumElementName': r'$value',"; + } else { + code += "'$enumElementName': $value,"; + } + } + code += '};'; + + code += 'const ${property.valueEnumMapName(object)} = {'; + for (final enumElementName in property.enumMap!.keys) { + final value = property.enumMap![enumElementName]; + if (value is String) { + code += "r'$value': $enumName.$enumElementName,"; + } else { + code += '$value: $enumName.$enumElementName,'; + } + } + code += '};'; + } + } + + return code; +} diff --git a/plugins/isar_generator/lib/src/collection_generator.dart b/plugins/isar_generator/lib/src/collection_generator.dart new file mode 100644 index 00000000..9231281b --- /dev/null +++ b/plugins/isar_generator/lib/src/collection_generator.dart @@ -0,0 +1,105 @@ +import 'dart:async'; + +import 'package:analyzer/dart/element/element.dart'; +import 'package:build/build.dart'; +import 'package:isar/isar.dart'; +import 'package:isar_generator/src/code_gen/by_index_generator.dart'; +import 'package:isar_generator/src/code_gen/collection_schema_generator.dart'; +import 'package:isar_generator/src/code_gen/query_distinct_by_generator.dart'; +import 'package:isar_generator/src/code_gen/query_filter_generator.dart'; +import 'package:isar_generator/src/code_gen/query_link_generator.dart'; +import 'package:isar_generator/src/code_gen/query_object_generator.dart'; +import 'package:isar_generator/src/code_gen/query_property_generator.dart'; +import 'package:isar_generator/src/code_gen/query_sort_by_generator.dart'; +import 'package:isar_generator/src/code_gen/query_where_generator.dart'; +import 'package:isar_generator/src/code_gen/type_adapter_generator.dart'; +import 'package:isar_generator/src/isar_analyzer.dart'; +import 'package:source_gen/source_gen.dart'; + +const ignoreLints = [ + 'duplicate_ignore', + 'non_constant_identifier_names', + 'constant_identifier_names', + 'invalid_use_of_protected_member', + 'unnecessary_cast', + 'prefer_const_constructors', + 'lines_longer_than_80_chars', + 'require_trailing_commas', + 'inference_failure_on_function_invocation', + 'unnecessary_parenthesis', + 'unnecessary_raw_strings', + 'unnecessary_null_checks', + 'join_return_with_assignment', + 'prefer_final_locals', + 'avoid_js_rounded_ints', + 'avoid_positional_boolean_parameters', + 'always_specify_types', +]; + +class IsarCollectionGenerator extends GeneratorForAnnotation { + @override + Future generateForAnnotatedElement( + Element element, + ConstantReader annotation, + BuildStep buildStep, + ) async { + final object = IsarAnalyzer().analyzeCollection(element); + return ''' + // coverage:ignore-file + // ignore_for_file: ${ignoreLints.join(', ')} + + extension Get${object.dartName}Collection on Isar { + IsarCollection<${object.dartName}> get ${object.accessor} => this.collection(); + } + + ${generateSchema(object)} + + ${generateEstimateSerialize(object)} + ${generateSerialize(object)} + ${generateDeserialize(object)} + ${generateDeserializeProp(object)} + + ${generateEnumMaps(object)} + + ${generateGetId(object)} + ${generateGetLinks(object)} + ${generateAttach(object)} + + ${generateByIndexExtension(object)} + ${WhereGenerator(object).generate()} + ${FilterGenerator(object).generate()} + ${generateQueryObjects(object)} + ${generateQueryLinks(object)} + ${generateSortBy(object)} + ${generateDistinctBy(object)} + ${generatePropertyQuery(object)} + '''; + } +} + +class IsarEmbeddedGenerator extends GeneratorForAnnotation { + @override + Future generateForAnnotatedElement( + Element element, + ConstantReader annotation, + BuildStep buildStep, + ) async { + final object = IsarAnalyzer().analyzeEmbedded(element); + return ''' + // coverage:ignore-file + // ignore_for_file: ${ignoreLints.join(', ')} + + ${generateSchema(object)} + + ${generateEstimateSerialize(object)} + ${generateSerialize(object)} + ${generateDeserialize(object)} + ${generateDeserializeProp(object)} + + ${generateEnumMaps(object)} + + ${FilterGenerator(object).generate()} + ${generateQueryObjects(object)} + '''; + } +} diff --git a/plugins/isar_generator/lib/src/helper.dart b/plugins/isar_generator/lib/src/helper.dart new file mode 100644 index 00000000..9fabd155 --- /dev/null +++ b/plugins/isar_generator/lib/src/helper.dart @@ -0,0 +1,183 @@ +import 'package:analyzer/dart/constant/value.dart'; +import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/type.dart'; +import 'package:dartx/dartx.dart'; +import 'package:isar/isar.dart'; +import 'package:source_gen/source_gen.dart'; + +const TypeChecker _collectionChecker = TypeChecker.fromRuntime(Collection); +const TypeChecker _enumeratedChecker = TypeChecker.fromRuntime(Enumerated); +const TypeChecker _embeddedChecker = TypeChecker.fromRuntime(Embedded); +const TypeChecker _ignoreChecker = TypeChecker.fromRuntime(Ignore); +const TypeChecker _nameChecker = TypeChecker.fromRuntime(Name); +const TypeChecker _indexChecker = TypeChecker.fromRuntime(Index); +const TypeChecker _backlinkChecker = TypeChecker.fromRuntime(Backlink); + +extension ClassElementX on ClassElement { + bool get hasZeroArgsConstructor { + return constructors.any( + (ConstructorElement c) => + c.isPublic && + !c.parameters.any((ParameterElement p) => !p.isOptional), + ); + } + + List get allAccessors { + final ignoreFields = + collectionAnnotation?.ignore ?? embeddedAnnotation!.ignore; + return [ + ...fields, + if (collectionAnnotation?.inheritance ?? embeddedAnnotation!.inheritance) + for (InterfaceType supertype in allSupertypes) ...[ + if (!supertype.isDartCoreObject) ...supertype.element.fields + ] + ] + .where( + (PropertyInducingElement e) => + e.isPublic && + !e.isStatic && + !_ignoreChecker.hasAnnotationOf(e.nonSynthetic) && + !ignoreFields.contains(e.name), + ) + .distinctBy((e) => e.name) + .toList(); + } + + List get enumConsts { + return fields.where((e) => e.isEnumConstant).map((e) => e.name).toList(); + } +} + +extension PropertyElementX on PropertyInducingElement { + bool get isLink => type.element!.name == 'IsarLink'; + + bool get isLinks => type.element!.name == 'IsarLinks'; + + Enumerated? get enumeratedAnnotation { + final ann = _enumeratedChecker.firstAnnotationOfExact(nonSynthetic); + if (ann == null) { + return null; + } + final typeIndex = ann.getField('type')!.getField('index')!.toIntValue()!; + return Enumerated( + EnumType.values[typeIndex], + ann.getField('property')?.toStringValue(), + ); + } + + Backlink? get backlinkAnnotation { + final ann = _backlinkChecker.firstAnnotationOfExact(nonSynthetic); + if (ann == null) { + return null; + } + return Backlink(to: ann.getField('to')!.toStringValue()!); + } + + List get indexAnnotations { + return _indexChecker.annotationsOfExact(nonSynthetic).map((DartObject ann) { + final rawComposite = ann.getField('composite')!.toListValue(); + final composite = []; + if (rawComposite != null) { + for (final c in rawComposite) { + final indexTypeField = c.getField('type')!; + IndexType? indexType; + if (!indexTypeField.isNull) { + final indexTypeIndex = + indexTypeField.getField('index')!.toIntValue()!; + indexType = IndexType.values[indexTypeIndex]; + } + composite.add( + CompositeIndex( + c.getField('property')!.toStringValue()!, + type: indexType, + caseSensitive: c.getField('caseSensitive')!.toBoolValue(), + ), + ); + } + } + final indexTypeField = ann.getField('type')!; + IndexType? indexType; + if (!indexTypeField.isNull) { + final indexTypeIndex = indexTypeField.getField('index')!.toIntValue()!; + indexType = IndexType.values[indexTypeIndex]; + } + return Index( + name: ann.getField('name')!.toStringValue(), + composite: composite, + unique: ann.getField('unique')!.toBoolValue()!, + replace: ann.getField('replace')!.toBoolValue()!, + type: indexType, + caseSensitive: ann.getField('caseSensitive')!.toBoolValue(), + ); + }).toList(); + } +} + +extension ElementX on Element { + String get isarName { + final ann = _nameChecker.firstAnnotationOfExact(nonSynthetic); + late String name; + if (ann == null) { + name = displayName; + } else { + name = ann.getField('name')!.toStringValue()!; + } + checkIsarName(name, this); + return name; + } + + Collection? get collectionAnnotation { + final ann = _collectionChecker.firstAnnotationOfExact(nonSynthetic); + if (ann == null) { + return null; + } + return Collection( + inheritance: ann.getField('inheritance')!.toBoolValue()!, + accessor: ann.getField('accessor')!.toStringValue(), + ignore: ann + .getField('ignore')! + .toSetValue()! + .map((e) => e.toStringValue()!) + .toSet(), + ); + } + + String get collectionAccessor { + var accessor = collectionAnnotation?.accessor; + if (accessor != null) { + return accessor; + } + + accessor = displayName.decapitalize(); + if (!accessor.endsWith('s')) { + accessor += 's'; + } + + return accessor; + } + + Embedded? get embeddedAnnotation { + final ann = _embeddedChecker.firstAnnotationOfExact(nonSynthetic); + if (ann == null) { + return null; + } + return Embedded( + inheritance: ann.getField('inheritance')!.toBoolValue()!, + ignore: ann + .getField('ignore')! + .toSetValue()! + .map((e) => e.toStringValue()!) + .toSet(), + ); + } +} + +void checkIsarName(String name, Element element) { + if (name.isBlank || name.startsWith('_')) { + err('Names must not be blank or start with "_".', element); + } +} + +Never err(String msg, [Element? element]) { + throw InvalidGenerationSourceError(msg, element: element); +} diff --git a/plugins/isar_generator/lib/src/isar_analyzer.dart b/plugins/isar_generator/lib/src/isar_analyzer.dart new file mode 100644 index 00000000..a2102809 --- /dev/null +++ b/plugins/isar_generator/lib/src/isar_analyzer.dart @@ -0,0 +1,502 @@ +import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/nullability_suffix.dart'; +import 'package:analyzer/dart/element/type.dart'; +import 'package:dartx/dartx.dart'; +import 'package:isar/isar.dart'; + +import 'package:isar_generator/src/helper.dart'; +import 'package:isar_generator/src/isar_type.dart'; +import 'package:isar_generator/src/object_info.dart'; + +class IsarAnalyzer { + ObjectInfo analyzeCollection(Element element) { + final constructor = _checkValidClass(element); + final modelClass = element as ClassElement; + + final properties = []; + final links = []; + for (final propertyElement in modelClass.allAccessors) { + if (propertyElement.isLink || propertyElement.isLinks) { + final link = analyzeObjectLink(propertyElement); + links.add(link); + } else { + final property = analyzeObjectProperty(propertyElement, constructor); + properties.add(property); + } + } + _checkValidPropertiesConstructor(properties, constructor); + if (links.map((e) => e.isarName).distinct().length != links.length) { + err('Two or more links have the same name.', modelClass); + } + + final indexes = []; + for (final propertyElement in modelClass.allAccessors) { + indexes.addAll(analyzeObjectIndex(properties, propertyElement)); + } + if (indexes.map((e) => e.name).distinct().length != indexes.length) { + err('Two or more indexes have the same name.', modelClass); + } + + final idProperties = properties.where((it) => it.isId); + if (idProperties.isEmpty) { + err( + 'No id property defined. Use the "Id" type for your id property.', + modelClass, + ); + } else if (idProperties.length > 1) { + err('Two or more properties with type "Id" defined.', modelClass); + } + + return ObjectInfo( + dartName: modelClass.displayName, + isarName: modelClass.isarName, + accessor: modelClass.collectionAccessor, + properties: properties, + embeddedDartNames: _getEmbeddedDartNames(element), + indexes: indexes, + links: links, + ); + } + + ObjectInfo analyzeEmbedded(Element element) { + final constructor = _checkValidClass(element); + final modelClass = element as ClassElement; + + if (constructor.parameters.any((e) => e.isRequired)) { + err( + 'Constructors of embedded objects must not have required parameters.', + constructor, + ); + } + + final properties = []; + for (final propertyElement in modelClass.allAccessors) { + if (propertyElement.isLink || propertyElement.isLinks) { + err('Embedded objects must not contain links', propertyElement); + } else { + final property = analyzeObjectProperty(propertyElement, constructor); + properties.add(property); + } + } + _checkValidPropertiesConstructor(properties, constructor); + + final hasIndex = modelClass.allAccessors.any( + (it) => it.indexAnnotations.isNotEmpty, + ); + if (hasIndex) { + err('Embedded objects must not have indexes.', modelClass); + } + + final hasIdProperty = properties.any((it) => it.isId); + if (hasIdProperty) { + err('Embedded objects must not define an id.', modelClass); + } + + return ObjectInfo( + dartName: modelClass.displayName, + isarName: modelClass.isarName, + properties: properties, + ); + } + + ConstructorElement _checkValidClass(Element modelClass) { + if (modelClass is! ClassElement || + modelClass is EnumElement || + modelClass is MixinElement) { + err( + 'Only classes may be annotated with @Collection or @Embedded.', + modelClass, + ); + } + + if (modelClass.isAbstract) { + err('Class must not be abstract.', modelClass); + } + + if (!modelClass.isPublic) { + err('Class must be public.', modelClass); + } + + final constructor = modelClass.constructors + .firstOrNullWhere((ConstructorElement c) => c.periodOffset == null); + if (constructor == null) { + err('Class needs an unnamed constructor.', modelClass); + } + + final hasCollectionSupertype = modelClass.allSupertypes.any((type) { + return type.element.collectionAnnotation != null || + type.element.embeddedAnnotation != null; + }); + if (hasCollectionSupertype) { + err( + 'Class must not have a supertype annotated with @Collection or ' + '@Embedded.', + modelClass, + ); + } + + return constructor; + } + + void _checkValidPropertiesConstructor( + List properties, + ConstructorElement constructor, + ) { + if (properties.map((e) => e.isarName).distinct().length != + properties.length) { + err( + 'Two or more properties have the same name.', + constructor.enclosingElement3, + ); + } + + final unknownConstructorParameter = constructor.parameters.firstOrNullWhere( + (p) => p.isRequired && properties.none((e) => e.dartName == p.name), + ); + if (unknownConstructorParameter != null) { + err( + 'Constructor parameter does not match a property.', + unknownConstructorParameter, + ); + } + } + + Map _getEmbeddedDartNames(ClassElement element) { + void _fillNames(Map names, ClassElement element) { + for (final property in element.allAccessors) { + final type = property.type.scalarType.element; + if (type is ClassElement && type.embeddedAnnotation != null) { + final isarName = type.isarName; + if (!names.containsKey(isarName)) { + names[type.isarName] = type.displayName; + _fillNames(names, type); + } + } + } + } + + final names = {}; + _fillNames(names, element); + return names; + } + + ObjectProperty analyzeObjectProperty( + PropertyInducingElement property, + ConstructorElement constructor, + ) { + final dartType = property.type; + final scalarDartType = dartType.scalarType; + Map? enumMap; + String? enumPropertyName; + String? defaultEnumElement; + + late final IsarType isarType; + if (scalarDartType.element is EnumElement) { + final enumeratedAnn = property.enumeratedAnnotation; + if (enumeratedAnn == null) { + err('Enum property must be annotated with @enumerated.', property); + } + + final enumClass = scalarDartType.element! as EnumElement; + final enumElements = + enumClass.fields.where((f) => f.isEnumConstant).toList(); + defaultEnumElement = '${enumClass.name}.${enumElements.first.name}'; + + if (enumeratedAnn.type == EnumType.ordinal) { + isarType = dartType.isDartCoreList ? IsarType.byteList : IsarType.byte; + enumMap = { + for (var i = 0; i < enumElements.length; i++) enumElements[i].name: i, + }; + enumPropertyName = 'index'; + } else if (enumeratedAnn.type == EnumType.ordinal32) { + isarType = dartType.isDartCoreList ? IsarType.intList : IsarType.int; + + enumMap = { + for (var i = 0; i < enumElements.length; i++) enumElements[i].name: i, + }; + enumPropertyName = 'index'; + } else if (enumeratedAnn.type == EnumType.name) { + isarType = + dartType.isDartCoreList ? IsarType.stringList : IsarType.string; + enumMap = { + for (final value in enumElements) value.name: value.name, + }; + enumPropertyName = 'name'; + } else { + enumPropertyName = enumeratedAnn.property; + if (enumPropertyName == null) { + err( + 'Enums with type EnumType.value must specify which property ' + 'should be used.', + property, + ); + } + final enumProperty = enumClass.getField(enumPropertyName); + if (enumProperty == null || enumProperty.isEnumConstant) { + err('Enum property "$enumProperty" does not exist.', property); + } else if (enumProperty.nonSynthetic is PropertyAccessorElement) { + err('Only fields are supported for enum properties', enumProperty); + } + + final enumIsarType = enumProperty.type.isarType; + if (enumIsarType != IsarType.byte && + enumIsarType != IsarType.int && + enumIsarType != IsarType.long && + enumIsarType != IsarType.string) { + err('Unsupported enum property type.', enumProperty); + } + + isarType = + dartType.isDartCoreList ? enumIsarType!.listType : enumIsarType!; + enumMap = {}; + for (final element in enumElements) { + final property = + element.computeConstantValue()!.getField(enumPropertyName)!; + final propertyValue = property.toBoolValue() ?? + property.toIntValue() ?? + property.toDoubleValue() ?? + property.toStringValue(); + if (propertyValue == null) { + err( + 'Null values are not supported for enum properties.', + enumProperty, + ); + } + + if (enumMap.values.contains(propertyValue)) { + err( + 'Enum property has duplicate values.', + enumProperty, + ); + } + enumMap[element.name] = propertyValue; + } + } + } else { + if (dartType.isarType != null) { + isarType = dartType.isarType!; + } else { + err( + 'Unsupported type. Please annotate the property with @ignore.', + property, + ); + } + } + + final nullable = dartType.nullabilitySuffix != NullabilitySuffix.none; + final elementNullable = isarType.isList && + dartType.scalarType.nullabilitySuffix != NullabilitySuffix.none; + + if ((isarType == IsarType.byte && nullable) || + (isarType == IsarType.byteList && elementNullable)) { + err('Bytes must not be nullable.', property); + } + + final constructorParameter = + constructor.parameters.firstOrNullWhere((p) => p.name == property.name); + int? constructorPosition; + late PropertyDeser deserialize; + if (constructorParameter != null) { + if (constructorParameter.type != property.type) { + err( + 'Constructor parameter type does not match property type', + constructorParameter, + ); + } + deserialize = constructorParameter.isNamed + ? PropertyDeser.namedParam + : PropertyDeser.positionalParam; + constructorPosition = + constructor.parameters.indexOf(constructorParameter); + } else { + deserialize = + property.setter == null ? PropertyDeser.none : PropertyDeser.assign; + } + + return ObjectProperty( + dartName: property.displayName, + isarName: property.isarName, + typeClassName: dartType.scalarType.element!.name!, + targetIsarName: isarType.containsObject + ? dartType.scalarType.element!.isarName + : null, + isarType: isarType, + isId: dartType.isIsarId, + enumMap: enumMap, + enumProperty: enumPropertyName, + defaultEnumElement: defaultEnumElement, + nullable: nullable, + elementNullable: elementNullable, + userDefaultValue: constructorParameter?.defaultValueCode, + deserialize: deserialize, + assignable: property.setter != null, + constructorPosition: constructorPosition, + ); + } + + ObjectLink analyzeObjectLink(PropertyInducingElement property) { + if (property.type.nullabilitySuffix != NullabilitySuffix.none) { + err('Link properties must not be nullable.', property); + } else if (property.isLate) { + err('Link properties must not be late.', property); + } + + final type = property.type as ParameterizedType; + final linkType = type.typeArguments[0]; + if (linkType.nullabilitySuffix != NullabilitySuffix.none) { + err('Links type must not be nullable.', property); + } + + final targetCol = linkType.element! as ClassElement; + if (targetCol.collectionAnnotation == null) { + err('Link target is not annotated with @collection'); + } + + final backlinkAnn = property.backlinkAnnotation; + String? targetLinkIsarName; + if (backlinkAnn != null) { + final targetProperty = targetCol.allAccessors + .firstOrNullWhere((e) => e.displayName == backlinkAnn.to); + if (targetProperty == null) { + err('Target of Backlink does not exist', property); + } else if (targetProperty.backlinkAnnotation != null) { + err('Target of Backlink is also a backlink', property); + } + + if (!targetProperty.isLink && !targetProperty.isLinks) { + err('Target of backlink is not a link', property); + } + + final targetLink = analyzeObjectLink(targetProperty); + targetLinkIsarName = targetLink.isarName; + } + + return ObjectLink( + dartName: property.displayName, + isarName: property.isarName, + targetLinkIsarName: targetLinkIsarName, + targetCollectionDartName: linkType.element!.name!, + targetCollectionIsarName: targetCol.isarName, + isSingle: property.isLink, + ); + } + + Iterable analyzeObjectIndex( + List properties, + PropertyInducingElement element, + ) sync* { + final property = + properties.firstOrNullWhere((it) => it.dartName == element.name); + if (property == null || property.isId) { + return; + } + + for (final index in element.indexAnnotations) { + final indexProperties = []; + final isString = property.isarType == IsarType.string || + property.isarType == IsarType.stringList; + final defaultType = property.isarType.isList || isString + ? IndexType.hash + : IndexType.value; + + indexProperties.add( + ObjectIndexProperty( + property: property, + type: index.type ?? defaultType, + caseSensitive: index.caseSensitive ?? isString, + ), + ); + for (final c in index.composite) { + final compositeProperty = + properties.firstOrNullWhere((it) => it.dartName == c.property); + if (compositeProperty == null) { + err('Property does not exist: "${c.property}".', element); + } else if (compositeProperty.isId) { + err('Ids cannot be indexed', element); + } else { + final isString = compositeProperty.isarType == IsarType.string || + compositeProperty.isarType == IsarType.stringList; + final defaultType = compositeProperty.isarType.isList || isString + ? IndexType.hash + : IndexType.value; + indexProperties.add( + ObjectIndexProperty( + property: compositeProperty, + type: c.type ?? defaultType, + caseSensitive: c.caseSensitive ?? isString, + ), + ); + } + } + + final name = index.name ?? + indexProperties.map((e) => e.property.isarName).join('_'); + checkIsarName(name, element); + + final objectIndex = ObjectIndex( + name: name, + properties: indexProperties, + unique: index.unique, + replace: index.replace, + ); + _verifyObjectIndex(objectIndex, element); + + yield objectIndex; + } + } + + void _verifyObjectIndex(ObjectIndex index, Element element) { + final properties = index.properties; + + if (properties.map((it) => it.property.isarName).distinct().length != + properties.length) { + err('Composite index contains duplicate properties.', element); + } + + for (var i = 0; i < properties.length; i++) { + final property = properties[i]; + if (property.isarType.isList && + property.type != IndexType.hash && + properties.length > 1) { + err('Composite indexes do not support non-hashed lists.', element); + } + if (property.isarType.containsFloat && i != properties.lastIndex) { + err( + 'Only the last property of a composite index may be a ' + 'double value.', + element, + ); + } + if (property.isarType == IsarType.string) { + if (property.type != IndexType.hash && i != properties.lastIndex) { + err( + 'Only the last property of a composite index may be a ' + 'non-hashed String.', + element, + ); + } + } + if (property.isarType.containsObject) { + err( + 'Embedded objects may not be indexed.', + element, + ); + } + if (property.type != IndexType.value) { + if (!property.isarType.isList && property.isarType != IsarType.string) { + err('Only Strings and Lists may be hashed.', element); + } else if (property.isarType.containsFloat) { + err('List may must not be hashed.', element); + } + } + if (property.isarType != IsarType.stringList && + property.type == IndexType.hashElements) { + err('Only String lists may have hashed elements.', element); + } + } + + if (!index.unique && index.replace) { + err('Only unique indexes can replace.', element); + } + } +} diff --git a/plugins/isar_generator/lib/src/isar_type.dart b/plugins/isar_generator/lib/src/isar_type.dart new file mode 100644 index 00000000..0ee6b166 --- /dev/null +++ b/plugins/isar_generator/lib/src/isar_type.dart @@ -0,0 +1,107 @@ +import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/type.dart'; +import 'package:isar/isar.dart'; +import 'package:isar_generator/src/helper.dart'; +import 'package:source_gen/source_gen.dart'; + +const TypeChecker _dateTimeChecker = TypeChecker.fromRuntime(DateTime); +bool _isDateTime(Element element) => _dateTimeChecker.isExactly(element); + +extension DartTypeX on DartType { + IsarType? get _primitiveIsarType { + if (isDartCoreBool) { + return IsarType.bool; + } else if (isDartCoreInt) { + if (alias?.element.name == 'byte') { + return IsarType.byte; + } else if (alias?.element.name == 'short') { + return IsarType.int; + } else { + return IsarType.long; + } + } else if (isDartCoreDouble) { + if (alias?.element.name == 'float') { + return IsarType.float; + } else { + return IsarType.double; + } + } else if (isDartCoreString) { + return IsarType.string; + } else if (_isDateTime(element!)) { + return IsarType.dateTime; + } else if (element!.embeddedAnnotation != null) { + return IsarType.object; + } + + return null; + } + + bool get isIsarId { + return alias?.element.name == 'Id'; + } + + DartType get scalarType { + if (isDartCoreList) { + final parameterizedType = this as ParameterizedType; + final typeArguments = parameterizedType.typeArguments; + if (typeArguments.isNotEmpty) { + return typeArguments[0]; + } + } + return this; + } + + IsarType? get isarType { + final primitiveType = _primitiveIsarType; + if (primitiveType != null) { + return primitiveType; + } + + if (isDartCoreList) { + switch (scalarType._primitiveIsarType) { + case IsarType.bool: + return IsarType.boolList; + case IsarType.byte: + return IsarType.byteList; + case IsarType.int: + return IsarType.intList; + case IsarType.float: + return IsarType.floatList; + case IsarType.long: + return IsarType.longList; + case IsarType.double: + return IsarType.doubleList; + case IsarType.dateTime: + return IsarType.dateTimeList; + case IsarType.string: + return IsarType.stringList; + case IsarType.object: + return IsarType.objectList; + // ignore: no_default_cases + default: + return null; + } + } + + return null; + } +} + +extension IsarTypeX on IsarType { + bool get containsBool => this == IsarType.bool || this == IsarType.boolList; + + bool get containsFloat => + this == IsarType.float || + this == IsarType.floatList || + this == IsarType.double || + this == IsarType.doubleList; + + bool get containsDate => + this == IsarType.dateTime || this == IsarType.dateTimeList; + + bool get containsString => + this == IsarType.string || this == IsarType.stringList; + + bool get containsObject => + this == IsarType.object || this == IsarType.objectList; +} diff --git a/plugins/isar_generator/lib/src/object_info.dart b/plugins/isar_generator/lib/src/object_info.dart new file mode 100644 index 00000000..52f8a404 --- /dev/null +++ b/plugins/isar_generator/lib/src/object_info.dart @@ -0,0 +1,210 @@ +import 'dart:convert'; + +import 'package:dartx/dartx.dart'; +import 'package:isar/isar.dart'; + +import 'package:xxh3/xxh3.dart'; + +class ObjectInfo { + ObjectInfo({ + required this.dartName, + required this.isarName, + this.accessor, + required List properties, + this.embeddedDartNames = const {}, + this.indexes = const [], + this.links = const [], + }) { + this.properties = properties.sortedBy((e) => e.isarName).toList(); + } + + final String dartName; + final String isarName; + final String? accessor; + late final List properties; + final Map embeddedDartNames; + final List indexes; + final List links; + + int get id => xxh3(utf8.encode(isarName)); + + bool get isEmbedded => accessor == null; + + ObjectProperty get idProperty => properties.firstWhere((it) => it.isId); + + List get objectProperties => + properties.where((it) => !it.isId).toList(); + + String get getIdName => '_${dartName.decapitalize()}GetId'; + String get getLinksName => '_${dartName.decapitalize()}GetLinks'; + String get attachName => '_${dartName.decapitalize()}Attach'; + + String get estimateSizeName => '_${dartName.decapitalize()}EstimateSize'; + String get serializeName => '_${dartName.decapitalize()}Serialize'; + String get deserializeName => '_${dartName.decapitalize()}Deserialize'; + String get deserializePropName => + '_${dartName.decapitalize()}DeserializeProp'; +} + +enum PropertyDeser { + none, + assign, + positionalParam, + namedParam, +} + +class ObjectProperty { + ObjectProperty({ + required this.dartName, + required this.isarName, + required this.typeClassName, + this.targetIsarName, + required this.isarType, + required this.isId, + required this.enumMap, + required this.enumProperty, + required this.defaultEnumElement, + required this.nullable, + required this.elementNullable, + this.userDefaultValue, + required this.deserialize, + required this.assignable, + this.constructorPosition, + }); + + final String dartName; + final String isarName; + final String typeClassName; + final String? targetIsarName; + + final bool isId; + final IsarType isarType; + final Map? enumMap; + final String? enumProperty; + final String? defaultEnumElement; + + final bool nullable; + final bool elementNullable; + final String? userDefaultValue; + + final PropertyDeser deserialize; + final bool assignable; + final int? constructorPosition; + + bool get isEnum => enumMap != null; + + String get scalarDartType { + if (isId) { + return 'Id'; + } else if (isEnum) { + return typeClassName; + } + + switch (isarType) { + case IsarType.bool: + case IsarType.boolList: + return 'bool'; + case IsarType.byte: + case IsarType.byteList: + case IsarType.int: + case IsarType.intList: + case IsarType.long: + case IsarType.longList: + return 'int'; + case IsarType.float: + case IsarType.floatList: + case IsarType.double: + case IsarType.doubleList: + return 'double'; + case IsarType.dateTime: + case IsarType.dateTimeList: + return 'DateTime'; + case IsarType.object: + case IsarType.objectList: + return typeClassName; + case IsarType.string: + case IsarType.stringList: + return 'String'; + } + } + + String get nScalarDartType => isarType.isList + ? '$scalarDartType${elementNullable ? '?' : ''}' + : '$scalarDartType${nullable ? '?' : ''}'; + + String get dartType => isarType.isList + ? 'List<$nScalarDartType>${nullable ? '?' : ''}' + : nScalarDartType; + + String get targetSchema => '${scalarDartType.capitalize()}Schema'; + + String enumValueMapName(ObjectInfo object) { + return '_${object.dartName}${dartName}EnumValueMap'; + } + + String valueEnumMapName(ObjectInfo object) { + return '_${object.dartName}${dartName}ValueEnumMap'; + } +} + +class ObjectIndexProperty { + const ObjectIndexProperty({ + required this.property, + required this.type, + required this.caseSensitive, + }); + + final ObjectProperty property; + final IndexType type; + final bool caseSensitive; + + IsarType get isarType => property.isarType; + + bool get isMultiEntry => isarType.isList && type != IndexType.hash; +} + +class ObjectIndex { + ObjectIndex({ + required this.name, + required this.properties, + required this.unique, + required this.replace, + }); + + final String name; + final List properties; + final bool unique; + final bool replace; + + late final id = xxh3(utf8.encode(name)); +} + +class ObjectLink { + const ObjectLink({ + required this.dartName, + required this.isarName, + this.targetLinkIsarName, + required this.targetCollectionDartName, + required this.targetCollectionIsarName, + required this.isSingle, + }); + + final String dartName; + final String isarName; + + // isar name of the original link (only for backlinks) + final String? targetLinkIsarName; + final String targetCollectionDartName; + final String targetCollectionIsarName; + final bool isSingle; + + bool get isBacklink => targetLinkIsarName != null; + + int id(String objectIsarName) { + final col = isBacklink ? targetCollectionIsarName : objectIsarName; + final colId = xxh3(utf8.encode(col), seed: isBacklink ? 1 : 0); + + final name = targetLinkIsarName ?? isarName; + return xxh3(utf8.encode(name), seed: colId); + } +} diff --git a/plugins/isar_generator/pubspec.lock b/plugins/isar_generator/pubspec.lock new file mode 100644 index 00000000..e2c81796 --- /dev/null +++ b/plugins/isar_generator/pubspec.lock @@ -0,0 +1,557 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + url: "https://pub.dev" + source: hosted + version: "85.0.0" + analyzer: + dependency: "direct main" + description: + name: analyzer + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + url: "https://pub.dev" + source: hosted + version: "7.7.1" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: "direct main" + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + build_test: + dependency: "direct dev" + description: + name: build_test + sha256: a580c76c28440d0006b75c6746bbbb3c1648959ba9e1afae2c2b0f2c26acdf3d + url: "https://pub.dev" + source: hosted + version: "2.2.3" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + dart_style: + dependency: "direct main" + description: + name: dart_style + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + dartx: + dependency: "direct main" + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: "direct main" + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + isar: + dependency: "direct main" + description: + name: isar + sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: "direct dev" + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + source_gen: + dependency: "direct main" + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test: + dependency: "direct dev" + description: + name: test + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + url: "https://pub.dev" + source: hosted + version: "1.26.3" + test_api: + dependency: transitive + description: + name: test_api + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" + source: hosted + version: "0.7.7" + test_core: + dependency: transitive + description: + name: test_core + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + url: "https://pub.dev" + source: hosted + version: "0.6.12" + time: + dependency: transitive + description: + name: time + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + very_good_analysis: + dependency: "direct dev" + description: + name: very_good_analysis + sha256: "4815adc7ded57657038d2bb2a7f332c50e3c8152f7d3c6acf8f6b7c0cc81e5e2" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + watcher: + dependency: transitive + description: + name: watcher + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + xxh3: + dependency: "direct main" + description: + name: xxh3 + sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.8.0 <4.0.0" diff --git a/plugins/isar_generator/pubspec.yaml b/plugins/isar_generator/pubspec.yaml new file mode 100644 index 00000000..78cc3be1 --- /dev/null +++ b/plugins/isar_generator/pubspec.yaml @@ -0,0 +1,26 @@ +name: isar_generator +description: Code generator for the Isar Database. Finds classes annotated with @Collection. +version: 3.1.0+1 +repository: https://github.com/isar/isar +homepage: https://isar.dev +publish_to: none + +environment: + sdk: ">=2.17.0 <3.0.0" + +dependencies: + analyzer: ^7.0.0 + build: ^2.3.0 + dart_style: ^3.0.0 + dartx: ^1.1.0 + glob: ^2.0.2 + isar: 3.1.0+1 + path: ^1.8.1 + source_gen: ^2.0.0 + xxh3: ^1.0.1 + +dev_dependencies: + build_test: ^2.1.5 + matcher: ^0.12.12 + test: ^1.21.0 + very_good_analysis: ^3.0.1 diff --git a/plugins/isar_generator/test/error_test.dart b/plugins/isar_generator/test/error_test.dart new file mode 100644 index 00000000..3b90980f --- /dev/null +++ b/plugins/isar_generator/test/error_test.dart @@ -0,0 +1,33 @@ +import 'dart:io'; + +import 'package:build/build.dart'; +import 'package:build_test/build_test.dart'; +import 'package:isar_generator/isar_generator.dart'; +import 'package:test/test.dart'; + +void main() { + group('Error case', () { + for (final file in Directory('test/errors').listSync(recursive: true)) { + if (file is! File || !file.path.endsWith('.dart')) continue; + + test(file.path, () async { + final content = await file.readAsLines(); + + final errorMessage = content.first.split('//').last.trim(); + + var error = ''; + try { + await testBuilder( + getIsarGenerator(BuilderOptions.empty), + {'a|${file.path}': content.join('\n')}, + reader: await PackageAssetReader.currentIsolate(), + ); + } catch (e) { + error = e.toString(); + } + + expect(error.toLowerCase(), contains(errorMessage.toLowerCase())); + }); + } + }); +} diff --git a/plugins/isar_generator/test/errors/class/abstract.dart b/plugins/isar_generator/test/errors/class/abstract.dart new file mode 100644 index 00000000..b116529a --- /dev/null +++ b/plugins/isar_generator/test/errors/class/abstract.dart @@ -0,0 +1,8 @@ +// must not be abstract + +import 'package:isar/isar.dart'; + +@collection +abstract class Model { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/class/collection_supertype.dart b/plugins/isar_generator/test/errors/class/collection_supertype.dart new file mode 100644 index 00000000..e6e3f8de --- /dev/null +++ b/plugins/isar_generator/test/errors/class/collection_supertype.dart @@ -0,0 +1,19 @@ +// supertype annotated with @collection + +import 'package:isar/isar.dart'; + +@collection +class Supertype { + Id? id; +} + +class Subtype implements Supertype { + @override + Id? id; +} + +@collection +class Model implements Subtype { + @override + Id? id; +} diff --git a/plugins/isar_generator/test/errors/class/constructor_named.dart b/plugins/isar_generator/test/errors/class/constructor_named.dart new file mode 100644 index 00000000..713f7953 --- /dev/null +++ b/plugins/isar_generator/test/errors/class/constructor_named.dart @@ -0,0 +1,10 @@ +// unnamed constructor + +import 'package:isar/isar.dart'; + +@collection +class Model { + Model.create(); + + Id? id; +} diff --git a/plugins/isar_generator/test/errors/class/constructor_unknown_parameter.dart b/plugins/isar_generator/test/errors/class/constructor_unknown_parameter.dart new file mode 100644 index 00000000..768e349c --- /dev/null +++ b/plugins/isar_generator/test/errors/class/constructor_unknown_parameter.dart @@ -0,0 +1,13 @@ +// constructor parameter does not match a property + +import 'package:isar/isar.dart'; + +@collection +class Model { + // ignore: avoid_unused_constructor_parameters + Model(this.prop1, String somethingElse); + + Id? id; + + final String prop1; +} diff --git a/plugins/isar_generator/test/errors/class/constructor_wrong_parameter.dart b/plugins/isar_generator/test/errors/class/constructor_wrong_parameter.dart new file mode 100644 index 00000000..1274a5c0 --- /dev/null +++ b/plugins/isar_generator/test/errors/class/constructor_wrong_parameter.dart @@ -0,0 +1,13 @@ +// constructor parameter type does not match property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + // ignore: avoid_unused_constructor_parameters + Model(int prop1); + + Id? id; + + String prop1 = '5'; +} diff --git a/plugins/isar_generator/test/errors/class/enum.dart b/plugins/isar_generator/test/errors/class/enum.dart new file mode 100644 index 00000000..a51d0889 --- /dev/null +++ b/plugins/isar_generator/test/errors/class/enum.dart @@ -0,0 +1,7 @@ +// only classes + +import 'package:isar/isar.dart'; + +// ignore: invalid_annotation_target +@collection +enum Test { a, b, c } diff --git a/plugins/isar_generator/test/errors/class/invalid_name.dart b/plugins/isar_generator/test/errors/class/invalid_name.dart new file mode 100644 index 00000000..b116529a --- /dev/null +++ b/plugins/isar_generator/test/errors/class/invalid_name.dart @@ -0,0 +1,8 @@ +// must not be abstract + +import 'package:isar/isar.dart'; + +@collection +abstract class Model { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/class/mixin.dart b/plugins/isar_generator/test/errors/class/mixin.dart new file mode 100644 index 00000000..a6a63747 --- /dev/null +++ b/plugins/isar_generator/test/errors/class/mixin.dart @@ -0,0 +1,7 @@ +// only classes + +import 'package:isar/isar.dart'; + +// ignore: invalid_annotation_target +@collection +mixin Test {} diff --git a/plugins/isar_generator/test/errors/class/private.dart b/plugins/isar_generator/test/errors/class/private.dart new file mode 100644 index 00000000..aa545b93 --- /dev/null +++ b/plugins/isar_generator/test/errors/class/private.dart @@ -0,0 +1,9 @@ +// must be public + +import 'package:isar/isar.dart'; + +@collection +// ignore: unused_element +class _Model { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/class/variable.dart b/plugins/isar_generator/test/errors/class/variable.dart new file mode 100644 index 00000000..543a78ec --- /dev/null +++ b/plugins/isar_generator/test/errors/class/variable.dart @@ -0,0 +1,7 @@ +// only classes + +import 'package:isar/isar.dart'; + +// ignore: invalid_annotation_target +@collection +const t = 'hello'; diff --git a/plugins/isar_generator/test/errors/id/duplicate.dart b/plugins/isar_generator/test/errors/id/duplicate.dart new file mode 100644 index 00000000..e96e21f4 --- /dev/null +++ b/plugins/isar_generator/test/errors/id/duplicate.dart @@ -0,0 +1,10 @@ +// two or more properties with type "Id" defined + +import 'package:isar/isar.dart'; + +@collection +class Test { + Id? id1; + + Id? id2; +} diff --git a/plugins/isar_generator/test/errors/id/missing.dart b/plugins/isar_generator/test/errors/id/missing.dart new file mode 100644 index 00000000..e4141747 --- /dev/null +++ b/plugins/isar_generator/test/errors/id/missing.dart @@ -0,0 +1,10 @@ +// no id property defined + +import 'package:isar/isar.dart'; + +@collection +class Test { + late int id; + + late String name; +} diff --git a/plugins/isar_generator/test/errors/index/composite_double_not_last.dart b/plugins/isar_generator/test/errors/index/composite_double_not_last.dart new file mode 100644 index 00000000..135b56ba --- /dev/null +++ b/plugins/isar_generator/test/errors/index/composite_double_not_last.dart @@ -0,0 +1,13 @@ +// only the last property of a composite index may be a double value + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('val2')]) + double? val1; + + String? val2; +} diff --git a/plugins/isar_generator/test/errors/index/composite_non_hashed_list.dart b/plugins/isar_generator/test/errors/index/composite_non_hashed_list.dart new file mode 100644 index 00000000..e93241e2 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/composite_non_hashed_list.dart @@ -0,0 +1,13 @@ +// composite indexes do not support non-hashed lists + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('str')], type: IndexType.value) + List? list; + + String? str; +} diff --git a/plugins/isar_generator/test/errors/index/composite_string_value_not_last.dart b/plugins/isar_generator/test/errors/index/composite_string_value_not_last.dart new file mode 100644 index 00000000..52efbf87 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/composite_string_value_not_last.dart @@ -0,0 +1,13 @@ +// last property of a composite index may be a non-hashed string + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('str2')], type: IndexType.value) + String? str1; + + String? str2; +} diff --git a/plugins/isar_generator/test/errors/index/contains_id.dart b/plugins/isar_generator/test/errors/index/contains_id.dart new file mode 100644 index 00000000..fd45fb2b --- /dev/null +++ b/plugins/isar_generator/test/errors/index/contains_id.dart @@ -0,0 +1,11 @@ +// ids cannot be indexed + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('id')]) + String? str; +} diff --git a/plugins/isar_generator/test/errors/index/double_list_hashed.dart b/plugins/isar_generator/test/errors/index/double_list_hashed.dart new file mode 100644 index 00000000..84563d49 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/double_list_hashed.dart @@ -0,0 +1,11 @@ +// list may must not be hashed + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(type: IndexType.hash) + List? list; +} diff --git a/plugins/isar_generator/test/errors/index/duplicate_name.dart b/plugins/isar_generator/test/errors/index/duplicate_name.dart new file mode 100644 index 00000000..17e6cab4 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/duplicate_name.dart @@ -0,0 +1,14 @@ +// same name + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(name: 'myindex') + String? prop1; + + @Index(name: 'myindex') + String? prop2; +} diff --git a/plugins/isar_generator/test/errors/index/duplicate_property.dart b/plugins/isar_generator/test/errors/index/duplicate_property.dart new file mode 100644 index 00000000..01c53f0c --- /dev/null +++ b/plugins/isar_generator/test/errors/index/duplicate_property.dart @@ -0,0 +1,13 @@ +// composite index contains duplicate properties + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('str1')], type: IndexType.value) + String? str1; + + String? str2; +} diff --git a/plugins/isar_generator/test/errors/index/invalid_name.dart b/plugins/isar_generator/test/errors/index/invalid_name.dart new file mode 100644 index 00000000..171fe3a4 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/invalid_name.dart @@ -0,0 +1,11 @@ +// names must not be blank or start with "_" + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(name: '_index') + String? str; +} diff --git a/plugins/isar_generator/test/errors/index/non_string_hashed.dart b/plugins/isar_generator/test/errors/index/non_string_hashed.dart new file mode 100644 index 00000000..63267d65 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/non_string_hashed.dart @@ -0,0 +1,11 @@ +// only strings and lists may be hashed + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(type: IndexType.hash) + int? val; +} diff --git a/plugins/isar_generator/test/errors/index/non_string_list_hashed_elements.dart b/plugins/isar_generator/test/errors/index/non_string_list_hashed_elements.dart new file mode 100644 index 00000000..4f119fc1 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/non_string_list_hashed_elements.dart @@ -0,0 +1,11 @@ +// only string lists may have hashed elements + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(type: IndexType.hashElements) + List? list; +} diff --git a/plugins/isar_generator/test/errors/index/non_unique_replace.dart b/plugins/isar_generator/test/errors/index/non_unique_replace.dart new file mode 100644 index 00000000..9a49b374 --- /dev/null +++ b/plugins/isar_generator/test/errors/index/non_unique_replace.dart @@ -0,0 +1,11 @@ +// only unique indexes can replace + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(replace: true) + String? str; +} diff --git a/plugins/isar_generator/test/errors/index/object_hashed.dart b/plugins/isar_generator/test/errors/index/object_hashed.dart new file mode 100644 index 00000000..dd20d11e --- /dev/null +++ b/plugins/isar_generator/test/errors/index/object_hashed.dart @@ -0,0 +1,14 @@ +// objects may not be indexed + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index() + EmbeddedModel? obj; +} + +@embedded +class EmbeddedModel {} diff --git a/plugins/isar_generator/test/errors/index/object_list_hashed.dart b/plugins/isar_generator/test/errors/index/object_list_hashed.dart new file mode 100644 index 00000000..d149e19a --- /dev/null +++ b/plugins/isar_generator/test/errors/index/object_list_hashed.dart @@ -0,0 +1,14 @@ +// objects may not be indexed + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(type: IndexType.hash) + List? list; +} + +@embedded +class EmbeddedModel {} diff --git a/plugins/isar_generator/test/errors/index/property_does_not_exist.dart b/plugins/isar_generator/test/errors/index/property_does_not_exist.dart new file mode 100644 index 00000000..806515ec --- /dev/null +++ b/plugins/isar_generator/test/errors/index/property_does_not_exist.dart @@ -0,0 +1,11 @@ +// property does not exist + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Index(composite: [CompositeIndex('myProp')]) + String? str; +} diff --git a/plugins/isar_generator/test/errors/link/backlink_target_does_no_exist.dart b/plugins/isar_generator/test/errors/link/backlink_target_does_no_exist.dart new file mode 100644 index 00000000..ea285c22 --- /dev/null +++ b/plugins/isar_generator/test/errors/link/backlink_target_does_no_exist.dart @@ -0,0 +1,16 @@ +// target of backlink does not exist + +import 'package:isar/isar.dart'; + +@collection +class Model1 { + Id? id; + + @Backlink(to: 'abc') + final IsarLink link = IsarLink(); +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/link/backlink_target_is_backlink.dart b/plugins/isar_generator/test/errors/link/backlink_target_is_backlink.dart new file mode 100644 index 00000000..5d5f48dc --- /dev/null +++ b/plugins/isar_generator/test/errors/link/backlink_target_is_backlink.dart @@ -0,0 +1,19 @@ +// target of backlink is also a backlink + +import 'package:isar/isar.dart'; + +@collection +class Model1 { + Id? id; + + @Backlink(to: 'link') + final IsarLink link = IsarLink(); +} + +@collection +class Model2 { + Id? id; + + @Backlink(to: 'link') + final IsarLink link = IsarLink(); +} diff --git a/plugins/isar_generator/test/errors/link/backlink_target_not_a_link.dart b/plugins/isar_generator/test/errors/link/backlink_target_not_a_link.dart new file mode 100644 index 00000000..459ecd3a --- /dev/null +++ b/plugins/isar_generator/test/errors/link/backlink_target_not_a_link.dart @@ -0,0 +1,18 @@ +// target of backlink is not a link + +import 'package:isar/isar.dart'; + +@collection +class Model1 { + Id? id; + + @Backlink(to: 'str') + final IsarLink link = IsarLink(); +} + +@collection +class Model2 { + Id? id; + + String? str; +} diff --git a/plugins/isar_generator/test/errors/link/duplicate_name.dart b/plugins/isar_generator/test/errors/link/duplicate_name.dart new file mode 100644 index 00000000..1405c4aa --- /dev/null +++ b/plugins/isar_generator/test/errors/link/duplicate_name.dart @@ -0,0 +1,18 @@ +// same name + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + final IsarLink prop1 = IsarLink(); + + @Name('prop1') + final IsarLinks prop2 = IsarLinks(); +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/link/invalid_name.dart b/plugins/isar_generator/test/errors/link/invalid_name.dart new file mode 100644 index 00000000..47b89a9f --- /dev/null +++ b/plugins/isar_generator/test/errors/link/invalid_name.dart @@ -0,0 +1,16 @@ +// names must not be blank or start with + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Name('_link') + final IsarLink link = IsarLink(); +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/link/late.dart b/plugins/isar_generator/test/errors/link/late.dart new file mode 100644 index 00000000..845cf27f --- /dev/null +++ b/plugins/isar_generator/test/errors/link/late.dart @@ -0,0 +1,15 @@ +// must not be late + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + late IsarLink link; +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/link/nullable.dart b/plugins/isar_generator/test/errors/link/nullable.dart new file mode 100644 index 00000000..ab1f5885 --- /dev/null +++ b/plugins/isar_generator/test/errors/link/nullable.dart @@ -0,0 +1,15 @@ +// must not be nullable + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + IsarLink? link; +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/link/target_not_a_collection.dart b/plugins/isar_generator/test/errors/link/target_not_a_collection.dart new file mode 100644 index 00000000..dd7d3cd8 --- /dev/null +++ b/plugins/isar_generator/test/errors/link/target_not_a_collection.dart @@ -0,0 +1,10 @@ +// link target is not annotated with @collection + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + final IsarLink link = IsarLink(); +} diff --git a/plugins/isar_generator/test/errors/link/type_nullable.dart b/plugins/isar_generator/test/errors/link/type_nullable.dart new file mode 100644 index 00000000..865d421f --- /dev/null +++ b/plugins/isar_generator/test/errors/link/type_nullable.dart @@ -0,0 +1,15 @@ +// links type must not be nullable + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + final IsarLink link = IsarLink(); +} + +@collection +class Model2 { + Id? id; +} diff --git a/plugins/isar_generator/test/errors/property/duplicate_name.dart b/plugins/isar_generator/test/errors/property/duplicate_name.dart new file mode 100644 index 00000000..0b275cbc --- /dev/null +++ b/plugins/isar_generator/test/errors/property/duplicate_name.dart @@ -0,0 +1,13 @@ +// same name + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + String? prop1; + + @Name('prop1') + String? prop2; +} diff --git a/plugins/isar_generator/test/errors/property/enum_bool_type.dart b/plugins/isar_generator/test/errors/property/enum_bool_type.dart new file mode 100644 index 00000000..d5b4b440 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_bool_type.dart @@ -0,0 +1,17 @@ +// unsupported enum property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum field; +} + +enum MyEnum { + optionA; + + final bool value = true; +} diff --git a/plugins/isar_generator/test/errors/property/enum_double_type.dart b/plugins/isar_generator/test/errors/property/enum_double_type.dart new file mode 100644 index 00000000..17567e69 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_double_type.dart @@ -0,0 +1,17 @@ +// unsupported enum property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum field; +} + +enum MyEnum { + optionA; + + final double value = 5.5; +} diff --git a/plugins/isar_generator/test/errors/property/enum_duplicate.dart b/plugins/isar_generator/test/errors/property/enum_duplicate.dart new file mode 100644 index 00000000..32ce0566 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_duplicate.dart @@ -0,0 +1,21 @@ +// has duplicate values + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum field; +} + +enum MyEnum { + option1(1), + option2(2), + option3(1); + + const MyEnum(this.value); + + final int value; +} diff --git a/plugins/isar_generator/test/errors/property/enum_float_type.dart b/plugins/isar_generator/test/errors/property/enum_float_type.dart new file mode 100644 index 00000000..abf3830e --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_float_type.dart @@ -0,0 +1,17 @@ +// unsupported enum property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum field; +} + +enum MyEnum { + optionA; + + final float value = 5.5; +} diff --git a/plugins/isar_generator/test/errors/property/enum_list_type.dart b/plugins/isar_generator/test/errors/property/enum_list_type.dart new file mode 100644 index 00000000..75d78e28 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_list_type.dart @@ -0,0 +1,17 @@ +// unsupported enum property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum prop; +} + +enum MyEnum { + optionA; + + final List value = []; +} diff --git a/plugins/isar_generator/test/errors/property/enum_not_annotated.dart b/plugins/isar_generator/test/errors/property/enum_not_annotated.dart new file mode 100644 index 00000000..456e8e47 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_not_annotated.dart @@ -0,0 +1,14 @@ +// enum property must be annotated with @enumerated + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + late MyEnum? prop; +} + +enum MyEnum { + a; +} diff --git a/plugins/isar_generator/test/errors/property/enum_null_value.dart b/plugins/isar_generator/test/errors/property/enum_null_value.dart new file mode 100644 index 00000000..bdc2e301 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_null_value.dart @@ -0,0 +1,17 @@ +// null values are not supported + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum prop; +} + +enum MyEnum { + optionA; + + final String? value = null; +} diff --git a/plugins/isar_generator/test/errors/property/enum_object_type.dart b/plugins/isar_generator/test/errors/property/enum_object_type.dart new file mode 100644 index 00000000..afa6d961 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/enum_object_type.dart @@ -0,0 +1,20 @@ +// unsupported enum property type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Enumerated(EnumType.value, 'value') + late MyEnum prop; +} + +enum MyEnum { + optionA; + + final value = EmbeddedModel(); +} + +@embedded +class EmbeddedModel {} diff --git a/plugins/isar_generator/test/errors/property/invalid_name.dart b/plugins/isar_generator/test/errors/property/invalid_name.dart new file mode 100644 index 00000000..5bc5341e --- /dev/null +++ b/plugins/isar_generator/test/errors/property/invalid_name.dart @@ -0,0 +1,11 @@ +// names must not be blank or start with "_" + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + @Name('_prop') + String? prop; +} diff --git a/plugins/isar_generator/test/errors/property/null_byte.dart b/plugins/isar_generator/test/errors/property/null_byte.dart new file mode 100644 index 00000000..c5813805 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/null_byte.dart @@ -0,0 +1,10 @@ +// bytes must not be nullable + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + late byte? prop; +} diff --git a/plugins/isar_generator/test/errors/property/null_byte_element.dart b/plugins/isar_generator/test/errors/property/null_byte_element.dart new file mode 100644 index 00000000..d45c4b14 --- /dev/null +++ b/plugins/isar_generator/test/errors/property/null_byte_element.dart @@ -0,0 +1,10 @@ +// bytes must not be nullable + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + late List prop; +} diff --git a/plugins/isar_generator/test/errors/property/unsupported_type.dart b/plugins/isar_generator/test/errors/property/unsupported_type.dart new file mode 100644 index 00000000..68af2cfc --- /dev/null +++ b/plugins/isar_generator/test/errors/property/unsupported_type.dart @@ -0,0 +1,10 @@ +// unsupported type + +import 'package:isar/isar.dart'; + +@collection +class Model { + Id? id; + + late Set? prop; +} diff --git a/pubspec.lock b/pubspec.lock index cc2a35de..5c89553b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -10,21 +10,21 @@ packages: source: hosted version: "85.0.0" analyzer: - dependency: "direct overridden" + dependency: transitive description: name: analyzer - sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + sha256: f4ad0fea5f102201015c9aae9d93bc02f75dd9491529a8c21f88d17a8523d44c url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "7.6.0" analyzer_plugin: - dependency: "direct overridden" + dependency: transitive description: name: analyzer_plugin - sha256: dd574a0ab77de88b7d9c12bc4b626109a5ca9078216a79041a5c24c3a1bd103c + sha256: a5ab7590c27b779f3d4de67f31c4109dbe13dd7339f86461a6f2a8ab2594d8ce url: "https://pub.dev" source: hosted - version: "0.13.7" + version: "0.13.4" antlr4: dependency: transitive description: @@ -341,10 +341,10 @@ packages: dependency: transitive description: name: custom_lint_visitor - sha256: "36282d85714af494ee2d7da8c8913630aa6694da99f104fb2ed4afcf8fc857d8" + sha256: "4a86a0d8415a91fbb8298d6ef03e9034dc8e323a599ddc4120a0e36c433983a2" url: "https://pub.dev" source: hosted - version: "1.0.0+7.3.0" + version: "1.0.0+7.7.0" d4rt: dependency: "direct main" description: @@ -357,10 +357,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" url: "https://pub.dev" source: hosted - version: "2.3.8" + version: "3.1.1" dartx: dependency: transitive description: @@ -487,10 +487,10 @@ packages: dependency: "direct main" description: name: ffigen - sha256: "2119b4fe3aad0db94dc9531b90283c4640a6231070e613c400b426a4da08c704" + sha256: "2bd9a420ca42cb5ce8cff5d80f88547b547a042ae26807704b1698714e4464a2" url: "https://pub.dev" source: hosted - version: "16.1.0" + version: "19.1.0" file: dependency: transitive description: @@ -734,18 +734,18 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" + sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" url: "https://pub.dev" source: hosted - version: "2.5.7" + version: "3.0.6" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "3.0.0" frontend_server_client: dependency: transitive description: @@ -869,10 +869,9 @@ packages: hive_generator: dependency: "direct dev" description: - name: hive_generator - sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4" - url: "https://pub.dev" - source: hosted + path: "plugins/hive_generator" + relative: true + source: path version: "2.0.1" html: dependency: "direct main" @@ -886,10 +885,10 @@ packages: dependency: "direct main" description: name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" http_client_helper: dependency: transitive description: @@ -962,14 +961,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" - iregexp: - dependency: transitive - description: - name: iregexp - sha256: "143859dcaeecf6f683102786762d70a47ef8441a0d2287a158172d32d38799cf" - url: "https://pub.dev" - source: hosted - version: "0.1.2" isar: dependency: "direct main" description: @@ -989,10 +980,9 @@ packages: isar_generator: dependency: "direct dev" description: - name: isar_generator - sha256: "76c121e1295a30423604f2f819bc255bc79f852f3bc8743a24017df6068ad133" - url: "https://pub.dev" - source: hosted + path: "plugins/isar_generator" + relative: true + source: path version: "3.1.0+1" isolate_contactor: dependency: transitive @@ -1034,14 +1024,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.9.0" - json_path: - dependency: "direct main" - description: - name: json_path - sha256: a3a06eb005f2e93d0df7f263cdf76bbd02c7602f5c4bed9be94fcca4c36be03e - url: "https://pub.dev" - source: hosted - version: "0.7.5" json_view: dependency: "direct main" description: @@ -1138,14 +1120,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.1" - maybe_just_nothing: - dependency: transitive - description: - name: maybe_just_nothing - sha256: "0c06326e26d08f6ed43247404376366dc4d756cef23a4f1db765f546224c35e0" - url: "https://pub.dev" - source: hosted - version: "0.5.3" media_kit: dependency: "direct main" description: @@ -1531,14 +1505,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.0.3" - rfc_6901: - dependency: transitive - description: - name: rfc_6901 - sha256: df1bbfa3d023009598f19636d6114c6ac1e0b7bb7bf6a260f0e6e6ce91416820 - url: "https://pub.dev" - source: hosted - version: "0.2.0" riverpod: dependency: transitive description: @@ -1551,10 +1517,10 @@ packages: dependency: transitive description: name: riverpod_analyzer_utils - sha256: c6b8222b2b483cb87ae77ad147d6408f400c64f060df7a225b127f4afef4f8c8 + sha256: "03a17170088c63aab6c54c44456f5ab78876a1ddb6032ffde1662ddab4959611" url: "https://pub.dev" source: hosted - version: "0.5.8" + version: "0.5.10" riverpod_annotation: dependency: "direct main" description: @@ -1567,10 +1533,10 @@ packages: dependency: "direct dev" description: name: riverpod_generator - sha256: "63546d70952015f0981361636bf8f356d9cfd9d7f6f0815e3c07789a41233188" + sha256: "44a0992d54473eb199ede00e2260bd3c262a86560e3c6f6374503d86d0580e36" url: "https://pub.dev" source: hosted - version: "2.6.3" + version: "2.6.5" rust_lib_mangayomi: dependency: "direct main" description: @@ -1747,18 +1713,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "2.0.0" source_helper: dependency: transitive description: name: source_helper - sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + sha256: a447acb083d3a5ef17f983dd36201aeea33fedadb3228fa831f2f0c92f0f3aca url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.7" source_span: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5107ce7c..5f573899 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,7 +36,6 @@ dependencies: file_picker: ^10.0.0 path_provider: ^2.1.5 scrollable_positioned_list: ^0.3.8 - json_path: ^0.7.4 bot_toast: ^4.1.3 flutter_web_auth_2: ^3.1.2 numberpicker: ^2.1.2 @@ -57,14 +56,14 @@ dependencies: cupertino_icons: ^1.0.8 window_manager: ^0.4.3 ffi: ^2.1.3 - ffigen: ^16.0.0 + ffigen: 19.1.0 http_interceptor: ^2.0.0 js_packer: ^0.0.5 flutter_qjs: git: url: https://github.com/kodjodevf/flutter_qjs.git ref: main - http: ^1.3.0 + http: ^1.5.0 re_editor: git: url: https://github.com/kodjodevf/re-editor @@ -77,7 +76,7 @@ dependencies: path: rust_builder pseudom: ^1.0.1 path: ^1.9.0 - freezed_annotation: ^2.4.4 + freezed_annotation: ^3.0.0 desktop_webview_window: git: url: https://github.com/kodjodevf/desktop_webview_window.git @@ -107,27 +106,27 @@ dependencies: dependency_overrides: ffi: ^2.1.3 - analyzer: ^7.4.5 html: ^0.15.4 flutter_web_auth_2: git: url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git ref: 3.x-without-v1 path: flutter_web_auth_2 - analyzer_plugin: ^0.13.1 dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.4.6 - riverpod_generator: ^2.6.3 + riverpod_generator: ^2.6.5 flutter_launcher_icons: ^0.14.3 - isar_generator: ^3.1.0+1 + isar_generator: + path: plugins/isar_generator flutter_lints: ^5.0.0 - freezed: ^2.0.0 + freezed: ^3.0.0 inno_bundle: ^0.9.0 protoc_plugin: ^22.0.1 - hive_generator: ^2.0.1 + hive_generator: + path: plugins/hive_generator flutter: uses-material-design: true From 62d6201ced3c72e33db6eae7ef746205bc26fdb4 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 14:37:24 +0200 Subject: [PATCH 075/100] changed pubspec back to latest --- pubspec.lock | 61 +++++++++++++++++++++------------------------------- pubspec.yaml | 6 +++--- 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ce16b834..cc2a35de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,31 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "76.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.3" + version: "85.0.0" analyzer: dependency: "direct overridden" description: name: analyzer - sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "6.11.0" + version: "7.7.1" analyzer_plugin: dependency: "direct overridden" description: name: analyzer_plugin - sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" + sha256: dd574a0ab77de88b7d9c12bc4b626109a5ca9078216a79041a5c24c3a1bd103c url: "https://pub.dev" source: hosted - version: "0.11.3" + version: "0.13.7" antlr4: dependency: transitive description: @@ -524,10 +519,10 @@ packages: dependency: "direct main" description: name: flex_color_scheme - sha256: "3344f8f6536c6ce0473b98e9f084ef80ca89024ad3b454f9c32cf840206f4387" + sha256: "034d5720747e6af39b2ad090d82dd92d33fde68e7964f1814b714c9d49ddbd64" url: "https://pub.dev" source: hosted - version: "8.2.0" + version: "8.3.0" flex_seed_scheme: dependency: transitive description: @@ -1083,26 +1078,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.1" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -1119,14 +1114,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" - source: hosted - version: "0.1.3-main.0" marquee: dependency: "direct main" description: @@ -1172,7 +1159,7 @@ packages: dependency: transitive description: path: "libs/android/media_kit_libs_android_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1181,7 +1168,7 @@ packages: dependency: transitive description: path: "libs/ios/media_kit_libs_ios_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1190,7 +1177,7 @@ packages: dependency: transitive description: path: "libs/linux/media_kit_libs_linux" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1199,7 +1186,7 @@ packages: dependency: transitive description: path: "libs/macos/media_kit_libs_macos_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1217,7 +1204,7 @@ packages: dependency: transitive description: path: "libs/windows/media_kit_libs_windows_video" - ref: HEAD + ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 url: "https://github.com/Schnitzel5/media-kit.git" source: git @@ -1904,10 +1891,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" time: dependency: transitive description: @@ -2048,10 +2035,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" video_player: dependency: transitive description: @@ -2278,4 +2265,4 @@ packages: version: "2.2.2" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.29.0" + flutter: ">=3.35.0" diff --git a/pubspec.yaml b/pubspec.yaml index b3cd8ec1..5107ce7c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: html: ^0.15.5 font_awesome_flutter: ^10.8.0 expandable_text: ^2.3.0 - flex_color_scheme: ^8.1.0 + flex_color_scheme: ^8.3.0 extended_image: ^10.0.0 photo_view: ^0.15.0 grouped_list: ^6.0.0 @@ -107,14 +107,14 @@ dependencies: dependency_overrides: ffi: ^2.1.3 - analyzer: ">=5.2.0 <7.0.0" + analyzer: ^7.4.5 html: ^0.15.4 flutter_web_auth_2: git: url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git ref: 3.x-without-v1 path: flutter_web_auth_2 - analyzer_plugin: ^0.11.3 + analyzer_plugin: ^0.13.1 dev_dependencies: flutter_test: From 31338eb023c3f13e895db025e34056917a29ff1e Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 14:58:18 +0200 Subject: [PATCH 076/100] final change: Trakt.tv icon --- .github/workflows/release.yml | 6 ------ assets/trackers_icons/tracker_trakt.png | Bin 0 -> 30068 bytes assets/trackers_icons/tracker_trakt.webp | Bin 3032 -> 0 bytes lib/utils/constant.dart | 6 +++--- 4 files changed, 3 insertions(+), 9 deletions(-) create mode 100644 assets/trackers_icons/tracker_trakt.png delete mode 100644 assets/trackers_icons/tracker_trakt.webp diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2bf8a7e5..e3b36983 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -101,7 +100,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -158,7 +156,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -202,7 +199,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -270,7 +266,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable @@ -411,7 +406,6 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: 3.32.8 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable diff --git a/assets/trackers_icons/tracker_trakt.png b/assets/trackers_icons/tracker_trakt.png new file mode 100644 index 0000000000000000000000000000000000000000..c748bd4ed4a53e82dbbc75f08071903acdeed526 GIT binary patch literal 30068 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 C9jDs> literal 0 HcmV?d00001 diff --git a/assets/trackers_icons/tracker_trakt.webp b/assets/trackers_icons/tracker_trakt.webp deleted file mode 100644 index beb1296744e885d0611001e705952a3853168cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 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 a`fo>4%Zxygp{Z~k%u?r!yk$W!0000d6c5h; diff --git a/lib/utils/constant.dart b/lib/utils/constant.dart index ae2d1393..afae503f 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -75,12 +75,12 @@ TrackStatus toTrackStatus(TrackStatus status, ItemType itemType, int syncId) { 4 => ( "assets/trackers_icons/tracker_simkl.png", "Simkl", - const Color.fromARGB(255, 35, 15, 90), + const Color.fromARGB(8, 8, 8, 1), ), _ => ( - "assets/trackers_icons/tracker_trakt.webp", + "assets/trackers_icons/tracker_trakt.png", "Trakt", - const Color.fromARGB(255, 90, 51, 81), + const Color.fromARGB(175, 175, 54, 162), ), }; } From c973fc2a277ec0939f9cc1d9b55a500eabbe627f Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 18:42:00 +0200 Subject: [PATCH 077/100] fixed callback uri --- lib/services/trackers/simkl.dart | 4 +++- lib/services/trackers/trakt_tv.dart | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/services/trackers/simkl.dart b/lib/services/trackers/simkl.dart index e4291bb5..136f2503 100644 --- a/lib/services/trackers/simkl.dart +++ b/lib/services/trackers/simkl.dart @@ -20,7 +20,9 @@ class Simkl extends _$Simkl implements BaseTracker { static const _baseOAuthUrl = 'https://simkl.com/oauth'; static const _baseApiUrl = 'https://api.simkl.com'; static final _isDesktop = (Platform.isWindows || Platform.isLinux); - static const _redirectUri = 'http://localhost:43824'; + static final _redirectUri = _isDesktop + ? 'http://localhost:43824' + : 'mangayomi'; static const _clientId = '1e0a52930b1bdface4e30c1a94a44641475f3c80b69a5ea939562153fccffb68'; static const _clientSecret = diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index db114b33..e26ac34a 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -20,7 +20,9 @@ class TraktTv extends _$TraktTv implements BaseTracker { static const _baseOAuthUrl = 'https://api.trakt.tv/oauth'; static const _baseApiUrl = 'https://api.trakt.tv'; static final _isDesktop = (Platform.isWindows || Platform.isLinux); - static const _redirectUri = 'http://localhost:43824'; + static final _redirectUri = _isDesktop + ? 'http://localhost:43824' + : 'mangayomi'; static const _clientId = '5520c7e24da0d8d73ec80315b61b9849483583b013cb7f296c6db723eb9886a1'; static const _clientSecret = From 809db56b352cb60744a8bb1d72bd485facc17b65 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 19:08:50 +0200 Subject: [PATCH 078/100] adjusted tracker icons --- assets/trackers_icons/tracker_simkl.png | Bin 1774 -> 0 bytes assets/trackers_icons/tracker_simkl.webp | Bin 0 -> 1696 bytes assets/trackers_icons/tracker_trakt.png | Bin 30068 -> 0 bytes assets/trackers_icons/tracker_trakt.webp | Bin 0 -> 27740 bytes lib/utils/constant.dart | 8 ++++---- 5 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 assets/trackers_icons/tracker_simkl.png create mode 100644 assets/trackers_icons/tracker_simkl.webp delete mode 100644 assets/trackers_icons/tracker_trakt.png create mode 100644 assets/trackers_icons/tracker_trakt.webp diff --git a/assets/trackers_icons/tracker_simkl.png b/assets/trackers_icons/tracker_simkl.png deleted file mode 100644 index a06caf3f4b0d02d8eda9ae4fe0a853df6730cf3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1774 zcmb7E`8V5%7B{1{)wg{eZG~vL2hT0ueKu#`%r`+FjZWPf*87#SHZ+}YaP6iCD(9*-ya zyeE}PM50fNi##L}X@#=7U~s;*wY9XgbaHZ>zp_+U_k3`$AFO^lHa14Ew%*v-ps%k# zHa2qU5|qKHLZi{sWki zsHF+Q<8j6p&pmpS;OyiW5*+k{Vd0jHjGU6a)iu``>RO@a%@xEc8xLotqb|^Jm6Hjn zI$FJMQYrDOy&LBgHqHX}eR` z*sL;ZWA%7c?tIwTRwS9-^Rc;4*FD;TcpZ+7#3l@gta1X9>PB#-?B#Xdl_Q*}na%X5 z7C|Q7rRsine7kf?AmGn5h1ME~EV4lF?~T%&q8+^kvUWfppl=EpRf#%(r1=|C_#1k> zrrUO_Z-gqXzd+Og8)Bh3{3Z zCp=WS$BSo#UV|SSD?jdAtaSD^TzryLq+9NkzMlHG#x&DzkdwuooGi%-Rvf|29qnV# z;fto=-}95r(+ylYbppF#GuipoCtQZ=`-jPK_}Y)T4?X_y4yxgDD=*yd=sq~rSNmS& zJ(*VLyQ8i=82TGLZZ7|^NxAXV(fg4Pn5@M4<@xQfSrVz8V_I<@S!buOYg?xC`^#90 zoBCb?#P?6&o#0n($)fqS&S0ORzm~~F(x>tg9@pDyr8(5v?N*nn8SCs>BVgg4PSV-Y zdd&~@!4S2y2(}rRa}x?`FcTMhm>rC9u1QBRLIl}EkK(L7OijJ?6Y?7}E=ajp4iDrx zXYJsUssmun9d;Anc+v4L*F8}9vWYu>p_DfHC5PS9Yf4@hLVp2R@~^=w?Q6^6vrHWB zt)Jz5HF2Dh*Ch`^6>IPbPFoil+efG^rDuK&!Zg$83;p}PvMod`be#MiiSoP>&gzvU zkx0a`2+Nvzkx*RYE$xY&7DA||P|%3idN$zMdo0%gJkdWQPAc;9kCA1RM6X4~avMEe zVN@>Z%HNu0mZvq?y5)=z_wQ3n-sNVmevTr;)hWKFMsNQD&1^af=4FeLhTJe${VZ}m z0VY}5KF=!6{~L_ao2@cLP-hRX4E=7!7oq1YoN>8ItC&i~!-yEJQDAioo$iem zAatkYOA^-pv_W{j&IX}s2tb81B&r8Ip`~s9bI-{LUGIf3ys|A*Z9CD3v_D)bf?IQv zro!@J#Z~urA3mVQTb?+R*2&E2BAdd=)VrwSxWkeD|69DRP3SoHCY|2jKsGDt8sFX8 z&wJuL<#mrW*Rr{$%y(zqt(x@pf#kb`mC)*J4>m+ICarLT`%52KWmQrp>IFqL={+!Y zMq{G$%C`^fFuDasp@ARPw>Lt*!i^1?^C;#a?(8uL&9{q{fKn+s4fq9jXXwQR_3_A< zbat$Y@+C>v#weL4w;jn5+1z8&DyT2(O&fY3&B-A1aGv7w>#+Xc0JZ3?b^QmgHdX<} zf*0$w`nF7+j9axQ7CP_z-}sDQ0r-5gZwSzt;#-+W$0AV2RYxvE)mH?CnH%$a?6g#} zKd045?YQLYusTBXtH?V5+kt)ba|J!6RwFG1>Aux*7qGoG(%t^ZXQ^&z&Z%b=5HlTK z*7`TyC}_ECG!@*IpW1<4VFhCMdaEBkhEIfvda&y8ouytgG%-anm=6FYR&DPJ{{#N@Z|_I4Q5BY0Vm!aAryD8pt;P)cp diff --git a/assets/trackers_icons/tracker_simkl.webp b/assets/trackers_icons/tracker_simkl.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d2cd6104e5ba3fd23560f44ff92bfeaa5051c34 GIT binary patch literal 1696 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 C9jDs> diff --git a/assets/trackers_icons/tracker_trakt.webp b/assets/trackers_icons/tracker_trakt.webp new file mode 100644 index 0000000000000000000000000000000000000000..78aeb43aabf488150cabafbb3427adaa8bfc775d GIT binary patch literal 27740 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 literal 0 HcmV?d00001 diff --git a/lib/utils/constant.dart b/lib/utils/constant.dart index afae503f..3500612a 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -73,14 +73,14 @@ TrackStatus toTrackStatus(TrackStatus status, ItemType itemType, int syncId) { const Color.fromRGBO(18, 25, 35, 1), ), 4 => ( - "assets/trackers_icons/tracker_simkl.png", + "assets/trackers_icons/tracker_simkl.webp", "Simkl", - const Color.fromARGB(8, 8, 8, 1), + const Color.fromRGBO(8, 8, 8, 1), ), _ => ( - "assets/trackers_icons/tracker_trakt.png", + "assets/trackers_icons/tracker_trakt.webp", "Trakt", - const Color.fromARGB(175, 175, 54, 162), + const Color.fromRGBO(175, 54, 162, 1), ), }; } From 9b11e07cec06b670adadf9033a7478026a991e63 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 19:47:10 +0200 Subject: [PATCH 079/100] + --- lib/services/trackers/simkl.dart | 4 ++-- lib/services/trackers/trakt_tv.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/services/trackers/simkl.dart b/lib/services/trackers/simkl.dart index 136f2503..48559ff4 100644 --- a/lib/services/trackers/simkl.dart +++ b/lib/services/trackers/simkl.dart @@ -22,7 +22,7 @@ class Simkl extends _$Simkl implements BaseTracker { static final _isDesktop = (Platform.isWindows || Platform.isLinux); static final _redirectUri = _isDesktop ? 'http://localhost:43824' - : 'mangayomi'; + : 'mangayomi://'; static const _clientId = '1e0a52930b1bdface4e30c1a94a44641475f3c80b69a5ea939562153fccffb68'; static const _clientSecret = @@ -43,7 +43,7 @@ class Simkl extends _$Simkl implements BaseTracker { try { final uri = await FlutterWebAuth2.authenticate( - url: "$loginUrl&redirect_uri=$callbackUrlScheme", + url: "$loginUrl&redirect_uri=$_redirectUri", callbackUrlScheme: callbackUrlScheme, ); final code = Uri.parse(uri).queryParameters['code']; diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index e26ac34a..cbf19a5a 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -22,7 +22,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { static final _isDesktop = (Platform.isWindows || Platform.isLinux); static final _redirectUri = _isDesktop ? 'http://localhost:43824' - : 'mangayomi'; + : 'mangayomi://'; static const _clientId = '5520c7e24da0d8d73ec80315b61b9849483583b013cb7f296c6db723eb9886a1'; static const _clientSecret = From a6d79f123882b589d845e7b8b703cfd4f653ed28 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 20:19:24 +0200 Subject: [PATCH 080/100] try fix Trakt.tv oauth --- lib/services/trackers/trakt_tv.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index cbf19a5a..dc33e161 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -22,7 +22,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { static final _isDesktop = (Platform.isWindows || Platform.isLinux); static final _redirectUri = _isDesktop ? 'http://localhost:43824' - : 'mangayomi://'; + : 'https://intradeus.github.io/http-protocol-redirector/?r=mangayomi://'; static const _clientId = '5520c7e24da0d8d73ec80315b61b9849483583b013cb7f296c6db723eb9886a1'; static const _clientSecret = From 163e385b637447e9be220d0b8c4f8b2acd3318f9 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 25 Aug 2025 20:46:28 +0200 Subject: [PATCH 081/100] final fix --- lib/services/trackers/trakt_tv.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index dc33e161..a218edca 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -22,7 +22,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { static final _isDesktop = (Platform.isWindows || Platform.isLinux); static final _redirectUri = _isDesktop ? 'http://localhost:43824' - : 'https://intradeus.github.io/http-protocol-redirector/?r=mangayomi://'; + : 'mangayomi://'; static const _clientId = '5520c7e24da0d8d73ec80315b61b9849483583b013cb7f296c6db723eb9886a1'; static const _clientSecret = @@ -43,7 +43,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { try { final uri = await FlutterWebAuth2.authenticate( - url: "$loginUrl&redirect_uri=$callbackUrlScheme", + url: "$loginUrl&redirect_uri=$_redirectUri", callbackUrlScheme: callbackUrlScheme, ); final code = Uri.parse(uri).queryParameters['code']; From 3aaac9e10281a1859ff79b445de188c57aba9860 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 26 Aug 2025 01:23:46 +0200 Subject: [PATCH 082/100] enhanced calendar - predicts from latest chapter instead of current time (if available) --- lib/eval/mihon/service.dart | 6 +++--- lib/modules/calendar/calendar_screen.dart | 12 +++++++++++- .../calendar/providers/calendar_provider.dart | 6 ++---- lib/modules/updates/updates_screen.dart | 14 ++++++++------ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/eval/mihon/service.dart b/lib/eval/mihon/service.dart index dd2bacd8..747b5c35 100644 --- a/lib/eval/mihon/service.dart +++ b/lib/eval/mihon/service.dart @@ -203,9 +203,9 @@ class MihonExtensionService implements ExtensionService { (e) => MChapter( name: e['name'], url: e['url'], - dateUpload: e['date_upload'] is int - ? (e['date_upload'] as int).toString() - : e['date_upload'], + dateUpload: + (e['date_upload'] as int?)?.toString() ?? + DateTime.now().millisecondsSinceEpoch.toString(), scanlator: e['scanlator'], ), ) diff --git a/lib/modules/calendar/calendar_screen.dart b/lib/modules/calendar/calendar_screen.dart index 7c38f15e..036fa065 100644 --- a/lib/modules/calendar/calendar_screen.dart +++ b/lib/modules/calendar/calendar_screen.dart @@ -3,6 +3,8 @@ 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'; @@ -241,7 +243,15 @@ class _CalendarScreenState extends ConsumerState { List _getEntriesForDay(DateTime day, List data) { return data.where((e) { - final temp = DateTime.now().add(Duration(days: e.smartUpdateDays!)); + 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; diff --git a/lib/modules/calendar/providers/calendar_provider.dart b/lib/modules/calendar/providers/calendar_provider.dart index b167a167..821751d0 100644 --- a/lib/modules/calendar/providers/calendar_provider.dart +++ b/lib/modules/calendar/providers/calendar_provider.dart @@ -6,13 +6,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'calendar_provider.g.dart'; @riverpod -Stream> getCalendarStream( - Ref ref, { - ItemType? itemType, -}) async* { +Stream> getCalendarStream(Ref ref, {ItemType? itemType}) async* { yield* isar.mangas .filter() .idIsNotNull() + .favoriteEqualTo(true) .itemTypeEqualTo(itemType ?? ItemType.manga) .anyOf([ Status.ongoing, diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index 822bb823..14ff535a 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -293,12 +293,14 @@ class _UpdatesScreenState extends ConsumerState ) .findAll(); final idsToDelete = []; - for (var update in updates) { - idsToDelete.add(update.id!); - ref - .read(synchingProvider(syncId: 1).notifier) - .addChangedPart(ActionType.removeUpdate, update.id, "{}", false); - } + isar.writeTxnSync(() { + for (var update in updates) { + idsToDelete.add(update.id!); + ref + .read(synchingProvider(syncId: 1).notifier) + .addChangedPart(ActionType.removeUpdate, update.id, "{}", false); + } + }); await isar.writeTxn(() => isar.updates.deleteAll(idsToDelete)); } From a7b9231eda245ca1b52269dc39422146de11f46b Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 26 Aug 2025 02:40:39 +0200 Subject: [PATCH 083/100] fixed local subtitles --- lib/modules/anime/anime_player_view.dart | 6 ++--- .../m3u8/m3u8_downloader.dart | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 903017fc..40c900f2 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -1151,7 +1151,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo .toList(); List subs = []; - if (widget.videos.isNotEmpty && !widget.isLocal) { + if (widget.videos.isNotEmpty) { for (var video in widget.videos) { for (var sub in video.subtitles ?? []) { if (!subs.contains(sub.file)) { @@ -1159,8 +1159,8 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo final label = sub.label; videoSubtitle.add( VideoPrefs( - isLocal: false, - subtitle: file.startsWith("http") + isLocal: widget.isLocal, + subtitle: (file.startsWith("http") || file.startsWith("file")) ? SubtitleTrack.uri(file, title: label, language: label) : SubtitleTrack.data(file, title: label, language: label), ), diff --git a/lib/services/download_manager/m3u8/m3u8_downloader.dart b/lib/services/download_manager/m3u8/m3u8_downloader.dart index ec5398e5..297890bc 100644 --- a/lib/services/download_manager/m3u8/m3u8_downloader.dart +++ b/lib/services/download_manager/m3u8/m3u8_downloader.dart @@ -152,15 +152,24 @@ class M3u8Downloader { } _log('Downloading subtitle file: ${element.label}'); subtitleFile.createSync(recursive: true); - final response = await _withRetry( - () => httpClient.get(Uri.parse(element.file ?? ''), headers: headers), - ); - if (response.statusCode != 200) { - _log('Warning: Failed to download subtitle file: ${element.label}'); + if (element.file == null || element.file!.trim().isEmpty) { + _log('Warning: No subtitle file: ${element.label}'); continue; } - _log('Subtitle file downloaded: ${element.label}'); - await subtitleFile.writeAsBytes(response.bodyBytes); + if (element.file!.startsWith("http")) { + final response = await _withRetry( + () => + httpClient.get(Uri.parse(element.file ?? ''), headers: headers), + ); + if (response.statusCode != 200) { + _log('Warning: Failed to download subtitle file: ${element.label}'); + continue; + } + _log('Subtitle file downloaded: ${element.label}'); + await subtitleFile.writeAsBytes(response.bodyBytes); + } else { + await subtitleFile.writeAsString(element.file!); + } } } catch (e) { throw M3u8DownloaderException('Download failed', e); From a572f7ddafb79b9abee3647750465ae1c1539ad1 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 26 Aug 2025 15:21:59 +0200 Subject: [PATCH 084/100] changed from labels to icons --- .../widgets/extension_list_tile_widget.dart | 143 +++++++++++++++--- 1 file changed, 125 insertions(+), 18 deletions(-) diff --git a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart index 7d706d83..6da6eb78 100644 --- a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart +++ b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart @@ -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 From f6c2a24af249a74d6a94580bb09ae366e7f4a584 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 26 Aug 2025 22:07:49 +0200 Subject: [PATCH 085/100] added app logger --- lib/l10n/app_en.arb | 2 + lib/l10n/generated/app_localizations.dart | 12 +++ lib/l10n/generated/app_localizations_ar.dart | 6 ++ lib/l10n/generated/app_localizations_as.dart | 6 ++ lib/l10n/generated/app_localizations_de.dart | 6 ++ lib/l10n/generated/app_localizations_en.dart | 6 ++ lib/l10n/generated/app_localizations_es.dart | 6 ++ lib/l10n/generated/app_localizations_fr.dart | 6 ++ lib/l10n/generated/app_localizations_hi.dart | 6 ++ lib/l10n/generated/app_localizations_id.dart | 6 ++ lib/l10n/generated/app_localizations_it.dart | 6 ++ lib/l10n/generated/app_localizations_pt.dart | 6 ++ lib/l10n/generated/app_localizations_ru.dart | 6 ++ lib/l10n/generated/app_localizations_th.dart | 6 ++ lib/l10n/generated/app_localizations_tr.dart | 6 ++ lib/l10n/generated/app_localizations_zh.dart | 6 ++ lib/main.dart | 3 + lib/modules/more/about/about_screen.dart | 29 +++++++ .../m3u8/m3u8_downloader.dart | 7 +- lib/utils/log/logger.dart | 77 +++++++++++++++++++ 20 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 lib/utils/log/logger.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d48c55e9..c49e1d8c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -143,6 +143,8 @@ "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!", "n_days_ago": "{days} days ago", "today": "Today", "yesterday": "Yesterday", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 79209a5e..74b42a4d 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -933,6 +933,18 @@ 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 @n_days_ago. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index b57fe691..bebde3e5 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -434,6 +434,12 @@ 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 n_days_ago(Object days) { return 'منذ $days أيام'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 86cf26b3..c5fbff38 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -436,6 +436,12 @@ class AppLocalizationsAs 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 n_days_ago(Object days) { return '$days দিনৰ আগতে'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index bfc37ffb..dc71f563 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -438,6 +438,12 @@ 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 n_days_ago(Object days) { return 'Vor $days Tagen'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 853a46c9..7b8f26a3 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -436,6 +436,12 @@ 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 n_days_ago(Object days) { return '$days days ago'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index e61a60bb..26d92e82 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -440,6 +440,12 @@ 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 n_days_ago(Object days) { return 'hace $days días'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 14b8c9c5..5e70df1b 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -442,6 +442,12 @@ 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 n_days_ago(Object days) { return 'Il y a $days jours'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 9629d9b2..13e2fbd9 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -436,6 +436,12 @@ class AppLocalizationsHi 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 n_days_ago(Object days) { return '$days दिन पहले'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 0da0b172..82dcec91 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -440,6 +440,12 @@ 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 n_days_ago(Object days) { return '$days Hari yang Lalu'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index e281c0ba..6607c76d 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -440,6 +440,12 @@ 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 n_days_ago(Object days) { return '$days giorni fa'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 484f3c47..caa47153 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -440,6 +440,12 @@ 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 n_days_ago(Object days) { return '$days dias atrás'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index d28b6178..f926133d 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -441,6 +441,12 @@ 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 n_days_ago(Object days) { return '$days дней назад'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 2bb852c7..9253d21a 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -436,6 +436,12 @@ 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 n_days_ago(Object days) { return '$days วันที่แล้ว'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 4f04a772..ee42bf30 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -436,6 +436,12 @@ 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 n_days_ago(Object days) { return '$days gün önce'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 0434771a..6669c85d 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -428,6 +428,12 @@ 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 n_days_ago(Object days) { return '$days天前'; diff --git a/lib/main.dart b/lib/main.dart index a83b1a58..f0573cea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,6 +30,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'; @@ -66,6 +67,7 @@ void main(List args) async { ); } } + await AppLogger.init(); isar = await StorageProvider().initDB(null, inspector: kDebugMode); await Hive.initFlutter(); Hive.registerAdapter(TrackSearchAdapter()); @@ -144,6 +146,7 @@ class _MyAppState extends ConsumerState { void dispose() { _linkSubscription?.cancel(); discordRpc?.destroy(); + AppLogger.dispose(); super.dispose(); } diff --git a/lib/modules/more/about/about_screen.dart b/lib/modules/more/about/about_screen.dart index c401dfd1..07973052 100644 --- a/lib/modules/more/about/about_screen.dart +++ b/lib/modules/more/about/about_screen.dart @@ -1,12 +1,19 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/more/about/providers/check_for_update.dart'; import 'package:mangayomi/modules/more/about/providers/get_package_info.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:path/path.dart' as path; +import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; class AboutScreen extends ConsumerWidget { @@ -73,6 +80,28 @@ class AboutScreen extends ConsumerWidget { }, title: Text(l10n.check_for_update), ), + ListTile( + onTap: () async { + final storage = StorageProvider(); + final directory = await storage.getDefaultDirectory(); + final file = File( + path.join(directory!.path, 'logs.txt'), + ); + if (await file.exists()) { + if (Platform.isLinux) { + await Clipboard.setData( + ClipboardData(text: file.path), + ); + } + Share.shareXFiles([ + XFile(file.path), + ], text: "log.txt"); + } else { + botToast(l10n.no_app_logs); + } + }, + title: Text(l10n.share_app_logs), + ), // ListTile( // onTap: () {}, // title: const Text("What's news"), diff --git a/lib/services/download_manager/m3u8/m3u8_downloader.dart b/lib/services/download_manager/m3u8/m3u8_downloader.dart index 297890bc..1ea79389 100644 --- a/lib/services/download_manager/m3u8/m3u8_downloader.dart +++ b/lib/services/download_manager/m3u8/m3u8_downloader.dart @@ -13,6 +13,7 @@ import 'package:mangayomi/services/download_manager/m3u8/models/download.dart'; import 'package:mangayomi/services/download_manager/m3u8/models/ts_info.dart'; import 'package:mangayomi/src/rust/frb_generated.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart'; +import 'package:mangayomi/utils/log/logger.dart'; import 'package:path/path.dart' as path; import 'package:encrypt/encrypt.dart' as encrypt; import 'package:convert/convert.dart'; @@ -49,6 +50,7 @@ class M3u8Downloader { if (kDebugMode) { log('[M3u8Downloader] $message'); } + AppLogger.log(message); } void close() { @@ -151,11 +153,11 @@ class M3u8Downloader { continue; } _log('Downloading subtitle file: ${element.label}'); - subtitleFile.createSync(recursive: true); if (element.file == null || element.file!.trim().isEmpty) { _log('Warning: No subtitle file: ${element.label}'); continue; } + subtitleFile.createSync(recursive: true); if (element.file!.startsWith("http")) { final response = await _withRetry( () => @@ -168,10 +170,13 @@ class M3u8Downloader { _log('Subtitle file downloaded: ${element.label}'); await subtitleFile.writeAsBytes(response.bodyBytes); } else { + _log('Subtitle file written: ${element.label}'); await subtitleFile.writeAsString(element.file!); } } } catch (e) { + AppLogger.log("Download failed", logLevel: LogLevel.error); + AppLogger.log(e.toString(), logLevel: LogLevel.error); throw M3u8DownloaderException('Download failed', e); } finally { close(); diff --git a/lib/utils/log/logger.dart b/lib/utils/log/logger.dart new file mode 100644 index 00000000..ad01e929 --- /dev/null +++ b/lib/utils/log/logger.dart @@ -0,0 +1,77 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:mangayomi/providers/storage_provider.dart'; +import 'package:path/path.dart' as path; + +class AppLogger { + static final _logQueue = StreamController(); + static late File _logFile; + static late IOSink _sink; + static bool _initialized = false; + + /// Initialize the logger + static Future init() async { + final storage = StorageProvider(); + final directory = await storage.getDefaultDirectory(); + _logFile = File(path.join(directory!.path, 'logs.txt')); + + if (await _logFile.exists() && await _logFile.length() > 100 * 1024) { + await _logFile.delete(); + } + + if (!await _logFile.exists()) { + await _logFile.create(recursive: true); + } + + _sink = _logFile.openWrite(mode: FileMode.append); + _initialized = true; + + _logQueue.stream.listen((log) { + _sink.writeln(log); + }); + + log('\n\nLogger initialized\n\n'); + } + + static void log(String message, {LogLevel logLevel = LogLevel.info}) { + if (!_initialized) return; + + final now = DateTime.now(); + final timestamp = + '${now.day.toString().padLeft(2, '0')}/${now.month.toString().padLeft(2, '0')}/${now.year.toString().padLeft(4, '0')} ' + '${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}:${now.second.toString().padLeft(2, '0')}'; + + final logMessage = '[$timestamp][${logLevel.toString()}] $message'; + _logQueue.add(logMessage); + } + + static Future dispose() async { + if (!_initialized) return; + await _logQueue.close(); + await _sink.flush(); + await _sink.close(); + _initialized = false; + } +} + +enum LogLevel { + debug, + info, + warning, + error; + + @override + String toString() { + switch (this) { + case LogLevel.debug: + return 'DEBUG'; + case LogLevel.info: + return 'INFO'; + case LogLevel.warning: + return 'WARNING'; + case LogLevel.error: + return 'ERROR'; + } + } +} From e2ddcf1ffe4f53fd910389e6a8ac6b895592093f Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Aug 2025 00:01:18 +0200 Subject: [PATCH 086/100] add option to download online subtitles - button appears for downloaded and local entries - added app logging class --- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 ++ lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + lib/modules/anime/anime_player_view.dart | 1 + .../anime/widgets/search_subtitles.dart | 83 ++++++++++++++++++- 18 files changed, 131 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c49e1d8c..776ed6a5 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -145,6 +145,7 @@ "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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 74b42a4d..dd7e21c1 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -945,6 +945,12 @@ abstract class AppLocalizations { /// **'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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index bebde3e5..6975ef34 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -440,6 +440,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return 'منذ $days أيام'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index c5fbff38..633e73cc 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -442,6 +442,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return '$days দিনৰ আগতে'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index dc71f563..f17f44fd 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -444,6 +444,9 @@ class AppLocalizationsDe extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 7b8f26a3..4345ede8 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -442,6 +442,9 @@ class AppLocalizationsEn extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 26d92e82..9e52974c 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -446,6 +446,9 @@ class AppLocalizationsEs extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 5e70df1b..b0e1bc7d 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -448,6 +448,9 @@ class AppLocalizationsFr extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 13e2fbd9..8858ec0a 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -442,6 +442,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return '$days दिन पहले'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 82dcec91..3da5e0ce 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -446,6 +446,9 @@ class AppLocalizationsId extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 6607c76d..88d30d55 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -446,6 +446,9 @@ class AppLocalizationsIt extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index caa47153..47d4042c 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -446,6 +446,9 @@ class AppLocalizationsPt extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index f926133d..03db5780 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -447,6 +447,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return '$days дней назад'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 9253d21a..b459c2eb 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -442,6 +442,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return '$days วันที่แล้ว'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index ee42bf30..4b1e09bf 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -442,6 +442,9 @@ class AppLocalizationsTr extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 6669c85d..a8929b72 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -434,6 +434,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get no_app_logs => 'No log.txt available!'; + @override + String get failed => 'Failed!'; + @override String n_days_ago(Object days) { return '$days天前'; diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index fa7ed3ad..330a1955 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -1355,6 +1355,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo await subtitlesSearchraggableMenu( context, chapter: widget.episode, + isLocal: widget.isLocal, ) as ImdbSubtitle?; if (subtitle != null && context.mounted) { diff --git a/lib/modules/anime/widgets/search_subtitles.dart b/lib/modules/anime/widgets/search_subtitles.dart index 307b695a..44552ced 100644 --- a/lib/modules/anime/widgets/search_subtitles.dart +++ b/lib/modules/anime/widgets/search_subtitles.dart @@ -2,17 +2,30 @@ 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/extensions/string_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; - const SubtitlesWidgetSearch({required this.chapter, super.key}); + final bool isLocal; + const SubtitlesWidgetSearch({ + required this.chapter, + required this.isLocal, + super.key, + }); @override ConsumerState createState() => @@ -296,6 +309,12 @@ class _SubtitlesWidgetSearchState extends ConsumerState { ), ], ), + if (isSubtitles && widget.isLocal) + OutlinedButton.icon( + onPressed: () async => _downloadSubtitle(index), + label: Text(context.l10n.download), + icon: Icon(Icons.download_outlined), + ), ], ), ], @@ -308,11 +327,71 @@ class _SubtitlesWidgetSearchState extends ConsumerState { }, ); } + + Future _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 (context.mounted) { + botToast(context.l10n.finished("")); + } + } catch (e) { + AppLogger.log("Failed to download subtitle:", logLevel: LogLevel.error); + AppLogger.log(e.toString(), logLevel: LogLevel.error); + if (context.mounted) { + botToast(context.l10n.failed); + } + rethrow; + } + } + + Future _withRetry(Future 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( @@ -352,7 +431,7 @@ subtitlesSearchraggableMenu( ], ), ), - SubtitlesWidgetSearch(chapter: chapter), + SubtitlesWidgetSearch(chapter: chapter, isLocal: isLocal), ], ), ), From da7161e199169f1b48b180931d988bc19a74e329 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Aug 2025 00:02:42 +0200 Subject: [PATCH 087/100] - --- lib/modules/anime/widgets/search_subtitles.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/modules/anime/widgets/search_subtitles.dart b/lib/modules/anime/widgets/search_subtitles.dart index 44552ced..bd0031eb 100644 --- a/lib/modules/anime/widgets/search_subtitles.dart +++ b/lib/modules/anime/widgets/search_subtitles.dart @@ -369,7 +369,6 @@ class _SubtitlesWidgetSearchState extends ConsumerState { if (context.mounted) { botToast(context.l10n.failed); } - rethrow; } } From 790519fcaee7408dfb1136852c2a9da06c9bcc5a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Aug 2025 01:40:31 +0200 Subject: [PATCH 088/100] fixed ShareX for iPad https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus/share_plus#ipad --- lib/modules/anime/anime_player_view.dart | 23 +++++++++++++------ .../manga/detail/manga_detail_view.dart | 9 +++++++- .../manga/download/download_page_widget.dart | 13 +++++++---- lib/modules/manga/reader/reader_view.dart | 22 ++++++++++++------ lib/modules/more/about/about_screen.dart | 13 ++++++++--- .../data_and_storage/providers/backup.dart | 10 +++++--- lib/modules/webview/webview.dart | 9 +++++++- 7 files changed, 73 insertions(+), 26 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 330a1955..7500b533 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -2255,13 +2255,22 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo format: "image/png", includeLibassSubtitles: _includeSubtitles, ); - await Share.shareXFiles([ - XFile.fromData( - imageBytes!, - name: name, - mimeType: 'image/png', - ), - ]); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + await Share.shareXFiles( + [ + XFile.fromData( + imageBytes!, + name: name, + mimeType: 'image/png', + ), + ], + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); + } }, ), button( diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 8716e982..f2dbd575 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -654,7 +654,14 @@ class _MangaDetailViewState extends ConsumerState ); final url = "${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}"; - Share.share(url); + final box = + context.findRenderObject() as RenderBox?; + Share.share( + url, + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); break; case 3: context.push("/migrate", extra: widget.manga); diff --git a/lib/modules/manga/download/download_page_widget.dart b/lib/modules/manga/download/download_page_widget.dart index 312e61a3..c0b46a2c 100644 --- a/lib/modules/manga/download/download_page_widget.dart +++ b/lib/modules/manga/download/download_page_widget.dart @@ -25,7 +25,7 @@ class ChapterPageDownload extends ConsumerWidget { ref.read(downloadChapterProvider(chapter: chapter, useWifi: useWifi)); } - void _sendFile() async { + void _sendFile(BuildContext context) async { final storageProvider = StorageProvider(); final mangaDir = await storageProvider.getMangaMainDirectory(chapter); final path = await storageProvider.getMangaChapterDirectory( @@ -52,8 +52,13 @@ class ChapterPageDownload extends ConsumerWidget { } else { files = path!.listSync().map((e) => XFile(e.path)).toList(); } - if (files.isNotEmpty) { - Share.shareXFiles(files, text: chapter.name); + if (files.isNotEmpty && context.mounted) { + final box = context.findRenderObject() as RenderBox?; + Share.shareXFiles( + files, + text: chapter.name, + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + ); } } @@ -123,7 +128,7 @@ class ChapterPageDownload extends ConsumerWidget { ), onSelected: (value) { if (value == 0) { - _sendFile(); + _sendFile(context); } else if (value == 1) { _deleteFile(download.id!); } diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 367e8874..4fb4472c 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -401,13 +401,21 @@ class _MangaChapterPageGalleryState context.l10n.share, Icons.share_outlined, () async { - await Share.shareXFiles([ - XFile.fromData( - imageBytes, - name: name, - mimeType: 'image/png', - ), - ]); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + await Share.shareXFiles( + [ + XFile.fromData( + imageBytes, + name: name, + mimeType: 'image/png', + ), + ], + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); + } }, ), button( diff --git a/lib/modules/more/about/about_screen.dart b/lib/modules/more/about/about_screen.dart index 07973052..098e3cbd 100644 --- a/lib/modules/more/about/about_screen.dart +++ b/lib/modules/more/about/about_screen.dart @@ -93,9 +93,16 @@ class AboutScreen extends ConsumerWidget { ClipboardData(text: file.path), ); } - Share.shareXFiles([ - XFile(file.path), - ], text: "log.txt"); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + Share.shareXFiles( + [XFile(file.path)], + text: "log.txt", + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); + } } else { botToast(l10n.no_app_logs); } diff --git a/lib/modules/more/data_and_storage/providers/backup.dart b/lib/modules/more/data_and_storage/providers/backup.dart index 296b474d..eb312edd 100644 --- a/lib/modules/more/data_and_storage/providers/backup.dart +++ b/lib/modules/more/data_and_storage/providers/backup.dart @@ -176,9 +176,13 @@ Future doBackUp( alignment: Alignment.topLeft, child: ElevatedButton( onPressed: () { - Share.shareXFiles([ - XFile(p.join(path, "$name.backup")), - ], text: "$name.backup"); + final box = context.findRenderObject() as RenderBox?; + Share.shareXFiles( + [XFile(p.join(path, "$name.backup"))], + text: "$name.backup", + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); }, child: Text(context.l10n.share), ), diff --git a/lib/modules/webview/webview.dart b/lib/modules/webview/webview.dart index 5f6bb8f8..b5968977 100644 --- a/lib/modules/webview/webview.dart +++ b/lib/modules/webview/webview.dart @@ -239,7 +239,14 @@ class _MangaWebViewState extends ConsumerState { if (value == 0) { _webViewController?.reload(); } else if (value == 1) { - Share.share(_url); + final box = + context.findRenderObject() as RenderBox?; + Share.share( + _url, + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); } else if (value == 2) { await InAppBrowser.openWithSystemBrowser( url: WebUri(_url), From 4d89cfe32b77bfa5fc3e7dd2cb8f87e95cb4f8f7 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Aug 2025 18:21:22 +0200 Subject: [PATCH 089/100] fixed Trakt refresh token - now refreshes expired tokens at startup - prevents accidental logouts for users who has the tracking screen as default navigation --- lib/main.dart | 22 +- lib/models/track_preference.dart | 10 +- lib/models/track_preference.g.dart | 83 +- .../providers/calendar_provider.g.dart | 2 +- .../providers/track_state_providers.dart | 6 + .../providers/track_state_providers.g.dart | 2 +- .../data_and_storage/providers/backup.g.dart | 2 +- .../track/providers/track_providers.dart | 9 + .../track/providers/track_providers.g.dart | 2 +- .../tracker_library_screen.dart | 15 +- lib/providers/storage_provider.dart | 10 + lib/services/aniskip.g.dart | 2 +- .../http/rhttp/src/model/exception.dart | 46 +- lib/services/trackers/anilist.dart | 6 + lib/services/trackers/anilist.g.dart | 2 +- lib/services/trackers/base_tracker.dart | 1 + lib/services/trackers/kitsu.dart | 6 + lib/services/trackers/kitsu.g.dart | 2 +- lib/services/trackers/myanimelist.dart | 29 +- lib/services/trackers/myanimelist.g.dart | 2 +- lib/services/trackers/simkl.dart | 6 + lib/services/trackers/simkl.g.dart | 72 +- lib/services/trackers/trakt_tv.dart | 45 +- lib/services/trackers/trakt_tv.g.dart | 72 +- lib/src/rust/api/rhttp/client.freezed.dart | 782 ++------ lib/src/rust/api/rhttp/error.freezed.dart | 1691 ++++------------- lib/src/rust/api/rhttp/http.freezed.dart | 1050 +++------- 27 files changed, 1126 insertions(+), 2851 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index f0573cea..49293852 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,7 +18,10 @@ 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'; @@ -101,12 +104,13 @@ class _MyAppState extends ConsumerState { void initState() { super.initState(); initializeDateFormatting(); + customDns = ref.read(customDnsStateProvider); + _checkTrackerRefresh(); _initDeepLinks(); _setupMpvConfig(); unawaited(ref.read(scanLocalLibraryProvider.future)); WidgetsBinding.instance.addPostFrameCallback((_) { - customDns = ref.read(customDnsStateProvider); if (ref.read(clearChapterCacheOnAppLaunchStateProvider)) { ref .read(totalChapterCacheSizeStateProvider.notifier) @@ -341,6 +345,22 @@ class _MyAppState extends ConsumerState { } } } + + Future _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 { diff --git a/lib/models/track_preference.dart b/lib/models/track_preference.dart index 7304911a..9018daf2 100644 --- a/lib/models/track_preference.dart +++ b/lib/models/track_preference.dart @@ -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 json) { syncId = json['syncId']; diff --git a/lib/models/track_preference.g.dart b/lib/models/track_preference.g.dart index cb1c8491..9fb8268d 100644 --- a/lib/models/track_preference.g.dart +++ b/lib/models/track_preference.g.dart @@ -19,8 +19,13 @@ const TrackPreferenceSchema = CollectionSchema( properties: { r'oAuth': PropertySchema(id: 0, name: r'oAuth', type: IsarType.string), r'prefs': PropertySchema(id: 1, name: r'prefs', type: IsarType.string), - r'username': PropertySchema( + r'refreshing': PropertySchema( id: 2, + name: r'refreshing', + type: IsarType.bool, + ), + r'username': PropertySchema( + id: 3, name: r'username', type: IsarType.string, ), @@ -76,7 +81,8 @@ void _trackPreferenceSerialize( ) { writer.writeString(offsets[0], object.oAuth); writer.writeString(offsets[1], object.prefs); - writer.writeString(offsets[2], object.username); + writer.writeBool(offsets[2], object.refreshing); + writer.writeString(offsets[3], object.username); } TrackPreference _trackPreferenceDeserialize( @@ -88,8 +94,9 @@ TrackPreference _trackPreferenceDeserialize( final object = TrackPreference( oAuth: reader.readStringOrNull(offsets[0]), prefs: reader.readStringOrNull(offsets[1]), + refreshing: reader.readBoolOrNull(offsets[2]), syncId: id, - username: reader.readStringOrNull(offsets[2]), + username: reader.readStringOrNull(offsets[3]), ); return object; } @@ -106,6 +113,8 @@ P _trackPreferenceDeserializeProp

    ( case 1: return (reader.readStringOrNull(offset)) as P; case 2: + return (reader.readBoolOrNull(offset)) as P; + case 3: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -529,6 +538,33 @@ extension TrackPreferenceQueryFilter }); } + QueryBuilder + refreshingIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'refreshing'), + ); + }); + } + + QueryBuilder + refreshingIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'refreshing'), + ); + }); + } + + QueryBuilder + refreshingEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'refreshing', value: value), + ); + }); + } + QueryBuilder syncIdIsNull() { return QueryBuilder.apply(this, (query) { @@ -796,6 +832,20 @@ extension TrackPreferenceQuerySortBy }); } + QueryBuilder + sortByRefreshing() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'refreshing', Sort.asc); + }); + } + + QueryBuilder + sortByRefreshingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'refreshing', Sort.desc); + }); + } + QueryBuilder sortByUsername() { return QueryBuilder.apply(this, (query) { @@ -839,6 +889,20 @@ extension TrackPreferenceQuerySortThenBy }); } + QueryBuilder + thenByRefreshing() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'refreshing', Sort.asc); + }); + } + + QueryBuilder + thenByRefreshingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'refreshing', Sort.desc); + }); + } + QueryBuilder thenBySyncId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'syncId', Sort.asc); @@ -885,6 +949,13 @@ extension TrackPreferenceQueryWhereDistinct }); } + QueryBuilder + distinctByRefreshing() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'refreshing'); + }); + } + QueryBuilder distinctByUsername({ bool caseSensitive = true, }) { @@ -914,6 +985,12 @@ extension TrackPreferenceQueryProperty }); } + QueryBuilder refreshingProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'refreshing'); + }); + } + QueryBuilder usernameProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'username'); diff --git a/lib/modules/calendar/providers/calendar_provider.g.dart b/lib/modules/calendar/providers/calendar_provider.g.dart index 6f71ba0b..7c66e3ed 100644 --- a/lib/modules/calendar/providers/calendar_provider.g.dart +++ b/lib/modules/calendar/providers/calendar_provider.g.dart @@ -6,7 +6,7 @@ part of 'calendar_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$getCalendarStreamHash() => r'dcdad165b2da2420bafa8b70c4b3a0fb336e5021'; +String _$getCalendarStreamHash() => r'850d81742f8ac5ce88175732c0edf57a7a9295d4'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/providers/track_state_providers.dart b/lib/modules/manga/detail/providers/track_state_providers.dart index f9cd5e04..62a5023b 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.dart @@ -169,6 +169,12 @@ class TrackState extends _$TrackState { final tracker = getNotifier(syncId); return await tracker.fetchUserData(isManga: _isManga); } + + Future checkRefresh() async { + final syncId = track!.syncId!; + final tracker = getNotifier(syncId); + return await tracker.checkRefresh(); + } } @riverpod diff --git a/lib/modules/manga/detail/providers/track_state_providers.g.dart b/lib/modules/manga/detail/providers/track_state_providers.g.dart index d80fa593..fdc05271 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.g.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_state_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$trackStateHash() => r'0b2fa471cb843d5880f921f1c721a05b54bc1515'; +String _$trackStateHash() => r'19fcc38b559996509aa71645de9531bc4b2d4205'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/data_and_storage/providers/backup.g.dart b/lib/modules/more/data_and_storage/providers/backup.g.dart index 707ef93d..41b66ba0 100644 --- a/lib/modules/more/data_and_storage/providers/backup.g.dart +++ b/lib/modules/more/data_and_storage/providers/backup.g.dart @@ -6,7 +6,7 @@ part of 'backup.dart'; // RiverpodGenerator // ************************************************************************** -String _$doBackUpHash() => r'a570fe00421ee352ea170440ce27b258cf9ddc15'; +String _$doBackUpHash() => r'd16d5b6e5ed2c20988fa2d49842524d70ac0ed0d'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/track/providers/track_providers.dart b/lib/modules/more/settings/track/providers/track_providers.dart index 1d944576..24803ead 100644 --- a/lib/modules/more/settings/track/providers/track_providers.dart +++ b/lib/modules/more/settings/track/providers/track_providers.dart @@ -16,6 +16,15 @@ class Tracks extends _$Tracks { return isar.trackPreferences.getSync(syncId!); } + void setRefreshing(bool refreshing) { + if (state != null) { + state!.refreshing = refreshing; + isar.writeTxnSync(() { + isar.trackPreferences.putSync(state!); + }); + } + } + void login(TrackPreference trackPreference) { isar.writeTxnSync(() { isar.trackPreferences.putSync(trackPreference); diff --git a/lib/modules/more/settings/track/providers/track_providers.g.dart b/lib/modules/more/settings/track/providers/track_providers.g.dart index d46626a2..f834c231 100644 --- a/lib/modules/more/settings/track/providers/track_providers.g.dart +++ b/lib/modules/more/settings/track/providers/track_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$tracksHash() => r'71db9b803345d0b31c8efba0538a68fea356a71f'; +String _$tracksHash() => r'05f1531a3200b0ad9f1e4bf74cd9eb44301f9f21'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/tracker_library/tracker_library_screen.dart b/lib/modules/tracker_library/tracker_library_screen.dart index 600c7caf..04154b73 100644 --- a/lib/modules/tracker_library/tracker_library_screen.dart +++ b/lib/modules/tracker_library/tracker_library_screen.dart @@ -163,9 +163,11 @@ class _TrackerLibraryScreenState extends ConsumerState { body: Padding( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 5), child: StreamBuilder( - stream: isar.trackPreferences.filter().syncIdIsNotNull().watch( - fireImmediately: true, - ), + stream: isar.trackPreferences + .filter() + .syncIdIsNotNull() + .anyOf([false, null], (q, e) => q.refreshingEqualTo(e)) + .watch(fireImmediately: true), builder: (context, snapshot) { _preferences = snapshot.hasData ? snapshot.data ?? [] : []; return _preferences.any((p) => p.syncId == trackerProvider.syncId) @@ -207,6 +209,13 @@ class _TrackerLibraryScreenState extends ConsumerState { TrackerProviders trackerProvider, ItemType itemType, ) async { + final temp = Track( + syncId: trackerProvider.syncId, + status: TrackStatus.completed, + ); + await ref + .read(trackStateProvider(track: temp, itemType: null).notifier) + .checkRefresh(); final box = await Hive.openBox("tracker_library"); final keys = box.keys.where( (e) => (e as String).startsWith( diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index d9bc6b97..4d3f96e3 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -201,6 +201,16 @@ class StorageProvider { }); } + final prefs = await isar.trackPreferences + .filter() + .syncIdIsNotNull() + .findAll(); + await isar.writeTxn(() async { + for (final pref in prefs) { + await isar.trackPreferences.put(pref..refreshing = true); + } + }); + final customButton = await isar.customButtons .filter() .idIsNotNull() diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index 95f27f5b..f7d0b025 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/http/rhttp/src/model/exception.dart b/lib/services/http/rhttp/src/model/exception.dart index 45119052..3f416520 100644 --- a/lib/services/http/rhttp/src/model/exception.dart +++ b/lib/services/http/rhttp/src/model/exception.dart @@ -127,24 +127,30 @@ class RhttpUnknownException extends RhttpException { } RhttpException parseError(HttpRequest request, rust.RhttpError error) { - return error.when( - rhttpCancelError: () => RhttpCancelException(request), - rhttpTimeoutError: () => RhttpTimeoutException(request), - rhttpRedirectError: () => RhttpRedirectException(request), - rhttpStatusCodeError: (code, headers, body) => RhttpStatusCodeException( - request: request, - statusCode: code, - headers: headers, - body: switch (body) { - rust_http.HttpResponseBody_Text() => body.field0, - rust_http.HttpResponseBody_Bytes() => body.field0, - rust_http.HttpResponseBody_Stream() => null, - }, - ), - rhttpInvalidCertificateError: (message) => - RhttpInvalidCertificateException(request: request, message: message), - rhttpConnectionError: (message) => - RhttpConnectionException(request, message), - rhttpUnknownError: (message) => RhttpUnknownException(request, message), - ); + return switch (error) { + rust.RhttpError_RhttpCancelError() => RhttpCancelException(request), + rust.RhttpError_RhttpTimeoutError() => RhttpTimeoutException(request), + rust.RhttpError_RhttpRedirectError() => RhttpRedirectException(request), + rust.RhttpError_RhttpStatusCodeError( + field0: final code, + field1: final headers, + field2: final body, + ) => + RhttpStatusCodeException( + request: request, + statusCode: code, + headers: headers, + body: switch (body) { + rust_http.HttpResponseBody_Text() => body.field0, + rust_http.HttpResponseBody_Bytes() => body.field0, + rust_http.HttpResponseBody_Stream() => null, + }, + ), + rust.RhttpError_RhttpInvalidCertificateError(field0: final message) => + RhttpInvalidCertificateException(request: request, message: message), + rust.RhttpError_RhttpConnectionError(field0: final message) => + RhttpConnectionException(request, message), + rust.RhttpError_RhttpUnknownError(field0: final message) => + RhttpUnknownException(request, message), + }; } diff --git a/lib/services/trackers/anilist.dart b/lib/services/trackers/anilist.dart index 7cf9ce95..2ed6bb5c 100644 --- a/lib/services/trackers/anilist.dart +++ b/lib/services/trackers/anilist.dart @@ -535,4 +535,10 @@ class Anilist extends _$Anilist implements BaseTracker { _ => (100, 1), }; } + + @override + Future checkRefresh() async { + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); + return true; + } } diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index be191e09..ccac0f27 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'c786a526fdacc875e4a7e00886b2bda546eafeae'; +String _$anilistHash() => r'f6d46f4e330f1461ef18242a5e86589cb7a165c5'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/base_tracker.dart b/lib/services/trackers/base_tracker.dart index 27bbe3c6..a3eca1a9 100644 --- a/lib/services/trackers/base_tracker.dart +++ b/lib/services/trackers/base_tracker.dart @@ -2,6 +2,7 @@ import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_search.dart'; abstract class BaseTracker { + Future checkRefresh(); Future findLibItem(Track track, bool isManga); Future update(Track track, bool isManga); List statusList(bool isManga); diff --git a/lib/services/trackers/kitsu.dart b/lib/services/trackers/kitsu.dart index 8b6be211..4dcc0045 100644 --- a/lib/services/trackers/kitsu.dart +++ b/lib/services/trackers/kitsu.dart @@ -428,4 +428,10 @@ class Kitsu extends _$Kitsu implements BaseTracker { (int, int) getScoreValue() { throw UnimplementedError(); } + + @override + Future checkRefresh() async { + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); + return true; + } } diff --git a/lib/services/trackers/kitsu.g.dart b/lib/services/trackers/kitsu.g.dart index f77ab7f1..d6c89160 100644 --- a/lib/services/trackers/kitsu.g.dart +++ b/lib/services/trackers/kitsu.g.dart @@ -6,7 +6,7 @@ part of 'kitsu.dart'; // RiverpodGenerator // ************************************************************************** -String _$kitsuHash() => r'3f6af42dd0bb3fe543197db692598384ca5cc95f'; +String _$kitsuHash() => r'0c560ca99e2858b38af183491303d9cdcc9c0d92'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index 000c81fa..1480966a 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -12,6 +12,7 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'package:mangayomi/utils/log/logger.dart'; import 'base_tracker.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'myanimelist.g.dart'; @@ -59,13 +60,18 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker { } } - Future _getAccessToken() async { + Future _getAccessToken({bool bypass = false}) async { final track = ref.read(tracksProvider(syncId: syncId)); final mALOAuth = OAuth.fromJson( jsonDecode(track!.oAuth!) as Map, ); final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!; + if (!bypass && + (ref.read(tracksProvider(syncId: syncId))?.refreshing ?? false)) { + return mALOAuth.accessToken!; + } + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(true); final refreshed = await _tryRefreshToken(mALOAuth); if (refreshed == null) { ref.read(tracksProvider(syncId: syncId).notifier).logout(); @@ -74,6 +80,8 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker { } final username = await _getUserName(refreshed.accessToken!); _saveOAuth(username, refreshed); + await Future.delayed(Duration(seconds: 3)); + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); return refreshed.accessToken!; } @@ -438,14 +446,29 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker { headers: {'Authorization': 'Bearer $accessToken'}, ); } - + @override String displayScore(int score) { throw UnimplementedError(); } - + @override (int, int) getScoreValue() { throw UnimplementedError(); } + + @override + Future checkRefresh() async { + try { + await _getAccessToken(bypass: true); + AppLogger.log("Refreshed MAL token!"); + return true; + } catch (e) { + AppLogger.log("Failed to refresh MAL token:", logLevel: LogLevel.error); + AppLogger.log(e.toString(), logLevel: LogLevel.error); + return false; + } finally { + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); + } + } } diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index 91128284..032e33cf 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'9846f76ce69f952d20cc1e8edbc5ca565cd4e7c9'; +String _$myAnimeListHash() => r'c6812dbc8c56494e4776f80a2b0f402bf5e00996'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/simkl.dart b/lib/services/trackers/simkl.dart index 48559ff4..0c476894 100644 --- a/lib/services/trackers/simkl.dart +++ b/lib/services/trackers/simkl.dart @@ -418,4 +418,10 @@ class Simkl extends _$Simkl implements BaseTracker { (int, int) getScoreValue() { throw UnimplementedError(); } + + @override + Future checkRefresh() async { + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); + return true; + } } diff --git a/lib/services/trackers/simkl.g.dart b/lib/services/trackers/simkl.g.dart index 74e9a772..b05f8a46 100644 --- a/lib/services/trackers/simkl.g.dart +++ b/lib/services/trackers/simkl.g.dart @@ -6,7 +6,7 @@ part of 'simkl.dart'; // RiverpodGenerator // ************************************************************************** -String _$simklHash() => r'3b8ff48675ba743d39aef595dc6cd70f4bd404cf'; +String _$simklHash() => r'b55f4a85c66fbb4456e0499f15376d314cd0bf90'; /// Copied from Dart SDK class _SystemHash { @@ -33,10 +33,7 @@ abstract class _$Simkl extends BuildlessAutoDisposeNotifier { late final int syncId; late final ItemType? itemType; - void build({ - required int syncId, - required ItemType? itemType, - }); + void build({required int syncId, required ItemType? itemType}); } /// See also [Simkl]. @@ -49,24 +46,13 @@ class SimklFamily extends Family { const SimklFamily(); /// See also [Simkl]. - SimklProvider call({ - required int syncId, - required ItemType? itemType, - }) { - return SimklProvider( - syncId: syncId, - itemType: itemType, - ); + SimklProvider call({required int syncId, required ItemType? itemType}) { + return SimklProvider(syncId: syncId, itemType: itemType); } @override - SimklProvider getProviderOverride( - covariant SimklProvider provider, - ) { - return call( - syncId: provider.syncId, - itemType: provider.itemType, - ); + SimklProvider getProviderOverride(covariant SimklProvider provider) { + return call(syncId: provider.syncId, itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -87,24 +73,21 @@ class SimklFamily extends Family { /// See also [Simkl]. class SimklProvider extends AutoDisposeNotifierProviderImpl { /// See also [Simkl]. - SimklProvider({ - required int syncId, - required ItemType? itemType, - }) : this._internal( - () => Simkl() - ..syncId = syncId - ..itemType = itemType, - from: simklProvider, - name: r'simklProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$simklHash, - dependencies: SimklFamily._dependencies, - allTransitiveDependencies: SimklFamily._allTransitiveDependencies, - syncId: syncId, - itemType: itemType, - ); + SimklProvider({required int syncId, required ItemType? itemType}) + : this._internal( + () => Simkl() + ..syncId = syncId + ..itemType = itemType, + from: simklProvider, + name: r'simklProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$simklHash, + dependencies: SimklFamily._dependencies, + allTransitiveDependencies: SimklFamily._allTransitiveDependencies, + syncId: syncId, + itemType: itemType, + ); SimklProvider._internal( super._createNotifier, { @@ -121,13 +104,8 @@ class SimklProvider extends AutoDisposeNotifierProviderImpl { final ItemType? itemType; @override - void runNotifierBuild( - covariant Simkl notifier, - ) { - return notifier.build( - syncId: syncId, - itemType: itemType, - ); + void runNotifierBuild(covariant Simkl notifier) { + return notifier.build(syncId: syncId, itemType: itemType); } @override @@ -182,7 +160,8 @@ mixin SimklRef on AutoDisposeNotifierProviderRef { } class _SimklProviderElement - extends AutoDisposeNotifierProviderElement with SimklRef { + extends AutoDisposeNotifierProviderElement + with SimklRef { _SimklProviderElement(super.provider); @override @@ -190,5 +169,6 @@ class _SimklProviderElement @override ItemType? get itemType => (origin as SimklProvider).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 diff --git a/lib/services/trackers/trakt_tv.dart b/lib/services/trackers/trakt_tv.dart index a218edca..ae032535 100644 --- a/lib/services/trackers/trakt_tv.dart +++ b/lib/services/trackers/trakt_tv.dart @@ -10,6 +10,7 @@ import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'package:mangayomi/utils/log/logger.dart'; import 'base_tracker.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'trakt_tv.g.dart'; @@ -293,13 +294,18 @@ class TraktTv extends _$TraktTv implements BaseTracker { return track; } - Future _getAccessToken() async { + Future _getAccessToken({bool bypass = false}) async { final track = ref.read(tracksProvider(syncId: syncId)); final mALOAuth = OAuth.fromJson( jsonDecode(track!.oAuth!) as Map, ); final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!); if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!; + if (!bypass && + (ref.read(tracksProvider(syncId: syncId))?.refreshing ?? false)) { + return mALOAuth.accessToken!; + } + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(true); final refreshed = await _tryRefreshToken(mALOAuth); if (refreshed == null) { ref.read(tracksProvider(syncId: syncId).notifier).logout(); @@ -308,6 +314,8 @@ class TraktTv extends _$TraktTv implements BaseTracker { } final username = await _getUserName(refreshed.accessToken!); _saveOAuth(username, refreshed); + await Future.delayed(Duration(seconds: 3)); + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); return refreshed.accessToken!; } @@ -315,16 +323,17 @@ class TraktTv extends _$TraktTv implements BaseTracker { String primaryClientId = oldOAuth.clientId ?? _clientId; Future tryRefresh(String cid) async { + final params = { + 'refresh_token': oldOAuth.refreshToken, + 'client_id': cid, + 'client_secret': _clientSecret, + 'redirect_uri': _redirectUri, + 'grant_type': 'refresh_token', + }; final response = await http.post( Uri.parse('$_baseOAuthUrl/token'), - body: { - 'refresh_token': oldOAuth.refreshToken, - 'client_id': cid, - 'client_secret': _clientSecret, - 'redirect_uri': _redirectUri, - 'grant_type': 'refresh_token', - }, headers: {'Content-Type': 'application/json'}, + body: jsonEncode(params), ); if (response.statusCode != 200) return null; final body = jsonDecode(response.body) as Map; @@ -377,7 +386,7 @@ class TraktTv extends _$TraktTv implements BaseTracker { 'grant_type': 'authorization_code', }; final response = await http.post( - Uri.parse('$_baseApiUrl/oauth/token'), + Uri.parse('$_baseOAuthUrl/token'), headers: {'Content-Type': 'application/json'}, body: jsonEncode(params), ); @@ -422,4 +431,22 @@ class TraktTv extends _$TraktTv implements BaseTracker { (int, int) getScoreValue() { throw UnimplementedError(); } + + @override + Future checkRefresh() async { + try { + await _getAccessToken(bypass: true); + AppLogger.log("Refreshed Trakt.tv token!"); + return true; + } catch (e) { + AppLogger.log( + "Failed to refresh Trakt.tv token:", + logLevel: LogLevel.error, + ); + AppLogger.log(e.toString(), logLevel: LogLevel.error); + return false; + } finally { + ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false); + } + } } diff --git a/lib/services/trackers/trakt_tv.g.dart b/lib/services/trackers/trakt_tv.g.dart index 44d8f31b..720b6e21 100644 --- a/lib/services/trackers/trakt_tv.g.dart +++ b/lib/services/trackers/trakt_tv.g.dart @@ -6,7 +6,7 @@ part of 'trakt_tv.dart'; // RiverpodGenerator // ************************************************************************** -String _$traktTvHash() => r'de97ae0edbc905d07af2ce8758441fba6cdd7be2'; +String _$traktTvHash() => r'1ae8a5c79cb6b5fc6c5d9db61ed9307deeb450ed'; /// Copied from Dart SDK class _SystemHash { @@ -33,10 +33,7 @@ abstract class _$TraktTv extends BuildlessAutoDisposeNotifier { late final int syncId; late final ItemType? itemType; - void build({ - required int syncId, - required ItemType? itemType, - }); + void build({required int syncId, required ItemType? itemType}); } /// See also [TraktTv]. @@ -49,24 +46,13 @@ class TraktTvFamily extends Family { const TraktTvFamily(); /// See also [TraktTv]. - TraktTvProvider call({ - required int syncId, - required ItemType? itemType, - }) { - return TraktTvProvider( - syncId: syncId, - itemType: itemType, - ); + TraktTvProvider call({required int syncId, required ItemType? itemType}) { + return TraktTvProvider(syncId: syncId, itemType: itemType); } @override - TraktTvProvider getProviderOverride( - covariant TraktTvProvider provider, - ) { - return call( - syncId: provider.syncId, - itemType: provider.itemType, - ); + TraktTvProvider getProviderOverride(covariant TraktTvProvider provider) { + return call(syncId: provider.syncId, itemType: provider.itemType); } static const Iterable? _dependencies = null; @@ -87,24 +73,21 @@ class TraktTvFamily extends Family { /// See also [TraktTv]. class TraktTvProvider extends AutoDisposeNotifierProviderImpl { /// See also [TraktTv]. - TraktTvProvider({ - required int syncId, - required ItemType? itemType, - }) : this._internal( - () => TraktTv() - ..syncId = syncId - ..itemType = itemType, - from: traktTvProvider, - name: r'traktTvProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$traktTvHash, - dependencies: TraktTvFamily._dependencies, - allTransitiveDependencies: TraktTvFamily._allTransitiveDependencies, - syncId: syncId, - itemType: itemType, - ); + TraktTvProvider({required int syncId, required ItemType? itemType}) + : this._internal( + () => TraktTv() + ..syncId = syncId + ..itemType = itemType, + from: traktTvProvider, + name: r'traktTvProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$traktTvHash, + dependencies: TraktTvFamily._dependencies, + allTransitiveDependencies: TraktTvFamily._allTransitiveDependencies, + syncId: syncId, + itemType: itemType, + ); TraktTvProvider._internal( super._createNotifier, { @@ -121,13 +104,8 @@ class TraktTvProvider extends AutoDisposeNotifierProviderImpl { final ItemType? itemType; @override - void runNotifierBuild( - covariant TraktTv notifier, - ) { - return notifier.build( - syncId: syncId, - itemType: itemType, - ); + void runNotifierBuild(covariant TraktTv notifier) { + return notifier.build(syncId: syncId, itemType: itemType); } @override @@ -182,7 +160,8 @@ mixin TraktTvRef on AutoDisposeNotifierProviderRef { } class _TraktTvProviderElement - extends AutoDisposeNotifierProviderElement with TraktTvRef { + extends AutoDisposeNotifierProviderElement + with TraktTvRef { _TraktTvProviderElement(super.provider); @override @@ -190,5 +169,6 @@ class _TraktTvProviderElement @override ItemType? get itemType => (origin as TraktTvProvider).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 diff --git a/lib/src/rust/api/rhttp/client.freezed.dart b/lib/src/rust/api/rhttp/client.freezed.dart index 930a6b78..8d3742e4 100644 --- a/lib/src/rust/api/rhttp/client.freezed.dart +++ b/lib/src/rust/api/rhttp/client.freezed.dart @@ -1,3 +1,4 @@ +// dart format width=80 // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint @@ -9,667 +10,268 @@ part of 'client.dart'; // FreezedGenerator // ************************************************************************** +// dart format off T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - /// @nodoc mixin _$ProxySettings { - @optionalTypeArgs - TResult when({ - required TResult Function() noProxy, - required TResult Function(List field0) customProxyList, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noProxy, - TResult? Function(List field0)? customProxyList, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noProxy, - TResult Function(List field0)? customProxyList, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(ProxySettings_NoProxy value) noProxy, - required TResult Function(ProxySettings_CustomProxyList value) - customProxyList, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ProxySettings_NoProxy value)? noProxy, - TResult? Function(ProxySettings_CustomProxyList value)? customProxyList, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ProxySettings_NoProxy value)? noProxy, - TResult Function(ProxySettings_CustomProxyList value)? customProxyList, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'ProxySettings()'; +} + + } /// @nodoc -abstract class $ProxySettingsCopyWith<$Res> { - factory $ProxySettingsCopyWith( - ProxySettings value, $Res Function(ProxySettings) then) = - _$ProxySettingsCopyWithImpl<$Res, ProxySettings>; +class $ProxySettingsCopyWith<$Res> { +$ProxySettingsCopyWith(ProxySettings _, $Res Function(ProxySettings) __); } -/// @nodoc -class _$ProxySettingsCopyWithImpl<$Res, $Val extends ProxySettings> - implements $ProxySettingsCopyWith<$Res> { - _$ProxySettingsCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of ProxySettings - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$ProxySettings_NoProxyImplCopyWith<$Res> { - factory _$$ProxySettings_NoProxyImplCopyWith( - _$ProxySettings_NoProxyImpl value, - $Res Function(_$ProxySettings_NoProxyImpl) then) = - __$$ProxySettings_NoProxyImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$ProxySettings_NoProxyImplCopyWithImpl<$Res> - extends _$ProxySettingsCopyWithImpl<$Res, _$ProxySettings_NoProxyImpl> - implements _$$ProxySettings_NoProxyImplCopyWith<$Res> { - __$$ProxySettings_NoProxyImplCopyWithImpl(_$ProxySettings_NoProxyImpl _value, - $Res Function(_$ProxySettings_NoProxyImpl) _then) - : super(_value, _then); - - /// Create a copy of ProxySettings - /// with the given fields replaced by the non-null parameter values. -} /// @nodoc -class _$ProxySettings_NoProxyImpl extends ProxySettings_NoProxy { - const _$ProxySettings_NoProxyImpl() : super._(); - @override - String toString() { - return 'ProxySettings.noProxy()'; - } +class ProxySettings_NoProxy extends ProxySettings { + const ProxySettings_NoProxy(): super._(); + - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ProxySettings_NoProxyImpl); - } - @override - int get hashCode => runtimeType.hashCode; - @override - @optionalTypeArgs - TResult when({ - required TResult Function() noProxy, - required TResult Function(List field0) customProxyList, - }) { - return noProxy(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noProxy, - TResult? Function(List field0)? customProxyList, - }) { - return noProxy?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noProxy, - TResult Function(List field0)? customProxyList, - required TResult orElse(), - }) { - if (noProxy != null) { - return noProxy(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ProxySettings_NoProxy value) noProxy, - required TResult Function(ProxySettings_CustomProxyList value) - customProxyList, - }) { - return noProxy(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ProxySettings_NoProxy value)? noProxy, - TResult? Function(ProxySettings_CustomProxyList value)? customProxyList, - }) { - return noProxy?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ProxySettings_NoProxy value)? noProxy, - TResult Function(ProxySettings_CustomProxyList value)? customProxyList, - required TResult orElse(), - }) { - if (noProxy != null) { - return noProxy(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings_NoProxy); } -abstract class ProxySettings_NoProxy extends ProxySettings { - const factory ProxySettings_NoProxy() = _$ProxySettings_NoProxyImpl; - const ProxySettings_NoProxy._() : super._(); + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'ProxySettings.noProxy()'; } -/// @nodoc -abstract class _$$ProxySettings_CustomProxyListImplCopyWith<$Res> { - factory _$$ProxySettings_CustomProxyListImplCopyWith( - _$ProxySettings_CustomProxyListImpl value, - $Res Function(_$ProxySettings_CustomProxyListImpl) then) = - __$$ProxySettings_CustomProxyListImplCopyWithImpl<$Res>; - @useResult - $Res call({List field0}); + } -/// @nodoc -class __$$ProxySettings_CustomProxyListImplCopyWithImpl<$Res> - extends _$ProxySettingsCopyWithImpl<$Res, - _$ProxySettings_CustomProxyListImpl> - implements _$$ProxySettings_CustomProxyListImplCopyWith<$Res> { - __$$ProxySettings_CustomProxyListImplCopyWithImpl( - _$ProxySettings_CustomProxyListImpl _value, - $Res Function(_$ProxySettings_CustomProxyListImpl) _then) - : super(_value, _then); - /// Create a copy of ProxySettings - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$ProxySettings_CustomProxyListImpl( - null == field0 - ? _value._field0 - : field0 // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} + /// @nodoc -class _$ProxySettings_CustomProxyListImpl - extends ProxySettings_CustomProxyList { - const _$ProxySettings_CustomProxyListImpl(final List field0) - : _field0 = field0, - super._(); - final List _field0; - @override - List get field0 { - if (_field0 is EqualUnmodifiableListView) return _field0; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_field0); - } +class ProxySettings_CustomProxyList extends ProxySettings { + const ProxySettings_CustomProxyList(final List field0): _field0 = field0,super._(); + - @override - String toString() { - return 'ProxySettings.customProxyList(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ProxySettings_CustomProxyListImpl && - const DeepCollectionEquality().equals(other._field0, _field0)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_field0)); - - /// Create a copy of ProxySettings - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$ProxySettings_CustomProxyListImplCopyWith< - _$ProxySettings_CustomProxyListImpl> - get copyWith => __$$ProxySettings_CustomProxyListImplCopyWithImpl< - _$ProxySettings_CustomProxyListImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() noProxy, - required TResult Function(List field0) customProxyList, - }) { - return customProxyList(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noProxy, - TResult? Function(List field0)? customProxyList, - }) { - return customProxyList?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noProxy, - TResult Function(List field0)? customProxyList, - required TResult orElse(), - }) { - if (customProxyList != null) { - return customProxyList(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ProxySettings_NoProxy value) noProxy, - required TResult Function(ProxySettings_CustomProxyList value) - customProxyList, - }) { - return customProxyList(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ProxySettings_NoProxy value)? noProxy, - TResult? Function(ProxySettings_CustomProxyList value)? customProxyList, - }) { - return customProxyList?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ProxySettings_NoProxy value)? noProxy, - TResult Function(ProxySettings_CustomProxyList value)? customProxyList, - required TResult orElse(), - }) { - if (customProxyList != null) { - return customProxyList(this); - } - return orElse(); - } + final List _field0; + List get field0 { + if (_field0 is EqualUnmodifiableListView) return _field0; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_field0); } -abstract class ProxySettings_CustomProxyList extends ProxySettings { - const factory ProxySettings_CustomProxyList(final List field0) = - _$ProxySettings_CustomProxyListImpl; - const ProxySettings_CustomProxyList._() : super._(); - List get field0; +/// Create a copy of ProxySettings +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProxySettings_CustomProxyListCopyWith get copyWith => _$ProxySettings_CustomProxyListCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings_CustomProxyList&&const DeepCollectionEquality().equals(other._field0, _field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_field0)); + +@override +String toString() { + return 'ProxySettings.customProxyList(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $ProxySettings_CustomProxyListCopyWith<$Res> implements $ProxySettingsCopyWith<$Res> { + factory $ProxySettings_CustomProxyListCopyWith(ProxySettings_CustomProxyList value, $Res Function(ProxySettings_CustomProxyList) _then) = _$ProxySettings_CustomProxyListCopyWithImpl; +@useResult +$Res call({ + List field0 +}); + + + + +} +/// @nodoc +class _$ProxySettings_CustomProxyListCopyWithImpl<$Res> + implements $ProxySettings_CustomProxyListCopyWith<$Res> { + _$ProxySettings_CustomProxyListCopyWithImpl(this._self, this._then); + + final ProxySettings_CustomProxyList _self; + final $Res Function(ProxySettings_CustomProxyList) _then; + +/// Create a copy of ProxySettings +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(ProxySettings_CustomProxyList( +null == field0 ? _self._field0 : field0 // ignore: cast_nullable_to_non_nullable +as List, + )); +} + - /// Create a copy of ProxySettings - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$ProxySettings_CustomProxyListImplCopyWith< - _$ProxySettings_CustomProxyListImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc mixin _$RedirectSettings { - @optionalTypeArgs - TResult when({ - required TResult Function() noRedirect, - required TResult Function(int field0) limitedRedirects, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noRedirect, - TResult? Function(int field0)? limitedRedirects, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noRedirect, - TResult Function(int field0)? limitedRedirects, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(RedirectSettings_NoRedirect value) noRedirect, - required TResult Function(RedirectSettings_LimitedRedirects value) - limitedRedirects, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult? Function(RedirectSettings_LimitedRedirects value)? - limitedRedirects, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RedirectSettings()'; +} + + } /// @nodoc -abstract class $RedirectSettingsCopyWith<$Res> { - factory $RedirectSettingsCopyWith( - RedirectSettings value, $Res Function(RedirectSettings) then) = - _$RedirectSettingsCopyWithImpl<$Res, RedirectSettings>; +class $RedirectSettingsCopyWith<$Res> { +$RedirectSettingsCopyWith(RedirectSettings _, $Res Function(RedirectSettings) __); } -/// @nodoc -class _$RedirectSettingsCopyWithImpl<$Res, $Val extends RedirectSettings> - implements $RedirectSettingsCopyWith<$Res> { - _$RedirectSettingsCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of RedirectSettings - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$RedirectSettings_NoRedirectImplCopyWith<$Res> { - factory _$$RedirectSettings_NoRedirectImplCopyWith( - _$RedirectSettings_NoRedirectImpl value, - $Res Function(_$RedirectSettings_NoRedirectImpl) then) = - __$$RedirectSettings_NoRedirectImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$RedirectSettings_NoRedirectImplCopyWithImpl<$Res> - extends _$RedirectSettingsCopyWithImpl<$Res, - _$RedirectSettings_NoRedirectImpl> - implements _$$RedirectSettings_NoRedirectImplCopyWith<$Res> { - __$$RedirectSettings_NoRedirectImplCopyWithImpl( - _$RedirectSettings_NoRedirectImpl _value, - $Res Function(_$RedirectSettings_NoRedirectImpl) _then) - : super(_value, _then); - - /// Create a copy of RedirectSettings - /// with the given fields replaced by the non-null parameter values. -} /// @nodoc -class _$RedirectSettings_NoRedirectImpl extends RedirectSettings_NoRedirect { - const _$RedirectSettings_NoRedirectImpl() : super._(); - @override - String toString() { - return 'RedirectSettings.noRedirect()'; - } +class RedirectSettings_NoRedirect extends RedirectSettings { + const RedirectSettings_NoRedirect(): super._(); + - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RedirectSettings_NoRedirectImpl); - } - @override - int get hashCode => runtimeType.hashCode; - @override - @optionalTypeArgs - TResult when({ - required TResult Function() noRedirect, - required TResult Function(int field0) limitedRedirects, - }) { - return noRedirect(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noRedirect, - TResult? Function(int field0)? limitedRedirects, - }) { - return noRedirect?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noRedirect, - TResult Function(int field0)? limitedRedirects, - required TResult orElse(), - }) { - if (noRedirect != null) { - return noRedirect(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RedirectSettings_NoRedirect value) noRedirect, - required TResult Function(RedirectSettings_LimitedRedirects value) - limitedRedirects, - }) { - return noRedirect(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult? Function(RedirectSettings_LimitedRedirects value)? - limitedRedirects, - }) { - return noRedirect?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects, - required TResult orElse(), - }) { - if (noRedirect != null) { - return noRedirect(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings_NoRedirect); } -abstract class RedirectSettings_NoRedirect extends RedirectSettings { - const factory RedirectSettings_NoRedirect() = - _$RedirectSettings_NoRedirectImpl; - const RedirectSettings_NoRedirect._() : super._(); + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RedirectSettings.noRedirect()'; } -/// @nodoc -abstract class _$$RedirectSettings_LimitedRedirectsImplCopyWith<$Res> { - factory _$$RedirectSettings_LimitedRedirectsImplCopyWith( - _$RedirectSettings_LimitedRedirectsImpl value, - $Res Function(_$RedirectSettings_LimitedRedirectsImpl) then) = - __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl<$Res>; - @useResult - $Res call({int field0}); + } -/// @nodoc -class __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl<$Res> - extends _$RedirectSettingsCopyWithImpl<$Res, - _$RedirectSettings_LimitedRedirectsImpl> - implements _$$RedirectSettings_LimitedRedirectsImplCopyWith<$Res> { - __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl( - _$RedirectSettings_LimitedRedirectsImpl _value, - $Res Function(_$RedirectSettings_LimitedRedirectsImpl) _then) - : super(_value, _then); - /// Create a copy of RedirectSettings - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$RedirectSettings_LimitedRedirectsImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} + /// @nodoc -class _$RedirectSettings_LimitedRedirectsImpl - extends RedirectSettings_LimitedRedirects { - const _$RedirectSettings_LimitedRedirectsImpl(this.field0) : super._(); - @override - final int field0; +class RedirectSettings_LimitedRedirects extends RedirectSettings { + const RedirectSettings_LimitedRedirects(this.field0): super._(); + - @override - String toString() { - return 'RedirectSettings.limitedRedirects(field0: $field0)'; - } + final int field0; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RedirectSettings_LimitedRedirectsImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// Create a copy of RedirectSettings +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RedirectSettings_LimitedRedirectsCopyWith get copyWith => _$RedirectSettings_LimitedRedirectsCopyWithImpl(this, _$identity); - @override - int get hashCode => Object.hash(runtimeType, field0); - /// Create a copy of RedirectSettings - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RedirectSettings_LimitedRedirectsImplCopyWith< - _$RedirectSettings_LimitedRedirectsImpl> - get copyWith => __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl< - _$RedirectSettings_LimitedRedirectsImpl>(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() noRedirect, - required TResult Function(int field0) limitedRedirects, - }) { - return limitedRedirects(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? noRedirect, - TResult? Function(int field0)? limitedRedirects, - }) { - return limitedRedirects?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? noRedirect, - TResult Function(int field0)? limitedRedirects, - required TResult orElse(), - }) { - if (limitedRedirects != null) { - return limitedRedirects(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RedirectSettings_NoRedirect value) noRedirect, - required TResult Function(RedirectSettings_LimitedRedirects value) - limitedRedirects, - }) { - return limitedRedirects(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult? Function(RedirectSettings_LimitedRedirects value)? - limitedRedirects, - }) { - return limitedRedirects?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RedirectSettings_NoRedirect value)? noRedirect, - TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects, - required TResult orElse(), - }) { - if (limitedRedirects != null) { - return limitedRedirects(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings_LimitedRedirects&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class RedirectSettings_LimitedRedirects extends RedirectSettings { - const factory RedirectSettings_LimitedRedirects(final int field0) = - _$RedirectSettings_LimitedRedirectsImpl; - const RedirectSettings_LimitedRedirects._() : super._(); - int get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of RedirectSettings - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RedirectSettings_LimitedRedirectsImplCopyWith< - _$RedirectSettings_LimitedRedirectsImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'RedirectSettings.limitedRedirects(field0: $field0)'; } + + +} + +/// @nodoc +abstract mixin class $RedirectSettings_LimitedRedirectsCopyWith<$Res> implements $RedirectSettingsCopyWith<$Res> { + factory $RedirectSettings_LimitedRedirectsCopyWith(RedirectSettings_LimitedRedirects value, $Res Function(RedirectSettings_LimitedRedirects) _then) = _$RedirectSettings_LimitedRedirectsCopyWithImpl; +@useResult +$Res call({ + int field0 +}); + + + + +} +/// @nodoc +class _$RedirectSettings_LimitedRedirectsCopyWithImpl<$Res> + implements $RedirectSettings_LimitedRedirectsCopyWith<$Res> { + _$RedirectSettings_LimitedRedirectsCopyWithImpl(this._self, this._then); + + final RedirectSettings_LimitedRedirects _self; + final $Res Function(RedirectSettings_LimitedRedirects) _then; + +/// Create a copy of RedirectSettings +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RedirectSettings_LimitedRedirects( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as int, + )); +} + + +} + +// dart format on diff --git a/lib/src/rust/api/rhttp/error.freezed.dart b/lib/src/rust/api/rhttp/error.freezed.dart index 07e5f871..8a745ca2 100644 --- a/lib/src/rust/api/rhttp/error.freezed.dart +++ b/lib/src/rust/api/rhttp/error.freezed.dart @@ -1,3 +1,4 @@ +// dart format width=80 // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint @@ -9,1431 +10,415 @@ part of 'error.dart'; // FreezedGenerator // ************************************************************************** +// dart format off T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - /// @nodoc mixin _$RhttpError { - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RhttpError()'; +} + + } /// @nodoc -abstract class $RhttpErrorCopyWith<$Res> { - factory $RhttpErrorCopyWith( - RhttpError value, $Res Function(RhttpError) then) = - _$RhttpErrorCopyWithImpl<$Res, RhttpError>; +class $RhttpErrorCopyWith<$Res> { +$RhttpErrorCopyWith(RhttpError _, $Res Function(RhttpError) __); +} + + +/// @nodoc + + +class RhttpError_RhttpCancelError extends RhttpError { + const RhttpError_RhttpCancelError(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpCancelError); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RhttpError.rhttpCancelError()'; +} + + +} + + + + +/// @nodoc + + +class RhttpError_RhttpTimeoutError extends RhttpError { + const RhttpError_RhttpTimeoutError(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpTimeoutError); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RhttpError.rhttpTimeoutError()'; +} + + +} + + + + +/// @nodoc + + +class RhttpError_RhttpRedirectError extends RhttpError { + const RhttpError_RhttpRedirectError(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpRedirectError); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RhttpError.rhttpRedirectError()'; +} + + +} + + + + +/// @nodoc + + +class RhttpError_RhttpStatusCodeError extends RhttpError { + const RhttpError_RhttpStatusCodeError(this.field0, final List<(String, String)> field1, this.field2): _field1 = field1,super._(); + + + final int field0; + final List<(String, String)> _field1; + List<(String, String)> get field1 { + if (_field1 is EqualUnmodifiableListView) return _field1; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_field1); +} + + final HttpResponseBody field2; + +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RhttpError_RhttpStatusCodeErrorCopyWith get copyWith => _$RhttpError_RhttpStatusCodeErrorCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpStatusCodeError&&(identical(other.field0, field0) || other.field0 == field0)&&const DeepCollectionEquality().equals(other._field1, _field1)&&(identical(other.field2, field2) || other.field2 == field2)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0,const DeepCollectionEquality().hash(_field1),field2); + +@override +String toString() { + return 'RhttpError.rhttpStatusCodeError(field0: $field0, field1: $field1, field2: $field2)'; +} + + } /// @nodoc -class _$RhttpErrorCopyWithImpl<$Res, $Val extends RhttpError> - implements $RhttpErrorCopyWith<$Res> { - _$RhttpErrorCopyWithImpl(this._value, this._then); +abstract mixin class $RhttpError_RhttpStatusCodeErrorCopyWith<$Res> implements $RhttpErrorCopyWith<$Res> { + factory $RhttpError_RhttpStatusCodeErrorCopyWith(RhttpError_RhttpStatusCodeError value, $Res Function(RhttpError_RhttpStatusCodeError) _then) = _$RhttpError_RhttpStatusCodeErrorCopyWithImpl; +@useResult +$Res call({ + int field0, List<(String, String)> field1, HttpResponseBody field2 +}); - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. +$HttpResponseBodyCopyWith<$Res> get field2; + +} +/// @nodoc +class _$RhttpError_RhttpStatusCodeErrorCopyWithImpl<$Res> + implements $RhttpError_RhttpStatusCodeErrorCopyWith<$Res> { + _$RhttpError_RhttpStatusCodeErrorCopyWithImpl(this._self, this._then); + + final RhttpError_RhttpStatusCodeError _self; + final $Res Function(RhttpError_RhttpStatusCodeError) _then; + +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,Object? field1 = null,Object? field2 = null,}) { + return _then(RhttpError_RhttpStatusCodeError( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as int,null == field1 ? _self._field1 : field1 // ignore: cast_nullable_to_non_nullable +as List<(String, String)>,null == field2 ? _self.field2 : field2 // ignore: cast_nullable_to_non_nullable +as HttpResponseBody, + )); } -/// @nodoc -abstract class _$$RhttpError_RhttpCancelErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpCancelErrorImplCopyWith( - _$RhttpError_RhttpCancelErrorImpl value, - $Res Function(_$RhttpError_RhttpCancelErrorImpl) then) = - __$$RhttpError_RhttpCancelErrorImplCopyWithImpl<$Res>; +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$HttpResponseBodyCopyWith<$Res> get field2 { + + return $HttpResponseBodyCopyWith<$Res>(_self.field2, (value) { + return _then(_self.copyWith(field2: value)); + }); } - -/// @nodoc -class __$$RhttpError_RhttpCancelErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, _$RhttpError_RhttpCancelErrorImpl> - implements _$$RhttpError_RhttpCancelErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpCancelErrorImplCopyWithImpl( - _$RhttpError_RhttpCancelErrorImpl _value, - $Res Function(_$RhttpError_RhttpCancelErrorImpl) _then) - : super(_value, _then); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$RhttpError_RhttpCancelErrorImpl extends RhttpError_RhttpCancelError { - const _$RhttpError_RhttpCancelErrorImpl() : super._(); - @override - String toString() { - return 'RhttpError.rhttpCancelError()'; - } +class RhttpError_RhttpInvalidCertificateError extends RhttpError { + const RhttpError_RhttpInvalidCertificateError(this.field0): super._(); + - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpCancelErrorImpl); - } + final String field0; - @override - int get hashCode => runtimeType.hashCode; +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RhttpError_RhttpInvalidCertificateErrorCopyWith get copyWith => _$RhttpError_RhttpInvalidCertificateErrorCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpCancelError(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpCancelError?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpCancelError != null) { - return rhttpCancelError(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpCancelError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpCancelError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpCancelError != null) { - return rhttpCancelError(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpInvalidCertificateError&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class RhttpError_RhttpCancelError extends RhttpError { - const factory RhttpError_RhttpCancelError() = - _$RhttpError_RhttpCancelErrorImpl; - const RhttpError_RhttpCancelError._() : super._(); + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RhttpError.rhttpInvalidCertificateError(field0: $field0)'; +} + + } /// @nodoc -abstract class _$$RhttpError_RhttpTimeoutErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpTimeoutErrorImplCopyWith( - _$RhttpError_RhttpTimeoutErrorImpl value, - $Res Function(_$RhttpError_RhttpTimeoutErrorImpl) then) = - __$$RhttpError_RhttpTimeoutErrorImplCopyWithImpl<$Res>; +abstract mixin class $RhttpError_RhttpInvalidCertificateErrorCopyWith<$Res> implements $RhttpErrorCopyWith<$Res> { + factory $RhttpError_RhttpInvalidCertificateErrorCopyWith(RhttpError_RhttpInvalidCertificateError value, $Res Function(RhttpError_RhttpInvalidCertificateError) _then) = _$RhttpError_RhttpInvalidCertificateErrorCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RhttpError_RhttpInvalidCertificateErrorCopyWithImpl<$Res> + implements $RhttpError_RhttpInvalidCertificateErrorCopyWith<$Res> { + _$RhttpError_RhttpInvalidCertificateErrorCopyWithImpl(this._self, this._then); + + final RhttpError_RhttpInvalidCertificateError _self; + final $Res Function(RhttpError_RhttpInvalidCertificateError) _then; + +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RhttpError_RhttpInvalidCertificateError( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -class __$$RhttpError_RhttpTimeoutErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, _$RhttpError_RhttpTimeoutErrorImpl> - implements _$$RhttpError_RhttpTimeoutErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpTimeoutErrorImplCopyWithImpl( - _$RhttpError_RhttpTimeoutErrorImpl _value, - $Res Function(_$RhttpError_RhttpTimeoutErrorImpl) _then) - : super(_value, _then); - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$RhttpError_RhttpTimeoutErrorImpl extends RhttpError_RhttpTimeoutError { - const _$RhttpError_RhttpTimeoutErrorImpl() : super._(); - @override - String toString() { - return 'RhttpError.rhttpTimeoutError()'; - } +class RhttpError_RhttpConnectionError extends RhttpError { + const RhttpError_RhttpConnectionError(this.field0): super._(); + - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpTimeoutErrorImpl); - } + final String field0; - @override - int get hashCode => runtimeType.hashCode; +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RhttpError_RhttpConnectionErrorCopyWith get copyWith => _$RhttpError_RhttpConnectionErrorCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpTimeoutError(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpTimeoutError?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpTimeoutError != null) { - return rhttpTimeoutError(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpTimeoutError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpTimeoutError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpTimeoutError != null) { - return rhttpTimeoutError(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpConnectionError&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class RhttpError_RhttpTimeoutError extends RhttpError { - const factory RhttpError_RhttpTimeoutError() = - _$RhttpError_RhttpTimeoutErrorImpl; - const RhttpError_RhttpTimeoutError._() : super._(); + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RhttpError.rhttpConnectionError(field0: $field0)'; +} + + } /// @nodoc -abstract class _$$RhttpError_RhttpRedirectErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpRedirectErrorImplCopyWith( - _$RhttpError_RhttpRedirectErrorImpl value, - $Res Function(_$RhttpError_RhttpRedirectErrorImpl) then) = - __$$RhttpError_RhttpRedirectErrorImplCopyWithImpl<$Res>; +abstract mixin class $RhttpError_RhttpConnectionErrorCopyWith<$Res> implements $RhttpErrorCopyWith<$Res> { + factory $RhttpError_RhttpConnectionErrorCopyWith(RhttpError_RhttpConnectionError value, $Res Function(RhttpError_RhttpConnectionError) _then) = _$RhttpError_RhttpConnectionErrorCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RhttpError_RhttpConnectionErrorCopyWithImpl<$Res> + implements $RhttpError_RhttpConnectionErrorCopyWith<$Res> { + _$RhttpError_RhttpConnectionErrorCopyWithImpl(this._self, this._then); + + final RhttpError_RhttpConnectionError _self; + final $Res Function(RhttpError_RhttpConnectionError) _then; + +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RhttpError_RhttpConnectionError( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -class __$$RhttpError_RhttpRedirectErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, _$RhttpError_RhttpRedirectErrorImpl> - implements _$$RhttpError_RhttpRedirectErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpRedirectErrorImplCopyWithImpl( - _$RhttpError_RhttpRedirectErrorImpl _value, - $Res Function(_$RhttpError_RhttpRedirectErrorImpl) _then) - : super(_value, _then); - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$RhttpError_RhttpRedirectErrorImpl - extends RhttpError_RhttpRedirectError { - const _$RhttpError_RhttpRedirectErrorImpl() : super._(); - @override - String toString() { - return 'RhttpError.rhttpRedirectError()'; - } +class RhttpError_RhttpUnknownError extends RhttpError { + const RhttpError_RhttpUnknownError(this.field0): super._(); + - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpRedirectErrorImpl); - } + final String field0; - @override - int get hashCode => runtimeType.hashCode; +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RhttpError_RhttpUnknownErrorCopyWith get copyWith => _$RhttpError_RhttpUnknownErrorCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpRedirectError(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpRedirectError?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpRedirectError != null) { - return rhttpRedirectError(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpRedirectError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpRedirectError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpRedirectError != null) { - return rhttpRedirectError(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RhttpError_RhttpUnknownError&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class RhttpError_RhttpRedirectError extends RhttpError { - const factory RhttpError_RhttpRedirectError() = - _$RhttpError_RhttpRedirectErrorImpl; - const RhttpError_RhttpRedirectError._() : super._(); + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RhttpError.rhttpUnknownError(field0: $field0)'; +} + + } /// @nodoc -abstract class _$$RhttpError_RhttpStatusCodeErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpStatusCodeErrorImplCopyWith( - _$RhttpError_RhttpStatusCodeErrorImpl value, - $Res Function(_$RhttpError_RhttpStatusCodeErrorImpl) then) = - __$$RhttpError_RhttpStatusCodeErrorImplCopyWithImpl<$Res>; - @useResult - $Res call( - {int field0, List<(String, String)> field1, HttpResponseBody field2}); +abstract mixin class $RhttpError_RhttpUnknownErrorCopyWith<$Res> implements $RhttpErrorCopyWith<$Res> { + factory $RhttpError_RhttpUnknownErrorCopyWith(RhttpError_RhttpUnknownError value, $Res Function(RhttpError_RhttpUnknownError) _then) = _$RhttpError_RhttpUnknownErrorCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + - $HttpResponseBodyCopyWith<$Res> get field2; } - /// @nodoc -class __$$RhttpError_RhttpStatusCodeErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, - _$RhttpError_RhttpStatusCodeErrorImpl> - implements _$$RhttpError_RhttpStatusCodeErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpStatusCodeErrorImplCopyWithImpl( - _$RhttpError_RhttpStatusCodeErrorImpl _value, - $Res Function(_$RhttpError_RhttpStatusCodeErrorImpl) _then) - : super(_value, _then); +class _$RhttpError_RhttpUnknownErrorCopyWithImpl<$Res> + implements $RhttpError_RhttpUnknownErrorCopyWith<$Res> { + _$RhttpError_RhttpUnknownErrorCopyWithImpl(this._self, this._then); - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - Object? field1 = null, - Object? field2 = null, - }) { - return _then(_$RhttpError_RhttpStatusCodeErrorImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as int, - null == field1 - ? _value._field1 - : field1 // ignore: cast_nullable_to_non_nullable - as List<(String, String)>, - null == field2 - ? _value.field2 - : field2 // ignore: cast_nullable_to_non_nullable - as HttpResponseBody, - )); - } + final RhttpError_RhttpUnknownError _self; + final $Res Function(RhttpError_RhttpUnknownError) _then; - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $HttpResponseBodyCopyWith<$Res> get field2 { - return $HttpResponseBodyCopyWith<$Res>(_value.field2, (value) { - return _then(_value.copyWith(field2: value)); - }); - } +/// Create a copy of RhttpError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RhttpError_RhttpUnknownError( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -class _$RhttpError_RhttpStatusCodeErrorImpl - extends RhttpError_RhttpStatusCodeError { - const _$RhttpError_RhttpStatusCodeErrorImpl( - this.field0, final List<(String, String)> field1, this.field2) - : _field1 = field1, - super._(); - - @override - final int field0; - final List<(String, String)> _field1; - @override - List<(String, String)> get field1 { - if (_field1 is EqualUnmodifiableListView) return _field1; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_field1); - } - - @override - final HttpResponseBody field2; - - @override - String toString() { - return 'RhttpError.rhttpStatusCodeError(field0: $field0, field1: $field1, field2: $field2)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpStatusCodeErrorImpl && - (identical(other.field0, field0) || other.field0 == field0) && - const DeepCollectionEquality().equals(other._field1, _field1) && - (identical(other.field2, field2) || other.field2 == field2)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0, - const DeepCollectionEquality().hash(_field1), field2); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RhttpError_RhttpStatusCodeErrorImplCopyWith< - _$RhttpError_RhttpStatusCodeErrorImpl> - get copyWith => __$$RhttpError_RhttpStatusCodeErrorImplCopyWithImpl< - _$RhttpError_RhttpStatusCodeErrorImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpStatusCodeError(field0, field1, field2); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpStatusCodeError?.call(field0, field1, field2); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpStatusCodeError != null) { - return rhttpStatusCodeError(field0, field1, field2); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpStatusCodeError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpStatusCodeError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpStatusCodeError != null) { - return rhttpStatusCodeError(this); - } - return orElse(); - } } -abstract class RhttpError_RhttpStatusCodeError extends RhttpError { - const factory RhttpError_RhttpStatusCodeError( - final int field0, - final List<(String, String)> field1, - final HttpResponseBody field2) = _$RhttpError_RhttpStatusCodeErrorImpl; - const RhttpError_RhttpStatusCodeError._() : super._(); - - int get field0; - List<(String, String)> get field1; - HttpResponseBody get field2; - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RhttpError_RhttpStatusCodeErrorImplCopyWith< - _$RhttpError_RhttpStatusCodeErrorImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RhttpError_RhttpInvalidCertificateErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpInvalidCertificateErrorImplCopyWith( - _$RhttpError_RhttpInvalidCertificateErrorImpl value, - $Res Function(_$RhttpError_RhttpInvalidCertificateErrorImpl) then) = - __$$RhttpError_RhttpInvalidCertificateErrorImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} - -/// @nodoc -class __$$RhttpError_RhttpInvalidCertificateErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, - _$RhttpError_RhttpInvalidCertificateErrorImpl> - implements _$$RhttpError_RhttpInvalidCertificateErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpInvalidCertificateErrorImplCopyWithImpl( - _$RhttpError_RhttpInvalidCertificateErrorImpl _value, - $Res Function(_$RhttpError_RhttpInvalidCertificateErrorImpl) _then) - : super(_value, _then); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$RhttpError_RhttpInvalidCertificateErrorImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc - -class _$RhttpError_RhttpInvalidCertificateErrorImpl - extends RhttpError_RhttpInvalidCertificateError { - const _$RhttpError_RhttpInvalidCertificateErrorImpl(this.field0) : super._(); - - @override - final String field0; - - @override - String toString() { - return 'RhttpError.rhttpInvalidCertificateError(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpInvalidCertificateErrorImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RhttpError_RhttpInvalidCertificateErrorImplCopyWith< - _$RhttpError_RhttpInvalidCertificateErrorImpl> - get copyWith => - __$$RhttpError_RhttpInvalidCertificateErrorImplCopyWithImpl< - _$RhttpError_RhttpInvalidCertificateErrorImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpInvalidCertificateError(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpInvalidCertificateError?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpInvalidCertificateError != null) { - return rhttpInvalidCertificateError(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpInvalidCertificateError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpInvalidCertificateError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpInvalidCertificateError != null) { - return rhttpInvalidCertificateError(this); - } - return orElse(); - } -} - -abstract class RhttpError_RhttpInvalidCertificateError extends RhttpError { - const factory RhttpError_RhttpInvalidCertificateError(final String field0) = - _$RhttpError_RhttpInvalidCertificateErrorImpl; - const RhttpError_RhttpInvalidCertificateError._() : super._(); - - String get field0; - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RhttpError_RhttpInvalidCertificateErrorImplCopyWith< - _$RhttpError_RhttpInvalidCertificateErrorImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RhttpError_RhttpConnectionErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpConnectionErrorImplCopyWith( - _$RhttpError_RhttpConnectionErrorImpl value, - $Res Function(_$RhttpError_RhttpConnectionErrorImpl) then) = - __$$RhttpError_RhttpConnectionErrorImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} - -/// @nodoc -class __$$RhttpError_RhttpConnectionErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, - _$RhttpError_RhttpConnectionErrorImpl> - implements _$$RhttpError_RhttpConnectionErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpConnectionErrorImplCopyWithImpl( - _$RhttpError_RhttpConnectionErrorImpl _value, - $Res Function(_$RhttpError_RhttpConnectionErrorImpl) _then) - : super(_value, _then); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$RhttpError_RhttpConnectionErrorImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc - -class _$RhttpError_RhttpConnectionErrorImpl - extends RhttpError_RhttpConnectionError { - const _$RhttpError_RhttpConnectionErrorImpl(this.field0) : super._(); - - @override - final String field0; - - @override - String toString() { - return 'RhttpError.rhttpConnectionError(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpConnectionErrorImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RhttpError_RhttpConnectionErrorImplCopyWith< - _$RhttpError_RhttpConnectionErrorImpl> - get copyWith => __$$RhttpError_RhttpConnectionErrorImplCopyWithImpl< - _$RhttpError_RhttpConnectionErrorImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpConnectionError(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpConnectionError?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpConnectionError != null) { - return rhttpConnectionError(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpConnectionError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpConnectionError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpConnectionError != null) { - return rhttpConnectionError(this); - } - return orElse(); - } -} - -abstract class RhttpError_RhttpConnectionError extends RhttpError { - const factory RhttpError_RhttpConnectionError(final String field0) = - _$RhttpError_RhttpConnectionErrorImpl; - const RhttpError_RhttpConnectionError._() : super._(); - - String get field0; - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RhttpError_RhttpConnectionErrorImplCopyWith< - _$RhttpError_RhttpConnectionErrorImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$RhttpError_RhttpUnknownErrorImplCopyWith<$Res> { - factory _$$RhttpError_RhttpUnknownErrorImplCopyWith( - _$RhttpError_RhttpUnknownErrorImpl value, - $Res Function(_$RhttpError_RhttpUnknownErrorImpl) then) = - __$$RhttpError_RhttpUnknownErrorImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} - -/// @nodoc -class __$$RhttpError_RhttpUnknownErrorImplCopyWithImpl<$Res> - extends _$RhttpErrorCopyWithImpl<$Res, _$RhttpError_RhttpUnknownErrorImpl> - implements _$$RhttpError_RhttpUnknownErrorImplCopyWith<$Res> { - __$$RhttpError_RhttpUnknownErrorImplCopyWithImpl( - _$RhttpError_RhttpUnknownErrorImpl _value, - $Res Function(_$RhttpError_RhttpUnknownErrorImpl) _then) - : super(_value, _then); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$RhttpError_RhttpUnknownErrorImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc - -class _$RhttpError_RhttpUnknownErrorImpl extends RhttpError_RhttpUnknownError { - const _$RhttpError_RhttpUnknownErrorImpl(this.field0) : super._(); - - @override - final String field0; - - @override - String toString() { - return 'RhttpError.rhttpUnknownError(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RhttpError_RhttpUnknownErrorImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RhttpError_RhttpUnknownErrorImplCopyWith< - _$RhttpError_RhttpUnknownErrorImpl> - get copyWith => __$$RhttpError_RhttpUnknownErrorImplCopyWithImpl< - _$RhttpError_RhttpUnknownErrorImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() rhttpCancelError, - required TResult Function() rhttpTimeoutError, - required TResult Function() rhttpRedirectError, - required TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2) - rhttpStatusCodeError, - required TResult Function(String field0) rhttpInvalidCertificateError, - required TResult Function(String field0) rhttpConnectionError, - required TResult Function(String field0) rhttpUnknownError, - }) { - return rhttpUnknownError(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? rhttpCancelError, - TResult? Function()? rhttpTimeoutError, - TResult? Function()? rhttpRedirectError, - TResult? Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult? Function(String field0)? rhttpInvalidCertificateError, - TResult? Function(String field0)? rhttpConnectionError, - TResult? Function(String field0)? rhttpUnknownError, - }) { - return rhttpUnknownError?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? rhttpCancelError, - TResult Function()? rhttpTimeoutError, - TResult Function()? rhttpRedirectError, - TResult Function( - int field0, List<(String, String)> field1, HttpResponseBody field2)? - rhttpStatusCodeError, - TResult Function(String field0)? rhttpInvalidCertificateError, - TResult Function(String field0)? rhttpConnectionError, - TResult Function(String field0)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpUnknownError != null) { - return rhttpUnknownError(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RhttpError_RhttpCancelError value) - rhttpCancelError, - required TResult Function(RhttpError_RhttpTimeoutError value) - rhttpTimeoutError, - required TResult Function(RhttpError_RhttpRedirectError value) - rhttpRedirectError, - required TResult Function(RhttpError_RhttpStatusCodeError value) - rhttpStatusCodeError, - required TResult Function(RhttpError_RhttpInvalidCertificateError value) - rhttpInvalidCertificateError, - required TResult Function(RhttpError_RhttpConnectionError value) - rhttpConnectionError, - required TResult Function(RhttpError_RhttpUnknownError value) - rhttpUnknownError, - }) { - return rhttpUnknownError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult? Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult? Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult? Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult? Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult? Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult? Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - }) { - return rhttpUnknownError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RhttpError_RhttpCancelError value)? rhttpCancelError, - TResult Function(RhttpError_RhttpTimeoutError value)? rhttpTimeoutError, - TResult Function(RhttpError_RhttpRedirectError value)? rhttpRedirectError, - TResult Function(RhttpError_RhttpStatusCodeError value)? - rhttpStatusCodeError, - TResult Function(RhttpError_RhttpInvalidCertificateError value)? - rhttpInvalidCertificateError, - TResult Function(RhttpError_RhttpConnectionError value)? - rhttpConnectionError, - TResult Function(RhttpError_RhttpUnknownError value)? rhttpUnknownError, - required TResult orElse(), - }) { - if (rhttpUnknownError != null) { - return rhttpUnknownError(this); - } - return orElse(); - } -} - -abstract class RhttpError_RhttpUnknownError extends RhttpError { - const factory RhttpError_RhttpUnknownError(final String field0) = - _$RhttpError_RhttpUnknownErrorImpl; - const RhttpError_RhttpUnknownError._() : super._(); - - String get field0; - - /// Create a copy of RhttpError - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RhttpError_RhttpUnknownErrorImplCopyWith< - _$RhttpError_RhttpUnknownErrorImpl> - get copyWith => throw _privateConstructorUsedError; -} +// dart format on diff --git a/lib/src/rust/api/rhttp/http.freezed.dart b/lib/src/rust/api/rhttp/http.freezed.dart index d6941458..cf6f9a03 100644 --- a/lib/src/rust/api/rhttp/http.freezed.dart +++ b/lib/src/rust/api/rhttp/http.freezed.dart @@ -1,3 +1,4 @@ +// dart format width=80 // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint @@ -9,861 +10,374 @@ part of 'http.dart'; // FreezedGenerator // ************************************************************************** +// dart format off T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - /// @nodoc mixin _$HttpHeaders { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(Map field0) map, - required TResult Function(List<(String, String)> field0) list, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Map field0)? map, - TResult? Function(List<(String, String)> field0)? list, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Map field0)? map, - TResult Function(List<(String, String)> field0)? list, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(HttpHeaders_Map value) map, - required TResult Function(HttpHeaders_List value) list, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpHeaders_Map value)? map, - TResult? Function(HttpHeaders_List value)? list, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpHeaders_Map value)? map, - TResult Function(HttpHeaders_List value)? list, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; + + Object get field0; + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpHeaders&&const DeepCollectionEquality().equals(other.field0, field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'HttpHeaders(field0: $field0)'; +} + + } /// @nodoc -abstract class $HttpHeadersCopyWith<$Res> { - factory $HttpHeadersCopyWith( - HttpHeaders value, $Res Function(HttpHeaders) then) = - _$HttpHeadersCopyWithImpl<$Res, HttpHeaders>; +class $HttpHeadersCopyWith<$Res> { +$HttpHeadersCopyWith(HttpHeaders _, $Res Function(HttpHeaders) __); +} + + +/// @nodoc + + +class HttpHeaders_Map extends HttpHeaders { + const HttpHeaders_Map(final Map field0): _field0 = field0,super._(); + + + final Map _field0; +@override Map get field0 { + if (_field0 is EqualUnmodifiableMapView) return _field0; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(_field0); +} + + +/// Create a copy of HttpHeaders +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HttpHeaders_MapCopyWith get copyWith => _$HttpHeaders_MapCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpHeaders_Map&&const DeepCollectionEquality().equals(other._field0, _field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_field0)); + +@override +String toString() { + return 'HttpHeaders.map(field0: $field0)'; +} + + } /// @nodoc -class _$HttpHeadersCopyWithImpl<$Res, $Val extends HttpHeaders> - implements $HttpHeadersCopyWith<$Res> { - _$HttpHeadersCopyWithImpl(this._value, this._then); +abstract mixin class $HttpHeaders_MapCopyWith<$Res> implements $HttpHeadersCopyWith<$Res> { + factory $HttpHeaders_MapCopyWith(HttpHeaders_Map value, $Res Function(HttpHeaders_Map) _then) = _$HttpHeaders_MapCopyWithImpl; +@useResult +$Res call({ + Map field0 +}); - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. + + +} +/// @nodoc +class _$HttpHeaders_MapCopyWithImpl<$Res> + implements $HttpHeaders_MapCopyWith<$Res> { + _$HttpHeaders_MapCopyWithImpl(this._self, this._then); + + final HttpHeaders_Map _self; + final $Res Function(HttpHeaders_Map) _then; + +/// Create a copy of HttpHeaders +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(HttpHeaders_Map( +null == field0 ? _self._field0 : field0 // ignore: cast_nullable_to_non_nullable +as Map, + )); } -/// @nodoc -abstract class _$$HttpHeaders_MapImplCopyWith<$Res> { - factory _$$HttpHeaders_MapImplCopyWith(_$HttpHeaders_MapImpl value, - $Res Function(_$HttpHeaders_MapImpl) then) = - __$$HttpHeaders_MapImplCopyWithImpl<$Res>; - @useResult - $Res call({Map field0}); -} -/// @nodoc -class __$$HttpHeaders_MapImplCopyWithImpl<$Res> - extends _$HttpHeadersCopyWithImpl<$Res, _$HttpHeaders_MapImpl> - implements _$$HttpHeaders_MapImplCopyWith<$Res> { - __$$HttpHeaders_MapImplCopyWithImpl( - _$HttpHeaders_MapImpl _value, $Res Function(_$HttpHeaders_MapImpl) _then) - : super(_value, _then); - - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$HttpHeaders_MapImpl( - null == field0 - ? _value._field0 - : field0 // ignore: cast_nullable_to_non_nullable - as Map, - )); - } } /// @nodoc -class _$HttpHeaders_MapImpl extends HttpHeaders_Map { - const _$HttpHeaders_MapImpl(final Map field0) - : _field0 = field0, - super._(); - final Map _field0; - @override - Map get field0 { - if (_field0 is EqualUnmodifiableMapView) return _field0; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(_field0); - } +class HttpHeaders_List extends HttpHeaders { + const HttpHeaders_List(final List<(String, String)> field0): _field0 = field0,super._(); + - @override - String toString() { - return 'HttpHeaders.map(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$HttpHeaders_MapImpl && - const DeepCollectionEquality().equals(other._field0, _field0)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_field0)); - - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$HttpHeaders_MapImplCopyWith<_$HttpHeaders_MapImpl> get copyWith => - __$$HttpHeaders_MapImplCopyWithImpl<_$HttpHeaders_MapImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Map field0) map, - required TResult Function(List<(String, String)> field0) list, - }) { - return map(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Map field0)? map, - TResult? Function(List<(String, String)> field0)? list, - }) { - return map?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Map field0)? map, - TResult Function(List<(String, String)> field0)? list, - required TResult orElse(), - }) { - if (map != null) { - return map(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(HttpHeaders_Map value) map, - required TResult Function(HttpHeaders_List value) list, - }) { - return map(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpHeaders_Map value)? map, - TResult? Function(HttpHeaders_List value)? list, - }) { - return map?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpHeaders_Map value)? map, - TResult Function(HttpHeaders_List value)? list, - required TResult orElse(), - }) { - if (map != null) { - return map(this); - } - return orElse(); - } + final List<(String, String)> _field0; +@override List<(String, String)> get field0 { + if (_field0 is EqualUnmodifiableListView) return _field0; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_field0); } -abstract class HttpHeaders_Map extends HttpHeaders { - const factory HttpHeaders_Map(final Map field0) = - _$HttpHeaders_MapImpl; - const HttpHeaders_Map._() : super._(); - @override - Map get field0; +/// Create a copy of HttpHeaders +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HttpHeaders_ListCopyWith get copyWith => _$HttpHeaders_ListCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpHeaders_List&&const DeepCollectionEquality().equals(other._field0, _field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_field0)); + +@override +String toString() { + return 'HttpHeaders.list(field0: $field0)'; +} + - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$HttpHeaders_MapImplCopyWith<_$HttpHeaders_MapImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$HttpHeaders_ListImplCopyWith<$Res> { - factory _$$HttpHeaders_ListImplCopyWith(_$HttpHeaders_ListImpl value, - $Res Function(_$HttpHeaders_ListImpl) then) = - __$$HttpHeaders_ListImplCopyWithImpl<$Res>; - @useResult - $Res call({List<(String, String)> field0}); -} +abstract mixin class $HttpHeaders_ListCopyWith<$Res> implements $HttpHeadersCopyWith<$Res> { + factory $HttpHeaders_ListCopyWith(HttpHeaders_List value, $Res Function(HttpHeaders_List) _then) = _$HttpHeaders_ListCopyWithImpl; +@useResult +$Res call({ + List<(String, String)> field0 +}); + + + +} /// @nodoc -class __$$HttpHeaders_ListImplCopyWithImpl<$Res> - extends _$HttpHeadersCopyWithImpl<$Res, _$HttpHeaders_ListImpl> - implements _$$HttpHeaders_ListImplCopyWith<$Res> { - __$$HttpHeaders_ListImplCopyWithImpl(_$HttpHeaders_ListImpl _value, - $Res Function(_$HttpHeaders_ListImpl) _then) - : super(_value, _then); +class _$HttpHeaders_ListCopyWithImpl<$Res> + implements $HttpHeaders_ListCopyWith<$Res> { + _$HttpHeaders_ListCopyWithImpl(this._self, this._then); - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$HttpHeaders_ListImpl( - null == field0 - ? _value._field0 - : field0 // ignore: cast_nullable_to_non_nullable - as List<(String, String)>, - )); - } + final HttpHeaders_List _self; + final $Res Function(HttpHeaders_List) _then; + +/// Create a copy of HttpHeaders +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(HttpHeaders_List( +null == field0 ? _self._field0 : field0 // ignore: cast_nullable_to_non_nullable +as List<(String, String)>, + )); } -/// @nodoc -class _$HttpHeaders_ListImpl extends HttpHeaders_List { - const _$HttpHeaders_ListImpl(final List<(String, String)> field0) - : _field0 = field0, - super._(); - - final List<(String, String)> _field0; - @override - List<(String, String)> get field0 { - if (_field0 is EqualUnmodifiableListView) return _field0; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_field0); - } - - @override - String toString() { - return 'HttpHeaders.list(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$HttpHeaders_ListImpl && - const DeepCollectionEquality().equals(other._field0, _field0)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_field0)); - - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$HttpHeaders_ListImplCopyWith<_$HttpHeaders_ListImpl> get copyWith => - __$$HttpHeaders_ListImplCopyWithImpl<_$HttpHeaders_ListImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Map field0) map, - required TResult Function(List<(String, String)> field0) list, - }) { - return list(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Map field0)? map, - TResult? Function(List<(String, String)> field0)? list, - }) { - return list?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Map field0)? map, - TResult Function(List<(String, String)> field0)? list, - required TResult orElse(), - }) { - if (list != null) { - return list(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(HttpHeaders_Map value) map, - required TResult Function(HttpHeaders_List value) list, - }) { - return list(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpHeaders_Map value)? map, - TResult? Function(HttpHeaders_List value)? list, - }) { - return list?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpHeaders_Map value)? map, - TResult Function(HttpHeaders_List value)? list, - required TResult orElse(), - }) { - if (list != null) { - return list(this); - } - return orElse(); - } -} - -abstract class HttpHeaders_List extends HttpHeaders { - const factory HttpHeaders_List(final List<(String, String)> field0) = - _$HttpHeaders_ListImpl; - const HttpHeaders_List._() : super._(); - - @override - List<(String, String)> get field0; - - /// Create a copy of HttpHeaders - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$HttpHeaders_ListImplCopyWith<_$HttpHeaders_ListImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc mixin _$HttpResponseBody { - @optionalTypeArgs - TResult when({ - required TResult Function(String field0) text, - required TResult Function(Uint8List field0) bytes, - required TResult Function() stream, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0)? text, - TResult? Function(Uint8List field0)? bytes, - TResult? Function()? stream, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0)? text, - TResult Function(Uint8List field0)? bytes, - TResult Function()? stream, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(HttpResponseBody_Text value) text, - required TResult Function(HttpResponseBody_Bytes value) bytes, - required TResult Function(HttpResponseBody_Stream value) stream, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpResponseBody_Text value)? text, - TResult? Function(HttpResponseBody_Bytes value)? bytes, - TResult? Function(HttpResponseBody_Stream value)? stream, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpResponseBody_Text value)? text, - TResult Function(HttpResponseBody_Bytes value)? bytes, - TResult Function(HttpResponseBody_Stream value)? stream, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpResponseBody); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'HttpResponseBody()'; +} + + } /// @nodoc -abstract class $HttpResponseBodyCopyWith<$Res> { - factory $HttpResponseBodyCopyWith( - HttpResponseBody value, $Res Function(HttpResponseBody) then) = - _$HttpResponseBodyCopyWithImpl<$Res, HttpResponseBody>; +class $HttpResponseBodyCopyWith<$Res> { +$HttpResponseBodyCopyWith(HttpResponseBody _, $Res Function(HttpResponseBody) __); +} + + +/// @nodoc + + +class HttpResponseBody_Text extends HttpResponseBody { + const HttpResponseBody_Text(this.field0): super._(); + + + final String field0; + +/// Create a copy of HttpResponseBody +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HttpResponseBody_TextCopyWith get copyWith => _$HttpResponseBody_TextCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpResponseBody_Text&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'HttpResponseBody.text(field0: $field0)'; +} + + } /// @nodoc -class _$HttpResponseBodyCopyWithImpl<$Res, $Val extends HttpResponseBody> - implements $HttpResponseBodyCopyWith<$Res> { - _$HttpResponseBodyCopyWithImpl(this._value, this._then); +abstract mixin class $HttpResponseBody_TextCopyWith<$Res> implements $HttpResponseBodyCopyWith<$Res> { + factory $HttpResponseBody_TextCopyWith(HttpResponseBody_Text value, $Res Function(HttpResponseBody_Text) _then) = _$HttpResponseBody_TextCopyWithImpl; +@useResult +$Res call({ + String field0 +}); - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. + + +} +/// @nodoc +class _$HttpResponseBody_TextCopyWithImpl<$Res> + implements $HttpResponseBody_TextCopyWith<$Res> { + _$HttpResponseBody_TextCopyWithImpl(this._self, this._then); + + final HttpResponseBody_Text _self; + final $Res Function(HttpResponseBody_Text) _then; + +/// Create a copy of HttpResponseBody +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(HttpResponseBody_Text( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -abstract class _$$HttpResponseBody_TextImplCopyWith<$Res> { - factory _$$HttpResponseBody_TextImplCopyWith( - _$HttpResponseBody_TextImpl value, - $Res Function(_$HttpResponseBody_TextImpl) then) = - __$$HttpResponseBody_TextImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} -/// @nodoc -class __$$HttpResponseBody_TextImplCopyWithImpl<$Res> - extends _$HttpResponseBodyCopyWithImpl<$Res, _$HttpResponseBody_TextImpl> - implements _$$HttpResponseBody_TextImplCopyWith<$Res> { - __$$HttpResponseBody_TextImplCopyWithImpl(_$HttpResponseBody_TextImpl _value, - $Res Function(_$HttpResponseBody_TextImpl) _then) - : super(_value, _then); - - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$HttpResponseBody_TextImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } } /// @nodoc -class _$HttpResponseBody_TextImpl extends HttpResponseBody_Text { - const _$HttpResponseBody_TextImpl(this.field0) : super._(); - @override - final String field0; +class HttpResponseBody_Bytes extends HttpResponseBody { + const HttpResponseBody_Bytes(this.field0): super._(); + - @override - String toString() { - return 'HttpResponseBody.text(field0: $field0)'; - } + final Uint8List field0; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$HttpResponseBody_TextImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// Create a copy of HttpResponseBody +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HttpResponseBody_BytesCopyWith get copyWith => _$HttpResponseBody_BytesCopyWithImpl(this, _$identity); - @override - int get hashCode => Object.hash(runtimeType, field0); - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$HttpResponseBody_TextImplCopyWith<_$HttpResponseBody_TextImpl> - get copyWith => __$$HttpResponseBody_TextImplCopyWithImpl< - _$HttpResponseBody_TextImpl>(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0) text, - required TResult Function(Uint8List field0) bytes, - required TResult Function() stream, - }) { - return text(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0)? text, - TResult? Function(Uint8List field0)? bytes, - TResult? Function()? stream, - }) { - return text?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0)? text, - TResult Function(Uint8List field0)? bytes, - TResult Function()? stream, - required TResult orElse(), - }) { - if (text != null) { - return text(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(HttpResponseBody_Text value) text, - required TResult Function(HttpResponseBody_Bytes value) bytes, - required TResult Function(HttpResponseBody_Stream value) stream, - }) { - return text(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpResponseBody_Text value)? text, - TResult? Function(HttpResponseBody_Bytes value)? bytes, - TResult? Function(HttpResponseBody_Stream value)? stream, - }) { - return text?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpResponseBody_Text value)? text, - TResult Function(HttpResponseBody_Bytes value)? bytes, - TResult Function(HttpResponseBody_Stream value)? stream, - required TResult orElse(), - }) { - if (text != null) { - return text(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpResponseBody_Bytes&&const DeepCollectionEquality().equals(other.field0, field0)); } -abstract class HttpResponseBody_Text extends HttpResponseBody { - const factory HttpResponseBody_Text(final String field0) = - _$HttpResponseBody_TextImpl; - const HttpResponseBody_Text._() : super._(); - String get field0; +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'HttpResponseBody.bytes(field0: $field0)'; +} + - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$HttpResponseBody_TextImplCopyWith<_$HttpResponseBody_TextImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$HttpResponseBody_BytesImplCopyWith<$Res> { - factory _$$HttpResponseBody_BytesImplCopyWith( - _$HttpResponseBody_BytesImpl value, - $Res Function(_$HttpResponseBody_BytesImpl) then) = - __$$HttpResponseBody_BytesImplCopyWithImpl<$Res>; - @useResult - $Res call({Uint8List field0}); +abstract mixin class $HttpResponseBody_BytesCopyWith<$Res> implements $HttpResponseBodyCopyWith<$Res> { + factory $HttpResponseBody_BytesCopyWith(HttpResponseBody_Bytes value, $Res Function(HttpResponseBody_Bytes) _then) = _$HttpResponseBody_BytesCopyWithImpl; +@useResult +$Res call({ + Uint8List field0 +}); + + + + +} +/// @nodoc +class _$HttpResponseBody_BytesCopyWithImpl<$Res> + implements $HttpResponseBody_BytesCopyWith<$Res> { + _$HttpResponseBody_BytesCopyWithImpl(this._self, this._then); + + final HttpResponseBody_Bytes _self; + final $Res Function(HttpResponseBody_Bytes) _then; + +/// Create a copy of HttpResponseBody +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(HttpResponseBody_Bytes( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as Uint8List, + )); } -/// @nodoc -class __$$HttpResponseBody_BytesImplCopyWithImpl<$Res> - extends _$HttpResponseBodyCopyWithImpl<$Res, _$HttpResponseBody_BytesImpl> - implements _$$HttpResponseBody_BytesImplCopyWith<$Res> { - __$$HttpResponseBody_BytesImplCopyWithImpl( - _$HttpResponseBody_BytesImpl _value, - $Res Function(_$HttpResponseBody_BytesImpl) _then) - : super(_value, _then); - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$HttpResponseBody_BytesImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as Uint8List, - )); - } } /// @nodoc -class _$HttpResponseBody_BytesImpl extends HttpResponseBody_Bytes { - const _$HttpResponseBody_BytesImpl(this.field0) : super._(); - @override - final Uint8List field0; +class HttpResponseBody_Stream extends HttpResponseBody { + const HttpResponseBody_Stream(): super._(); + - @override - String toString() { - return 'HttpResponseBody.bytes(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$HttpResponseBody_BytesImpl && - const DeepCollectionEquality().equals(other.field0, field0)); - } - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(field0)); - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$HttpResponseBody_BytesImplCopyWith<_$HttpResponseBody_BytesImpl> - get copyWith => __$$HttpResponseBody_BytesImplCopyWithImpl< - _$HttpResponseBody_BytesImpl>(this, _$identity); - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0) text, - required TResult Function(Uint8List field0) bytes, - required TResult Function() stream, - }) { - return bytes(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0)? text, - TResult? Function(Uint8List field0)? bytes, - TResult? Function()? stream, - }) { - return bytes?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0)? text, - TResult Function(Uint8List field0)? bytes, - TResult Function()? stream, - required TResult orElse(), - }) { - if (bytes != null) { - return bytes(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(HttpResponseBody_Text value) text, - required TResult Function(HttpResponseBody_Bytes value) bytes, - required TResult Function(HttpResponseBody_Stream value) stream, - }) { - return bytes(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpResponseBody_Text value)? text, - TResult? Function(HttpResponseBody_Bytes value)? bytes, - TResult? Function(HttpResponseBody_Stream value)? stream, - }) { - return bytes?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpResponseBody_Text value)? text, - TResult Function(HttpResponseBody_Bytes value)? bytes, - TResult Function(HttpResponseBody_Stream value)? stream, - required TResult orElse(), - }) { - if (bytes != null) { - return bytes(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HttpResponseBody_Stream); } -abstract class HttpResponseBody_Bytes extends HttpResponseBody { - const factory HttpResponseBody_Bytes(final Uint8List field0) = - _$HttpResponseBody_BytesImpl; - const HttpResponseBody_Bytes._() : super._(); - Uint8List get field0; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$HttpResponseBody_BytesImplCopyWith<_$HttpResponseBody_BytesImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'HttpResponseBody.stream()'; } -/// @nodoc -abstract class _$$HttpResponseBody_StreamImplCopyWith<$Res> { - factory _$$HttpResponseBody_StreamImplCopyWith( - _$HttpResponseBody_StreamImpl value, - $Res Function(_$HttpResponseBody_StreamImpl) then) = - __$$HttpResponseBody_StreamImplCopyWithImpl<$Res>; + } -/// @nodoc -class __$$HttpResponseBody_StreamImplCopyWithImpl<$Res> - extends _$HttpResponseBodyCopyWithImpl<$Res, _$HttpResponseBody_StreamImpl> - implements _$$HttpResponseBody_StreamImplCopyWith<$Res> { - __$$HttpResponseBody_StreamImplCopyWithImpl( - _$HttpResponseBody_StreamImpl _value, - $Res Function(_$HttpResponseBody_StreamImpl) _then) - : super(_value, _then); - /// Create a copy of HttpResponseBody - /// with the given fields replaced by the non-null parameter values. -} -/// @nodoc -class _$HttpResponseBody_StreamImpl extends HttpResponseBody_Stream { - const _$HttpResponseBody_StreamImpl() : super._(); - - @override - String toString() { - return 'HttpResponseBody.stream()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$HttpResponseBody_StreamImpl); - } - - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0) text, - required TResult Function(Uint8List field0) bytes, - required TResult Function() stream, - }) { - return stream(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0)? text, - TResult? Function(Uint8List field0)? bytes, - TResult? Function()? stream, - }) { - return stream?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0)? text, - TResult Function(Uint8List field0)? bytes, - TResult Function()? stream, - required TResult orElse(), - }) { - if (stream != null) { - return stream(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(HttpResponseBody_Text value) text, - required TResult Function(HttpResponseBody_Bytes value) bytes, - required TResult Function(HttpResponseBody_Stream value) stream, - }) { - return stream(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(HttpResponseBody_Text value)? text, - TResult? Function(HttpResponseBody_Bytes value)? bytes, - TResult? Function(HttpResponseBody_Stream value)? stream, - }) { - return stream?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(HttpResponseBody_Text value)? text, - TResult Function(HttpResponseBody_Bytes value)? bytes, - TResult Function(HttpResponseBody_Stream value)? stream, - required TResult orElse(), - }) { - if (stream != null) { - return stream(this); - } - return orElse(); - } -} - -abstract class HttpResponseBody_Stream extends HttpResponseBody { - const factory HttpResponseBody_Stream() = _$HttpResponseBody_StreamImpl; - const HttpResponseBody_Stream._() : super._(); -} +// dart format on From c442de35fb121dad796a638549f2192e3dcc2e54 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Aug 2025 18:43:24 +0200 Subject: [PATCH 090/100] added button link to the apk --- lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 ++++++ lib/l10n/generated/app_localizations_ar.dart | 3 +++ lib/l10n/generated/app_localizations_as.dart | 3 +++ lib/l10n/generated/app_localizations_de.dart | 3 +++ lib/l10n/generated/app_localizations_en.dart | 3 +++ lib/l10n/generated/app_localizations_es.dart | 3 +++ lib/l10n/generated/app_localizations_fr.dart | 3 +++ lib/l10n/generated/app_localizations_hi.dart | 3 +++ lib/l10n/generated/app_localizations_id.dart | 3 +++ lib/l10n/generated/app_localizations_it.dart | 3 +++ lib/l10n/generated/app_localizations_pt.dart | 3 +++ lib/l10n/generated/app_localizations_ru.dart | 3 +++ lib/l10n/generated/app_localizations_th.dart | 3 +++ lib/l10n/generated/app_localizations_tr.dart | 3 +++ lib/l10n/generated/app_localizations_zh.dart | 3 +++ .../more/settings/browse/browse_screen.dart | 21 +++++++++++++++++++ 17 files changed, 70 insertions(+) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 776ed6a5..795ba4ca 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -451,6 +451,7 @@ "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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index dd7e21c1..929d8c48 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2781,6 +2781,12 @@ abstract class AppLocalizations { /// **'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: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 6975ef34..22a40ea4 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1427,6 +1427,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'غير محدد'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 633e73cc..1ad1d71d 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1429,6 +1429,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index f17f44fd..33d7c6bb 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1438,6 +1438,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Nicht definiert'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 4345ede8..2cef5a71 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1428,6 +1428,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 9e52974c..3e03bad6 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1442,6 +1442,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Indefinido'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index b0e1bc7d..d572613b 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1445,6 +1445,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Indéfini'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 8858ec0a..23fe1ea9 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1430,6 +1430,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'undefined'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 3da5e0ce..4e8b6c2a 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1434,6 +1434,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Tidak terdefinisi'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 88d30d55..d22ec143 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1442,6 +1442,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Non definito'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 47d4042c..6390a647 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1439,6 +1439,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Indefinido'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 03db5780..2bdc0c13 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1441,6 +1441,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'Не определено'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index b459c2eb..77aa7899 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1428,6 +1428,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => 'ไม่ได้กำหนด'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 4b1e09bf..147a98bd 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1434,6 +1434,9 @@ class AppLocalizationsTr extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index a8929b72..998e57ad 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1402,6 +1402,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get android_proxy_server => 'Android Proxy Server (ApkBridge)'; + @override + String get get_apk_bridge => 'Get ApkBridge'; + @override String get undefined => '未定义'; diff --git a/lib/modules/more/settings/browse/browse_screen.dart b/lib/modules/more/settings/browse/browse_screen.dart index 98d5c2e5..10dd7d26 100644 --- a/lib/modules/more/settings/browse/browse_screen.dart +++ b/lib/modules/more/settings/browse/browse_screen.dart @@ -15,8 +15,13 @@ import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.da import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; +import 'package:mangayomi/utils/log/logger.dart'; +import 'package:url_launcher/url_launcher.dart'; class BrowseSScreen extends ConsumerWidget { + static const apkUrl = + "https://github.com/Schnitzel5/ApkBridge/releases/latest"; + const BrowseSScreen({super.key}); @override @@ -67,6 +72,22 @@ class BrowseSScreen extends ConsumerWidget { color: context.secondaryColor, ), ), + trailing: OutlinedButton.icon( + onPressed: () async { + if (!await launchUrl( + Uri.parse(apkUrl), + mode: LaunchMode.externalApplication, + )) { + AppLogger.log( + 'Could not launch $apkUrl', + logLevel: LogLevel.error, + ); + botToast('Could not launch $apkUrl'); + } + }, + label: Text(l10n.get_apk_bridge), + icon: const Icon(Icons.download_outlined), + ), ), ListTile( onTap: () { From 600a6997089e594caa8b8b90f0f4a2ffb70095ea Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Thu, 28 Aug 2025 12:12:23 +0100 Subject: [PATCH 091/100] feat: Add use sourceId property if not null to get source model --- lib/models/manga.dart | 5 + lib/models/manga.g.dart | 130 +++++++++++++++++- .../anime/widgets/search_subtitles.dart | 5 +- .../global_search/global_search_screen.dart | 2 + lib/modules/calendar/calendar_screen.dart | 1 + lib/modules/history/history_screen.dart | 6 +- lib/modules/library/library_screen.dart | 1 + .../library/providers/add_torrent.dart | 1 + .../library/providers/add_torrent.g.dart | 2 +- .../library/providers/file_scanner.dart | 1 + .../library/providers/file_scanner.g.dart | 2 +- .../library/providers/local_archive.dart | 1 + .../library/providers/local_archive.g.dart | 2 +- .../widgets/library_gridview_widget.dart | 2 + .../widgets/library_listview_widget.dart | 2 + .../manga/detail/manga_detail_view.dart | 6 + .../update_manga_detail_providers.dart | 2 +- .../update_manga_detail_providers.g.dart | 2 +- .../manga/detail/widgets/migrate_screen.dart | 2 + .../download/providers/download_provider.dart | 6 +- lib/modules/manga/reader/reader_view.dart | 6 +- .../data_and_storage/providers/restore.dart | 3 + .../data_and_storage/providers/restore.g.dart | 4 +- lib/modules/novel/novel_reader_view.dart | 6 +- .../tracker_library/tracker_item_card.dart | 1 + .../update_chapter_list_tile_widget.dart | 1 + .../widgets/manga_image_card_widget.dart | 27 +++- lib/services/aniskip.g.dart | 2 +- lib/services/get_chapter_pages.dart | 1 + lib/services/get_chapter_pages.g.dart | 2 +- lib/services/get_html_content.dart | 1 + lib/services/get_html_content.g.dart | 2 +- lib/services/get_video_list.dart | 3 +- lib/services/get_video_list.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- lib/services/trackers/kitsu.g.dart | 2 +- lib/services/trackers/myanimelist.g.dart | 2 +- lib/services/trackers/simkl.g.dart | 2 +- lib/services/trackers/trakt_tv.g.dart | 2 +- lib/utils/extensions/others.dart | 1 + lib/utils/headers.dart | 3 +- lib/utils/headers.g.dart | 18 ++- lib/utils/utils.dart | 13 +- plugins/isar_generator/lib/src/helper.dart | 6 +- .../isar_generator/lib/src/isar_analyzer.dart | 6 +- 45 files changed, 251 insertions(+), 48 deletions(-) diff --git a/lib/models/manga.dart b/lib/models/manga.dart index d15d0676..2ba33566 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -54,6 +54,8 @@ class Manga { int? updatedAt; + int? sourceId; + @Backlink(to: "manga") final chapters = IsarLinks(); @@ -70,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, @@ -107,6 +110,7 @@ class Manga { customCoverFromTracker = json['customCoverFromTracker']; smartUpdateDays = json['smartUpdateDays']; updatedAt = json['updatedAt']; + sourceId = json['sourceId']; } Map toJson() => { @@ -132,6 +136,7 @@ class Manga { 'customCoverFromTracker': customCoverFromTracker, 'smartUpdateDays': smartUpdateDays, 'updatedAt': updatedAt ?? 0, + 'sourceId': sourceId, }; } diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index fae7cabc..c8d0ce3c 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -78,14 +78,15 @@ const MangaSchema = CollectionSchema( type: IsarType.long, ), r'source': PropertySchema(id: 19, name: r'source', type: IsarType.string), + r'sourceId': PropertySchema(id: 20, name: r'sourceId', type: IsarType.long), r'status': PropertySchema( - id: 20, + id: 21, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, ), r'updatedAt': PropertySchema( - id: 21, + id: 22, name: r'updatedAt', type: IsarType.long, ), @@ -227,8 +228,9 @@ void _mangaSerialize( writer.writeString(offsets[17], object.name); writer.writeLong(offsets[18], object.smartUpdateDays); writer.writeString(offsets[19], object.source); - writer.writeByte(offsets[20], object.status.index); - writer.writeLong(offsets[21], object.updatedAt); + writer.writeLong(offsets[20], object.sourceId); + writer.writeByte(offsets[21], object.status.index); + writer.writeLong(offsets[22], object.updatedAt); } Manga _mangaDeserialize( @@ -261,10 +263,11 @@ Manga _mangaDeserialize( name: reader.readStringOrNull(offsets[17]), smartUpdateDays: reader.readLongOrNull(offsets[18]), source: reader.readStringOrNull(offsets[19]), + sourceId: reader.readLongOrNull(offsets[20]), status: - _MangastatusValueEnumMap[reader.readByteOrNull(offsets[20])] ?? + _MangastatusValueEnumMap[reader.readByteOrNull(offsets[21])] ?? Status.ongoing, - updatedAt: reader.readLongOrNull(offsets[21]), + updatedAt: reader.readLongOrNull(offsets[22]), ); return object; } @@ -319,10 +322,12 @@ P _mangaDeserializeProp

    ( case 19: return (reader.readStringOrNull(offset)) as P; case 20: + return (reader.readLongOrNull(offset)) as P; + case 21: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; - case 21: + case 22: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -2887,6 +2892,81 @@ extension MangaQueryFilter on QueryBuilder { }); } + QueryBuilder sourceIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'sourceId'), + ); + }); + } + + QueryBuilder sourceIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull(property: r'sourceId'), + ); + }); + } + + QueryBuilder sourceIdEqualTo( + int? value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo(property: r'sourceId', value: value), + ); + }); + } + + QueryBuilder sourceIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.greaterThan( + include: include, + property: r'sourceId', + value: value, + ), + ); + }); + } + + QueryBuilder sourceIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.lessThan( + include: include, + property: r'sourceId', + value: value, + ), + ); + }); + } + + QueryBuilder sourceIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.between( + property: r'sourceId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + ), + ); + }); + } + QueryBuilder statusEqualTo( Status value, ) { @@ -3294,6 +3374,18 @@ extension MangaQuerySortBy on QueryBuilder { }); } + QueryBuilder sortBySourceId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sourceId', Sort.asc); + }); + } + + QueryBuilder sortBySourceIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sourceId', Sort.desc); + }); + } + QueryBuilder sortByStatus() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'status', Sort.asc); @@ -3536,6 +3628,18 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenBySourceId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sourceId', Sort.asc); + }); + } + + QueryBuilder thenBySourceIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sourceId', Sort.desc); + }); + } + QueryBuilder thenByStatus() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'status', Sort.asc); @@ -3703,6 +3807,12 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctBySourceId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'sourceId'); + }); + } + QueryBuilder distinctByStatus() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'status'); @@ -3844,6 +3954,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder sourceIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sourceId'); + }); + } + QueryBuilder statusProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'status'); diff --git a/lib/modules/anime/widgets/search_subtitles.dart b/lib/modules/anime/widgets/search_subtitles.dart index bd0031eb..6df11742 100644 --- a/lib/modules/anime/widgets/search_subtitles.dart +++ b/lib/modules/anime/widgets/search_subtitles.dart @@ -13,7 +13,6 @@ 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/extensions/string_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'; @@ -360,13 +359,13 @@ class _SubtitlesWidgetSearchState extends ConsumerState { } AppLogger.log('Subtitle file downloaded: ${subtitle.language}'); await subtitleFile.writeAsBytes(response.bodyBytes); - if (context.mounted) { + 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 (context.mounted) { + if (mounted) { botToast(context.l10n.failed); } } diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index 444a6219..7b3f2e6a 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -263,6 +263,7 @@ class _MangaGlobalImageCardState extends ConsumerState itemType: widget.source.itemType, useMaterialRoute: true, source: widget.source.name!, + sourceId: widget.source.id, ); }, child: StreamBuilder( @@ -298,6 +299,7 @@ class _MangaGlobalImageCardState extends ConsumerState headersProvider( source: widget.source.name!, lang: widget.source.lang!, + sourceId: widget.source.id, ), ), imageUrl: toImgUrl( diff --git a/lib/modules/calendar/calendar_screen.dart b/lib/modules/calendar/calendar_screen.dart index 036fa065..74eb218d 100644 --- a/lib/modules/calendar/calendar_screen.dart +++ b/lib/modules/calendar/calendar_screen.dart @@ -376,6 +376,7 @@ class CalendarListTileWidget extends ConsumerWidget { headersProvider( source: manga.source!, lang: manga.lang!, + sourceId: manga.sourceId, ), ), ), diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 44b964bc..0c8d3c65 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -402,7 +402,11 @@ class _HistoryTabState extends ConsumerState ? 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 ?? "", diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 5c115b6f..bdaa0e0b 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -2020,6 +2020,7 @@ class _LibraryScreenState extends ConsumerState lang: randomManga.lang!, mangaM: randomManga, source: randomManga.source!, + sourceId: randomManga.sourceId, ); }); } else if (value == 2) { diff --git a/lib/modules/library/providers/add_torrent.dart b/lib/modules/library/providers/add_torrent.dart index 38632e83..a8f88b1a 100644 --- a/lib/modules/library/providers/add_torrent.dart +++ b/lib/modules/library/providers/add_torrent.dart @@ -51,6 +51,7 @@ Future addTorrentFromUrlOrFromFile( isLocalArchive: true, artist: '', updatedAt: dateNow, + sourceId: null, ); if (url != null) { diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index 8faef450..23b1e14e 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'ca841c87c01dd9e9254b99b3223ac67d775ba5b2'; + r'a54f90b6708b13eeb8fed098691f9a79dbab50fd'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/providers/file_scanner.dart b/lib/modules/library/providers/file_scanner.dart index fde40b0e..ea1a37db 100644 --- a/lib/modules/library/providers/file_scanner.dart +++ b/lib/modules/library/providers/file_scanner.dart @@ -130,6 +130,7 @@ Future scanLocalLibrary(Ref ref) async { itemType: itemType, dateAdded: dateNow, lastUpdate: dateNow, + sourceId: null, ); newMangas++; } diff --git a/lib/modules/library/providers/file_scanner.g.dart b/lib/modules/library/providers/file_scanner.g.dart index c964774a..02d8d8bf 100644 --- a/lib/modules/library/providers/file_scanner.g.dart +++ b/lib/modules/library/providers/file_scanner.g.dart @@ -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. /// diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index 14510238..eab3c3b3 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -48,6 +48,7 @@ Future importArchivesFromFile( isLocalArchive: true, artist: '', updatedAt: dateNow, + sourceId: null, ); for (var file in result.files.reversed.toList()) { diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index 13ff5dda..38f0a118 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -7,7 +7,7 @@ part of 'local_archive.dart'; // ************************************************************************** String _$importArchivesFromFileHash() => - r'4d92aaade0544f76214030364433f91d27570b5a'; + r'784b9d45958695faffdf04ee7c105c9b486122de'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 75c891ad..1dd9d73b 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -94,6 +94,7 @@ class _LibraryGridViewWidgetState extends State { headersProvider( source: entry.source!, lang: entry.lang!, + sourceId: entry.sourceId, ), ), ), @@ -110,6 +111,7 @@ class _LibraryGridViewWidgetState extends State { lang: entry.lang!, mangaM: entry, source: entry.source!, + sourceId: entry.sourceId, ); if (context.mounted) { ref.invalidate( diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index 4dc2e22e..ccbaf0a0 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -62,6 +62,7 @@ class LibraryListViewWidget extends StatelessWidget { lang: entry.lang!, mangaM: entry, source: entry.source!, + sourceId: entry.sourceId, ); ref.invalidate( getAllMangaWithoutCategoriesStreamProvider( @@ -140,6 +141,7 @@ class LibraryListViewWidget extends StatelessWidget { headersProvider( source: entry.source!, lang: entry.lang!, + sourceId: entry.sourceId, ), ), ), diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index f2dbd575..1043c231 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -293,6 +293,7 @@ class _MangaDetailViewState extends ConsumerState headersProvider( source: widget.manga!.source!, lang: widget.manga!.lang!, + sourceId: widget.manga!.sourceId, ), ), imageUrl: toImgUrl( @@ -651,6 +652,7 @@ class _MangaDetailViewState extends ConsumerState final source = getSource( widget.manga!.lang!, widget.manga!.source!, + widget.manga!.sourceId, ); final url = "${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}"; @@ -670,6 +672,7 @@ class _MangaDetailViewState extends ConsumerState final source = getSource( widget.manga!.lang!, widget.manga!.source!, + widget.manga!.sourceId, ); context.push( '/extension_detail', @@ -1513,6 +1516,7 @@ class _MangaDetailViewState extends ConsumerState final source = getSource( widget.manga!.lang!, widget.manga!.source!, + widget.manga!.sourceId, ); if (source == null) { botToast(l10n.source_not_added); @@ -1827,6 +1831,7 @@ class _MangaDetailViewState extends ConsumerState headersProvider( source: widget.manga!.source!, lang: widget.manga!.lang!, + sourceId: widget.manga!.sourceId, ), ), ); @@ -1889,6 +1894,7 @@ class _MangaDetailViewState extends ConsumerState final source = getSource( widget.manga!.lang!, widget.manga!.source!, + widget.manga!.sourceId, ); final url = "${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}"; diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index 884b37a1..488a39b9 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -25,7 +25,7 @@ Future updateMangaDetail( if (manga!.chapters.isNotEmpty && isInit) { return; } - final source = getSource(manga.lang!, manga.source!); + final source = getSource(manga.lang!, manga.source!, manga.sourceId); MManga getManga; getManga = await ref.read( diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index d653d649..e23eca1d 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'05605c26d058a9176a351ba5a79f811987d4ba1a'; +String _$updateMangaDetailHash() => r'6e4faa1fe453df67182ff6698f1ca54a7fff2bea'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/migrate_screen.dart b/lib/modules/manga/detail/widgets/migrate_screen.dart index 4c6fceb5..336049fd 100644 --- a/lib/modules/manga/detail/widgets/migrate_screen.dart +++ b/lib/modules/manga/detail/widgets/migrate_screen.dart @@ -310,6 +310,7 @@ class _MigrationMangaGlobalImageCardState headersProvider( source: widget.source.name!, lang: widget.source.lang!, + sourceId: widget.source.id, ), ), imageUrl: toImgUrl( @@ -586,6 +587,7 @@ class _MigrationMangaGlobalImageCardState categories: categoryIds, dateAdded: DateTime.now().millisecondsSinceEpoch, updatedAt: DateTime.now().millisecondsSinceEpoch, + sourceId: widget.source.id, ); int mangaId = -1; isar.writeTxnSync(() { diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index b2b4cef9..0e553ca5 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -270,7 +270,11 @@ Future downloadChapter( final cookie = MClient.getCookiesPref(page.url); final headers = itemType == ItemType.manga ? ref.read( - headersProvider(source: manga.source!, lang: manga.lang!), + headersProvider( + source: manga.source!, + lang: manga.lang!, + sourceId: manga.sourceId, + ), ) : itemType == ItemType.anime ? videoHeader diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 4fb4472c..ca06c9b7 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -1495,7 +1495,11 @@ class _MangaChapterPageGalleryState IconButton( onPressed: () async { final manga = chapter.manga.value!; - final source = getSource(manga.lang!, manga.source!)!; + final source = getSource( + manga.lang!, + manga.source!, + manga.sourceId, + )!; final url = "${source.baseUrl}${chapter.url!.getUrlWithoutDomain}"; Map data = { diff --git a/lib/modules/more/data_and_storage/providers/restore.dart b/lib/modules/more/data_and_storage/providers/restore.dart index 83061de0..15a12c23 100644 --- a/lib/modules/more/data_and_storage/providers/restore.dart +++ b/lib/modules/more/data_and_storage/providers/restore.dart @@ -332,6 +332,7 @@ void restoreKotatsuBackup(Ref ref, Archive archive) { categories: [favourite["category_id"]], itemType: ItemType.manga, favorite: true, + sourceId: null, ); isar.mangas.putSync(manga); } @@ -402,6 +403,7 @@ void restoreTachiBkBackup(Ref ref, String path, BackupType bkType) { favorite: true, dateAdded: tempManga.dateAdded * 1000, lastUpdate: tempManga.lastModifiedAt * 1000, + sourceId: null, ); if (bkType == BackupType.neko) { manga.source = "MangaDex"; @@ -481,6 +483,7 @@ void restoreTachiBkBackup(Ref ref, String path, BackupType bkType) { favorite: true, dateAdded: tempAnime.dateAdded * 1000, lastUpdate: tempAnime.lastModifiedAt * 1000, + sourceId: null, ); isar.mangas.putSync(anime); History? history; diff --git a/lib/modules/more/data_and_storage/providers/restore.g.dart b/lib/modules/more/data_and_storage/providers/restore.g.dart index 1dfb5b14..ac32ac18 100644 --- a/lib/modules/more/data_and_storage/providers/restore.g.dart +++ b/lib/modules/more/data_and_storage/providers/restore.g.dart @@ -286,7 +286,7 @@ class _RestoreBackupProviderElement extends AutoDisposeProviderElement } String _$restoreKotatsuBackupHash() => - r'e927f6a196a0349285fecbd84f30c2a9125998b2'; + r'4b43cb1719527b3030b9966e5ef662c29435425d'; /// See also [restoreKotatsuBackup]. @ProviderFor(restoreKotatsuBackup) @@ -407,7 +407,7 @@ class _RestoreKotatsuBackupProviderElement } String _$restoreTachiBkBackupHash() => - r'ae971c2630393df773eb1d64214b4daefb080b95'; + r'54434eaa9dc875d03ffb1dcf62ad2d7971649d61'; /// See also [restoreTachiBkBackup]. @ProviderFor(restoreTachiBkBackup) diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 2a54371d..37506ccb 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -418,7 +418,11 @@ class _NovelWebViewState extends ConsumerState IconButton( onPressed: () async { final manga = chapter.manga.value!; - final source = getSource(manga.lang!, manga.source!)!; + final source = getSource( + manga.lang!, + manga.source!, + manga.sourceId, + )!; String url = chapter.url!.startsWith('/') ? "${source.baseUrl}/${chapter.url!}" : chapter.url!; diff --git a/lib/modules/tracker_library/tracker_item_card.dart b/lib/modules/tracker_library/tracker_item_card.dart index 326c276b..07215c92 100644 --- a/lib/modules/tracker_library/tracker_item_card.dart +++ b/lib/modules/tracker_library/tracker_item_card.dart @@ -284,6 +284,7 @@ class TrackerItemCard extends StatelessWidget { link: null, status: Status.unknown, description: "", + sourceId: null, ), track, ), diff --git a/lib/modules/updates/widgets/update_chapter_list_tile_widget.dart b/lib/modules/updates/widgets/update_chapter_list_tile_widget.dart index 40b162c2..4ec472ae 100644 --- a/lib/modules/updates/widgets/update_chapter_list_tile_widget.dart +++ b/lib/modules/updates/widgets/update_chapter_list_tile_widget.dart @@ -71,6 +71,7 @@ class UpdateChapterListTileWidget extends ConsumerWidget { headersProvider( source: manga.source!, lang: manga.lang!, + sourceId: manga.sourceId, ), ), ), diff --git a/lib/modules/widgets/manga_image_card_widget.dart b/lib/modules/widgets/manga_image_card_widget.dart index faf8b92d..e325dbd3 100644 --- a/lib/modules/widgets/manga_image_card_widget.dart +++ b/lib/modules/widgets/manga_image_card_widget.dart @@ -61,7 +61,11 @@ class MangaImageCardWidget extends ConsumerWidget { : getMangaDetail!.imageUrl ?? "", ), headers: ref.watch( - headersProvider(source: source.name!, lang: source.lang!), + headersProvider( + source: source.name!, + lang: source.lang!, + sourceId: source.id, + ), ), cache: true, cacheMaxAge: const Duration(days: 7), @@ -74,6 +78,7 @@ class MangaImageCardWidget extends ConsumerWidget { lang: source.lang!, source: source.name!, itemType: itemType, + sourceId: source.id, ); }, onLongPress: () { @@ -85,6 +90,7 @@ class MangaImageCardWidget extends ConsumerWidget { source: source.name!, itemType: itemType, addToFavourite: true, + sourceId: source.id, ); }, onSecondaryTap: () { @@ -96,6 +102,7 @@ class MangaImageCardWidget extends ConsumerWidget { source: source.name!, itemType: itemType, addToFavourite: true, + sourceId: source.id, ); }, children: [ @@ -173,7 +180,11 @@ class MangaImageCardListTileWidget extends ConsumerWidget { : getMangaDetail!.imageUrl ?? "", ), headers: ref.watch( - headersProvider(source: source.name!, lang: source.lang!), + headersProvider( + source: source.name!, + lang: source.lang!, + sourceId: source.id, + ), ), ); return Padding( @@ -191,6 +202,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { lang: source.lang!, source: source.name!, itemType: itemType, + sourceId: source.id, ); }, onLongPress: () { @@ -202,6 +214,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { source: source.name!, itemType: itemType, addToFavourite: true, + sourceId: source.id, ); }, onSecondaryTap: () { @@ -213,6 +226,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { source: source.name!, itemType: itemType, addToFavourite: true, + sourceId: source.id, ); }, child: Row( @@ -286,6 +300,7 @@ Future pushToMangaReaderDetail({ required String lang, required BuildContext context, required String source, + required int? sourceId, int? archiveId, Manga? mangaM, ItemType? itemType, @@ -309,6 +324,7 @@ Future pushToMangaReaderDetail({ lastUpdate: 0, itemType: itemType ?? ItemType.manga, artist: getManga.artist ?? '', + sourceId: sourceId, ); final empty = isar.mangas .filter() @@ -334,7 +350,12 @@ Future pushToMangaReaderDetail({ } else { mangaId = archiveId; } - + final mang = isar.mangas.getSync(mangaId); + if (mang!.sourceId == null) { + isar.writeTxnSync(() { + isar.mangas.putSync(mang..sourceId = sourceId); + }); + } final settings = isar.settings.getSync(227)!; final sortList = settings.sortChapterList ?? []; final checkIfExist = sortList diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index f7d0b025..95f27f5b 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; +String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/get_chapter_pages.dart b/lib/services/get_chapter_pages.dart index 907e050b..d3129850 100644 --- a/lib/services/get_chapter_pages.dart +++ b/lib/services/get_chapter_pages.dart @@ -63,6 +63,7 @@ Future getChapterPages( final source = getSource( chapter.manga.value!.lang!, chapter.manga.value!.source!, + chapter.manga.value!.sourceId, )!; if ((isarPageUrls?.urls?.isNotEmpty ?? false) && (isarPageUrls?.chapterUrl ?? chapter.url) == chapter.url) { diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 1e1a160a..6923136c 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart'; // RiverpodGenerator // ************************************************************************** -String _$getChapterPagesHash() => r'8f6d2d661593fc5537f4dda83abea8d46d65b027'; +String _$getChapterPagesHash() => r'129624607a92b6d3a896a03b450862ce1e941ff6'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart index 856febd2..15a0b528 100644 --- a/lib/services/get_html_content.dart +++ b/lib/services/get_html_content.dart @@ -47,6 +47,7 @@ Future<(String, EpubBook?)> getHtmlContent( final source = getSource( chapter.manga.value!.lang!, chapter.manga.value!.source!, + chapter.manga.value!.sourceId, ); String? html; final proxyServer = ref.read(androidProxyServerStateProvider); diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index 3d7dd0dc..c954812d 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -6,7 +6,7 @@ part of 'get_html_content.dart'; // RiverpodGenerator // ************************************************************************** -String _$getHtmlContentHash() => r'c32670ed25b093761c867f5cf1cb5dfe063edc84'; +String _$getHtmlContentHash() => r'fa74506c0adebbdb7a0dda5a8d16a784466b79bb'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_video_list.dart b/lib/services/get_video_list.dart index 6ec34d59..31db1bce 100644 --- a/lib/services/get_video_list.dart +++ b/lib/services/get_video_list.dart @@ -56,12 +56,13 @@ Future<(List

    ( case 56: return (reader.readBoolOrNull(offset)) as P; case 57: + return (reader.readBoolOrNull(offset)) as P; + case 58: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, @@ -1954,12 +1963,10 @@ P _settingsDeserializeProp

    ( FilterScanlator(), )) as P; - case 58: - return (reader.readDoubleOrNull(offset)) as P; case 59: - return (reader.readLongOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 60: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 61: return (reader.readBoolOrNull(offset)) as P; case 62: @@ -1967,17 +1974,17 @@ P _settingsDeserializeProp

    ( case 63: return (reader.readBoolOrNull(offset)) as P; case 64: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 65: - return (reader.readStringOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 66: - return (reader.readBoolOrNull(offset)) as P; - case 67: return (reader.readStringOrNull(offset)) as P; - case 68: + case 67: return (reader.readBoolOrNull(offset)) as P; + case 68: + return (reader.readStringOrNull(offset)) as P; case 69: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 70: return (reader.readLongOrNull(offset)) as P; case 71: @@ -2001,7 +2008,7 @@ P _settingsDeserializeProp

    ( case 80: return (reader.readLongOrNull(offset)) as P; case 81: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 82: return (reader.readBoolOrNull(offset)) as P; case 83: @@ -2011,13 +2018,15 @@ P _settingsDeserializeProp

    ( case 85: return (reader.readBoolOrNull(offset)) as P; case 86: + return (reader.readBoolOrNull(offset)) as P; + case 87: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 87: + case 88: return (reader.readObjectList( offset, RepoSchema.deserialize, @@ -2025,27 +2034,27 @@ P _settingsDeserializeProp

    ( Repo(), )) as P; - case 88: - return (reader.readLongOrNull(offset)) as P; case 89: + return (reader.readLongOrNull(offset)) as P; + case 90: return (_SettingsmangaHomeDisplayTypeValueEnumMap[reader.readByteOrNull( offset, )] ?? DisplayType.comfortableGrid) as P; - case 90: - return (reader.readLongOrNull(offset)) as P; case 91: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 92: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 93: + return (reader.readStringList(offset)) as P; + case 94: return (_SettingsnovelDisplayTypeValueEnumMap[reader.readByteOrNull( offset, )] ?? DisplayType.comfortableGrid) as P; - case 94: + case 95: return (reader.readObjectList( offset, RepoSchema.deserialize, @@ -2053,12 +2062,10 @@ P _settingsDeserializeProp

    ( Repo(), )) as P; - case 95: - return (reader.readLongOrNull(offset)) as P; case 96: return (reader.readLongOrNull(offset)) as P; case 97: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 98: return (reader.readBoolOrNull(offset)) as P; case 99: @@ -2070,16 +2077,18 @@ P _settingsDeserializeProp

    ( case 102: return (reader.readBoolOrNull(offset)) as P; case 103: + return (reader.readBoolOrNull(offset)) as P; + case 104: return (_SettingsnovelTextAlignValueEnumMap[reader.readByteOrNull( offset, )] ?? NovelTextAlign.left) as P; - case 104: - return (reader.readBoolOrNull(offset)) as P; case 105: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 106: + return (reader.readLongOrNull(offset)) as P; + case 107: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, @@ -2087,7 +2096,7 @@ P _settingsDeserializeProp

    ( PersonalPageMode(), )) as P; - case 107: + case 108: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, @@ -2095,19 +2104,17 @@ P _settingsDeserializeProp

    ( PersonalReaderMode(), )) as P; - case 108: + case 109: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 109: - return (reader.readBoolOrNull(offset)) as P; case 110: - return (reader.readLongOrNull(offset)) as P; - case 111: return (reader.readBoolOrNull(offset)) as P; + case 111: + return (reader.readLongOrNull(offset)) as P; case 112: return (reader.readBoolOrNull(offset)) as P; case 113: @@ -2115,12 +2122,14 @@ P _settingsDeserializeProp

    ( case 114: return (reader.readBoolOrNull(offset)) as P; case 115: + return (reader.readBoolOrNull(offset)) as P; + case 116: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 116: - return (reader.readBoolOrNull(offset)) as P; case 117: + return (reader.readBoolOrNull(offset)) as P; + case 118: return (reader.readObjectList( offset, SortChapterSchema.deserialize, @@ -2128,13 +2137,6 @@ P _settingsDeserializeProp

    ( SortChapter(), )) as P; - case 118: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) - as P; case 119: return (reader.readObjectOrNull( offset, @@ -2150,15 +2152,20 @@ P _settingsDeserializeProp

    ( )) as P; case 121: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) + as P; case 122: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 123: return (reader.readBoolOrNull(offset)) as P; case 124: - return (reader.readLongOrNull(offset)) as P; - case 125: return (reader.readBoolOrNull(offset)) as P; + case 125: + return (reader.readLongOrNull(offset)) as P; case 126: return (reader.readBoolOrNull(offset)) as P; case 127: @@ -2166,8 +2173,10 @@ P _settingsDeserializeProp

    ( case 128: return (reader.readBoolOrNull(offset)) as P; case 129: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 130: + return (reader.readStringOrNull(offset)) as P; + case 131: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -6359,6 +6368,38 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableHardwareAccelerationIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNull(property: r'enableHardwareAcceleration'), + ); + }); + } + + QueryBuilder + enableHardwareAccelerationIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const FilterCondition.isNotNull( + property: r'enableHardwareAcceleration', + ), + ); + }); + } + + QueryBuilder + enableHardwareAccelerationEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + FilterCondition.equalTo( + property: r'enableHardwareAcceleration', + value: value, + ), + ); + }); + } + QueryBuilder filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { @@ -11736,6 +11777,20 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByEnableHardwareAcceleration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableHardwareAcceleration', Sort.asc); + }); + } + + QueryBuilder + sortByEnableHardwareAccelerationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableHardwareAcceleration', Sort.desc); + }); + } + QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -13127,6 +13182,20 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByEnableHardwareAcceleration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableHardwareAcceleration', Sort.asc); + }); + } + + QueryBuilder + thenByEnableHardwareAccelerationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableHardwareAcceleration', Sort.desc); + }); + } + QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -14267,6 +14336,13 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByEnableHardwareAcceleration() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableHardwareAcceleration'); + }); + } + QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -15072,6 +15148,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + enableHardwareAccelerationProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableHardwareAcceleration'); + }); + } + QueryBuilder?, QQueryOperations> filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 7500b533..b8ec1d46 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -255,6 +255,7 @@ class _AnimeStreamPageState extends riv.ConsumerState ), ); late final hwdecMode = ref.read(hwdecModeStateProvider()); + late final enableHardwareAccel = ref.read(enableHardwareAccelStateProvider); late final VideoController _controller; late final _streamController = ref.read( animeStreamControllerProvider(episode: widget.episode).notifier, @@ -843,6 +844,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo _player, configuration: VideoControllerConfiguration( hwdec: hwdecMode, + enableHardwareAcceleration: enableHardwareAccel, vo: Platform.isAndroid ? useGpuNext ? "gpu-next" diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index e6f037e2..04d6e22c 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -149,7 +149,7 @@ class _AddDownloadToQueueProviderElement Chapter get chapter => (origin as AddDownloadToQueueProvider).chapter; } -String _$downloadChapterHash() => r'4d008f26f03bf21010742b73cf83643c61f66c2b'; +String _$downloadChapterHash() => r'5eb401736efdfb2990fda6e2d97160aaeb94aec1'; /// See also [downloadChapter]. @ProviderFor(downloadChapter) diff --git a/lib/modules/more/settings/player/player_decoder_screen.dart b/lib/modules/more/settings/player/player_decoder_screen.dart index c11ad34b..9a3d112e 100644 --- a/lib/modules/more/settings/player/player_decoder_screen.dart +++ b/lib/modules/more/settings/player/player_decoder_screen.dart @@ -17,6 +17,7 @@ class PlayerDecoderScreen extends ConsumerStatefulWidget { class _PlayerDecoderScreenState extends ConsumerState { @override Widget build(BuildContext context) { + final enableHardwareAccel = ref.watch(enableHardwareAccelStateProvider); final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final useGpuNext = ref.watch(useGpuNextStateProvider); final debandingType = ref.watch(debandingStateProvider); @@ -27,6 +28,17 @@ class _PlayerDecoderScreenState extends ConsumerState { body: SingleChildScrollView( child: Column( children: [ + SwitchListTile( + value: enableHardwareAccel, + title: Text(context.l10n.enable_hardware_accel), + subtitle: Text( + context.l10n.enable_hardware_accel_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref.read(enableHardwareAccelStateProvider.notifier).set(value); + }, + ), ListTile( onTap: () { final values = [ diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart index 60d2a35f..39d0e21f 100644 --- a/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart @@ -49,6 +49,29 @@ class HwdecModeState extends _$HwdecModeState { } } +@riverpod +class EnableHardwareAccelState extends _$EnableHardwareAccelState { + @override + bool build() { + return isar.settings.getSync(227)!.enableHardwareAcceleration ?? + Platform.isMacOS + ? false + : true; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableHardwareAcceleration = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + @riverpod class DebandingState extends _$DebandingState { @override diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart index 51883fba..99b87592 100644 --- a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart @@ -157,6 +157,23 @@ class _HwdecModeStateProviderElement bool get rawValue => (origin as HwdecModeStateProvider).rawValue; } +String _$enableHardwareAccelStateHash() => + r'4804b699c14a78db9c760ec4eaf8a88bb6ce1b9b'; + +/// See also [EnableHardwareAccelState]. +@ProviderFor(EnableHardwareAccelState) +final enableHardwareAccelStateProvider = + AutoDisposeNotifierProvider.internal( + EnableHardwareAccelState.new, + name: r'enableHardwareAccelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableHardwareAccelStateHash, + dependencies: null, + allTransitiveDependencies: null, + ); + +typedef _$EnableHardwareAccelState = AutoDisposeNotifier; String _$debandingStateHash() => r'b93e2fc826d98cc8bce1aab9a92900353e4d3958'; /// See also [DebandingState]. diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index 95f27f5b..f7d0b025 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index 183e653f..1945ab1f 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'b3c56b172308ecd98c4dd9fb89d17ccc36487754'; +String _$anilistHash() => r'89e86869bd2b807e08beb8b7af507809d8bb9895'; /// Copied from Dart SDK class _SystemHash { From 68e900d9b57dcd6bb0f7ab59bdfb4f7eb7650071 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 28 Aug 2025 17:16:02 +0200 Subject: [PATCH 095/100] updated mpv windows url --- pubspec.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 5c89553b..3adb08f5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1125,7 +1125,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1133,8 +1133,8 @@ packages: dependency: transitive description: path: "libs/android/media_kit_libs_android_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1142,8 +1142,8 @@ packages: dependency: transitive description: path: "libs/ios/media_kit_libs_ios_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1151,8 +1151,8 @@ packages: dependency: transitive description: path: "libs/linux/media_kit_libs_linux" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1160,8 +1160,8 @@ packages: dependency: transitive description: path: "libs/macos/media_kit_libs_macos_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1170,7 +1170,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1178,8 +1178,8 @@ packages: dependency: transitive description: path: "libs/windows/media_kit_libs_windows_video" - ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1188,7 +1188,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: baeecb6aa673e49a173448909a9e15d17d1a9c23 + resolved-ref: "62b08e33590cba8fba4797eaaa1e95b514adb437" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From 78f8dd372f9c153463db6b2404c8117ec23edf81 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 28 Aug 2025 20:19:27 +0200 Subject: [PATCH 096/100] fixed local sources not showing in the extensions screen --- .../browse/extension/providers/extensions_provider.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/modules/browse/extension/providers/extensions_provider.dart b/lib/modules/browse/extension/providers/extensions_provider.dart index 52568963..0d77bf54 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.dart @@ -13,7 +13,11 @@ Stream> getExtensionsStream(Ref ref, ItemType itemType) async* { .filter() .idIsNotNull() .and() - .repo((q) => q.hiddenIsNull().or().hiddenEqualTo(false)) + .group( + (q) => q.repoIsNull().or().repo( + (q) => q.hiddenIsNull().or().hiddenEqualTo(false), + ), + ) .isActiveEqualTo(true) .itemTypeEqualTo(itemType) .watch(fireImmediately: true); From b53df86fc969ae3c05bae90f0398a492e523c420 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 29 Aug 2025 16:25:25 +0100 Subject: [PATCH 097/100] v0.6.5 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5f573899..35b9928a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: mangayomi description: Free and open source manga reader and anime streaming cross-plateform app inspired by Tachiyomi and Aniyomi. publish_to: "none" -version: 0.6.35+86 +version: 0.6.5+87 environment: sdk: ^3.8.1 From 611096d5c0f7bc4f4b8b80f039986ea512a71ee8 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 29 Aug 2025 16:36:58 +0100 Subject: [PATCH 098/100] fix --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 35b9928a..0c664c9d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -161,4 +161,4 @@ inno_bundle: - french - german admin: false - version: 0.6.3 + version: 0.6.5 From 24e59266325e7619a050a50db189fc9aab5ee852 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 29 Aug 2025 17:41:23 +0100 Subject: [PATCH 099/100] Update --- repo/source.json | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/repo/source.json b/repo/source.json index 85485798..21e740f7 100755 --- a/repo/source.json +++ b/repo/source.json @@ -14,25 +14,32 @@ "bundleIdentifier": "com.kodjodevf.mangayomi", "developerName": "Moustapha Kodjo Amadou", "subtitle": "Read manga, novels, and watch anime", - "version": "0.6.35", - "versionDate": "2025-08-05T14:52:24Z", - "versionDescription": "", - "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", + "version": "0.6.5", + "versionDate": "2025-08-29T15:38:32Z", + "versionDescription": "What's Changed\r\n* Show correct version number on Windows by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/542\r\n* re\u2022added full upload and download by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/544\r\n* Fix MAL & Kitsu \"No Cover\" Exception by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/555\r\n* allow to swipe pages even if zoomed in by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/553\r\n* added Anibrain recommendations by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/552\r\n* move history to more screen if hidden by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/549\r\n* added downloaded only mode by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/551\r\n* added quick access to source settings by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/550\r\n* added missing arb entry by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/556\r\n* Refactor select bar widget and unify manga read state logic by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/536\r\n* enhanced mpv player by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/540\r\n* added support for Mihon extensions via ApkBridge by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/559\r\n* fixed local subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/565\r\n* enhanced calendar by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/564\r\n* added subtitles search by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/560\r\n* added watch order by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/562\r\n* changed from labels to icons by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/566\r\n* added Simkl tracker by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/561\r\n* add option to download online subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/567\r\n* fixed Trakt refresh token by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/569\r\n* added button link to the apk by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/570\r\n* added option to turn on/off mpv hardware acceleration by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/571\r\n\r\n\r\n**Full Changelog**: https://github.com/kodjodevf/mangayomi/compare/v0.6.35...v0.6.5", + "downloadURL": null, "localizedDescription": "Mangayomi is an open-source Flutter app for reading manga, novels, and watching anime across multiple platforms.", "iconURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/icons/icon_default.webp", "tintColor": "EF4444", "category": "entertainment", - "size": 59596142, + "size": 59596148, "screenshotURLs": [ "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_0_default.webp", "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_1_default.webp", "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_2_default.webp" ], "versions": [ + { + "version": "0.6.5", + "date": "2025-08-29T15:38:32Z", + "localizedDescription": "What's Changed\r\n* Show correct version number on Windows by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/542\r\n* re\u2022added full upload and download by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/544\r\n* Fix MAL & Kitsu \"No Cover\" Exception by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/555\r\n* allow to swipe pages even if zoomed in by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/553\r\n* added Anibrain recommendations by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/552\r\n* move history to more screen if hidden by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/549\r\n* added downloaded only mode by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/551\r\n* added quick access to source settings by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/550\r\n* added missing arb entry by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/556\r\n* Refactor select bar widget and unify manga read state logic by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/536\r\n* enhanced mpv player by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/540\r\n* added support for Mihon extensions via ApkBridge by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/559\r\n* fixed local subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/565\r\n* enhanced calendar by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/564\r\n* added subtitles search by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/560\r\n* added watch order by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/562\r\n* changed from labels to icons by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/566\r\n* added Simkl tracker by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/561\r\n* add option to download online subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/567\r\n* fixed Trakt refresh token by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/569\r\n* added button link to the apk by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/570\r\n* added option to turn on/off mpv hardware acceleration by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/571\r\n\r\n\r\n**Full Changelog**: https://github.com/kodjodevf/mangayomi/compare/v0.6.35...v0.6.5", + "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", + "size": 59596148 + }, { "version": "0.6.35", "date": "2025-08-05T14:52:24Z", - "localizedDescription": "", + "localizedDescription": "What's Changed\r\n* Fix versioning and packaging issues for Windows and Linux builds; improve packaging consistency by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/515\r\n* Save lastPageRead before system kills app by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/521\r\n* Fix Exception by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/516\r\n* Use icons from macOS folder for linux builds by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/524\r\n* Properly dispose by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/519\r\n* Enhance Performance of Updates and History Screen by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/525\r\n* Improved UX for Migration, Anime Playback & Navigation by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/520\r\n* added support for local epubs and displaying its images by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/527\r\n* added discord rpc by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/526\r\n* added sync for settings by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/528\r\n* No discordRPC for iOS and Android by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/533\r\n* Reduce file size of AppImage by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/532\r\n* Fix regression: restore fullscreen exit logic on desktop by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/531\r\n* Fix MyAnimeList Token Refresh by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/534\r\n* Update manga to display correct number of unread chapters after marking chapters as read/unread by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/535\r\n* Fix AnyhowException (DiscordRPC) when restoring a backup by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/537\r\n* Added Hindi & Assamese Translations by @itsmechinmoy in https://github.com/kodjodevf/mangayomi/pull/538\r\n\r\nNew Contributors\r\n* @itsmechinmoy made their first contribution in https://github.com/kodjodevf/mangayomi/pull/538\r\n\r\n**Full Changelog**: https://github.com/kodjodevf/mangayomi/compare/v0.6.3...v0.6.35", "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", "size": 59596142 }, @@ -189,6 +196,17 @@ "imageURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/news/update_default.webp", "notify": true, "url": "https://github.com/kodjodevf/mangayomi/releases/tag/v0.6.35" + }, + { + "appID": "com.kodjodevf.mangayomi", + "title": "0.6.5 - 29 Aug", + "identifier": "release-0.6.5", + "caption": "Update for Mangayomi now available!", + "date": "2025-08-29T15:38:32Z", + "tintColor": "EF4444", + "imageURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/news/update_default.webp", + "notify": true, + "url": "https://github.com/kodjodevf/mangayomi/releases/tag/v0.6.5" } ] } \ No newline at end of file From 226553710e1033c891342b188a62f6b9266eb992 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 29 Aug 2025 17:43:57 +0100 Subject: [PATCH 100/100] Update --- repo/source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo/source.json b/repo/source.json index 21e740f7..a827cd93 100755 --- a/repo/source.json +++ b/repo/source.json @@ -33,7 +33,7 @@ "version": "0.6.5", "date": "2025-08-29T15:38:32Z", "localizedDescription": "What's Changed\r\n* Show correct version number on Windows by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/542\r\n* re\u2022added full upload and download by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/544\r\n* Fix MAL & Kitsu \"No Cover\" Exception by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/555\r\n* allow to swipe pages even if zoomed in by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/553\r\n* added Anibrain recommendations by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/552\r\n* move history to more screen if hidden by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/549\r\n* added downloaded only mode by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/551\r\n* added quick access to source settings by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/550\r\n* added missing arb entry by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/556\r\n* Refactor select bar widget and unify manga read state logic by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/536\r\n* enhanced mpv player by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/540\r\n* added support for Mihon extensions via ApkBridge by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/559\r\n* fixed local subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/565\r\n* enhanced calendar by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/564\r\n* added subtitles search by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/560\r\n* added watch order by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/562\r\n* changed from labels to icons by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/566\r\n* added Simkl tracker by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/561\r\n* add option to download online subtitles by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/567\r\n* fixed Trakt refresh token by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/569\r\n* added button link to the apk by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/570\r\n* added option to turn on/off mpv hardware acceleration by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/571\r\n\r\n\r\n**Full Changelog**: https://github.com/kodjodevf/mangayomi/compare/v0.6.35...v0.6.5", - "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", + "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.5/Mangayomi-v0.6.5-ios.ipa", "size": 59596148 }, {

    ( case 71: return (reader.readLongOrNull(offset)) as P; case 72: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 73: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 74: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 75: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 76: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 77: + return (reader.readBoolOrNull(offset)) as P; + case 78: + return (reader.readBoolOrNull(offset)) as P; + case 79: + return (reader.readBoolOrNull(offset)) as P; + case 80: + return (reader.readBoolOrNull(offset)) as P; + case 81: + return (reader.readBoolOrNull(offset)) as P; + case 82: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 78: + case 83: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 79: + case 84: return (reader.readLongOrNull(offset)) as P; - case 80: + case 85: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 81: + case 86: return (reader.readLongOrNull(offset)) as P; - case 82: + case 87: return (reader.readBoolOrNull(offset)) as P; - case 83: + case 88: return (reader.readStringList(offset)) as P; - case 84: + case 89: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 85: + case 90: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 86: - return (reader.readLongOrNull(offset)) as P; - case 87: - return (reader.readLongOrNull(offset)) as P; - case 88: - return (reader.readBoolOrNull(offset)) as P; - case 89: - return (reader.readBoolOrNull(offset)) as P; - case 90: - return (reader.readBoolOrNull(offset)) as P; case 91: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 92: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 93: return (reader.readBoolOrNull(offset)) as P; case 94: - return (_SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offset)] ?? - NovelTextAlign.left) as P; + return (reader.readBoolOrNull(offset)) as P; case 95: return (reader.readBoolOrNull(offset)) as P; case 96: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 97: + return (reader.readBoolOrNull(offset)) as P; + case 98: + return (reader.readBoolOrNull(offset)) as P; + case 99: + return (_SettingsnovelTextAlignValueEnumMap[ + reader.readByteOrNull(offset)] ?? + NovelTextAlign.left) as P; + case 100: + return (reader.readBoolOrNull(offset)) as P; + case 101: + return (reader.readLongOrNull(offset)) as P; + case 102: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 98: + case 103: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 99: + case 104: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 100: - return (reader.readBoolOrNull(offset)) as P; - case 101: - return (reader.readLongOrNull(offset)) as P; - case 102: - return (reader.readBoolOrNull(offset)) as P; - case 103: - return (reader.readBoolOrNull(offset)) as P; - case 104: - return (reader.readBoolOrNull(offset)) as P; case 105: return (reader.readBoolOrNull(offset)) as P; case 106: - return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; + return (reader.readLongOrNull(offset)) as P; case 107: return (reader.readBoolOrNull(offset)) as P; case 108: + return (reader.readBoolOrNull(offset)) as P; + case 109: + return (reader.readBoolOrNull(offset)) as P; + case 110: + return (reader.readBoolOrNull(offset)) as P; + case 111: + return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ScaleType.fitScreen) as P; + case 112: + return (reader.readBoolOrNull(offset)) as P; + case 113: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 109: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 110: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 111: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 112: - return (reader.readLongOrNull(offset)) as P; - case 113: - return (reader.readBoolOrNull(offset)) as P; case 114: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 115: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 116: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 117: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 118: return (reader.readBoolOrNull(offset)) as P; case 119: + return (reader.readBoolOrNull(offset)) as P; + case 120: + return (reader.readLongOrNull(offset)) as P; + case 121: + return (reader.readBoolOrNull(offset)) as P; + case 122: + return (reader.readBoolOrNull(offset)) as P; + case 123: + return (reader.readBoolOrNull(offset)) as P; + case 124: + return (reader.readBoolOrNull(offset)) as P; + case 125: return (reader.readStringOrNull(offset)) as P; + case 126: + return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -1886,6 +1965,20 @@ const _SettingsanimeDisplayTypeValueEnumMap = { 2: DisplayType.coverOnlyGrid, 3: DisplayType.list, }; +const _SettingsaudioChannelsEnumValueMap = { + 'auto': 0, + 'autoSafe': 1, + 'mono': 2, + 'stereo': 3, + 'reverseStereo': 4, +}; +const _SettingsaudioChannelsValueEnumMap = { + 0: AudioChannel.auto, + 1: AudioChannel.autoSafe, + 2: AudioChannel.mono, + 3: AudioChannel.stereo, + 4: AudioChannel.reverseStereo, +}; const _SettingsbackgroundColorEnumValueMap = { 'black': 0, 'grey': 1, @@ -1928,6 +2021,16 @@ const _SettingscolorFilterBlendModeValueEnumMap = { 11: ColorFilterBlendMode.plus, 12: ColorFilterBlendMode.exclusion, }; +const _SettingsdebandingTypeEnumValueMap = { + 'none': 0, + 'cpu': 1, + 'gpu': 2, +}; +const _SettingsdebandingTypeValueEnumMap = { + 0: DebandingType.none, + 1: DebandingType.cpu, + 2: DebandingType.gpu, +}; const _SettingsdefaultReaderModeEnumValueMap = { 'vertical': 0, 'ltr': 1, @@ -2766,6 +2869,216 @@ extension SettingsQueryFilter }); } + QueryBuilder audioChannelsEqualTo( + AudioChannel value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder + audioChannelsGreaterThan( + AudioChannel value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder audioChannelsLessThan( + AudioChannel value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder audioChannelsBetween( + AudioChannel lower, + AudioChannel upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'audioChannels', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'audioPreferredLanguages', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'audioPreferredLanguages', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'audioPreferredLanguages', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'audioPreferredLanguages', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: '', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'audioPreferredLanguages', + value: '', + )); + }); + } + QueryBuilder autoBackupLocationIsNull() { return QueryBuilder.apply(this, (query) { @@ -4620,6 +4933,60 @@ extension SettingsQueryFilter }); } + QueryBuilder debandingTypeEqualTo( + DebandingType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder + debandingTypeGreaterThan( + DebandingType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder debandingTypeLessThan( + DebandingType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder debandingTypeBetween( + DebandingType lower, + DebandingType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'debandingType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder defaultDoubleTapToSkipLengthIsNull() { return QueryBuilder.apply(this, (query) { @@ -5320,6 +5687,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableAudioPitchCorrectionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enableAudioPitchCorrection', + )); + }); + } + + QueryBuilder + enableAudioPitchCorrectionIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enableAudioPitchCorrection', + )); + }); + } + + QueryBuilder + enableAudioPitchCorrectionEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enableAudioPitchCorrection', + value: value, + )); + }); + } + QueryBuilder enableAutoSkipIsNull() { return QueryBuilder.apply(this, (query) { @@ -5404,6 +5799,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableGpuNextIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enableGpuNext', + )); + }); + } + + QueryBuilder + enableGpuNextIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enableGpuNext', + )); + }); + } + + QueryBuilder enableGpuNextEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enableGpuNext', + value: value, + )); + }); + } + QueryBuilder filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { @@ -9672,6 +10095,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useYUV420PIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useYUV420P', + )); + }); + } + + QueryBuilder + useYUV420PIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useYUV420P', + )); + }); + } + + QueryBuilder useYUV420PEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useYUV420P', + value: value, + )); + }); + } + QueryBuilder userAgentIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -9818,6 +10268,79 @@ extension SettingsQueryFilter )); }); } + + QueryBuilder + volumeBoostCapIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'volumeBoostCap', + )); + }); + } + + QueryBuilder + volumeBoostCapIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'volumeBoostCap', + )); + }); + } + + QueryBuilder volumeBoostCapEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder + volumeBoostCapGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder + volumeBoostCapLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder volumeBoostCapBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volumeBoostCap', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } } extension SettingsQueryObject @@ -10182,6 +10705,32 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.asc); + }); + } + + QueryBuilder sortByAudioChannelsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.desc); + }); + } + + QueryBuilder + sortByAudioPreferredLanguages() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.asc); + }); + } + + QueryBuilder + sortByAudioPreferredLanguagesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.desc); + }); + } + QueryBuilder sortByAutoBackupLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.asc); @@ -10347,6 +10896,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.asc); + }); + } + + QueryBuilder sortByDebandingTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.desc); + }); + } + QueryBuilder sortByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -10476,6 +11037,20 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); + }); + } + + QueryBuilder + sortByEnableAudioPitchCorrectionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); + }); + } + QueryBuilder sortByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -10514,6 +11089,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.asc); + }); + } + + QueryBuilder sortByEnableGpuNextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.desc); + }); + } + QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -11275,6 +11862,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.asc); + }); + } + + QueryBuilder sortByUseYUV420PDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.desc); + }); + } + QueryBuilder sortByUserAgent() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'userAgent', Sort.asc); @@ -11286,6 +11885,18 @@ extension SettingsQuerySortBy on QueryBuilder { return query.addSortBy(r'userAgent', Sort.desc); }); } + + QueryBuilder sortByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.asc); + }); + } + + QueryBuilder sortByVolumeBoostCapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.desc); + }); + } } extension SettingsQuerySortThenBy @@ -11439,6 +12050,32 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.asc); + }); + } + + QueryBuilder thenByAudioChannelsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.desc); + }); + } + + QueryBuilder + thenByAudioPreferredLanguages() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.asc); + }); + } + + QueryBuilder + thenByAudioPreferredLanguagesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.desc); + }); + } + QueryBuilder thenByAutoBackupLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.asc); @@ -11604,6 +12241,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.asc); + }); + } + + QueryBuilder thenByDebandingTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.desc); + }); + } + QueryBuilder thenByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -11733,6 +12382,20 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); + }); + } + + QueryBuilder + thenByEnableAudioPitchCorrectionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); + }); + } + QueryBuilder thenByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -11771,6 +12434,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.asc); + }); + } + + QueryBuilder thenByEnableGpuNextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.desc); + }); + } + QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -12544,6 +13219,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.asc); + }); + } + + QueryBuilder thenByUseYUV420PDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.desc); + }); + } + QueryBuilder thenByUserAgent() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'userAgent', Sort.asc); @@ -12555,6 +13242,18 @@ extension SettingsQuerySortThenBy return query.addSortBy(r'userAgent', Sort.desc); }); } + + QueryBuilder thenByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.asc); + }); + } + + QueryBuilder thenByVolumeBoostCapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.desc); + }); + } } extension SettingsQueryWhereDistinct @@ -12634,6 +13333,20 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'audioChannels'); + }); + } + + QueryBuilder distinctByAudioPreferredLanguages( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'audioPreferredLanguages', + caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByAutoBackupLocation( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -12726,6 +13439,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'debandingType'); + }); + } + QueryBuilder distinctByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -12791,6 +13510,13 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableAudioPitchCorrection'); + }); + } + QueryBuilder distinctByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAutoSkip'); @@ -12810,6 +13536,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableGpuNext'); + }); + } + QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -13202,12 +13934,24 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useYUV420P'); + }); + } + QueryBuilder distinctByUserAgent( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'userAgent', caseSensitive: caseSensitive); }); } + + QueryBuilder distinctByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volumeBoostCap'); + }); + } } extension SettingsQueryProperty @@ -13300,6 +14044,20 @@ extension SettingsQueryProperty }); } + QueryBuilder + audioChannelsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'audioChannels'); + }); + } + + QueryBuilder + audioPreferredLanguagesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'audioPreferredLanguages'); + }); + } + QueryBuilder autoBackupLocationProperty() { return QueryBuilder.apply(this, (query) { @@ -13447,6 +14205,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + debandingTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'debandingType'); + }); + } + QueryBuilder defaultDoubleTapToSkipLengthProperty() { return QueryBuilder.apply(this, (query) { @@ -13520,6 +14285,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + enableAudioPitchCorrectionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableAudioPitchCorrection'); + }); + } + QueryBuilder enableAutoSkipProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAutoSkip'); @@ -13539,6 +14311,12 @@ extension SettingsQueryProperty }); } + QueryBuilder enableGpuNextProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableGpuNext'); + }); + } + QueryBuilder?, QQueryOperations> filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { @@ -14011,11 +14789,23 @@ extension SettingsQueryProperty }); } + QueryBuilder useYUV420PProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useYUV420P'); + }); + } + QueryBuilder userAgentProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'userAgent'); }); } + + QueryBuilder volumeBoostCapProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volumeBoostCap'); + }); + } } // ************************************************************************** diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index c7748744..385b5a3b 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -17,6 +17,7 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/video.dart' as vid; import 'package:mangayomi/modules/anime/providers/anime_player_controller_provider.dart'; import 'package:mangayomi/modules/anime/widgets/aniskip_countdown_btn.dart'; @@ -28,6 +29,8 @@ import 'package:mangayomi/modules/anime/widgets/subtitle_view.dart'; import 'package:mangayomi/modules/anime/widgets/subtitle_setting_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_audio_state_provider.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_decoder_state_provider.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; @@ -191,11 +194,32 @@ class _AnimeStreamPageState extends riv.ConsumerState late final GlobalKey _key = GlobalKey(); late final useLibass = ref.read(useLibassStateProvider); late final useMpvConfig = ref.read(useMpvConfigStateProvider); + late final useGpuNext = ref.read(useGpuNextStateProvider); + late final debandingType = ref.read(debandingStateProvider); + late final useYUV420P = ref.read(useYUV420PStateProvider); + late final audioPreferredLang = ref.read(audioPreferredLangStateProvider); + late final enableAudioPitchCorrection = ref.read( + enableAudioPitchCorrectionStateProvider, + ); + late final audioChannel = ref.read(audioChannelStateProvider); + late final volumeBoostCap = ref.read(volumeBoostCapStateProvider); late final Player _player = Player( configuration: PlayerConfiguration( libass: useLibass, config: true, configDir: useMpvConfig ? widget.mpvDirectory?.path ?? "" : "", + options: { + if (debandingType == DebandingType.cpu) "vf": "gradfun=radius=12", + if (debandingType == DebandingType.gpu) "deband": "yes", + if (useYUV420P) "vf": "format=yuv420p", + "alang": audioPreferredLang, + if (enableAudioPitchCorrection) "audio-pitch-correction": "yes", + "volume-max": "${volumeBoostCap + 100}", + if (audioChannel != AudioChannel.reverseStereo) + "audio-channels": audioChannel.mpvName, + if (audioChannel == AudioChannel.reverseStereo) + "af": audioChannel.mpvName, + }, observeProperties: { "user-data/aniyomi/show_text": generated.mpv_format.MPV_FORMAT_NODE, "user-data/aniyomi/toggle_ui": generated.mpv_format.MPV_FORMAT_NODE, @@ -231,7 +255,14 @@ class _AnimeStreamPageState extends riv.ConsumerState late final hwdecMode = ref.read(hwdecModeStateProvider()); late final VideoController _controller = VideoController( _player, - configuration: VideoControllerConfiguration(hwdec: hwdecMode), + configuration: VideoControllerConfiguration( + hwdec: hwdecMode, + vo: Platform.isAndroid + ? useGpuNext + ? "gpu-next" + : "gpu" + : "libmpv", + ), ); late final _streamController = ref.read( animeStreamControllerProvider(episode: widget.episode).notifier, @@ -261,6 +292,7 @@ class _AnimeStreamPageState extends riv.ConsumerState final ValueNotifier _currentChapterMark = ValueNotifier(null); final ValueNotifier _selectedShader = ValueNotifier(""); final ValueNotifier _customButton = ValueNotifier(null); + final ValueNotifier?> _customButtons = ValueNotifier(null); late final ValueNotifier<_AniSkipPhase> _skipPhase = ValueNotifier( _AniSkipPhase.none, ); @@ -270,6 +302,10 @@ class _AnimeStreamPageState extends riv.ConsumerState bool _hasEndingSkip = false; bool _initSubtitleAndAudio = true; bool _includeSubtitles = false; + int _subDelay = 0; + final _subDelayController = TextEditingController(text: "0"); + double _subSpeed = 1; + final _subSpeedController = TextEditingController(text: "1"); int lastRpcTimestampUpdate = DateTime.now().millisecondsSinceEpoch; late final StreamSubscription _currentPositionSub; @@ -309,8 +345,10 @@ class _AnimeStreamPageState extends riv.ConsumerState generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE) { final prop = event.ref.data.cast(); final propName = prop.ref.name.cast().toDartString(); - if (propName.startsWith("user-data/")) { - print("DEBUG 00: $propName - ${prop.ref.format}"); + if (kDebugMode) { + if (propName.startsWith("user-data/")) { + print("DEBUG 00: $propName - ${prop.ref.format}"); + } } if (propName.startsWith("user-data/") && prop.ref.format == generated.mpv_format.MPV_FORMAT_NODE) { @@ -469,9 +507,6 @@ class _AnimeStreamPageState extends riv.ConsumerState case "aniyomi/seek_by": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); - final tt = await nativePlayer.getProperty( - "user-data/current-anime/intro-length", - ); if (text.isEmpty) break; final data = int.parse(text.replaceAll("\"", "")); final pos = _currentPosition.value.inSeconds + data; @@ -679,6 +714,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo "call_button_${primaryButton.id}_long", ]), ); + _customButtons.value = customButtons; } void pushToNewEpisode(BuildContext context, Chapter episode) { @@ -753,6 +789,47 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo } } + void _onSubDelayChanged() { + final nativePlayer = (_player.platform as NativePlayer); + final delayMs = int.tryParse(_subDelayController.text); + if (delayMs != null) { + final namePtr = "sub-delay".toNativeUtf8(); + final valuePtr = calloc(1)..value = delayMs / 1000; + nativePlayer.mpv.mpv_set_property( + nativePlayer.ctx, + namePtr.cast(), + generated.mpv_format.MPV_FORMAT_DOUBLE, + valuePtr.cast(), + ); + malloc.free(namePtr); + malloc.free(valuePtr); + _subDelay = delayMs; + } + } + + void _onSubSpeedChanged() { + final nativePlayer = (_player.platform as NativePlayer); + final speed = double.tryParse(_subSpeedController.text); + if (speed != null) { + final namePtr = "sub-speed".toNativeUtf8(); + final valuePtr = calloc(1) + ..value = speed < 0.1 + ? 0.1 + : speed > 10 + ? 10 + : speed; + nativePlayer.mpv.mpv_set_property( + nativePlayer.ctx, + namePtr.cast(), + generated.mpv_format.MPV_FORMAT_DOUBLE, + valuePtr.cast(), + ); + malloc.free(namePtr); + malloc.free(valuePtr); + _subSpeed = speed; + } + } + @override void initState() { super.initState(); @@ -798,6 +875,8 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo _initCustomButton(); discordRpc?.showChapterDetails(ref, widget.episode); _currentPosition.addListener(_updateRpcTimestamp); + _subDelayController.addListener(_onSubDelayChanged); + _subSpeedController.addListener(_onSubSpeedChanged); WidgetsBinding.instance.addObserver(this); } @@ -886,6 +965,8 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo discordRpc?.showIdleText(); discordRpc?.showOriginalTimestamp(); _currentPosition.dispose(); + _subDelayController.dispose(); + _subSpeedController.dispose(); super.dispose(); } @@ -1117,6 +1198,91 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12), child: Column( children: [ + Row( + children: [ + Text(context.l10n.subtitle_delay_text), + IconButton( + onPressed: () { + _subDelay = 0; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + _subSpeed = 1; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 15), + Row( + children: [ + IconButton( + onPressed: () { + _subDelay -= 50; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + }, + icon: const Icon(Icons.remove_circle), + ), + Expanded( + child: TextFormField( + controller: _subDelayController, + keyboardType: TextInputType.number, + decoration: InputDecoration( + isDense: true, + label: Text(context.l10n.subtitle_delay), + ), + ), + ), + IconButton( + onPressed: () { + _subDelay += 50; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + }, + icon: const Icon(Icons.add_circle), + ), + ], + ), + const SizedBox(height: 15), + Row( + children: [ + IconButton( + onPressed: () { + _subSpeed -= 0.01; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.remove_circle), + ), + Expanded( + child: TextFormField( + controller: _subSpeedController, + keyboardType: TextInputType.numberWithOptions(decimal: true), + decoration: InputDecoration( + isDense: true, + label: Text(context.l10n.subtitle_speed), + ), + ), + ), + IconButton( + onPressed: () { + _subSpeed += 0.01; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.add_circle), + ), + ], + ), + const SizedBox(height: 15), ...videoSubtitleLast.toSet().toList().map((sub) { final title = sub.title ?? @@ -1522,6 +1688,111 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo ); } + List _buildMpvSettingsButton(BuildContext context) { + return [ + PopupMenuButton( + tooltip: 'Shaders', + icon: const Icon(Icons.high_quality, color: Colors.white), + itemBuilder: (context) => + [ + ("Anime4K: Mode A (Fast)", "set_anime_a"), + ("Anime4K: Mode B (Fast)", "set_anime_b"), + ("Anime4K: Mode C (Fast)", "set_anime_c"), + ("Anime4K: Mode A+A (Fast)", "set_anime_aa"), + ("Anime4K: Mode B+B (Fast)", "set_anime_bb"), + ("Anime4K: Mode C+A (Fast)", "set_anime_ca"), + ("Anime4K: Mode A (HQ)", "set_anime_hq_a"), + ("Anime4K: Mode B (HQ)", "set_anime_hq_b"), + ("Anime4K: Mode C (HQ)", "set_anime_hq_c"), + ("Anime4K: Mode A+A (HQ)", "set_anime_hq_aa"), + ("Anime4K: Mode B+B (HQ)", "set_anime_hq_bb"), + ("Anime4K: Mode C+A (HQ)", "set_anime_hq_ca"), + ("AMD FSR", "set_fsr"), + ("Luma Upscaling", "set_luma"), + ("Qualcomm Snapdragon GSR", "set_snapdragon"), + ("NVIDIA Image Scaling", "set_nvidia"), + ("Clear GLSL shaders", "clear_anime"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-message", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), + PopupMenuButton( + tooltip: 'Stats', + icon: const Icon(Icons.memory, color: Colors.white), + itemBuilder: (context) => + [ + ("Stats Toggle", "stats/display-stats-toggle"), + ("Stats Page 1", "stats/display-page-1"), + ("Stats Page 2", "stats/display-page-2"), + ("Stats Page 3", "stats/display-page-3"), + ("Stats Page 4", "stats/display-page-4"), + ("Stats Page 5", "stats/display-page-5"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-binding", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), + ValueListenableBuilder( + valueListenable: _customButtons, + builder: (context, value, child) => value != null + ? PopupMenuButton( + tooltip: context.l10n.custom_buttons, + icon: const Icon(Icons.terminal, color: Colors.white), + itemBuilder: (context) => value + .map( + (btn) => PopupMenuItem( + value: btn.title!, + child: Text(btn.title!), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-message", + "call_button_${btn.id}", + ]); + }, + ), + ) + .toList(), + ) + : Container(), + ), + ]; + } + /// helper method for _mobileBottomButtonBar() and _desktopBottomButtonBar() Widget _buildSettingsButtons(BuildContext context) { final isFullscreen = ref.watch(fullscreenProvider); @@ -1532,85 +1803,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo onPressed: () => _videoSettingDraggableMenu(context), icon: const Icon(Icons.video_settings, color: Colors.white), ), - if (useMpvConfig) - PopupMenuButton( - tooltip: '', // Remove default tooltip "Show menu" for consistency - icon: const Icon(Icons.high_quality, color: Colors.white), - itemBuilder: (context) => - [ - ("Anime4K: Mode A (Fast)", "set_anime_a"), - ("Anime4K: Mode B (Fast)", "set_anime_b"), - ("Anime4K: Mode C (Fast)", "set_anime_c"), - ("Anime4K: Mode A+A (Fast)", "set_anime_aa"), - ("Anime4K: Mode B+B (Fast)", "set_anime_bb"), - ("Anime4K: Mode C+A (Fast)", "set_anime_ca"), - ("Anime4K: Mode A (HQ)", "set_anime_hq_a"), - ("Anime4K: Mode B (HQ)", "set_anime_hq_b"), - ("Anime4K: Mode C (HQ)", "set_anime_hq_c"), - ("Anime4K: Mode A+A (HQ)", "set_anime_hq_aa"), - ("Anime4K: Mode B+B (HQ)", "set_anime_hq_bb"), - ("Anime4K: Mode C+A (HQ)", "set_anime_hq_ca"), - ("AMD FSR", "set_fsr"), - ("Luma Upscaling", "set_luma"), - ("Qualcomm Snapdragon GSR", "set_snapdragon"), - ("NVIDIA Image Scaling", "set_nvidia"), - ("Clear GLSL shaders", "clear_anime"), - ] - .map( - (mode) => PopupMenuItem( - value: mode.$1, - child: Text( - mode.$1, - style: TextStyle( - fontWeight: _selectedShader.value == mode.$1 - ? FontWeight.w900 - : FontWeight.normal, - ), - ), - onTap: () { - (_player.platform as NativePlayer).command([ - "script-message", - mode.$2, - ]); - }, - ), - ) - .toList(), - ), - if (useMpvConfig) - PopupMenuButton( - tooltip: '', // Remove default tooltip "Show menu" for consistency - icon: const Icon(Icons.terminal, color: Colors.white), - itemBuilder: (context) => - [ - ("Stats Toggle", "stats/display-stats-toggle"), - ("Stats Page 1", "stats/display-page-1"), - ("Stats Page 2", "stats/display-page-2"), - ("Stats Page 3", "stats/display-page-3"), - ("Stats Page 4", "stats/display-page-4"), - ("Stats Page 5", "stats/display-page-5"), - ] - .map( - (mode) => PopupMenuItem( - value: mode.$1, - child: Text( - mode.$1, - style: TextStyle( - fontWeight: _selectedShader.value == mode.$1 - ? FontWeight.w900 - : FontWeight.normal, - ), - ), - onTap: () { - (_player.platform as NativePlayer).command([ - "script-binding", - mode.$2, - ]); - }, - ), - ) - .toList(), - ), + if (useMpvConfig) ..._buildMpvSettingsButton(context), PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.speed, color: Colors.white), diff --git a/lib/modules/more/settings/player/player_advanced_screen.dart b/lib/modules/more/settings/player/player_advanced_screen.dart new file mode 100644 index 00000000..e891bf94 --- /dev/null +++ b/lib/modules/more/settings/player/player_advanced_screen.dart @@ -0,0 +1,138 @@ +import 'dart:io'; + +import 'package:archive/archive.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/providers/storage_provider.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:path/path.dart' as path; +import 'package:permission_handler/permission_handler.dart'; + +class PlayerAdvancedScreen extends ConsumerStatefulWidget { + const PlayerAdvancedScreen({super.key}); + + @override + ConsumerState createState() => + _PlayerAdvancedScreenState(); +} + +class _PlayerAdvancedScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final useMpvConfig = ref.watch(useMpvConfigStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.advanced)), + body: SingleChildScrollView( + child: Column( + children: [ + SwitchListTile( + value: useMpvConfig, + title: Text(context.l10n.enable_mpv), + subtitle: Text( + context.l10n.mpv_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) async { + if (value && !(await _checkMpvConfig(context))) { + return; + } + ref.read(useMpvConfigStateProvider.notifier).set(value); + }, + ), + ListTile( + onTap: () { + _checkMpvConfig(context, redownload: true); + }, + title: Text(context.l10n.mpv_redownload), + subtitle: Text( + context.l10n.mpv_redownload_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + ], + ), + ), + ); + } + + Future _checkMpvConfig( + BuildContext context, { + bool redownload = false, + }) async { + var status = await Permission.storage.status; + if (!status.isGranted) { + await Permission.storage.request(); + } + 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 ((redownload || filesMissing) && context.mounted) { + final res = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Text(context.l10n.mpv_download), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(context.l10n.cancel), + ), + const SizedBox(width: 15), + ElevatedButton( + onPressed: () async { + final bytes = await rootBundle.load( + "assets/mangayomi_mpv.zip", + ); + final archive = ZipDecoder().decodeBytes( + bytes.buffer.asUint8List(), + ); + String shadersDir = path.join(dir.path, 'shaders'); + await Directory(shadersDir).create(recursive: true); + String scriptsDir = path.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")) { + final scriptFile = File( + '$scriptsDir/${file.name.split("/").last}', + ); + await scriptFile.writeAsBytes(file.content); + } + } + if (context.mounted) { + Navigator.pop(context, "ok"); + } + }, + child: Text(context.l10n.download), + ), + ], + ), + ], + ); + }, + ); + return res != null && res == "ok"; + } + return context.mounted; + } +} diff --git a/lib/modules/more/settings/player/player_audio_screen.dart b/lib/modules/more/settings/player/player_audio_screen.dart new file mode 100644 index 00000000..ceb75e1d --- /dev/null +++ b/lib/modules/more/settings/player/player_audio_screen.dart @@ -0,0 +1,236 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/l10n/generated/app_localizations.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_audio_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class PlayerAudioScreen extends ConsumerStatefulWidget { + const PlayerAudioScreen({super.key}); + + @override + ConsumerState createState() => _PlayerAudioScreenState(); +} + +class _PlayerAudioScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final audioPreferredLang = ref.watch(audioPreferredLangStateProvider); + final enableAudioPitchCorrection = ref.watch( + enableAudioPitchCorrectionStateProvider, + ); + final audioChannel = ref.watch(audioChannelStateProvider); + final volumeBoostCap = ref.watch(volumeBoostCapStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.video_audio)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTile( + onTap: () => _showEditController(), + title: Text(context.l10n.audio_preferred_languages), + subtitle: Text( + audioPreferredLang, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: enableAudioPitchCorrection, + title: Text(context.l10n.enable_audio_pitch_correction), + subtitle: Text( + context.l10n.enable_audio_pitch_correction_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref + .read(enableAudioPitchCorrectionStateProvider.notifier) + .set(value); + }, + ), + ListTile( + onTap: () { + final values = [ + (AudioChannel.auto, "Auto"), + (AudioChannel.autoSafe, "Auto-safe"), + (AudioChannel.mono, "Mono"), + (AudioChannel.stereo, "Stereo"), + (AudioChannel.reverseStereo, "Reverse stereo"), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.audio_channels), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: audioChannel, + onChanged: (value) { + ref + .read(audioChannelStateProvider.notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.audio_channels), + subtitle: Text( + audioChannel.name, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + Padding( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.volume_boost_cap), + Text( + "$volumeBoostCap", + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 200, + value: volumeBoostCap.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + ref + .read(volumeBoostCapStateProvider.notifier) + .set(value.toInt()); + }, + onChangeEnd: (value) { + ref + .read(volumeBoostCapStateProvider.notifier) + .set(value.toInt()); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + + void _showEditController() { + final audioPreferredLang = ref.read(audioPreferredLangStateProvider); + final langCodes = AppLocalizations.supportedLocales + .map((e) => e.languageCode) + .toList(); + bool isLangCodeError = false; + final textController = TextEditingController(text: audioPreferredLang); + showDialog( + context: context, + builder: (context) { + return StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Column( + children: [ + Text(context.l10n.audio_preferred_languages), + Text( + context.l10n.audio_preferred_languages_info, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ], + ), + content: SizedBox( + width: context.width(0.8), + child: CustomTextFormField( + controller: textController, + context: context, + isMissing: isLangCodeError, + val: (text) => setState(() { + isLangCodeError = text + .split(",") + .any((e) => !langCodes.contains(e)); + }), + missing: (_) {}, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + TextButton( + onPressed: () { + ref + .read(audioPreferredLangStateProvider.notifier) + .set(textController.text); + Navigator.pop(context); + }, + child: Text( + context.l10n.ok, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + ); + } +} diff --git a/lib/modules/more/settings/player/player_decoder_screen.dart b/lib/modules/more/settings/player/player_decoder_screen.dart new file mode 100644 index 00000000..3c63f5b2 --- /dev/null +++ b/lib/modules/more/settings/player/player_decoder_screen.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_decoder_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class PlayerDecoderScreen extends ConsumerStatefulWidget { + const PlayerDecoderScreen({super.key}); + + @override + ConsumerState createState() => + _PlayerDecoderScreenState(); +} + +class _PlayerDecoderScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); + final useGpuNext = ref.watch(useGpuNextStateProvider); + final debandingType = ref.watch(debandingStateProvider); + final useYUV420P = ref.watch(useYUV420PStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.decoder)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTile( + onTap: () { + final values = [ + ("no", ""), + ("auto", ""), + ("d3d11va", "(Windows 8+)"), + ("d3d11va-copy", "(Windows 8+)"), + ("videotoolbox", "(iOS 9.0+)"), + ("videotoolbox-copy", "(iOS 9.0+)"), + ("nvdec", "(CUDA)"), + ("nvdec-copy", "(CUDA)"), + ("mediacodec", "- HW (Android)"), + ("mediacodec-copy", "- HW+ (Android)"), + ("crystalhd", ""), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.hwdec), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: hwdecMode, + onChanged: (value) { + ref + .read( + hwdecModeStateProvider( + rawValue: true, + ).notifier, + ) + .set(value!); + Navigator.pop(context); + }, + title: Row( + children: [ + Text( + "${values[index].$1} ${values[index].$2}", + ), + ], + ), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.hwdec), + subtitle: Text( + hwdecMode, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: useGpuNext, + title: Text(context.l10n.enable_gpu_next), + subtitle: Text( + context.l10n.enable_gpu_next_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref.read(useGpuNextStateProvider.notifier).set(value); + }, + ), + ListTile( + onTap: () { + final values = [ + (DebandingType.none, "None"), + (DebandingType.cpu, "CPU"), + (DebandingType.gpu, "GPU"), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.debanding), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: debandingType, + onChanged: (value) { + ref + .read(debandingStateProvider.notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.debanding), + subtitle: Text( + debandingType.name, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: useYUV420P, + title: Text(context.l10n.use_yuv420p), + subtitle: Text( + context.l10n.use_yuv420p_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref.read(useYUV420PStateProvider.notifier).set(value); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_overview_screen.dart b/lib/modules/more/settings/player/player_overview_screen.dart new file mode 100644 index 00000000..04b98d83 --- /dev/null +++ b/lib/modules/more/settings/player/player_overview_screen.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; + +class PlayerOverviewScreen extends StatelessWidget { + const PlayerOverviewScreen({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = l10nLocalizations(context); + return Scaffold( + appBar: AppBar(title: Text(l10n!.player)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTileWidget( + title: l10n.internal_player, + subtitle: l10n.internal_player_info, + icon: Icons.play_circle_outline_outlined, + onTap: () => context.push('/playerMode'), + ), + ListTileWidget( + title: l10n.decoder, + subtitle: l10n.decoder_info, + icon: Icons.memory_outlined, + onTap: () => context.push('/playerDecoderScreen'), + ), + ListTileWidget( + title: l10n.video_audio, + subtitle: l10n.video_audio_info, + icon: Icons.audiotrack_outlined, + onTap: () => context.push('/playerAudioScreen'), + ), + ListTileWidget( + title: l10n.custom_buttons, + subtitle: l10n.custom_buttons_info, + icon: Icons.terminal_outlined, + onTap: () => context.push('/customButtonScreen'), + ), + ListTileWidget( + title: l10n.advanced, + subtitle: l10n.advanced_info, + icon: Icons.code_outlined, + onTap: () => context.push('/playerAdvancedScreen'), + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 0647c5e6..bf1c64e4 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,20 +1,10 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; -import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; -import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:numberpicker/numberpicker.dart'; -import 'package:path/path.dart' as path; -import 'package:permission_handler/permission_handler.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; import 'package:mangayomi/l10n/generated/app_localizations.dart'; @@ -41,12 +31,10 @@ class _PlayerScreenState extends ConsumerState { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); - final useMpvConfig = ref.watch(useMpvConfigStateProvider); - final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); return Scaffold( - appBar: AppBar(title: Text(context.l10n.player)), + appBar: AppBar(title: Text(context.l10n.internal_player)), body: SingleChildScrollView( child: Column( children: [ @@ -359,23 +347,6 @@ class _PlayerScreenState extends ConsumerState { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), - ListTile( - title: Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Row( - children: [ - Icon( - Icons.info_outline_rounded, - color: context.secondaryColor, - ), - ], - ), - ), - subtitle: Text( - context.l10n.aniskip_requires_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), SwitchListTile( value: useLibass, title: Text(context.l10n.use_libass), @@ -396,6 +367,26 @@ class _PlayerScreenState extends ConsumerState { onExpansionChanged: (value) => ref.read(enableAniSkipStateProvider.notifier).set(value), children: [ + ListTile( + title: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + children: [ + Icon( + Icons.info_outline_rounded, + color: context.secondaryColor, + ), + ], + ), + ), + subtitle: Text( + context.l10n.aniskip_requires_info, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ), SwitchListTile( value: enableAutoSkip, title: Text(context.l10n.enable_auto_skip), @@ -473,38 +464,6 @@ class _PlayerScreenState extends ConsumerState { ), ], ), - SwitchListTile( - value: useMpvConfig, - title: Text(context.l10n.enable_mpv), - subtitle: Text( - context.l10n.mpv_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - onChanged: (value) async { - if (value && !(await _checkMpvConfig(context))) { - return; - } - ref.read(useMpvConfigStateProvider.notifier).set(value); - }, - ), - ListTile( - onTap: () { - _checkMpvConfig(context, redownload: true); - }, - title: Text(context.l10n.mpv_redownload), - subtitle: Text( - context.l10n.mpv_redownload_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), - ListTileWidget( - onTap: () { - context.push("/customButtonScreen"); - }, - icon: Icons.terminal, - title: context.l10n.custom_buttons, - subtitle: context.l10n.custom_buttons_info, - ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), @@ -516,164 +475,9 @@ class _PlayerScreenState extends ConsumerState { ref.read(fullScreenPlayerStateProvider.notifier).set(value); }, ), - ListTile( - onTap: () { - final values = [ - ("no", ""), - ("auto", ""), - ("d3d11va", "(Windows 8+)"), - ("d3d11va-copy", "(Windows 8+)"), - ("videotoolbox", "(iOS 9.0+)"), - ("videotoolbox-copy", "(iOS 9.0+)"), - ("nvdec", "(CUDA)"), - ("nvdec-copy", "(CUDA)"), - ("mediacodec", "- HW (Android)"), - ("mediacodec-copy", "- HW+ (Android)"), - ("crystalhd", ""), - ]; - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(context.l10n.hwdec), - content: SizedBox( - width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index].$1, - groupValue: hwdecMode, - onChanged: (value) { - ref - .read( - hwdecModeStateProvider( - rawValue: true, - ).notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - "${values[index].$1} ${values[index].$2}", - ), - ], - ), - ); - }, - ), - ), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () async { - Navigator.pop(context); - }, - child: Text( - context.l10n.cancel, - style: TextStyle(color: context.primaryColor), - ), - ), - ], - ), - ], - ); - }, - ); - }, - title: Text(context.l10n.hwdec), - subtitle: Text( - hwdecMode, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), ], ), ), ); } - - Future _checkMpvConfig( - BuildContext context, { - bool redownload = false, - }) async { - var status = await Permission.storage.status; - if (!status.isGranted) { - await Permission.storage.request(); - } - 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 ((redownload || filesMissing) && context.mounted) { - final res = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Text(context.l10n.mpv_download), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: Text(context.l10n.cancel), - ), - const SizedBox(width: 15), - ElevatedButton( - onPressed: () async { - final bytes = await rootBundle.load( - "assets/mangayomi_mpv.zip", - ); - final archive = ZipDecoder().decodeBytes( - bytes.buffer.asUint8List(), - ); - String shadersDir = path.join(dir.path, 'shaders'); - await Directory(shadersDir).create(recursive: true); - String scriptsDir = path.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")) { - final scriptFile = File( - '$scriptsDir/${file.name.split("/").last}', - ); - await scriptFile.writeAsBytes(file.content); - } - } - if (context.mounted) { - Navigator.pop(context, "ok"); - } - }, - child: Text(context.l10n.download), - ), - ], - ), - ], - ); - }, - ); - return res != null && res == "ok"; - } - return context.mounted; - } } diff --git a/lib/modules/more/settings/player/providers/player_audio_state_provider.dart b/lib/modules/more/settings/player/providers/player_audio_state_provider.dart new file mode 100644 index 00000000..0bd54449 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_audio_state_provider.dart @@ -0,0 +1,86 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'player_audio_state_provider.g.dart'; + +@riverpod +class AudioPreferredLangState extends _$AudioPreferredLangState { + @override + String build() { + return isar.settings.getSync(227)!.audioPreferredLanguages ?? ""; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..audioPreferredLanguages = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class EnableAudioPitchCorrectionState + extends _$EnableAudioPitchCorrectionState { + @override + bool build() { + return isar.settings.getSync(227)!.enableAudioPitchCorrection ?? true; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableAudioPitchCorrection = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class AudioChannelState extends _$AudioChannelState { + @override + AudioChannel build() { + return isar.settings.getSync(227)!.audioChannels; + } + + void set(AudioChannel value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..audioChannels = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class VolumeBoostCapState extends _$VolumeBoostCapState { + @override + int build() { + return isar.settings.getSync(227)!.volumeBoostCap ?? 30; + } + + void set(int value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..volumeBoostCap = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} diff --git a/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart new file mode 100644 index 00000000..7d66dfe9 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart @@ -0,0 +1,77 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'player_audio_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$audioPreferredLangStateHash() => + r'9d70ec2677efb51b8e0c174b55114865853f12ea'; + +/// See also [AudioPreferredLangState]. +@ProviderFor(AudioPreferredLangState) +final audioPreferredLangStateProvider = + AutoDisposeNotifierProvider.internal( + AudioPreferredLangState.new, + name: r'audioPreferredLangStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioPreferredLangStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AudioPreferredLangState = AutoDisposeNotifier; +String _$enableAudioPitchCorrectionStateHash() => + r'6614f4b04ff8fe8ef57c9a6f160646d3d25e2f4d'; + +/// See also [EnableAudioPitchCorrectionState]. +@ProviderFor(EnableAudioPitchCorrectionState) +final enableAudioPitchCorrectionStateProvider = + AutoDisposeNotifierProvider.internal( + EnableAudioPitchCorrectionState.new, + name: r'enableAudioPitchCorrectionStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAudioPitchCorrectionStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$EnableAudioPitchCorrectionState = AutoDisposeNotifier; +String _$audioChannelStateHash() => r'e71ffa85c37d545fb7b22e9539241b4926a2d384'; + +/// See also [AudioChannelState]. +@ProviderFor(AudioChannelState) +final audioChannelStateProvider = + AutoDisposeNotifierProvider.internal( + AudioChannelState.new, + name: r'audioChannelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioChannelStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AudioChannelState = AutoDisposeNotifier; +String _$volumeBoostCapStateHash() => + r'b0f5ad3bbb0e1a798ce229572b363465ad606a06'; + +/// See also [VolumeBoostCapState]. +@ProviderFor(VolumeBoostCapState) +final volumeBoostCapStateProvider = + AutoDisposeNotifierProvider.internal( + VolumeBoostCapState.new, + name: r'volumeBoostCapStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$volumeBoostCapStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$VolumeBoostCapState = AutoDisposeNotifier; +// 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 diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart new file mode 100644 index 00000000..60d2a35f --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart @@ -0,0 +1,110 @@ +import 'dart:io'; + +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'player_decoder_state_provider.g.dart'; + +final hwdecs = { + "no": ["all"], + "auto": ["all"], + "d3d11va": ["windows"], + "d3d11va-copy": ["windows"], + "videotoolbox": ["ios"], + "videotoolbox-copy": ["ios"], + "nvdec": ["all"], + "nvdec-copy": ["all"], + "mediacodec": ["android"], + "mediacodec-copy": ["android"], + "crystalhd": ["all"], +}; + +@riverpod +class HwdecModeState extends _$HwdecModeState { + @override + String build({bool rawValue = false}) { + final hwdecMode = isar.settings.getSync(227)!.hwdecMode ?? "auto"; + if (rawValue) { + return hwdecMode; + } + final hwdecSupport = hwdecs[hwdecMode] ?? []; + if (!hwdecSupport.contains("all") && + !hwdecSupport.contains(Platform.operatingSystem)) { + return Platform.isAndroid ? "auto-safe" : "auto"; + } + return hwdecMode; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..hwdecMode = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class DebandingState extends _$DebandingState { + @override + DebandingType build() { + return isar.settings.getSync(227)!.debandingType; + } + + void set(DebandingType value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..debandingType = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class UseGpuNextState extends _$UseGpuNextState { + @override + bool build() { + return isar.settings.getSync(227)!.enableGpuNext ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableGpuNext = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class UseYUV420PState extends _$UseYUV420PState { + @override + bool build() { + return isar.settings.getSync(227)!.useYUV420P ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..useYUV420P = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart new file mode 100644 index 00000000..79f0d622 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart @@ -0,0 +1,223 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'player_decoder_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$HwdecModeState extends BuildlessAutoDisposeNotifier { + late final bool rawValue; + + String build({ + bool rawValue = false, + }); +} + +/// See also [HwdecModeState]. +@ProviderFor(HwdecModeState) +const hwdecModeStateProvider = HwdecModeStateFamily(); + +/// See also [HwdecModeState]. +class HwdecModeStateFamily extends Family { + /// See also [HwdecModeState]. + const HwdecModeStateFamily(); + + /// See also [HwdecModeState]. + HwdecModeStateProvider call({ + bool rawValue = false, + }) { + return HwdecModeStateProvider( + rawValue: rawValue, + ); + } + + @override + HwdecModeStateProvider getProviderOverride( + covariant HwdecModeStateProvider provider, + ) { + return call( + rawValue: provider.rawValue, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'hwdecModeStateProvider'; +} + +/// See also [HwdecModeState]. +class HwdecModeStateProvider + extends AutoDisposeNotifierProviderImpl { + /// See also [HwdecModeState]. + HwdecModeStateProvider({ + bool rawValue = false, + }) : this._internal( + () => HwdecModeState()..rawValue = rawValue, + from: hwdecModeStateProvider, + name: r'hwdecModeStateProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$hwdecModeStateHash, + dependencies: HwdecModeStateFamily._dependencies, + allTransitiveDependencies: + HwdecModeStateFamily._allTransitiveDependencies, + rawValue: rawValue, + ); + + HwdecModeStateProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.rawValue, + }) : super.internal(); + + final bool rawValue; + + @override + String runNotifierBuild( + covariant HwdecModeState notifier, + ) { + return notifier.build( + rawValue: rawValue, + ); + } + + @override + Override overrideWith(HwdecModeState Function() create) { + return ProviderOverride( + origin: this, + override: HwdecModeStateProvider._internal( + () => create()..rawValue = rawValue, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + rawValue: rawValue, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement createElement() { + return _HwdecModeStateProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is HwdecModeStateProvider && other.rawValue == rawValue; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, rawValue.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin HwdecModeStateRef on AutoDisposeNotifierProviderRef { + /// The parameter `rawValue` of this provider. + bool get rawValue; +} + +class _HwdecModeStateProviderElement + extends AutoDisposeNotifierProviderElement + with HwdecModeStateRef { + _HwdecModeStateProviderElement(super.provider); + + @override + bool get rawValue => (origin as HwdecModeStateProvider).rawValue; +} + +String _$debandingStateHash() => r'b93e2fc826d98cc8bce1aab9a92900353e4d3958'; + +/// See also [DebandingState]. +@ProviderFor(DebandingState) +final debandingStateProvider = + AutoDisposeNotifierProvider.internal( + DebandingState.new, + name: r'debandingStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$debandingStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$DebandingState = AutoDisposeNotifier; +String _$useGpuNextStateHash() => r'cfc109cd7db66e359e9523102a84aa8cf37bf243'; + +/// See also [UseGpuNextState]. +@ProviderFor(UseGpuNextState) +final useGpuNextStateProvider = + AutoDisposeNotifierProvider.internal( + UseGpuNextState.new, + name: r'useGpuNextStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useGpuNextStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseGpuNextState = AutoDisposeNotifier; +String _$useYUV420PStateHash() => r'c600001eff34b2b8df31ba604413b8b20edc3044'; + +/// See also [UseYUV420PState]. +@ProviderFor(UseYUV420PState) +final useYUV420PStateProvider = + AutoDisposeNotifierProvider.internal( + UseYUV420PState.new, + name: r'useYUV420PStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useYUV420PStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseYUV420PState = AutoDisposeNotifier; +// 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 diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 47494a7d..5660fc4a 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -233,46 +233,3 @@ class UseMpvConfigState extends _$UseMpvConfigState { ); } } - -final hwdecs = { - "no": ["all"], - "auto": ["all"], - "d3d11va": ["windows"], - "d3d11va-copy": ["windows"], - "videotoolbox": ["ios"], - "videotoolbox-copy": ["ios"], - "nvdec": ["all"], - "nvdec-copy": ["all"], - "mediacodec": ["android"], - "mediacodec-copy": ["android"], - "crystalhd": ["all"], -}; - -@riverpod -class HwdecModeState extends _$HwdecModeState { - @override - String build({bool rawValue = false}) { - final hwdecMode = isar.settings.getSync(227)!.hwdecMode ?? "auto"; - if (rawValue) { - return hwdecMode; - } - final hwdecSupport = hwdecs[hwdecMode] ?? []; - if (!hwdecSupport.contains("all") && - !hwdecSupport.contains(Platform.operatingSystem)) { - return Platform.isAndroid ? "auto-safe" : "auto"; - } - return hwdecMode; - } - - void set(String value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync( - settings! - ..hwdecMode = value - ..updatedAt = DateTime.now().millisecondsSinceEpoch, - ), - ); - } -} diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 50e47082..58df635c 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -191,169 +191,5 @@ final useMpvConfigStateProvider = ); typedef _$UseMpvConfigState = AutoDisposeNotifier; -String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -abstract class _$HwdecModeState extends BuildlessAutoDisposeNotifier { - late final bool rawValue; - - String build({ - bool rawValue = false, - }); -} - -/// See also [HwdecModeState]. -@ProviderFor(HwdecModeState) -const hwdecModeStateProvider = HwdecModeStateFamily(); - -/// See also [HwdecModeState]. -class HwdecModeStateFamily extends Family { - /// See also [HwdecModeState]. - const HwdecModeStateFamily(); - - /// See also [HwdecModeState]. - HwdecModeStateProvider call({ - bool rawValue = false, - }) { - return HwdecModeStateProvider( - rawValue: rawValue, - ); - } - - @override - HwdecModeStateProvider getProviderOverride( - covariant HwdecModeStateProvider provider, - ) { - return call( - rawValue: provider.rawValue, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'hwdecModeStateProvider'; -} - -/// See also [HwdecModeState]. -class HwdecModeStateProvider - extends AutoDisposeNotifierProviderImpl { - /// See also [HwdecModeState]. - HwdecModeStateProvider({ - bool rawValue = false, - }) : this._internal( - () => HwdecModeState()..rawValue = rawValue, - from: hwdecModeStateProvider, - name: r'hwdecModeStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$hwdecModeStateHash, - dependencies: HwdecModeStateFamily._dependencies, - allTransitiveDependencies: - HwdecModeStateFamily._allTransitiveDependencies, - rawValue: rawValue, - ); - - HwdecModeStateProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.rawValue, - }) : super.internal(); - - final bool rawValue; - - @override - String runNotifierBuild( - covariant HwdecModeState notifier, - ) { - return notifier.build( - rawValue: rawValue, - ); - } - - @override - Override overrideWith(HwdecModeState Function() create) { - return ProviderOverride( - origin: this, - override: HwdecModeStateProvider._internal( - () => create()..rawValue = rawValue, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - rawValue: rawValue, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement createElement() { - return _HwdecModeStateProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is HwdecModeStateProvider && other.rawValue == rawValue; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, rawValue.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin HwdecModeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `rawValue` of this provider. - bool get rawValue; -} - -class _HwdecModeStateProviderElement - extends AutoDisposeNotifierProviderElement - with HwdecModeStateRef { - _HwdecModeStateProviderElement(super.provider); - - @override - bool get rawValue => (origin as HwdecModeStateProvider).rawValue; -} // 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 diff --git a/lib/modules/more/settings/settings_screen.dart b/lib/modules/more/settings/settings_screen.dart index 8aec9eba..18c11eae 100644 --- a/lib/modules/more/settings/settings_screen.dart +++ b/lib/modules/more/settings/settings_screen.dart @@ -21,52 +21,43 @@ class SettingsScreen extends StatelessWidget { ), ListTileWidget( title: l10n.appearance, - subtitle: l10n.appearance_subtitle, icon: Icons.color_lens_rounded, onTap: () => context.push('/appearance'), ), ListTileWidget( title: l10n.reader, - subtitle: l10n.reader_subtitle, icon: Icons.chrome_reader_mode_rounded, onTap: () => context.push('/readerMode'), ), ListTileWidget( title: l10n.player, - subtitle: l10n.reader_subtitle, icon: Icons.play_circle_outline_outlined, - onTap: () => context.push('/playerMode'), + onTap: () => context.push('/playerOverview'), ), ListTileWidget( title: l10n.downloads, - subtitle: l10n.downloads_subtitle, icon: Icons.download_outlined, onTap: () => context.push('/downloads'), ), ListTileWidget( title: l10n.tracking, - subtitle: "", icon: Icons.sync_outlined, onTap: () => context.push('/track'), ), ListTileWidget( title: l10n.syncing, - subtitle: l10n.syncing_subtitle, icon: Icons.cloud_sync_outlined, onTap: () => context.push('/sync'), ), ListTileWidget( title: l10n.browse, - subtitle: l10n.browse_subtitle, icon: Icons.explore_rounded, onTap: () => context.push('/browseS'), ), ListTileWidget( - onTap: () { - context.push('/about'); - }, - icon: Icons.info_outline, title: l10n.about, + icon: Icons.info_outline, + onTap: () => context.push('/about'), ), ], ), diff --git a/lib/modules/tracker_library/tracker_item_card.dart b/lib/modules/tracker_library/tracker_item_card.dart index 42627b08..326c276b 100644 --- a/lib/modules/tracker_library/tracker_item_card.dart +++ b/lib/modules/tracker_library/tracker_item_card.dart @@ -15,11 +15,13 @@ import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class TrackerItemCard extends StatelessWidget { final TrackSearch track; final ItemType itemType; + final int? mangaId; const TrackerItemCard({ super.key, required this.track, required this.itemType, + this.mangaId, }); @override @@ -140,6 +142,12 @@ class TrackerItemCard extends StatelessWidget { initExpanded: false, onChanged: (value) {}, ), + if (mangaId != null) + TextButton.icon( + onPressed: () => _pushLocalLibrary(context), + label: Text(l10n.track_library_navigate), + icon: Icon(Icons.north_east), + ), TextButton.icon( onPressed: () => _pushMigrationScreen(context), label: Text(l10n.track_library_add), @@ -182,6 +190,12 @@ class TrackerItemCard extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + if (mangaId != null) + TextButton.icon( + onPressed: () => _pushLocalLibrary(context), + label: Text(l10n.track_library_navigate), + icon: Icon(Icons.north_east), + ), TextButton.icon( onPressed: () => _pushMigrationScreen(context), label: Text(l10n.track_library_add), @@ -250,6 +264,10 @@ class TrackerItemCard extends StatelessWidget { ); } + void _pushLocalLibrary(BuildContext context) { + context.push('/manga-reader/detail', extra: mangaId); + } + void _pushMigrationScreen(BuildContext context) { context.push( "/migrate/tracker", diff --git a/lib/modules/tracker_library/tracker_library_card.dart b/lib/modules/tracker_library/tracker_library_card.dart index daccc867..78ea1b1e 100644 --- a/lib/modules/tracker_library/tracker_library_card.dart +++ b/lib/modules/tracker_library/tracker_library_card.dart @@ -33,18 +33,18 @@ class _TrackerLibraryImageCardState Widget build(BuildContext context) { super.build(context); final trackData = widget.track; - return GestureDetector( - onTap: () => _showCard(context), - child: StreamBuilder( - stream: isar.tracks - .filter() - .mangaIdIsNotNull() - .mediaIdEqualTo(trackData.mediaId) - .itemTypeEqualTo(widget.itemType) - .watch(fireImmediately: true), - builder: (context, snapshot) { - final hasData = snapshot.hasData && snapshot.data!.isNotEmpty; - return Padding( + return StreamBuilder( + stream: isar.tracks + .filter() + .mangaIdIsNotNull() + .mediaIdEqualTo(trackData.mediaId) + .itemTypeEqualTo(widget.itemType) + .watch(fireImmediately: true), + builder: (context, snapshot) { + final hasData = snapshot.hasData && snapshot.data!.isNotEmpty; + return GestureDetector( + onTap: () => _showCard(context, snapshot.data?.firstOrNull?.mangaId), + child: Padding( padding: const EdgeInsets.only(left: 10), child: Stack( children: [ @@ -129,17 +129,20 @@ class _TrackerLibraryImageCardState ), ], ), - ); - }, - ), + ), + ); + }, ); } - void _showCard(BuildContext context) { + void _showCard(BuildContext context, int? mangaId) { showDialog( context: context, - builder: (context) => - TrackerItemCard(track: widget.track, itemType: widget.itemType), + builder: (context) => TrackerItemCard( + track: widget.track, + itemType: widget.itemType, + mangaId: mangaId, + ), ); } diff --git a/lib/router/router.dart b/lib/router/router.dart index c889dfb8..43b91888 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -17,6 +17,10 @@ import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; import 'package:mangayomi/modules/more/settings/browse/source_repositories.dart'; import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_advanced_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_audio_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_decoder_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_overview_screen.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/statistics/statistics_screen.dart'; import 'package:mangayomi/modules/novel/novel_reader_view.dart'; @@ -204,6 +208,7 @@ class RouterNotifier extends ChangeNotifier { name: "trackingDetail", builder: (trackerPref) => TrackingDetail(trackerPref: trackerPref), ), + _genericRoute(name: "playerOverview", child: const PlayerOverviewScreen()), _genericRoute(name: "playerMode", child: const PlayerScreen()), _genericRoute( name: "codeEditor", @@ -219,6 +224,15 @@ class RouterNotifier extends ChangeNotifier { name: "customButtonScreen", child: const CustomButtonScreen(), ), + _genericRoute( + name: "playerDecoderScreen", + child: const PlayerDecoderScreen(), + ), + _genericRoute(name: "playerAudioScreen", child: const PlayerAudioScreen()), + _genericRoute( + name: "playerAdvancedScreen", + child: const PlayerAdvancedScreen(), + ), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga), diff --git a/pubspec.lock b/pubspec.lock index 0508a12d..c8bb50bd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "746465b7914fa524781813dc6e50ea87dcd686e5" + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1221,7 +1221,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "746465b7914fa524781813dc6e50ea87dcd686e5" + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From 83f4a4bf898ca844dfa343c6b8518a75786abaa2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 31 Jul 2025 02:01:56 +0200 Subject: [PATCH 025/100] + --- lib/l10n/generated/app_localizations.dart | 10 + lib/l10n/generated/app_localizations_as.dart | 1620 +++++++++++++++++ lib/l10n/generated/app_localizations_hi.dart | 1621 ++++++++++++++++++ 3 files changed, 3251 insertions(+) create mode 100644 lib/l10n/generated/app_localizations_as.dart create mode 100644 lib/l10n/generated/app_localizations_hi.dart diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index f8f51b64..4b5ceb5f 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -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 supportedLocales = [ Locale('ar'), + Locale('as'), Locale('de'), Locale('en'), Locale('es'), Locale('es', '419'), Locale('fr'), + Locale('hi'), Locale('id'), Locale('it'), Locale('pt'), @@ -3144,10 +3148,12 @@ class _AppLocalizationsDelegate @override bool isSupported(Locale locale) => [ 'ar', + 'as', 'de', 'en', 'es', 'fr', + 'hi', 'id', 'it', 'pt', @@ -3186,6 +3192,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { switch (locale.languageCode) { case 'ar': return AppLocalizationsAr(); + case 'as': + return AppLocalizationsAs(); case 'de': return AppLocalizationsDe(); case 'en': @@ -3194,6 +3202,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsEs(); case 'fr': return AppLocalizationsFr(); + case 'hi': + return AppLocalizationsHi(); case 'id': return AppLocalizationsId(); case 'it': diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart new file mode 100644 index 00000000..d90c7639 --- /dev/null +++ b/lib/l10n/generated/app_localizations_as.dart @@ -0,0 +1,1620 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Assamese (`as`). +class AppLocalizationsAs extends AppLocalizations { + AppLocalizationsAs([String locale = 'as']) : super(locale); + + @override + String get library => 'পুথিভঁৰাল'; + + @override + String get updates => 'আপডেট'; + + @override + String get history => 'ইতিহাস'; + + @override + String get browse => 'ব্ৰাউজ'; + + @override + String get more => 'অধিক'; + + @override + String get open_random_entry => 'যিকোনো এণ্ট্ৰি খোলক'; + + @override + String get import => 'আমদানি'; + + @override + String get filter => 'ফিল্টাৰ'; + + @override + String get ignore_filters => 'Ignore Filters'; + + @override + String get downloaded => 'ডাউনলোড কৰা'; + + @override + String get unread => 'নপঢ়া'; + + @override + String get unwatched => 'Unwatched'; + + @override + String get started => 'আৰম্ভ কৰা'; + + @override + String get bookmarked => 'বুকমাৰ্ক কৰা'; + + @override + String get sort => 'শাৰী কৰক'; + + @override + String get alphabetically => 'বৰ্ণানুক্ৰমে'; + + @override + String get last_read => 'শেষত পঢ়া'; + + @override + String get last_watched => 'Last watched'; + + @override + String get last_update_check => 'শেষ আপডেট পৰীক্ষা'; + + @override + String last_entry_delete_warning( + num count, + Object entryType, + Object entryTypePlural, + Object mediaType, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: + 'You are deleting all $count $entryTypePlural of this $mediaType from the library.', + one: + 'You are deleting the only $entryType of this $mediaType from the library.', + ); + return '$_temp0\nThis will also remove the whole $mediaType from your library.\n\nNote: The files themselves will not be deleted.'; + } + + @override + String get chapter => 'chapter'; + + @override + String get episode => 'episode'; + + @override + String get unread_count => 'নপঢ়াৰ সংখ্যা'; + + @override + String get unwatched_count => 'Unwatched count'; + + @override + String get latest_chapter => 'শেষৰ অধ্যায়'; + + @override + String get latest_episode => 'Latest episode'; + + @override + String get date_added => 'তাৰিখ যোগ কৰা'; + + @override + String get display => 'প্ৰদৰ্শন'; + + @override + String get display_mode => 'প্ৰদৰ্শন মোড'; + + @override + String get compact_grid => 'সংক্ষিপ্ত গ্ৰিড'; + + @override + String get comfortable_grid => 'আৰামদায়ক গ্ৰিড'; + + @override + String get cover_only_grid => 'মাত্ৰ কভাৰৰ গ্ৰিড'; + + @override + String get list => 'তালিকা'; + + @override + String get badges => 'বেজ'; + + @override + String get downloaded_chapters => 'ডাউনলোড কৰা অধ্যায়'; + + @override + String get downloaded_episodes => 'Downloaded episodes'; + + @override + String get language => 'ভাষা'; + + @override + String get local_source => 'স্থানীয় উৎস'; + + @override + String get tabs => 'টেব'; + + @override + String get show_category_tabs => 'শ্ৰেণীৰ টেব দেখুৱাওক'; + + @override + String get show_numbers_of_items => 'বস্তুৰ সংখ্যা দেখুৱাওক'; + + @override + String get other => 'অন্যান্য'; + + @override + String get show_continue_reading_buttons => + 'পঢ়া অব্যাহত ৰখাৰ বুটাম দেখুৱাওক'; + + @override + String get show_continue_watching_buttons => 'Show continue watching buttons'; + + @override + String get empty_library => 'খালী পুথিভঁৰাল'; + + @override + String get search => 'সন্ধান...'; + + @override + String get no_recent_updates => 'শেহতীয়া আপডেট নাই'; + + @override + String get remove_everything => 'সকলো আঁতৰাওক'; + + @override + String get remove_everything_msg => 'আপুনি নিশ্চিত নে? সকলো ইতিহাস হেৰাই যাব'; + + @override + String get remove_all_update_msg => + 'Are you sure? The whole update will be cleared'; + + @override + String get ok => 'ঠিক আছে'; + + @override + String get cancel => 'বাতিল'; + + @override + String get remove => 'আঁতৰাওক'; + + @override + String get remove_history_msg => + 'ইয়ে এই অধ্যায়ৰ পঢ়া তাৰিখ আঁতৰাব। আপুনি নিশ্চিত নে?'; + + @override + String get last_used => 'শেষবাৰ ব্যৱহৃত'; + + @override + String get pinned => 'পিন কৰা'; + + @override + String get sources => 'উৎস'; + + @override + String get install => 'ইনষ্টল'; + + @override + String get update => 'আপডেট'; + + @override + String get latest => 'শেষৰ'; + + @override + String get extensions => 'এক্সটেনশন'; + + @override + String get migrate => 'স্থানান্তৰ'; + + @override + String get migrate_confirm => 'Migrate to another source'; + + @override + String get clean_database => 'Clean database'; + + @override + String cleaned_database(Object x) { + return 'Database cleaned! $x entries removed'; + } + + @override + String get clean_database_desc => + 'This will remove all items that are not added to the library!'; + + @override + String get incognito_mode => 'গোপন মোড'; + + @override + String get incognito_mode_description => 'পঢ়াৰ ইতিহাস স্থগিত কৰে'; + + @override + String get download_queue => 'ডাউনলোড শাৰী'; + + @override + String get categories => 'শ্ৰেণী'; + + @override + String get statistics => 'Statistics'; + + @override + String get settings => 'ছেটিং'; + + @override + String get about => 'বিষয়ে'; + + @override + String get help => 'সহায়'; + + @override + String get no_downloads => 'কোনো ডাউনলোড নাই'; + + @override + String get edit_categories => 'শ্ৰেণী সম্পাদনা'; + + @override + String get edit_categories_description => + 'আপোনাৰ কোনো শ্ৰেণী নাই। পুথিভঁৰাল সংগঠিত কৰিবলৈ প্লাছ বুটামত টেপ কৰক'; + + @override + String get add => 'যোগ কৰক'; + + @override + String get add_category => 'শ্ৰেণী যোগ কৰক'; + + @override + String get name => 'নাম'; + + @override + String get category_name_required => '*প্ৰয়োজনীয়'; + + @override + String get add_category_error_exist => 'এই নামৰ শ্ৰেণী ইতিমধ্যে আছে!'; + + @override + String get delete_category => 'শ্ৰেণী মচক'; + + @override + String delete_category_msg(Object name) { + return 'আপুনি $name শ্ৰেণী মচিব বিচাৰে নে?'; + } + + @override + String get rename_category => 'শ্ৰেণীৰ নাম সলনি কৰক'; + + @override + String get general => 'সাধাৰণ'; + + @override + String get general_subtitle => 'এপৰ ভাষা'; + + @override + String get app_language => 'এপৰ ভাষা'; + + @override + String get default_subtitle_language => 'Default subtitle language'; + + @override + String get appearance => 'চেহেৰা'; + + @override + String get appearance_subtitle => 'থীম, তাৰিখ আৰু সময়ৰ ফৰ্মেট'; + + @override + String get theme => 'থীম'; + + @override + String get dark_mode => 'ডাৰ্ক মোড'; + + @override + String get follow_system_theme => 'Follow system theme'; + + @override + String get on => 'অন'; + + @override + String get off => 'অফ'; + + @override + String get pure_black_dark_mode => 'পিউৰ ব্লেক ডাৰ্ক মোড'; + + @override + String get timestamp => 'টাইমষ্টেম্প'; + + @override + String get relative_timestamp => 'আপেক্ষিক টাইমষ্টেম্প'; + + @override + String get relative_timestamp_short => 'চমু (আজি, কালি)'; + + @override + String get relative_timestamp_long => 'দীঘল (চমু+, n দিনৰ আগতে)'; + + @override + String get date_format => 'তাৰিখৰ ফৰ্মেট'; + + @override + String get reader => 'পাঠক'; + + @override + String get refresh => 'ৰিফ্ৰেছ'; + + @override + String get reader_subtitle => 'পঢ়াৰ মোড, প্ৰদৰ্শন, নেভিগেশন'; + + @override + String get default_reading_mode => 'ডিফল্ট পঢ়াৰ মোড'; + + @override + String get reading_mode_vertical => 'উলম্ব'; + + @override + String get reading_mode_horizontal => 'অনুভূমিক'; + + @override + String get reading_mode_left_to_right => 'বাওঁফালৰ পৰা সোঁফাললৈ'; + + @override + String get reading_mode_right_to_left => 'সোঁফালৰ পৰা বাওঁফাললৈ'; + + @override + String get reading_mode_vertical_continuous => 'উলম্ব অবিৰত'; + + @override + String get reading_mode_webtoon => 'ৱেবটুন'; + + @override + String get double_tap_animation_speed => 'ডাবল টেপ এনিমেশনৰ গতি'; + + @override + String get normal => 'সাধাৰণ'; + + @override + String get fast => 'দ্ৰুত'; + + @override + String get no_animation => 'কোনো এনিমেশন নাই'; + + @override + String get animate_page_transitions => 'পৃষ্ঠা স্থানান্তৰ এনিমেট কৰক'; + + @override + String get crop_borders => 'সীমা কাটক'; + + @override + String get downloads => 'ডাউনলোড'; + + @override + String get downloads_subtitle => 'ডাউনলোড ছেটিং'; + + @override + String get download_location => 'ডাউনলোডৰ স্থান'; + + @override + String get custom_location => 'কাষ্টম স্থান'; + + @override + String get only_on_wifi => 'কেৱল ৱাই-ফাইত'; + + @override + String get save_as_cbz_archive => 'CBZ আৰ্কাইভ হিচাপে সাঁচক'; + + @override + String get concurrent_downloads => 'Concurrent downloads'; + + @override + String get browse_subtitle => 'উৎস, গ্ল’বেল সন্ধান'; + + @override + String get only_include_pinned_sources => 'কেৱল পিন কৰা উৎস অন্তৰ্ভুক্ত কৰক'; + + @override + String get nsfw_sources => 'NSFW (+18) উৎস'; + + @override + String get nsfw_sources_show => 'উৎস আৰু এক্সটেনশন তালিকাত দেখুৱাওক'; + + @override + String get nsfw_sources_info => + 'ইয়ে অফিচিয়েল নহোৱা বা সম্ভৱতঃ ভুলকৈ ফ্লেগ কৰা এক্সটেনশনৰ পৰা NSFW (18+) বিষয়বস্তু এপত দেখা দিয়াৰ পৰা ৰক্ষা নকৰে'; + + @override + String get version => 'সংস্কৰণ'; + + @override + String get check_for_update => 'আপডেটৰ বাবে পৰীক্ষা কৰক'; + + @override + String n_days_ago(Object days) { + return '$days দিনৰ আগতে'; + } + + @override + String get today => 'আজি'; + + @override + String get yesterday => 'কালি'; + + @override + String get a_week_ago => 'এসপ্তাহৰ আগতে'; + + @override + String get add_to_library => 'পুথিভঁৰালত যোগ কৰক'; + + @override + String get completed => 'সম্পূৰ্ণ'; + + @override + String get ongoing => 'চলি আছে'; + + @override + String get on_hiatus => 'বিৰতিত'; + + @override + String get canceled => 'বাতিল কৰা'; + + @override + String get publishing_finished => 'প্ৰকাশ সমাপ্ত'; + + @override + String get unknown => 'অজ্ঞাত'; + + @override + String get set_categories => 'শ্ৰেণী নিৰ্ধাৰণ কৰক'; + + @override + String get edit => 'সম্পাদনা'; + + @override + String get in_library => 'পুথিভঁৰালত'; + + @override + String get filter_scanlator_groups => 'স্কেনলেটৰ গ্ৰুপ ফিল্টাৰ কৰক'; + + @override + String get reset => 'ৰিছেট'; + + @override + String get by_source => 'উৎস অনুসৰি'; + + @override + String get by_chapter_number => 'অধ্যায়ৰ সংখ্যা অনুসৰি'; + + @override + String get by_episode_number => 'By episode number'; + + @override + String get by_upload_date => 'আপলোডৰ তাৰিখ অনুসৰি'; + + @override + String get source_title => 'উৎসৰ শিৰোনাম'; + + @override + String get chapter_number => 'অধ্যায়ৰ সংখ্যা'; + + @override + String get episode_number => 'Episode number'; + + @override + String get share => 'শ্বেয়াৰ'; + + @override + String n_chapters(Object number) { + return '$number অধ্যায়'; + } + + @override + String get no_description => 'কোনো বিৱৰণ নাই'; + + @override + String get resume => 'পুনৰ আৰম্ভ'; + + @override + String get read => 'পঢ়ক'; + + @override + String get watch => 'Watch'; + + @override + String get popular => 'জনপ্ৰিয়'; + + @override + String get open_in_browser => 'ব্ৰাউজাৰত খোলক'; + + @override + String get clear_cookie => 'কুকী আঁতৰাওক'; + + @override + String get show_page_number => 'পৃষ্ঠাৰ সংখ্যা দেখুৱাওক'; + + @override + String get from_library => 'পুথিভঁৰালৰ পৰা'; + + @override + String get downloaded_chapter => 'ডাউনলোড কৰা অধ্যায়'; + + @override + String page(Object page) { + return 'পৃষ্ঠা $page'; + } + + @override + String get global_search => 'গ্ল’বেল সন্ধান'; + + @override + String get color_blend_level => 'ৰংৰ মিশ্ৰণ স্তৰ'; + + @override + String current(Object char) { + return 'বৰ্তমান $char'; + } + + @override + String finished(Object char) { + return 'শেষ $char'; + } + + @override + String next(Object char) { + return 'পৰৱৰ্তী $char'; + } + + @override + String previous(Object char) { + return 'পূৰ্বৰ $char'; + } + + @override + String get no_more_chapter => 'আৰু কোনো অধ্যায় নাই'; + + @override + String get no_result => 'কোনো ফলাফল নাই'; + + @override + String get send => 'পঠিয়াওক'; + + @override + String get delete => 'মচক'; + + @override + String get start_downloading => 'এতিয়া ডাউনলোড আৰম্ভ কৰক'; + + @override + String get retry => 'পুনৰ চেষ্টা কৰক'; + + @override + String get add_chapters => 'অধ্যায় যোগ কৰক'; + + @override + String get delete_chapters => 'অধ্যায় মচক?'; + + @override + String get default0 => 'ডিফল্ট'; + + @override + String get total_chapters => 'মুঠ অধ্যায়'; + + @override + String get total_episodes => 'Total episodes'; + + @override + String get import_local_file => 'স্থানীয় ফাইল আমদানি কৰক'; + + @override + String get import_files => 'ফাইল'; + + @override + String get nothing_read_recently => 'শেহতীয়াকৈ একো পঢ়া নাই'; + + @override + String get status => 'স্থিতি'; + + @override + String get not_started => 'আৰম্ভ হোৱা নাই'; + + @override + String get score => 'স্ক’ৰ'; + + @override + String get start_date => 'আৰম্ভৰ তাৰিখ'; + + @override + String get finish_date => 'শেষৰ তাৰিখ'; + + @override + String get reading => 'পঢ়ি আছে'; + + @override + String get on_hold => 'ৰখা আছে'; + + @override + String get dropped => 'বাদ দিয়া'; + + @override + String get plan_to_read => 'পঢ়াৰ পৰিকল্পনা'; + + @override + String get re_reading => 'পুনৰ পঢ়ি আছে'; + + @override + String get chapters => 'অধ্যায়'; + + @override + String get add_tracker => 'ট্ৰেকাৰ যোগ কৰক'; + + @override + String get one_tracker => '১ টা ট্ৰেকাৰ'; + + @override + String n_tracker(Object n) { + return '$n টা ট্ৰেকাৰ'; + } + + @override + String get tracking => 'ট্ৰেকিং'; + + @override + String get syncing => 'Sync'; + + @override + String get sync_password => 'Password (at least 8 characters)'; + + @override + String get sync_logged => 'Login successful'; + + @override + String get syncing_subtitle => + 'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!'; + + @override + String get last_sync_manga => 'Last manga sync at: '; + + @override + String get last_sync_history => 'Last history sync at: '; + + @override + String get last_sync_update => 'Last update sync at: '; + + @override + String get sync_server => 'Sync Server Address'; + + @override + String get sync_login_invalid_creds => 'Invalid email or password'; + + @override + String get sync_starting => 'Starting sync...'; + + @override + String get sync_finished => 'Sync finished'; + + @override + String get sync_failed => 'Sync failed'; + + @override + String get sync_button_sync => 'Sync progress'; + + @override + String get sync_on => 'Enable sync'; + + @override + String get sync_auto => 'Auto Sync'; + + @override + String get sync_auto_warning => + 'Auto Sync is currently an experimental feature!'; + + @override + String get sync_auto_off => 'Off'; + + @override + String get sync_auto_5_minutes => 'Every 5 minutes'; + + @override + String get sync_auto_10_minutes => 'Every 10 minutes'; + + @override + String get sync_auto_30_minutes => 'Every 30 minutes'; + + @override + String get sync_auto_1_hour => 'Every 1 hour'; + + @override + String get sync_auto_3_hours => 'Every 3 hours'; + + @override + String get sync_auto_6_hours => 'Every 6 hours'; + + @override + String get sync_auto_12_hours => 'Every 12 hours'; + + @override + String get server_error => 'Server error!'; + + @override + String get dialog_confirm => 'Confirm'; + + @override + String get description => 'বিৱৰণ'; + + @override + String get reorder_navigation => 'Customize navigation'; + + @override + String get reorder_navigation_description => + 'Reorder and toggle each navigation to your needs.'; + + @override + String get full_screen_player => 'Use Fullscreen'; + + @override + String get full_screen_player_info => + 'Automatically use fullscreen when playing a video.'; + + @override + String episode_progress(Object n) { + return 'প্ৰগতি: $n'; + } + + @override + String n_episodes(Object n) { + return '$n খণ্ড'; + } + + @override + String get manga_sources => 'মাংগা উৎস'; + + @override + String get anime_sources => 'এনিমে উৎস'; + + @override + String get novel_sources => 'Novel Sources'; + + @override + String get anime_extensions => 'এনিমে এক্সটেনশন'; + + @override + String get manga_extensions => 'মাংগা এক্সটেনশন'; + + @override + String get novel_extensions => 'Novel Extensions'; + + @override + String get anime => 'এনিমে'; + + @override + String get manga => 'মাংগা'; + + @override + String get novel => 'Novel'; + + @override + String get library_no_category_exist => 'আপোনাৰ এতিয়াও কোনো শ্ৰেণী নাই'; + + @override + String get watching => 'চাই আছে'; + + @override + String get plan_to_watch => 'চোৱাৰ পৰিকল্পনা'; + + @override + String get re_watching => 'পুনৰ চাই আছে'; + + @override + String get episodes => 'খণ্ড'; + + @override + String get download => 'ডাউনলোড'; + + @override + String get new_update_available => 'নতুন আপডেট উপলব্ধ'; + + @override + String app_version(Object v) { + return 'এপৰ সংস্কৰণ: v$v'; + } + + @override + String get searching_for_updates => 'আপডেটৰ বাবে সন্ধান কৰি আছে...'; + + @override + String get no_new_updates_available => 'কোনো নতুন আপডেট উপলব্ধ নাই'; + + @override + String get uninstall => 'আনইনষ্টল'; + + @override + String uninstall_extension(Object ext) { + return '$ext এক্সটেনশন আনইনষ্টল কৰিব নে?'; + } + + @override + String get langauage => 'ভাষা'; + + @override + String get extension_detail => 'এক্সটেনশনৰ বিৱৰণ'; + + @override + String get scale_type => 'স্কেলৰ ধৰণ'; + + @override + String get scale_type_fit_screen => 'স্ক্ৰীণৰ সৈতে মিলাওক'; + + @override + String get scale_type_stretch => 'প্ৰসাৰিত'; + + @override + String get scale_type_fit_width => 'প্ৰস্থৰ সৈতে মিলাওক'; + + @override + String get scale_type_fit_height => 'উচ্চতাৰ সৈতে মিলাওক'; + + @override + String get scale_type_original_size => 'মূল আকাৰ'; + + @override + String get scale_type_smart_fit => 'স্মাৰ্ট ফিট'; + + @override + String get page_preload_amount => 'পৃষ্ঠা প্ৰিলোডৰ পৰিমাণ'; + + @override + String get page_preload_amount_subtitle => + 'পঢ়াৰ সময়ত প্ৰিলোড কৰিবলগীয়া পৃষ্ঠাৰ পৰিমাণ। অধিক মানে মসৃণ পঢ়াৰ অভিজ্ঞতা, কিন্তু কেশ্ব আৰু নেটৱৰ্কৰ ব্যৱহাৰ বেছি হ’ব।'; + + @override + String get image_loading_error => 'এই ছবি লোড কৰিব পৰা নগ’ল'; + + @override + String get add_episodes => 'খণ্ড যোগ কৰক'; + + @override + String get video_quality => 'গুণ'; + + @override + String get video_subtitle => 'উপশিৰোনাম'; + + @override + String get check_for_extension_updates => 'এক্সটেনশন আপডেটৰ বাবে পৰীক্ষা কৰক'; + + @override + String get auto_extensions_updates => 'স্বয়ংক্ৰিয় এক্সটেনশন আপডেট'; + + @override + String get auto_extensions_updates_subtitle => + 'নতুন সংস্কৰণ উপলব্ধ হ’লে এক্সটেনশন স্বয়ংক্ৰিয়ভাৱে আপডেট কৰিব।'; + + @override + String get check_for_app_updates => 'Check for app updates on startup'; + + @override + String get reading_mode => 'পঢ়াৰ মোড'; + + @override + String get custom_filter => 'কাষ্টম ফিল্টাৰ'; + + @override + String get background_color => 'পটভূমিৰ ৰং'; + + @override + String get white => 'বগা'; + + @override + String get black => 'ক’লা'; + + @override + String get grey => 'ধূসৰ'; + + @override + String get automaic => 'স্বয়ংক্ৰিয়'; + + @override + String get preferred_domain => 'পছন্দৰ ড’মেইন'; + + @override + String get load_more => 'অধিক লোড কৰক'; + + @override + String get cancel_all_for_this_series => 'এই শৃংখলাৰ সকলো বাতিল কৰক'; + + @override + String get login => 'লগইন'; + + @override + String login_into(Object tracker) { + return '$tracker ত লগইন কৰক'; + } + + @override + String get email_adress => 'ইমেইল ঠিকনা'; + + @override + String get password => 'পাছৱৰ্ড'; + + @override + String log_out_from(Object tracker) { + return '$tracker ৰ পৰা লগ আউট কৰিব নে?'; + } + + @override + String get log_out => 'লগ আউট'; + + @override + String get update_pending => 'আপডেট বাকী আছে'; + + @override + String get update_all => 'সকলো আপডেট কৰক'; + + @override + String get backup_and_restore => 'বেকআপ আৰু পুনৰুদ্ধাৰ'; + + @override + String get create_backup => 'বেকআপ সৃষ্টি কৰক'; + + @override + String get create_backup_dialog_title => 'আপুনি কি বেকআপ কৰিব বিচাৰে?'; + + @override + String get create_backup_subtitle => + 'বৰ্তমানৰ পুথিভঁৰাল পুনৰুদ্ধাৰৰ বাবে ব্যৱহাৰ কৰিব পাৰি'; + + @override + String get restore_backup => 'বেকআপ পুনৰুদ্ধাৰ'; + + @override + String get restore_backup_subtitle => + 'বেকআপ ফাইলৰ পৰা পুথিভঁৰাল পুনৰুদ্ধাৰ কৰক'; + + @override + String get automatic_backups => 'স্বয়ংক্ৰিয় বেকআপ'; + + @override + String get backup_frequency => 'বেকআপৰ কম্পাঙ্ক'; + + @override + String get backup_location => 'বেকআপৰ স্থান'; + + @override + String get backup_options => 'বেকআপৰ বিকল্প'; + + @override + String get backup_options_dialog_title => 'আপুনি কি বেকআপ কৰিব বিচাৰে?'; + + @override + String get backup_options_subtitle => 'বেকআপ ফাইলত কি তথ্য অন্তৰ্ভুক্ত কৰিব'; + + @override + String get backup_and_restore_warning_info => + 'আপুনি বেকআপৰ কপি অন্য ঠাইতো ৰাখিব লাগে'; + + @override + String get library_entries => 'পুথিভঁৰালৰ এণ্ট্ৰি'; + + @override + String get chapters_and_episode => 'অধ্যায় আৰু খণ্ড'; + + @override + String get every_6_hours => 'প্ৰতি ৬ ঘণ্টা'; + + @override + String get every_12_hours => 'প্ৰতি ১২ ঘণ্টা'; + + @override + String get daily => 'দৈনিক'; + + @override + String get every_2_days => 'প্ৰতি ২ দিন'; + + @override + String get weekly => 'সাপ্তাহিক'; + + @override + String get restore_backup_warning_title => + 'বেকআপ পুনৰুদ্ধাৰে সকলো বিদ্যমান তথ্য ওভাৰৰাইট কৰিব।\n\nপুনৰুদ্ধাৰ অব্যাহত ৰাখিব নে?'; + + @override + String get services => 'সেৱা'; + + @override + String get tracking_warning_info => + 'ট্ৰেকিং সেৱাত অধ্যায়ৰ প্ৰগতি আপডেট কৰিবলৈ একমুখী ছিংক। পৃথক এণ্ট্ৰিৰ বাবে ট্ৰেকিং তেওঁলোকৰ ট্ৰেকিং বুটামৰ পৰা ছেট আপ কৰক।'; + + @override + String get use_page_tap_zones => 'পৃষ্ঠা টেপ জ’ন ব্যৱহাৰ কৰক'; + + @override + String get manage_trackers => 'ট্ৰেকাৰ পৰিচালনা কৰক'; + + @override + String get restore => 'পুনৰুদ্ধাৰ'; + + @override + String get backups => 'বেকআপ'; + + @override + String get by_scanlator => 'স্কেনলেটৰ অনুসৰি'; + + @override + String get by_name => 'নাম অনুসৰি'; + + @override + String get installed => 'ইনষ্টল কৰা'; + + @override + String get auto_scroll => 'স্বয়ংক্ৰিয় স্ক্ৰ’ল'; + + @override + String get video_audio => 'অডিঅ’'; + + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + + @override + String get player => 'প্লেয়াৰ'; + + @override + String get markEpisodeAsSeenSetting => + 'খণ্ডটো কেতিয়া দেখা বুলি চিহ্নিত কৰিব'; + + @override + String get default_skip_intro_length => 'ডিফল্ট ইনট্ৰ’ এৰি দিয়াৰ দৈৰ্ঘ্য'; + + @override + String get default_playback_speed_length => 'ডিফল্ট প্লেবেক গতিৰ দৈৰ্ঘ্য'; + + @override + String get updateProgressAfterReading => 'পঢ়াৰ পিছত প্ৰগতি আপডেট কৰক'; + + @override + String get no_sources_installed => 'কোনো উৎস ইনষ্টল কৰা নাই!'; + + @override + String get show_extensions => 'এক্সটেনশন দেখুৱাওক'; + + @override + String get default_skip_forward_skip_length => + 'Default skip forward skip length'; + + @override + String get aniskip_requires_info => + 'AniSkip requires the anime to be tracked with MAL or Anilist to work.'; + + @override + String get enable_aniskip => 'Enable AniSkip'; + + @override + String get enable_auto_skip => 'Enable auto skip'; + + @override + String get aniskip_button_timeout => 'Button timeout'; + + @override + String get skip_opening => 'Skip opening'; + + @override + String get skip_ending => 'Skip ending'; + + @override + String get fullscreen => 'Fullscreen'; + + @override + String get update_library => 'Update library'; + + @override + String updating_library(Object cur, Object failed, Object max) { + return 'Updating library ($cur / $max) - Failed: $failed'; + } + + @override + String get next_chapter => 'Next chapter'; + + @override + String get next_5_chapters => 'Next 5 chapters'; + + @override + String get next_10_chapters => 'Next 10 chapters'; + + @override + String get next_25_chapters => 'Next 25 chapters'; + + @override + String get all_chapters => 'All chapters'; + + @override + String get next_episode => 'Next episode'; + + @override + String get next_5_episodes => 'Next 5 episodes'; + + @override + String get next_10_episodes => 'Next 10 episodes'; + + @override + String get next_25_episodes => 'Next 25 episodes'; + + @override + String get all_episodes => 'All episodes'; + + @override + String get cover_saved => 'Cover saved'; + + @override + String get set_as_cover => 'Set as cover'; + + @override + String get use_this_as_cover_art => 'Use this as cover art?'; + + @override + String get save => 'Save'; + + @override + String get picture_saved => 'Picture saved'; + + @override + String get cover_updated => 'Cover updated'; + + @override + String get include_subtitles => 'Include subtitles'; + + @override + String get blend_mode_default => 'Default'; + + @override + String get blend_mode_multiply => 'Multiply'; + + @override + String get blend_mode_screen => 'Screen'; + + @override + String get blend_mode_overlay => 'Overlay'; + + @override + String get blend_mode_colorDodge => 'ColorDodge'; + + @override + String get blend_mode_lighten => 'Lighten'; + + @override + String get blend_mode_colorBurn => 'ColorBurn'; + + @override + String get blend_mode_darken => 'Darken'; + + @override + String get blend_mode_difference => 'Difference'; + + @override + String get blend_mode_saturation => 'Saturation'; + + @override + String get blend_mode_softLight => 'SoftLight'; + + @override + String get blend_mode_plus => 'Plus'; + + @override + String get blend_mode_exclusion => 'Exclusion'; + + @override + String get custom_color_filter => 'Custom color filter'; + + @override + String get color_filter_blend_mode => 'Color filter blend mode'; + + @override + String get enable_all => 'Enable all'; + + @override + String get disable_all => 'Disable all'; + + @override + String get font => 'Font'; + + @override + String get color => 'Color'; + + @override + String get font_size => 'Font size'; + + @override + String get text => 'Text'; + + @override + String get border => 'Border'; + + @override + String get background => 'Background'; + + @override + String get no_subtite_warning_message => + 'Has no effect because there aren\'t any subtitle tracks in this video'; + + @override + String get grid_size => 'Grid size'; + + @override + String n_per_row(Object n) { + return '$n per row'; + } + + @override + String get horizontal_continious => 'Horizontal continuous'; + + @override + String get edit_code => 'Edit code'; + + @override + String get use_libass => 'Enable libass'; + + @override + String get use_libass_info => + 'Use libass based subtitle rendering for native backend.'; + + @override + String get libass_not_disable_message => + 'Disable `use libass` in player settings to be able to customize the subtitles.'; + + @override + String get torrent_stream => 'Torrent Stream'; + + @override + String get add_torrent => 'Add torrent'; + + @override + String get enter_torrent_hint_text => 'Enter magnet or torrent file url'; + + @override + String get torrent_url => 'Torrent url'; + + @override + String get or => 'OR'; + + @override + String get advanced => 'Advanced'; + + @override + String get advanced_info => 'mpv config'; + + @override + String get use_native_http_client => 'Use native http client'; + + @override + String get use_native_http_client_info => + 'it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling'; + + @override + String n_hour_ago(Object hour) { + return '$hour hour ago'; + } + + @override + String n_hours_ago(Object hours) { + return '$hours hours ago'; + } + + @override + String n_minute_ago(Object minute) { + return '$minute minute ago'; + } + + @override + String n_minutes_ago(Object minutes) { + return '$minutes minutes ago'; + } + + @override + String n_day_ago(Object day) { + return '$day day ago'; + } + + @override + String get now => 'now'; + + @override + String library_last_updated(Object lastUpdated) { + return 'Library last updated: $lastUpdated'; + } + + @override + String get data_and_storage => 'Data and storage'; + + @override + String get download_location_info => 'Used for chapter downloads'; + + @override + String get storage => 'Storage'; + + @override + String get clear_chapter_and_episode_cache => + 'Clear chapter and episode cache'; + + @override + String get cache_cleared => 'Cache cleared'; + + @override + String get clear_chapter_or_episode_cache_on_app_launch => + 'Clear chapter/episode cache on app launch'; + + @override + String get app_settings => 'App settings'; + + @override + String get sources_settings => 'Sources settings'; + + @override + String get include_sensitive_settings => + 'Include sensitive settings (e.g., tracker login tokens)'; + + @override + String get create => 'Create'; + + @override + String get downloads_are_limited_to_wifi => + 'Downloads are limited to Wi-Fi only'; + + @override + String get manga_extensions_repo => 'Manga extensions repo'; + + @override + String get anime_extensions_repo => 'Anime extensions repo'; + + @override + String get novel_extensions_repo => 'Novel extensions repo'; + + @override + String get undefined => 'undefined'; + + @override + String get empty_extensions_repo => + 'You don\'t have any repository urls here. Click on the plus button to add one!'; + + @override + String get add_extensions_repo => 'Add repo URL'; + + @override + String get remove_extensions_repo => 'Remove repo URL'; + + @override + String get manage_manga_repo_urls => 'Manage Manga Repo URLs'; + + @override + String get manage_anime_repo_urls => 'Manage Anime Repo URLs'; + + @override + String get manage_novel_repo_urls => 'Manage Novel Repo URLs'; + + @override + String get url_cannot_be_empty => 'URL cannot be empty'; + + @override + String get url_must_end_with_dot_json => 'URL must end with .json'; + + @override + String get repo_url => 'Repo URL'; + + @override + String get invalid_url_format => 'Invalid URL format'; + + @override + String get clear_all_sources => 'Clear all sources'; + + @override + String get clear_all_sources_msg => + 'This will completely erase all sources of the application. Are you sure you want to continue?'; + + @override + String get sources_cleared => 'Sources cleared!!!'; + + @override + String get repo_added => 'Source repository added!'; + + @override + String get add_repo => 'Add Repository?'; + + @override + String get genre_search_library => 'Search genre in library'; + + @override + String get genre_search_source => 'Browse in source'; + + @override + String get source_not_added => 'Source is not installed!'; + + @override + String get load_own_subtitles => 'Load your own subtitles...'; + + @override + String extension_notes(Object notes) { + return 'Notes: $notes'; + } + + @override + String get unsupported_repo => + 'You\'ve tried to add an unsupported repository. Please check the discord server for support!'; + + @override + String get end_of_chapter => 'End of chapter'; + + @override + String get chapter_completed => 'Chapter completed'; + + @override + String get continue_to_next_chapter => + 'Continue scrolling to read the next chapter'; + + @override + String get no_next_chapter => 'No next chapter'; + + @override + String get you_have_finished_reading => 'You have finished reading'; + + @override + String get return_to_the_list_of_chapters => 'Return to the list of chapters'; + + @override + String get hwdec => 'Hardware Decoder'; + + @override + String get track_library_navigate => 'Go to existing local entry'; + + @override + String get track_library_add => 'Add to local library'; + + @override + String get track_library_add_confirm => 'Add tracked item to local library'; + + @override + String get track_library_not_logged => + 'Login to the corresponding tracker to use this feature!'; + + @override + String get track_library_switch => 'Switch to another tracker'; + + @override + String get go_back => 'Go back'; + + @override + String get merge_library_nav_mobile => 'Merge library navigation on mobile'; + + @override + String get enable_discord_rpc => 'Enable Discord RPC'; + + @override + String get hide_discord_rpc_incognito => + 'Hide Discord RPC while in Incognito'; + + @override + String get rpc_show_reading_watching_progress => + 'Show current chapter in Discord (requires a restart)'; + + @override + String get rpc_show_title => 'Show current title in Discord'; + + @override + String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get sync_enable_histories => 'Sync history data'; + + @override + String get sync_enable_updates => 'Sync update data'; + + @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 Javascript 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_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 => 'Javascript code'; + + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'Javascript 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'; +} diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart new file mode 100644 index 00000000..877b0431 --- /dev/null +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -0,0 +1,1621 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hindi (`hi`). +class AppLocalizationsHi extends AppLocalizations { + AppLocalizationsHi([String locale = 'hi']) : super(locale); + + @override + String get library => 'पुस्तकालय'; + + @override + String get updates => 'अपडेट'; + + @override + String get history => 'इतिहास'; + + @override + String get browse => 'ब्राउज़'; + + @override + String get more => 'और'; + + @override + String get open_random_entry => 'कोई भी प्रविष्टि खोलें'; + + @override + String get import => 'आयात'; + + @override + String get filter => 'फ़िल्टर'; + + @override + String get ignore_filters => 'Ignore Filters'; + + @override + String get downloaded => 'डाउनलोड किया गया'; + + @override + String get unread => 'अपठित'; + + @override + String get unwatched => 'Unwatched'; + + @override + String get started => 'शुरू किया'; + + @override + String get bookmarked => 'बुकमार्क किया'; + + @override + String get sort => 'छाँटें'; + + @override + String get alphabetically => 'वर्णानुक्रम'; + + @override + String get last_read => 'आखिरी बार पढ़ा'; + + @override + String get last_watched => 'Last watched'; + + @override + String get last_update_check => 'आखिरी अपडेट जांच'; + + @override + String last_entry_delete_warning( + num count, + Object entryType, + Object entryTypePlural, + Object mediaType, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: + 'You are deleting all $count $entryTypePlural of this $mediaType from the library.', + one: + 'You are deleting the only $entryType of this $mediaType from the library.', + ); + return '$_temp0\nThis will also remove the whole $mediaType from your library.\n\nNote: The files themselves will not be deleted.'; + } + + @override + String get chapter => 'chapter'; + + @override + String get episode => 'episode'; + + @override + String get unread_count => 'अपठित गिनती'; + + @override + String get unwatched_count => 'Unwatched count'; + + @override + String get latest_chapter => 'नवीनतम अध्याय'; + + @override + String get latest_episode => 'Latest episode'; + + @override + String get date_added => 'जोड़ा गया तारीख'; + + @override + String get display => 'प्रदर्शन'; + + @override + String get display_mode => 'प्रदर्शन मोड'; + + @override + String get compact_grid => 'संक्षिप्त ग्रिड'; + + @override + String get comfortable_grid => 'आरामदायक ग्रिड'; + + @override + String get cover_only_grid => 'केवल कवर ग्रिड'; + + @override + String get list => 'सूची'; + + @override + String get badges => 'बैज'; + + @override + String get downloaded_chapters => 'डाउनलोड किए गए अध्याय'; + + @override + String get downloaded_episodes => 'Downloaded episodes'; + + @override + String get language => 'भाषा'; + + @override + String get local_source => 'स्थानीय स्रोत'; + + @override + String get tabs => 'टैब'; + + @override + String get show_category_tabs => 'श्रेणी टैब दिखाएँ'; + + @override + String get show_numbers_of_items => 'आइटम की संख्या दिखाएँ'; + + @override + String get other => 'अन्य'; + + @override + String get show_continue_reading_buttons => 'पढ़ना जारी रखें बटन दिखाएँ'; + + @override + String get show_continue_watching_buttons => 'Show continue watching buttons'; + + @override + String get empty_library => 'खाली पुस्तकालय'; + + @override + String get search => 'खोजें...'; + + @override + String get no_recent_updates => 'कोई हालिया अपडेट नहीं'; + + @override + String get remove_everything => 'सब कुछ हटाएँ'; + + @override + String get remove_everything_msg => + 'क्या आप निश्चित हैं? सारा इतिहास खो जाएगा'; + + @override + String get remove_all_update_msg => + 'Are you sure? The whole update will be cleared'; + + @override + String get ok => 'ठीक है'; + + @override + String get cancel => 'रद्द करें'; + + @override + String get remove => 'हटाएँ'; + + @override + String get remove_history_msg => + 'यह इस अध्याय की पढ़ने की तारीख को हटा देगा। क्या आप निश्चित हैं?'; + + @override + String get last_used => 'आखिरी बार उपयोग'; + + @override + String get pinned => 'पिन किया गया'; + + @override + String get sources => 'स्रोत'; + + @override + String get install => 'स्थापित करें'; + + @override + String get update => 'अपडेट करें'; + + @override + String get latest => 'नवीनतम'; + + @override + String get extensions => 'एक्सटेंशन'; + + @override + String get migrate => 'स्थानांतरण'; + + @override + String get migrate_confirm => 'Migrate to another source'; + + @override + String get clean_database => 'Clean database'; + + @override + String cleaned_database(Object x) { + return 'Database cleaned! $x entries removed'; + } + + @override + String get clean_database_desc => + 'This will remove all items that are not added to the library!'; + + @override + String get incognito_mode => 'गुप्त मोड'; + + @override + String get incognito_mode_description => 'पढ़ने का इतिहास रोकता है'; + + @override + String get download_queue => 'डाउनलोड कतार'; + + @override + String get categories => 'श्रेणियाँ'; + + @override + String get statistics => 'Statistics'; + + @override + String get settings => 'सेटिंग्स'; + + @override + String get about => 'के बारे में'; + + @override + String get help => 'मदद'; + + @override + String get no_downloads => 'कोई डाउनलोड नहीं'; + + @override + String get edit_categories => 'श्रेणियाँ संपादित करें'; + + @override + String get edit_categories_description => + 'आपके पास कोई श्रेणी नहीं है। अपनी लाइब्रेरी को व्यवस्थित करने के लिए प्लस बटन दबाएँ'; + + @override + String get add => 'जोड़ें'; + + @override + String get add_category => 'श्रेणी जोड़ें'; + + @override + String get name => 'नाम'; + + @override + String get category_name_required => '*आवश्यक'; + + @override + String get add_category_error_exist => 'इस नाम की श्रेणी पहले से मौजूद है!'; + + @override + String get delete_category => 'श्रेणी हटाएँ'; + + @override + String delete_category_msg(Object name) { + return 'क्या आप श्रेणी $name को हटाना चाहते हैं?'; + } + + @override + String get rename_category => 'श्रेणी का नाम बदलें'; + + @override + String get general => 'सामान्य'; + + @override + String get general_subtitle => 'ऐप की भाषा'; + + @override + String get app_language => 'ऐप की भाषा'; + + @override + String get default_subtitle_language => 'Default subtitle language'; + + @override + String get appearance => 'दिखावट'; + + @override + String get appearance_subtitle => 'थीम, तारीख और समय प्रारूप'; + + @override + String get theme => 'थीम'; + + @override + String get dark_mode => 'डार्क मोड'; + + @override + String get follow_system_theme => 'Follow system theme'; + + @override + String get on => 'चालू'; + + @override + String get off => 'बंद'; + + @override + String get pure_black_dark_mode => 'पूर्ण काला डार्क मोड'; + + @override + String get timestamp => 'समय चिह्न'; + + @override + String get relative_timestamp => 'सापेक्ष समय चिह्न'; + + @override + String get relative_timestamp_short => 'संक्षिप्त (आज, कल)'; + + @override + String get relative_timestamp_long => 'लंबा (संक्षिप्त+, n दिन पहले)'; + + @override + String get date_format => 'तारीख प्रारूप'; + + @override + String get reader => 'पढ़ने वाला'; + + @override + String get refresh => 'ताज़ा करें'; + + @override + String get reader_subtitle => 'पढ़ने का मोड, प्रदर्शन, नेविगेशन'; + + @override + String get default_reading_mode => 'डिफ़ॉल्ट पढ़ने का मोड'; + + @override + String get reading_mode_vertical => 'लंबवत'; + + @override + String get reading_mode_horizontal => 'क्षैतिज'; + + @override + String get reading_mode_left_to_right => 'बाएँ से दाएँ'; + + @override + String get reading_mode_right_to_left => 'दाएँ से बाएँ'; + + @override + String get reading_mode_vertical_continuous => 'लंबवत निरंतर'; + + @override + String get reading_mode_webtoon => 'वेबटून'; + + @override + String get double_tap_animation_speed => 'डबल टैप एनिमेशन गति'; + + @override + String get normal => 'सामान्य'; + + @override + String get fast => 'तेज़'; + + @override + String get no_animation => 'कोई एनिमेशन नहीं'; + + @override + String get animate_page_transitions => 'पेज ट्रांज़िशन को एनिमेट करें'; + + @override + String get crop_borders => 'किनारों को काटें'; + + @override + String get downloads => 'डाउनलोड'; + + @override + String get downloads_subtitle => 'डाउनलोड सेटिंग्स'; + + @override + String get download_location => 'डाउनलोड स्थान'; + + @override + String get custom_location => 'कस्टम स्थान'; + + @override + String get only_on_wifi => 'केवल वाईफाई पर'; + + @override + String get save_as_cbz_archive => 'सीबीजेड आर्काइव के रूप में सहेजें'; + + @override + String get concurrent_downloads => 'Concurrent downloads'; + + @override + String get browse_subtitle => 'स्रोत, वैश्विक खोज'; + + @override + String get only_include_pinned_sources => 'केवल पिन किए गए स्रोत शामिल करें'; + + @override + String get nsfw_sources => 'एनएसएफडब्ल्यू (+18) स्रोत'; + + @override + String get nsfw_sources_show => 'स्रोत और एक्सटेंशन सूची में दिखाएँ'; + + @override + String get nsfw_sources_info => + 'यह अनौपचारिक या संभावित रूप से गलत तरीके से चिह्नित एक्सटेंशन को ऐप के भीतर एनएसएफडब्ल्यू (18+) सामग्री को सामने लाने से नहीं रोकता'; + + @override + String get version => 'संस्करण'; + + @override + String get check_for_update => 'अपडेट के लिए जांचें'; + + @override + String n_days_ago(Object days) { + return '$days दिन पहले'; + } + + @override + String get today => 'आज'; + + @override + String get yesterday => 'कल'; + + @override + String get a_week_ago => 'एक सप्ताह पहले'; + + @override + String get add_to_library => 'पुस्तकालय में जोड़ें'; + + @override + String get completed => 'पूरा हुआ'; + + @override + String get ongoing => 'चल रहा है'; + + @override + String get on_hiatus => 'विराम पर'; + + @override + String get canceled => 'रद्द'; + + @override + String get publishing_finished => 'प्रकाशन समाप्त'; + + @override + String get unknown => 'अज्ञात'; + + @override + String get set_categories => 'श्रेणियाँ सेट करें'; + + @override + String get edit => 'संपादित करें'; + + @override + String get in_library => 'पुस्तकालय में'; + + @override + String get filter_scanlator_groups => 'स्कैनलेटर समूहों को फ़िल्टर करें'; + + @override + String get reset => 'रीसेट'; + + @override + String get by_source => 'स्रोत के अनुसार'; + + @override + String get by_chapter_number => 'अध्याय संख्या के अनुसार'; + + @override + String get by_episode_number => 'By episode number'; + + @override + String get by_upload_date => 'अपलोड तारीख के अनुसार'; + + @override + String get source_title => 'स्रोत शीर्षक'; + + @override + String get chapter_number => 'अध्याय संख्या'; + + @override + String get episode_number => 'Episode number'; + + @override + String get share => 'साझा करें'; + + @override + String n_chapters(Object number) { + return '$number अध्याय'; + } + + @override + String get no_description => 'कोई विवरण नहीं'; + + @override + String get resume => 'जारी रखें'; + + @override + String get read => 'पढ़ें'; + + @override + String get watch => 'Watch'; + + @override + String get popular => 'लोकप्रिय'; + + @override + String get open_in_browser => 'ब्राउज़र में खोलें'; + + @override + String get clear_cookie => 'कुकी साफ़ करें'; + + @override + String get show_page_number => 'पेज नंबर दिखाएँ'; + + @override + String get from_library => 'पुस्तकालय से'; + + @override + String get downloaded_chapter => 'डाउनलोड किया गया अध्याय'; + + @override + String page(Object page) { + return 'पेज $page'; + } + + @override + String get global_search => 'वैश्विक खोज'; + + @override + String get color_blend_level => 'रंग मिश्रण स्तर'; + + @override + String current(Object char) { + return 'वर्तमान $char'; + } + + @override + String finished(Object char) { + return 'समाप्त $char'; + } + + @override + String next(Object char) { + return 'अगला $char'; + } + + @override + String previous(Object char) { + return 'पिछला $char'; + } + + @override + String get no_more_chapter => 'कोई और अध्याय नहीं है'; + + @override + String get no_result => 'कोई परिणाम नहीं'; + + @override + String get send => 'भेजें'; + + @override + String get delete => 'हटाएँ'; + + @override + String get start_downloading => 'अब डाउनलोड शुरू करें'; + + @override + String get retry => 'पुनः प्रयास करें'; + + @override + String get add_chapters => 'अध्याय जोड़ें'; + + @override + String get delete_chapters => 'अध्याय हटाएँ?'; + + @override + String get default0 => 'डिफ़ॉल्ट'; + + @override + String get total_chapters => 'कुल अध्याय'; + + @override + String get total_episodes => 'Total episodes'; + + @override + String get import_local_file => 'स्थानीय फ़ाइल आयात करें'; + + @override + String get import_files => 'फ़ाइलें'; + + @override + String get nothing_read_recently => 'हाल ही में कुछ भी नहीं पढ़ा'; + + @override + String get status => 'स्थिति'; + + @override + String get not_started => 'शुरू नहीं हुआ'; + + @override + String get score => 'स्कोर'; + + @override + String get start_date => 'शुरू की तारीख'; + + @override + String get finish_date => 'समाप्ति की तारीख'; + + @override + String get reading => 'पढ़ रहा है'; + + @override + String get on_hold => 'रोक पर'; + + @override + String get dropped => 'छोड़ दिया'; + + @override + String get plan_to_read => 'पढ़ने की योजना'; + + @override + String get re_reading => 'पुनः पढ़ रहा है'; + + @override + String get chapters => 'अध्याय'; + + @override + String get add_tracker => 'ट्रैकर जोड़ें'; + + @override + String get one_tracker => '1 ट्रैकर'; + + @override + String n_tracker(Object n) { + return '$n ट्रैकर'; + } + + @override + String get tracking => 'ट्रैकिंग'; + + @override + String get syncing => 'Sync'; + + @override + String get sync_password => 'Password (at least 8 characters)'; + + @override + String get sync_logged => 'Login successful'; + + @override + String get syncing_subtitle => + 'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!'; + + @override + String get last_sync_manga => 'Last manga sync at: '; + + @override + String get last_sync_history => 'Last history sync at: '; + + @override + String get last_sync_update => 'Last update sync at: '; + + @override + String get sync_server => 'Sync Server Address'; + + @override + String get sync_login_invalid_creds => 'Invalid email or password'; + + @override + String get sync_starting => 'Starting sync...'; + + @override + String get sync_finished => 'Sync finished'; + + @override + String get sync_failed => 'Sync failed'; + + @override + String get sync_button_sync => 'Sync progress'; + + @override + String get sync_on => 'Enable sync'; + + @override + String get sync_auto => 'Auto Sync'; + + @override + String get sync_auto_warning => + 'Auto Sync is currently an experimental feature!'; + + @override + String get sync_auto_off => 'Off'; + + @override + String get sync_auto_5_minutes => 'Every 5 minutes'; + + @override + String get sync_auto_10_minutes => 'Every 10 minutes'; + + @override + String get sync_auto_30_minutes => 'Every 30 minutes'; + + @override + String get sync_auto_1_hour => 'Every 1 hour'; + + @override + String get sync_auto_3_hours => 'Every 3 hours'; + + @override + String get sync_auto_6_hours => 'Every 6 hours'; + + @override + String get sync_auto_12_hours => 'Every 12 hours'; + + @override + String get server_error => 'Server error!'; + + @override + String get dialog_confirm => 'Confirm'; + + @override + String get description => 'विवरण'; + + @override + String get reorder_navigation => 'Customize navigation'; + + @override + String get reorder_navigation_description => + 'Reorder and toggle each navigation to your needs.'; + + @override + String get full_screen_player => 'Use Fullscreen'; + + @override + String get full_screen_player_info => + 'Automatically use fullscreen when playing a video.'; + + @override + String episode_progress(Object n) { + return 'प्रगति: $n'; + } + + @override + String n_episodes(Object n) { + return '$n एपिसोड'; + } + + @override + String get manga_sources => 'मंगा स्रोत'; + + @override + String get anime_sources => 'एनीमे स्रोत'; + + @override + String get novel_sources => 'Novel Sources'; + + @override + String get anime_extensions => 'एनीमे एक्सटेंशन'; + + @override + String get manga_extensions => 'मंगा एक्सटेंशन'; + + @override + String get novel_extensions => 'Novel Extensions'; + + @override + String get anime => 'एनीमे'; + + @override + String get manga => 'मंगा'; + + @override + String get novel => 'Novel'; + + @override + String get library_no_category_exist => 'आपके पास अभी कोई श्रेणी नहीं है'; + + @override + String get watching => 'देख रहा है'; + + @override + String get plan_to_watch => 'देखने की योजना'; + + @override + String get re_watching => 'पुनः देख रहा है'; + + @override + String get episodes => 'एपिसोड'; + + @override + String get download => 'डाउनलोड'; + + @override + String get new_update_available => 'नया अपडेट उपलब्ध'; + + @override + String app_version(Object v) { + return 'ऐप संस्करण: v$v'; + } + + @override + String get searching_for_updates => 'अपडेट की खोज हो रही है...'; + + @override + String get no_new_updates_available => 'कोई नया अपडेट उपलब्ध नहीं'; + + @override + String get uninstall => 'हटाएँ'; + + @override + String uninstall_extension(Object ext) { + return '$ext एक्सटेंशन हटाएँ?'; + } + + @override + String get langauage => 'भाषा'; + + @override + String get extension_detail => 'एक्सटेंशन विवरण'; + + @override + String get scale_type => 'स्केल प्रकार'; + + @override + String get scale_type_fit_screen => 'स्क्रीन पर फिट'; + + @override + String get scale_type_stretch => 'खींचें'; + + @override + String get scale_type_fit_width => 'चौड़ाई पर फिट'; + + @override + String get scale_type_fit_height => 'ऊँचाई पर फिट'; + + @override + String get scale_type_original_size => 'मूल आकार'; + + @override + String get scale_type_smart_fit => 'स्मार्ट फिट'; + + @override + String get page_preload_amount => 'पेज प्रीलोड मात्रा'; + + @override + String get page_preload_amount_subtitle => + 'पढ़ते समय प्रीलोड करने वाले पेजों की मात्रा। उच्च मानों से पढ़ने का अनुभव बेहतर होगा, लेकिन कैश और नेटवर्क उपयोग अधिक होगा।'; + + @override + String get image_loading_error => 'यह छवि लोड नहीं हो सकी'; + + @override + String get add_episodes => 'एपिसोड जोड़ें'; + + @override + String get video_quality => 'गुणवत्ता'; + + @override + String get video_subtitle => 'उपशीर्षक'; + + @override + String get check_for_extension_updates => 'एक्सटेंशन अपडेट की जाँच करें'; + + @override + String get auto_extensions_updates => 'स्वचालित एक्सटेंशन अपडेट'; + + @override + String get auto_extensions_updates_subtitle => + 'जब नया संस्करण उपलब्ध होगा तो एक्सटेंशन स्वचालित रूप से अपडेट हो जाएगा।'; + + @override + String get check_for_app_updates => 'Check for app updates on startup'; + + @override + String get reading_mode => 'पढ़ने का मोड'; + + @override + String get custom_filter => 'कस्टम फ़िल्टर'; + + @override + String get background_color => 'पृष्ठभूमि रंग'; + + @override + String get white => 'सफेद'; + + @override + String get black => 'काला'; + + @override + String get grey => 'ग्रे'; + + @override + String get automaic => 'स्वचालित'; + + @override + String get preferred_domain => 'पसंदीदा डोमेन'; + + @override + String get load_more => 'और लोड करें'; + + @override + String get cancel_all_for_this_series => 'इस सीरीज़ के लिए सभी रद्द करें'; + + @override + String get login => 'लॉगिन'; + + @override + String login_into(Object tracker) { + return '$tracker में लॉगिन करें'; + } + + @override + String get email_adress => 'ईमेल पता'; + + @override + String get password => 'पासवर्ड'; + + @override + String log_out_from(Object tracker) { + return '$tracker से लॉग आउट करें?'; + } + + @override + String get log_out => 'लॉग आउट'; + + @override + String get update_pending => 'अपडेट लंबित'; + + @override + String get update_all => 'सभी अपडेट करें'; + + @override + String get backup_and_restore => 'बैकअप और पुनर्स्थापना'; + + @override + String get create_backup => 'बैकअप बनाएँ'; + + @override + String get create_backup_dialog_title => 'आप क्या बैकअप करना चाहते हैं?'; + + @override + String get create_backup_subtitle => + 'वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है'; + + @override + String get restore_backup => 'बैकअप पुनर्स्थापित करें'; + + @override + String get restore_backup_subtitle => + 'बैकअप फ़ाइल से पुस्तकालय पुनर्स्थापित करें'; + + @override + String get automatic_backups => 'स्वचालित बैकअप'; + + @override + String get backup_frequency => 'बैकअप आवृत्ति'; + + @override + String get backup_location => 'बैकअप स्थान'; + + @override + String get backup_options => 'बैकअप विकल्प'; + + @override + String get backup_options_dialog_title => 'आप क्या बैकअप करना चाहते हैं?'; + + @override + String get backup_options_subtitle => + 'बैकअप फ़ाइल में क्या जानकारी शामिल करनी है'; + + @override + String get backup_and_restore_warning_info => + 'आपको बैकअप की प्रतियां अन्य स्थानों पर भी रखनी चाहिए'; + + @override + String get library_entries => 'पुस्तकालय प्रविष्टियाँ'; + + @override + String get chapters_and_episode => 'अध्याय और एपिसोड'; + + @override + String get every_6_hours => 'हर 6 घंटे'; + + @override + String get every_12_hours => 'हर 12 घंटे'; + + @override + String get daily => 'दैनिक'; + + @override + String get every_2_days => 'हर 2 दिन'; + + @override + String get weekly => 'साप्ताहिक'; + + @override + String get restore_backup_warning_title => + 'बैकअप पुनर्स्थापित करने से सभी मौजूदा डेटा अधिलेखित हो जाएगा।\n\nपुनर्स्थापना जारी रखें?'; + + @override + String get services => 'सेवाएँ'; + + @override + String get tracking_warning_info => + 'ट्रैकिंग सेवाओं में अध्याय प्रगति को अपडेट करने के लिए एकतरफा समन्वय। व्यक्तिगत प्रविष्टियों के लिए ट्रैकिंग सेट करें।'; + + @override + String get use_page_tap_zones => 'पेज टैप ज़ोन का उपयोग करें'; + + @override + String get manage_trackers => 'ट्रैकर्स प्रबंधित करें'; + + @override + String get restore => 'पुनर्स्थापित करें'; + + @override + String get backups => 'बैकअप'; + + @override + String get by_scanlator => 'स्कैनलेटर के अनुसार'; + + @override + String get by_name => 'नाम के अनुसार'; + + @override + String get installed => 'स्थापित'; + + @override + String get auto_scroll => 'स्वचालित स्क्रॉल'; + + @override + String get video_audio => 'ऑडियो'; + + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + + @override + String get player => 'प्लेयर'; + + @override + String get markEpisodeAsSeenSetting => + 'एपिसोड को कब देखा गया के रूप में चिह्नित करना है'; + + @override + String get default_skip_intro_length => 'डिफ़ॉल्ट परिचय छोड़ने की अवधि'; + + @override + String get default_playback_speed_length => 'डिफ़ॉल्ट प्लेबैक गति अवधि'; + + @override + String get updateProgressAfterReading => 'पढ़ने के बाद प्रगति अपडेट करें'; + + @override + String get no_sources_installed => 'कोई स्रोत स्थापित नहीं है!'; + + @override + String get show_extensions => 'एक्सटेंशन दिखाएँ'; + + @override + String get default_skip_forward_skip_length => + 'Default skip forward skip length'; + + @override + String get aniskip_requires_info => + 'AniSkip requires the anime to be tracked with MAL or Anilist to work.'; + + @override + String get enable_aniskip => 'Enable AniSkip'; + + @override + String get enable_auto_skip => 'Enable auto skip'; + + @override + String get aniskip_button_timeout => 'Button timeout'; + + @override + String get skip_opening => 'Skip opening'; + + @override + String get skip_ending => 'Skip ending'; + + @override + String get fullscreen => 'Fullscreen'; + + @override + String get update_library => 'Update library'; + + @override + String updating_library(Object cur, Object failed, Object max) { + return 'Updating library ($cur / $max) - Failed: $failed'; + } + + @override + String get next_chapter => 'Next chapter'; + + @override + String get next_5_chapters => 'Next 5 chapters'; + + @override + String get next_10_chapters => 'Next 10 chapters'; + + @override + String get next_25_chapters => 'Next 25 chapters'; + + @override + String get all_chapters => 'All chapters'; + + @override + String get next_episode => 'Next episode'; + + @override + String get next_5_episodes => 'Next 5 episodes'; + + @override + String get next_10_episodes => 'Next 10 episodes'; + + @override + String get next_25_episodes => 'Next 25 episodes'; + + @override + String get all_episodes => 'All episodes'; + + @override + String get cover_saved => 'Cover saved'; + + @override + String get set_as_cover => 'Set as cover'; + + @override + String get use_this_as_cover_art => 'Use this as cover art?'; + + @override + String get save => 'Save'; + + @override + String get picture_saved => 'Picture saved'; + + @override + String get cover_updated => 'Cover updated'; + + @override + String get include_subtitles => 'Include subtitles'; + + @override + String get blend_mode_default => 'Default'; + + @override + String get blend_mode_multiply => 'Multiply'; + + @override + String get blend_mode_screen => 'Screen'; + + @override + String get blend_mode_overlay => 'Overlay'; + + @override + String get blend_mode_colorDodge => 'ColorDodge'; + + @override + String get blend_mode_lighten => 'Lighten'; + + @override + String get blend_mode_colorBurn => 'ColorBurn'; + + @override + String get blend_mode_darken => 'Darken'; + + @override + String get blend_mode_difference => 'Difference'; + + @override + String get blend_mode_saturation => 'Saturation'; + + @override + String get blend_mode_softLight => 'SoftLight'; + + @override + String get blend_mode_plus => 'Plus'; + + @override + String get blend_mode_exclusion => 'Exclusion'; + + @override + String get custom_color_filter => 'Custom color filter'; + + @override + String get color_filter_blend_mode => 'Color filter blend mode'; + + @override + String get enable_all => 'Enable all'; + + @override + String get disable_all => 'Disable all'; + + @override + String get font => 'Font'; + + @override + String get color => 'Color'; + + @override + String get font_size => 'Font size'; + + @override + String get text => 'Text'; + + @override + String get border => 'Border'; + + @override + String get background => 'Background'; + + @override + String get no_subtite_warning_message => + 'Has no effect because there aren\'t any subtitle tracks in this video'; + + @override + String get grid_size => 'Grid size'; + + @override + String n_per_row(Object n) { + return '$n per row'; + } + + @override + String get horizontal_continious => 'Horizontal continuous'; + + @override + String get edit_code => 'Edit code'; + + @override + String get use_libass => 'Enable libass'; + + @override + String get use_libass_info => + 'Use libass based subtitle rendering for native backend.'; + + @override + String get libass_not_disable_message => + 'Disable `use libass` in player settings to be able to customize the subtitles.'; + + @override + String get torrent_stream => 'Torrent Stream'; + + @override + String get add_torrent => 'Add torrent'; + + @override + String get enter_torrent_hint_text => 'Enter magnet or torrent file url'; + + @override + String get torrent_url => 'Torrent url'; + + @override + String get or => 'OR'; + + @override + String get advanced => 'Advanced'; + + @override + String get advanced_info => 'mpv config'; + + @override + String get use_native_http_client => 'Use native http client'; + + @override + String get use_native_http_client_info => + 'it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling'; + + @override + String n_hour_ago(Object hour) { + return '$hour hour ago'; + } + + @override + String n_hours_ago(Object hours) { + return '$hours hours ago'; + } + + @override + String n_minute_ago(Object minute) { + return '$minute minute ago'; + } + + @override + String n_minutes_ago(Object minutes) { + return '$minutes minutes ago'; + } + + @override + String n_day_ago(Object day) { + return '$day day ago'; + } + + @override + String get now => 'now'; + + @override + String library_last_updated(Object lastUpdated) { + return 'Library last updated: $lastUpdated'; + } + + @override + String get data_and_storage => 'Data and storage'; + + @override + String get download_location_info => 'Used for chapter downloads'; + + @override + String get storage => 'Storage'; + + @override + String get clear_chapter_and_episode_cache => + 'Clear chapter and episode cache'; + + @override + String get cache_cleared => 'Cache cleared'; + + @override + String get clear_chapter_or_episode_cache_on_app_launch => + 'Clear chapter/episode cache on app launch'; + + @override + String get app_settings => 'App settings'; + + @override + String get sources_settings => 'Sources settings'; + + @override + String get include_sensitive_settings => + 'Include sensitive settings (e.g., tracker login tokens)'; + + @override + String get create => 'Create'; + + @override + String get downloads_are_limited_to_wifi => + 'Downloads are limited to Wi-Fi only'; + + @override + String get manga_extensions_repo => 'Manga extensions repo'; + + @override + String get anime_extensions_repo => 'Anime extensions repo'; + + @override + String get novel_extensions_repo => 'Novel extensions repo'; + + @override + String get undefined => 'undefined'; + + @override + String get empty_extensions_repo => + 'You don\'t have any repository urls here. Click on the plus button to add one!'; + + @override + String get add_extensions_repo => 'Add repo URL'; + + @override + String get remove_extensions_repo => 'Remove repo URL'; + + @override + String get manage_manga_repo_urls => 'Manage Manga Repo URLs'; + + @override + String get manage_anime_repo_urls => 'Manage Anime Repo URLs'; + + @override + String get manage_novel_repo_urls => 'Manage Novel Repo URLs'; + + @override + String get url_cannot_be_empty => 'URL cannot be empty'; + + @override + String get url_must_end_with_dot_json => 'URL must end with .json'; + + @override + String get repo_url => 'Repo URL'; + + @override + String get invalid_url_format => 'Invalid URL format'; + + @override + String get clear_all_sources => 'Clear all sources'; + + @override + String get clear_all_sources_msg => + 'This will completely erase all sources of the application. Are you sure you want to continue?'; + + @override + String get sources_cleared => 'Sources cleared!!!'; + + @override + String get repo_added => 'Source repository added!'; + + @override + String get add_repo => 'Add Repository?'; + + @override + String get genre_search_library => 'Search genre in library'; + + @override + String get genre_search_source => 'Browse in source'; + + @override + String get source_not_added => 'Source is not installed!'; + + @override + String get load_own_subtitles => 'Load your own subtitles...'; + + @override + String extension_notes(Object notes) { + return 'Notes: $notes'; + } + + @override + String get unsupported_repo => + 'You\'ve tried to add an unsupported repository. Please check the discord server for support!'; + + @override + String get end_of_chapter => 'End of chapter'; + + @override + String get chapter_completed => 'Chapter completed'; + + @override + String get continue_to_next_chapter => + 'Continue scrolling to read the next chapter'; + + @override + String get no_next_chapter => 'No next chapter'; + + @override + String get you_have_finished_reading => 'You have finished reading'; + + @override + String get return_to_the_list_of_chapters => 'Return to the list of chapters'; + + @override + String get hwdec => 'Hardware Decoder'; + + @override + String get track_library_navigate => 'Go to existing local entry'; + + @override + String get track_library_add => 'Add to local library'; + + @override + String get track_library_add_confirm => 'Add tracked item to local library'; + + @override + String get track_library_not_logged => + 'Login to the corresponding tracker to use this feature!'; + + @override + String get track_library_switch => 'Switch to another tracker'; + + @override + String get go_back => 'Go back'; + + @override + String get merge_library_nav_mobile => 'Merge library navigation on mobile'; + + @override + String get enable_discord_rpc => 'Enable Discord RPC'; + + @override + String get hide_discord_rpc_incognito => + 'Hide Discord RPC while in Incognito'; + + @override + String get rpc_show_reading_watching_progress => + 'Show current chapter in Discord (requires a restart)'; + + @override + String get rpc_show_title => 'Show current title in Discord'; + + @override + String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get sync_enable_histories => 'Sync history data'; + + @override + String get sync_enable_updates => 'Sync update data'; + + @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 Javascript 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_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 => 'Javascript code'; + + @override + String get custom_buttons_js_code_req => 'Javascript code required'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'Javascript 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'; +} From d368e908fee7f7bcaa1ee22ffca57a4fbc77884b Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 31 Jul 2025 03:44:19 +0200 Subject: [PATCH 026/100] fix storage permission --- lib/modules/anime/anime_player_view.dart | 7 +++---- .../more/settings/player/player_advanced_screen.dart | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 385b5a3b..00d3b01b 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -672,11 +672,10 @@ class _AnimeStreamPageState extends riv.ConsumerState final primaryButton = customButtons.firstWhereOrNull((e) => e.isFavourite ?? false) ?? customButtons.first; - var status = await Permission.storage.status; - if (!status.isGranted) { - await Permission.storage.request(); - } final provider = StorageProvider(); + if (!(await provider.requestPermission())) { + return; + } final dir = await provider.getMpvDirectory(); String scriptsDir = path.join(dir!.path, 'scripts'); final mpvFile = File('$scriptsDir/init_custom_buttons.js'); diff --git a/lib/modules/more/settings/player/player_advanced_screen.dart b/lib/modules/more/settings/player/player_advanced_screen.dart index e891bf94..c089c46d 100644 --- a/lib/modules/more/settings/player/player_advanced_screen.dart +++ b/lib/modules/more/settings/player/player_advanced_screen.dart @@ -63,11 +63,10 @@ class _PlayerAdvancedScreenState extends ConsumerState { BuildContext context, { bool redownload = false, }) async { - var status = await Permission.storage.status; - if (!status.isGranted) { - await Permission.storage.request(); - } final provider = StorageProvider(); + if (!(await provider.requestPermission())) { + return false; + } final dir = await provider.getMpvDirectory(); final mpvFile = File('${dir!.path}/mpv.conf'); final inputFile = File('${dir.path}/input.conf'); From f25233182a914fa9bfb8695b882d107605354b94 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 31 Jul 2025 19:58:41 +0200 Subject: [PATCH 027/100] removed unused imports --- lib/modules/anime/anime_player_view.dart | 1 - lib/modules/more/settings/player/player_advanced_screen.dart | 1 - .../more/settings/player/providers/player_state_provider.dart | 1 - 3 files changed, 3 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 00d3b01b..7678eed5 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -49,7 +49,6 @@ import 'package:numberpicker/numberpicker.dart'; import 'package:path/path.dart' as p; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:share_plus/share_plus.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; diff --git a/lib/modules/more/settings/player/player_advanced_screen.dart b/lib/modules/more/settings/player/player_advanced_screen.dart index c089c46d..39a71462 100644 --- a/lib/modules/more/settings/player/player_advanced_screen.dart +++ b/lib/modules/more/settings/player/player_advanced_screen.dart @@ -9,7 +9,6 @@ import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:path/path.dart' as path; -import 'package:permission_handler/permission_handler.dart'; class PlayerAdvancedScreen extends ConsumerStatefulWidget { const PlayerAdvancedScreen({super.key}); diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 5660fc4a..5996fb87 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'dart:ui'; import 'package:mangayomi/main.dart'; From 0fea3ab84e5dd7c0ce65bc804a278811ac28dd66 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 1 Aug 2025 02:57:05 +0200 Subject: [PATCH 028/100] switched to lua scripts --- assets/mangayomi_mpv.zip | Bin 1209958 -> 1192878 bytes lib/l10n/app_en.arb | 10 ++-- lib/l10n/generated/app_localizations.dart | 10 ++-- lib/l10n/generated/app_localizations_ar.dart | 11 ++-- lib/l10n/generated/app_localizations_as.dart | 11 ++-- lib/l10n/generated/app_localizations_de.dart | 11 ++-- lib/l10n/generated/app_localizations_en.dart | 11 ++-- lib/l10n/generated/app_localizations_es.dart | 11 ++-- lib/l10n/generated/app_localizations_fr.dart | 11 ++-- lib/l10n/generated/app_localizations_hi.dart | 11 ++-- lib/l10n/generated/app_localizations_id.dart | 11 ++-- lib/l10n/generated/app_localizations_it.dart | 11 ++-- lib/l10n/generated/app_localizations_pt.dart | 11 ++-- lib/l10n/generated/app_localizations_ru.dart | 11 ++-- lib/l10n/generated/app_localizations_th.dart | 11 ++-- lib/l10n/generated/app_localizations_tr.dart | 11 ++-- lib/l10n/generated/app_localizations_zh.dart | 11 ++-- lib/modules/anime/anime_player_view.dart | 24 +++++---- lib/providers/storage_provider.dart | 27 ++++++---- pubspec.lock | 54 ++++++++++--------- pubspec.yaml | 5 +- 21 files changed, 144 insertions(+), 140 deletions(-) diff --git a/assets/mangayomi_mpv.zip b/assets/mangayomi_mpv.zip index 64e16ae08da797a2dc66a5544d202d10b076a098..2f3ef3c621c86e1109744ea3d869d8b57a42db03 100644 GIT binary patch delta 6128 zcmZvg2|QHm8^_OBhGA?+Mr7Y6FK(=hLl{}1%1&8C>E^D%`<&M8b42`adT-fatX zCn1O-FM`OXWXneHJLrCC^I!X8^~6o36QhgzEsk5RG2T9vdevN%T60=@oL}>LZ@}9g zaqIT}@cRmP{o_+EkEHVH=Blpucy1~v>~*D9t1~n#-6yg&UwR#j6w&VTW$fNEm&25k zQehK@%u)^CQ?eUQl(%I_{CRiT%Bu!D)=3Y!2#vntyS(Vb_k{-05fL6Ym!}KfmaC6j zB9?2g!=?4FZz)of9x*1`*4LBt7!$+xHLCfNXKBu+{LLXoGwZkLq+XQjEg4S97Ec?@ zvoar$U7gt7^D(hGXGs05b?^mkPfcC+3dPpl**e==mgg@%{(eAX^~HPcV<(TeXcq`X z8CiGSomJKuoppWQDm5A1lxdKWpRqWjaT(L?(=GlloxFNYQX1LiRB?;nqgJyDRoi$* zkC5autAyDFwGWQpb83B6)pjDHz9i1vN;o!9pSo#-Td6cU@%WwSN~hI5PgIHMc3NrP? zf16DCAWGBLQm?RUb=-dX)|=j??uhmvV`7Eo_?@>dndj2f#G_J|Y?6y;ULOC#Aud&l zmKy03eYY%gI(vGiVnA)1ywwGdHv_SMy}M7Du^&qa=o1M!cVX2+C6~QR7+a*sT}PkR z#ni0N`&K?4BhNg2eu%V2BieItTl~j-O1t5ttdIQRFulDl+l!y}H`Fy1ZtU(|&Pp6V zabiPi`wC{NmeKS3n7t5xMV;x2CiS}HW8(++`5W9@uq^$HO3|o3!=&<^lAV|B`EIlB zMc6f;B+BkMa#W0#dCm*i zD4IrD>P`=G(#S8=bsKl7$(PuU{WbFCpR|T1=Y@N-9E6zZXS!eA@%iZ8(S5zMIsd?g zm(ob&Gz;O)I=uBapA_dac7EO`quVLxdL#>O(6f9L9s9kNnKMb9uL_%dDFp%Tzdm_h z9n(_nnq9^&d&=%$lvjyflUt);cmBaGyMNB0{O|YZKB<-$Yx_i{R0MV$ zpItxo^sW0Hl_Oit-b58l-SMtU&eZ&LWw*qg(9gn~gZ?Bh%eF9&Sllpa{LD;DJ1yOB zS<6`MdfuIp2cPVpnYUp&c}UKcB&CmoV8iIiA&4^T5Lp@DF9SPv2W09kh;+%F5jb{b z>yi`O9FO#5qZdj$H`o{1iZX_nWhG_0({D<6oq5#)Z8mO^)kN2g_S8)ViqZ0H zh6Bw`imUe5rYNF|ChhFPH+;W8yy>ZpZ()yNXd2i zUUULUNQ@kbKJseKcViP)*4raT*>UgBpnYdr-aKJ+6vi2^*x(>GDplPUU&s2gy7zu` zQkY`1RFSkjsf%_sktY)E3>wm_N$KnESy`nR_@TP(Y`Xs4oSm;xL-T3PJ>Ngs_N986 z%20lPkjT8k{4A!YmTmcu)!STlUG7MURe)EjRN?$Qvs<`Ix0N&OZ%^+FJCD=pZS*f-Ru?Kc!#lTyt+DqaV1n= zKcws?mM0S4hD;27ozzy4%^4`y%em=vrp~r`XRPOo&J!_PG^@HUEw69%5RLTBt4-Q= z!hM_k=bmyslW3pV9N$<{3F(kwPfgs>kg>`WX1k4%gT8#Bn!Kk%gR^c*W4D6c##Y`0nh7%ikQ$j(jt&25>lW)06zEo5ji?ys+QXHf|{o$rp zeDPBM=a*jvbYFWGuW5O{!`SS@^-$J&h290n0*5xge(1o8&fke8KYph4YF2CPMsKXj zMDjmlr`~=&@%oJJlBu5d{C}(mK0f?B93EF-@mj*Gb9;nh)VV0S(wWQe`JS%1)Vi^K zsRP;8hra)GYvhFq(#WUa)YMxdss{!=P9~TiPf&c(sz`feeqde8Hk4&QG<95ZuR+3B z3ftoTnX8VjeN%FDpTi~>+rwQZp3v)@W5R4tjvfswSK7+(V_c8v`ko;gVH4)o6f`0t zHF4vS%k`qODwX!5vLoJq@9k|E>g>R}1RPy%H!jUC=NTM%rLOvDBl5zy(%|Vw5yZr% z_4ps6dv};rsQa3z-uuQ1x6Cs+?JSZC^v1StBJF`s6DnSk*cC5%SV?fKT@bHf1s)~DYw@w;wfKdI`>ay_>T)<@ zn?LyoOwR5&Kz1Xd^n*i{#G{B1O%y1L6Zk;>_eTg( zn~Rme)dD-^jLIy|s(8HmCaItF3{Q?h!=n5gY41$o5 zg@|lc_w`_4gScYiyHJ|qe|j;F^eLb-+YFBQ`6`;ukJsQTKdxIRuFUhowYfl4I8?Q; zqFt!UmY;MfN&#Cvfo_jp*7QDb6{e7E@xO`1B6R=r8N{I*!pAyHR#N*(_d1hy!4K#t zA5JIZzV)}350Wrr7gUEQRRHsKK^0a#OWs?CKl=R$>pxS$>oY@t=VmU7AZnVR(d9^4 zF2K5DrD#8YeHsVbVXY=k<=(=Jf4R7ltLSXIhp{*4epitZWHE=R5e?IKMVHaj1UjIS zMbssz6rFgRn-X@?6kwO3$H+wWCeb4I&?oEKDBx=a~XwHF1eazm+fcSlaRulg=m_&pA5 zX#!XY`^6oA!xss#{vDB3Q>>aR=!DXyg)&fk>1CQ^t2g z@UFi%M>vB{PJ;B)JM`=h1S|GN) z1dhG*LQ%S9AAxpVB2bfI?x>bga+SiUd%z+ZIblWKs4BK;4~kmmF7AUSSOX={gt`7h zt|o4D?WC#6AjmHkVApV%a5_fFJp^)e4F^JQ@M|fQGpOV$ht1$d9^?|_Y9CZmRA^N{ zG=l!k1|;U{Ggrsw9YU+$mm|m~1D>BwlAXG|cpX)+a=@?UuO;}PjpZ#;KtHLy6}TT;-#I^%;@>aE06z^&d4A&02J^#x zg;kgG3t-oL!Nz)6G+(5jwD>|jH&a-@FIWyYZEVUHT|%$wCLm*@+i)fUn;W=7oBROu zbSdWNhiZwwSAPoa5)hW-_v3AY4`Qsuy8Tc+`le7~P`hjuR8H<`=BoV5Ua(o~8Dy-O zi7H|5V##Ez(I2I*Rjwg;sV@XyZqvezce3u&xHi2ML5x^GpTv7|=0w--2fM|^_!%_) zubz45e!yuVF!V)Xd&FB#Q48!!Ay$z7hh|QXs5Zf1wN?4Xo z61eiRc9^;E+yFPzPDe7Wcku}#NZCRJbo=waKEzq#a=%z+t{sC$f~^UqWUr@Om8Qf! zhBkoz@9Y9SB8@|-b`xe0f~wI;X`D*T8(fvJs1UFv&F!$v5YQ#fHWN^uZwH)6KJtuP zdTbDfE_q?oA*c>LPX2G`xxSuCt~4hO)x&-O@Q0S8bzJ;RcqGG#hps)5(ssXI6o zHY|ZfYoIia{ympTDCjTsdVHDG`LFG6MEf5@s3-QBHlKXS6hM3Q`T>BLmx+skxG8~5d jBru6kl>UpDE~ip#;SVK#USPNs#|r>bTI2(aHe> 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 diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index bc12ce57..8ba08800 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -481,16 +481,16 @@ "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 Javascript code with 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_delete": "Delete custom button", "custom_buttons_text": "Button text", "custom_buttons_text_req": "Button text required", - "custom_buttons_js_code": "Javascript code", - "custom_buttons_js_code_req": "Javascript code required", - "custom_buttons_js_code_long": "Javascript code (on long press)", - "custom_buttons_startup": "Javascript code (on startup)", + "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", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 4b5ceb5f..bebd8b04 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2964,7 +2964,7 @@ abstract class AppLocalizations { /// No description provided for @custom_buttons_info. /// /// In en, this message translates to: - /// **'Execute Javascript code with custom buttons'** + /// **'Execute lua code with custom buttons'** String get custom_buttons_info; /// No description provided for @custom_buttons_edit. @@ -3000,25 +3000,25 @@ abstract class AppLocalizations { /// No description provided for @custom_buttons_js_code. /// /// In en, this message translates to: - /// **'Javascript code'** + /// **'lua code'** String get custom_buttons_js_code; /// No description provided for @custom_buttons_js_code_req. /// /// In en, this message translates to: - /// **'Javascript code required'** + /// **'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: - /// **'Javascript code (on long press)'** + /// **'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: - /// **'Javascript code (on startup)'** + /// **'lua code (on startup)'** String get custom_buttons_startup; /// No description provided for @n_days. diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 6a7b7c8e..227acac3 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1524,8 +1524,7 @@ class AppLocalizationsAr extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1543,16 +1542,16 @@ class AppLocalizationsAr extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index d90c7639..8c0be63c 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1526,8 +1526,7 @@ class AppLocalizationsAs extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1545,16 +1544,16 @@ class AppLocalizationsAs extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 94cd4f50..e2d393e3 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1537,8 +1537,7 @@ class AppLocalizationsDe extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1556,16 +1555,16 @@ class AppLocalizationsDe extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 3a06fe3a..00613692 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1525,8 +1525,7 @@ class AppLocalizationsEn extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1544,16 +1543,16 @@ class AppLocalizationsEn extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 2badf647..db104223 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1542,8 +1542,7 @@ class AppLocalizationsEs extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1561,16 +1560,16 @@ class AppLocalizationsEs extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 3e884093..13cf52b3 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1543,8 +1543,7 @@ class AppLocalizationsFr extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1562,16 +1561,16 @@ class AppLocalizationsFr extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 877b0431..ba999035 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1527,8 +1527,7 @@ class AppLocalizationsHi extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1546,16 +1545,16 @@ class AppLocalizationsHi extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 00de1ae8..11e86435 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1531,8 +1531,7 @@ class AppLocalizationsId extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1550,16 +1549,16 @@ class AppLocalizationsId extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index e162f89f..e2dba428 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1540,8 +1540,7 @@ class AppLocalizationsIt extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1559,16 +1558,16 @@ class AppLocalizationsIt extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index bb6ea388..6460d875 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1539,8 +1539,7 @@ class AppLocalizationsPt extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1558,16 +1557,16 @@ class AppLocalizationsPt extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 6fc4136d..857ecc82 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1541,8 +1541,7 @@ class AppLocalizationsRu extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1560,16 +1559,16 @@ class AppLocalizationsRu extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index fcb07900..e5d1a799 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1525,8 +1525,7 @@ class AppLocalizationsTh extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1544,16 +1543,16 @@ class AppLocalizationsTh extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 34cdac5e..5a0f1f4d 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1531,8 +1531,7 @@ class AppLocalizationsTr extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1550,16 +1549,16 @@ class AppLocalizationsTr extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index b4f3f66b..5a768a6c 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1496,8 +1496,7 @@ class AppLocalizationsZh extends AppLocalizations { String get custom_buttons => 'Custom buttons'; @override - String get custom_buttons_info => - 'Execute Javascript code with custom buttons'; + String get custom_buttons_info => 'Execute lua code with custom buttons'; @override String get custom_buttons_edit => 'Edit custom buttons'; @@ -1515,16 +1514,16 @@ class AppLocalizationsZh extends AppLocalizations { String get custom_buttons_text_req => 'Button text required'; @override - String get custom_buttons_js_code => 'Javascript code'; + String get custom_buttons_js_code => 'lua code'; @override - String get custom_buttons_js_code_req => 'Javascript code required'; + String get custom_buttons_js_code_req => 'lua code required'; @override - String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + String get custom_buttons_js_code_long => 'lua code (on long press)'; @override - String get custom_buttons_startup => 'Javascript code (on startup)'; + String get custom_buttons_startup => 'lua code (on startup)'; @override String n_days(Object n) { diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 7678eed5..00556eb6 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -639,9 +639,9 @@ class _AnimeStreamPageState extends riv.ConsumerState .map( (e) => ( e["title"] as String, - e["time"] is double - ? (e["time"] as double).toInt() * 1000 - : (e["time"] as int) * 1000, + e["timestamp"] is double + ? (e["timestamp"] as double).toInt() * 1000 + : (e["timestamp"] as int) * 1000, ), ) .toList(); @@ -677,20 +677,24 @@ class _AnimeStreamPageState extends riv.ConsumerState } final dir = await provider.getMpvDirectory(); String scriptsDir = path.join(dir!.path, 'scripts'); - final mpvFile = File('$scriptsDir/init_custom_buttons.js'); + final mpvFile = File('$scriptsDir/init_custom_buttons.lua'); final content = StringBuffer(); - content.write("var aniyomi = require('./init_aniyomi_functions');"); + content.writeln("""local lua_modules = mp.find_config_file('scripts') +if lua_modules then + package.path = package.path .. ';' .. lua_modules .. '/?.lua;' .. lua_modules .. '/?/init.lua;' .. '\${scriptsDir()!!.filePath}' .. '/?.lua' +end +local aniyomi = require 'init_aniyomi_functions'"""); for (final button in customButtons) { - content.write( + content.writeln( """ ${button.getButtonStartup(primaryButton.id!).trim()} -function button${button.id}() { +function button${button.id}() ${button.getButtonPress(primaryButton.id!).trim()} -} +end mp.register_script_message('call_button_${button.id}', button${button.id}) -function button${button.id}long() { +function button${button.id}long() ${button.getButtonLongPress(primaryButton.id!).trim()} -} +end mp.register_script_message('call_button_${button.id}_long', button${button.id}long)""", ); } diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index e7313c23..4aa91635 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -211,20 +211,25 @@ class StorageProvider { CustomButton( title: "+85 s", codePress: - """var intro_length = mp.get_property_number("user-data/current-anime/intro-length") + """local intro_length = mp.get_property_number("user-data/current-anime/intro-length") aniyomi.right_seek_by(intro_length)""", codeLongPress: """aniyomi.int_picker("Change intro length", "%ds", 0, 255, 1, "user-data/current-anime/intro-length")""", - codeStartup: """function update_button(_, length) { - if (length && length == 0) { - aniyomi.hide_button() - } else { - aniyomi.show_button() - } - aniyomi.set_button_title("+" + length + " s") - if (\$isPrimary) { - mp.observe_property("user-data/current-anime/intro-length", "number", update_button) - }""", + codeStartup: """function update_button(_, length) + if length ~= nil then + if length == 0 then + aniyomi.hide_button() + return + else + aniyomi.show_button() + end + aniyomi.set_button_title("+" .. length .. " s") + end +end + +if \$isPrimary then + mp.observe_property("user-data/current-anime/intro-length", "number", update_button) +end""", isFavourite: true, pos: 0, updatedAt: DateTime.now().millisecondsSinceEpoch, diff --git a/pubspec.lock b/pubspec.lock index c8bb50bd..8a343b12 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1171,50 +1171,56 @@ packages: media_kit_libs_android_video: dependency: transitive description: - name: media_kit_libs_android_video - sha256: adff9b571b8ead0867f9f91070f8df39562078c0eb3371d88b9029a2d547d7b7 - url: "https://pub.dev" - source: hosted + path: "libs/android/media_kit_libs_android_video" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.3.7" media_kit_libs_ios_video: dependency: transitive description: - name: media_kit_libs_ios_video - sha256: b5382994eb37a4564c368386c154ad70ba0cc78dacdd3fb0cd9f30db6d837991 - url: "https://pub.dev" - source: hosted + path: "libs/ios/media_kit_libs_ios_video" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.1.4" media_kit_libs_linux: dependency: transitive description: - name: media_kit_libs_linux - sha256: "2b473399a49ec94452c4d4ae51cfc0f6585074398d74216092bf3d54aac37ecf" - url: "https://pub.dev" - source: hosted + path: "libs/linux/media_kit_libs_linux" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.2.1" media_kit_libs_macos_video: dependency: transitive description: - name: media_kit_libs_macos_video - sha256: f26aa1452b665df288e360393758f84b911f70ffb3878032e1aabba23aa1032d - url: "https://pub.dev" - source: hosted + path: "libs/macos/media_kit_libs_macos_video" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.1.4" media_kit_libs_video: dependency: "direct main" description: - name: media_kit_libs_video - sha256: "958cc55e7065d9d01f52a2842dab2a0812a92add18489f1006d864fb5e42a3ef" - url: "https://pub.dev" - source: hosted + path: "libs/universal/media_kit_libs_video" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.0.6" media_kit_libs_windows_video: dependency: transitive description: - name: media_kit_libs_windows_video - sha256: dff76da2778729ab650229e6b4ec6ec111eb5151431002cbd7ea304ff1f112ab - url: "https://pub.dev" - source: hosted + path: "libs/windows/media_kit_libs_windows_video" + ref: HEAD + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + url: "https://github.com/Schnitzel5/media-kit.git" + source: git version: "1.0.11" media_kit_video: dependency: "direct main" diff --git a/pubspec.yaml b/pubspec.yaml index 011d7f51..2faff8a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -49,7 +49,10 @@ dependencies: git: url: https://github.com/Schnitzel5/media-kit.git path: media_kit_video - media_kit_libs_video: ^1.0.6 + media_kit_libs_video: + git: + url: https://github.com/Schnitzel5/media-kit.git + path: libs/universal/media_kit_libs_video crypto: ^3.0.6 cupertino_icons: ^1.0.8 window_manager: ^0.4.3 From 1c0275df46df3af4f0e847d4cdf130c625fc6670 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 3 Aug 2025 21:36:46 +0200 Subject: [PATCH 029/100] updated media-kit --- assets/mangayomi_mpv.zip | Bin 1192878 -> 1192859 bytes pubspec.lock | 16 ++++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/mangayomi_mpv.zip b/assets/mangayomi_mpv.zip index 2f3ef3c621c86e1109744ea3d869d8b57a42db03..04cf84cd9fe777bd89405c1c4f37a4a496a05d6a 100644 GIT binary patch delta 2044 zcmY*Z2~ZPf6wcwIurZL|08K(j2nh+{Nfs!HvSh`;NDd z*2i8v`R59cirzQn$_3N>C%hPAN!PlRhEG+G44&d$-B20YleOfuX`iSg_n))l9FO;& zjZQ7OTnT%Ng2OYq!jelAM`iVIrx#^evgR%0KRc9K7jt2mFwYw0sLJ2-)VfV4$QrxX z*dTl)Du%}g-%rfWFxO{Eb(16as58AK{>+UAbf+6Q^9**$C8x02V-CpV?f{C0h1LR-l5Yso7@ z5(TaL1r8V@OU6xU> z(J0_!F;5}ZAS?>Y4r?&h5G;Ev2P_&(gf$dPjOB>sge9pq3dkE*V`@p!Ck2Dr_!Ydu z4nD7q9~;dVsCZHyk2i$(@l8UsoLI!0mu^lhL_PNeo16^iyTWBTSt>{zWXl=k35g04 z!?!}2f~e>cGI1fJ-jrbjvoCRmX9^Yh z-=puS5`8%uTb)J&cJ3JW!vh9Zxg+fAjj#+-+=+sk+PM;dZW&PQU=;5|8HFuu6oD2McAaDW5#yhzFup4S zDKD6yCJF~dt(7&GbwjTTmtUvG`O_d@O(N*zzO^h@o^qCLZMz*O7HjcNn2#E(CJuvi zHc|W#nCOA0vHnIDYe;P743O!8lVne|rFFZ*N&HSrIySHh$DnguWKz|~kx^Bw*k42B z)Qb}vapXxF9C=JP!dm!6gPX)zvk|UmVA}_Xo5uG9g(qg;Ij^ zNk%&?6>Mk8F=jApanEbW3C3-KG*99QL$%m#Ox{k6_0?i*`9Tifpd|`A>~CP5l7*MJ z*rWiV7_MuHNEj6$1c`6)vP) zN94lnbc*%EV@6YI&SN!(16MhX&I{+C1Yuqzn4USQfF)Dn8#r<|LpDIU7YTCMTgH)B zEihY;%L(aV zgcNTwike%GBvg3gDLrwvhl&<^1!Nit1)(nXG)Rqj#|!F9P~vAq$!O*O5^rik`cWiG z8A7RJ2?L0I@cO=5U&=Uqkmy=BKx|`(edEiJC}9X*%>W_tC31(RmI`*pxIU=x!BdMu zkiQ0I`;tg%XLL21j`)&bekR;!kS&fii1_#+QUtU8h=sCjIEhFBBEp0HG_!^rp7qlX z@UI`f3(}BUHa%wh9qt57{&?f@w1^SPAeR<7!3uv|)w}dG#^m^8umLXk6B9kTrH-{8 zYrD%?oda;PFfaumIZ=F`CBHD<??s2goLdltND+38ZIa|IU)xv+r}xQ9(#ffvG{nL=AIo#75hKh{8@RBlvgp E9}G*^$^ZZW delta 2206 zcmY+F4OElY8OQS`ybyRpNG@NJ4?+lE34|nsAYjFUXeoXa+S5&CWtO#_(>WB+dTL7n zC#}V)1!8^9f#Ql)v|7*#2vrM3oX&`l@S#AVqQ@R+yPdJMLv$XqC+}sh%Q?@a^EjbeZE4`^BRpWf=u<>UD zi<{&2{bMpF?*7wJxr%FJ;TdAJ4P% zBO>#S;F!am64~B4y%xS6>3m?c7Ysh_;psP2C`dA6fOZAhA>83*FZI&F8YNlF)WU~KqVc|6 zz4=^;5PFm(S=i}g@A1(8TUbMGHLuLF~c*o3wam{O4_*sCH6Zh6_U^Eyl~ueu10 z1`=%lDopAhg~ND05m-}jTSb;V;a2SF;yK7r69sbs)~m@=oPEV{K4k5q1+m>D9s#GC zEM|ETB;nZEpa++lguySuiIR29q6tbp>lG%t-WN`^ejkjT;KN+oU{^Q^0e=lq2*oLO zd5RWtH6-W>uxf|`WgbAb6oD{k)etRrweBRJFlOtav;OEI?q?$r1QA*y2U`SDaSsoj z;<3};EMVIs5Ub4nA9gl^gmV}AKIO49#g}N>tOvWE|6k0=4K_FP#75Twu~myi!#da= zNy6bcK5)BhPV-2BwU>t6@gVElc*I`O<_+3N62#p+MzJOL7O)p1@gQG>ZIL96-MZuq z9#~5x9$3?3k5Oaqf9wZR9U6HJukp1DmuY^M4)bjrATNsOU>82H_Q_VXf22eEhCkBv zhq%s7J#6DgvtIZ!wI)Yl&t7;g3a_1f+rf+S%~z?|f}&`>Nd);(Boh7>g%`PfRVN1f zM-!WoKe0)=!zZBM!46!~T9O?a(n2o{BXQo493<(8YEdC^h6kU8s_2>ff zN-S>D0p+peDK>Z>MffrnPv*5os6Za78@;`uBA!SB3)60Av@;V758(-SMmuSf=i{(R z(=g?o!^pdl_s{J82@frC7`kkhLT@CHz`&b(ruaNrWiLO`pITfrFH?_)^RJi0uq&2C zfTmFF1MUP2eEShK1o&OXDG%#0&>al<2AonK;>*FeMj`=!0}*pPfg`HE9Hfyp18y=O z@(g4pOYQXrVq?tUGLUR;^T8|p1X(%53wS)@_aQGH#nb^R?kO0dVjGIWz)r}ICwh2* z58S17f8qW4^9zVI0g;146v53ZIa!y3M{b;izM7y lEJwh?5f#iO;qcTIU`5w&V1<>K7gpZ15~a5`jNpI6e*lzC3c~;Z diff --git a/pubspec.lock b/pubspec.lock index 8a343b12..384e6e78 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 + resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From c58646244e7d18bebdefc6aff2f8946564d40f1d Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 3 Aug 2025 23:42:17 +0200 Subject: [PATCH 030/100] fix mpv unzip --- lib/main.dart | 2 +- lib/modules/more/settings/player/player_advanced_screen.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index ed50af13..0b109329 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -271,7 +271,7 @@ class _MyAppState extends ConsumerState { 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(".js") || file.name.endsWith(".lua"))) { final scriptFile = File('$scriptsDir/${file.name.split("/").last}'); await scriptFile.writeAsBytes(file.content); } diff --git a/lib/modules/more/settings/player/player_advanced_screen.dart b/lib/modules/more/settings/player/player_advanced_screen.dart index 39a71462..acf70250 100644 --- a/lib/modules/more/settings/player/player_advanced_screen.dart +++ b/lib/modules/more/settings/player/player_advanced_screen.dart @@ -110,7 +110,8 @@ class _PlayerAdvancedScreenState extends ConsumerState { ); await shaderFile.writeAsBytes(file.content); } else if (file.name.startsWith("scripts/") && - file.name.endsWith(".js")) { + (file.name.endsWith(".js") || + file.name.endsWith(".lua"))) { final scriptFile = File( '$scriptsDir/${file.name.split("/").last}', ); From 8f2fe123bf2f8ac3a56481dd5894c0e70a450b00 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 4 Aug 2025 00:13:23 +0200 Subject: [PATCH 031/100] adjusted lua code --- lib/providers/storage_provider.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 4aa91635..d9bc6b97 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -211,8 +211,8 @@ class StorageProvider { CustomButton( title: "+85 s", codePress: - """local intro_length = mp.get_property_number("user-data/current-anime/intro-length") - aniyomi.right_seek_by(intro_length)""", + """local intro_length = mp.get_property_native("user-data/current-anime/intro-length") +aniyomi.right_seek_by(intro_length)""", codeLongPress: """aniyomi.int_picker("Change intro length", "%ds", 0, 255, 1, "user-data/current-anime/intro-length")""", codeStartup: """function update_button(_, length) From a101d10826e2a45ad9c42ab6659f4361b6bbe65a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 4 Aug 2025 01:28:22 +0200 Subject: [PATCH 032/100] fixed history delete bug --- lib/modules/history/history_screen.dart | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 029e0c51..99f64a61 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -451,26 +451,21 @@ class _HistoryTabState extends ConsumerState ) 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); From 2eca6576a26e22f57ee82edb76da0b97ebbbe242 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 5 Aug 2025 01:48:19 +0200 Subject: [PATCH 033/100] added deep link for custom buttons --- android/app/src/main/AndroidManifest.xml | 6 ++ assets/mangayomi_mpv.zip | Bin 1192859 -> 1194808 bytes lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 ++ lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + lib/main.dart | 59 ++++++++++++++++++- pubspec.lock | 16 ++--- 20 files changed, 121 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7e342774..1055afb4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,6 +36,12 @@ + + + + + + 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 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 8c0be63c..e0c904dd 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1534,6 +1534,9 @@ class AppLocalizationsAs extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index e2d393e3..2c8dfc56 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1545,6 +1545,9 @@ class AppLocalizationsDe extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 00613692..2ef018d2 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1533,6 +1533,9 @@ class AppLocalizationsEn extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index db104223..156754f0 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1550,6 +1550,9 @@ class AppLocalizationsEs extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 13cf52b3..88366e2e 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1551,6 +1551,9 @@ class AppLocalizationsFr extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index ba999035..2e2581c2 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1535,6 +1535,9 @@ class AppLocalizationsHi extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 11e86435..18338650 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1539,6 +1539,9 @@ class AppLocalizationsId extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index e2dba428..b239a60f 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1548,6 +1548,9 @@ class AppLocalizationsIt extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 6460d875..87a26002 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1547,6 +1547,9 @@ class AppLocalizationsPt extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 857ecc82..6799f0cc 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1549,6 +1549,9 @@ class AppLocalizationsRu extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index e5d1a799..a6955602 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1533,6 +1533,9 @@ class AppLocalizationsTh extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 5a0f1f4d..73e41501 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1539,6 +1539,9 @@ class AppLocalizationsTr extends AppLocalizations { @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'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 5a768a6c..ea3f7d41 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1504,6 +1504,9 @@ class AppLocalizationsZh extends AppLocalizations { @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'; diff --git a/lib/main.dart b/lib/main.dart index 0b109329..30ceb808 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ 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'; @@ -145,7 +146,7 @@ class _MyAppState extends ConsumerState { Future _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) { @@ -224,6 +225,62 @@ class _MyAppState extends ConsumerState { }, ); 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) { + 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: } }); diff --git a/pubspec.lock b/pubspec.lock index 384e6e78..43b33ffc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From 01dc5dba453b0c7cbcb15ae42b0c0f549ee8a6d2 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 5 Aug 2025 15:50:57 +0100 Subject: [PATCH 034/100] Bump d4rt version --- lib/eval/dart/bridge/document.dart | 2 +- lib/eval/dart/bridge/element.dart | 2 +- lib/eval/dart/bridge/filter.dart | 22 +- lib/eval/dart/bridge/http.dart | 10 +- lib/eval/dart/bridge/m_chapter.dart | 2 +- lib/eval/dart/bridge/m_manga.dart | 2 +- lib/eval/dart/bridge/m_pages.dart | 2 +- lib/eval/dart/bridge/m_provider.dart | 2 +- lib/eval/dart/bridge/m_source.dart | 2 +- lib/eval/dart/bridge/m_track.dart | 2 +- lib/eval/dart/bridge/m_video.dart | 2 +- lib/eval/dart/bridge/source_preference.dart | 10 +- lib/l10n/generated/app_localizations.dart | 10 + lib/l10n/generated/app_localizations_as.dart | 1499 +++++++++++++++++ lib/l10n/generated/app_localizations_hi.dart | 1500 ++++++++++++++++++ pubspec.lock | 4 +- pubspec.yaml | 2 +- 17 files changed, 3042 insertions(+), 33 deletions(-) create mode 100644 lib/l10n/generated/app_localizations_as.dart create mode 100644 lib/l10n/generated/app_localizations_hi.dart diff --git a/lib/eval/dart/bridge/document.dart b/lib/eval/dart/bridge/document.dart index 474d2c03..6c646aa4 100644 --- a/lib/eval/dart/bridge/document.dart +++ b/lib/eval/dart/bridge/document.dart @@ -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: { diff --git a/lib/eval/dart/bridge/element.dart b/lib/eval/dart/bridge/element.dart index 9cdce412..0aee2672 100644 --- a/lib/eval/dart/bridge/element.dart +++ b/lib/eval/dart/bridge/element.dart @@ -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: { diff --git a/lib/eval/dart/bridge/filter.dart b/lib/eval/dart/bridge/filter.dart index 0631968f..01f112f1 100644 --- a/lib/eval/dart/bridge/filter.dart +++ b/lib/eval/dart/bridge/filter.dart @@ -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: { diff --git a/lib/eval/dart/bridge/http.dart b/lib/eval/dart/bridge/http.dart index 551e4e16..481316b5 100644 --- a/lib/eval/dart/bridge/http.dart +++ b/lib/eval/dart/bridge/http.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_chapter.dart b/lib/eval/dart/bridge/m_chapter.dart index c3160e7d..398bfa08 100644 --- a/lib/eval/dart/bridge/m_chapter.dart +++ b/lib/eval/dart/bridge/m_chapter.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_manga.dart b/lib/eval/dart/bridge/m_manga.dart index 94719ccf..bcd4945f 100644 --- a/lib/eval/dart/bridge/m_manga.dart +++ b/lib/eval/dart/bridge/m_manga.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_pages.dart b/lib/eval/dart/bridge/m_pages.dart index 33e8605e..59c47dec 100644 --- a/lib/eval/dart/bridge/m_pages.dart +++ b/lib/eval/dart/bridge/m_pages.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 13838e4f..33765e55 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_source.dart b/lib/eval/dart/bridge/m_source.dart index da7ad73a..d5f0831f 100644 --- a/lib/eval/dart/bridge/m_source.dart +++ b/lib/eval/dart/bridge/m_source.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_track.dart b/lib/eval/dart/bridge/m_track.dart index 405ee848..7dbf5d0f 100644 --- a/lib/eval/dart/bridge/m_track.dart +++ b/lib/eval/dart/bridge/m_track.dart @@ -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: { diff --git a/lib/eval/dart/bridge/m_video.dart b/lib/eval/dart/bridge/m_video.dart index 17f6f86b..b6883c46 100644 --- a/lib/eval/dart/bridge/m_video.dart +++ b/lib/eval/dart/bridge/m_video.dart @@ -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: { diff --git a/lib/eval/dart/bridge/source_preference.dart b/lib/eval/dart/bridge/source_preference.dart index 82fcd579..0a715513 100644 --- a/lib/eval/dart/bridge/source_preference.dart +++ b/lib/eval/dart/bridge/source_preference.dart @@ -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: { diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 5f9e105c..847d0bf8 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -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 supportedLocales = [ Locale('ar'), + Locale('as'), Locale('de'), Locale('en'), Locale('es'), Locale('es', '419'), Locale('fr'), + Locale('hi'), Locale('id'), Locale('it'), Locale('pt'), @@ -2916,10 +2920,12 @@ class _AppLocalizationsDelegate @override bool isSupported(Locale locale) => [ 'ar', + 'as', 'de', 'en', 'es', 'fr', + 'hi', 'id', 'it', 'pt', @@ -2958,6 +2964,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { switch (locale.languageCode) { case 'ar': return AppLocalizationsAr(); + case 'as': + return AppLocalizationsAs(); case 'de': return AppLocalizationsDe(); case 'en': @@ -2966,6 +2974,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsEs(); case 'fr': return AppLocalizationsFr(); + case 'hi': + return AppLocalizationsHi(); case 'id': return AppLocalizationsId(); case 'it': diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart new file mode 100644 index 00000000..d8a73c94 --- /dev/null +++ b/lib/l10n/generated/app_localizations_as.dart @@ -0,0 +1,1499 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Assamese (`as`). +class AppLocalizationsAs extends AppLocalizations { + AppLocalizationsAs([String locale = 'as']) : super(locale); + + @override + String get library => 'পুথিভঁৰাল'; + + @override + String get updates => 'আপডেট'; + + @override + String get history => 'ইতিহাস'; + + @override + String get browse => 'ব্ৰাউজ'; + + @override + String get more => 'অধিক'; + + @override + String get open_random_entry => 'যিকোনো এণ্ট্ৰি খোলক'; + + @override + String get import => 'আমদানি'; + + @override + String get filter => 'ফিল্টাৰ'; + + @override + String get ignore_filters => 'Ignore Filters'; + + @override + String get downloaded => 'ডাউনলোড কৰা'; + + @override + String get unread => 'নপঢ়া'; + + @override + String get unwatched => 'Unwatched'; + + @override + String get started => 'আৰম্ভ কৰা'; + + @override + String get bookmarked => 'বুকমাৰ্ক কৰা'; + + @override + String get sort => 'শাৰী কৰক'; + + @override + String get alphabetically => 'বৰ্ণানুক্ৰমে'; + + @override + String get last_read => 'শেষত পঢ়া'; + + @override + String get last_watched => 'Last watched'; + + @override + String get last_update_check => 'শেষ আপডেট পৰীক্ষা'; + + @override + String last_entry_delete_warning( + num count, + Object entryType, + Object entryTypePlural, + Object mediaType, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: + 'You are deleting all $count $entryTypePlural of this $mediaType from the library.', + one: + 'You are deleting the only $entryType of this $mediaType from the library.', + ); + return '$_temp0\nThis will also remove the whole $mediaType from your library.\n\nNote: The files themselves will not be deleted.'; + } + + @override + String get chapter => 'chapter'; + + @override + String get episode => 'episode'; + + @override + String get unread_count => 'নপঢ়াৰ সংখ্যা'; + + @override + String get unwatched_count => 'Unwatched count'; + + @override + String get latest_chapter => 'শেষৰ অধ্যায়'; + + @override + String get latest_episode => 'Latest episode'; + + @override + String get date_added => 'তাৰিখ যোগ কৰা'; + + @override + String get display => 'প্ৰদৰ্শন'; + + @override + String get display_mode => 'প্ৰদৰ্শন মোড'; + + @override + String get compact_grid => 'সংক্ষিপ্ত গ্ৰিড'; + + @override + String get comfortable_grid => 'আৰামদায়ক গ্ৰিড'; + + @override + String get cover_only_grid => 'মাত্ৰ কভাৰৰ গ্ৰিড'; + + @override + String get list => 'তালিকা'; + + @override + String get badges => 'বেজ'; + + @override + String get downloaded_chapters => 'ডাউনলোড কৰা অধ্যায়'; + + @override + String get downloaded_episodes => 'Downloaded episodes'; + + @override + String get language => 'ভাষা'; + + @override + String get local_source => 'স্থানীয় উৎস'; + + @override + String get tabs => 'টেব'; + + @override + String get show_category_tabs => 'শ্ৰেণীৰ টেব দেখুৱাওক'; + + @override + String get show_numbers_of_items => 'বস্তুৰ সংখ্যা দেখুৱাওক'; + + @override + String get other => 'অন্যান্য'; + + @override + String get show_continue_reading_buttons => + 'পঢ়া অব্যাহত ৰখাৰ বুটাম দেখুৱাওক'; + + @override + String get show_continue_watching_buttons => 'Show continue watching buttons'; + + @override + String get empty_library => 'খালী পুথিভঁৰাল'; + + @override + String get search => 'সন্ধান...'; + + @override + String get no_recent_updates => 'শেহতীয়া আপডেট নাই'; + + @override + String get remove_everything => 'সকলো আঁতৰাওক'; + + @override + String get remove_everything_msg => 'আপুনি নিশ্চিত নে? সকলো ইতিহাস হেৰাই যাব'; + + @override + String get remove_all_update_msg => + 'Are you sure? The whole update will be cleared'; + + @override + String get ok => 'ঠিক আছে'; + + @override + String get cancel => 'বাতিল'; + + @override + String get remove => 'আঁতৰাওক'; + + @override + String get remove_history_msg => + 'ইয়ে এই অধ্যায়ৰ পঢ়া তাৰিখ আঁতৰাব। আপুনি নিশ্চিত নে?'; + + @override + String get last_used => 'শেষবাৰ ব্যৱহৃত'; + + @override + String get pinned => 'পিন কৰা'; + + @override + String get sources => 'উৎস'; + + @override + String get install => 'ইনষ্টল'; + + @override + String get update => 'আপডেট'; + + @override + String get latest => 'শেষৰ'; + + @override + String get extensions => 'এক্সটেনশন'; + + @override + String get migrate => 'স্থানান্তৰ'; + + @override + String get migrate_confirm => 'Migrate to another source'; + + @override + String get clean_database => 'Clean database'; + + @override + String cleaned_database(Object x) { + return 'Database cleaned! $x entries removed'; + } + + @override + String get clean_database_desc => + 'This will remove all items that are not added to the library!'; + + @override + String get incognito_mode => 'গোপন মোড'; + + @override + String get incognito_mode_description => 'পঢ়াৰ ইতিহাস স্থগিত কৰে'; + + @override + String get download_queue => 'ডাউনলোড শাৰী'; + + @override + String get categories => 'শ্ৰেণী'; + + @override + String get statistics => 'Statistics'; + + @override + String get settings => 'ছেটিং'; + + @override + String get about => 'বিষয়ে'; + + @override + String get help => 'সহায়'; + + @override + String get no_downloads => 'কোনো ডাউনলোড নাই'; + + @override + String get edit_categories => 'শ্ৰেণী সম্পাদনা'; + + @override + String get edit_categories_description => + 'আপোনাৰ কোনো শ্ৰেণী নাই। পুথিভঁৰাল সংগঠিত কৰিবলৈ প্লাছ বুটামত টেপ কৰক'; + + @override + String get add => 'যোগ কৰক'; + + @override + String get add_category => 'শ্ৰেণী যোগ কৰক'; + + @override + String get name => 'নাম'; + + @override + String get category_name_required => '*প্ৰয়োজনীয়'; + + @override + String get add_category_error_exist => 'এই নামৰ শ্ৰেণী ইতিমধ্যে আছে!'; + + @override + String get delete_category => 'শ্ৰেণী মচক'; + + @override + String delete_category_msg(Object name) { + return 'আপুনি $name শ্ৰেণী মচিব বিচাৰে নে?'; + } + + @override + String get rename_category => 'শ্ৰেণীৰ নাম সলনি কৰক'; + + @override + String get general => 'সাধাৰণ'; + + @override + String get general_subtitle => 'এপৰ ভাষা'; + + @override + String get app_language => 'এপৰ ভাষা'; + + @override + String get default_subtitle_language => 'Default subtitle language'; + + @override + String get appearance => 'চেহেৰা'; + + @override + String get appearance_subtitle => 'থীম, তাৰিখ আৰু সময়ৰ ফৰ্মেট'; + + @override + String get theme => 'থীম'; + + @override + String get dark_mode => 'ডাৰ্ক মোড'; + + @override + String get follow_system_theme => 'Follow system theme'; + + @override + String get on => 'অন'; + + @override + String get off => 'অফ'; + + @override + String get pure_black_dark_mode => 'পিউৰ ব্লেক ডাৰ্ক মোড'; + + @override + String get timestamp => 'টাইমষ্টেম্প'; + + @override + String get relative_timestamp => 'আপেক্ষিক টাইমষ্টেম্প'; + + @override + String get relative_timestamp_short => 'চমু (আজি, কালি)'; + + @override + String get relative_timestamp_long => 'দীঘল (চমু+, n দিনৰ আগতে)'; + + @override + String get date_format => 'তাৰিখৰ ফৰ্মেট'; + + @override + String get reader => 'পাঠক'; + + @override + String get refresh => 'ৰিফ্ৰেছ'; + + @override + String get reader_subtitle => 'পঢ়াৰ মোড, প্ৰদৰ্শন, নেভিগেশন'; + + @override + String get default_reading_mode => 'ডিফল্ট পঢ়াৰ মোড'; + + @override + String get reading_mode_vertical => 'উলম্ব'; + + @override + String get reading_mode_horizontal => 'অনুভূমিক'; + + @override + String get reading_mode_left_to_right => 'বাওঁফালৰ পৰা সোঁফাললৈ'; + + @override + String get reading_mode_right_to_left => 'সোঁফালৰ পৰা বাওঁফাললৈ'; + + @override + String get reading_mode_vertical_continuous => 'উলম্ব অবিৰত'; + + @override + String get reading_mode_webtoon => 'ৱেবটুন'; + + @override + String get double_tap_animation_speed => 'ডাবল টেপ এনিমেশনৰ গতি'; + + @override + String get normal => 'সাধাৰণ'; + + @override + String get fast => 'দ্ৰুত'; + + @override + String get no_animation => 'কোনো এনিমেশন নাই'; + + @override + String get animate_page_transitions => 'পৃষ্ঠা স্থানান্তৰ এনিমেট কৰক'; + + @override + String get crop_borders => 'সীমা কাটক'; + + @override + String get downloads => 'ডাউনলোড'; + + @override + String get downloads_subtitle => 'ডাউনলোড ছেটিং'; + + @override + String get download_location => 'ডাউনলোডৰ স্থান'; + + @override + String get custom_location => 'কাষ্টম স্থান'; + + @override + String get only_on_wifi => 'কেৱল ৱাই-ফাইত'; + + @override + String get save_as_cbz_archive => 'CBZ আৰ্কাইভ হিচাপে সাঁচক'; + + @override + String get concurrent_downloads => 'Concurrent downloads'; + + @override + String get browse_subtitle => 'উৎস, গ্ল’বেল সন্ধান'; + + @override + String get only_include_pinned_sources => 'কেৱল পিন কৰা উৎস অন্তৰ্ভুক্ত কৰক'; + + @override + String get nsfw_sources => 'NSFW (+18) উৎস'; + + @override + String get nsfw_sources_show => 'উৎস আৰু এক্সটেনশন তালিকাত দেখুৱাওক'; + + @override + String get nsfw_sources_info => + 'ইয়ে অফিচিয়েল নহোৱা বা সম্ভৱতঃ ভুলকৈ ফ্লেগ কৰা এক্সটেনশনৰ পৰা NSFW (18+) বিষয়বস্তু এপত দেখা দিয়াৰ পৰা ৰক্ষা নকৰে'; + + @override + String get version => 'সংস্কৰণ'; + + @override + String get check_for_update => 'আপডেটৰ বাবে পৰীক্ষা কৰক'; + + @override + String n_days_ago(Object days) { + return '$days দিনৰ আগতে'; + } + + @override + String get today => 'আজি'; + + @override + String get yesterday => 'কালি'; + + @override + String get a_week_ago => 'এসপ্তাহৰ আগতে'; + + @override + String get add_to_library => 'পুথিভঁৰালত যোগ কৰক'; + + @override + String get completed => 'সম্পূৰ্ণ'; + + @override + String get ongoing => 'চলি আছে'; + + @override + String get on_hiatus => 'বিৰতিত'; + + @override + String get canceled => 'বাতিল কৰা'; + + @override + String get publishing_finished => 'প্ৰকাশ সমাপ্ত'; + + @override + String get unknown => 'অজ্ঞাত'; + + @override + String get set_categories => 'শ্ৰেণী নিৰ্ধাৰণ কৰক'; + + @override + String get edit => 'সম্পাদনা'; + + @override + String get in_library => 'পুথিভঁৰালত'; + + @override + String get filter_scanlator_groups => 'স্কেনলেটৰ গ্ৰুপ ফিল্টাৰ কৰক'; + + @override + String get reset => 'ৰিছেট'; + + @override + String get by_source => 'উৎস অনুসৰি'; + + @override + String get by_chapter_number => 'অধ্যায়ৰ সংখ্যা অনুসৰি'; + + @override + String get by_episode_number => 'By episode number'; + + @override + String get by_upload_date => 'আপলোডৰ তাৰিখ অনুসৰি'; + + @override + String get source_title => 'উৎসৰ শিৰোনাম'; + + @override + String get chapter_number => 'অধ্যায়ৰ সংখ্যা'; + + @override + String get episode_number => 'Episode number'; + + @override + String get share => 'শ্বেয়াৰ'; + + @override + String n_chapters(Object number) { + return '$number অধ্যায়'; + } + + @override + String get no_description => 'কোনো বিৱৰণ নাই'; + + @override + String get resume => 'পুনৰ আৰম্ভ'; + + @override + String get read => 'পঢ়ক'; + + @override + String get watch => 'Watch'; + + @override + String get popular => 'জনপ্ৰিয়'; + + @override + String get open_in_browser => 'ব্ৰাউজাৰত খোলক'; + + @override + String get clear_cookie => 'কুকী আঁতৰাওক'; + + @override + String get show_page_number => 'পৃষ্ঠাৰ সংখ্যা দেখুৱাওক'; + + @override + String get from_library => 'পুথিভঁৰালৰ পৰা'; + + @override + String get downloaded_chapter => 'ডাউনলোড কৰা অধ্যায়'; + + @override + String page(Object page) { + return 'পৃষ্ঠা $page'; + } + + @override + String get global_search => 'গ্ল’বেল সন্ধান'; + + @override + String get color_blend_level => 'ৰংৰ মিশ্ৰণ স্তৰ'; + + @override + String current(Object char) { + return 'বৰ্তমান $char'; + } + + @override + String finished(Object char) { + return 'শেষ $char'; + } + + @override + String next(Object char) { + return 'পৰৱৰ্তী $char'; + } + + @override + String previous(Object char) { + return 'পূৰ্বৰ $char'; + } + + @override + String get no_more_chapter => 'আৰু কোনো অধ্যায় নাই'; + + @override + String get no_result => 'কোনো ফলাফল নাই'; + + @override + String get send => 'পঠিয়াওক'; + + @override + String get delete => 'মচক'; + + @override + String get start_downloading => 'এতিয়া ডাউনলোড আৰম্ভ কৰক'; + + @override + String get retry => 'পুনৰ চেষ্টা কৰক'; + + @override + String get add_chapters => 'অধ্যায় যোগ কৰক'; + + @override + String get delete_chapters => 'অধ্যায় মচক?'; + + @override + String get default0 => 'ডিফল্ট'; + + @override + String get total_chapters => 'মুঠ অধ্যায়'; + + @override + String get total_episodes => 'Total episodes'; + + @override + String get import_local_file => 'স্থানীয় ফাইল আমদানি কৰক'; + + @override + String get import_files => 'ফাইল'; + + @override + String get nothing_read_recently => 'শেহতীয়াকৈ একো পঢ়া নাই'; + + @override + String get status => 'স্থিতি'; + + @override + String get not_started => 'আৰম্ভ হোৱা নাই'; + + @override + String get score => 'স্ক’ৰ'; + + @override + String get start_date => 'আৰম্ভৰ তাৰিখ'; + + @override + String get finish_date => 'শেষৰ তাৰিখ'; + + @override + String get reading => 'পঢ়ি আছে'; + + @override + String get on_hold => 'ৰখা আছে'; + + @override + String get dropped => 'বাদ দিয়া'; + + @override + String get plan_to_read => 'পঢ়াৰ পৰিকল্পনা'; + + @override + String get re_reading => 'পুনৰ পঢ়ি আছে'; + + @override + String get chapters => 'অধ্যায়'; + + @override + String get add_tracker => 'ট্ৰেকাৰ যোগ কৰক'; + + @override + String get one_tracker => '১ টা ট্ৰেকাৰ'; + + @override + String n_tracker(Object n) { + return '$n টা ট্ৰেকাৰ'; + } + + @override + String get tracking => 'ট্ৰেকিং'; + + @override + String get syncing => 'Sync'; + + @override + String get sync_password => 'Password (at least 8 characters)'; + + @override + String get sync_logged => 'Login successful'; + + @override + String get syncing_subtitle => + 'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!'; + + @override + String get last_sync_manga => 'Last manga sync at: '; + + @override + String get last_sync_history => 'Last history sync at: '; + + @override + String get last_sync_update => 'Last update sync at: '; + + @override + String get sync_server => 'Sync Server Address'; + + @override + String get sync_login_invalid_creds => 'Invalid email or password'; + + @override + String get sync_starting => 'Starting sync...'; + + @override + String get sync_finished => 'Sync finished'; + + @override + String get sync_failed => 'Sync failed'; + + @override + String get sync_button_sync => 'Sync progress'; + + @override + String get sync_on => 'Enable sync'; + + @override + String get sync_auto => 'Auto Sync'; + + @override + String get sync_auto_warning => + 'Auto Sync is currently an experimental feature!'; + + @override + String get sync_auto_off => 'Off'; + + @override + String get sync_auto_5_minutes => 'Every 5 minutes'; + + @override + String get sync_auto_10_minutes => 'Every 10 minutes'; + + @override + String get sync_auto_30_minutes => 'Every 30 minutes'; + + @override + String get sync_auto_1_hour => 'Every 1 hour'; + + @override + String get sync_auto_3_hours => 'Every 3 hours'; + + @override + String get sync_auto_6_hours => 'Every 6 hours'; + + @override + String get sync_auto_12_hours => 'Every 12 hours'; + + @override + String get server_error => 'Server error!'; + + @override + String get dialog_confirm => 'Confirm'; + + @override + String get description => 'বিৱৰণ'; + + @override + String get reorder_navigation => 'Customize navigation'; + + @override + String get reorder_navigation_description => + 'Reorder and toggle each navigation to your needs.'; + + @override + String get full_screen_player => 'Use Fullscreen'; + + @override + String get full_screen_player_info => + 'Automatically use fullscreen when playing a video.'; + + @override + String episode_progress(Object n) { + return 'প্ৰগতি: $n'; + } + + @override + String n_episodes(Object n) { + return '$n খণ্ড'; + } + + @override + String get manga_sources => 'মাংগা উৎস'; + + @override + String get anime_sources => 'এনিমে উৎস'; + + @override + String get novel_sources => 'Novel Sources'; + + @override + String get anime_extensions => 'এনিমে এক্সটেনশন'; + + @override + String get manga_extensions => 'মাংগা এক্সটেনশন'; + + @override + String get novel_extensions => 'Novel Extensions'; + + @override + String get anime => 'এনিমে'; + + @override + String get manga => 'মাংগা'; + + @override + String get novel => 'Novel'; + + @override + String get library_no_category_exist => 'আপোনাৰ এতিয়াও কোনো শ্ৰেণী নাই'; + + @override + String get watching => 'চাই আছে'; + + @override + String get plan_to_watch => 'চোৱাৰ পৰিকল্পনা'; + + @override + String get re_watching => 'পুনৰ চাই আছে'; + + @override + String get episodes => 'খণ্ড'; + + @override + String get download => 'ডাউনলোড'; + + @override + String get new_update_available => 'নতুন আপডেট উপলব্ধ'; + + @override + String app_version(Object v) { + return 'এপৰ সংস্কৰণ: v$v'; + } + + @override + String get searching_for_updates => 'আপডেটৰ বাবে সন্ধান কৰি আছে...'; + + @override + String get no_new_updates_available => 'কোনো নতুন আপডেট উপলব্ধ নাই'; + + @override + String get uninstall => 'আনইনষ্টল'; + + @override + String uninstall_extension(Object ext) { + return '$ext এক্সটেনশন আনইনষ্টল কৰিব নে?'; + } + + @override + String get langauage => 'ভাষা'; + + @override + String get extension_detail => 'এক্সটেনশনৰ বিৱৰণ'; + + @override + String get scale_type => 'স্কেলৰ ধৰণ'; + + @override + String get scale_type_fit_screen => 'স্ক্ৰীণৰ সৈতে মিলাওক'; + + @override + String get scale_type_stretch => 'প্ৰসাৰিত'; + + @override + String get scale_type_fit_width => 'প্ৰস্থৰ সৈতে মিলাওক'; + + @override + String get scale_type_fit_height => 'উচ্চতাৰ সৈতে মিলাওক'; + + @override + String get scale_type_original_size => 'মূল আকাৰ'; + + @override + String get scale_type_smart_fit => 'স্মাৰ্ট ফিট'; + + @override + String get page_preload_amount => 'পৃষ্ঠা প্ৰিলোডৰ পৰিমাণ'; + + @override + String get page_preload_amount_subtitle => + 'পঢ়াৰ সময়ত প্ৰিলোড কৰিবলগীয়া পৃষ্ঠাৰ পৰিমাণ। অধিক মানে মসৃণ পঢ়াৰ অভিজ্ঞতা, কিন্তু কেশ্ব আৰু নেটৱৰ্কৰ ব্যৱহাৰ বেছি হ’ব।'; + + @override + String get image_loading_error => 'এই ছবি লোড কৰিব পৰা নগ’ল'; + + @override + String get add_episodes => 'খণ্ড যোগ কৰক'; + + @override + String get video_quality => 'গুণ'; + + @override + String get video_subtitle => 'উপশিৰোনাম'; + + @override + String get check_for_extension_updates => 'এক্সটেনশন আপডেটৰ বাবে পৰীক্ষা কৰক'; + + @override + String get auto_extensions_updates => 'স্বয়ংক্ৰিয় এক্সটেনশন আপডেট'; + + @override + String get auto_extensions_updates_subtitle => + 'নতুন সংস্কৰণ উপলব্ধ হ’লে এক্সটেনশন স্বয়ংক্ৰিয়ভাৱে আপডেট কৰিব।'; + + @override + String get check_for_app_updates => 'Check for app updates on startup'; + + @override + String get reading_mode => 'পঢ়াৰ মোড'; + + @override + String get custom_filter => 'কাষ্টম ফিল্টাৰ'; + + @override + String get background_color => 'পটভূমিৰ ৰং'; + + @override + String get white => 'বগা'; + + @override + String get black => 'ক’লা'; + + @override + String get grey => 'ধূসৰ'; + + @override + String get automaic => 'স্বয়ংক্ৰিয়'; + + @override + String get preferred_domain => 'পছন্দৰ ড’মেইন'; + + @override + String get load_more => 'অধিক লোড কৰক'; + + @override + String get cancel_all_for_this_series => 'এই শৃংখলাৰ সকলো বাতিল কৰক'; + + @override + String get login => 'লগইন'; + + @override + String login_into(Object tracker) { + return '$tracker ত লগইন কৰক'; + } + + @override + String get email_adress => 'ইমেইল ঠিকনা'; + + @override + String get password => 'পাছৱৰ্ড'; + + @override + String log_out_from(Object tracker) { + return '$tracker ৰ পৰা লগ আউট কৰিব নে?'; + } + + @override + String get log_out => 'লগ আউট'; + + @override + String get update_pending => 'আপডেট বাকী আছে'; + + @override + String get update_all => 'সকলো আপডেট কৰক'; + + @override + String get backup_and_restore => 'বেকআপ আৰু পুনৰুদ্ধাৰ'; + + @override + String get create_backup => 'বেকআপ সৃষ্টি কৰক'; + + @override + String get create_backup_dialog_title => 'আপুনি কি বেকআপ কৰিব বিচাৰে?'; + + @override + String get create_backup_subtitle => + 'বৰ্তমানৰ পুথিভঁৰাল পুনৰুদ্ধাৰৰ বাবে ব্যৱহাৰ কৰিব পাৰি'; + + @override + String get restore_backup => 'বেকআপ পুনৰুদ্ধাৰ'; + + @override + String get restore_backup_subtitle => + 'বেকআপ ফাইলৰ পৰা পুথিভঁৰাল পুনৰুদ্ধাৰ কৰক'; + + @override + String get automatic_backups => 'স্বয়ংক্ৰিয় বেকআপ'; + + @override + String get backup_frequency => 'বেকআপৰ কম্পাঙ্ক'; + + @override + String get backup_location => 'বেকআপৰ স্থান'; + + @override + String get backup_options => 'বেকআপৰ বিকল্প'; + + @override + String get backup_options_dialog_title => 'আপুনি কি বেকআপ কৰিব বিচাৰে?'; + + @override + String get backup_options_subtitle => 'বেকআপ ফাইলত কি তথ্য অন্তৰ্ভুক্ত কৰিব'; + + @override + String get backup_and_restore_warning_info => + 'আপুনি বেকআপৰ কপি অন্য ঠাইতো ৰাখিব লাগে'; + + @override + String get library_entries => 'পুথিভঁৰালৰ এণ্ট্ৰি'; + + @override + String get chapters_and_episode => 'অধ্যায় আৰু খণ্ড'; + + @override + String get every_6_hours => 'প্ৰতি ৬ ঘণ্টা'; + + @override + String get every_12_hours => 'প্ৰতি ১২ ঘণ্টা'; + + @override + String get daily => 'দৈনিক'; + + @override + String get every_2_days => 'প্ৰতি ২ দিন'; + + @override + String get weekly => 'সাপ্তাহিক'; + + @override + String get restore_backup_warning_title => + 'বেকআপ পুনৰুদ্ধাৰে সকলো বিদ্যমান তথ্য ওভাৰৰাইট কৰিব।\n\nপুনৰুদ্ধাৰ অব্যাহত ৰাখিব নে?'; + + @override + String get services => 'সেৱা'; + + @override + String get tracking_warning_info => + 'ট্ৰেকিং সেৱাত অধ্যায়ৰ প্ৰগতি আপডেট কৰিবলৈ একমুখী ছিংক। পৃথক এণ্ট্ৰিৰ বাবে ট্ৰেকিং তেওঁলোকৰ ট্ৰেকিং বুটামৰ পৰা ছেট আপ কৰক।'; + + @override + String get use_page_tap_zones => 'পৃষ্ঠা টেপ জ’ন ব্যৱহাৰ কৰক'; + + @override + String get manage_trackers => 'ট্ৰেকাৰ পৰিচালনা কৰক'; + + @override + String get restore => 'পুনৰুদ্ধাৰ'; + + @override + String get backups => 'বেকআপ'; + + @override + String get by_scanlator => 'স্কেনলেটৰ অনুসৰি'; + + @override + String get by_name => 'নাম অনুসৰি'; + + @override + String get installed => 'ইনষ্টল কৰা'; + + @override + String get auto_scroll => 'স্বয়ংক্ৰিয় স্ক্ৰ’ল'; + + @override + String get video_audio => 'অডিঅ’'; + + @override + String get player => 'প্লেয়াৰ'; + + @override + String get markEpisodeAsSeenSetting => + 'খণ্ডটো কেতিয়া দেখা বুলি চিহ্নিত কৰিব'; + + @override + String get default_skip_intro_length => 'ডিফল্ট ইনট্ৰ’ এৰি দিয়াৰ দৈৰ্ঘ্য'; + + @override + String get default_playback_speed_length => 'ডিফল্ট প্লেবেক গতিৰ দৈৰ্ঘ্য'; + + @override + String get updateProgressAfterReading => 'পঢ়াৰ পিছত প্ৰগতি আপডেট কৰক'; + + @override + String get no_sources_installed => 'কোনো উৎস ইনষ্টল কৰা নাই!'; + + @override + String get show_extensions => 'এক্সটেনশন দেখুৱাওক'; + + @override + String get default_skip_forward_skip_length => + 'Default skip forward skip length'; + + @override + String get aniskip_requires_info => + 'AniSkip requires the anime to be tracked with MAL or Anilist to work.'; + + @override + String get enable_aniskip => 'Enable AniSkip'; + + @override + String get enable_auto_skip => 'Enable auto skip'; + + @override + String get aniskip_button_timeout => 'Button timeout'; + + @override + String get skip_opening => 'Skip opening'; + + @override + String get skip_ending => 'Skip ending'; + + @override + String get fullscreen => 'Fullscreen'; + + @override + String get update_library => 'Update library'; + + @override + String updating_library(Object cur, Object failed, Object max) { + return 'Updating library ($cur / $max) - Failed: $failed'; + } + + @override + String get next_chapter => 'Next chapter'; + + @override + String get next_5_chapters => 'Next 5 chapters'; + + @override + String get next_10_chapters => 'Next 10 chapters'; + + @override + String get next_25_chapters => 'Next 25 chapters'; + + @override + String get all_chapters => 'All chapters'; + + @override + String get next_episode => 'Next episode'; + + @override + String get next_5_episodes => 'Next 5 episodes'; + + @override + String get next_10_episodes => 'Next 10 episodes'; + + @override + String get next_25_episodes => 'Next 25 episodes'; + + @override + String get all_episodes => 'All episodes'; + + @override + String get cover_saved => 'Cover saved'; + + @override + String get set_as_cover => 'Set as cover'; + + @override + String get use_this_as_cover_art => 'Use this as cover art?'; + + @override + String get save => 'Save'; + + @override + String get picture_saved => 'Picture saved'; + + @override + String get cover_updated => 'Cover updated'; + + @override + String get include_subtitles => 'Include subtitles'; + + @override + String get blend_mode_default => 'Default'; + + @override + String get blend_mode_multiply => 'Multiply'; + + @override + String get blend_mode_screen => 'Screen'; + + @override + String get blend_mode_overlay => 'Overlay'; + + @override + String get blend_mode_colorDodge => 'ColorDodge'; + + @override + String get blend_mode_lighten => 'Lighten'; + + @override + String get blend_mode_colorBurn => 'ColorBurn'; + + @override + String get blend_mode_darken => 'Darken'; + + @override + String get blend_mode_difference => 'Difference'; + + @override + String get blend_mode_saturation => 'Saturation'; + + @override + String get blend_mode_softLight => 'SoftLight'; + + @override + String get blend_mode_plus => 'Plus'; + + @override + String get blend_mode_exclusion => 'Exclusion'; + + @override + String get custom_color_filter => 'Custom color filter'; + + @override + String get color_filter_blend_mode => 'Color filter blend mode'; + + @override + String get enable_all => 'Enable all'; + + @override + String get disable_all => 'Disable all'; + + @override + String get font => 'Font'; + + @override + String get color => 'Color'; + + @override + String get font_size => 'Font size'; + + @override + String get text => 'Text'; + + @override + String get border => 'Border'; + + @override + String get background => 'Background'; + + @override + String get no_subtite_warning_message => + 'Has no effect because there aren\'t any subtitle tracks in this video'; + + @override + String get grid_size => 'Grid size'; + + @override + String n_per_row(Object n) { + return '$n per row'; + } + + @override + String get horizontal_continious => 'Horizontal continuous'; + + @override + String get edit_code => 'Edit code'; + + @override + String get use_libass => 'Enable libass'; + + @override + String get use_libass_info => + 'Use libass based subtitle rendering for native backend.'; + + @override + String get libass_not_disable_message => + 'Disable `use libass` in player settings to be able to customize the subtitles.'; + + @override + String get torrent_stream => 'Torrent Stream'; + + @override + String get add_torrent => 'Add torrent'; + + @override + String get enter_torrent_hint_text => 'Enter magnet or torrent file url'; + + @override + String get torrent_url => 'Torrent url'; + + @override + String get or => 'OR'; + + @override + String get advanced => 'Advanced'; + + @override + String get use_native_http_client => 'Use native http client'; + + @override + String get use_native_http_client_info => + 'it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling'; + + @override + String n_hour_ago(Object hour) { + return '$hour hour ago'; + } + + @override + String n_hours_ago(Object hours) { + return '$hours hours ago'; + } + + @override + String n_minute_ago(Object minute) { + return '$minute minute ago'; + } + + @override + String n_minutes_ago(Object minutes) { + return '$minutes minutes ago'; + } + + @override + String n_day_ago(Object day) { + return '$day day ago'; + } + + @override + String get now => 'now'; + + @override + String library_last_updated(Object lastUpdated) { + return 'Library last updated: $lastUpdated'; + } + + @override + String get data_and_storage => 'Data and storage'; + + @override + String get download_location_info => 'Used for chapter downloads'; + + @override + String get storage => 'Storage'; + + @override + String get clear_chapter_and_episode_cache => + 'Clear chapter and episode cache'; + + @override + String get cache_cleared => 'Cache cleared'; + + @override + String get clear_chapter_or_episode_cache_on_app_launch => + 'Clear chapter/episode cache on app launch'; + + @override + String get app_settings => 'App settings'; + + @override + String get sources_settings => 'Sources settings'; + + @override + String get include_sensitive_settings => + 'Include sensitive settings (e.g., tracker login tokens)'; + + @override + String get create => 'Create'; + + @override + String get downloads_are_limited_to_wifi => + 'Downloads are limited to Wi-Fi only'; + + @override + String get manga_extensions_repo => 'Manga extensions repo'; + + @override + String get anime_extensions_repo => 'Anime extensions repo'; + + @override + String get novel_extensions_repo => 'Novel extensions repo'; + + @override + String get undefined => 'undefined'; + + @override + String get empty_extensions_repo => + 'You don\'t have any repository urls here. Click on the plus button to add one!'; + + @override + String get add_extensions_repo => 'Add repo URL'; + + @override + String get remove_extensions_repo => 'Remove repo URL'; + + @override + String get manage_manga_repo_urls => 'Manage Manga Repo URLs'; + + @override + String get manage_anime_repo_urls => 'Manage Anime Repo URLs'; + + @override + String get manage_novel_repo_urls => 'Manage Novel Repo URLs'; + + @override + String get url_cannot_be_empty => 'URL cannot be empty'; + + @override + String get url_must_end_with_dot_json => 'URL must end with .json'; + + @override + String get repo_url => 'Repo URL'; + + @override + String get invalid_url_format => 'Invalid URL format'; + + @override + String get clear_all_sources => 'Clear all sources'; + + @override + String get clear_all_sources_msg => + 'This will completely erase all sources of the application. Are you sure you want to continue?'; + + @override + String get sources_cleared => 'Sources cleared!!!'; + + @override + String get repo_added => 'Source repository added!'; + + @override + String get add_repo => 'Add Repository?'; + + @override + String get genre_search_library => 'Search genre in library'; + + @override + String get genre_search_source => 'Browse in source'; + + @override + String get source_not_added => 'Source is not installed!'; + + @override + String get load_own_subtitles => 'Load your own subtitles...'; + + @override + String extension_notes(Object notes) { + return 'Notes: $notes'; + } + + @override + String get unsupported_repo => + 'You\'ve tried to add an unsupported repository. Please check the discord server for support!'; + + @override + String get end_of_chapter => 'End of chapter'; + + @override + String get chapter_completed => 'Chapter completed'; + + @override + String get continue_to_next_chapter => + 'Continue scrolling to read the next chapter'; + + @override + String get no_next_chapter => 'No next chapter'; + + @override + String get you_have_finished_reading => 'You have finished reading'; + + @override + String get return_to_the_list_of_chapters => 'Return to the list of chapters'; + + @override + String get hwdec => 'Hardware Decoder'; + + @override + String get track_library_add => 'Add to local library'; + + @override + String get track_library_add_confirm => 'Add tracked item to local library'; + + @override + String get track_library_not_logged => + 'Login to the corresponding tracker to use this feature!'; + + @override + String get track_library_switch => 'Switch to another tracker'; + + @override + String get go_back => 'Go back'; + + @override + String get merge_library_nav_mobile => 'Merge library navigation on mobile'; + + @override + String get enable_discord_rpc => 'Enable Discord RPC'; + + @override + String get hide_discord_rpc_incognito => + 'Hide Discord RPC while in Incognito'; + + @override + String get rpc_show_reading_watching_progress => + 'Show current chapter in Discord (requires a restart)'; + + @override + String get rpc_show_title => 'Show current title in Discord'; + + @override + String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get sync_enable_histories => 'Sync history data'; + + @override + String get sync_enable_updates => 'Sync update data'; + + @override + String get sync_enable_settings => 'Sync settings'; +} diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart new file mode 100644 index 00000000..75e73a35 --- /dev/null +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -0,0 +1,1500 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hindi (`hi`). +class AppLocalizationsHi extends AppLocalizations { + AppLocalizationsHi([String locale = 'hi']) : super(locale); + + @override + String get library => 'पुस्तकालय'; + + @override + String get updates => 'अपडेट'; + + @override + String get history => 'इतिहास'; + + @override + String get browse => 'ब्राउज़'; + + @override + String get more => 'और'; + + @override + String get open_random_entry => 'कोई भी प्रविष्टि खोलें'; + + @override + String get import => 'आयात'; + + @override + String get filter => 'फ़िल्टर'; + + @override + String get ignore_filters => 'Ignore Filters'; + + @override + String get downloaded => 'डाउनलोड किया गया'; + + @override + String get unread => 'अपठित'; + + @override + String get unwatched => 'Unwatched'; + + @override + String get started => 'शुरू किया'; + + @override + String get bookmarked => 'बुकमार्क किया'; + + @override + String get sort => 'छाँटें'; + + @override + String get alphabetically => 'वर्णानुक्रम'; + + @override + String get last_read => 'आखिरी बार पढ़ा'; + + @override + String get last_watched => 'Last watched'; + + @override + String get last_update_check => 'आखिरी अपडेट जांच'; + + @override + String last_entry_delete_warning( + num count, + Object entryType, + Object entryTypePlural, + Object mediaType, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: + 'You are deleting all $count $entryTypePlural of this $mediaType from the library.', + one: + 'You are deleting the only $entryType of this $mediaType from the library.', + ); + return '$_temp0\nThis will also remove the whole $mediaType from your library.\n\nNote: The files themselves will not be deleted.'; + } + + @override + String get chapter => 'chapter'; + + @override + String get episode => 'episode'; + + @override + String get unread_count => 'अपठित गिनती'; + + @override + String get unwatched_count => 'Unwatched count'; + + @override + String get latest_chapter => 'नवीनतम अध्याय'; + + @override + String get latest_episode => 'Latest episode'; + + @override + String get date_added => 'जोड़ा गया तारीख'; + + @override + String get display => 'प्रदर्शन'; + + @override + String get display_mode => 'प्रदर्शन मोड'; + + @override + String get compact_grid => 'संक्षिप्त ग्रिड'; + + @override + String get comfortable_grid => 'आरामदायक ग्रिड'; + + @override + String get cover_only_grid => 'केवल कवर ग्रिड'; + + @override + String get list => 'सूची'; + + @override + String get badges => 'बैज'; + + @override + String get downloaded_chapters => 'डाउनलोड किए गए अध्याय'; + + @override + String get downloaded_episodes => 'Downloaded episodes'; + + @override + String get language => 'भाषा'; + + @override + String get local_source => 'स्थानीय स्रोत'; + + @override + String get tabs => 'टैब'; + + @override + String get show_category_tabs => 'श्रेणी टैब दिखाएँ'; + + @override + String get show_numbers_of_items => 'आइटम की संख्या दिखाएँ'; + + @override + String get other => 'अन्य'; + + @override + String get show_continue_reading_buttons => 'पढ़ना जारी रखें बटन दिखाएँ'; + + @override + String get show_continue_watching_buttons => 'Show continue watching buttons'; + + @override + String get empty_library => 'खाली पुस्तकालय'; + + @override + String get search => 'खोजें...'; + + @override + String get no_recent_updates => 'कोई हालिया अपडेट नहीं'; + + @override + String get remove_everything => 'सब कुछ हटाएँ'; + + @override + String get remove_everything_msg => + 'क्या आप निश्चित हैं? सारा इतिहास खो जाएगा'; + + @override + String get remove_all_update_msg => + 'Are you sure? The whole update will be cleared'; + + @override + String get ok => 'ठीक है'; + + @override + String get cancel => 'रद्द करें'; + + @override + String get remove => 'हटाएँ'; + + @override + String get remove_history_msg => + 'यह इस अध्याय की पढ़ने की तारीख को हटा देगा। क्या आप निश्चित हैं?'; + + @override + String get last_used => 'आखिरी बार उपयोग'; + + @override + String get pinned => 'पिन किया गया'; + + @override + String get sources => 'स्रोत'; + + @override + String get install => 'स्थापित करें'; + + @override + String get update => 'अपडेट करें'; + + @override + String get latest => 'नवीनतम'; + + @override + String get extensions => 'एक्सटेंशन'; + + @override + String get migrate => 'स्थानांतरण'; + + @override + String get migrate_confirm => 'Migrate to another source'; + + @override + String get clean_database => 'Clean database'; + + @override + String cleaned_database(Object x) { + return 'Database cleaned! $x entries removed'; + } + + @override + String get clean_database_desc => + 'This will remove all items that are not added to the library!'; + + @override + String get incognito_mode => 'गुप्त मोड'; + + @override + String get incognito_mode_description => 'पढ़ने का इतिहास रोकता है'; + + @override + String get download_queue => 'डाउनलोड कतार'; + + @override + String get categories => 'श्रेणियाँ'; + + @override + String get statistics => 'Statistics'; + + @override + String get settings => 'सेटिंग्स'; + + @override + String get about => 'के बारे में'; + + @override + String get help => 'मदद'; + + @override + String get no_downloads => 'कोई डाउनलोड नहीं'; + + @override + String get edit_categories => 'श्रेणियाँ संपादित करें'; + + @override + String get edit_categories_description => + 'आपके पास कोई श्रेणी नहीं है। अपनी लाइब्रेरी को व्यवस्थित करने के लिए प्लस बटन दबाएँ'; + + @override + String get add => 'जोड़ें'; + + @override + String get add_category => 'श्रेणी जोड़ें'; + + @override + String get name => 'नाम'; + + @override + String get category_name_required => '*आवश्यक'; + + @override + String get add_category_error_exist => 'इस नाम की श्रेणी पहले से मौजूद है!'; + + @override + String get delete_category => 'श्रेणी हटाएँ'; + + @override + String delete_category_msg(Object name) { + return 'क्या आप श्रेणी $name को हटाना चाहते हैं?'; + } + + @override + String get rename_category => 'श्रेणी का नाम बदलें'; + + @override + String get general => 'सामान्य'; + + @override + String get general_subtitle => 'ऐप की भाषा'; + + @override + String get app_language => 'ऐप की भाषा'; + + @override + String get default_subtitle_language => 'Default subtitle language'; + + @override + String get appearance => 'दिखावट'; + + @override + String get appearance_subtitle => 'थीम, तारीख और समय प्रारूप'; + + @override + String get theme => 'थीम'; + + @override + String get dark_mode => 'डार्क मोड'; + + @override + String get follow_system_theme => 'Follow system theme'; + + @override + String get on => 'चालू'; + + @override + String get off => 'बंद'; + + @override + String get pure_black_dark_mode => 'पूर्ण काला डार्क मोड'; + + @override + String get timestamp => 'समय चिह्न'; + + @override + String get relative_timestamp => 'सापेक्ष समय चिह्न'; + + @override + String get relative_timestamp_short => 'संक्षिप्त (आज, कल)'; + + @override + String get relative_timestamp_long => 'लंबा (संक्षिप्त+, n दिन पहले)'; + + @override + String get date_format => 'तारीख प्रारूप'; + + @override + String get reader => 'पढ़ने वाला'; + + @override + String get refresh => 'ताज़ा करें'; + + @override + String get reader_subtitle => 'पढ़ने का मोड, प्रदर्शन, नेविगेशन'; + + @override + String get default_reading_mode => 'डिफ़ॉल्ट पढ़ने का मोड'; + + @override + String get reading_mode_vertical => 'लंबवत'; + + @override + String get reading_mode_horizontal => 'क्षैतिज'; + + @override + String get reading_mode_left_to_right => 'बाएँ से दाएँ'; + + @override + String get reading_mode_right_to_left => 'दाएँ से बाएँ'; + + @override + String get reading_mode_vertical_continuous => 'लंबवत निरंतर'; + + @override + String get reading_mode_webtoon => 'वेबटून'; + + @override + String get double_tap_animation_speed => 'डबल टैप एनिमेशन गति'; + + @override + String get normal => 'सामान्य'; + + @override + String get fast => 'तेज़'; + + @override + String get no_animation => 'कोई एनिमेशन नहीं'; + + @override + String get animate_page_transitions => 'पेज ट्रांज़िशन को एनिमेट करें'; + + @override + String get crop_borders => 'किनारों को काटें'; + + @override + String get downloads => 'डाउनलोड'; + + @override + String get downloads_subtitle => 'डाउनलोड सेटिंग्स'; + + @override + String get download_location => 'डाउनलोड स्थान'; + + @override + String get custom_location => 'कस्टम स्थान'; + + @override + String get only_on_wifi => 'केवल वाईफाई पर'; + + @override + String get save_as_cbz_archive => 'सीबीजेड आर्काइव के रूप में सहेजें'; + + @override + String get concurrent_downloads => 'Concurrent downloads'; + + @override + String get browse_subtitle => 'स्रोत, वैश्विक खोज'; + + @override + String get only_include_pinned_sources => 'केवल पिन किए गए स्रोत शामिल करें'; + + @override + String get nsfw_sources => 'एनएसएफडब्ल्यू (+18) स्रोत'; + + @override + String get nsfw_sources_show => 'स्रोत और एक्सटेंशन सूची में दिखाएँ'; + + @override + String get nsfw_sources_info => + 'यह अनौपचारिक या संभावित रूप से गलत तरीके से चिह्नित एक्सटेंशन को ऐप के भीतर एनएसएफडब्ल्यू (18+) सामग्री को सामने लाने से नहीं रोकता'; + + @override + String get version => 'संस्करण'; + + @override + String get check_for_update => 'अपडेट के लिए जांचें'; + + @override + String n_days_ago(Object days) { + return '$days दिन पहले'; + } + + @override + String get today => 'आज'; + + @override + String get yesterday => 'कल'; + + @override + String get a_week_ago => 'एक सप्ताह पहले'; + + @override + String get add_to_library => 'पुस्तकालय में जोड़ें'; + + @override + String get completed => 'पूरा हुआ'; + + @override + String get ongoing => 'चल रहा है'; + + @override + String get on_hiatus => 'विराम पर'; + + @override + String get canceled => 'रद्द'; + + @override + String get publishing_finished => 'प्रकाशन समाप्त'; + + @override + String get unknown => 'अज्ञात'; + + @override + String get set_categories => 'श्रेणियाँ सेट करें'; + + @override + String get edit => 'संपादित करें'; + + @override + String get in_library => 'पुस्तकालय में'; + + @override + String get filter_scanlator_groups => 'स्कैनलेटर समूहों को फ़िल्टर करें'; + + @override + String get reset => 'रीसेट'; + + @override + String get by_source => 'स्रोत के अनुसार'; + + @override + String get by_chapter_number => 'अध्याय संख्या के अनुसार'; + + @override + String get by_episode_number => 'By episode number'; + + @override + String get by_upload_date => 'अपलोड तारीख के अनुसार'; + + @override + String get source_title => 'स्रोत शीर्षक'; + + @override + String get chapter_number => 'अध्याय संख्या'; + + @override + String get episode_number => 'Episode number'; + + @override + String get share => 'साझा करें'; + + @override + String n_chapters(Object number) { + return '$number अध्याय'; + } + + @override + String get no_description => 'कोई विवरण नहीं'; + + @override + String get resume => 'जारी रखें'; + + @override + String get read => 'पढ़ें'; + + @override + String get watch => 'Watch'; + + @override + String get popular => 'लोकप्रिय'; + + @override + String get open_in_browser => 'ब्राउज़र में खोलें'; + + @override + String get clear_cookie => 'कुकी साफ़ करें'; + + @override + String get show_page_number => 'पेज नंबर दिखाएँ'; + + @override + String get from_library => 'पुस्तकालय से'; + + @override + String get downloaded_chapter => 'डाउनलोड किया गया अध्याय'; + + @override + String page(Object page) { + return 'पेज $page'; + } + + @override + String get global_search => 'वैश्विक खोज'; + + @override + String get color_blend_level => 'रंग मिश्रण स्तर'; + + @override + String current(Object char) { + return 'वर्तमान $char'; + } + + @override + String finished(Object char) { + return 'समाप्त $char'; + } + + @override + String next(Object char) { + return 'अगला $char'; + } + + @override + String previous(Object char) { + return 'पिछला $char'; + } + + @override + String get no_more_chapter => 'कोई और अध्याय नहीं है'; + + @override + String get no_result => 'कोई परिणाम नहीं'; + + @override + String get send => 'भेजें'; + + @override + String get delete => 'हटाएँ'; + + @override + String get start_downloading => 'अब डाउनलोड शुरू करें'; + + @override + String get retry => 'पुनः प्रयास करें'; + + @override + String get add_chapters => 'अध्याय जोड़ें'; + + @override + String get delete_chapters => 'अध्याय हटाएँ?'; + + @override + String get default0 => 'डिफ़ॉल्ट'; + + @override + String get total_chapters => 'कुल अध्याय'; + + @override + String get total_episodes => 'Total episodes'; + + @override + String get import_local_file => 'स्थानीय फ़ाइल आयात करें'; + + @override + String get import_files => 'फ़ाइलें'; + + @override + String get nothing_read_recently => 'हाल ही में कुछ भी नहीं पढ़ा'; + + @override + String get status => 'स्थिति'; + + @override + String get not_started => 'शुरू नहीं हुआ'; + + @override + String get score => 'स्कोर'; + + @override + String get start_date => 'शुरू की तारीख'; + + @override + String get finish_date => 'समाप्ति की तारीख'; + + @override + String get reading => 'पढ़ रहा है'; + + @override + String get on_hold => 'रोक पर'; + + @override + String get dropped => 'छोड़ दिया'; + + @override + String get plan_to_read => 'पढ़ने की योजना'; + + @override + String get re_reading => 'पुनः पढ़ रहा है'; + + @override + String get chapters => 'अध्याय'; + + @override + String get add_tracker => 'ट्रैकर जोड़ें'; + + @override + String get one_tracker => '1 ट्रैकर'; + + @override + String n_tracker(Object n) { + return '$n ट्रैकर'; + } + + @override + String get tracking => 'ट्रैकिंग'; + + @override + String get syncing => 'Sync'; + + @override + String get sync_password => 'Password (at least 8 characters)'; + + @override + String get sync_logged => 'Login successful'; + + @override + String get syncing_subtitle => + 'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!'; + + @override + String get last_sync_manga => 'Last manga sync at: '; + + @override + String get last_sync_history => 'Last history sync at: '; + + @override + String get last_sync_update => 'Last update sync at: '; + + @override + String get sync_server => 'Sync Server Address'; + + @override + String get sync_login_invalid_creds => 'Invalid email or password'; + + @override + String get sync_starting => 'Starting sync...'; + + @override + String get sync_finished => 'Sync finished'; + + @override + String get sync_failed => 'Sync failed'; + + @override + String get sync_button_sync => 'Sync progress'; + + @override + String get sync_on => 'Enable sync'; + + @override + String get sync_auto => 'Auto Sync'; + + @override + String get sync_auto_warning => + 'Auto Sync is currently an experimental feature!'; + + @override + String get sync_auto_off => 'Off'; + + @override + String get sync_auto_5_minutes => 'Every 5 minutes'; + + @override + String get sync_auto_10_minutes => 'Every 10 minutes'; + + @override + String get sync_auto_30_minutes => 'Every 30 minutes'; + + @override + String get sync_auto_1_hour => 'Every 1 hour'; + + @override + String get sync_auto_3_hours => 'Every 3 hours'; + + @override + String get sync_auto_6_hours => 'Every 6 hours'; + + @override + String get sync_auto_12_hours => 'Every 12 hours'; + + @override + String get server_error => 'Server error!'; + + @override + String get dialog_confirm => 'Confirm'; + + @override + String get description => 'विवरण'; + + @override + String get reorder_navigation => 'Customize navigation'; + + @override + String get reorder_navigation_description => + 'Reorder and toggle each navigation to your needs.'; + + @override + String get full_screen_player => 'Use Fullscreen'; + + @override + String get full_screen_player_info => + 'Automatically use fullscreen when playing a video.'; + + @override + String episode_progress(Object n) { + return 'प्रगति: $n'; + } + + @override + String n_episodes(Object n) { + return '$n एपिसोड'; + } + + @override + String get manga_sources => 'मंगा स्रोत'; + + @override + String get anime_sources => 'एनीमे स्रोत'; + + @override + String get novel_sources => 'Novel Sources'; + + @override + String get anime_extensions => 'एनीमे एक्सटेंशन'; + + @override + String get manga_extensions => 'मंगा एक्सटेंशन'; + + @override + String get novel_extensions => 'Novel Extensions'; + + @override + String get anime => 'एनीमे'; + + @override + String get manga => 'मंगा'; + + @override + String get novel => 'Novel'; + + @override + String get library_no_category_exist => 'आपके पास अभी कोई श्रेणी नहीं है'; + + @override + String get watching => 'देख रहा है'; + + @override + String get plan_to_watch => 'देखने की योजना'; + + @override + String get re_watching => 'पुनः देख रहा है'; + + @override + String get episodes => 'एपिसोड'; + + @override + String get download => 'डाउनलोड'; + + @override + String get new_update_available => 'नया अपडेट उपलब्ध'; + + @override + String app_version(Object v) { + return 'ऐप संस्करण: v$v'; + } + + @override + String get searching_for_updates => 'अपडेट की खोज हो रही है...'; + + @override + String get no_new_updates_available => 'कोई नया अपडेट उपलब्ध नहीं'; + + @override + String get uninstall => 'हटाएँ'; + + @override + String uninstall_extension(Object ext) { + return '$ext एक्सटेंशन हटाएँ?'; + } + + @override + String get langauage => 'भाषा'; + + @override + String get extension_detail => 'एक्सटेंशन विवरण'; + + @override + String get scale_type => 'स्केल प्रकार'; + + @override + String get scale_type_fit_screen => 'स्क्रीन पर फिट'; + + @override + String get scale_type_stretch => 'खींचें'; + + @override + String get scale_type_fit_width => 'चौड़ाई पर फिट'; + + @override + String get scale_type_fit_height => 'ऊँचाई पर फिट'; + + @override + String get scale_type_original_size => 'मूल आकार'; + + @override + String get scale_type_smart_fit => 'स्मार्ट फिट'; + + @override + String get page_preload_amount => 'पेज प्रीलोड मात्रा'; + + @override + String get page_preload_amount_subtitle => + 'पढ़ते समय प्रीलोड करने वाले पेजों की मात्रा। उच्च मानों से पढ़ने का अनुभव बेहतर होगा, लेकिन कैश और नेटवर्क उपयोग अधिक होगा।'; + + @override + String get image_loading_error => 'यह छवि लोड नहीं हो सकी'; + + @override + String get add_episodes => 'एपिसोड जोड़ें'; + + @override + String get video_quality => 'गुणवत्ता'; + + @override + String get video_subtitle => 'उपशीर्षक'; + + @override + String get check_for_extension_updates => 'एक्सटेंशन अपडेट की जाँच करें'; + + @override + String get auto_extensions_updates => 'स्वचालित एक्सटेंशन अपडेट'; + + @override + String get auto_extensions_updates_subtitle => + 'जब नया संस्करण उपलब्ध होगा तो एक्सटेंशन स्वचालित रूप से अपडेट हो जाएगा।'; + + @override + String get check_for_app_updates => 'Check for app updates on startup'; + + @override + String get reading_mode => 'पढ़ने का मोड'; + + @override + String get custom_filter => 'कस्टम फ़िल्टर'; + + @override + String get background_color => 'पृष्ठभूमि रंग'; + + @override + String get white => 'सफेद'; + + @override + String get black => 'काला'; + + @override + String get grey => 'ग्रे'; + + @override + String get automaic => 'स्वचालित'; + + @override + String get preferred_domain => 'पसंदीदा डोमेन'; + + @override + String get load_more => 'और लोड करें'; + + @override + String get cancel_all_for_this_series => 'इस सीरीज़ के लिए सभी रद्द करें'; + + @override + String get login => 'लॉगिन'; + + @override + String login_into(Object tracker) { + return '$tracker में लॉगिन करें'; + } + + @override + String get email_adress => 'ईमेल पता'; + + @override + String get password => 'पासवर्ड'; + + @override + String log_out_from(Object tracker) { + return '$tracker से लॉग आउट करें?'; + } + + @override + String get log_out => 'लॉग आउट'; + + @override + String get update_pending => 'अपडेट लंबित'; + + @override + String get update_all => 'सभी अपडेट करें'; + + @override + String get backup_and_restore => 'बैकअप और पुनर्स्थापना'; + + @override + String get create_backup => 'बैकअप बनाएँ'; + + @override + String get create_backup_dialog_title => 'आप क्या बैकअप करना चाहते हैं?'; + + @override + String get create_backup_subtitle => + 'वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है'; + + @override + String get restore_backup => 'बैकअप पुनर्स्थापित करें'; + + @override + String get restore_backup_subtitle => + 'बैकअप फ़ाइल से पुस्तकालय पुनर्स्थापित करें'; + + @override + String get automatic_backups => 'स्वचालित बैकअप'; + + @override + String get backup_frequency => 'बैकअप आवृत्ति'; + + @override + String get backup_location => 'बैकअप स्थान'; + + @override + String get backup_options => 'बैकअप विकल्प'; + + @override + String get backup_options_dialog_title => 'आप क्या बैकअप करना चाहते हैं?'; + + @override + String get backup_options_subtitle => + 'बैकअप फ़ाइल में क्या जानकारी शामिल करनी है'; + + @override + String get backup_and_restore_warning_info => + 'आपको बैकअप की प्रतियां अन्य स्थानों पर भी रखनी चाहिए'; + + @override + String get library_entries => 'पुस्तकालय प्रविष्टियाँ'; + + @override + String get chapters_and_episode => 'अध्याय और एपिसोड'; + + @override + String get every_6_hours => 'हर 6 घंटे'; + + @override + String get every_12_hours => 'हर 12 घंटे'; + + @override + String get daily => 'दैनिक'; + + @override + String get every_2_days => 'हर 2 दिन'; + + @override + String get weekly => 'साप्ताहिक'; + + @override + String get restore_backup_warning_title => + 'बैकअप पुनर्स्थापित करने से सभी मौजूदा डेटा अधिलेखित हो जाएगा।\n\nपुनर्स्थापना जारी रखें?'; + + @override + String get services => 'सेवाएँ'; + + @override + String get tracking_warning_info => + 'ट्रैकिंग सेवाओं में अध्याय प्रगति को अपडेट करने के लिए एकतरफा समन्वय। व्यक्तिगत प्रविष्टियों के लिए ट्रैकिंग सेट करें।'; + + @override + String get use_page_tap_zones => 'पेज टैप ज़ोन का उपयोग करें'; + + @override + String get manage_trackers => 'ट्रैकर्स प्रबंधित करें'; + + @override + String get restore => 'पुनर्स्थापित करें'; + + @override + String get backups => 'बैकअप'; + + @override + String get by_scanlator => 'स्कैनलेटर के अनुसार'; + + @override + String get by_name => 'नाम के अनुसार'; + + @override + String get installed => 'स्थापित'; + + @override + String get auto_scroll => 'स्वचालित स्क्रॉल'; + + @override + String get video_audio => 'ऑडियो'; + + @override + String get player => 'प्लेयर'; + + @override + String get markEpisodeAsSeenSetting => + 'एपिसोड को कब देखा गया के रूप में चिह्नित करना है'; + + @override + String get default_skip_intro_length => 'डिफ़ॉल्ट परिचय छोड़ने की अवधि'; + + @override + String get default_playback_speed_length => 'डिफ़ॉल्ट प्लेबैक गति अवधि'; + + @override + String get updateProgressAfterReading => 'पढ़ने के बाद प्रगति अपडेट करें'; + + @override + String get no_sources_installed => 'कोई स्रोत स्थापित नहीं है!'; + + @override + String get show_extensions => 'एक्सटेंशन दिखाएँ'; + + @override + String get default_skip_forward_skip_length => + 'Default skip forward skip length'; + + @override + String get aniskip_requires_info => + 'AniSkip requires the anime to be tracked with MAL or Anilist to work.'; + + @override + String get enable_aniskip => 'Enable AniSkip'; + + @override + String get enable_auto_skip => 'Enable auto skip'; + + @override + String get aniskip_button_timeout => 'Button timeout'; + + @override + String get skip_opening => 'Skip opening'; + + @override + String get skip_ending => 'Skip ending'; + + @override + String get fullscreen => 'Fullscreen'; + + @override + String get update_library => 'Update library'; + + @override + String updating_library(Object cur, Object failed, Object max) { + return 'Updating library ($cur / $max) - Failed: $failed'; + } + + @override + String get next_chapter => 'Next chapter'; + + @override + String get next_5_chapters => 'Next 5 chapters'; + + @override + String get next_10_chapters => 'Next 10 chapters'; + + @override + String get next_25_chapters => 'Next 25 chapters'; + + @override + String get all_chapters => 'All chapters'; + + @override + String get next_episode => 'Next episode'; + + @override + String get next_5_episodes => 'Next 5 episodes'; + + @override + String get next_10_episodes => 'Next 10 episodes'; + + @override + String get next_25_episodes => 'Next 25 episodes'; + + @override + String get all_episodes => 'All episodes'; + + @override + String get cover_saved => 'Cover saved'; + + @override + String get set_as_cover => 'Set as cover'; + + @override + String get use_this_as_cover_art => 'Use this as cover art?'; + + @override + String get save => 'Save'; + + @override + String get picture_saved => 'Picture saved'; + + @override + String get cover_updated => 'Cover updated'; + + @override + String get include_subtitles => 'Include subtitles'; + + @override + String get blend_mode_default => 'Default'; + + @override + String get blend_mode_multiply => 'Multiply'; + + @override + String get blend_mode_screen => 'Screen'; + + @override + String get blend_mode_overlay => 'Overlay'; + + @override + String get blend_mode_colorDodge => 'ColorDodge'; + + @override + String get blend_mode_lighten => 'Lighten'; + + @override + String get blend_mode_colorBurn => 'ColorBurn'; + + @override + String get blend_mode_darken => 'Darken'; + + @override + String get blend_mode_difference => 'Difference'; + + @override + String get blend_mode_saturation => 'Saturation'; + + @override + String get blend_mode_softLight => 'SoftLight'; + + @override + String get blend_mode_plus => 'Plus'; + + @override + String get blend_mode_exclusion => 'Exclusion'; + + @override + String get custom_color_filter => 'Custom color filter'; + + @override + String get color_filter_blend_mode => 'Color filter blend mode'; + + @override + String get enable_all => 'Enable all'; + + @override + String get disable_all => 'Disable all'; + + @override + String get font => 'Font'; + + @override + String get color => 'Color'; + + @override + String get font_size => 'Font size'; + + @override + String get text => 'Text'; + + @override + String get border => 'Border'; + + @override + String get background => 'Background'; + + @override + String get no_subtite_warning_message => + 'Has no effect because there aren\'t any subtitle tracks in this video'; + + @override + String get grid_size => 'Grid size'; + + @override + String n_per_row(Object n) { + return '$n per row'; + } + + @override + String get horizontal_continious => 'Horizontal continuous'; + + @override + String get edit_code => 'Edit code'; + + @override + String get use_libass => 'Enable libass'; + + @override + String get use_libass_info => + 'Use libass based subtitle rendering for native backend.'; + + @override + String get libass_not_disable_message => + 'Disable `use libass` in player settings to be able to customize the subtitles.'; + + @override + String get torrent_stream => 'Torrent Stream'; + + @override + String get add_torrent => 'Add torrent'; + + @override + String get enter_torrent_hint_text => 'Enter magnet or torrent file url'; + + @override + String get torrent_url => 'Torrent url'; + + @override + String get or => 'OR'; + + @override + String get advanced => 'Advanced'; + + @override + String get use_native_http_client => 'Use native http client'; + + @override + String get use_native_http_client_info => + 'it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling'; + + @override + String n_hour_ago(Object hour) { + return '$hour hour ago'; + } + + @override + String n_hours_ago(Object hours) { + return '$hours hours ago'; + } + + @override + String n_minute_ago(Object minute) { + return '$minute minute ago'; + } + + @override + String n_minutes_ago(Object minutes) { + return '$minutes minutes ago'; + } + + @override + String n_day_ago(Object day) { + return '$day day ago'; + } + + @override + String get now => 'now'; + + @override + String library_last_updated(Object lastUpdated) { + return 'Library last updated: $lastUpdated'; + } + + @override + String get data_and_storage => 'Data and storage'; + + @override + String get download_location_info => 'Used for chapter downloads'; + + @override + String get storage => 'Storage'; + + @override + String get clear_chapter_and_episode_cache => + 'Clear chapter and episode cache'; + + @override + String get cache_cleared => 'Cache cleared'; + + @override + String get clear_chapter_or_episode_cache_on_app_launch => + 'Clear chapter/episode cache on app launch'; + + @override + String get app_settings => 'App settings'; + + @override + String get sources_settings => 'Sources settings'; + + @override + String get include_sensitive_settings => + 'Include sensitive settings (e.g., tracker login tokens)'; + + @override + String get create => 'Create'; + + @override + String get downloads_are_limited_to_wifi => + 'Downloads are limited to Wi-Fi only'; + + @override + String get manga_extensions_repo => 'Manga extensions repo'; + + @override + String get anime_extensions_repo => 'Anime extensions repo'; + + @override + String get novel_extensions_repo => 'Novel extensions repo'; + + @override + String get undefined => 'undefined'; + + @override + String get empty_extensions_repo => + 'You don\'t have any repository urls here. Click on the plus button to add one!'; + + @override + String get add_extensions_repo => 'Add repo URL'; + + @override + String get remove_extensions_repo => 'Remove repo URL'; + + @override + String get manage_manga_repo_urls => 'Manage Manga Repo URLs'; + + @override + String get manage_anime_repo_urls => 'Manage Anime Repo URLs'; + + @override + String get manage_novel_repo_urls => 'Manage Novel Repo URLs'; + + @override + String get url_cannot_be_empty => 'URL cannot be empty'; + + @override + String get url_must_end_with_dot_json => 'URL must end with .json'; + + @override + String get repo_url => 'Repo URL'; + + @override + String get invalid_url_format => 'Invalid URL format'; + + @override + String get clear_all_sources => 'Clear all sources'; + + @override + String get clear_all_sources_msg => + 'This will completely erase all sources of the application. Are you sure you want to continue?'; + + @override + String get sources_cleared => 'Sources cleared!!!'; + + @override + String get repo_added => 'Source repository added!'; + + @override + String get add_repo => 'Add Repository?'; + + @override + String get genre_search_library => 'Search genre in library'; + + @override + String get genre_search_source => 'Browse in source'; + + @override + String get source_not_added => 'Source is not installed!'; + + @override + String get load_own_subtitles => 'Load your own subtitles...'; + + @override + String extension_notes(Object notes) { + return 'Notes: $notes'; + } + + @override + String get unsupported_repo => + 'You\'ve tried to add an unsupported repository. Please check the discord server for support!'; + + @override + String get end_of_chapter => 'End of chapter'; + + @override + String get chapter_completed => 'Chapter completed'; + + @override + String get continue_to_next_chapter => + 'Continue scrolling to read the next chapter'; + + @override + String get no_next_chapter => 'No next chapter'; + + @override + String get you_have_finished_reading => 'You have finished reading'; + + @override + String get return_to_the_list_of_chapters => 'Return to the list of chapters'; + + @override + String get hwdec => 'Hardware Decoder'; + + @override + String get track_library_add => 'Add to local library'; + + @override + String get track_library_add_confirm => 'Add tracked item to local library'; + + @override + String get track_library_not_logged => + 'Login to the corresponding tracker to use this feature!'; + + @override + String get track_library_switch => 'Switch to another tracker'; + + @override + String get go_back => 'Go back'; + + @override + String get merge_library_nav_mobile => 'Merge library navigation on mobile'; + + @override + String get enable_discord_rpc => 'Enable Discord RPC'; + + @override + String get hide_discord_rpc_incognito => + 'Hide Discord RPC while in Incognito'; + + @override + String get rpc_show_reading_watching_progress => + 'Show current chapter in Discord (requires a restart)'; + + @override + String get rpc_show_title => 'Show current title in Discord'; + + @override + String get rpc_show_cover_image => 'Show current cover image in Discord'; + + @override + String get sync_enable_histories => 'Sync history data'; + + @override + String get sync_enable_updates => 'Sync update data'; + + @override + String get sync_enable_settings => 'Sync settings'; +} diff --git a/pubspec.lock b/pubspec.lock index 456768e0..9a655fdc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -354,10 +354,10 @@ packages: dependency: "direct main" description: name: d4rt - sha256: "40ecf0b73603a8268050e890eb4d037b5bdf4184f439cc18d593e83b100a19e7" + sha256: "4220081caf1cea231e127a8fd2801b4b55464a51f840b56bb079ce2b3792e9e6" url: "https://pub.dev" source: hosted - version: "0.0.9" + version: "0.1.1" dart_style: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 52aed72d..ab95f643 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -91,7 +91,7 @@ dependencies: git: url: https://github.com/kodjodevf/epubx.dart.git ref: dev - d4rt: 0.0.9 + d4rt: 0.1.1 hive: ^2.2.3 hive_flutter: ^1.1.0 flutter_discord_rpc_fork: From a3ec5c90392b0d5f8c88192d6f9798cee3b773cd Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 5 Aug 2025 15:51:52 +0100 Subject: [PATCH 035/100] v0.6.35 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index ab95f643..7d027d8f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: mangayomi description: Free and open source manga reader and anime streaming cross-plateform app inspired by Tachiyomi and Aniyomi. publish_to: "none" -version: 0.6.3+85 +version: 0.6.35+86 environment: sdk: ^3.8.1 From 0026d1ad6156c18f1f492d087af16f8313cf8545 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 5 Aug 2025 15:07:10 +0000 Subject: [PATCH 036/100] source update: v0.6.35 --- repo/source.json | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/repo/source.json b/repo/source.json index f139de7c..85485798 100755 --- a/repo/source.json +++ b/repo/source.json @@ -14,25 +14,32 @@ "bundleIdentifier": "com.kodjodevf.mangayomi", "developerName": "Moustapha Kodjo Amadou", "subtitle": "Read manga, novels, and watch anime", - "version": "0.6.3", - "versionDate": "2025-07-09T14:01:54Z", + "version": "0.6.35", + "versionDate": "2025-08-05T14:52:24Z", "versionDescription": "", - "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.3/Mangayomi-v0.6.3-ios.ipa", + "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", "localizedDescription": "Mangayomi is an open-source Flutter app for reading manga, novels, and watching anime across multiple platforms.", "iconURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/icons/icon_default.webp", "tintColor": "EF4444", "category": "entertainment", - "size": 58376897, + "size": 59596142, "screenshotURLs": [ "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_0_default.webp", "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_1_default.webp", "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/screenshots/image_2_default.webp" ], "versions": [ + { + "version": "0.6.35", + "date": "2025-08-05T14:52:24Z", + "localizedDescription": "", + "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.35/Mangayomi-v0.6.35-ios.ipa", + "size": 59596142 + }, { "version": "0.6.3", "date": "2025-07-09T14:01:54Z", - "localizedDescription": "", + "localizedDescription": "What's Changed\r\n* added option to change hwdec by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/483\r\n* Fixes, Refactors, and Async Improvements by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/484\r\n* Fix Async Transaction Bug and Category Management Issues by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/489\r\n* Create PKGBUILD for Arch linux by @saberr26 in https://github.com/kodjodevf/mangayomi/pull/485\r\n* added two\u2022way\u2022tracking by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/490\r\n* Refactor: Consolidate _openCategory() Methods into Unified Dialog by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/491\r\n* Release file lock by closing InputStream by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/493\r\n* increased protobuf limit to 250 MB by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/494\r\n* Make buttons white for consistency in light mode by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/496\r\n* improved two\u2022way track screen by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/497\r\n* Don't allow zooming by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/502\r\n* adjusted tracker library + bug fixes by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/501\r\n* iOS CBZ import fix by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/503\r\n* \ud83c\udfac Improve Fullscreen Stability & Simplify AniSkip Logic by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/499\r\n* added option to disable merged library navigation by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/504\r\n* reworked sync server by @Schnitzel5 in https://github.com/kodjodevf/mangayomi/pull/506\r\n* Fix \"Read\" and \"Unread\" button [based on PR 506] by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/507\r\n* Fix labels on navigation bar [based on PR 506] by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/508\r\n* Refactor code by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/509\r\n* Fix menu colors on theme change by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/511\r\n* Fix delete \"Downloaded episodes/chapters\" by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/512\r\n* Add tracker button to localArchive by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/513\r\n* Changed the \"Page preload amount\" Setting to be a Slider by @NBA2K1 in https://github.com/kodjodevf/mangayomi/pull/510\r\n\r\nNew Contributors\r\n* @saberr26 made their first contribution in https://github.com/kodjodevf/mangayomi/pull/485\r\n\r\n**Full Changelog**: https://github.com/kodjodevf/mangayomi/compare/v0.6.25...v0.6.3", "downloadURL": "https://github.com/kodjodevf/mangayomi/releases/download/v0.6.3/Mangayomi-v0.6.3-ios.ipa", "size": 58376897 }, @@ -171,6 +178,17 @@ "imageURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/news/update_default.webp", "notify": true, "url": "https://github.com/kodjodevf/mangayomi/releases/tag/v0.6.3" + }, + { + "appID": "com.kodjodevf.mangayomi", + "title": "0.6.35 - 05 Aug", + "identifier": "release-0.6.35", + "caption": "Update for Mangayomi now available!", + "date": "2025-08-05T14:52:24Z", + "tintColor": "EF4444", + "imageURL": "https://raw.githubusercontent.com/kodjodevf/mangayomi/refs/heads/main/repo/images/news/update_default.webp", + "notify": true, + "url": "https://github.com/kodjodevf/mangayomi/releases/tag/v0.6.35" } ] } \ No newline at end of file From 6db2f601ecfc9c51475258dfa226bdc5de51ea4e Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:41:56 +0200 Subject: [PATCH 037/100] Show correct version number on Windows --- pubspec.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 7d027d8f..6c803a56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -156,5 +156,3 @@ inno_bundle: - french - german admin: false - version: 0.6.3 - From 608fc525fb4649ac7260a0dbcbbce6b1e380fbab Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 6 Aug 2025 00:03:05 +0200 Subject: [PATCH 038/100] Discord RPC now shows correct position / duration --- lib/modules/anime/anime_player_view.dart | 14 +++++----- lib/utils/discord_rpc.dart | 34 ++++++------------------ 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 00556eb6..bc5b74bc 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -314,10 +314,7 @@ class _AnimeStreamPageState extends riv.ConsumerState .duration .listen((duration) { _currentTotalDuration.value = duration; - discordRpc?.startChapterTimestamp( - _currentPosition.value.inMilliseconds, - duration.inMilliseconds, - ); + discordRpc?.updateChapterTimestamp(_currentPosition.value, duration); }); bool get hasNextEpisode => _streamController.getEpisodeIndex().$1 != 0; @@ -785,8 +782,13 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo void _updateRpcTimestamp() { final now = DateTime.now().millisecondsSinceEpoch; - if (lastRpcTimestampUpdate + 10000 < now) { - discordRpc?.updateChapterTimestamp(_currentPosition.value.inMilliseconds); + if (lastRpcTimestampUpdate + 5000 < now) { + if (_currentTotalDuration.value != null) { + discordRpc?.updateChapterTimestamp( + _currentPosition.value, + _currentTotalDuration.value!, + ); + } lastRpcTimestampUpdate = now; } } diff --git a/lib/utils/discord_rpc.dart b/lib/utils/discord_rpc.dart index 5bb6cea6..05ee877f 100644 --- a/lib/utils/discord_rpc.dart +++ b/lib/utils/discord_rpc.dart @@ -18,12 +18,6 @@ class DiscordRPC { /// Start timestamp in millis final int startAt = DateTime.timestamp().millisecondsSinceEpoch; - /// Start timestamp in millis for the current chapter/episode - int chapterStartAt = 0; - - /// End timestamp in millis for the current chapter/episode - int chapterEndAt = 0; - /// Temp var late bool rpcShowReadingWatchingProgress; @@ -132,32 +126,20 @@ class DiscordRPC { await updateActivity(timestamps: RPCTimestamps(start: startAt)); } - Future startChapterTimestamp( - int offsetInMillis, - int durationInMillis, + Future updateChapterTimestamp( + Duration position, + Duration duration, ) async { if (!rpcShowReadingWatchingProgress) { return; } - chapterStartAt = DateTime.timestamp().millisecondsSinceEpoch; - chapterEndAt = - DateTime.timestamp().millisecondsSinceEpoch + durationInMillis; await updateActivity( timestamps: RPCTimestamps( - start: chapterStartAt, - end: chapterEndAt - offsetInMillis, - ), - ); - } - - Future updateChapterTimestamp(int newOffsetInMillis) async { - if (!rpcShowReadingWatchingProgress) { - return; - } - await updateActivity( - timestamps: RPCTimestamps( - start: chapterStartAt, - end: chapterEndAt - newOffsetInMillis, + start: DateTime.timestamp().subtract(position).millisecondsSinceEpoch, + end: DateTime.timestamp() + .subtract(position) + .add(duration) + .millisecondsSinceEpoch, ), ); } From 1db55b8018246d2871b0db60c45fa0afcc86666a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 6 Aug 2025 03:05:41 +0200 Subject: [PATCH 039/100] fixed android screen - adjusted show_text - fixed exception for android update screen --- assets/mangayomi_mpv.zip | Bin 1194808 -> 1194833 bytes lib/eval/model/m_bridge.dart | 15 +++++++++------ lib/modules/anime/anime_player_view.dart | 11 ++++++++++- .../about/providers/download_file_screen.dart | 8 ++++---- pubspec.lock | 16 ++++++++-------- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/assets/mangayomi_mpv.zip b/assets/mangayomi_mpv.zip index 60622c5418d97c4586eda7a6ec402dc094dfdded..e163cdd7a1719e6678db80fe10939fb966e58353 100644 GIT binary patch delta 7349 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 ai)4#dby(q@GXNODe^a6WuoqSUfd2zt2;FZ0 delta 7340 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 TrwItsLw?^QX9|6B82Rr%;7^Er diff --git a/lib/eval/model/m_bridge.dart b/lib/eval/model/m_bridge.dart index 1338f2e8..c942940a 100644 --- a/lib/eval/model/m_bridge.dart +++ b/lib/eval/model/m_bridge.dart @@ -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( diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index bc5b74bc..76cf0196 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -373,7 +373,16 @@ class _AnimeStreamPageState extends riv.ConsumerState if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); if (text.isEmpty) break; - botToast(text); + botToast( + text, + alignY: -0.99, + second: 2, + dismissDirections: const [ + DismissDirection.vertical, + DismissDirection.horizontal, + ], + showIcon: false, + ); nativePlayer.setProperty("user-data/aniyomi/show_text", ""); } break; diff --git a/lib/modules/more/about/providers/download_file_screen.dart b/lib/modules/more/about/providers/download_file_screen.dart index 23b90b0c..7bd504bc 100644 --- a/lib/modules/more/about/providers/download_file_screen.dart +++ b/lib/modules/more/about/providers/download_file_screen.dart @@ -25,9 +25,9 @@ class DownloadFileScreen extends ConsumerStatefulWidget { class _DownloadFileScreenState extends ConsumerState { int _total = 0; int _received = 0; - late http.StreamedResponse _response; + http.StreamedResponse? _response; final List _bytes = []; - late StreamSubscription>? _subscription; + StreamSubscription>? _subscription; @override void dispose() { @@ -131,8 +131,8 @@ class _DownloadFileScreenState extends ConsumerState { return; } _response = await http.Client().send(http.Request('GET', Uri.parse(url))); - _total = _response.contentLength ?? 0; - _subscription = _response.stream.listen((value) { + _total = _response?.contentLength ?? 0; + _subscription = _response?.stream.listen((value) { setState(() { _bytes.addAll(value); _received += value.length; diff --git a/pubspec.lock b/pubspec.lock index 43b33ffc..25ae6ced 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" + resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From 6e9b882b837fd759b52e41bd2ba2a745bd54a1c8 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 6 Aug 2025 04:01:00 +0200 Subject: [PATCH 040/100] added custom buttons to backup --- lib/modules/anime/anime_player_view.dart | 2 +- lib/modules/more/data_and_storage/create_backup.dart | 1 + .../more/data_and_storage/providers/auto_backup.dart | 2 +- .../more/data_and_storage/providers/auto_backup.g.dart | 2 +- .../more/data_and_storage/providers/backup.dart | 10 ++++++++++ .../more/data_and_storage/providers/backup.g.dart | 2 +- .../more/data_and_storage/providers/restore.dart | 8 ++++++++ .../more/data_and_storage/providers/restore.g.dart | 2 +- lib/services/trackers/myanimelist.g.dart | 2 +- 9 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 76cf0196..001ae0d5 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -211,7 +211,7 @@ class _AnimeStreamPageState extends riv.ConsumerState if (debandingType == DebandingType.cpu) "vf": "gradfun=radius=12", if (debandingType == DebandingType.gpu) "deband": "yes", if (useYUV420P) "vf": "format=yuv420p", - "alang": audioPreferredLang, + if (audioPreferredLang.isNotEmpty) "alang": audioPreferredLang, if (enableAudioPitchCorrection) "audio-pitch-correction": "yes", "volume-max": "${volumeBoostCap + 100}", if (audioChannel != AudioChannel.reverseStereo) diff --git a/lib/modules/more/data_and_storage/create_backup.dart b/lib/modules/more/data_and_storage/create_backup.dart index a8fe6178..32582fb4 100644 --- a/lib/modules/more/data_and_storage/create_backup.dart +++ b/lib/modules/more/data_and_storage/create_backup.dart @@ -222,6 +222,7 @@ List<(String, int)> _getSettingsList(BuildContext context) { final l10n = context.l10n; return [ (l10n.app_settings, 6), + (l10n.custom_buttons, 10), (l10n.sources_settings, 7), (l10n.include_sensitive_settings, 8), ]; diff --git a/lib/modules/more/data_and_storage/providers/auto_backup.dart b/lib/modules/more/data_and_storage/providers/auto_backup.dart index 5bd93ea3..413e8bab 100644 --- a/lib/modules/more/data_and_storage/providers/auto_backup.dart +++ b/lib/modules/more/data_and_storage/providers/auto_backup.dart @@ -26,7 +26,7 @@ class BackupFrequencyOptionsState extends _$BackupFrequencyOptionsState { @override List build() { return isar.settings.getSync(227)!.backupListOptions ?? - [0, 1, 2, 3, 4, 5, 6, 7]; + [0, 1, 2, 3, 4, 5, 6, 7, 10]; } void set(List values) { diff --git a/lib/modules/more/data_and_storage/providers/auto_backup.g.dart b/lib/modules/more/data_and_storage/providers/auto_backup.g.dart index 2e4fe90a..3bfe8569 100644 --- a/lib/modules/more/data_and_storage/providers/auto_backup.g.dart +++ b/lib/modules/more/data_and_storage/providers/auto_backup.g.dart @@ -41,7 +41,7 @@ final backupFrequencyStateProvider = typedef _$BackupFrequencyState = AutoDisposeNotifier; String _$backupFrequencyOptionsStateHash() => - r'477541f3b59fe662ea3471400ff62066ea7e2196'; + r'9aa31bef65e0e2f20b306ed17ff058df2f24a635'; /// See also [BackupFrequencyOptionsState]. @ProviderFor(BackupFrequencyOptionsState) diff --git a/lib/modules/more/data_and_storage/providers/backup.dart b/lib/modules/more/data_and_storage/providers/backup.dart index 4d8eff07..296b474d 100644 --- a/lib/modules/more/data_and_storage/providers/backup.dart +++ b/lib/modules/more/data_and_storage/providers/backup.dart @@ -8,6 +8,7 @@ import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; @@ -131,6 +132,15 @@ Future doBackUp( .toList(); datas.addAll({"extensions": res}); } + if (list.contains(10)) { + final res = isar.customButtons + .filter() + .idIsNotNull() + .findAllSync() + .map((e) => e.toJson()) + .toList(); + datas.addAll({"customButtons": res}); + } final regExp = RegExp(r'[^a-zA-Z0-9 .()\-\s]'); final name = 'mangayomi_${DateTime.now().toString().replaceAll(regExp, '_').replaceAll(' ', '_')}'; diff --git a/lib/modules/more/data_and_storage/providers/backup.g.dart b/lib/modules/more/data_and_storage/providers/backup.g.dart index 1e5352d5..a1ba26b7 100644 --- a/lib/modules/more/data_and_storage/providers/backup.g.dart +++ b/lib/modules/more/data_and_storage/providers/backup.g.dart @@ -6,7 +6,7 @@ part of 'backup.dart'; // RiverpodGenerator // ************************************************************************** -String _$doBackUpHash() => r'ad907e7ff4cd9f05bb3fa2da0fd1a1f1d2c23258'; +String _$doBackUpHash() => r'a570fe00421ee352ea170440ce27b258cf9ddc15'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/data_and_storage/providers/restore.dart b/lib/modules/more/data_and_storage/providers/restore.dart index e193279f..0559761c 100644 --- a/lib/modules/more/data_and_storage/providers/restore.dart +++ b/lib/modules/more/data_and_storage/providers/restore.dart @@ -9,6 +9,7 @@ import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/history.dart'; @@ -155,6 +156,9 @@ void restoreBackup(Ref ref, Map backup, {bool full = true}) { final updates = (backup["updates"] as List?) ?.map((e) => Update.fromJson(e)) .toList(); + final customButtons = (backup["customButtons"] as List?) + ?.map((e) => CustomButton.fromJson(e)) + .toList(); isar.writeTxnSync(() { isar.mangas.clearSync(); @@ -245,6 +249,10 @@ void restoreBackup(Ref ref, Map backup, {bool full = true}) { if (settings != null) { isar.settings.putAllSync(settings); } + isar.customButtons.clearSync(); + if (customButtons != null) { + isar.customButtons.putAllSync(customButtons); + } _invalidateCommonState(ref); ref.read(routerCurrentLocationStateProvider.notifier).refresh(); } diff --git a/lib/modules/more/data_and_storage/providers/restore.g.dart b/lib/modules/more/data_and_storage/providers/restore.g.dart index 8917a896..aed202b8 100644 --- a/lib/modules/more/data_and_storage/providers/restore.g.dart +++ b/lib/modules/more/data_and_storage/providers/restore.g.dart @@ -173,7 +173,7 @@ class _DoRestoreProviderElement extends AutoDisposeProviderElement BuildContext get context => (origin as DoRestoreProvider).context; } -String _$restoreBackupHash() => r'2f440cfc5359e15bfd3887d27b38ecaf881404c6'; +String _$restoreBackupHash() => r'0dc4d911f0b84fd7fa30acf690799b196db4de6e'; /// See also [restoreBackup]. @ProviderFor(restoreBackup) diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index 7283560e..a3d8b6ee 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'a612e9ce814268ac79dc86d810ca6bd3671812e6'; +String _$myAnimeListHash() => r'4391ad9446d14b1fb1ffdfbc5323ef04db5140f7'; /// Copied from Dart SDK class _SystemHash { From 715f077c135476458366114c4c9acea530d4b1c2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 6 Aug 2025 16:44:12 +0200 Subject: [PATCH 041/100] added calendar --- lib/l10n/app_en.arb | 7 +- lib/l10n/generated/app_localizations.dart | 30 ++ lib/l10n/generated/app_localizations_ar.dart | 20 + lib/l10n/generated/app_localizations_as.dart | 20 + lib/l10n/generated/app_localizations_de.dart | 20 + lib/l10n/generated/app_localizations_en.dart | 20 + lib/l10n/generated/app_localizations_es.dart | 20 + lib/l10n/generated/app_localizations_fr.dart | 20 + lib/l10n/generated/app_localizations_hi.dart | 20 + lib/l10n/generated/app_localizations_id.dart | 20 + lib/l10n/generated/app_localizations_it.dart | 20 + lib/l10n/generated/app_localizations_pt.dart | 20 + lib/l10n/generated/app_localizations_ru.dart | 20 + lib/l10n/generated/app_localizations_th.dart | 20 + lib/l10n/generated/app_localizations_tr.dart | 20 + lib/l10n/generated/app_localizations_zh.dart | 20 + lib/modules/anime/anime_player_view.dart | 23 +- lib/modules/calendar/calendar_screen.dart | 372 ++++++++++++++++++ .../calendar/providers/calendar_provider.dart | 21 + .../providers/calendar_provider.g.dart | 28 ++ .../update_manga_detail_providers.dart | 9 +- lib/modules/more/more_screen.dart | 7 + lib/router/router.dart | 2 + lib/utils/date.dart | 11 +- pubspec.lock | 32 +- pubspec.yaml | 1 + 26 files changed, 798 insertions(+), 25 deletions(-) create mode 100644 lib/modules/calendar/calendar_screen.dart create mode 100644 lib/modules/calendar/providers/calendar_provider.dart create mode 100644 lib/modules/calendar/providers/calendar_provider.g.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 608c6ecb..d33bd959 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -510,5 +510,10 @@ "internal_player_info": "Progress, controls, orientation", "subtitle_delay_text": "Subtitle delay", "subtitle_delay": "Delay (ms)", - "subtitle_speed": "Speed" + "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" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 091e4663..4be6d473 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -3140,6 +3140,36 @@ abstract class AppLocalizations { /// 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); } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 28cf08ff..ce8dd9c9 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1617,4 +1617,24 @@ class AppLocalizationsAr extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index e0c904dd..968a7bfc 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1619,4 +1619,24 @@ class AppLocalizationsAs extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 2c8dfc56..5f46605b 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1630,4 +1630,24 @@ class AppLocalizationsDe extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 2ef018d2..8b42c4e1 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1618,4 +1618,24 @@ class AppLocalizationsEn extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 156754f0..49ad52bd 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1635,6 +1635,26 @@ class AppLocalizationsEs extends AppLocalizations { @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'; + } } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 88366e2e..2ca3850f 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1636,4 +1636,24 @@ class AppLocalizationsFr extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 2e2581c2..6654ea5f 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1620,4 +1620,24 @@ class AppLocalizationsHi extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 18338650..8524558d 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1624,4 +1624,24 @@ class AppLocalizationsId extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index b239a60f..b4f61c92 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1633,4 +1633,24 @@ class AppLocalizationsIt extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 87a26002..def5d804 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1632,6 +1632,26 @@ class AppLocalizationsPt extends AppLocalizations { @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'; + } } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 6799f0cc..085e1ea2 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1634,4 +1634,24 @@ class AppLocalizationsRu extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index a6955602..10ef1dff 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1618,4 +1618,24 @@ class AppLocalizationsTh extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 73e41501..fdcbc088 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1624,4 +1624,24 @@ class AppLocalizationsTr extends AppLocalizations { @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'; + } } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index ea3f7d41..acdb4338 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1589,4 +1589,24 @@ class AppLocalizationsZh extends AppLocalizations { @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'; + } } diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 001ae0d5..86d26e15 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -252,17 +252,7 @@ class _AnimeStreamPageState extends riv.ConsumerState ), ); late final hwdecMode = ref.read(hwdecModeStateProvider()); - late final VideoController _controller = VideoController( - _player, - configuration: VideoControllerConfiguration( - hwdec: hwdecMode, - vo: Platform.isAndroid - ? useGpuNext - ? "gpu-next" - : "gpu" - : "libmpv", - ), - ); + late final VideoController _controller; late final _streamController = ref.read( animeStreamControllerProvider(episode: widget.episode).notifier, ); @@ -846,6 +836,17 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo @override void initState() { super.initState(); + _controller = VideoController( + _player, + configuration: VideoControllerConfiguration( + hwdec: hwdecMode, + vo: Platform.isAndroid + ? useGpuNext + ? "gpu-next" + : "gpu" + : "libmpv", + ), + ); // If player is being launched the first time, // use global "Use Fullscreen" setting. // Else (if user already watches an episode and just changes it), diff --git a/lib/modules/calendar/calendar_screen.dart b/lib/modules/calendar/calendar_screen.dart new file mode 100644 index 00000000..839a8da1 --- /dev/null +++ b/lib/modules/calendar/calendar_screen.dart @@ -0,0 +1,372 @@ +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: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 { + const CalendarScreen({super.key}); + + @override + ConsumerState createState() => _CalendarScreenState(); +} + +class _CalendarScreenState extends ConsumerState { + late final ValueNotifier> _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; + + @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); + return Scaffold( + appBar: AppBar(title: Text(l10n.calendar)), + body: data.when( + data: (data) { + if (data.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text(l10n.calendar_no_data, textAlign: TextAlign.center), + ), + ); + } + if (_selectedDay != null) { + _selectedEntries.value = _getEntriesForDay(_selectedDay!, data); + } + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + 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), + Text( + l10n.calendar_info, + softWrap: true, + style: TextStyle( + fontSize: 13, + color: context.secondaryColor, + ), + ), + ], + ), + ), + ), + 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: const CalendarStyle(outsideDaysVisible: false), + 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: 8.0), + Expanded( + child: ValueListenableBuilder>( + valueListenable: _selectedEntries, + builder: (context, value, _) { + return CustomScrollView( + slivers: [ + CustomSliverGroupedListView( + 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, + ), + ], + ); + }, + ), + ), + ], + ), + ); + }, + 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 _getEntriesForDay(DateTime day, List data) { + return data.where((e) { + final temp = DateTime.now().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 _getEntriesForRange( + DateTime start, + DateTime end, + List data, + ) { + final days = _daysInRange(start, end); + + return [for (final d in days) ..._getEntriesForDay(d, data)]; + } + + void _onDaySelected( + DateTime selectedDay, + DateTime focusedDay, + List 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 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 _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!, + ), + ), + ), + 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, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/modules/calendar/providers/calendar_provider.dart b/lib/modules/calendar/providers/calendar_provider.dart new file mode 100644 index 00000000..e92ba150 --- /dev/null +++ b/lib/modules/calendar/providers/calendar_provider.dart @@ -0,0 +1,21 @@ +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> getCalendarStream(Ref ref) async* { + yield* isar.mangas + .filter() + .idIsNotNull() + .anyOf([ + Status.ongoing, + Status.unknown, + Status.publishingFinished, + ], (q, status) => q.statusEqualTo(status)) + .smartUpdateDaysIsNotNull() + .smartUpdateDaysGreaterThan(0) + .watch(fireImmediately: true); +} diff --git a/lib/modules/calendar/providers/calendar_provider.g.dart b/lib/modules/calendar/providers/calendar_provider.g.dart new file mode 100644 index 00000000..9f048587 --- /dev/null +++ b/lib/modules/calendar/providers/calendar_provider.g.dart @@ -0,0 +1,28 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'calendar_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$getCalendarStreamHash() => r'9095ecdef36259f84eb6562a2ca9e253f50d4b8d'; + +/// See also [getCalendarStream]. +@ProviderFor(getCalendarStream) +final getCalendarStreamProvider = + AutoDisposeStreamProvider>.internal( + getCalendarStream, + name: r'getCalendarStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getCalendarStreamHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef GetCalendarStreamRef = AutoDisposeStreamProviderRef>; +// 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 diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index f798b539..de13c8f3 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_manga.dart'; import 'package:mangayomi/main.dart'; @@ -147,9 +149,10 @@ Future updateMangaDetail( isar.mangas.putSync( manga ..id = mangaId - ..smartUpdateDays = median != 0 - ? median - : daysBetweenUploads.arithmeticMean(), + ..smartUpdateDays = max( + median, + daysBetweenUploads.arithmeticMean(), + ), ); } }); diff --git a/lib/modules/more/more_screen.dart b/lib/modules/more/more_screen.dart index 34227e00..f6444d21 100644 --- a/lib/modules/more/more_screen.dart +++ b/lib/modules/more/more_screen.dart @@ -60,6 +60,13 @@ class MoreScreen extends StatelessWidget { icon: Icons.query_stats_outlined, title: l10n.statistics, ), + ListTileWidget( + onTap: () { + context.push('/calendarScreen'); + }, + icon: Icons.calendar_month_outlined, + title: l10n.calendar, + ), ListTileWidget( onTap: () { context.push('/dataAndStorage'); diff --git a/lib/router/router.dart b/lib/router/router.dart index 43b91888..d3270354 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -11,6 +11,7 @@ import 'package:mangayomi/modules/browse/extension/edit_code.dart'; import 'package:mangayomi/modules/browse/extension/extension_detail.dart'; import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart'; import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart'; +import 'package:mangayomi/modules/calendar/calendar_screen.dart'; import 'package:mangayomi/modules/manga/detail/widgets/migrate_screen.dart'; import 'package:mangayomi/modules/more/data_and_storage/create_backup.dart'; import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; @@ -233,6 +234,7 @@ class RouterNotifier extends ChangeNotifier { name: "playerAdvancedScreen", child: const PlayerAdvancedScreen(), ), + _genericRoute(name: "calendarScreen", child: const CalendarScreen()), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga), diff --git a/lib/utils/date.dart b/lib/utils/date.dart index 25b3b1e9..f394f295 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -13,6 +13,7 @@ String dateFormat( bool useRelativeTimesTamps = true, String dateFormat = "", bool showHOURorMINUTE = false, + bool showInDaysFuture = false, }) { final l10n = l10nLocalizations(context)!; final locale = currentLocale(context); @@ -70,8 +71,14 @@ String dateFormat( date.isAfter(aWeekAgo)) { final difference = today.difference(date).inDays; return switch (difference) { - 1 => l10n.n_day_ago(difference), - != 7 => l10n.n_days_ago(difference), + 1 => + showInDaysFuture + ? l10n.in_n_day(difference.abs()) + : l10n.n_day_ago(difference), + != 7 => + showInDaysFuture + ? l10n.in_n_days(difference.abs()) + : l10n.n_days_ago(difference), _ => l10n.a_week_ago, }; } diff --git a/pubspec.lock b/pubspec.lock index 6acfc2d7..0633c510 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "58c7aaf631e9cfeaed622074b19f81464fb51bec" + resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" @@ -1743,6 +1743,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + simple_gesture_detector: + dependency: transitive + description: + name: simple_gesture_detector + sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 + url: "https://pub.dev" + source: hosted + version: "0.2.1" sky_engine: dependency: transitive description: flutter @@ -1876,6 +1884,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.3.1" + table_calendar: + dependency: "direct main" + description: + name: table_calendar + sha256: "0c0c6219878b363a2d5f40c7afb159d845f253d061dc3c822aa0d5fe0f721982" + url: "https://pub.dev" + source: hosted + version: "3.2.0" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0d0b5a6b..0166b6d9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,6 +103,7 @@ dependencies: git: url: https://github.com/Schnitzel5/flutter-discord-rpc.git ref: main + table_calendar: ^3.2.0 dependency_overrides: ffi: ^2.1.3 From e565d14ef3558ab1bd03e0e20157351af1fbe724 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 6 Aug 2025 17:48:32 +0200 Subject: [PATCH 042/100] improved calendar --- lib/modules/calendar/calendar_screen.dart | 256 ++++++++++-------- .../calendar/providers/calendar_provider.dart | 6 +- .../providers/calendar_provider.g.dart | 157 ++++++++++- .../manga/detail/manga_detail_view.dart | 3 +- .../update_manga_detail_providers.g.dart | 2 +- lib/router/router.dart | 5 +- lib/utils/date.dart | 6 +- 7 files changed, 309 insertions(+), 126 deletions(-) diff --git a/lib/modules/calendar/calendar_screen.dart b/lib/modules/calendar/calendar_screen.dart index 839a8da1..97906d3b 100644 --- a/lib/modules/calendar/calendar_screen.dart +++ b/lib/modules/calendar/calendar_screen.dart @@ -16,7 +16,8 @@ import 'package:mangayomi/utils/headers.dart'; import 'package:table_calendar/table_calendar.dart'; class CalendarScreen extends ConsumerStatefulWidget { - const CalendarScreen({super.key}); + final ItemType? itemType; + const CalendarScreen({super.key, this.itemType}); @override ConsumerState createState() => _CalendarScreenState(); @@ -32,6 +33,7 @@ class _CalendarScreenState extends ConsumerState { DateTime? _selectedDay; DateTime? _rangeStart; DateTime? _rangeEnd; + late ItemType? itemType = widget.itemType ?? ItemType.manga; @override void initState() { @@ -50,129 +52,169 @@ class _CalendarScreenState extends ConsumerState { Widget build(BuildContext context) { final l10n = context.l10n; final locale = ref.watch(l10nLocaleStateProvider); - final data = ref.watch(getCalendarStreamProvider); + final data = ref.watch(getCalendarStreamProvider(itemType: itemType)); return Scaffold( appBar: AppBar(title: Text(l10n.calendar)), body: data.when( data: (data) { - if (data.isEmpty) { - return Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text(l10n.calendar_no_data, textAlign: TextAlign.center), - ), - ); - } if (_selectedDay != null) { _selectedEntries.value = _getEntriesForDay(_selectedDay!, data); } return Padding( padding: const EdgeInsets.symmetric(horizontal: 15), - 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), - Text( - l10n.calendar_info, - softWrap: true, - style: TextStyle( - fontSize: 13, - color: context.secondaryColor, + 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), + Text( + l10n.calendar_info, + softWrap: true, + style: TextStyle( + fontSize: 13, + color: context.secondaryColor, + ), + ), + ], ), ), - ], - ), - ), - ), - 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: const CalendarStyle(outsideDaysVisible: false), - 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: 8.0), - Expanded( - child: ValueListenableBuilder>( - valueListenable: _selectedEntries, - builder: (context, value, _) { - return CustomScrollView( - slivers: [ - CustomSliverGroupedListView( - 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)}", + ), + 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!]; + }); + } + }, ), ), - itemBuilder: (context, element) { - return CalendarListTileWidget( - manga: element, - selectedDay: _selectedDay, - ); - }, - order: GroupedListOrder.ASC, - ), - ], - ); - }, + ], + ), + ), + 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>( + valueListenable: _selectedEntries, + builder: (context, value, _) { + return CustomSliverGroupedListView( + 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)), ], ), ); diff --git a/lib/modules/calendar/providers/calendar_provider.dart b/lib/modules/calendar/providers/calendar_provider.dart index e92ba150..b167a167 100644 --- a/lib/modules/calendar/providers/calendar_provider.dart +++ b/lib/modules/calendar/providers/calendar_provider.dart @@ -6,10 +6,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'calendar_provider.g.dart'; @riverpod -Stream> getCalendarStream(Ref ref) async* { +Stream> getCalendarStream( + Ref ref, { + ItemType? itemType, +}) async* { yield* isar.mangas .filter() .idIsNotNull() + .itemTypeEqualTo(itemType ?? ItemType.manga) .anyOf([ Status.ongoing, Status.unknown, diff --git a/lib/modules/calendar/providers/calendar_provider.g.dart b/lib/modules/calendar/providers/calendar_provider.g.dart index 9f048587..520fa4d7 100644 --- a/lib/modules/calendar/providers/calendar_provider.g.dart +++ b/lib/modules/calendar/providers/calendar_provider.g.dart @@ -6,23 +6,156 @@ part of 'calendar_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$getCalendarStreamHash() => r'9095ecdef36259f84eb6562a2ca9e253f50d4b8d'; +String _$getCalendarStreamHash() => r'dcdad165b2da2420bafa8b70c4b3a0fb336e5021'; + +/// 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) -final getCalendarStreamProvider = - AutoDisposeStreamProvider>.internal( - getCalendarStream, - name: r'getCalendarStreamProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$getCalendarStreamHash, - dependencies: null, - allTransitiveDependencies: null, -); +const getCalendarStreamProvider = GetCalendarStreamFamily(); + +/// See also [getCalendarStream]. +class GetCalendarStreamFamily extends Family>> { + /// 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? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'getCalendarStreamProvider'; +} + +/// See also [getCalendarStream]. +class GetCalendarStreamProvider extends AutoDisposeStreamProvider> { + /// 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> 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> 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 -typedef GetCalendarStreamRef = AutoDisposeStreamProviderRef>; +mixin GetCalendarStreamRef on AutoDisposeStreamProviderRef> { + /// The parameter `itemType` of this provider. + ItemType? get itemType; +} + +class _GetCalendarStreamProviderElement + extends AutoDisposeStreamProviderElement> + 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 diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index c97d3f8e..addb9e34 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1891,7 +1891,8 @@ class _MangaDetailViewState extends ConsumerState backgroundColor: Theme.of(context).scaffoldBackgroundColor, elevation: 0, ), - onPressed: () {}, + onPressed: () => + context.push("/calendarScreen", extra: widget.manga!.itemType), child: Column( children: [ Icon( diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 27dd03b3..06c7e18a 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'33c6bd0f1de57e2e839ae695a0301893b9a94624'; +String _$updateMangaDetailHash() => r'85660b206c2bce558760118936758a261519cad8'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/router/router.dart b/lib/router/router.dart index d3270354..0700dadb 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -234,7 +234,10 @@ class RouterNotifier extends ChangeNotifier { name: "playerAdvancedScreen", child: const PlayerAdvancedScreen(), ), - _genericRoute(name: "calendarScreen", child: const CalendarScreen()), + _genericRoute( + name: "calendarScreen", + builder: (itemType) => CalendarScreen(itemType: itemType), + ), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga), diff --git a/lib/utils/date.dart b/lib/utils/date.dart index f394f295..99fa3aaa 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -69,15 +69,15 @@ String dateFormat( date.isAfter(fiveDaysAgo) || date.isAfter(sixDaysAgo) || date.isAfter(aWeekAgo)) { - final difference = today.difference(date).inDays; + final difference = today.difference(date).inDays.abs(); return switch (difference) { 1 => showInDaysFuture - ? l10n.in_n_day(difference.abs()) + ? l10n.in_n_day(difference) : l10n.n_day_ago(difference), != 7 => showInDaysFuture - ? l10n.in_n_days(difference.abs()) + ? l10n.in_n_days(difference) : l10n.n_days_ago(difference), _ => l10n.a_week_ago, }; From d0974a1da62da797bfa192d63f28207a99d6f576 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 7 Aug 2025 00:34:08 +0200 Subject: [PATCH 043/100] try fix --- lib/l10n/app_en.arb | 5 +- lib/l10n/generated/app_localizations.dart | 18 ++ lib/l10n/generated/app_localizations_ar.dart | 11 ++ lib/l10n/generated/app_localizations_as.dart | 11 ++ lib/l10n/generated/app_localizations_de.dart | 11 ++ lib/l10n/generated/app_localizations_en.dart | 11 ++ lib/l10n/generated/app_localizations_es.dart | 11 ++ lib/l10n/generated/app_localizations_fr.dart | 11 ++ lib/l10n/generated/app_localizations_hi.dart | 11 ++ lib/l10n/generated/app_localizations_id.dart | 11 ++ lib/l10n/generated/app_localizations_it.dart | 11 ++ lib/l10n/generated/app_localizations_pt.dart | 11 ++ lib/l10n/generated/app_localizations_ru.dart | 11 ++ lib/l10n/generated/app_localizations_th.dart | 11 ++ lib/l10n/generated/app_localizations_tr.dart | 11 ++ lib/l10n/generated/app_localizations_zh.dart | 11 ++ lib/modules/calendar/calendar_screen.dart | 19 ++- .../more/settings/browse/browse_screen.dart | 155 ++++++++++++++++++ pubspec.lock | 16 +- 19 files changed, 351 insertions(+), 16 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d33bd959..b3bf6d59 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -515,5 +515,8 @@ "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" + "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" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 4be6d473..4d222cd4 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -3170,6 +3170,24 @@ abstract class AppLocalizations { /// 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; } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index ce8dd9c9..b2994863 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1637,4 +1637,15 @@ class AppLocalizationsAr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 968a7bfc..54b4321a 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1639,4 +1639,15 @@ class AppLocalizationsAs extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 5f46605b..5a817e81 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1650,4 +1650,15 @@ class AppLocalizationsDe extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 8b42c4e1..356fdef5 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1638,4 +1638,15 @@ class AppLocalizationsEn extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 49ad52bd..f9b65529 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1655,6 +1655,17 @@ class AppLocalizationsEs extends AppLocalizations { 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'; } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 2ca3850f..494ad387 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1656,4 +1656,15 @@ class AppLocalizationsFr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 6654ea5f..30f66686 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1640,4 +1640,15 @@ class AppLocalizationsHi extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 8524558d..33978f7b 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1644,4 +1644,15 @@ class AppLocalizationsId extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index b4f61c92..be2242c5 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1653,4 +1653,15 @@ class AppLocalizationsIt extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index def5d804..039987f3 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1652,6 +1652,17 @@ class AppLocalizationsPt extends AppLocalizations { 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'; } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 085e1ea2..3119b131 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1654,4 +1654,15 @@ class AppLocalizationsRu extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 10ef1dff..8133d6d7 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1638,4 +1638,15 @@ class AppLocalizationsTh extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index fdcbc088..08e9c049 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1644,4 +1644,15 @@ class AppLocalizationsTr extends AppLocalizations { 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'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index acdb4338..d866c717 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1609,4 +1609,15 @@ class AppLocalizationsZh extends AppLocalizations { 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'; } diff --git a/lib/modules/calendar/calendar_screen.dart b/lib/modules/calendar/calendar_screen.dart index 97906d3b..7c38f15e 100644 --- a/lib/modules/calendar/calendar_screen.dart +++ b/lib/modules/calendar/calendar_screen.dart @@ -77,12 +77,15 @@ class _CalendarScreenState extends ConsumerState { color: context.secondaryColor, ), const SizedBox(width: 10), - Text( - l10n.calendar_info, - softWrap: true, - style: TextStyle( - fontSize: 13, - color: context.secondaryColor, + Flexible( + child: Text( + l10n.calendar_info, + softWrap: true, + overflow: TextOverflow.clip, + style: TextStyle( + fontSize: 13, + color: context.secondaryColor, + ), ), ), ], @@ -155,7 +158,9 @@ class _CalendarScreenState extends ConsumerState { startingDayOfWeek: StartingDayOfWeek.monday, calendarStyle: CalendarStyle( outsideDaysVisible: true, - weekendTextStyle: TextStyle(color: context.primaryColor), + weekendTextStyle: TextStyle( + color: context.primaryColor, + ), ), onDaySelected: (selectedDay, focusedDay) => _onDaySelected(selectedDay, focusedDay, data), diff --git a/lib/modules/more/settings/browse/browse_screen.dart b/lib/modules/more/settings/browse/browse_screen.dart index cc9104ea..466d5bca 100644 --- a/lib/modules/more/settings/browse/browse_screen.dart +++ b/lib/modules/more/settings/browse/browse_screen.dart @@ -10,6 +10,7 @@ import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/update.dart'; +import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -146,6 +147,17 @@ class BrowseSScreen extends ConsumerWidget { ), ), ), + ListTile( + onTap: () => _showClearLibraryDialog(context, ref), + title: Text(l10n.clear_library), + subtitle: Text( + l10n.clear_library_desc, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ), if (checkForExtensionUpdates) SwitchListTile( value: autoUpdateExtensions, @@ -332,3 +344,146 @@ void _showCleanNonLibraryDialog(BuildContext context, dynamic l10n) { }, ); } + +void _showClearLibraryDialog(BuildContext context, WidgetRef ref) { + final itemTypes = ItemType.values.map((e) => e.name).toList(); + bool isInputError = true; + final textController = TextEditingController(); + showDialog( + context: context, + builder: (context) { + return StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Column( + children: [ + Text(context.l10n.clear_library), + Text( + context.l10n.clear_library_input, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ], + ), + content: SizedBox( + width: context.width(0.8), + child: CustomTextFormField( + controller: textController, + context: context, + isMissing: isInputError, + val: (text) => setState(() { + isInputError = + text.trim().isEmpty || + text.split(",").any((e) => !itemTypes.contains(e)); + }), + missing: (_) {}, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + TextButton( + onPressed: isInputError + ? null + : () { + final mangasList = isar.mangas + .filter() + .anyOf( + textController.text + .split(",") + .map( + (e) => switch (e) { + "manga" => ItemType.manga, + "anime" => ItemType.anime, + "novel" => ItemType.novel, + _ => null, + }, + ), + (q, element) => element == null + ? q.idIsNull() + : q.itemTypeEqualTo(element), + ) + .findAllSync(); + final provider = ref.read( + synchingProvider(syncId: 1).notifier, + ); + isar.writeTxnSync(() { + for (var manga in mangasList) { + final histories = isar.historys + .filter() + .mangaIdEqualTo(manga.id) + .findAllSync(); + for (var history in histories) { + isar.historys.deleteSync(history.id!); + provider.addChangedPart( + ActionType.removeHistory, + history.id, + "{}", + false, + ); + } + + for (var chapter in manga.chapters) { + final updates = isar.updates + .filter() + .mangaIdEqualTo(chapter.mangaId) + .chapterNameEqualTo(chapter.name) + .findAllSync(); + for (var update in updates) { + isar.updates.deleteSync(update.id!); + provider.addChangedPart( + ActionType.removeUpdate, + update.id, + "{}", + false, + ); + } + isar.chapters.deleteSync(chapter.id!); + provider.addChangedPart( + ActionType.removeChapter, + chapter.id, + "{}", + false, + ); + } + isar.mangas.deleteSync(manga.id!); + provider.addChangedPart( + ActionType.removeItem, + manga.id, + "{}", + false, + ); + } + }); + botToast( + context.l10n.cleaned_database(mangasList.length), + ); + Navigator.pop(context); + }, + child: Text( + context.l10n.ok, + style: TextStyle( + color: isInputError + ? context.secondaryColor + : context.primaryColor, + ), + ), + ), + ], + ), + ], + ); + }, + ); + }, + ); +} diff --git a/pubspec.lock b/pubspec.lock index 0633c510..d7a06737 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: d0e86e0177c4da3786c72a396259be530e4a6354 + resolved-ref: "085be0ec40a95f351b2f3c11c0ff017d4e0a1498" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0" From bb1ba2f3bb738fb3cfb8bf5b873bf997c1c14a60 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 7 Aug 2025 00:51:39 +0200 Subject: [PATCH 044/100] fixed navigation disappearing after restore --- lib/modules/more/data_and_storage/providers/restore.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/more/data_and_storage/providers/restore.dart b/lib/modules/more/data_and_storage/providers/restore.dart index 0559761c..83061de0 100644 --- a/lib/modules/more/data_and_storage/providers/restore.dart +++ b/lib/modules/more/data_and_storage/providers/restore.dart @@ -254,7 +254,6 @@ void restoreBackup(Ref ref, Map backup, {bool full = true}) { isar.customButtons.putAllSync(customButtons); } _invalidateCommonState(ref); - ref.read(routerCurrentLocationStateProvider.notifier).refresh(); } }); } catch (e) { @@ -540,6 +539,7 @@ void _invalidateCommonState(Ref ref) { ref.invalidate(extensionsRepoStateProvider(ItemType.manga)); ref.invalidate(extensionsRepoStateProvider(ItemType.anime)); ref.invalidate(extensionsRepoStateProvider(ItemType.novel)); + ref.read(routerCurrentLocationStateProvider.notifier).refresh(); } Status _convertStatusFromTachiBk(int idx) { From 20c943e5fc21e158bdffd6bdcdba1226ea345c37 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 7 Aug 2025 21:37:46 +0200 Subject: [PATCH 045/100] testing iOS Picture-in-Picture implementation from [PR #206](https://github.com/media-kit/media-kit/pull/206) --- ios/Runner/Info.plist | 1 + lib/l10n/app_en.arb | 5 +- lib/l10n/generated/app_localizations.dart | 18 + lib/l10n/generated/app_localizations_ar.dart | 10 + lib/l10n/generated/app_localizations_as.dart | 10 + lib/l10n/generated/app_localizations_de.dart | 10 + lib/l10n/generated/app_localizations_en.dart | 10 + lib/l10n/generated/app_localizations_es.dart | 10 + lib/l10n/generated/app_localizations_fr.dart | 10 + lib/l10n/generated/app_localizations_hi.dart | 10 + lib/l10n/generated/app_localizations_id.dart | 10 + lib/l10n/generated/app_localizations_it.dart | 10 + lib/l10n/generated/app_localizations_pt.dart | 10 + lib/l10n/generated/app_localizations_ru.dart | 10 + lib/l10n/generated/app_localizations_th.dart | 10 + lib/l10n/generated/app_localizations_tr.dart | 10 + lib/l10n/generated/app_localizations_zh.dart | 10 + lib/models/settings.dart | 10 + lib/models/settings.g.dart | 748 +++++++++++------- lib/modules/anime/anime_player_view.dart | 63 +- .../data_and_storage/providers/restore.g.dart | 2 +- .../more/settings/player/player_screen.dart | 20 + .../providers/player_state_provider.dart | 40 + .../providers/player_state_provider.g.dart | 33 + lib/utils/date.dart | 2 +- pubspec.lock | 16 +- 26 files changed, 738 insertions(+), 360 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ed2cfaee..421b7dd5 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -36,6 +36,7 @@ UIBackgroundModes fetch + audio UILaunchStoryboardName LaunchScreen diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b3bf6d59..e7ad49df 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -145,6 +145,7 @@ "today": "Today", "yesterday": "Yesterday", "a_week_ago": "A week ago", + "next_week": "Next week", "add_to_library": "Add to library", "completed": "Completed", "ongoing": "Ongoing", @@ -518,5 +519,7 @@ "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" + "clear_library_input": "Type 'manga', 'anime' and/or 'novel' (separated by a comma) to remove all related entries", + "enable_pip": "Enable Picture-in-Picture (PiP)", + "enable_auto_pip": "Enter PiP automatically when moving out of app" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 4d222cd4..4065800b 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -945,6 +945,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: @@ -3188,6 +3194,18 @@ abstract class AppLocalizations { /// 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 @enable_pip. + /// + /// In en, this message translates to: + /// **'Enable Picture-in-Picture (PiP)'** + String get enable_pip; + + /// No description provided for @enable_auto_pip. + /// + /// In en, this message translates to: + /// **'Enter PiP automatically when moving out of app'** + String get enable_auto_pip; } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index b2994863..163fd4e9 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -441,6 +441,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get a_week_ago => 'منذ أسبوع'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => 'إضافة إلى المكتبة'; @@ -1648,4 +1651,11 @@ class AppLocalizationsAr extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 54b4321a..4b0fc6f9 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -443,6 +443,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get a_week_ago => 'এসপ্তাহৰ আগতে'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => 'পুথিভঁৰালত যোগ কৰক'; @@ -1650,4 +1653,11 @@ class AppLocalizationsAs extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 5a817e81..7fdc7448 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -445,6 +445,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'; @@ -1661,4 +1664,11 @@ class AppLocalizationsDe extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 356fdef5..7a476172 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -443,6 +443,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'; @@ -1649,4 +1652,11 @@ class AppLocalizationsEn extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index f9b65529..204d039e 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -447,6 +447,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'; @@ -1666,6 +1669,13 @@ class AppLocalizationsEs extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 494ad387..86f56d88 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -449,6 +449,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'; @@ -1667,4 +1670,11 @@ class AppLocalizationsFr extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index 30f66686..d48af4d1 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -443,6 +443,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get a_week_ago => 'एक सप्ताह पहले'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => 'पुस्तकालय में जोड़ें'; @@ -1651,4 +1654,11 @@ class AppLocalizationsHi extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 33978f7b..7ec8870c 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -447,6 +447,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'; @@ -1655,4 +1658,11 @@ class AppLocalizationsId extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index be2242c5..f41631db 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -447,6 +447,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'; @@ -1664,4 +1667,11 @@ class AppLocalizationsIt extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 039987f3..f8b54f8c 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -447,6 +447,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'; @@ -1663,6 +1666,13 @@ class AppLocalizationsPt extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 3119b131..1d9923b6 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -448,6 +448,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get a_week_ago => 'Неделю назад'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => 'Добавить в библиотеку'; @@ -1665,4 +1668,11 @@ class AppLocalizationsRu extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 8133d6d7..e0a4a3cf 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -443,6 +443,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get a_week_ago => 'สัปดาห์ที่แล้ว'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => 'เพิ่มไปที่ชั้นหนังสือ'; @@ -1649,4 +1652,11 @@ class AppLocalizationsTh extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 08e9c049..a9de4799 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -443,6 +443,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'; @@ -1655,4 +1658,11 @@ class AppLocalizationsTr extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index d866c717..07c234e5 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -435,6 +435,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get a_week_ago => '一周前'; + @override + String get next_week => 'Next week'; + @override String get add_to_library => '添加到图书馆'; @@ -1620,4 +1623,11 @@ class AppLocalizationsZh extends AppLocalizations { @override String get clear_library_input => 'Type \'manga\', \'anime\' and/or \'novel\' (separated by a comma) to remove all related entries'; + + @override + String get enable_pip => 'Enable Picture-in-Picture (PiP)'; + + @override + String get enable_auto_pip => + 'Enter PiP automatically when moving out of app'; } diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 425f9134..540229f0 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -276,6 +276,10 @@ class Settings { int? volumeBoostCap; + bool? enablePiP; + + bool? enableAutoPiP; + Settings({ this.id = 227, this.updatedAt = 0, @@ -399,6 +403,8 @@ class Settings { this.enableAudioPitchCorrection, this.audioChannels = AudioChannel.autoSafe, this.volumeBoostCap, + this.enablePiP = true, + this.enableAutoPiP = true, }); Settings.fromJson(Map json) { @@ -630,6 +636,8 @@ class Settings { audioChannels = AudioChannel .values[json['audioChannels'] ?? AudioChannel.autoSafe.index]; volumeBoostCap = json['volumeBoostCap']; + enablePiP = json['enablePiP']; + enableAutoPiP = json['enableAutoPiP']; } Map toJson() => { @@ -776,6 +784,8 @@ class Settings { 'enableAudioPitchCorrection': enableAudioPitchCorrection, 'audioChannels': audioChannels.index, 'volumeBoostCap': volumeBoostCap, + 'enablePiP': enablePiP, + 'enableAutoPiP': enableAutoPiP, }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 975f0946..fbd751cd 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -280,408 +280,418 @@ const SettingsSchema = CollectionSchema( name: r'enableAudioPitchCorrection', type: IsarType.bool, ), - r'enableAutoSkip': PropertySchema( + r'enableAutoPiP': PropertySchema( id: 49, + name: r'enableAutoPiP', + type: IsarType.bool, + ), + r'enableAutoSkip': PropertySchema( + id: 50, name: r'enableAutoSkip', type: IsarType.bool, ), r'enableCustomColorFilter': PropertySchema( - id: 50, + id: 51, name: r'enableCustomColorFilter', type: IsarType.bool, ), r'enableDiscordRpc': PropertySchema( - id: 51, + id: 52, name: r'enableDiscordRpc', type: IsarType.bool, ), r'enableGpuNext': PropertySchema( - id: 52, + id: 53, name: r'enableGpuNext', type: IsarType.bool, ), + r'enablePiP': PropertySchema( + id: 54, + name: r'enablePiP', + type: IsarType.bool, + ), r'filterScanlatorList': PropertySchema( - id: 53, + id: 55, name: r'filterScanlatorList', type: IsarType.objectList, target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 54, + id: 56, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 55, + id: 57, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'followSystemTheme': PropertySchema( - id: 56, + id: 58, name: r'followSystemTheme', type: IsarType.bool, ), r'fullScreenPlayer': PropertySchema( - id: 57, + id: 59, name: r'fullScreenPlayer', type: IsarType.bool, ), r'fullScreenReader': PropertySchema( - id: 58, + id: 60, name: r'fullScreenReader', type: IsarType.bool, ), r'hideDiscordRpcInIncognito': PropertySchema( - id: 59, + id: 61, name: r'hideDiscordRpcInIncognito', type: IsarType.bool, ), r'hideItems': PropertySchema( - id: 60, + id: 62, name: r'hideItems', type: IsarType.stringList, ), r'hwdecMode': PropertySchema( - id: 61, + id: 63, name: r'hwdecMode', type: IsarType.string, ), r'incognitoMode': PropertySchema( - id: 62, + id: 64, name: r'incognitoMode', type: IsarType.bool, ), r'lastTrackerLibraryLocation': PropertySchema( - id: 63, + id: 65, name: r'lastTrackerLibraryLocation', type: IsarType.string, ), r'libraryDownloadedChapters': PropertySchema( - id: 64, + id: 66, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 65, + id: 67, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 66, + id: 68, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 67, + id: 69, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 68, + id: 70, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 69, + id: 71, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 70, + id: 72, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 71, + id: 73, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 72, + id: 74, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 73, + id: 75, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 74, + id: 76, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 75, + id: 77, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 76, + id: 78, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 77, + id: 79, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 78, + id: 80, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 79, + id: 81, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 80, + id: 82, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 81, + id: 83, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 82, + id: 84, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( - id: 83, + id: 85, name: r'mangaExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'mangaGridSize': PropertySchema( - id: 84, + id: 86, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 85, + id: 87, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 86, + id: 88, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'mergeLibraryNavMobile': PropertySchema( - id: 87, + id: 89, name: r'mergeLibraryNavMobile', type: IsarType.bool, ), r'navigationOrder': PropertySchema( - id: 88, + id: 90, name: r'navigationOrder', type: IsarType.stringList, ), r'novelDisplayType': PropertySchema( - id: 89, + id: 91, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelExtensionsRepo': PropertySchema( - id: 90, + id: 92, name: r'novelExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'novelFontSize': PropertySchema( - id: 91, + id: 93, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 92, + id: 94, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 93, + id: 95, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 94, + id: 96, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 95, + id: 97, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 96, + id: 98, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 97, + id: 99, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 98, + id: 100, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 99, + id: 101, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 100, + id: 102, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 101, + id: 103, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 102, + id: 104, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 103, + id: 105, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 104, + id: 106, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 105, + id: 107, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 106, + id: 108, name: r'relativeTimesTamps', type: IsarType.long, ), r'rpcShowCoverImage': PropertySchema( - id: 107, + id: 109, name: r'rpcShowCoverImage', type: IsarType.bool, ), r'rpcShowReadingWatchingProgress': PropertySchema( - id: 108, + id: 110, name: r'rpcShowReadingWatchingProgress', type: IsarType.bool, ), r'rpcShowTitle': PropertySchema( - id: 109, + id: 111, name: r'rpcShowTitle', type: IsarType.bool, ), r'saveAsCBZArchive': PropertySchema( - id: 110, + id: 112, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 111, + id: 113, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 112, + id: 114, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 113, + id: 115, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 114, + id: 116, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 115, + id: 117, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 116, + id: 118, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 117, + id: 119, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 118, + id: 120, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 119, + id: 121, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'updatedAt': PropertySchema( - id: 120, + id: 122, name: r'updatedAt', type: IsarType.long, ), r'useLibass': PropertySchema( - id: 121, + id: 123, name: r'useLibass', type: IsarType.bool, ), r'useMpvConfig': PropertySchema( - id: 122, + id: 124, name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 123, + id: 125, name: r'usePageTapZones', type: IsarType.bool, ), r'useYUV420P': PropertySchema( - id: 124, + id: 126, name: r'useYUV420P', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 125, + id: 127, name: r'userAgent', type: IsarType.string, ), r'volumeBoostCap': PropertySchema( - id: 126, + id: 128, name: r'volumeBoostCap', type: IsarType.long, ) @@ -1170,139 +1180,141 @@ void _settingsSerialize( writer.writeBool(offsets[46], object.downloadOnlyOnWifi); writer.writeBool(offsets[47], object.enableAniSkip); writer.writeBool(offsets[48], object.enableAudioPitchCorrection); - writer.writeBool(offsets[49], object.enableAutoSkip); - writer.writeBool(offsets[50], object.enableCustomColorFilter); - writer.writeBool(offsets[51], object.enableDiscordRpc); - writer.writeBool(offsets[52], object.enableGpuNext); + writer.writeBool(offsets[49], object.enableAutoPiP); + writer.writeBool(offsets[50], object.enableAutoSkip); + writer.writeBool(offsets[51], object.enableCustomColorFilter); + writer.writeBool(offsets[52], object.enableDiscordRpc); + writer.writeBool(offsets[53], object.enableGpuNext); + writer.writeBool(offsets[54], object.enablePiP); writer.writeObjectList( - offsets[53], + offsets[55], allOffsets, FilterScanlatorSchema.serialize, object.filterScanlatorList, ); - writer.writeDouble(offsets[54], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[55], object.flexSchemeColorIndex); - writer.writeBool(offsets[56], object.followSystemTheme); - writer.writeBool(offsets[57], object.fullScreenPlayer); - writer.writeBool(offsets[58], object.fullScreenReader); - writer.writeBool(offsets[59], object.hideDiscordRpcInIncognito); - writer.writeStringList(offsets[60], object.hideItems); - writer.writeString(offsets[61], object.hwdecMode); - writer.writeBool(offsets[62], object.incognitoMode); - writer.writeString(offsets[63], object.lastTrackerLibraryLocation); - writer.writeBool(offsets[64], object.libraryDownloadedChapters); - writer.writeLong(offsets[65], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[66], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[67], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[68], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[69], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[70], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[71], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[72], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[73], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[74], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[75], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[76], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[77], object.libraryLocalSource); - writer.writeBool(offsets[78], object.libraryShowCategoryTabs); - writer.writeBool(offsets[79], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[80], object.libraryShowLanguage); - writer.writeBool(offsets[81], object.libraryShowNumbersOfItems); + writer.writeDouble(offsets[56], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[57], object.flexSchemeColorIndex); + writer.writeBool(offsets[58], object.followSystemTheme); + writer.writeBool(offsets[59], object.fullScreenPlayer); + writer.writeBool(offsets[60], object.fullScreenReader); + writer.writeBool(offsets[61], object.hideDiscordRpcInIncognito); + writer.writeStringList(offsets[62], object.hideItems); + writer.writeString(offsets[63], object.hwdecMode); + writer.writeBool(offsets[64], object.incognitoMode); + writer.writeString(offsets[65], object.lastTrackerLibraryLocation); + writer.writeBool(offsets[66], object.libraryDownloadedChapters); + writer.writeLong(offsets[67], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[68], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[69], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[70], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[71], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[72], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[73], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[74], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[75], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[76], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[77], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[78], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[79], object.libraryLocalSource); + writer.writeBool(offsets[80], object.libraryShowCategoryTabs); + writer.writeBool(offsets[81], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[82], object.libraryShowLanguage); + writer.writeBool(offsets[83], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[82], + offsets[84], allOffsets, L10nLocaleSchema.serialize, object.locale, ); writer.writeObjectList( - offsets[83], + offsets[85], allOffsets, RepoSchema.serialize, object.mangaExtensionsRepo, ); - writer.writeLong(offsets[84], object.mangaGridSize); - writer.writeByte(offsets[85], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[86], object.markEpisodeAsSeenType); - writer.writeBool(offsets[87], object.mergeLibraryNavMobile); - writer.writeStringList(offsets[88], object.navigationOrder); - writer.writeByte(offsets[89], object.novelDisplayType.index); + writer.writeLong(offsets[86], object.mangaGridSize); + writer.writeByte(offsets[87], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[88], object.markEpisodeAsSeenType); + writer.writeBool(offsets[89], object.mergeLibraryNavMobile); + writer.writeStringList(offsets[90], object.navigationOrder); + writer.writeByte(offsets[91], object.novelDisplayType.index); writer.writeObjectList( - offsets[90], + offsets[92], allOffsets, RepoSchema.serialize, object.novelExtensionsRepo, ); - writer.writeLong(offsets[91], object.novelFontSize); - writer.writeLong(offsets[92], object.novelGridSize); - writer.writeBool(offsets[93], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[94], object.novelLibraryLocalSource); - writer.writeBool(offsets[95], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[96], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[97], object.novelLibraryShowLanguage); - writer.writeBool(offsets[98], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[99], object.novelTextAlign.index); - writer.writeBool(offsets[100], object.onlyIncludePinnedSources); - writer.writeLong(offsets[101], object.pagePreloadAmount); + writer.writeLong(offsets[93], object.novelFontSize); + writer.writeLong(offsets[94], object.novelGridSize); + writer.writeBool(offsets[95], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[96], object.novelLibraryLocalSource); + writer.writeBool(offsets[97], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[98], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[99], object.novelLibraryShowLanguage); + writer.writeBool(offsets[100], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[101], object.novelTextAlign.index); + writer.writeBool(offsets[102], object.onlyIncludePinnedSources); + writer.writeLong(offsets[103], object.pagePreloadAmount); writer.writeObjectList( - offsets[102], + offsets[104], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[103], + offsets[105], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[104], + offsets[106], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[105], object.pureBlackDarkMode); - writer.writeLong(offsets[106], object.relativeTimesTamps); - writer.writeBool(offsets[107], object.rpcShowCoverImage); - writer.writeBool(offsets[108], object.rpcShowReadingWatchingProgress); - writer.writeBool(offsets[109], object.rpcShowTitle); - writer.writeBool(offsets[110], object.saveAsCBZArchive); - writer.writeByte(offsets[111], object.scaleType.index); - writer.writeBool(offsets[112], object.showPagesNumber); + writer.writeBool(offsets[107], object.pureBlackDarkMode); + writer.writeLong(offsets[108], object.relativeTimesTamps); + writer.writeBool(offsets[109], object.rpcShowCoverImage); + writer.writeBool(offsets[110], object.rpcShowReadingWatchingProgress); + writer.writeBool(offsets[111], object.rpcShowTitle); + writer.writeBool(offsets[112], object.saveAsCBZArchive); + writer.writeByte(offsets[113], object.scaleType.index); + writer.writeBool(offsets[114], object.showPagesNumber); writer.writeObjectList( - offsets[113], + offsets[115], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[114], + offsets[116], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[115], + offsets[117], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[116], + offsets[118], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[117], object.startDatebackup); - writer.writeBool(offsets[118], object.themeIsDark); - writer.writeBool(offsets[119], object.updateProgressAfterReading); - writer.writeLong(offsets[120], object.updatedAt); - writer.writeBool(offsets[121], object.useLibass); - writer.writeBool(offsets[122], object.useMpvConfig); - writer.writeBool(offsets[123], object.usePageTapZones); - writer.writeBool(offsets[124], object.useYUV420P); - writer.writeString(offsets[125], object.userAgent); - writer.writeLong(offsets[126], object.volumeBoostCap); + writer.writeLong(offsets[119], object.startDatebackup); + writer.writeBool(offsets[120], object.themeIsDark); + writer.writeBool(offsets[121], object.updateProgressAfterReading); + writer.writeLong(offsets[122], object.updatedAt); + writer.writeBool(offsets[123], object.useLibass); + writer.writeBool(offsets[124], object.useMpvConfig); + writer.writeBool(offsets[125], object.usePageTapZones); + writer.writeBool(offsets[126], object.useYUV420P); + writer.writeString(offsets[127], object.userAgent); + writer.writeLong(offsets[128], object.volumeBoostCap); } Settings _settingsDeserialize( @@ -1408,131 +1420,133 @@ Settings _settingsDeserialize( downloadOnlyOnWifi: reader.readBoolOrNull(offsets[46]), enableAniSkip: reader.readBoolOrNull(offsets[47]), enableAudioPitchCorrection: reader.readBoolOrNull(offsets[48]), - enableAutoSkip: reader.readBoolOrNull(offsets[49]), - enableCustomColorFilter: reader.readBoolOrNull(offsets[50]), - enableDiscordRpc: reader.readBoolOrNull(offsets[51]), - enableGpuNext: reader.readBoolOrNull(offsets[52]), - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[54]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[55]), - followSystemTheme: reader.readBoolOrNull(offsets[56]), - fullScreenPlayer: reader.readBoolOrNull(offsets[57]), - fullScreenReader: reader.readBoolOrNull(offsets[58]), - hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[59]), - hideItems: reader.readStringList(offsets[60]), - hwdecMode: reader.readStringOrNull(offsets[61]), + enableAutoPiP: reader.readBoolOrNull(offsets[49]), + enableAutoSkip: reader.readBoolOrNull(offsets[50]), + enableCustomColorFilter: reader.readBoolOrNull(offsets[51]), + enableDiscordRpc: reader.readBoolOrNull(offsets[52]), + enableGpuNext: reader.readBoolOrNull(offsets[53]), + enablePiP: reader.readBoolOrNull(offsets[54]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[56]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[57]), + followSystemTheme: reader.readBoolOrNull(offsets[58]), + fullScreenPlayer: reader.readBoolOrNull(offsets[59]), + fullScreenReader: reader.readBoolOrNull(offsets[60]), + hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[61]), + hideItems: reader.readStringList(offsets[62]), + hwdecMode: reader.readStringOrNull(offsets[63]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[62]), - lastTrackerLibraryLocation: reader.readStringOrNull(offsets[63]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[64]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[65]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[66]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[67]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[68]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[69]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[70]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[71]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[72]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[73]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[74]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[75]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[76]), - libraryLocalSource: reader.readBoolOrNull(offsets[77]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[78]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[79]), - libraryShowLanguage: reader.readBoolOrNull(offsets[80]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[81]), + incognitoMode: reader.readBoolOrNull(offsets[64]), + lastTrackerLibraryLocation: reader.readStringOrNull(offsets[65]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[66]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[67]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[68]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[69]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[70]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[71]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[72]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[73]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[74]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[75]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[76]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[77]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[78]), + libraryLocalSource: reader.readBoolOrNull(offsets[79]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[80]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[81]), + libraryShowLanguage: reader.readBoolOrNull(offsets[82]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[83]), mangaExtensionsRepo: reader.readObjectList( - offsets[83], + offsets[85], RepoSchema.deserialize, allOffsets, Repo(), ), - mangaGridSize: reader.readLongOrNull(offsets[84]), + mangaGridSize: reader.readLongOrNull(offsets[86]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[85])] ?? + reader.readByteOrNull(offsets[87])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[86]), - mergeLibraryNavMobile: reader.readBoolOrNull(offsets[87]), - navigationOrder: reader.readStringList(offsets[88]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[88]), + mergeLibraryNavMobile: reader.readBoolOrNull(offsets[89]), + navigationOrder: reader.readStringList(offsets[90]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[89])] ?? + reader.readByteOrNull(offsets[91])] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( - offsets[90], + offsets[92], RepoSchema.deserialize, allOffsets, Repo(), ), - novelFontSize: reader.readLongOrNull(offsets[91]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[93]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[94]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[95]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[96]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[97]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[98]), + novelFontSize: reader.readLongOrNull(offsets[93]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[95]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[96]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[97]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[98]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[99]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[100]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[99])] ?? + reader.readByteOrNull(offsets[101])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[100]), - pagePreloadAmount: reader.readLongOrNull(offsets[101]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[102]), + pagePreloadAmount: reader.readLongOrNull(offsets[103]), personalPageModeList: reader.readObjectList( - offsets[102], + offsets[104], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[103], + offsets[105], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[104], + offsets[106], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[105]), - relativeTimesTamps: reader.readLongOrNull(offsets[106]), - rpcShowCoverImage: reader.readBoolOrNull(offsets[107]), - rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[108]), - rpcShowTitle: reader.readBoolOrNull(offsets[109]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[110]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[107]), + relativeTimesTamps: reader.readLongOrNull(offsets[108]), + rpcShowCoverImage: reader.readBoolOrNull(offsets[109]), + rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[110]), + rpcShowTitle: reader.readBoolOrNull(offsets[111]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[112]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[111])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[113])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[112]), + showPagesNumber: reader.readBoolOrNull(offsets[114]), sortChapterList: reader.readObjectList( - offsets[113], + offsets[115], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[114], - SortLibraryMangaSchema.deserialize, - allOffsets, - ), - sortLibraryManga: reader.readObjectOrNull( - offsets[115], - SortLibraryMangaSchema.deserialize, - allOffsets, - ), - sortLibraryNovel: reader.readObjectOrNull( offsets[116], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[117]), - themeIsDark: reader.readBoolOrNull(offsets[118]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[119]), - updatedAt: reader.readLongOrNull(offsets[120]), - useLibass: reader.readBoolOrNull(offsets[121]), - useMpvConfig: reader.readBoolOrNull(offsets[122]), - usePageTapZones: reader.readBoolOrNull(offsets[123]), - useYUV420P: reader.readBoolOrNull(offsets[124]), - userAgent: reader.readStringOrNull(offsets[125]), - volumeBoostCap: reader.readLongOrNull(offsets[126]), + sortLibraryManga: reader.readObjectOrNull( + offsets[117], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + sortLibraryNovel: reader.readObjectOrNull( + offsets[118], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + startDatebackup: reader.readLongOrNull(offsets[119]), + themeIsDark: reader.readBoolOrNull(offsets[120]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[121]), + updatedAt: reader.readLongOrNull(offsets[122]), + useLibass: reader.readBoolOrNull(offsets[123]), + useMpvConfig: reader.readBoolOrNull(offsets[124]), + usePageTapZones: reader.readBoolOrNull(offsets[125]), + useYUV420P: reader.readBoolOrNull(offsets[126]), + userAgent: reader.readStringOrNull(offsets[127]), + volumeBoostCap: reader.readLongOrNull(offsets[128]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1553,17 +1567,17 @@ Settings _settingsDeserialize( allOffsets, ); object.filterScanlatorList = reader.readObjectList( - offsets[53], + offsets[55], FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[82], + offsets[84], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[92]); + object.novelGridSize = reader.readLongOrNull(offsets[94]); return object; } @@ -1744,38 +1758,38 @@ P _settingsDeserializeProp

  • bd5F0W_@Z7O+4LDfHwInb598wXW1_tF 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�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℘Y_EkFL?374lJ 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