From 4b95941e4a0ffdba09f595c294b5f74ec76e199f Mon Sep 17 00:00:00 2001 From: omkar Date: Fri, 31 Jan 2025 18:02:01 +0530 Subject: [PATCH] fix: catalog fixes --- lib/features/common/utils/startup_app.dart | 3 + .../models/stremio_base_types.dart | 57 ++++++++++++++++-- .../service/stremio_addon_service.dart | 25 +++++--- lib/features/widgetter/plugin_layout.dart | 59 ++++++++++--------- .../plugins/stremio/stremio_plugin.dart | 22 +++++-- .../plugins/stremio/widgets/catalog_grid.dart | 2 +- 6 files changed, 120 insertions(+), 48 deletions(-) diff --git a/lib/features/common/utils/startup_app.dart b/lib/features/common/utils/startup_app.dart index c25d2c7..4c7e5c9 100644 --- a/lib/features/common/utils/startup_app.dart +++ b/lib/features/common/utils/startup_app.dart @@ -2,6 +2,7 @@ import 'package:cached_query_flutter/cached_query_flutter.dart'; import 'package:cached_storage/cached_storage.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; +import 'package:madari_client/features/settings/service/selected_profile.dart'; import 'package:media_kit/media_kit.dart'; import 'package:universal_platform/universal_platform.dart'; import 'package:window_manager/window_manager.dart'; @@ -17,6 +18,8 @@ Future startupApp() async { await AppPocketBaseService.ensureInitialized(); + await SelectedProfileService.instance.initialize(); + if (UniversalPlatform.isDesktop) { await windowManager.ensureInitialized(); } diff --git a/lib/features/streamio_addons/models/stremio_base_types.dart b/lib/features/streamio_addons/models/stremio_base_types.dart index 0cfe6a8..1ec4e43 100644 --- a/lib/features/streamio_addons/models/stremio_base_types.dart +++ b/lib/features/streamio_addons/models/stremio_base_types.dart @@ -133,16 +133,54 @@ class StremioManifestCatalog { String id; String? name; final List? extra; - final List? extraRequired; - final List? extraSupported; + @JsonKey(name: "extraRequired") + final List? extraRequired_; + @JsonKey(name: "extraSupported") + final List? extraSupported_; + + List? get extraRequired { + final List returnValue = extraRequired_ ?? []; + + if (extra == null) { + return extraRequired_; + } + + for (final i in extra!) { + final result = returnValue.contains(i.name); + + if (i.isRequired == true && !result) { + returnValue.add(i.name); + } + } + + return returnValue; + } + + List? get extraSupported { + final List returnValue = extraSupported_ ?? []; + + if (extra == null) { + return extraSupported_; + } + + for (final i in extra!) { + final result = returnValue.contains(i.name); + + if (!result) { + returnValue.add(i.name); + } + } + + return returnValue; + } StremioManifestCatalog({ required this.id, required this.type, this.extra, this.name, - this.extraRequired, - this.extraSupported, + this.extraRequired_, + this.extraSupported_, }); factory StremioManifestCatalog.fromRecord(RecordModel record) => @@ -151,17 +189,26 @@ class StremioManifestCatalog { factory StremioManifestCatalog.fromJson(Map json) => _$StremioManifestCatalogFromJson(json); - Map toJson() => _$StremioManifestCatalogToJson(this); + Map toJson() { + final result = _$StremioManifestCatalogToJson(this); + + result["extraRequired"] = extraRequired; + result["extraSupported"] = extraSupported; + + return result; + } } @JsonSerializable() class StremioManifestCatalogExtra { final String name; final List? options; + final bool? isRequired; StremioManifestCatalogExtra({ required this.name, required this.options, + this.isRequired, }); factory StremioManifestCatalogExtra.fromJson(Map json) { diff --git a/lib/features/streamio_addons/service/stremio_addon_service.dart b/lib/features/streamio_addons/service/stremio_addon_service.dart index 469a1ed..1dd3936 100644 --- a/lib/features/streamio_addons/service/stremio_addon_service.dart +++ b/lib/features/streamio_addons/service/stremio_addon_service.dart @@ -296,15 +296,6 @@ class StremioAddonService { return []; } - if (page != null && catalog.extraSupported?.contains("skip") == true) { - items.add( - ConnectionFilterItem( - title: "skip", - value: page * perPage, - ), - ); - } - if (page != null && catalog.extraSupported?.contains("region") == true) { final region = AppPocketBaseService.instance.pb.authStore.record! .getStringValue("region"); @@ -370,6 +361,22 @@ class StremioAddonService { } } + final isSearch = items.firstWhereOrNull((item) { + return item.title == "search"; + }) != + null; + + if (page != null && + catalog.extraSupported?.contains("skip") == true && + !isSearch) { + items.add( + ConnectionFilterItem( + title: "skip", + value: page * perPage, + ), + ); + } + final httpBody = await http.get(Uri.parse(url)); _logger.info("getting catalog from $url"); diff --git a/lib/features/widgetter/plugin_layout.dart b/lib/features/widgetter/plugin_layout.dart index 128bc61..fbdbc55 100644 --- a/lib/features/widgetter/plugin_layout.dart +++ b/lib/features/widgetter/plugin_layout.dart @@ -60,7 +60,7 @@ class LayoutManagerState extends State { try { _logger.info('Loading layouts'); final query = Query( - key: "home_layout_${SelectedProfileService.instance.selectedProfileId}", + key: "home_layout_${SelectedProfileService.instance.selectedProfileId}${widget.hasSearch}", config: QueryConfig( ignoreCacheDuration: refresh, cacheDuration: const Duration(hours: 8), @@ -117,39 +117,40 @@ class LayoutManagerState extends State { const SearchBox( hintText: 'Search...', ), - Expanded( - child: CustomScrollView( - controller: _scrollController, - slivers: [ - SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - final layout = _filteredLayouts[index]; + if (!widget.hasSearch || search.trim() != "") + Expanded( + child: CustomScrollView( + controller: _scrollController, + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final layout = _filteredLayouts[index]; - if (widget.hasSearch) { - if (!(layout.pluginId == "stremio_catalog" && - layout.type == "catalog_grid")) { - return const SizedBox.shrink(); + if (widget.hasSearch) { + if (!(layout.pluginId == "stremio_catalog" && + layout.type == "catalog_grid")) { + return const SizedBox.shrink(); + } } - } - return PluginWidget( - key: ValueKey( - '${layout.id}_${layout.pluginId}_${layout.type}_${search.trim()}', - ), - layout: layout, - pluginContext: PluginContext( - index: index, - hasSearch: widget.hasSearch, - ), - ); - }, - childCount: _filteredLayouts.length, + return PluginWidget( + key: ValueKey( + '${layout.id}_${layout.pluginId}_${layout.type}_${search.trim()}', + ), + layout: layout, + pluginContext: PluginContext( + index: index, + hasSearch: widget.hasSearch, + ), + ); + }, + childCount: _filteredLayouts.length, + ), ), - ), - ], + ], + ), ), - ), ], ); }, diff --git a/lib/features/widgetter/plugins/stremio/stremio_plugin.dart b/lib/features/widgetter/plugins/stremio/stremio_plugin.dart index f5accc6..cacab09 100644 --- a/lib/features/widgetter/plugins/stremio/stremio_plugin.dart +++ b/lib/features/widgetter/plugins/stremio/stremio_plugin.dart @@ -1,4 +1,5 @@ import 'package:flex_color_picker/flex_color_picker.dart'; +import 'package:flutter/cupertino.dart'; import 'package:madari_client/features/pocketbase/service/pocketbase.service.dart'; import 'package:madari_client/features/streamio_addons/extension/query_extension.dart'; @@ -16,10 +17,23 @@ class StremioCatalogPlugin extends PluginBase { @override Map get widgetFactories => { - 'catalog_grid': (config, pluginContext) => CatalogGrid( - config: config, - pluginContext: pluginContext, - ), + 'catalog_grid': (config, pluginContext) { + if (pluginContext.hasSearch) { + if (config["can_search"]) { + return CatalogGrid( + config: config, + pluginContext: pluginContext, + ); + } + + return const SizedBox.shrink(); + } + + return CatalogGrid( + config: config, + pluginContext: pluginContext, + ); + }, 'catalog_grid_big': (config, pluginContext) => CatalogGrid( config: config, isWide: true, diff --git a/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart b/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart index 66665b0..7517025 100644 --- a/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart +++ b/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart @@ -81,7 +81,7 @@ class _CatalogGridState extends State implements Refreshable { List items = []; - if (state.search.trim() != "") { + if (state.search.trim() != "" && widget.pluginContext.hasSearch) { items.add( ConnectionFilterItem( title: "search",