mirror of
https://github.com/R0m1k3/xtremobile.git
synced 2026-10-11 17:29:26 +02:00
feat: Add generated Hive TypeAdapters for AppUser and PlaylistConfig models, and new build/doctor log files.
This commit is contained in:
1 parent
780f6c1842
commit
ef97c6dc90
81 files changed
+3233
-2428
No files matched your search
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(flutter build:*)",
|
||||
"Bash(tee build_apk_output.txt)"
|
||||
]
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Whitespace-only changes.
Binary file not shown.
@@ -0,0 +1,100 @@
|
||||
Analyzing xtremobile...
|
||||
|
||||
error - bin\api\auth_handler.dart:3:8 - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\api\auth_handler.dart:11:3 - Undefined class 'Router'. Try changing the name to the name of an existing class, or creating a class with the name 'Router'. - undefined_class
|
||||
error - bin\api\auth_handler.dart:12:20 - The method 'Router' isn't defined for the type 'AuthHandler'. Try correcting the name to the name of an existing method, or defining a method named 'Router'. - undefined_method
|
||||
error - bin\api\playlists_handler.dart:3:8 - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\api\playlists_handler.dart:11:3 - Undefined class 'Router'. Try changing the name to the name of an existing class, or creating a class with the name 'Router'. - undefined_class
|
||||
error - bin\api\playlists_handler.dart:12:20 - The method 'Router' isn't defined for the type 'PlaylistsHandler'. Try correcting the name to the name of an existing method, or defining a method named 'Router'. - undefined_method
|
||||
error - bin\api\settings_handler.dart:3:8 - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\api\settings_handler.dart:11:3 - Undefined class 'Router'. Try changing the name to the name of an existing class, or creating a class with the name 'Router'. - undefined_class
|
||||
error - bin\api\settings_handler.dart:12:20 - The method 'Router' isn't defined for the type 'SettingsHandler'. Try correcting the name to the name of an existing method, or defining a method named 'Router'. - undefined_method
|
||||
error - bin\api\users_handler.dart:3:8 - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\api\users_handler.dart:11:3 - Undefined class 'Router'. Try changing the name to the name of an existing class, or creating a class with the name 'Router'. - undefined_class
|
||||
error - bin\api\users_handler.dart:12:20 - The method 'Router' isn't defined for the type 'UsersHandler'. Try correcting the name to the name of an existing method, or defining a method named 'Router'. - undefined_method
|
||||
error - bin\database\database.dart:2:8 - Target of URI doesn't exist: 'package:sqlite3/sqlite3.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\database\database.dart:10:14 - Undefined class 'Database'. Try changing the name to the name of an existing class, or creating a class with the name 'Database'. - undefined_class
|
||||
error - bin\database\database.dart:23:11 - Undefined name 'sqlite3'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - bin\server.dart:6:8 - Target of URI doesn't exist: 'package:shelf_static/shelf_static.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\server.dart:7:8 - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - bin\server.dart:44:21 - The function 'Router' isn't defined. Try importing the library that defines 'Router', correcting the name to the name of an existing function, or defining a function named 'Router'. - undefined_function
|
||||
error - bin\server.dart:85:22 - The function 'Router' isn't defined. Try importing the library that defines 'Router', correcting the name to the name of an existing function, or defining a function named 'Router'. - undefined_function
|
||||
error - bin\server.dart:109:29 - The function 'createStaticHandler' isn't defined. Try importing the library that defines 'createStaticHandler', correcting the name to the name of an existing function, or defining a function named 'createStaticHandler'. - undefined_function
|
||||
error - bin\server.dart:185:27 - Undefined class 'Router'. Try changing the name to the name of an existing class, or creating a class with the name 'Router'. - undefined_class
|
||||
error - lib\core\api\dns_service.dart:28:21 - The name '_DnsCacheEntry' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named '_DnsCacheEntry'. - non_type_as_type_argument
|
||||
error - lib\core\api\dns_service.dart:65:28 - The method '_DnsCacheEntry' isn't defined for the type 'UnifiedDnsService'. Try correcting the name to the name of an existing method, or defining a method named '_DnsCacheEntry'. - undefined_method
|
||||
error - lib\core\api\dns_service.dart:152:55 - The property 'isExpired' can't be unconditionally accessed because the receiver can be 'null'. Try making the access conditional (using '?.') or adding a null check to the target ('!'). - unchecked_use_of_nullable_value
|
||||
error - lib\core\api\dns_service.dart:162:10 - Classes can't be declared inside other classes. Try moving the class to the top-level. - class_in_class
|
||||
error - lib\core\patterns\video_player_wrapper.dart:12:3 - Enums can't be declared inside classes. Try moving the enum to the top-level. - enum_in_class
|
||||
error - lib\core\patterns\video_player_wrapper.dart:15:10 - Undefined class 'PlayerType'. Try changing the name to the name of an existing class, or creating a class with the name 'PlayerType'. - undefined_class
|
||||
error - lib\core\patterns\video_player_wrapper.dart:22:12 - Undefined name 'PlayerType'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\patterns\video_player_wrapper.dart:53:64 - There's no constant named 'no' in 'MPVLogLevel'. Try correcting the name to the name of an existing constant, or defining a constant named 'no'. - undefined_enum_constant
|
||||
error - lib\core\patterns\video_player_wrapper.dart:78:53 - Undefined class 'PlayerType'. Try changing the name to the name of an existing class, or creating a class with the name 'PlayerType'. - undefined_class
|
||||
error - lib\core\patterns\video_player_wrapper.dart:80:7 - Undefined name 'PlayerType'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\patterns\video_player_wrapper.dart:81:7 - Undefined name 'PlayerType'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\device_info.dart:7:8 - Target of URI doesn't exist: 'package:device_info_plus/device_info_plus.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\core\utils\device_info.dart:27:26 - The method 'DeviceInfoPlugin' isn't defined for the type 'DeviceInfo'. Try correcting the name to the name of an existing method, or defining a method named 'DeviceInfoPlugin'. - undefined_method
|
||||
error - lib\core\utils\device_info.dart:52:30 - Undefined class 'AndroidDeviceInfo'. Try changing the name to the name of an existing class, or creating a class with the name 'AndroidDeviceInfo'. - undefined_class
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:7:27 - List literals require one type argument or none, but 2 found. Try adjusting the number of type arguments. - expected_one_list_type_arguments
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:203:12 - A value of type 'List<dynamic>' can't be returned from the method 'toJson' because it has a return type of 'List<Map<String, dynamic>>'. - return_of_invalid_type
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:231:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:232:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:233:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\hive_encryption_benchmark.dart:234:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\image_cache_config.dart:21:7 - The named parameter 'diskUsagePercentageHigh' isn't defined. Try correcting the name to an existing named parameter's name, or defining a named parameter with the name 'diskUsagePercentageHigh'. - undefined_named_parameter
|
||||
error - lib\core\utils\image_cache_config.dart:22:7 - The named parameter 'diskUsagePercentageGoal' isn't defined. Try correcting the name to an existing named parameter's name, or defining a named parameter with the name 'diskUsagePercentageGoal'. - undefined_named_parameter
|
||||
error - lib\core\utils\image_cache_config.dart:90:5 - Undefined class 'BoxFit'. Try changing the name to the name of an existing class, or creating a class with the name 'BoxFit'. - undefined_class
|
||||
error - lib\core\utils\image_cache_config.dart:90:18 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:102:38 - The method 'Container' isn't defined for the type 'ImageCacheConfig'. Try correcting the name to the name of an existing method, or defining a method named 'Container'. - undefined_method
|
||||
error - lib\core\utils\image_cache_config.dart:105:21 - The method 'BoxDecoration' isn't defined for the type 'ImageCacheConfig'. Try correcting the name to the name of an existing method, or defining a method named 'BoxDecoration'. - undefined_method
|
||||
error - lib\core\utils\image_cache_config.dart:106:24 - The name 'Color' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type
|
||||
error - lib\core\utils\image_cache_config.dart:107:25 - Undefined name 'BorderRadius'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:110:45 - The method 'Container' isn't defined for the type 'ImageCacheConfig'. Try correcting the name to the name of an existing method, or defining a method named 'Container'. - undefined_method
|
||||
error - lib\core\utils\image_cache_config.dart:113:21 - The method 'BoxDecoration' isn't defined for the type 'ImageCacheConfig'. Try correcting the name to the name of an existing method, or defining a method named 'BoxDecoration'. - undefined_method
|
||||
error - lib\core\utils\image_cache_config.dart:114:24 - The name 'Color' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type
|
||||
error - lib\core\utils\image_cache_config.dart:115:25 - Undefined name 'BorderRadius'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:117:22 - The name 'Icon' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type
|
||||
error - lib\core\utils\image_cache_config.dart:117:27 - Undefined name 'Icons'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:117:61 - The method 'Color' isn't defined for the type 'ImageCacheConfig'. Try correcting the name to the name of an existing method, or defining a method named 'Color'. - undefined_method
|
||||
error - lib\core\utils\image_cache_config.dart:131:12 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:144:12 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:157:12 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:170:12 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\image_cache_config.dart:183:12 - Undefined name 'BoxFit'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\core\utils\memory_profiler.dart:7:29 - List literals require one type argument or none, but 2 found. Try adjusting the number of type arguments. - expected_one_list_type_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:129:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:130:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:160:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:161:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:162:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\core\utils\memory_profiler.dart:163:11 - Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments. - extra_positional_arguments
|
||||
error - lib\features\iptv\screens\lite_player_screen.dart:62:3 - Undefined class 'ShortEPG'. Try changing the name to the name of an existing class, or creating a class with the name 'ShortEPG'. - undefined_class
|
||||
error - lib\features\iptv\screens\lite_player_screen.dart:185:29 - The method 'getLiveStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getLiveStreamUrl'. - undefined_method
|
||||
error - lib\features\iptv\screens\lite_player_screen.dart:187:33 - The method 'getVodStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getVodStreamUrl'. - undefined_method
|
||||
error - lib\features\iptv\screens\lite_player_screen.dart:191:33 - The method 'getSeriesStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getSeriesStreamUrl'. - undefined_method
|
||||
error - lib\features\iptv\screens\lite_player_screen.dart:354:21 - The method 'dispose' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'dispose'. - undefined_method
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:5:8 - Target of URI doesn't exist: '../../../widgets/mobile_scaffold.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:6:8 - Target of URI doesn't exist: '../../../theme/mobile_theme.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:11:8 - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:29:36 - Undefined name 'mobileDashboardIndexProvider'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:36:13 - Undefined name 'MobileTheme'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:37:14 - The method 'MobileScaffold' isn't defined for the type '_MobileDashboardScreenState'. Try correcting the name to the name of an existing method, or defining a method named 'MobileScaffold'. - undefined_method
|
||||
error - lib\features\iptv\screens\mobile_dashboard_screen.dart:40:20 - Undefined name 'mobileDashboardIndexProvider'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_playlist_screen.dart:6:8 - Target of URI doesn't exist: '../../../theme/mobile_theme.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_playlist_screen.dart:391:13 - Undefined name 'MobileTheme'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:9:8 - Target of URI doesn't exist: '../../../theme/mobile_theme.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:206:13 - Undefined name 'MobileTheme'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:6:8 - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:7:8 - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:13:9 - Undefined class 'Series'. Try changing the name to the name of an existing class, or creating a class with the name 'Series'. - undefined_class
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:29:3 - Undefined class 'SeriesInfo'. Try changing the name to the name of an existing class, or creating a class with the name 'SeriesInfo'. - undefined_class
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:57:26 - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesDetailScreenState'. Try correcting the name to the name of an existing method, or defining a method named 'mobileXtreamServiceProvider'. - undefined_method
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:59:25 - The method 'getSeriesInfo' can't be unconditionally invoked because the receiver can be 'null'. Try making the call conditional (using '?.') or adding a null check to the target ('!'). - unchecked_use_of_nullable_value
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:307:28 - Undefined class 'Episode'. Try changing the name to the name of an existing class, or creating a class with the name 'Episode'. - undefined_class
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:308:36 - Undefined name 'mobileWatchHistoryProvider'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\mobile_series_detail_screen.dart:309:24 - Undefined name 'MobileWatchHistory'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier
|
||||
error - lib\features\iptv\screens\native_player_screen.dart:469:21 - The method 'dispose' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'dispose'. - undefined_method
|
||||
error - lib\features\iptv\screens\native_player_screen.dart:681:3 - Undefined class 'ShortEPG'. Try changing the name to the name of an existing class, or creating a class with the name 'ShortEPG'. - undefined_class
|
||||
error - lib\features\iptv\screens\native_player_screen.dart:711:37 - The method 'getLiveStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getLiveStreamUrl'. - undefined_method
|
||||
error - lib\features\iptv\screens\native_player_screen.dart:713:37 - The method 'getVodStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getVodStreamUrl'. - undefined_method
|
||||
error - lib\features\iptv\screens\native_player_screen.dart:718:37 - The method 'getSeriesStreamUrl' isn't defined for the type 'XtreamServiceMobile'. Try correcting the name to the name of an existing method, or defining a method named 'getSeriesStreamUrl'. - undefined_method
|
||||
Binary file not shown.
@@ -0,0 +1,167 @@
|
||||
Analyzing xtremobile...
|
||||
|
||||
info - Dangling library doc comment - lib\core\api\dns_service.dart:1:1 - dangling_library_doc_comments
|
||||
warning - The value of the field '_cacheTtlSeconds' isn't used - lib\core\api\dns_service.dart:33:20 - unused_field
|
||||
warning - The declaration '_getOrCreateEncryptionKey' isn't referenced - lib\core\database\hive_service.dart:43:28 - unused_element
|
||||
info - Missing a required trailing comma - lib\core\patterns\stream_resolver_pattern.dart:41:27 - require_trailing_commas
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:43:23 - unnecessary_cast
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:44:27 - unnecessary_cast
|
||||
warning - Unused import: 'package:media_kit_video/media_kit_video.dart' - lib\core\patterns\video_player_wrapper.dart:3:8 - unused_import
|
||||
warning - The value of the field '_availablePlayers' isn't used - lib\core\patterns\video_player_wrapper.dart:15:16 - unused_field
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:40:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:74:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:86:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:18:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:21:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:25:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:28:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:31:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:42:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:47:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:50:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:52:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:56:7 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:68:64 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:69:60 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:151:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:154:35 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\core\utils\device_info.dart:1:1 - dangling_library_doc_comments
|
||||
warning - Unused import: 'dart:io' - lib\core\utils\device_info.dart:6:8 - unused_import
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\hive_encryption_benchmark.dart:7:27 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:16:13 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:45:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:65:9 - await_only_futures
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:96:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:121:9 - await_only_futures
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:160:15 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:165:124 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:167:118 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:172:122 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:174:116 - require_trailing_commas
|
||||
error - A value of type 'List<dynamic>' can't be returned from the method 'toJson' because it has a return type of 'List<Map<String, dynamic>>' - lib\core\utils\hive_encryption_benchmark.dart:203:12 - return_of_invalid_type
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:231:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:232:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:233:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:234:11 - extra_positional_arguments
|
||||
info - Dangling library doc comment - lib\core\utils\image_cache_config.dart:1:1 - dangling_library_doc_comments
|
||||
warning - The value of the field '_cacheSizeInBytes' isn't used - lib\core\utils\image_cache_config.dart:15:20 - unused_field
|
||||
error - The named parameter 'diskUsagePercentageHigh' isn't defined - lib\core\utils\image_cache_config.dart:22:7 - undefined_named_parameter
|
||||
error - The named parameter 'diskUsagePercentageGoal' isn't defined - lib\core\utils\image_cache_config.dart:23:7 - undefined_named_parameter
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\memory_profiler.dart:7:29 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:68:13 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:78:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:90:13 - prefer_interpolation_to_compose_strings
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:129:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:130:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:160:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:161:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:162:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:163:11 - extra_positional_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\startup_profiler.dart:38:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\startup_profiler.dart:42:9 - avoid_print
|
||||
warning - Unused import: 'dart:async' - lib\core\utils\video_profiler.dart:1:8 - unused_import
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:84:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:96:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:100:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:144:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:145:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:146:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:147:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:148:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:149:5 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:96:47 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:132:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:133:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:164:57 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:230:61 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:78 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:112:40 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:223:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:225:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:283:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:373:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:380:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:424:53 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:34:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:36:52 - deprecated_member_use
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:205:8 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:226:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:238:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:307:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:312:9 - curly_braces_in_flow_control_structures
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\screens\lite_player_screen.dart:397:41 - prefer_const_constructors
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:412:60 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:465:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:467:7 - curly_braces_in_flow_control_structures
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\lite_player_screen.dart:498:35 - deprecated_member_use
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:230:41 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:232:48 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:374:31 - use_build_context_synchronously
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:530:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:546:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:342:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:345:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:364:46 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:7:8 - uri_does_not_exist
|
||||
error - Undefined class 'Series' - lib\features\iptv\screens\mobile_series_detail_screen.dart:13:9 - undefined_class
|
||||
error - Undefined class 'SeriesInfo' - lib\features\iptv\screens\mobile_series_detail_screen.dart:29:3 - undefined_class
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesDetailScreenState' - lib\features\iptv\screens\mobile_series_detail_screen.dart:57:26 - undefined_method
|
||||
error - The method 'getSeriesInfo' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\screens\mobile_series_detail_screen.dart:59:25 - unchecked_use_of_nullable_value
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_series_detail_screen.dart:161:46 - deprecated_member_use
|
||||
error - Undefined class 'Episode' - lib\features\iptv\screens\mobile_series_detail_screen.dart:307:28 - undefined_class
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\screens\mobile_series_detail_screen.dart:308:36 - undefined_identifier
|
||||
error - Undefined name 'MobileWatchHistory' - lib\features\iptv\screens\mobile_series_detail_screen.dart:309:24 - undefined_identifier
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:168:29 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:193:117 - require_trailing_commas
|
||||
warning - The declaration '_cycleAudioTrack' isn't referenced - lib\features\iptv\screens\native_player_screen.dart:991:16 - unused_element
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1217:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1395:29 - deprecated_member_use
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:1527:45 - require_trailing_commas
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1692:29 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1694:48 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\features\iptv\services\xtream_service_mobile.dart:1:1 - dangling_library_doc_comments
|
||||
error - The getter 'serverUrl' isn't defined for the type 'PlaylistConfig' - lib\features\iptv\services\xtream_service_mobile.dart:47:23 - undefined_getter
|
||||
error - The getter 'instance' isn't defined for the type 'ApiClient' - lib\features\iptv\services\xtream_service_mobile.dart:52:22 - undefined_getter
|
||||
info - Missing a required trailing comma - lib\features\iptv\services\xtream_service_mobile.dart:136:46 - require_trailing_commas
|
||||
error - The method 'Timer' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:45:22 - undefined_method
|
||||
error - Undefined class 'Timer' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:59:3 - undefined_class
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:421:54 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:424:39 - deprecated_member_use
|
||||
error - Undefined class 'Movie' - lib\features\iptv\widgets\mobile_movies_tab.dart:202:41 - undefined_class
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\widgets\mobile_movies_tab.dart:404:53 - prefer_const_constructors
|
||||
error - Undefined class 'Series' - lib\features\iptv\widgets\mobile_series_tab.dart:170:20 - undefined_class
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:190:10 - non_type_as_type_argument
|
||||
error - The property 'streamId' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:206:19 - unchecked_use_of_nullable_value
|
||||
error - The property 'name' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:207:22 - unchecked_use_of_nullable_value
|
||||
error - The property 'cover' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:208:38 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:209:25 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:209:61 - unchecked_use_of_nullable_value
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:7:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../widgets/tv_focusable.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:8:8 - uri_does_not_exist
|
||||
error - Undefined class 'MobileSettings' - lib\features\iptv\widgets\mobile_settings_tab.dart:44:25 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:63:32 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:124:23 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:143:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:162:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:180:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:193:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:206:25 - undefined_identifier
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:334:14 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_settings_tab.dart:376:44 - deprecated_member_use
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:410:14 - undefined_method
|
||||
warning - Unused import: 'package:hive_flutter/hive_flutter.dart' - lib\main.dart:3:8 - unused_import
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\theme\mobile_theme.dart:60:50 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:56:24 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:58:58 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:61:43 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:131:32 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:248:36 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:253:41 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:160:34 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:166:34 - deprecated_member_use
|
||||
error - The name 'MyApp' isn't a class - test\widget_test.dart:16:35 - creation_with_non_type
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,144 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
import '../database/database.dart';
|
||||
|
||||
class AuthHandler {
|
||||
final AppDatabase db;
|
||||
|
||||
AuthHandler(this.db);
|
||||
|
||||
Router get router {
|
||||
final router = Router();
|
||||
|
||||
router.post('/login', _login);
|
||||
router.post('/logout', _logout);
|
||||
router.get('/me', _getCurrentUser);
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
/// POST /api/auth/login
|
||||
Future<Response> _login(Request request) async {
|
||||
try {
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final username = payload['username'] as String?;
|
||||
final password = payload['password'] as String?;
|
||||
|
||||
if (username == null || password == null) {
|
||||
return Response(400, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Username and password are required',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
// Verify credentials
|
||||
final user = db.verifyCredentials(username, password);
|
||||
if (user == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Invalid credentials',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
// Create session
|
||||
final session = db.createSession(user.id);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
'user': user.toJson(),
|
||||
'token': session.token,
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// POST /api/auth/logout
|
||||
Future<Response> _logout(Request request) async {
|
||||
try {
|
||||
final token = _extractToken(request);
|
||||
if (token == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
db.deleteSession(token);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// GET /api/auth/me
|
||||
Future<Response> _getCurrentUser(Request request) async {
|
||||
try {
|
||||
final token = _extractToken(request);
|
||||
if (token == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final session = db.findSessionByToken(token);
|
||||
if (session == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Invalid or expired session',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final user = db.findUserById(session.userId);
|
||||
if (user == null) {
|
||||
return Response(404, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'User not found',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'user': user.toJson(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Extract token from Authorization header or cookie
|
||||
String? _extractToken(Request request) {
|
||||
// Try Authorization header first
|
||||
final authHeader = request.headers['authorization'];
|
||||
if (authHeader != null && authHeader.startsWith('Bearer ')) {
|
||||
return authHeader.substring(7);
|
||||
}
|
||||
|
||||
// Try cookie
|
||||
final cookie = request.headers['cookie'];
|
||||
if (cookie != null) {
|
||||
final parts = cookie.split(';');
|
||||
for (final part in parts) {
|
||||
final trimmed = part.trim();
|
||||
if (trimmed.startsWith('session=')) {
|
||||
return trimmed.substring(8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
import '../database/database.dart';
|
||||
|
||||
class PlaylistsHandler {
|
||||
final AppDatabase db;
|
||||
|
||||
PlaylistsHandler(this.db);
|
||||
|
||||
Router get router {
|
||||
final router = Router();
|
||||
|
||||
router.get('/', _getPlaylists);
|
||||
router.post('/', _createPlaylist);
|
||||
router.put('/<id>', _updatePlaylist);
|
||||
router.delete('/<id>', _deletePlaylist);
|
||||
|
||||
return router;
|
||||
}
|
||||
|
||||
/// GET /api/playlists
|
||||
Future<Response> _getPlaylists(Request request) async {
|
||||
try {
|
||||
final userId = request.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final playlists = db.getPlaylists(userId);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'playlists': playlists.map((p) => p.toJson()).toList(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// POST /api/playlists
|
||||
Future<Response> _createPlaylist(Request request) async {
|
||||
try {
|
||||
final userId = request.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final name = payload['name'] as String?;
|
||||
final serverUrl = payload['serverUrl'] as String?;
|
||||
final username = payload['username'] as String?;
|
||||
final password = payload['password'] as String?;
|
||||
final dns = payload['dns'] as String?;
|
||||
|
||||
if (name == null || serverUrl == null || username == null || password == null) {
|
||||
return Response(400, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Missing required fields',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final playlist = db.createPlaylist(
|
||||
userId: userId,
|
||||
name: name,
|
||||
serverUrl: serverUrl,
|
||||
username: username,
|
||||
password: password,
|
||||
dns: dns ?? serverUrl,
|
||||
);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
'playlist': playlist.toJson(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// PUT /api/playlists/:id
|
||||
Future<Response> _updatePlaylist(Request request, String id) async {
|
||||
try {
|
||||
final userId = request.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
// Verify playlist belongs to user
|
||||
final existing = db.getPlaylistById(id);
|
||||
if (existing == null) {
|
||||
return Response(404, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Playlist not found',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
if (existing.userId != userId) {
|
||||
return Response(403, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Forbidden',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final name = payload['name'] as String? ?? existing.name;
|
||||
final serverUrl = payload['serverUrl'] as String? ?? existing.serverUrl;
|
||||
final username = payload['username'] as String? ?? existing.username;
|
||||
final password = payload['password'] as String? ?? existing.password;
|
||||
final dns = payload['dns'] as String? ?? existing.dns;
|
||||
|
||||
final playlist = db.updatePlaylist(
|
||||
playlistId: id,
|
||||
name: name,
|
||||
serverUrl: serverUrl,
|
||||
username: username,
|
||||
password: password,
|
||||
dns: dns,
|
||||
);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
'playlist': playlist.toJson(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// DELETE /api/playlists/:id
|
||||
Future<Response> _deletePlaylist(Request request, String id) async {
|
||||
try {
|
||||
final userId = request.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response(401, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Unauthorized',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
// Verify playlist belongs to user
|
||||
final existing = db.getPlaylistById(id);
|
||||
if (existing == null) {
|
||||
return Response(404,body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Playlist not found',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
if (existing.userId != userId) {
|
||||
return Response(403, body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Forbidden',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
db.deletePlaylist(id);
|
||||
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
import '../database/database.dart';
|
||||
|
||||
class SettingsHandler {
|
||||
final AppDatabase db;
|
||||
|
||||
SettingsHandler(this.db);
|
||||
|
||||
Router get router {
|
||||
final router = Router();
|
||||
|
||||
// GET /api/settings
|
||||
router.get('/', (Request req) {
|
||||
// Get userId from context (set by auth middleware)
|
||||
final userId = req.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response.forbidden(jsonEncode({'error': 'Authentication required'}));
|
||||
}
|
||||
|
||||
final settingsJson = db.getUserSettings(userId);
|
||||
|
||||
// If no settings exist, return empty object or default
|
||||
return Response.ok(
|
||||
settingsJson ?? '{}',
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
});
|
||||
|
||||
// POST /api/settings
|
||||
router.post('/', (Request req) async {
|
||||
// Get userId from context (set by auth middleware)
|
||||
final userId = req.context['userId'] as String?;
|
||||
if (userId == null) {
|
||||
return Response.forbidden(jsonEncode({'error': 'Authentication required'}));
|
||||
}
|
||||
|
||||
try {
|
||||
final body = await req.readAsString();
|
||||
// Validate JSON
|
||||
try {
|
||||
jsonDecode(body);
|
||||
} catch (e) {
|
||||
return Response.badRequest(body: jsonEncode({'error': 'Invalid JSON'}));
|
||||
}
|
||||
|
||||
db.updateUserSettings(userId, body);
|
||||
|
||||
return Response.ok(
|
||||
body,
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'error': 'Failed to save settings: $e'}),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
import '../database/database.dart';
|
||||
|
||||
class UsersHandler {
|
||||
final AppDatabase db;
|
||||
|
||||
UsersHandler(this.db);
|
||||
|
||||
Router get router {
|
||||
final router = Router();
|
||||
router.get('/', _getAllUsers);
|
||||
router.post('/', _createUser);
|
||||
router.put('/<id>/password', _updatePassword);
|
||||
router.put('/<id>', _updateUser);
|
||||
router.delete('/<id>', _deleteUser);
|
||||
return router;
|
||||
}
|
||||
|
||||
/// Check if requester is admin
|
||||
bool _isAdmin(Request request) {
|
||||
final userId = request.context['userId'] as String?;
|
||||
if (userId == null) return false;
|
||||
final user = db.findUserById(userId);
|
||||
return user?.isAdmin ?? false;
|
||||
}
|
||||
|
||||
/// GET /api/users
|
||||
Future<Response> _getAllUsers(Request request) async {
|
||||
try {
|
||||
if (!_isAdmin(request)) {
|
||||
return Response.forbidden(jsonEncode({'success': false, 'error': 'Admin required'}));
|
||||
}
|
||||
|
||||
final users = db.getAllUsers();
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
'users': users.map((u) => u.toJson()).toList(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// POST /api/users
|
||||
Future<Response> _createUser(Request request) async {
|
||||
try {
|
||||
if (!_isAdmin(request)) {
|
||||
return Response.forbidden(jsonEncode({'success': false, 'error': 'Admin required'}));
|
||||
}
|
||||
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final username = payload['username'] as String?;
|
||||
final password = payload['password'] as String?;
|
||||
final isAdmin = payload['isAdmin'] as bool? ?? false;
|
||||
|
||||
if (username == null || password == null) {
|
||||
return Response.badRequest(body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Missing required fields',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
if (db.findUserByUsername(username) != null) {
|
||||
return Response.badRequest(body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Username already exists',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
final user = db.createUser(username, password, isAdmin: isAdmin);
|
||||
return Response.ok(jsonEncode({
|
||||
'success': true,
|
||||
'user': user.toJson(),
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// PUT /api/users/:id/password
|
||||
Future<Response> _updatePassword(Request request, String id) async {
|
||||
try {
|
||||
if (!_isAdmin(request)) {
|
||||
return Response.forbidden(jsonEncode({'success': false, 'error': 'Admin required'}));
|
||||
}
|
||||
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final password = payload['password'] as String?;
|
||||
|
||||
if (password == null) {
|
||||
return Response.badRequest(body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Missing password',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
db.updateUserPassword(id, password);
|
||||
return Response.ok(jsonEncode({'success': true}), headers: {'Content-Type': 'application/json'});
|
||||
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// PUT /api/users/:id (Toggle Admin)
|
||||
Future<Response> _updateUser(Request request, String id) async {
|
||||
try {
|
||||
if (!_isAdmin(request)) {
|
||||
return Response.forbidden(jsonEncode({'success': false, 'error': 'Admin required'}));
|
||||
}
|
||||
|
||||
final payload = jsonDecode(await request.readAsString()) as Map<String, dynamic>;
|
||||
final isAdmin = payload['isAdmin'] as bool?;
|
||||
|
||||
if (isAdmin != null) {
|
||||
db.updateUserAdminStatus(id, isAdmin);
|
||||
}
|
||||
|
||||
return Response.ok(jsonEncode({'success': true}), headers: {'Content-Type': 'application/json'});
|
||||
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// DELETE /api/users/:id
|
||||
Future<Response> _deleteUser(Request request, String id) async {
|
||||
try {
|
||||
if (!_isAdmin(request)) {
|
||||
return Response.forbidden(jsonEncode({'success': false, 'error': 'Admin required'}));
|
||||
}
|
||||
|
||||
// Prevent deleting self
|
||||
final currentUserId = request.context['userId'] as String;
|
||||
if (currentUserId == id) {
|
||||
return Response.badRequest(body: jsonEncode({
|
||||
'success': false,
|
||||
'error': 'Cannot delete yourself',
|
||||
}), headers: {'Content-Type': 'application/json'},);
|
||||
}
|
||||
|
||||
db.deleteUser(id);
|
||||
return Response.ok(jsonEncode({'success': true}), headers: {'Content-Type': 'application/json'});
|
||||
} catch (e) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'success': false, 'error': e.toString()}),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,380 +0,0 @@
|
||||
import 'dart:io';
|
||||
import 'package:sqlite3/sqlite3.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import '../models/user.dart';
|
||||
import '../models/playlist.dart';
|
||||
import '../models/session.dart' as models;
|
||||
import '../utils/password_hasher.dart';
|
||||
|
||||
class AppDatabase {
|
||||
late final Database _db;
|
||||
final _uuid = const Uuid();
|
||||
|
||||
/// Initialize database and create tables
|
||||
Future<void> init() async {
|
||||
const dbPath = '/app/data/xtremflow.db';
|
||||
|
||||
// Ensure data directory exists
|
||||
final dir = Directory('/app/data');
|
||||
if (!await dir.exists()) {
|
||||
await dir.create(recursive: true);
|
||||
}
|
||||
|
||||
_db = sqlite3.open(dbPath);
|
||||
|
||||
await _createTables();
|
||||
print('Database initialized: $dbPath');
|
||||
}
|
||||
|
||||
/// Create database tables
|
||||
Future<void> _createTables() async {
|
||||
// Users table
|
||||
_db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id TEXT PRIMARY KEY,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL,
|
||||
is_admin INTEGER DEFAULT 0,
|
||||
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
''');
|
||||
|
||||
// Playlists table
|
||||
_db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS playlists (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
server_url TEXT NOT NULL,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
dns TEXT,
|
||||
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
)
|
||||
''');
|
||||
|
||||
// Sessions table
|
||||
_db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
token TEXT UNIQUE NOT NULL,
|
||||
expires_at TEXT NOT NULL,
|
||||
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
)
|
||||
''');
|
||||
|
||||
// User Settings table
|
||||
_db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS user_settings (
|
||||
user_id TEXT PRIMARY KEY,
|
||||
settings_json TEXT NOT NULL,
|
||||
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
)
|
||||
''');
|
||||
|
||||
// Indexes
|
||||
_db.execute(
|
||||
'CREATE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token)',
|
||||
);
|
||||
_db.execute(
|
||||
'CREATE INDEX IF NOT EXISTS idx_sessions_expires ON sessions(expires_at)',
|
||||
);
|
||||
_db.execute(
|
||||
'CREATE INDEX IF NOT EXISTS idx_playlists_user ON playlists(user_id)',
|
||||
);
|
||||
}
|
||||
|
||||
/// Seed default admin user if no users exist
|
||||
Future<void> seedAdmin() async {
|
||||
final result = _db.select('SELECT COUNT(*) as count FROM users');
|
||||
final count = result.first['count'] as int;
|
||||
|
||||
if (count == 0) {
|
||||
final adminId = _uuid.v4();
|
||||
final passwordHash = PasswordHasher.hash('admin');
|
||||
|
||||
_db.execute(
|
||||
'''
|
||||
INSERT INTO users (id, username, password_hash, is_admin)
|
||||
VALUES (?, ?, ?, 1)
|
||||
''',
|
||||
[adminId, 'admin', passwordHash],
|
||||
);
|
||||
|
||||
print('Default admin user created (username: admin, password: admin)');
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== Users ====================
|
||||
|
||||
/// Find user by username
|
||||
User? findUserByUsername(String username) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM users WHERE username = ?',
|
||||
[username],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
return User.fromMap(result.first);
|
||||
}
|
||||
|
||||
/// Find user by ID
|
||||
User? findUserById(String userId) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM users WHERE id = ?',
|
||||
[userId],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
return User.fromMap(result.first);
|
||||
}
|
||||
|
||||
/// Verify user credentials
|
||||
User? verifyCredentials(String username, String password) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM users WHERE username = ?',
|
||||
[username],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
|
||||
final passwordHash = result.first['password_hash'] as String;
|
||||
if (!PasswordHasher.verify(password, passwordHash)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return User.fromMap(result.first);
|
||||
}
|
||||
|
||||
/// Create new user
|
||||
User createUser(String username, String password, {bool isAdmin = false}) {
|
||||
final userId = _uuid.v4();
|
||||
final passwordHash = PasswordHasher.hash(password);
|
||||
|
||||
_db.execute(
|
||||
'''
|
||||
INSERT INTO users (id, username, password_hash, is_admin)
|
||||
VALUES (?, ?, ?, ?)
|
||||
''',
|
||||
[userId, username, passwordHash, isAdmin ? 1 : 0],
|
||||
);
|
||||
|
||||
return User(
|
||||
id: userId,
|
||||
username: username,
|
||||
isAdmin: isAdmin,
|
||||
createdAt: DateTime.now(),
|
||||
);
|
||||
}
|
||||
|
||||
/// Get all users
|
||||
List<User> getAllUsers() {
|
||||
final result = _db.select('SELECT * FROM users ORDER BY username ASC');
|
||||
return result.map((row) => User.fromMap(row)).toList();
|
||||
}
|
||||
|
||||
/// Update user password
|
||||
void updateUserPassword(String userId, String newPassword) {
|
||||
final passwordHash = PasswordHasher.hash(newPassword);
|
||||
_db.execute(
|
||||
'UPDATE users SET password_hash = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
|
||||
[passwordHash, userId],
|
||||
);
|
||||
}
|
||||
|
||||
/// Update user administration status
|
||||
void updateUserAdminStatus(String userId, bool isAdmin) {
|
||||
_db.execute(
|
||||
'UPDATE users SET is_admin = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
|
||||
[isAdmin ? 1 : 0, userId],
|
||||
);
|
||||
}
|
||||
|
||||
/// Delete user
|
||||
void deleteUser(String userId) {
|
||||
_db.execute('DELETE FROM users WHERE id = ?', [userId]);
|
||||
}
|
||||
|
||||
// ==================== Sessions ====================
|
||||
|
||||
/// Create new session
|
||||
models.Session createSession(String userId, {Duration? duration}) {
|
||||
final sessionId = _uuid.v4();
|
||||
final token = _uuid.v4();
|
||||
final expiresAt = DateTime.now().add(duration ?? const Duration(days: 7));
|
||||
|
||||
_db.execute(
|
||||
'''
|
||||
INSERT INTO sessions (id, user_id, token, expires_at)
|
||||
VALUES (?, ?, ?, ?)
|
||||
''',
|
||||
[sessionId, userId, token, expiresAt.toIso8601String()],
|
||||
);
|
||||
|
||||
return models.Session(
|
||||
id: sessionId,
|
||||
userId: userId,
|
||||
token: token,
|
||||
expiresAt: expiresAt,
|
||||
createdAt: DateTime.now(),
|
||||
);
|
||||
}
|
||||
|
||||
/// Find session by token
|
||||
models.Session? findSessionByToken(String token) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM sessions WHERE token = ?',
|
||||
[token],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
|
||||
final session = models.Session.fromMap(result.first);
|
||||
|
||||
// Check if expired
|
||||
if (session.isExpired) {
|
||||
deleteSession(token);
|
||||
return null;
|
||||
}
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
/// Delete session (logout)
|
||||
void deleteSession(String token) {
|
||||
_db.execute('DELETE FROM sessions WHERE token = ?', [token]);
|
||||
}
|
||||
|
||||
/// Clean expired sessions
|
||||
void cleanExpiredSessions() {
|
||||
_db.execute(
|
||||
'DELETE FROM sessions WHERE expires_at < ?',
|
||||
[DateTime.now().toIso8601String()],
|
||||
);
|
||||
}
|
||||
|
||||
// ==================== Playlists ====================
|
||||
|
||||
/// Get all playlists for a user
|
||||
List<Playlist> getPlaylists(String userId) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM playlists WHERE user_id = ? ORDER BY created_at DESC',
|
||||
[userId],
|
||||
);
|
||||
|
||||
return result.map((row) => Playlist.fromMap(row)).toList();
|
||||
}
|
||||
|
||||
/// Get playlist by ID
|
||||
Playlist? getPlaylistById(String playlistId) {
|
||||
final result = _db.select(
|
||||
'SELECT * FROM playlists WHERE id = ?',
|
||||
[playlistId],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
return Playlist.fromMap(result.first);
|
||||
}
|
||||
|
||||
/// Create new playlist
|
||||
Playlist createPlaylist({
|
||||
required String userId,
|
||||
required String name,
|
||||
required String serverUrl,
|
||||
required String username,
|
||||
required String password,
|
||||
String? dns,
|
||||
}) {
|
||||
final playlistId = _uuid.v4();
|
||||
final now = DateTime.now().toIso8601String();
|
||||
|
||||
_db.execute(
|
||||
'''
|
||||
INSERT INTO playlists (id, user_id, name, server_url, username, password, dns, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
''',
|
||||
[playlistId, userId, name, serverUrl, username, password, dns, now, now],
|
||||
);
|
||||
|
||||
return Playlist(
|
||||
id: playlistId,
|
||||
userId: userId,
|
||||
name: name,
|
||||
serverUrl: serverUrl,
|
||||
username: username,
|
||||
password: password,
|
||||
dns: dns,
|
||||
createdAt: DateTime.parse(now),
|
||||
updatedAt: DateTime.parse(now),
|
||||
);
|
||||
}
|
||||
|
||||
/// Update playlist
|
||||
Playlist updatePlaylist({
|
||||
required String playlistId,
|
||||
required String name,
|
||||
required String serverUrl,
|
||||
required String username,
|
||||
required String password,
|
||||
String? dns,
|
||||
}) {
|
||||
final now = DateTime.now().toIso8601String();
|
||||
|
||||
_db.execute(
|
||||
'''
|
||||
UPDATE playlists
|
||||
SET name = ?, server_url = ?, username = ?, password = ?, dns = ?, updated_at = ?
|
||||
WHERE id = ?
|
||||
''',
|
||||
[name, serverUrl, username, password, dns, now, playlistId],
|
||||
);
|
||||
|
||||
return getPlaylistById(playlistId)!;
|
||||
}
|
||||
|
||||
/// Delete playlist
|
||||
void deletePlaylist(String playlistId) {
|
||||
_db.execute('DELETE FROM playlists WHERE id = ?', [playlistId]);
|
||||
}
|
||||
|
||||
// ==================== User Settings ====================
|
||||
|
||||
/// Get user settings as JSON string
|
||||
String? getUserSettings(String userId) {
|
||||
final result = _db.select(
|
||||
'SELECT settings_json FROM user_settings WHERE user_id = ?',
|
||||
[userId],
|
||||
);
|
||||
|
||||
if (result.isEmpty) return null;
|
||||
return result.first['settings_json'] as String;
|
||||
}
|
||||
|
||||
/// Update user settings
|
||||
void updateUserSettings(String userId, String settingsJson) {
|
||||
final now = DateTime.now().toIso8601String();
|
||||
|
||||
// UPSERT (Insert or Replace)
|
||||
_db.execute(
|
||||
'''
|
||||
INSERT INTO user_settings (user_id, settings_json, updated_at)
|
||||
VALUES (?, ?, ?)
|
||||
ON CONFLICT(user_id) DO UPDATE SET
|
||||
settings_json = excluded.settings_json,
|
||||
updated_at = excluded.updated_at
|
||||
''',
|
||||
[userId, settingsJson, now],
|
||||
);
|
||||
}
|
||||
|
||||
/// Close database connection
|
||||
void close() {
|
||||
_db.dispose();
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
import 'package:shelf/shelf.dart';
|
||||
import '../database/database.dart';
|
||||
|
||||
/// Middleware to authenticate requests
|
||||
Middleware authMiddleware(AppDatabase db) {
|
||||
return (Handler handler) {
|
||||
return (Request request) async {
|
||||
// Skip auth for login endpoint
|
||||
if (request.url.path.startsWith('api/auth/login')) {
|
||||
return handler(request);
|
||||
}
|
||||
|
||||
// Extract token
|
||||
final token = _extractToken(request);
|
||||
if (token == null) {
|
||||
return Response(401, body: 'Unauthorized');
|
||||
}
|
||||
|
||||
// Verify session
|
||||
final session = db.findSessionByToken(token);
|
||||
if (session == null) {
|
||||
return Response(401, body: 'Invalid or expired session');
|
||||
}
|
||||
|
||||
// Add userId to context
|
||||
final updatedRequest = request.change(context: {
|
||||
...request.context,
|
||||
'userId': session.userId,
|
||||
},);
|
||||
|
||||
return handler(updatedRequest);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// Extract token from Authorization header or cookie
|
||||
String? _extractToken(Request request) {
|
||||
// Try Authorization header first
|
||||
final authHeader = request.headers['authorization'];
|
||||
if (authHeader != null && authHeader.startsWith('Bearer ')) {
|
||||
return authHeader.substring(7);
|
||||
}
|
||||
|
||||
// Try cookie
|
||||
final cookie = request.headers['cookie'];
|
||||
if (cookie != null) {
|
||||
final parts = cookie.split(';');
|
||||
for (final part in parts) {
|
||||
final trimmed = part.trim();
|
||||
if (trimmed.startsWith('session=')) {
|
||||
return trimmed.substring(8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'dart:async';
|
||||
|
||||
/// Security Middleware Collection
|
||||
///
|
||||
/// Includes:
|
||||
/// - Honeypot Routes (Trap for bots)
|
||||
/// - Security Headers (HSTS, XSS Protection)
|
||||
/// - Rate Limiting (Basic DoS protection)
|
||||
|
||||
/// 1. Security Headers Middleware
|
||||
/// Adds standard security headers to every response.
|
||||
Middleware securityHeadersMiddleware() {
|
||||
return (Handler handler) {
|
||||
return (Request request) async {
|
||||
final response = await handler(request);
|
||||
|
||||
return response.change(headers: {
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Frame-Options': 'SAMEORIGIN', // Changed from DENY to allow embedding player.html
|
||||
'X-XSS-Protection': '1; mode=block',
|
||||
'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload',
|
||||
'Referrer-Policy': 'strict-origin-when-cross-origin',
|
||||
// Note: CSP is tricky with Flutter Web (requires 'unsafe-eval' for Dart),
|
||||
// so we omit it here to avoid breaking the app, or use a permissive one.
|
||||
},);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// 2. Honeypot Middleware
|
||||
/// Intercepts requests to common vulnerability scanning paths.
|
||||
/// Returns a 403 Forbidden immediately and logs the incident.
|
||||
Middleware honeypotMiddleware() {
|
||||
// list of common bot targets
|
||||
const honeypotPaths = [
|
||||
'/admin/phpmyadmin',
|
||||
'/phpmyadmin',
|
||||
'/wp-admin',
|
||||
'/wp-login.php',
|
||||
'/.env',
|
||||
'/config.php',
|
||||
'/api/.env',
|
||||
'/console',
|
||||
'/actuator/health',
|
||||
];
|
||||
|
||||
return (Handler handler) {
|
||||
return (Request request) {
|
||||
final path = request.url.path;
|
||||
|
||||
// Check if path contains any honeypot target
|
||||
for (final trap in honeypotPaths) {
|
||||
if (path.contains(trap.replaceAll('/', ''))) { // Simple check
|
||||
print('SECURITY ALERT: Honeypot triggered by ${request.context['clientIp'] ?? 'unknown IP'} on path: $path');
|
||||
return Response.forbidden('Access Denied');
|
||||
}
|
||||
}
|
||||
|
||||
return handler(request);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// 3. Rate Limit Middleware (In-Memory)
|
||||
/// Limits requests per IP address.
|
||||
/// Default: 100 requests per minute per IP.
|
||||
Middleware rateLimitMiddleware({int requestsPerMinute = 200}) {
|
||||
final clientRequests = <String, List<DateTime>>{};
|
||||
|
||||
// Cleanup timer to remove old entries and prevent memory leaks
|
||||
Timer.periodic(const Duration(minutes: 5), (_) {
|
||||
final now = DateTime.now();
|
||||
clientRequests.removeWhere((_, times) {
|
||||
// Remove timestamps older than 1 minute
|
||||
times.removeWhere((t) => now.difference(t).inMinutes > 1);
|
||||
return times.isEmpty;
|
||||
});
|
||||
});
|
||||
|
||||
return (Handler handler) {
|
||||
return (Request request) {
|
||||
// Identify client by IP (passed from main server or headers)
|
||||
// Note: In real prod behind Nginx, use X-Forwarded-For
|
||||
// Here we assume direct or standard setup.
|
||||
final clientIp = (request.context['clientIp'] as String?) ?? 'unknown';
|
||||
|
||||
if (clientIp != 'unknown' && clientIp != '127.0.0.1') {
|
||||
final now = DateTime.now();
|
||||
|
||||
// Get or create history for this IP
|
||||
final history = clientRequests.putIfAbsent(clientIp, () => []);
|
||||
|
||||
// Clean old requests (older than 1 minute)
|
||||
history.removeWhere((t) => now.difference(t).inMinutes >= 1);
|
||||
|
||||
// Check limit
|
||||
if (history.length >= requestsPerMinute) {
|
||||
print('SECURITY WARN: Rate limit exceeded for $clientIp');
|
||||
return Response(429, body: 'Too Many Requests');
|
||||
}
|
||||
|
||||
// Add current request
|
||||
history.add(now);
|
||||
}
|
||||
|
||||
return handler(request);
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
class Playlist {
|
||||
final String id;
|
||||
final String userId;
|
||||
final String name;
|
||||
final String serverUrl;
|
||||
final String username;
|
||||
final String password;
|
||||
final String? dns;
|
||||
final DateTime createdAt;
|
||||
final DateTime updatedAt;
|
||||
|
||||
Playlist({
|
||||
required this.id,
|
||||
required this.userId,
|
||||
required this.name,
|
||||
required this.serverUrl,
|
||||
required this.username,
|
||||
required this.password,
|
||||
this.dns,
|
||||
required this.createdAt,
|
||||
required this.updatedAt,
|
||||
});
|
||||
|
||||
factory Playlist.fromMap(Map<String, dynamic> map) {
|
||||
return Playlist(
|
||||
id: map['id'] as String,
|
||||
userId: map['user_id'] as String,
|
||||
name: map['name'] as String,
|
||||
serverUrl: map['server_url'] as String,
|
||||
username: map['username'] as String,
|
||||
password: map['password'] as String,
|
||||
dns: map['dns'] as String?,
|
||||
createdAt: DateTime.parse(map['created_at'] as String),
|
||||
updatedAt: DateTime.parse(map['updated_at'] as String),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'userId': userId,
|
||||
'name': name,
|
||||
'serverUrl': serverUrl,
|
||||
'username': username,
|
||||
'password': password,
|
||||
'dns': dns,
|
||||
'createdAt': createdAt.toIso8601String(),
|
||||
'updatedAt': updatedAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'id': id,
|
||||
'user_id': userId,
|
||||
'name': name,
|
||||
'server_url': serverUrl,
|
||||
'username': username,
|
||||
'password': password,
|
||||
'dns': dns,
|
||||
'created_at': createdAt.toIso8601String(),
|
||||
'updated_at': updatedAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
class Session {
|
||||
final String id;
|
||||
final String userId;
|
||||
final String token;
|
||||
final DateTime expiresAt;
|
||||
final DateTime createdAt;
|
||||
|
||||
Session({
|
||||
required this.id,
|
||||
required this.userId,
|
||||
required this.token,
|
||||
required this.expiresAt,
|
||||
required this.createdAt,
|
||||
});
|
||||
|
||||
factory Session.fromMap(Map<String, dynamic> map) {
|
||||
return Session(
|
||||
id: map['id'] as String,
|
||||
userId: map['user_id'] as String,
|
||||
token: map['token'] as String,
|
||||
expiresAt: DateTime.parse(map['expires_at'] as String),
|
||||
createdAt: DateTime.parse(map['created_at'] as String),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'id': id,
|
||||
'user_id': userId,
|
||||
'token': token,
|
||||
'expires_at': expiresAt.toIso8601String(),
|
||||
'created_at': createdAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
|
||||
bool get isExpired => DateTime.now().isAfter(expiresAt);
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
class User {
|
||||
final String id;
|
||||
final String username;
|
||||
final bool isAdmin;
|
||||
final DateTime createdAt;
|
||||
|
||||
User({
|
||||
required this.id,
|
||||
required this.username,
|
||||
required this.isAdmin,
|
||||
required this.createdAt,
|
||||
});
|
||||
|
||||
factory User.fromMap(Map<String, dynamic> map) {
|
||||
return User(
|
||||
id: map['id'] as String,
|
||||
username: map['username'] as String,
|
||||
isAdmin: (map['is_admin'] as int) == 1,
|
||||
createdAt: DateTime.parse(map['created_at'] as String),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'username': username,
|
||||
'isAdmin': isAdmin,
|
||||
'createdAt': createdAt.toIso8601String(),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
name: xtremflow_server
|
||||
description: Backend server with API proxy
|
||||
publish_to: 'none'
|
||||
version: 1.0.0+1
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
|
||||
dependencies:
|
||||
shelf: ^1.4.1
|
||||
shelf_static: ^1.1.2
|
||||
shelf_router: ^1.1.4
|
||||
http: ^1.2.0
|
||||
args: ^2.4.2
|
||||
sqlite3: ^2.4.0
|
||||
crypto: ^3.0.3
|
||||
uuid: ^4.3.3
|
||||
-761
@@ -1,761 +0,0 @@
|
||||
import 'dart:io';
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf/shelf_io.dart' as shelf_io;
|
||||
import 'package:shelf_static/shelf_static.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:args/args.dart';
|
||||
import 'database/database.dart';
|
||||
import 'models/user.dart';
|
||||
import 'api/auth_handler.dart';
|
||||
import 'api/users_handler.dart';
|
||||
import 'api/auth_handler.dart';
|
||||
import 'api/users_handler.dart';
|
||||
import 'api/playlists_handler.dart';
|
||||
import 'api/settings_handler.dart';
|
||||
import 'middleware/auth_middleware.dart';
|
||||
import 'middleware/security_middleware.dart';
|
||||
import 'services/cleanup_service.dart';
|
||||
|
||||
void main(List<String> args) async {
|
||||
// Parse command line arguments
|
||||
final parser = ArgParser()
|
||||
..addOption('port', abbr: 'p', defaultsTo: '8089')
|
||||
..addOption('path', defaultsTo: '/app/web');
|
||||
|
||||
final result = parser.parse(args);
|
||||
final port = int.parse(result['port']);
|
||||
final webPath = result['path'];
|
||||
|
||||
// Initialize database
|
||||
final db = AppDatabase();
|
||||
await db.init();
|
||||
await db.seedAdmin();
|
||||
|
||||
// Create API handlers
|
||||
final authHandler = AuthHandler(db);
|
||||
final playlistsHandler = PlaylistsHandler(db);
|
||||
final usersHandler = UsersHandler(db);
|
||||
final settingsHandler = SettingsHandler(db);
|
||||
|
||||
// Setup router
|
||||
final apiRouter = Router()
|
||||
// Auth endpoints (no auth middleware) - full path including /api/
|
||||
..mount('/api/auth', authHandler.router)
|
||||
// Playlists endpoints (with auth middleware)
|
||||
..mount(
|
||||
'/api/playlists',
|
||||
const Pipeline()
|
||||
.addMiddleware(authMiddleware(db))
|
||||
.addHandler(playlistsHandler.router.call),
|
||||
)
|
||||
// Users endpoints (with auth middleware)
|
||||
..mount(
|
||||
'/api/users',
|
||||
const Pipeline()
|
||||
.addMiddleware(authMiddleware(db))
|
||||
.addHandler(usersHandler.router.call),
|
||||
)
|
||||
// Settings endpoints (with auth middleware)
|
||||
..mount(
|
||||
'/api/settings',
|
||||
const Pipeline()
|
||||
.addMiddleware(authMiddleware(db))
|
||||
.addHandler(settingsHandler.router.call),
|
||||
);
|
||||
|
||||
// Initialize Cleanup Service
|
||||
final cleanupService = CleanupService();
|
||||
// Target system temp directory (often used by FFmpeg/Dart)
|
||||
cleanupService.addTarget(Directory.systemTemp);
|
||||
// Target local logs/cache if they exist
|
||||
cleanupService.addTarget(Directory('/app/data/logs'));
|
||||
cleanupService.addTarget(Directory('/app/data/tmp'));
|
||||
|
||||
cleanupService.start();
|
||||
|
||||
// Admin Routes (protected)
|
||||
apiRouter.mount(
|
||||
'/api/admin',
|
||||
const Pipeline()
|
||||
.addMiddleware(authMiddleware(db))
|
||||
.addHandler((Request request) {
|
||||
final router = Router();
|
||||
|
||||
// POST /api/admin/purge
|
||||
router.post('/purge', (Request req) async {
|
||||
final user = req.context['user'] as User?;
|
||||
if (user == null || !user.isAdmin) {
|
||||
return Response.forbidden(
|
||||
jsonEncode({'error': 'Admin access required'}),
|
||||
);
|
||||
}
|
||||
|
||||
final result = await cleanupService.runCleanup();
|
||||
return Response.ok(
|
||||
jsonEncode(result),
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
});
|
||||
|
||||
return router(request);
|
||||
}),
|
||||
);
|
||||
|
||||
// Create handlers
|
||||
// Create static handler
|
||||
final baseStaticHandler = createStaticHandler(
|
||||
webPath,
|
||||
defaultDocument: 'index.html',
|
||||
listDirectories: false,
|
||||
);
|
||||
|
||||
// Wrap static handler to enforce cache policies
|
||||
FutureOr<Response> staticHandler(Request request) async {
|
||||
final response = await baseStaticHandler(request);
|
||||
|
||||
// Disable cache for entry points to ensure updates are seen immediately
|
||||
final path = request.url.path;
|
||||
if (path.isEmpty ||
|
||||
path == 'index.html' ||
|
||||
path.endsWith(
|
||||
'.js',
|
||||
) || // Disable cache for ALL JS files (main.dart.js, bootstrap, etc)
|
||||
path.endsWith('.json')) {
|
||||
// version.json etc
|
||||
return response.change(
|
||||
headers: {
|
||||
'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
|
||||
'Pragma': 'no-cache',
|
||||
'Expires': '0',
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// Allow aggressive caching for hashed assets (images, compiled JS)
|
||||
// Flutter web builds usually hash main.dart.js, but let's be safe with 1 day
|
||||
return response.change(
|
||||
headers: {
|
||||
'Cache-Control': 'public, max-age=86400',
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// Main handler with API proxy and FFmpeg streaming
|
||||
final handler = Cascade()
|
||||
.add(_createApiHandler(apiRouter))
|
||||
.add(_createStreamHandler()) // FFmpeg streaming endpoint
|
||||
.add(_createXtreamProxyHandler())
|
||||
// .add(_createHlsHandler()) // REMOVED: HLS obsolete with direct stream
|
||||
.add(staticHandler)
|
||||
.handler;
|
||||
|
||||
// Add middleware
|
||||
final pipeline = const Pipeline()
|
||||
.addMiddleware(logRequests())
|
||||
.addMiddleware(securityHeadersMiddleware()) // Basic Headers
|
||||
.addMiddleware(honeypotMiddleware()) // Trap Bots
|
||||
.addMiddleware(rateLimitMiddleware()) // Anti-DoS
|
||||
.addMiddleware(_corsMiddleware())
|
||||
.addHandler(handler);
|
||||
|
||||
// Start server
|
||||
final server = await shelf_io.serve(
|
||||
pipeline,
|
||||
InternetAddress.anyIPv4,
|
||||
port,
|
||||
);
|
||||
|
||||
print('Server started on port ${server.port}');
|
||||
print('Serving static files from: $webPath');
|
||||
print('REST API available at: /api/auth/* and /api/playlists/*');
|
||||
print('Xtream proxy available at: /api/xtream/*');
|
||||
print('FFmpeg streaming available at: /api/stream/*');
|
||||
|
||||
// Clean expired sessions periodically (every hour)
|
||||
Timer.periodic(const Duration(hours: 1), (_) {
|
||||
db.cleanExpiredSessions();
|
||||
print('Cleaned expired sessions');
|
||||
});
|
||||
}
|
||||
|
||||
/// Create API handler
|
||||
Handler _createApiHandler(Router apiRouter) {
|
||||
return (Request request) async {
|
||||
final path = request.url.path;
|
||||
|
||||
// Only handle /api/* requests (excluding /api/xtream)
|
||||
if (path.startsWith('api/') && !path.startsWith('api/xtream/')) {
|
||||
return apiRouter(request);
|
||||
}
|
||||
|
||||
return Response.notFound('Not found');
|
||||
};
|
||||
}
|
||||
|
||||
/// CORS middleware to allow cross-origin requests
|
||||
Middleware _corsMiddleware() {
|
||||
return (Handler handler) {
|
||||
return (Request request) async {
|
||||
// Handle preflight requests
|
||||
if (request.method == 'OPTIONS') {
|
||||
return Response.ok('', headers: _corsHeaders);
|
||||
}
|
||||
|
||||
// Process request and add CORS headers to response
|
||||
final response = await handler(request);
|
||||
return response.change(headers: _corsHeaders);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
final _corsHeaders = {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Origin, Content-Type, Accept, Authorization',
|
||||
};
|
||||
|
||||
/// Create Xtream proxy handler with M3U8 URL rewriting support
|
||||
Handler _createXtreamProxyHandler() {
|
||||
return (Request request) async {
|
||||
final path = request.url.path;
|
||||
|
||||
// Only handle /api/xtream/* requests
|
||||
if (!path.startsWith('api/xtream/')) {
|
||||
return Response.notFound('Not found');
|
||||
}
|
||||
|
||||
try {
|
||||
// Extract target URL from request
|
||||
// Format: /api/xtream/http://server:port/path
|
||||
// Note: URL might be URL-encoded (e.g., http%3A%2F%2F...)
|
||||
String apiPath = path.substring('api/xtream/'.length);
|
||||
|
||||
// Decode URL if it's encoded (http%3A%2F%2F -> http://)
|
||||
if (apiPath.startsWith('http%3A') || apiPath.startsWith('https%3A')) {
|
||||
apiPath = Uri.decodeComponent(apiPath);
|
||||
}
|
||||
|
||||
// The client will send the full URL after /api/xtream/
|
||||
if (!apiPath.startsWith('http://') && !apiPath.startsWith('https://')) {
|
||||
return Response.badRequest(
|
||||
body: 'Invalid API URL. Expected format: /api/xtream/http://...',
|
||||
);
|
||||
}
|
||||
|
||||
// Reconstruct the full target URL with query parameters
|
||||
String fullUrl = apiPath;
|
||||
if (request.url.query.isNotEmpty) {
|
||||
// If the target URL already has query params, append with &
|
||||
if (fullUrl.contains('?')) {
|
||||
fullUrl = '$fullUrl&${request.url.query}';
|
||||
} else {
|
||||
fullUrl = '$fullUrl?${request.url.query}';
|
||||
}
|
||||
}
|
||||
|
||||
final targetUrl = Uri.parse(fullUrl);
|
||||
final baseUrl =
|
||||
'${targetUrl.scheme}://${targetUrl.host}${targetUrl.hasPort ? ':${targetUrl.port}' : ''}';
|
||||
|
||||
// Check if this is a video file that needs streaming
|
||||
final lowerPath = targetUrl.path.toLowerCase();
|
||||
final isVideoFile = lowerPath.endsWith('.mp4') ||
|
||||
lowerPath.endsWith('.mkv') ||
|
||||
lowerPath.endsWith('.avi') ||
|
||||
lowerPath.endsWith('.ts') ||
|
||||
lowerPath.endsWith('.m4v') ||
|
||||
lowerPath.contains('/movie/') ||
|
||||
lowerPath.contains('/series/');
|
||||
|
||||
print('Proxying request to: $targetUrl (video streaming: $isVideoFile)');
|
||||
|
||||
// For video files, use streaming with Range support for seeking
|
||||
if (isVideoFile) {
|
||||
final rangeHeader = request.headers['range'];
|
||||
return _streamVideoFile(targetUrl, rangeHeader);
|
||||
}
|
||||
|
||||
// Headers to simulate a legitimate IPTV client (VLC/Kodi style)
|
||||
final proxyHeaders = {
|
||||
'User-Agent': 'VLC/3.0.18 LibVLC/3.0.18',
|
||||
'Accept': '*/*',
|
||||
'Accept-Encoding': 'identity',
|
||||
'Connection': 'keep-alive',
|
||||
'Icy-MetaData': '1',
|
||||
};
|
||||
|
||||
// Use simple http.get/post for non-video content
|
||||
http.Response response;
|
||||
if (request.method == 'GET') {
|
||||
response = await http.get(targetUrl, headers: proxyHeaders).timeout(
|
||||
const Duration(seconds: 30),
|
||||
onTimeout: () => http.Response('Request timeout', 504),
|
||||
);
|
||||
} else if (request.method == 'POST') {
|
||||
final body = await request.readAsString();
|
||||
response = await http
|
||||
.post(targetUrl, headers: proxyHeaders, body: body)
|
||||
.timeout(
|
||||
const Duration(seconds: 30),
|
||||
onTimeout: () => http.Response('Request timeout', 504),
|
||||
);
|
||||
} else {
|
||||
return Response(405, body: 'Method not allowed');
|
||||
}
|
||||
|
||||
// Check if this is an M3U8/HLS playlist that needs URL rewriting
|
||||
final contentType = response.headers['content-type'] ?? '';
|
||||
final isM3u8 = fullUrl.endsWith('.m3u8') ||
|
||||
contentType.contains('application/vnd.apple.mpegurl') ||
|
||||
contentType.contains('application/x-mpegurl') ||
|
||||
contentType.contains('audio/mpegurl');
|
||||
|
||||
if (isM3u8 && response.statusCode == 200) {
|
||||
// Rewrite URLs in M3U8 playlist to go through proxy
|
||||
final rewrittenBody = _rewriteM3u8Urls(
|
||||
response.body,
|
||||
baseUrl,
|
||||
targetUrl.path,
|
||||
request.requestedUri.origin,
|
||||
);
|
||||
|
||||
print('Rewrote M3U8 playlist URLs for: $targetUrl');
|
||||
|
||||
return Response(
|
||||
response.statusCode,
|
||||
body: rewrittenBody,
|
||||
headers: {
|
||||
'content-type': 'application/vnd.apple.mpegurl',
|
||||
'access-control-allow-origin': '*',
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
return Response(
|
||||
response.statusCode,
|
||||
body: response.bodyBytes,
|
||||
headers: {
|
||||
'content-type':
|
||||
response.headers['content-type'] ?? 'application/json',
|
||||
'access-control-allow-origin': '*',
|
||||
// Forward cache headers from upstream
|
||||
if (response.headers.containsKey('cache-control'))
|
||||
'cache-control': response.headers['cache-control']!,
|
||||
if (response.headers.containsKey('expires'))
|
||||
'expires': response.headers['expires']!,
|
||||
if (response.headers.containsKey('etag'))
|
||||
'etag': response.headers['etag']!,
|
||||
if (response.headers.containsKey('last-modified'))
|
||||
'last-modified': response.headers['last-modified']!,
|
||||
},
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
print('Proxy error: $e');
|
||||
print(stackTrace);
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode({'error': 'Proxy error', 'message': e.toString()}),
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// Stream video file using HttpClient with Range support for seeking
|
||||
Future<Response> _streamVideoFile(Uri targetUrl, String? rangeHeader) async {
|
||||
const maxRedirects = 5;
|
||||
var currentUrl = targetUrl;
|
||||
final cookies = <String, String>{}; // Cookie Jar for redirects
|
||||
|
||||
print('Stream Request: $targetUrl');
|
||||
if (rangeHeader != null) print('Client Requested Range: $rangeHeader');
|
||||
|
||||
for (var i = 0; i < maxRedirects; i++) {
|
||||
try {
|
||||
final client = HttpClient();
|
||||
// Increase timeouts for large video files
|
||||
client.connectionTimeout = const Duration(seconds: 60);
|
||||
client.idleTimeout = const Duration(minutes: 5);
|
||||
|
||||
final req = await client.getUrl(currentUrl);
|
||||
req.followRedirects = false; // We handle redirects manually
|
||||
|
||||
req.headers.set('User-Agent', 'VLC/3.0.18 LibVLC/3.0.18');
|
||||
req.headers.set('Accept', '*/*');
|
||||
req.headers.set('Connection', 'keep-alive');
|
||||
req.headers.set('Accept-Encoding', 'identity');
|
||||
|
||||
// Apply collected cookies
|
||||
if (cookies.isNotEmpty) {
|
||||
final cookieHeader =
|
||||
cookies.entries.map((e) => '${e.key}=${e.value}').join('; ');
|
||||
req.headers.set(HttpHeaders.cookieHeader, cookieHeader);
|
||||
}
|
||||
|
||||
// Forward request headers
|
||||
if (rangeHeader != null && rangeHeader.isNotEmpty) {
|
||||
if (!rangeHeader.startsWith('bytes=')) {
|
||||
rangeHeader = 'bytes=$rangeHeader';
|
||||
}
|
||||
req.headers.set(HttpHeaders.rangeHeader, rangeHeader);
|
||||
}
|
||||
|
||||
client.autoUncompress = false;
|
||||
|
||||
final response = await req.close();
|
||||
print('Upstream Response: ${response.statusCode} (Redirect $i)');
|
||||
|
||||
// Collect Cookies from response
|
||||
for (var cookie in response.cookies) {
|
||||
cookies[cookie.name] = cookie.value;
|
||||
}
|
||||
|
||||
// Handle Redirects (301, 302, 303, 307, 308)
|
||||
if (response.statusCode >= 300 && response.statusCode < 400) {
|
||||
final location = response.headers.value(HttpHeaders.locationHeader);
|
||||
if (location != null) {
|
||||
print('Redirecting stream to: $location');
|
||||
currentUrl = Uri.parse(location);
|
||||
await response.drain(); // Drain body to release connection
|
||||
continue; // Loop to next request
|
||||
}
|
||||
}
|
||||
|
||||
// Get content type
|
||||
final contentType = response.headers.contentType?.mimeType ?? 'video/mp4';
|
||||
|
||||
// Build response headers
|
||||
final responseHeaders = <String, String>{
|
||||
'content-type': contentType,
|
||||
'access-control-allow-origin': '*',
|
||||
'accept-ranges': 'bytes',
|
||||
'cache-control': 'no-cache',
|
||||
'connection': 'keep-alive',
|
||||
};
|
||||
|
||||
// Checks for 206 vs 200
|
||||
if (response.statusCode == 200 && rangeHeader != null) {
|
||||
print(
|
||||
'WARNING: Upstream ignored Range header and returned 200. Seeking might fail.',
|
||||
);
|
||||
} else if (response.statusCode == 206) {
|
||||
print('SUCCESS: Upstream returned 206 Partial Content.');
|
||||
}
|
||||
|
||||
// Add Content-Length if available
|
||||
if (response.contentLength > 0) {
|
||||
responseHeaders['content-length'] = response.contentLength.toString();
|
||||
}
|
||||
|
||||
// Add Content-Range if this is a partial response (206)
|
||||
final contentRange =
|
||||
response.headers.value(HttpHeaders.contentRangeHeader);
|
||||
if (contentRange != null) {
|
||||
responseHeaders[HttpHeaders.contentRangeHeader] = contentRange;
|
||||
}
|
||||
|
||||
// Propagate Accept-Ranges
|
||||
responseHeaders[HttpHeaders.acceptRangesHeader] = 'bytes';
|
||||
|
||||
// Return appropriate status code
|
||||
return Response(
|
||||
response.statusCode,
|
||||
body: response,
|
||||
headers: responseHeaders,
|
||||
);
|
||||
} catch (e) {
|
||||
print('Video streaming exception: $e');
|
||||
if (i == maxRedirects - 1) {
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode(
|
||||
{'error': 'Video streaming error', 'message': e.toString()},
|
||||
),
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Response.internalServerError(body: 'Too many redirects');
|
||||
}
|
||||
|
||||
/// Rewrite URLs in M3U8 playlist to go through the proxy
|
||||
///
|
||||
/// Handles both relative and absolute URLs in HLS playlists
|
||||
String _rewriteM3u8Urls(
|
||||
String m3u8Content,
|
||||
String baseUrl,
|
||||
String originalPath,
|
||||
String proxyOrigin,
|
||||
) {
|
||||
final lines = m3u8Content.split('\n');
|
||||
final rewrittenLines = <String>[];
|
||||
|
||||
// Get directory path for relative URL resolution
|
||||
final pathSegments = originalPath.split('/');
|
||||
pathSegments.removeLast(); // Remove filename
|
||||
final basePath = pathSegments.join('/');
|
||||
|
||||
for (final line in lines) {
|
||||
final trimmedLine = line.trim();
|
||||
|
||||
// Skip empty lines and comments (except URI in comments)
|
||||
if (trimmedLine.isEmpty) {
|
||||
rewrittenLines.add(line);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Handle lines that contain URLs (not starting with #, or EXT-X-KEY/EXT-X-MAP with URI)
|
||||
if (!trimmedLine.startsWith('#')) {
|
||||
// This is a segment URL
|
||||
final rewrittenUrl =
|
||||
_rewriteUrl(trimmedLine, baseUrl, basePath, proxyOrigin);
|
||||
rewrittenLines.add(rewrittenUrl);
|
||||
} else if (trimmedLine.contains('URI="')) {
|
||||
// Handle EXT-X-KEY, EXT-X-MAP, etc. with URI attribute
|
||||
final rewrittenLine = trimmedLine.replaceAllMapped(
|
||||
RegExp(r'URI="([^"]+)"'),
|
||||
(match) {
|
||||
final uri = match.group(1)!;
|
||||
final rewrittenUri = _rewriteUrl(uri, baseUrl, basePath, proxyOrigin);
|
||||
return 'URI="$rewrittenUri"';
|
||||
},
|
||||
);
|
||||
rewrittenLines.add(rewrittenLine);
|
||||
} else {
|
||||
rewrittenLines.add(line);
|
||||
}
|
||||
}
|
||||
|
||||
return rewrittenLines.join('\n');
|
||||
}
|
||||
|
||||
/// Rewrite a single URL to go through the proxy
|
||||
String _rewriteUrl(
|
||||
String url,
|
||||
String baseUrl,
|
||||
String basePath,
|
||||
String proxyOrigin,
|
||||
) {
|
||||
String fullUrl;
|
||||
|
||||
if (url.startsWith('http://') || url.startsWith('https://')) {
|
||||
// Already absolute URL
|
||||
fullUrl = url;
|
||||
} else if (url.startsWith('/')) {
|
||||
// Absolute path, relative to server root
|
||||
fullUrl = '$baseUrl$url';
|
||||
} else {
|
||||
// Relative path, relative to current directory
|
||||
fullUrl = '$baseUrl$basePath/$url';
|
||||
}
|
||||
|
||||
// Wrap with proxy
|
||||
return '$proxyOrigin/api/xtream/$fullUrl';
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// FFmpeg Stream Transcoding Handler
|
||||
// ============================================
|
||||
|
||||
/// Active FFmpeg processes by stream ID
|
||||
final Map<String, Process> _activeStreams = {};
|
||||
|
||||
/// Create handler for FFmpeg streaming
|
||||
///
|
||||
/// This endpoint starts an FFmpeg process that connects to the IPTV server
|
||||
/// with proper headers and transcodes the stream to local HLS files.
|
||||
Handler _createStreamHandler() {
|
||||
return (Request request) async {
|
||||
final path = request.url.path;
|
||||
|
||||
// Only handle /api/stream/* requests
|
||||
if (!path.startsWith('api/stream/')) {
|
||||
return Response.notFound('Not found');
|
||||
}
|
||||
|
||||
try {
|
||||
// Extract stream ID
|
||||
final pathParts = path.split('/');
|
||||
if (pathParts.length < 3) {
|
||||
return Response.badRequest(body: 'Invalid stream path');
|
||||
}
|
||||
|
||||
final streamId = pathParts[2];
|
||||
|
||||
// Get parameters
|
||||
final iptvUrl = request.url.queryParameters['url'];
|
||||
final quality = request.url.queryParameters['quality'] ?? 'high';
|
||||
final start =
|
||||
request.url.queryParameters['start']; // Start time in seconds
|
||||
|
||||
if (iptvUrl == null || iptvUrl.isEmpty) {
|
||||
return Response.badRequest(body: 'Missing url parameter');
|
||||
}
|
||||
|
||||
print('Starting Direct Stream for ID: $streamId');
|
||||
print('Source: $iptvUrl');
|
||||
|
||||
// Setup FFmpeg arguments for fMP4 piping
|
||||
// Determine if it's VOD or Live
|
||||
final isVod = streamId.startsWith('vod_'); // Or use extension check
|
||||
|
||||
final ffmpegArgs = <String>[
|
||||
'-hide_banner',
|
||||
'-loglevel', 'warning', // Show warnings too for debugging long streams
|
||||
'-user_agent', 'VLC/3.0.18 LibVLC/3.0.18',
|
||||
'-headers',
|
||||
'Accept: */*\r\nConnection: keep-alive\r\nIcy-MetaData: 0\r\n',
|
||||
|
||||
// ENHANCED Input resilience flags for LONG streaming
|
||||
'-reconnect', '1',
|
||||
'-reconnect_streamed', '1',
|
||||
'-reconnect_delay_max',
|
||||
'30', // Increased to 30s max delay between reconnects
|
||||
'-reconnect_on_network_error', '1',
|
||||
'-reconnect_on_http_error', '4xx,5xx',
|
||||
'-reconnect_at_eof',
|
||||
'1', // Reconnect at stream end (some streams reset)
|
||||
'-rw_timeout', '30000000', // 30s timeout (doubled)
|
||||
'-timeout', '60000000', // 60s global timeout
|
||||
|
||||
// Keep TCP connection alive
|
||||
'-tcp_nodelay', '1',
|
||||
|
||||
// Probing settings to ensure stream detection
|
||||
'-analyzeduration', '30000000', // 30s (increased)
|
||||
'-probesize', '20000000', // 20MB (doubled)
|
||||
'-fflags',
|
||||
'+discardcorrupt', // Skip corrupted frames instead of failing
|
||||
|
||||
'-i', iptvUrl,
|
||||
|
||||
// Output format: MPEG-TS for streaming (compatible with mpegts.js)
|
||||
'-f', 'mpegts',
|
||||
];
|
||||
|
||||
// Add seeking support if start time is provided
|
||||
if (start != null && start.isNotEmpty) {
|
||||
// Insert -ss before -i for faster seeking (input seeking)
|
||||
final inputIndex = ffmpegArgs.indexOf('-i');
|
||||
if (inputIndex != -1) {
|
||||
ffmpegArgs.insertAll(inputIndex, ['-ss', start]);
|
||||
}
|
||||
}
|
||||
|
||||
// Video: Transcode based on quality
|
||||
// High = Copy (efficient), Low/Medium = Transcode to H.264 (compatible)
|
||||
if (quality == 'high') {
|
||||
ffmpegArgs.addAll(['-c:v', 'copy']);
|
||||
} else {
|
||||
// Transcode to H.264 (Baseline profile for max mobile compatibility)
|
||||
ffmpegArgs.addAll([
|
||||
'-c:v', 'libx264',
|
||||
'-preset', 'ultrafast', // Critical for live streaming
|
||||
'-tune', 'zerolatency',
|
||||
'-profile:v', 'baseline',
|
||||
'-level', '3.0',
|
||||
'-pix_fmt', 'yuv420p', // Ensure standard pixel format for web
|
||||
'-g', '60', // Keyframe interval (2s at 30fps) for seeking
|
||||
]);
|
||||
|
||||
if (quality == 'low') {
|
||||
// Low: ~480p, 800k
|
||||
ffmpegArgs.addAll([
|
||||
'-vf',
|
||||
'scale=-2:480',
|
||||
'-b:v',
|
||||
'800k',
|
||||
'-maxrate',
|
||||
'800k',
|
||||
'-bufsize',
|
||||
'1600k',
|
||||
]);
|
||||
} else {
|
||||
// Medium: Original res (or cap at 720p?), 2500k
|
||||
ffmpegArgs.addAll([
|
||||
'-b:v',
|
||||
'2500k',
|
||||
'-maxrate',
|
||||
'2500k',
|
||||
'-bufsize',
|
||||
'5000k',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// Audio: Transcode to AAC is SAFEST for browsers
|
||||
// (Many IPTV streams typically use MP2/AC3 which browsers hate)
|
||||
ffmpegArgs.addAll([
|
||||
'-c:a', 'aac',
|
||||
'-b:a', '128k',
|
||||
'-ar', '44100',
|
||||
'-ac', '2',
|
||||
|
||||
// Fix for MPEG-TS timestamps
|
||||
'-fflags', '+genpts',
|
||||
|
||||
// Output to stdout pipe
|
||||
'pipe:1',
|
||||
]);
|
||||
|
||||
// Start the process
|
||||
final process = await Process.start('ffmpeg', ffmpegArgs);
|
||||
|
||||
// Manage process lifecycle
|
||||
// We use a StreamController to pipe stdout to the response
|
||||
// AND detect when the client disconnects to kill the process.
|
||||
final controller = StreamController<List<int>>();
|
||||
|
||||
// Pipe stdout to controller
|
||||
process.stdout.listen(
|
||||
(data) {
|
||||
if (!controller.isClosed) controller.add(data);
|
||||
},
|
||||
onError: (e) {
|
||||
print('FFmpeg stdout error: $e');
|
||||
if (!controller.isClosed) controller.addError(e);
|
||||
},
|
||||
onDone: () {
|
||||
print('FFmpeg process finished for $streamId');
|
||||
if (!controller.isClosed) controller.close();
|
||||
},
|
||||
);
|
||||
|
||||
// Log stderr for debug
|
||||
process.stderr.transform(utf8.decoder).listen((data) {
|
||||
if (data.contains('Error') || data.contains('error')) {
|
||||
print('FFmpeg Error [$streamId]: $data');
|
||||
}
|
||||
});
|
||||
|
||||
// CLEANUP: When the HTTP client disconnects, the stream subscription
|
||||
// will be cancelled. We MUST kill the FFmpeg process then.
|
||||
controller.onCancel = () {
|
||||
print('Client disconnected for $streamId. Killing FFmpeg...');
|
||||
process.kill();
|
||||
};
|
||||
|
||||
return Response.ok(
|
||||
controller.stream,
|
||||
headers: {
|
||||
'Content-Type': 'video/MP2T',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Cache-Control': 'no-cache, no-store',
|
||||
'Connection': 'keep-alive',
|
||||
},
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
print('Stream setup error: $e');
|
||||
print(stackTrace);
|
||||
return Response.internalServerError(
|
||||
body: jsonEncode(
|
||||
{'error': 'Stream setup error', 'message': e.toString()},
|
||||
),
|
||||
headers: {'content-type': 'application/json'},
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
import 'dart:io';
|
||||
import 'dart:async';
|
||||
|
||||
class CleanupService {
|
||||
final List<Directory> _targetDirectories = [];
|
||||
Timer? _timer;
|
||||
final Duration _defaultMaxAge;
|
||||
|
||||
CleanupService({Duration defaultMaxAge = const Duration(hours: 24)})
|
||||
: _defaultMaxAge = defaultMaxAge;
|
||||
|
||||
/// Add a directory to be monitored
|
||||
void addTarget(Directory dir) {
|
||||
if (!dir.existsSync()) {
|
||||
try {
|
||||
dir.createSync(recursive: true);
|
||||
print('CleanupService: Created missing directory: ${dir.path}');
|
||||
} catch (e) {
|
||||
print('CleanupService: Should monitor ${dir.path} but it does not exist and could not be created: $e');
|
||||
return;
|
||||
}
|
||||
}
|
||||
_targetDirectories.add(dir);
|
||||
print('CleanupService: Monitoring ${dir.path}');
|
||||
}
|
||||
|
||||
/// Start the periodic cleanup task
|
||||
void start({Duration interval = const Duration(hours: 6)}) {
|
||||
_timer?.cancel();
|
||||
print('CleanupService: Starting scheduler (Interval: ${interval.inHours}h)');
|
||||
|
||||
// Run immediately on start
|
||||
runCleanup();
|
||||
|
||||
_timer = Timer.periodic(interval, (_) => runCleanup());
|
||||
}
|
||||
|
||||
/// Stop the scheduler
|
||||
void stop() {
|
||||
_timer?.cancel();
|
||||
print('CleanupService: Scheduler stopped');
|
||||
}
|
||||
|
||||
/// Trigger a manual cleanup
|
||||
Future<Map<String, dynamic>> runCleanup() async {
|
||||
print('CleanupService: Running cleanup task...');
|
||||
int deletedCount = 0;
|
||||
int freedBytes = 0;
|
||||
List<String> errors = [];
|
||||
|
||||
for (final dir in _targetDirectories) {
|
||||
if (!dir.existsSync()) continue;
|
||||
|
||||
try {
|
||||
final result = await _cleanDirectory(dir, _defaultMaxAge);
|
||||
deletedCount += result.count;
|
||||
freedBytes += result.bytes;
|
||||
} catch (e) {
|
||||
print('CleanupService: Error processing ${dir.path}: $e');
|
||||
errors.add('Error in ${dir.path}: $e');
|
||||
}
|
||||
}
|
||||
|
||||
final summary = {
|
||||
'status': 'complete',
|
||||
'deleted_files': deletedCount,
|
||||
'freed_bytes': freedBytes,
|
||||
'timestamp': DateTime.now().toIso8601String(),
|
||||
'errors': errors,
|
||||
};
|
||||
|
||||
print('CleanupService: Cleanup complete. Deleted $deletedCount files, freed ${(freedBytes / 1024 / 1024).toStringAsFixed(2)} MB');
|
||||
return summary;
|
||||
}
|
||||
|
||||
Future<({int count, int bytes})> _cleanDirectory(Directory dir, Duration maxAge) async {
|
||||
int count = 0;
|
||||
int bytes = 0;
|
||||
final now = DateTime.now();
|
||||
final threshold = now.subtract(maxAge);
|
||||
|
||||
try {
|
||||
await for (final entity in dir.list(recursive: true, followLinks: false)) {
|
||||
if (entity is File) {
|
||||
try {
|
||||
final stat = await entity.stat();
|
||||
// Check Modified AND Accessed time (if available) to be safe
|
||||
// Ideally we use modified time for temp files
|
||||
if (stat.modified.isBefore(threshold)) {
|
||||
final fileSize = stat.size;
|
||||
await entity.delete();
|
||||
count++;
|
||||
bytes += fileSize;
|
||||
// print('CleanupService: Deleted ${entity.path} (Age: ${now.difference(stat.modified).inHours}h)');
|
||||
}
|
||||
} catch (e) {
|
||||
// Ignore individual file errors (locked files etc)
|
||||
// print('CleanupService: Failed to delete ${entity.path}: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
print('CleanupService: Failed to list ${dir.path}: $e');
|
||||
rethrow;
|
||||
}
|
||||
|
||||
return (count: count, bytes: bytes);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:crypto/crypto.dart';
|
||||
|
||||
class PasswordHasher {
|
||||
/// Hash a password using SHA256 (simple implementation)
|
||||
/// Note: In production, use a proper bcrypt implementation
|
||||
static String hash(String password) {
|
||||
final bytes = utf8.encode(password);
|
||||
final digest = sha256.convert(bytes);
|
||||
return digest.toString();
|
||||
}
|
||||
|
||||
/// Verify a password against a hash
|
||||
static bool verify(String password, String hash) {
|
||||
return PasswordHasher.hash(password) == hash;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
flutter : [!] No
|
||||
Android SDK found. Try
|
||||
setting the
|
||||
ANDROID_HOME
|
||||
environment variable.
|
||||
Au caractère Ligne:1 :
|
||||
81
|
||||
+ ... utter\bin";
|
||||
flutter build apk
|
||||
--release
|
||||
--target-platform
|
||||
android-arm ...
|
||||
+ ~~~~~
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~
|
||||
+ CategoryInfo
|
||||
: NotSpecifi
|
||||
ed: ([!] No Androi
|
||||
d ...nment variabl
|
||||
e.:String) [], Rem
|
||||
oteException
|
||||
+ FullyQualifiedEr
|
||||
rorId : NativeComm
|
||||
andError
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
Running Gradle task 'assembleRelease'...
|
||||
lib/features/iptv/widgets/mobile_live_tv_tab.dart:59:3: Error: Type 'Timer' not found.
|
||||
Timer? _searchTimer;
|
||||
^^^^^
|
||||
lib/features/iptv/widgets/mobile_live_tv_tab.dart:45:22: Error: The method 'Timer' isn't defined for the type '_MobileLiveTVTabState'.
|
||||
- '_MobileLiveTVTabState' is from 'package:xtremobile/features/iptv/widgets/mobile_live_tv_tab.dart' ('lib/features/iptv/widgets/mobile_live_tv_tab.dart').
|
||||
Try correcting the name to the name of an existing method, or defining a method named 'Timer'.
|
||||
_searchTimer = Timer(const Duration(milliseconds: 500), () {
|
||||
^^^^^
|
||||
lib/features/iptv/widgets/mobile_live_tv_tab.dart:59:3: Error: 'Timer' isn't a type.
|
||||
Timer? _searchTimer;
|
||||
^^^^^
|
||||
lib/core/utils/image_cache_config.dart:22:7: Error: No named parameter with the name 'diskUsagePercentageHigh'.
|
||||
diskUsagePercentageHigh: 95,
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/C:/Users/Bureau/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_cache_manager-3.4.1/lib/src/config/config.dart:23:11: Context: Found this candidate, but the arguments don't match.
|
||||
factory Config(
|
||||
^
|
||||
lib/features/iptv/services/xtream_service_mobile.dart:52:22: Error: Member not found: 'instance'.
|
||||
_dio = ApiClient.instance;
|
||||
^^^^^^^^
|
||||
lib/features/iptv/services/xtream_service_mobile.dart:47:23: Error: The getter 'serverUrl' isn't defined for the type 'PlaylistConfig'.
|
||||
- 'PlaylistConfig' is from 'package:xtremobile/core/models/playlist_config.dart' ('lib/core/models/playlist_config.dart').
|
||||
Try correcting the name to the name of an existing getter, or defining a getter or field named 'serverUrl'.
|
||||
_baseUrl = config.serverUrl;
|
||||
^^^^^^^^^
|
||||
Target kernel_snapshot_program failed: Exception
|
||||
|
||||
|
||||
FAILURE: Build failed with an exception.
|
||||
|
||||
* What went wrong:
|
||||
Execution failed for task ':app:compileFlutterBuildRelease'.
|
||||
> Process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat'' finished with non-zero exit value 1
|
||||
|
||||
* Try:
|
||||
> Run with --stacktrace option to get the stack trace.
|
||||
> Run with --info or --debug option to get more log output.
|
||||
> Run with --scan to get full insights.
|
||||
> Get more help at https://help.gradle.org.
|
||||
|
||||
BUILD FAILED in 48s
|
||||
Running Gradle task 'assembleRelease'... 49,2s
|
||||
Gradle task assembleRelease failed with exit code 1
|
||||
Running Gradle task 'assembleRelease'...
|
||||
Font asset "MaterialIcons-Regular.otf" was tree-shaken, reducing it from 1645184 to 6416 bytes (99.6% reduction). Tree-shaking can be disabled by providing the --no-tree-shake-icons flag when building your app.
|
||||
Checking the license for package CMake 3.22.1 in C:\Android\licenses
|
||||
License for package CMake 3.22.1 accepted.
|
||||
Preparing "Install CMake 3.22.1 v.3.22.1".
|
||||
"Install CMake 3.22.1 v.3.22.1" ready.
|
||||
Installing CMake 3.22.1 in C:\Android\cmake\3.22.1
|
||||
"Install CMake 3.22.1 v.3.22.1" complete.
|
||||
"Install CMake 3.22.1 v.3.22.1" finished.
|
||||
Running Gradle task 'assembleRelease'... 177,3s
|
||||
√ Built build\app\outputs\flutter-apk\app-release.apk (93.5MB)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,444 @@
|
||||
[ +133 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] executing: [C:\Users\Bureau\dart\flutter/] git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ +41 ms] Exit code 0 from: git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ ] 2026-03-17 16:14:01 -0700
|
||||
[ +15 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ +24 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ +79 ms] Skipping pub get: version match.
|
||||
[ +112 ms] Found plugin wakelock_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\
|
||||
[ +12 ms] Found plugin package_info_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\
|
||||
[ +6 ms] Found plugin video_player at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player-2.11.1\
|
||||
[ +1 ms] Found plugin video_player_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_web-2.4.0\
|
||||
[ +2 ms] Found plugin video_player_avfoundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_avfoundation-2.9.4\
|
||||
[ +1 ms] Found plugin video_player_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\
|
||||
[ +3 ms] Found plugin shared_preferences at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences-2.5.5\
|
||||
[ +1 ms] Found plugin shared_preferences_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_windows-2.4.1\
|
||||
[ +1 ms] Found plugin path_provider_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_windows-2.3.0\
|
||||
[ +3 ms] Found plugin shared_preferences_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_web-2.4.3\
|
||||
[ +1 ms] Found plugin shared_preferences_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_linux-2.4.1\
|
||||
[ ] Found plugin path_provider_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_linux-2.2.1\
|
||||
[ +2 ms] Found plugin shared_preferences_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_foundation-2.5.6\
|
||||
[ +1 ms] Found plugin shared_preferences_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\
|
||||
[ +1 ms] Found plugin path_provider at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider-2.1.5\
|
||||
[ +1 ms] Found plugin path_provider_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_foundation-2.6.0\
|
||||
[ +4 ms] Found plugin path_provider_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\
|
||||
[ +1 ms] Found plugin media_kit_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\
|
||||
[ +1 ms] Found plugin volume_controller at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\
|
||||
[ +3 ms] Found plugin screen_brightness_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\
|
||||
[ +4 ms] Found plugin media_kit_libs_windows_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_windows_video-1.0.11\
|
||||
[ +1 ms] Found plugin media_kit_libs_macos_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_macos_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_linux-1.2.1\
|
||||
[ ] Found plugin media_kit_libs_ios_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_ios_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_android_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\
|
||||
[ +13 ms] Found plugin sqflite at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite-2.4.2\
|
||||
[ +2 ms] Found plugin sqflite_darwin at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_darwin-2.4.2\
|
||||
[ +1 ms] Found plugin sqflite_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\
|
||||
[ +76 ms] Found plugin wakelock_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\
|
||||
[ +2 ms] Found plugin package_info_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\
|
||||
[ +2 ms] Found plugin video_player at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player-2.11.1\
|
||||
[ ] Found plugin video_player_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_web-2.4.0\
|
||||
[ +1 ms] Found plugin video_player_avfoundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_avfoundation-2.9.4\
|
||||
[ ] Found plugin video_player_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\
|
||||
[ +2 ms] Found plugin shared_preferences at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences-2.5.5\
|
||||
[ ] Found plugin shared_preferences_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_windows-2.4.1\
|
||||
[ +1 ms] Found plugin path_provider_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_windows-2.3.0\
|
||||
[ +1 ms] Found plugin shared_preferences_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_web-2.4.3\
|
||||
[ ] Found plugin shared_preferences_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_linux-2.4.1\
|
||||
[ ] Found plugin path_provider_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_linux-2.2.1\
|
||||
[ ] Found plugin shared_preferences_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_foundation-2.5.6\
|
||||
[ ] Found plugin shared_preferences_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\
|
||||
[ ] Found plugin path_provider at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider-2.1.5\
|
||||
[ ] Found plugin path_provider_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_foundation-2.6.0\
|
||||
[ +2 ms] Found plugin path_provider_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\
|
||||
[ ] Found plugin media_kit_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\
|
||||
[ ] Found plugin volume_controller at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\
|
||||
[ +1 ms] Found plugin screen_brightness_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\
|
||||
[ +3 ms] Found plugin media_kit_libs_windows_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_windows_video-1.0.11\
|
||||
[ ] Found plugin media_kit_libs_macos_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_macos_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_linux-1.2.1\
|
||||
[ ] Found plugin media_kit_libs_ios_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_ios_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_android_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\
|
||||
[ +6 ms] Found plugin sqflite at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite-2.4.2\
|
||||
[ +1 ms] Found plugin sqflite_darwin at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_darwin-2.4.2\
|
||||
[ ] Found plugin sqflite_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\
|
||||
[ +150 ms] Generating C:\GIT\xtremobile\android\app\src\main\java\io\flutter\plugins\GeneratedPluginRegistrant.java
|
||||
[ +14 ms] Skipping generating GeneratedPluginRegistrant.java because it is up-to-date.
|
||||
[ +44 ms] Top-level Gradle build file not found, skipping migration of task "clean".
|
||||
[ ] Android Studio version could not be detected, skipping Gradle-Java version compatibility check.
|
||||
[ +11 ms] CMake project not found, skipping support Android 15 16k page size migration.
|
||||
[ +3 ms] Using gradle from C:\GIT\xtremobile\android\gradlew.bat.
|
||||
[ +12 ms] LocalFile: 'C:\GIT\xtremobile\android\build.gradle.kts' doesn't provide an AGP version. Checking settings.
|
||||
[ +8 ms] LocalFile: 'C:\GIT\xtremobile\android\settings.gradle.kts' provides AGP version: 8.11.1
|
||||
[ +2 ms] Running Gradle task 'assembleRelease'...
|
||||
[ ] executing: [C:\GIT\xtremobile\android/] C:\GIT\xtremobile\android\gradlew.bat --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm64 -Ptarget=lib\main.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=true -Psplit-per-abi=true assembleRelease
|
||||
[ +510 ms] Initialized native services in: C:\Users\Bureau\.gradle\native
|
||||
[ ] Initialized jansi services in: C:\Users\Bureau\.gradle\native
|
||||
[ +117 ms] Welcome to Gradle 8.14!
|
||||
[ ] Here are the highlights of this release:
|
||||
[ ] - Java 24 support
|
||||
[ ] - GraalVM Native Image toolchain selection
|
||||
[ ] - Enhancements to test reporting
|
||||
[ ] - Build Authoring improvements
|
||||
[ ] For more details see https://docs.gradle.org/8.14/release-notes.html
|
||||
[ +202 ms] The client will now receive all logging from the daemon (pid: 37756). The daemon log file: C:\Users\Bureau\.gradle\daemon\8.14\daemon-37756.out.log
|
||||
[ ] Starting 2nd build in daemon [uptime: 16 mins 39.115 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 5% of 4 GiB]
|
||||
[ ] Using 12 worker leases.
|
||||
[ +107 ms] Now considering [C:\GIT\xtremobile\android, C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle] as hierarchies to watch
|
||||
[ ] Watching the file system is configured to be enabled if available
|
||||
[ +92 ms] File system watching is active
|
||||
[ ] Starting Build
|
||||
[ ] Now considering [C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle, C:\GIT\xtremobile\android] as hierarchies to watch
|
||||
[ +403 ms] > Configure project :gradle
|
||||
[ ] Evaluating project ':gradle' using build file 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin']
|
||||
[ ] Resolved plugin [id: 'org.gradle.groovy']
|
||||
[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0']
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20']
|
||||
[ ] Using Kotlin Gradle Plugin gradle85 variant
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef
|
||||
[ ] file or directory 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\src\main\java', not found
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0']
|
||||
[ ] Resolved plugin [id: 'com.android.application', version: '8.11.1', apply: false]
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.2.20', apply: false]
|
||||
[ ] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED
|
||||
[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false.
|
||||
[ ] Resolve mutations for :gradle:compileKotlin (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:compileKotlin (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ +294 ms] > Task :gradle:compileKotlin UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:compileKotlin' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:compileJava (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:compileJava (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :gradle:compileJava NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:compileGroovy (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:compileGroovy (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :gradle:compileGroovy NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:pluginDescriptors (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :gradle:pluginDescriptors UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:pluginDescriptors' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:processResources (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:processResources (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :gradle:processResources UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:processResources' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:processResources' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:classes (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :gradle:classes (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:classes UP-TO-DATE
|
||||
[ ] Skipping task ':gradle:classes' as it has no actions.
|
||||
[ ] Resolve mutations for :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:jar UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:jar' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:jar' as it is up-to-date.
|
||||
[ +801 ms] Settings evaluated using settings file 'C:\GIT\xtremobile\android\settings.gradle.kts'.
|
||||
[ ] Projects loaded. Root project using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ ] Included projects: [root project 'android', project ':app', project ':media_kit_libs_android_video', project ':media_kit_video', project ':package_info_plus', project ':path_provider_android', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus']
|
||||
[ +201 ms] > Configure project :app
|
||||
[ ] Evaluating project ':app' using build file 'C:\GIT\xtremobile\android\app\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.application']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin']
|
||||
[ ] Using default execution profile
|
||||
[ ] Build d559a287-302a-4091-a5f6-dbfa6cdce5ae is started
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] > Configure project :
|
||||
[ ] Evaluating root project 'android' using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ +485 ms] > Configure project :media_kit_libs_android_video
|
||||
[ ] Evaluating project ':media_kit_libs_android_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] > Configure project :media_kit_video
|
||||
[ ] Evaluating project ':media_kit_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +405 ms] > Configure project :package_info_plus
|
||||
[ ] Evaluating project ':package_info_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +291 ms] > Configure project :path_provider_android
|
||||
[ ] Evaluating project ':path_provider_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Using default execution profile
|
||||
[ +604 ms] > Configure project :screen_brightness_android
|
||||
[ ] Evaluating project ':screen_brightness_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +203 ms] > Configure project :shared_preferences_android
|
||||
[ ] Evaluating project ':shared_preferences_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] > Configure project :sqflite_android
|
||||
[ ] Evaluating project ':sqflite_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +91 ms] > Configure project :video_player_android
|
||||
[ ] Evaluating project ':video_player_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +699 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +93 ms] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +406 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[Execution worker Thread 11,5,main]) started.
|
||||
[+1995 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +134 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +7 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +34 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +2 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +20 ms] Initializing file store
|
||||
[ ] [ +1 ms] Done initializing file store
|
||||
[ ] [ +14 ms] Skipping target: gen_dart_plugin_registrant
|
||||
[ ] [ +2 ms] Skipping target: dart_build
|
||||
[ ] [ ] Skipping target: gen_localizations
|
||||
[ ] [ +1 ms] Skipping target: install_code_assets
|
||||
[ ] [ +15 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill, InvalidatedReasonKind.inputChanged: The following inputs have updated contents: C:\Users\Bureau\dart\flutter\packages\flutter_tools\lib\src\build_system\targets\common.dart,C:\Users\Bureau\dart\flutter\bin\cache\engine.stamp,C:\Users\Bureau\dart\flutter\bin\cache\engine.stamp,C:\Users\Bureau\dart\flutter\bin\cache\engine.stamp,C:\Users\Bureau\dart\flutter\bin\cache\engine.stamp}
|
||||
[ ] [ +11 ms] C:\Users\Bureau\dart\flutter\bin\cache\dart-sdk\bin\dartaotruntime.exe C:\Users\Bureau\dart\flutter\bin\cache\dart-sdk\bin\snapshots\frontend_server_aot.dart.snapshot --sdk-root C:\Users\Bureau\dart\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk_product/ --target=flutter --no-print-incremental-dependencies -DFLUTTER_VERSION=3.41.5 -DFLUTTER_CHANNEL=stable -DFLUTTER_GIT_URL=https://github.com/flutter/flutter.git -DFLUTTER_FRAMEWORK_REVISION=2c9eb20739 -DFLUTTER_ENGINE_REVISION=052f31d115 -DFLUTTER_DART_VERSION=3.11.3 -DFLUTTER_APP_FLAVOR= -Ddart.vm.profile=false -Ddart.vm.product=true --delete-tostring-package-uri=dart:ui --delete-tostring-package-uri=package:flutter --aot --tfa --target-os android --packages C:\GIT\xtremobile\.dart_tool\package_config.json --output-dill C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill --depfile C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\kernel_snapshot_program.d --source file:///C:/GIT/xtremobile/.dart_tool/flutter_build/dart_plugin_registrant.dart --source package:flutter/src/dart_plugin_registrant.dart -Dflutter.dart_plugin_registrant=file:///C:/GIT/xtremobile/.dart_tool/flutter_build/dart_plugin_registrant.dart --verbosity=error package:xtremflow/main.dart
|
||||
@@ -0,0 +1,100 @@
|
||||
[ +97 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +216 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[Execution worker Thread 8,5,main]) started.
|
||||
[+1983 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +163 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +8 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +41 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ +2 ms] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +19 ms] Initializing file store
|
||||
[ ] [ +2 ms] Done initializing file store
|
||||
[ ] [ +13 ms] Skipping target: gen_dart_plugin_registrant
|
||||
[ ] [ +2 ms] Skipping target: dart_build
|
||||
[ ] [ ] Skipping target: gen_localizations
|
||||
[ ] [ ] Skipping target: install_code_assets
|
||||
[ ] [ +2 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill}
|
||||
@@ -0,0 +1,378 @@
|
||||
[ +166 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ +6 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] executing: [C:\Users\Bureau\dart\flutter/] git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ +50 ms] Exit code 0 from: git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ ] 2026-03-17 16:14:01 -0700
|
||||
[ +45 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ +4 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ +150 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ +3 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ +120 ms] Top-level Gradle build file not found, skipping migration of task "clean".
|
||||
[ ] Android Studio version could not be detected, skipping Gradle-Java version compatibility check.
|
||||
[ +10 ms] CMake project not found, skipping support Android 15 16k page size migration.
|
||||
[ +11 ms] Using gradle from C:\GIT\xtremobile\android\gradlew.bat.
|
||||
[ +17 ms] LocalFile: 'C:\GIT\xtremobile\android\build.gradle.kts' doesn't provide an AGP version. Checking settings.
|
||||
[ +6 ms] LocalFile: 'C:\GIT\xtremobile\android\settings.gradle.kts' provides AGP version: 8.11.1
|
||||
[ +2 ms] Running Gradle task 'assembleRelease'...
|
||||
[ +1 ms] executing: [C:\GIT\xtremobile\android/] C:\GIT\xtremobile\android\gradlew.bat --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm64 -Ptarget=lib\main.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=true -Psplit-per-abi=true assembleRelease
|
||||
[+6261 ms] Initialized native services in: C:\Users\Bureau\.gradle\native
|
||||
[ ] Initialized jansi services in: C:\Users\Bureau\.gradle\native
|
||||
[ +422 ms] The client will now receive all logging from the daemon (pid: 37756). The daemon log file: C:\Users\Bureau\.gradle\daemon\8.14\daemon-37756.out.log
|
||||
[ ] Starting 15th build in daemon [uptime: 3 hrs 41 mins 1.131 secs, performance: 100%, GC rate: 0.00/s, heap usage: 1% of 8 GiB, non-heap usage: 5% of 4 GiB]
|
||||
[ +93 ms] Using 12 worker leases.
|
||||
[ +109 ms] Now considering [C:\GIT\xtremobile\android, C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle] as hierarchies to watch
|
||||
[ +93 ms] Watching the file system is configured to be enabled if available
|
||||
[ +202 ms] File system watching is active
|
||||
[ ] Starting Build
|
||||
[ +202 ms] Now considering [C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle, C:\GIT\xtremobile\android] as hierarchies to watch
|
||||
[ +698 ms] > Configure project :gradle
|
||||
[ ] Evaluating project ':gradle' using build file 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin']
|
||||
[ ] Resolved plugin [id: 'org.gradle.groovy']
|
||||
[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0']
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20']
|
||||
[ ] Using Kotlin Gradle Plugin gradle85 variant
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef
|
||||
[ ] file or directory 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\src\main\java', not found
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0']
|
||||
[ ] Resolved plugin [id: 'com.android.application', version: '8.11.1', apply: false]
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.2.20', apply: false]
|
||||
[ ] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker,5,main]) started.
|
||||
[ +91 ms] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED
|
||||
[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false.
|
||||
[ ] Resolve mutations for :gradle:compileKotlin (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileKotlin (Thread[Execution worker,5,main]) started.
|
||||
[ +201 ms] > Task :gradle:compileKotlin UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:compileKotlin' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:compileJava (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileJava (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:compileJava NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:compileGroovy (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileGroovy (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:compileGroovy NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:pluginDescriptors (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:pluginDescriptors UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:pluginDescriptors' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:processResources (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:processResources (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:processResources UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:processResources' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:processResources' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:classes (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:classes (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:classes UP-TO-DATE
|
||||
[ ] Skipping task ':gradle:classes' as it has no actions.
|
||||
[ ] Resolve mutations for :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:jar UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:jar' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:jar' as it is up-to-date.
|
||||
[+1007 ms] Settings evaluated using settings file 'C:\GIT\xtremobile\android\settings.gradle.kts'.
|
||||
[ ] Projects loaded. Root project using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ ] Included projects: [root project 'android', project ':app', project ':media_kit_libs_android_video', project ':media_kit_video', project ':package_info_plus', project ':path_provider_android', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus']
|
||||
[ +387 ms] > Configure project :app
|
||||
[ ] Evaluating project ':app' using build file 'C:\GIT\xtremobile\android\app\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.application']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin']
|
||||
[ ] Using default execution profile
|
||||
[ ] Build 952887de-e4ef-441c-aad6-e810177fe241 is started
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] > Configure project :
|
||||
[ ] Evaluating root project 'android' using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ +503 ms] > Configure project :media_kit_libs_android_video
|
||||
[ ] Evaluating project ':media_kit_libs_android_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] > Configure project :media_kit_video
|
||||
[ ] Evaluating project ':media_kit_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +295 ms] > Configure project :package_info_plus
|
||||
[ ] Evaluating project ':package_info_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +292 ms] > Configure project :path_provider_android
|
||||
[ ] Evaluating project ':path_provider_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Using default execution profile
|
||||
[ +605 ms] > Configure project :screen_brightness_android
|
||||
[ ] Evaluating project ':screen_brightness_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +203 ms] > Configure project :shared_preferences_android
|
||||
[ ] Evaluating project ':shared_preferences_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] > Configure project :sqflite_android
|
||||
[ ] Evaluating project ':sqflite_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +93 ms] > Configure project :video_player_android
|
||||
[ ] Evaluating project ':video_player_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +604 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +94 ms] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +512 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[included builds,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[included builds,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[included builds,5,main]) started.
|
||||
[ ] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[included builds,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[included builds,5,main]) started.
|
||||
[+1986 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +154 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +7 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +35 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +19 ms] Initializing file store
|
||||
[ ] [ +9 ms] Done initializing file store
|
||||
[ ] [ +37 ms] Skipping target: gen_dart_plugin_registrant
|
||||
[ ] [ +28 ms] Skipping target: dart_build
|
||||
[ ] [ ] Skipping target: gen_localizations
|
||||
[ ] [ +5 ms] Skipping target: install_code_assets
|
||||
[ ] [ +12 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill}
|
||||
[ ] [ +10 ms] C:\Users\Bureau\dart\flutter\bin\cache\dart-sdk\bin\dartaotruntime.exe C:\Users\Bureau\dart\flutter\bin\cache\dart-sdk\bin\snapshots\frontend_server_aot.dart.snapshot --sdk-root C:\Users\Bureau\dart\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk_product/ --target=flutter --no-print-incremental-dependencies -DFLUTTER_VERSION=3.41.5 -DFLUTTER_CHANNEL=stable -DFLUTTER_GIT_URL=https://github.com/flutter/flutter.git -DFLUTTER_FRAMEWORK_REVISION=2c9eb20739 -DFLUTTER_ENGINE_REVISION=052f31d115 -DFLUTTER_DART_VERSION=3.11.3 -DFLUTTER_APP_FLAVOR= -Ddart.vm.profile=false -Ddart.vm.product=true --delete-tostring-package-uri=dart:ui --delete-tostring-package-uri=package:flutter --aot --tfa --target-os android --packages C:\GIT\xtremobile\.dart_tool\package_config.json --output-dill C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill --depfile C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\kernel_snapshot_program.d --source file:///C:/GIT/xtremobile/.dart_tool/flutter_build/dart_plugin_registrant.dart --source package:flutter/src/dart_plugin_registrant.dart -Dflutter.dart_plugin_registrant=file:///C:/GIT/xtremobile/.dart_tool/flutter_build/dart_plugin_registrant.dart --verbosity=error package:xtremflow/main.dart
|
||||
@@ -0,0 +1,436 @@
|
||||
[ +150 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] executing: [C:\Users\Bureau\dart\flutter/] git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ +54 ms] Exit code 0 from: git -c log.showSignature=false log HEAD -n 1 --pretty=format:%ad --date=iso
|
||||
[ ] 2026-03-17 16:14:01 -0700
|
||||
[ +12 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ +22 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ +3 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ +60 ms] Skipping pub get: version match.
|
||||
[ +79 ms] Found plugin wakelock_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\
|
||||
[ +7 ms] Found plugin package_info_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\
|
||||
[ +3 ms] Found plugin video_player at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player-2.11.1\
|
||||
[ ] Found plugin video_player_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_web-2.4.0\
|
||||
[ +1 ms] Found plugin video_player_avfoundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_avfoundation-2.9.4\
|
||||
[ ] Found plugin video_player_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\
|
||||
[ +2 ms] Found plugin shared_preferences at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences-2.5.5\
|
||||
[ ] Found plugin shared_preferences_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_windows-2.4.1\
|
||||
[ +1 ms] Found plugin path_provider_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_windows-2.3.0\
|
||||
[ +2 ms] Found plugin shared_preferences_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_web-2.4.3\
|
||||
[ +1 ms] Found plugin shared_preferences_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_linux-2.4.1\
|
||||
[ ] Found plugin path_provider_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_linux-2.2.1\
|
||||
[ +1 ms] Found plugin shared_preferences_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_foundation-2.5.6\
|
||||
[ ] Found plugin shared_preferences_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\
|
||||
[ ] Found plugin path_provider at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider-2.1.5\
|
||||
[ ] Found plugin path_provider_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_foundation-2.6.0\
|
||||
[ +3 ms] Found plugin path_provider_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\
|
||||
[ ] Found plugin media_kit_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\
|
||||
[ +1 ms] Found plugin volume_controller at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\
|
||||
[ +2 ms] Found plugin screen_brightness_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\
|
||||
[ +3 ms] Found plugin media_kit_libs_windows_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_windows_video-1.0.11\
|
||||
[ ] Found plugin media_kit_libs_macos_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_macos_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_linux-1.2.1\
|
||||
[ ] Found plugin media_kit_libs_ios_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_ios_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_android_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\
|
||||
[ +9 ms] Found plugin sqflite at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite-2.4.2\
|
||||
[ +2 ms] Found plugin sqflite_darwin at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_darwin-2.4.2\
|
||||
[ ] Found plugin sqflite_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\
|
||||
[ +66 ms] Found plugin wakelock_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\
|
||||
[ +2 ms] Found plugin package_info_plus at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\
|
||||
[ +2 ms] Found plugin video_player at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player-2.11.1\
|
||||
[ ] Found plugin video_player_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_web-2.4.0\
|
||||
[ +1 ms] Found plugin video_player_avfoundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_avfoundation-2.9.4\
|
||||
[ ] Found plugin video_player_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\
|
||||
[ +2 ms] Found plugin shared_preferences at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences-2.5.5\
|
||||
[ ] Found plugin shared_preferences_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_windows-2.4.1\
|
||||
[ +1 ms] Found plugin path_provider_windows at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_windows-2.3.0\
|
||||
[ +1 ms] Found plugin shared_preferences_web at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_web-2.4.3\
|
||||
[ ] Found plugin shared_preferences_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_linux-2.4.1\
|
||||
[ ] Found plugin path_provider_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_linux-2.2.1\
|
||||
[ +1 ms] Found plugin shared_preferences_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_foundation-2.5.6\
|
||||
[ ] Found plugin shared_preferences_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\
|
||||
[ ] Found plugin path_provider at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider-2.1.5\
|
||||
[ ] Found plugin path_provider_foundation at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_foundation-2.6.0\
|
||||
[ +2 ms] Found plugin path_provider_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\
|
||||
[ ] Found plugin media_kit_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\
|
||||
[ ] Found plugin volume_controller at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\
|
||||
[ +1 ms] Found plugin screen_brightness_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\
|
||||
[ +3 ms] Found plugin media_kit_libs_windows_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_windows_video-1.0.11\
|
||||
[ ] Found plugin media_kit_libs_macos_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_macos_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_linux at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_linux-1.2.1\
|
||||
[ ] Found plugin media_kit_libs_ios_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_ios_video-1.1.4\
|
||||
[ ] Found plugin media_kit_libs_android_video at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\
|
||||
[ +6 ms] Found plugin sqflite at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite-2.4.2\
|
||||
[ +1 ms] Found plugin sqflite_darwin at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_darwin-2.4.2\
|
||||
[ ] Found plugin sqflite_android at C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\
|
||||
[ +5 ms] Generating C:\GIT\xtremobile\android\app\src\main\java\io\flutter\plugins\GeneratedPluginRegistrant.java
|
||||
[ +6 ms] Skipping generating GeneratedPluginRegistrant.java because it is up-to-date.
|
||||
[ +46 ms] Top-level Gradle build file not found, skipping migration of task "clean".
|
||||
[ ] Android Studio version could not be detected, skipping Gradle-Java version compatibility check.
|
||||
[ +12 ms] CMake project not found, skipping support Android 15 16k page size migration.
|
||||
[ +3 ms] Using gradle from C:\GIT\xtremobile\android\gradlew.bat.
|
||||
[ +15 ms] LocalFile: 'C:\GIT\xtremobile\android\build.gradle.kts' doesn't provide an AGP version. Checking settings.
|
||||
[ +8 ms] LocalFile: 'C:\GIT\xtremobile\android\settings.gradle.kts' provides AGP version: 8.11.1
|
||||
[ +2 ms] Running Gradle task 'assembleRelease'...
|
||||
[ +1 ms] executing: [C:\GIT\xtremobile\android/] C:\GIT\xtremobile\android\gradlew.bat --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm64 -Ptarget=lib\main.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=true -Psplit-per-abi=true assembleRelease
|
||||
[+6936 ms] Initialized native services in: C:\Users\Bureau\.gradle\native
|
||||
[ ] Initialized jansi services in: C:\Users\Bureau\.gradle\native
|
||||
[ +428 ms] The client will now receive all logging from the daemon (pid: 37756). The daemon log file: C:\Users\Bureau\.gradle\daemon\8.14\daemon-37756.out.log
|
||||
[ ] Starting 16th build in daemon [uptime: 5 hrs 3 mins 40.974 secs, performance: 100%, GC rate: 0.00/s, heap usage: 1% of 8 GiB, non-heap usage: 5% of 4 GiB]
|
||||
[ +295 ms] Using 12 worker leases.
|
||||
[ +498 ms] Now considering [C:\GIT\xtremobile\android, C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle] as hierarchies to watch
|
||||
[ ] Watching the file system is configured to be enabled if available
|
||||
[ +403 ms] File system watching is active
|
||||
[ ] Starting Build
|
||||
[ +296 ms] Now considering [C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle, C:\GIT\xtremobile\android] as hierarchies to watch
|
||||
[ +903 ms] > Configure project :gradle
|
||||
[ ] Evaluating project ':gradle' using build file 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin']
|
||||
[ ] Resolved plugin [id: 'org.gradle.groovy']
|
||||
[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0']
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20']
|
||||
[ ] Using Kotlin Gradle Plugin gradle85 variant
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef
|
||||
[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef
|
||||
[ ] file or directory 'C:\Users\Bureau\dart\flutter\packages\flutter_tools\gradle\src\main\java', not found
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0']
|
||||
[ ] Resolved plugin [id: 'com.android.application', version: '8.11.1', apply: false]
|
||||
[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.2.20', apply: false]
|
||||
[ +92 ms] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED
|
||||
[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false.
|
||||
[ ] Resolve mutations for :gradle:compileKotlin (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileKotlin (Thread[Execution worker,5,main]) started.
|
||||
[ +407 ms] > Task :gradle:compileKotlin UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:compileKotlin' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:compileJava (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileJava (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:compileJava NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:compileGroovy (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:compileGroovy (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:compileGroovy NO-SOURCE
|
||||
[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files.
|
||||
[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:pluginDescriptors (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:pluginDescriptors UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:pluginDescriptors' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:processResources (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:processResources (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:processResources UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:processResources' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:processResources' as it is up-to-date.
|
||||
[ ] Resolve mutations for :gradle:classes (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:classes (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:classes UP-TO-DATE
|
||||
[ ] Skipping task ':gradle:classes' as it has no actions.
|
||||
[ ] Resolve mutations for :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] :gradle:jar (Thread[Execution worker,5,main]) started.
|
||||
[ ] > Task :gradle:jar UP-TO-DATE
|
||||
[ ] Caching disabled for task ':gradle:jar' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Not worth caching
|
||||
[ ] Skipping task ':gradle:jar' as it is up-to-date.
|
||||
[+1084 ms] Settings evaluated using settings file 'C:\GIT\xtremobile\android\settings.gradle.kts'.
|
||||
[ ] Projects loaded. Root project using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ ] Included projects: [root project 'android', project ':app', project ':media_kit_libs_android_video', project ':media_kit_video', project ':package_info_plus', project ':path_provider_android', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus']
|
||||
[ +808 ms] > Configure project :app
|
||||
[ ] Evaluating project ':app' using build file 'C:\GIT\xtremobile\android\app\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.application']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin']
|
||||
[ ] Using default execution profile
|
||||
[ ] Build 24d5ee4c-182b-4006-976e-5b4419f64465 is started
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] > Configure project :
|
||||
[ ] Evaluating root project 'android' using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ +692 ms] > Configure project :media_kit_libs_android_video
|
||||
[ ] Evaluating project ':media_kit_libs_android_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] > Configure project :media_kit_video
|
||||
[ ] Evaluating project ':media_kit_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +402 ms] > Configure project :package_info_plus
|
||||
[ ] Evaluating project ':package_info_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +296 ms] > Configure project :path_provider_android
|
||||
[ ] Evaluating project ':path_provider_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Using default execution profile
|
||||
[ +793 ms] > Configure project :screen_brightness_android
|
||||
[ ] Evaluating project ':screen_brightness_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +201 ms] > Configure project :shared_preferences_android
|
||||
[ ] Evaluating project ':shared_preferences_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +93 ms] > Configure project :sqflite_android
|
||||
[ ] Evaluating project ':sqflite_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +108 ms] > Configure project :video_player_android
|
||||
[ ] Evaluating project ':video_player_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +794 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +108 ms] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +800 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ +88 ms] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[Execution worker Thread 5,5,main]) started.
|
||||
[+1907 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +124 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +6 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +34 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ +2 ms] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +16 ms] Initializing file store
|
||||
[ ] [ +10 ms] Done initializing file store
|
||||
[ ] [ +43 ms] Skipping target: gen_dart_plugin_registrant
|
||||
[ ] [ +36 ms] Skipping target: dart_build
|
||||
[ ] [ ] Skipping target: gen_localizations
|
||||
[ ] [ +8 ms] Skipping target: install_code_assets
|
||||
[ ] [ +14 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill}
|
||||
@@ -0,0 +1,100 @@
|
||||
[ +92 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +203 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[Execution worker Thread 9,5,main]) started.
|
||||
[+1998 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +130 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +8 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +37 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ +2 ms] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +21 ms] Initializing file store
|
||||
[ ] [ +1 ms] Done initializing file store
|
||||
[ ] [ +14 ms] Skipping target: gen_dart_plugin_registrant
|
||||
[ ] [ +2 ms] Skipping target: dart_build
|
||||
[ ] [ ] Skipping target: gen_localizations
|
||||
[ ] [ ] Skipping target: install_code_assets
|
||||
[ ] [ +2 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill}
|
||||
@@ -0,0 +1,200 @@
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] C/C++: android.ndkVersion from module build.gradle is [28.2.13676358]
|
||||
[ ] C/C++: android.ndkPath from module build.gradle is not set
|
||||
[ ] C/C++: ndk.dir in local.properties is not set
|
||||
[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period.
|
||||
[ ] C/C++: sdkFolder is C:\Android
|
||||
[ ] > Configure project :
|
||||
[ ] Evaluating root project 'android' using build file 'C:\GIT\xtremobile\android\build.gradle.kts'.
|
||||
[ +194 ms] > Configure project :media_kit_libs_android_video
|
||||
[ ] Evaluating project ':media_kit_libs_android_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_libs_android_video-1.3.8\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] > Configure project :media_kit_video
|
||||
[ ] Evaluating project ':media_kit_video' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\media_kit_video-1.3.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ +92 ms] > Configure project :package_info_plus
|
||||
[ ] Evaluating project ':package_info_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\package_info_plus-9.0.0\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +108 ms] > Configure project :path_provider_android
|
||||
[ ] Evaluating project ':path_provider_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\path_provider_android-2.2.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Using default execution profile
|
||||
[ +200 ms] > Configure project :screen_brightness_android
|
||||
[ ] Evaluating project ':screen_brightness_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\screen_brightness_android-2.1.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +91 ms] > Configure project :shared_preferences_android
|
||||
[ ] Evaluating project ':shared_preferences_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\shared_preferences_android-2.4.23\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +107 ms] > Configure project :sqflite_android
|
||||
[ ] Evaluating project ':sqflite_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\sqflite_android-2.4.2+3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] > Configure project :video_player_android
|
||||
[ ] Evaluating project ':video_player_android' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\video_player_android-2.9.5\android\build.gradle.kts'.
|
||||
[ ] Resolved plugin [id: 'com.android.library']
|
||||
[ ] Resolved plugin [id: 'kotlin-android']
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +198 ms] > Configure project :volume_controller
|
||||
[ ] Evaluating project ':volume_controller' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\volume_controller-3.4.3\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ +91 ms] > Configure project :wakelock_plus
|
||||
[ ] Evaluating project ':wakelock_plus' using build file 'C:\Users\Bureau\AppData\Local\Pub\Cache\hosted\pub.dev\wakelock_plus-1.5.1\android\build.gradle'.
|
||||
[ ] Using default execution profile
|
||||
[ ] Using Kotlin Gradle Plugin gradle813 variant
|
||||
[ ] All projects evaluated.
|
||||
[ ] Task name matched 'assembleRelease'
|
||||
[ ] Selected primary task 'assembleRelease' from project :
|
||||
[ +204 ms] Tasks to be executed: [task ':app:ReleaseMinSdkCheck', task ':app:compileFlutterBuildRelease', task ':app:packJniLibsflutterBuildRelease', task ':app:preBuild', task ':app:preReleaseBuild', task ':app:configureCMakeRelease[arm64-v8a]', task ':app:buildCMakeRelease[arm64-v8a]', task ':app:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preReleaseBuild', task ':media_kit_libs_android_video:mergeReleaseJniLibFolders', task ':media_kit_libs_android_video:mergeReleaseNativeLibs', task ':media_kit_libs_android_video:copyReleaseJniLibsProjectOnly', task ':media_kit_video:preBuild', task ':media_kit_video:preReleaseBuild', task ':media_kit_video:mergeReleaseJniLibFolders', task ':media_kit_video:mergeReleaseNativeLibs', task ':media_kit_video:copyReleaseJniLibsProjectOnly', task ':package_info_plus:preBuild', task ':package_info_plus:preReleaseBuild', task ':package_info_plus:mergeReleaseJniLibFolders', task ':package_info_plus:mergeReleaseNativeLibs', task ':package_info_plus:copyReleaseJniLibsProjectOnly', task ':path_provider_android:preBuild', task ':path_provider_android:preReleaseBuild', task ':path_provider_android:mergeReleaseJniLibFolders', task ':path_provider_android:mergeReleaseNativeLibs', task ':path_provider_android:copyReleaseJniLibsProjectOnly', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preReleaseBuild', task ':screen_brightness_android:mergeReleaseJniLibFolders', task ':screen_brightness_android:mergeReleaseNativeLibs', task ':screen_brightness_android:copyReleaseJniLibsProjectOnly', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preReleaseBuild', task ':shared_preferences_android:mergeReleaseJniLibFolders', task ':shared_preferences_android:mergeReleaseNativeLibs', task ':shared_preferences_android:copyReleaseJniLibsProjectOnly', task ':sqflite_android:preBuild', task ':sqflite_android:preReleaseBuild', task ':sqflite_android:mergeReleaseJniLibFolders', task ':sqflite_android:mergeReleaseNativeLibs', task ':sqflite_android:copyReleaseJniLibsProjectOnly', task ':video_player_android:preBuild', task ':video_player_android:preReleaseBuild', task ':video_player_android:mergeReleaseJniLibFolders', task ':video_player_android:mergeReleaseNativeLibs', task ':video_player_android:copyReleaseJniLibsProjectOnly', task ':volume_controller:preBuild', task ':volume_controller:preReleaseBuild', task ':volume_controller:mergeReleaseJniLibFolders', task ':volume_controller:mergeReleaseNativeLibs', task ':volume_controller:copyReleaseJniLibsProjectOnly', task ':wakelock_plus:preBuild', task ':wakelock_plus:preReleaseBuild', task ':wakelock_plus:mergeReleaseJniLibFolders', task ':wakelock_plus:mergeReleaseNativeLibs', task ':wakelock_plus:copyReleaseJniLibsProjectOnly', task ':app:mergeReleaseNativeLibs', task ':app:stripReleaseDebugSymbols', task ':app:extractReleaseNativeSymbolTables', task ':app:mergeReleaseNativeDebugMetadata', task ':media_kit_libs_android_video:generateReleaseResValues', task ':media_kit_libs_android_video:generateReleaseResources', task ':media_kit_libs_android_video:packageReleaseResources', task ':media_kit_libs_android_video:parseReleaseLocalResources', task ':media_kit_libs_android_video:generateReleaseRFile', task ':media_kit_libs_android_video:javaPreCompileRelease', task ':media_kit_libs_android_video:compileReleaseJavaWithJavac', task ':media_kit_libs_android_video:mergeReleaseGeneratedProguardFiles', task ':media_kit_libs_android_video:exportReleaseConsumerProguardFiles', task ':media_kit_video:generateReleaseResValues', task ':media_kit_video:generateReleaseResources', task ':media_kit_video:packageReleaseResources', task ':media_kit_video:parseReleaseLocalResources', task ':media_kit_video:generateReleaseRFile', task ':media_kit_video:javaPreCompileRelease', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:generateReleaseResValues', task ':screen_brightness_android:generateReleaseResources', task ':screen_brightness_android:packageReleaseResources', task ':screen_brightness_android:parseReleaseLocalResources', task ':screen_brightness_android:generateReleaseRFile', task ':screen_brightness_android:compileReleaseKotlin', task ':screen_brightness_android:javaPreCompileRelease', task ':screen_brightness_android:compileReleaseJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarRelease', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:generateReleaseResValues', task ':volume_controller:generateReleaseResources', task ':volume_controller:packageReleaseResources', task ':volume_controller:parseReleaseLocalResources', task ':volume_controller:generateReleaseRFile', task ':volume_controller:compileReleaseKotlin', task ':volume_controller:javaPreCompileRelease', task ':volume_controller:compileReleaseJavaWithJavac', task ':voLine truncated
|
||||
[ +1 ms] Tasks that were excluded: []
|
||||
[ ] work action Parameters of FilterShrinkerRulesTransform (Thread[Execution worker Thread 3,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 3,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 3,5,main]) started.
|
||||
[ ] work action Parameters of ExtractAarTransform (Thread[Execution worker Thread 3,5,main]) started.
|
||||
[ ] Resolve mutations for :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 3,5,main]) started.
|
||||
[ ] :app:ReleaseMinSdkCheck (Thread[Execution worker Thread 7,5,main]) started.
|
||||
[ ] > Task :app:ReleaseMinSdkCheck
|
||||
[ ] Caching disabled for task ':app:ReleaseMinSdkCheck' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Task ':app:ReleaseMinSdkCheck' is not up-to-date because:
|
||||
[ ] Task has not declared any outputs despite executing actions.
|
||||
[ ] Resolve mutations for :app:compileFlutterBuildRelease (Thread[Execution worker Thread 7,5,main]) started.
|
||||
[ ] :app:compileFlutterBuildRelease (Thread[Execution worker Thread 7,5,main]) started.
|
||||
[+1994 ms] > Task :app:compileFlutterBuildRelease
|
||||
[ ] Caching disabled for task ':app:compileFlutterBuildRelease' because:
|
||||
[ ] Build cache is disabled
|
||||
[ ] Caching has not been enabled for the task
|
||||
[ ] Task ':app:compileFlutterBuildRelease' is not up-to-date because:
|
||||
[ ] Task has failed previously.
|
||||
[ ] Starting process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''. Working directory: C:\GIT\xtremobile Command: C:\Users\Bureau\dart\flutter\bin\flutter.bat --verbose assemble --no-version-check --depfile C:\GIT\xtremobile\build\app\intermediates\flutter\release/flutter_build.d --output C:\GIT\xtremobile\build\app\intermediates\flutter\release -dTargetFile=lib\main.dart -dTargetPlatform=android -dBuildMode=release -dTrackWidgetCreation=true -dTreeShakeIcons=true --DartDefines=RkxVVFRFUl9WRVJTSU9OPTMuNDEuNQ==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049MmM5ZWIyMDczOQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDUyZjMxZDExNQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My4xMS4z -dFlavor= -dAndroidArchs=android-arm64 -dMinSdkVersion=24 android_aot_bundle_release_android-arm64
|
||||
[ ] Successfully started process 'command 'C:\Users\Bureau\dart\flutter\bin\flutter.bat''
|
||||
[ ] [ +142 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +7 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ +35 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
|
||||
[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ +3 ms] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
|
||||
[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
|
||||
[ ] [ +18 ms] Initializing file store
|
||||
[ ] [ +1 ms] Done initializing file store
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
Configure Flutter settings.
|
||||
|
||||
To remove a setting, configure it to an empty string.
|
||||
|
||||
The Flutter tool anonymously reports feature usage statistics and basic crash reports to help improve Flutter tools over time. See Google's privacy policy: https://www.google.com/intl/en/policies/privacy/
|
||||
|
||||
Global options:
|
||||
-h, --help Print this usage information.
|
||||
-v, --verbose Noisy logging, including all shell commands executed.
|
||||
If used with "--help", shows hidden options. If used with "flutter doctor", shows additional diagnostic information. (Use "-vv" to force verbose logging in those cases.)
|
||||
-d, --device-id Target device id or name (prefixes allowed).
|
||||
--version Reports the version of this tool.
|
||||
--enable-analytics Enable telemetry reporting each time a flutter or dart command runs.
|
||||
--disable-analytics Disable telemetry reporting each time a flutter or dart command runs, until it is re-enabled.
|
||||
--suppress-analytics Suppress analytics reporting for the current CLI invocation.
|
||||
|
||||
Usage: flutter config [arguments]
|
||||
-h, --help Print this usage information.
|
||||
--list List all settings and their current values.
|
||||
--clear-ios-signing-settings Clear the saved development certificate or provisioning profile choice used to sign apps for iOS device deployment.
|
||||
--select-ios-signing-settings Complete prompt to select and save code signing settings used to sign apps for iOS device deployment.
|
||||
--android-sdk The Android SDK directory.
|
||||
--android-studio-dir The Android Studio installation directory. If unset, flutter will search for valid installations at well-known locations.
|
||||
--jdk-dir The Java Development Kit (JDK) installation directory. If unset, flutter will search for one in the following order:
|
||||
1) the JDK bundled with the latest installation of Android Studio,
|
||||
2) the JDK found at the directory found in the JAVA_HOME environment variable, and
|
||||
3) the directory containing the java binary found in the user's path.
|
||||
--build-dir=<out/> The relative path to override a projects build directory.
|
||||
--[no-]enable-web Enable or disable Flutter for web.
|
||||
(defaults to on)
|
||||
--[no-]enable-linux-desktop Enable or disable support for desktop on Linux.
|
||||
(defaults to on)
|
||||
--[no-]enable-macos-desktop Enable or disable support for desktop on macOS.
|
||||
(defaults to on)
|
||||
--[no-]enable-windows-desktop Enable or disable support for desktop on Windows.
|
||||
(defaults to on)
|
||||
--[no-]enable-android Enable or disable Flutter for Android.
|
||||
(defaults to on)
|
||||
--[no-]enable-ios Enable or disable Flutter for iOS.
|
||||
(defaults to on)
|
||||
--[no-]enable-fuchsia Enable or disable Flutter for Fuchsia.
|
||||
This setting applies only to the master channel.
|
||||
--[no-]enable-custom-devices Enable or disable early support for custom device types.
|
||||
--[no-]cli-animations Enable or disable animations in the command line interface.
|
||||
(defaults to on)
|
||||
--[no-]enable-native-assets Enable or disable native assets compilation and bundling.
|
||||
(defaults to on)
|
||||
--[no-]enable-dart-data-assets Enable or disable Dart data assets building and bundling.
|
||||
This setting applies only to the master channel.
|
||||
--[no-]enable-swift-package-manager Enable or disable support for Swift Package Manager for iOS and macOS.
|
||||
--[no-]omit-legacy-version-file Enable or disable stops writing the legacy version file. If set, the file {FLUTTER_ROOT}/version is no longer written as part of the flutter tool execution; a newer file format has existed for some time in {FLUTTER_ROOT}/bin/cache/flutter.version.json.
|
||||
(defaults to on)
|
||||
--[no-]enable-windowing Enable or disable support for windowing on macOS, Linux, and Windows.
|
||||
This setting applies only to the master channel.
|
||||
--[no-]enable-lldb-debugging Enable or disable support for debugging with LLDB for physical iOS devices. If LLDB debugging is off, Xcode debugging is used instead. Only available for iOS 17 or newer devices. Requires Xcode 26 or greater.
|
||||
(defaults to on)
|
||||
--[no-]enable-uiscene-migration Enable or disable support for migrating to UIScene lifecycle. If enabled, Flutter will migrate your app to iOS UIScene lifecycle if possible or otherwise instruct you to migrate manually.
|
||||
(defaults to on)
|
||||
--clear-features Remove all configured features and restore them to the default values.
|
||||
|
||||
Run "flutter help" to see global options.
|
||||
|
||||
Analytics reporting is currently enabled.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,319 @@
|
||||
Analyzing xtremobile...
|
||||
|
||||
error - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart' - bin_backup\api\auth_handler.dart:3:8 - uri_does_not_exist
|
||||
error - Undefined class 'Router' - bin_backup\api\auth_handler.dart:11:3 - undefined_class
|
||||
error - The method 'Router' isn't defined for the type 'AuthHandler' - bin_backup\api\auth_handler.dart:12:20 - undefined_method
|
||||
error - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart' - bin_backup\api\playlists_handler.dart:3:8 - uri_does_not_exist
|
||||
error - Undefined class 'Router' - bin_backup\api\playlists_handler.dart:11:3 - undefined_class
|
||||
error - The method 'Router' isn't defined for the type 'PlaylistsHandler' - bin_backup\api\playlists_handler.dart:12:20 - undefined_method
|
||||
error - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart' - bin_backup\api\settings_handler.dart:3:8 - uri_does_not_exist
|
||||
error - Undefined class 'Router' - bin_backup\api\settings_handler.dart:11:3 - undefined_class
|
||||
error - The method 'Router' isn't defined for the type 'SettingsHandler' - bin_backup\api\settings_handler.dart:12:20 - undefined_method
|
||||
error - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart' - bin_backup\api\users_handler.dart:3:8 - uri_does_not_exist
|
||||
error - Undefined class 'Router' - bin_backup\api\users_handler.dart:11:3 - undefined_class
|
||||
error - The method 'Router' isn't defined for the type 'UsersHandler' - bin_backup\api\users_handler.dart:12:20 - undefined_method
|
||||
error - Target of URI doesn't exist: 'package:sqlite3/sqlite3.dart' - bin_backup\database\database.dart:2:8 - uri_does_not_exist
|
||||
error - Undefined class 'Database' - bin_backup\database\database.dart:10:14 - undefined_class
|
||||
error - Undefined name 'sqlite3' - bin_backup\database\database.dart:23:11 - undefined_identifier
|
||||
info - Don't invoke 'print' in production code - bin_backup\database\database.dart:26:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\database\database.dart:110:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\middleware\security_middleware.dart:55:11 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\middleware\security_middleware.dart:99:12 - avoid_print
|
||||
error - Target of URI doesn't exist: 'package:shelf_static/shelf_static.dart' - bin_backup\server.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: 'package:shelf_router/shelf_router.dart' - bin_backup\server.dart:7:8 - uri_does_not_exist
|
||||
error - The function 'Router' isn't defined - bin_backup\server.dart:44:21 - undefined_function
|
||||
error - The function 'Router' isn't defined - bin_backup\server.dart:85:22 - undefined_function
|
||||
error - The function 'createStaticHandler' isn't defined - bin_backup\server.dart:109:29 - undefined_function
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:171:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:172:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:173:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:174:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:175:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:180:5 - avoid_print
|
||||
error - Undefined class 'Router' - bin_backup\server.dart:185:27 - undefined_class
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:273:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:325:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:356:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:357:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:372:3 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:373:28 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:408:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:419:11 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:440:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:444:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:469:7 - avoid_print
|
||||
warning - The declaration '_activeStreams' isn't referenced - bin_backup\server.dart:564:28 - unused_element
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:598:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:599:7 - avoid_print
|
||||
warning - The value of the local variable 'isVod' isn't used - bin_backup\server.dart:603:13 - unused_local_variable
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:718:11 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:722:11 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:730:11 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:737:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:751:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\server.dart:752:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:17:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:19:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:24:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:30:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:41:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:46:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:59:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:72:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - bin_backup\services\cleanup_service.dart:103:7 - avoid_print
|
||||
info - Dangling library doc comment - lib\core\api\dns_service.dart:1:1 - dangling_library_doc_comments
|
||||
error - The name '_DnsCacheEntry' isn't a type, so it can't be used as a type argument - lib\core\api\dns_service.dart:28:21 - non_type_as_type_argument
|
||||
warning - The value of the field '_cacheTtlSeconds' isn't used - lib\core\api\dns_service.dart:33:20 - unused_field
|
||||
error - The method '_DnsCacheEntry' isn't defined for the type 'UnifiedDnsService' - lib\core\api\dns_service.dart:65:28 - undefined_method
|
||||
error - The property 'isExpired' can't be unconditionally accessed because the receiver can be 'null' - lib\core\api\dns_service.dart:152:55 - unchecked_use_of_nullable_value
|
||||
error - Classes can't be declared inside other classes - lib\core\api\dns_service.dart:162:10 - class_in_class
|
||||
warning - The declaration '_getOrCreateEncryptionKey' isn't referenced - lib\core\database\hive_service.dart:43:28 - unused_element
|
||||
info - Missing a required trailing comma - lib\core\patterns\stream_resolver_pattern.dart:41:27 - require_trailing_commas
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:43:23 - unnecessary_cast
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:44:27 - unnecessary_cast
|
||||
warning - The value of the field '_availablePlayers' isn't used - lib\core\patterns\video_player_wrapper.dart:9:16 - unused_field
|
||||
error - Enums can't be declared inside classes - lib\core\patterns\video_player_wrapper.dart:12:3 - enum_in_class
|
||||
error - Undefined class 'PlayerType' - lib\core\patterns\video_player_wrapper.dart:15:10 - undefined_class
|
||||
error - Undefined name 'PlayerType' - lib\core\patterns\video_player_wrapper.dart:22:12 - undefined_identifier
|
||||
error - There's no constant named 'no' in 'MPVLogLevel' - lib\core\patterns\video_player_wrapper.dart:53:64 - undefined_enum_constant
|
||||
error - Undefined class 'PlayerType' - lib\core\patterns\video_player_wrapper.dart:78:53 - undefined_class
|
||||
error - Undefined name 'PlayerType' - lib\core\patterns\video_player_wrapper.dart:80:7 - undefined_identifier
|
||||
error - Undefined name 'PlayerType' - lib\core\patterns\video_player_wrapper.dart:81:7 - undefined_identifier
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:40:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:74:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:86:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:18:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:21:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:25:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:28:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:31:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:42:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:47:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:50:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:52:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:56:7 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:68:64 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:69:60 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:151:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:154:35 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\core\utils\device_info.dart:1:1 - dangling_library_doc_comments
|
||||
info - The imported package 'device_info_plus' isn't a dependency of the importing package - lib\core\utils\device_info.dart:7:8 - depend_on_referenced_packages
|
||||
error - Target of URI doesn't exist: 'package:device_info_plus/device_info_plus.dart' - lib\core\utils\device_info.dart:7:8 - uri_does_not_exist
|
||||
error - The method 'DeviceInfoPlugin' isn't defined for the type 'DeviceInfo' - lib\core\utils\device_info.dart:27:26 - undefined_method
|
||||
error - Undefined class 'AndroidDeviceInfo' - lib\core\utils\device_info.dart:52:30 - undefined_class
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\hive_encryption_benchmark.dart:7:27 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:16:13 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:45:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:65:9 - await_only_futures
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:96:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:121:9 - await_only_futures
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:160:15 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:165:124 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:167:118 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:172:122 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:174:116 - require_trailing_commas
|
||||
error - A value of type 'List<dynamic>' can't be returned from the method 'toJson' because it has a return type of 'List<Map<String, dynamic>>' - lib\core\utils\hive_encryption_benchmark.dart:203:12 - return_of_invalid_type
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:231:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:232:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:233:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:234:11 - extra_positional_arguments
|
||||
info - Dangling library doc comment - lib\core\utils\image_cache_config.dart:1:1 - dangling_library_doc_comments
|
||||
info - The imported package 'flutter_cache_manager' isn't a dependency of the importing package - lib\core\utils\image_cache_config.dart:11:8 - depend_on_referenced_packages
|
||||
warning - The value of the field '_cacheSizeInBytes' isn't used - lib\core\utils\image_cache_config.dart:15:20 - unused_field
|
||||
error - The named parameter 'diskUsagePercentageHigh' isn't defined - lib\core\utils\image_cache_config.dart:22:7 - undefined_named_parameter
|
||||
error - The named parameter 'diskUsagePercentageGoal' isn't defined - lib\core\utils\image_cache_config.dart:23:7 - undefined_named_parameter
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\memory_profiler.dart:7:29 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:68:13 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:78:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:90:13 - prefer_interpolation_to_compose_strings
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:129:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:130:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:160:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:161:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:162:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:163:11 - extra_positional_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\startup_profiler.dart:38:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\startup_profiler.dart:42:9 - avoid_print
|
||||
warning - Unused import: 'dart:async' - lib\core\utils\video_profiler.dart:1:8 - unused_import
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:84:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:96:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:100:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:144:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:145:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:146:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:147:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:148:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:149:5 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:96:47 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:132:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:133:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:164:57 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:230:61 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:78 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:112:40 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:223:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:225:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:283:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:373:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:380:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:424:53 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:34:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:36:52 - deprecated_member_use
|
||||
error - Undefined class 'ShortEPG' - lib\features\iptv\screens\lite_player_screen.dart:62:3 - undefined_class
|
||||
error - The method 'getLiveStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\lite_player_screen.dart:185:29 - undefined_method
|
||||
error - The method 'getVodStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\lite_player_screen.dart:187:33 - undefined_method
|
||||
error - The method 'getSeriesStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\lite_player_screen.dart:191:33 - undefined_method
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:205:8 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:226:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:238:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:307:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:312:9 - curly_braces_in_flow_control_structures
|
||||
error - The method 'dispose' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\lite_player_screen.dart:354:21 - undefined_method
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\screens\lite_player_screen.dart:397:41 - prefer_const_constructors
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:412:60 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:465:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:467:7 - curly_braces_in_flow_control_structures
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\lite_player_screen.dart:498:35 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../widgets/mobile_scaffold.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:5:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:11:8 - uri_does_not_exist
|
||||
error - Undefined name 'mobileDashboardIndexProvider' - lib\features\iptv\screens\mobile_dashboard_screen.dart:29:36 - undefined_identifier
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_dashboard_screen.dart:36:13 - undefined_identifier
|
||||
error - The method 'MobileScaffold' isn't defined for the type '_MobileDashboardScreenState' - lib\features\iptv\screens\mobile_dashboard_screen.dart:37:14 - undefined_method
|
||||
error - Undefined name 'mobileDashboardIndexProvider' - lib\features\iptv\screens\mobile_dashboard_screen.dart:40:20 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_playlist_screen.dart:6:8 - uri_does_not_exist
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:230:41 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:232:48 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:374:31 - use_build_context_synchronously
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_playlist_screen.dart:391:13 - undefined_identifier
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:530:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:546:46 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:9:8 - uri_does_not_exist
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:206:13 - undefined_identifier
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:342:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:345:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:364:46 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:7:8 - uri_does_not_exist
|
||||
error - Undefined class 'Series' - lib\features\iptv\screens\mobile_series_detail_screen.dart:13:9 - undefined_class
|
||||
error - Undefined class 'SeriesInfo' - lib\features\iptv\screens\mobile_series_detail_screen.dart:29:3 - undefined_class
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesDetailScreenState' - lib\features\iptv\screens\mobile_series_detail_screen.dart:57:26 - undefined_method
|
||||
error - The method 'getSeriesInfo' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\screens\mobile_series_detail_screen.dart:59:25 - unchecked_use_of_nullable_value
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_series_detail_screen.dart:161:46 - deprecated_member_use
|
||||
error - Undefined class 'Episode' - lib\features\iptv\screens\mobile_series_detail_screen.dart:307:28 - undefined_class
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\screens\mobile_series_detail_screen.dart:308:36 - undefined_identifier
|
||||
error - Undefined name 'MobileWatchHistory' - lib\features\iptv\screens\mobile_series_detail_screen.dart:309:24 - undefined_identifier
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:169:29 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:194:117 - require_trailing_commas
|
||||
error - The method 'dispose' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\native_player_screen.dart:469:21 - undefined_method
|
||||
error - Undefined class 'ShortEPG' - lib\features\iptv\screens\native_player_screen.dart:681:3 - undefined_class
|
||||
error - The method 'getLiveStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\native_player_screen.dart:711:37 - undefined_method
|
||||
error - The method 'getVodStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\native_player_screen.dart:713:37 - undefined_method
|
||||
error - The method 'getSeriesStreamUrl' isn't defined for the type 'XtreamServiceMobile' - lib\features\iptv\screens\native_player_screen.dart:718:37 - undefined_method
|
||||
warning - The declaration '_cycleAudioTrack' isn't referenced - lib\features\iptv\screens\native_player_screen.dart:992:16 - unused_element
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1218:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1396:29 - deprecated_member_use
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:1528:45 - require_trailing_commas
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1693:29 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1695:48 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\features\iptv\services\xtream_service_mobile.dart:1:1 - dangling_library_doc_comments
|
||||
error - The getter 'serverUrl' isn't defined for the type 'PlaylistConfig' - lib\features\iptv\services\xtream_service_mobile.dart:47:23 - undefined_getter
|
||||
error - The getter 'instance' isn't defined for the type 'ApiClient' - lib\features\iptv\services\xtream_service_mobile.dart:52:22 - undefined_getter
|
||||
info - Missing a required trailing comma - lib\features\iptv\services\xtream_service_mobile.dart:130:46 - require_trailing_commas
|
||||
error - The method 'fromJson' isn't defined for the type 'Category' - lib\features\iptv\services\xtream_service_mobile.dart:192:34 - undefined_method
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\services\xtream_service_mobile.dart:203:15 - non_type_as_type_argument
|
||||
error - Undefined name 'Movie' - lib\features\iptv\services\xtream_service_mobile.dart:218:25 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:7:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:8:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:14:8 - uri_does_not_exist
|
||||
error - The method 'Timer' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:45:22 - undefined_method
|
||||
error - Undefined class 'Timer' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:59:3 - undefined_class
|
||||
error - The method 'mobileLiveChannelsProvider' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:76:19 - undefined_method
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:77:33 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:78:32 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:79:31 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:80:33 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:405:22 - undefined_identifier
|
||||
error - The method 'LiveTvUiState' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:406:17 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:423:54 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:426:39 - deprecated_member_use
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:499:31 - undefined_identifier
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileChannelCardState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:570:26 - undefined_method
|
||||
error - The method 'getShortEPG' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:571:33 - unchecked_use_of_nullable_value
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:589:33 - undefined_identifier
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:596:19 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_movies_tab.dart:9:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_movies_tab.dart:10:8 - uri_does_not_exist
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_movies_tab.dart:30:8 - non_type_as_type_argument
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_movies_tab.dart:35:8 - non_type_as_type_argument
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:87:26 - undefined_method
|
||||
error - The method 'searchMovies' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:88:37 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:107:26 - undefined_method
|
||||
error - The method 'getVodCategories' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:108:43 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:132:26 - undefined_method
|
||||
error - The method 'getMoviesByCategory' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:133:36 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:168:26 - undefined_method
|
||||
error - The method 'clearCache' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:169:15 - unchecked_use_of_nullable_value
|
||||
error - Undefined class 'Movie' - lib\features\iptv\widgets\mobile_movies_tab.dart:200:41 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:221:32 - undefined_identifier
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:222:36 - undefined_identifier
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\widgets\mobile_movies_tab.dart:402:53 - prefer_const_constructors
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:476:41 - undefined_identifier
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:496:41 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_series_tab.dart:11:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_series_tab.dart:12:8 - uri_does_not_exist
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:29:14 - non_type_as_type_argument
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:30:8 - non_type_as_type_argument
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:89:26 - undefined_method
|
||||
error - The method 'searchSeries' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:90:37 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:111:26 - undefined_method
|
||||
error - The method 'getSeriesPaginated' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:115:12 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:144:26 - undefined_method
|
||||
error - The method 'clearCache' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:145:15 - unchecked_use_of_nullable_value
|
||||
error - Undefined class 'Series' - lib\features\iptv\widgets\mobile_series_tab.dart:175:20 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_series_tab.dart:193:32 - undefined_identifier
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:195:10 - non_type_as_type_argument
|
||||
error - The property 'categoryName' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:202:60 - unchecked_use_of_nullable_value
|
||||
error - The property 'seriesId' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:211:19 - unchecked_use_of_nullable_value
|
||||
error - The property 'name' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:212:22 - unchecked_use_of_nullable_value
|
||||
error - The property 'cover' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:213:38 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:214:25 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:214:61 - unchecked_use_of_nullable_value
|
||||
error - The property 'seriesId' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:293:42 - unchecked_use_of_nullable_value
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:7:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../widgets/tv_focusable.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:8:8 - uri_does_not_exist
|
||||
error - Undefined class 'MobileSettings' - lib\features\iptv\widgets\mobile_settings_tab.dart:44:25 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:63:32 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:124:23 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:143:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:162:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:180:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:193:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:206:25 - undefined_identifier
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:334:14 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_settings_tab.dart:376:44 - deprecated_member_use
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:410:14 - undefined_method
|
||||
warning - Unused import: 'package:hive_flutter/hive_flutter.dart' - lib\main.dart:3:8 - unused_import
|
||||
info - The import of '../../core/models/iptv_models.dart' is unnecessary because all of the used elements are also provided by the import of '../../features/iptv/models/xtream_models.dart' - lib\mobile\providers\mobile_xtream_providers.dart:3:8 - unnecessary_import
|
||||
error - The returned type 'Future<List<Channel>>' isn't returnable from a 'Future<Map<String, List<Channel>>>' function, as required by the closure's context - lib\mobile\providers\mobile_xtream_providers.dart:27:10 - return_of_invalid_type_from_closure
|
||||
error - 1 positional argument expected by 'getLiveChannels', but 0 found - lib\mobile\providers\mobile_xtream_providers.dart:27:34 - not_enough_positional_arguments
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:32:32 - non_type_as_type_argument
|
||||
error - The method 'getMoviesPaginated' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:34:18 - undefined_method
|
||||
error - The method 'getSeriesPaginated' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:41:18 - undefined_method
|
||||
error - The name 'SeriesInfo' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:46:27 - non_type_as_type_argument
|
||||
error - The name 'SeriesInfo' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:70:27 - non_type_as_type_argument
|
||||
error - The method 'getSeriesInfo' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:73:18 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\theme\mobile_theme.dart:60:50 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:56:24 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:58:58 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:61:43 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:131:32 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:248:36 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:253:41 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:160:34 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:166:34 - deprecated_member_use
|
||||
error - The name 'MyApp' isn't a class - test\widget_test.dart:16:35 - creation_with_non_type
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,31 @@
|
||||
[√] Flutter (Channel stable, 3.41.5, on Microsoft Windows [version 10.0.22631.6199], locale fr-FR) [145ms]
|
||||
• Flutter version 3.41.5 on channel stable at C:\Users\Bureau\dart\flutter
|
||||
• Upstream repository https://github.com/flutter/flutter.git
|
||||
• Framework revision 2c9eb20739 (8 days ago), 2026-03-17 16:14:01 -0700
|
||||
• Engine revision 052f31d115
|
||||
• Dart version 3.11.3
|
||||
• DevTools version 2.54.2
|
||||
• Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration
|
||||
|
||||
[√] Windows Version (11 Professionnel 64 bits, 23H2, 2009) [1 967ms]
|
||||
|
||||
[X] Android toolchain - develop for Android devices [17ms]
|
||||
X ANDROID_HOME = C:\Users\Bureau\AppData\Local\Android\Sdk
|
||||
but Android SDK not found at this location.
|
||||
|
||||
[√] Chrome - develop for the web [6ms]
|
||||
• Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
|
||||
|
||||
[X] Visual Studio - develop Windows apps [5ms]
|
||||
X Visual Studio not installed; this is necessary to develop Windows apps.
|
||||
Download at https://visualstudio.microsoft.com/downloads/.
|
||||
Please install the "Desktop development with C++" workload, including all of its default components
|
||||
|
||||
[√] Connected device (2 available) [58ms]
|
||||
• Windows (desktop) • windows • windows-x64 • Microsoft Windows [version 10.0.22631.6199]
|
||||
• Chrome (web) • chrome • web-javascript • Google Chrome 145.0.7632.160
|
||||
|
||||
[√] Network resources [309ms]
|
||||
• All expected network resources are available.
|
||||
|
||||
! Doctor found issues in 2 categories.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,31 @@
|
||||
[] Flutter (Channel stable, 3.41.5, on Microsoft Windows [version 10.0.22631.6199], locale fr-FR) [169ms]
|
||||
ÔÇó Flutter version 3.41.5 on channel stable at C:\Users\Bureau\dart\flutter
|
||||
ÔÇó Upstream repository https://github.com/flutter/flutter.git
|
||||
ÔÇó Framework revision 2c9eb20739 (8 days ago), 2026-03-17 16:14:01 -0700
|
||||
ÔÇó Engine revision 052f31d115
|
||||
ÔÇó Dart version 3.11.3
|
||||
ÔÇó DevTools version 2.54.2
|
||||
ÔÇó Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration
|
||||
|
||||
[] Windows Version (11 Professionnel 64 bits, 23H2, 2009) [2,6s]
|
||||
|
||||
[X] Android toolchain - develop for Android devices [21ms]
|
||||
X ANDROID_HOME = C:\Users\Bureau\AppData\Local\Android\Sdk
|
||||
but Android SDK not found at this location.
|
||||
|
||||
[] Chrome - develop for the web [8ms]
|
||||
ÔÇó Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
|
||||
|
||||
[X] Visual Studio - develop Windows apps [6ms]
|
||||
X Visual Studio not installed; this is necessary to develop Windows apps.
|
||||
Download at https://visualstudio.microsoft.com/downloads/.
|
||||
Please install the "Desktop development with C++" workload, including all of its default components
|
||||
|
||||
[] Connected device (2 available) [83ms]
|
||||
ÔÇó Windows (desktop) ÔÇó windows ÔÇó windows-x64 ÔÇó Microsoft Windows [version 10.0.22631.6199]
|
||||
ÔÇó Chrome (web) ÔÇó chrome ÔÇó web-javascript ÔÇó Google Chrome 145.0.7632.160
|
||||
|
||||
[] Network resources [327ms]
|
||||
ÔÇó All expected network resources are available.
|
||||
|
||||
! Doctor found issues in 2 categories.
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,239 @@
|
||||
Analyzing xtremobile...
|
||||
|
||||
info - Dangling library doc comment - lib\core\api\dns_service.dart:1:1 - dangling_library_doc_comments
|
||||
warning - The value of the field '_cacheTtlSeconds' isn't used - lib\core\api\dns_service.dart:33:20 - unused_field
|
||||
warning - The declaration '_getOrCreateEncryptionKey' isn't referenced - lib\core\database\hive_service.dart:43:28 - unused_element
|
||||
info - Missing a required trailing comma - lib\core\patterns\stream_resolver_pattern.dart:41:27 - require_trailing_commas
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:43:23 - unnecessary_cast
|
||||
warning - Unnecessary cast - lib\core\patterns\stream_resolver_pattern.dart:44:27 - unnecessary_cast
|
||||
warning - Unused import: 'package:media_kit_video/media_kit_video.dart' - lib\core\patterns\video_player_wrapper.dart:3:8 - unused_import
|
||||
warning - The value of the field '_availablePlayers' isn't used - lib\core\patterns\video_player_wrapper.dart:15:16 - unused_field
|
||||
error - There's no constant named 'no' in 'MPVLogLevel' - lib\core\patterns\video_player_wrapper.dart:56:64 - undefined_enum_constant
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:40:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:74:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\playlist_api_service.dart:86:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:13:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:18:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:21:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:25:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:28:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:31:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:42:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:47:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:50:7 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:52:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\services\settings_api_service.dart:56:7 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:68:64 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_colors.dart:69:60 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:151:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\theme\app_theme.dart:154:35 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\core\utils\device_info.dart:1:1 - dangling_library_doc_comments
|
||||
warning - Unused import: 'dart:io' - lib\core\utils\device_info.dart:6:8 - unused_import
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\hive_encryption_benchmark.dart:7:27 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:16:13 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:45:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:65:9 - await_only_futures
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:96:46 - require_trailing_commas
|
||||
info - Uses 'await' on an instance of 'String', which is not a subtype of 'Future' - lib\core\utils\hive_encryption_benchmark.dart:121:9 - await_only_futures
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\hive_encryption_benchmark.dart:160:15 - prefer_interpolation_to_compose_strings
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:165:124 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:167:118 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:172:122 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\core\utils\hive_encryption_benchmark.dart:174:116 - require_trailing_commas
|
||||
error - A value of type 'List<dynamic>' can't be returned from the method 'toJson' because it has a return type of 'List<Map<String, dynamic>>' - lib\core\utils\hive_encryption_benchmark.dart:203:12 - return_of_invalid_type
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:231:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:232:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:233:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\hive_encryption_benchmark.dart:234:11 - extra_positional_arguments
|
||||
info - Dangling library doc comment - lib\core\utils\image_cache_config.dart:1:1 - dangling_library_doc_comments
|
||||
warning - The value of the field '_cacheSizeInBytes' isn't used - lib\core\utils\image_cache_config.dart:15:20 - unused_field
|
||||
error - The named parameter 'diskUsagePercentageHigh' isn't defined - lib\core\utils\image_cache_config.dart:22:7 - undefined_named_parameter
|
||||
error - The named parameter 'diskUsagePercentageGoal' isn't defined - lib\core\utils\image_cache_config.dart:23:7 - undefined_named_parameter
|
||||
error - List literals require one type argument or none, but 2 found - lib\core\utils\memory_profiler.dart:7:29 - expected_one_list_type_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:68:13 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:78:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\memory_profiler.dart:90:13 - prefer_interpolation_to_compose_strings
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:129:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:130:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:160:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:161:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:162:11 - extra_positional_arguments
|
||||
error - Too many positional arguments: 0 expected, but 1 found - lib\core\utils\memory_profiler.dart:163:11 - extra_positional_arguments
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\startup_profiler.dart:38:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\startup_profiler.dart:42:9 - avoid_print
|
||||
warning - Unused import: 'dart:async' - lib\core\utils\video_profiler.dart:1:8 - unused_import
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:84:15 - prefer_interpolation_to_compose_strings
|
||||
info - Use interpolation to compose strings and values - lib\core\utils\video_profiler.dart:96:13 - prefer_interpolation_to_compose_strings
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:100:9 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:144:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:145:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:146:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:147:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:148:5 - avoid_print
|
||||
info - Don't invoke 'print' in production code - lib\core\utils\video_profiler.dart:149:5 - avoid_print
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:96:47 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:132:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:133:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:164:57 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:230:61 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:46 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\hero_carousel.dart:231:78 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:112:40 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:223:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:225:35 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:283:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:373:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:380:51 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\components\ui_components.dart:424:53 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:34:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\core\widgets\digital_clock.dart:36:52 - deprecated_member_use
|
||||
error - Undefined class 'ShortEPG' - lib\features\iptv\screens\lite_player_screen.dart:62:3 - undefined_class
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:205:8 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:226:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:238:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:307:9 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:312:9 - curly_braces_in_flow_control_structures
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\screens\lite_player_screen.dart:397:41 - prefer_const_constructors
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\lite_player_screen.dart:412:60 - require_trailing_commas
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:465:7 - curly_braces_in_flow_control_structures
|
||||
info - Statements in an if should be enclosed in a block - lib\features\iptv\screens\lite_player_screen.dart:467:7 - curly_braces_in_flow_control_structures
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\lite_player_screen.dart:498:35 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../widgets/mobile_scaffold.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:5:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\screens\mobile_dashboard_screen.dart:11:8 - uri_does_not_exist
|
||||
error - Undefined name 'mobileDashboardIndexProvider' - lib\features\iptv\screens\mobile_dashboard_screen.dart:29:36 - undefined_identifier
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_dashboard_screen.dart:36:13 - undefined_identifier
|
||||
error - The method 'MobileScaffold' isn't defined for the type '_MobileDashboardScreenState' - lib\features\iptv\screens\mobile_dashboard_screen.dart:37:14 - undefined_method
|
||||
error - Undefined name 'mobileDashboardIndexProvider' - lib\features\iptv\screens\mobile_dashboard_screen.dart:40:20 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_playlist_screen.dart:6:8 - uri_does_not_exist
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:230:41 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:232:48 - use_build_context_synchronously
|
||||
info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - lib\features\iptv\screens\mobile_playlist_screen.dart:374:31 - use_build_context_synchronously
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_playlist_screen.dart:391:13 - undefined_identifier
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:530:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_screen.dart:546:46 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:9:8 - uri_does_not_exist
|
||||
error - Undefined name 'MobileTheme' - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:206:13 - undefined_identifier
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:342:52 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:345:33 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_playlist_selection_screen.dart:364:46 - deprecated_member_use
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:6:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\screens\mobile_series_detail_screen.dart:7:8 - uri_does_not_exist
|
||||
error - Undefined class 'Series' - lib\features\iptv\screens\mobile_series_detail_screen.dart:13:9 - undefined_class
|
||||
error - Undefined class 'SeriesInfo' - lib\features\iptv\screens\mobile_series_detail_screen.dart:29:3 - undefined_class
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesDetailScreenState' - lib\features\iptv\screens\mobile_series_detail_screen.dart:57:26 - undefined_method
|
||||
error - The method 'getSeriesInfo' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\screens\mobile_series_detail_screen.dart:59:25 - unchecked_use_of_nullable_value
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\mobile_series_detail_screen.dart:161:46 - deprecated_member_use
|
||||
error - Undefined class 'Episode' - lib\features\iptv\screens\mobile_series_detail_screen.dart:307:28 - undefined_class
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\screens\mobile_series_detail_screen.dart:308:36 - undefined_identifier
|
||||
error - Undefined name 'MobileWatchHistory' - lib\features\iptv\screens\mobile_series_detail_screen.dart:309:24 - undefined_identifier
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:169:29 - require_trailing_commas
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:194:117 - require_trailing_commas
|
||||
error - Undefined class 'ShortEPG' - lib\features\iptv\screens\native_player_screen.dart:681:3 - undefined_class
|
||||
warning - The declaration '_cycleAudioTrack' isn't referenced - lib\features\iptv\screens\native_player_screen.dart:992:16 - unused_element
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1218:31 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1396:29 - deprecated_member_use
|
||||
info - Missing a required trailing comma - lib\features\iptv\screens\native_player_screen.dart:1528:45 - require_trailing_commas
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1693:29 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\screens\native_player_screen.dart:1695:48 - deprecated_member_use
|
||||
info - Dangling library doc comment - lib\features\iptv\services\xtream_service_mobile.dart:1:1 - dangling_library_doc_comments
|
||||
error - The getter 'serverUrl' isn't defined for the type 'PlaylistConfig' - lib\features\iptv\services\xtream_service_mobile.dart:47:23 - undefined_getter
|
||||
error - The getter 'instance' isn't defined for the type 'ApiClient' - lib\features\iptv\services\xtream_service_mobile.dart:52:22 - undefined_getter
|
||||
info - Missing a required trailing comma - lib\features\iptv\services\xtream_service_mobile.dart:130:46 - require_trailing_commas
|
||||
error - The method 'fromJson' isn't defined for the type 'Category' - lib\features\iptv\services\xtream_service_mobile.dart:192:34 - undefined_method
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\services\xtream_service_mobile.dart:203:15 - non_type_as_type_argument
|
||||
error - Undefined name 'Movie' - lib\features\iptv\services\xtream_service_mobile.dart:218:25 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:7:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:8:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../theme/mobile_theme.dart' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:14:8 - uri_does_not_exist
|
||||
error - The method 'Timer' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:45:22 - undefined_method
|
||||
error - Undefined class 'Timer' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:59:3 - undefined_class
|
||||
error - The method 'mobileLiveChannelsProvider' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:76:19 - undefined_method
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:77:33 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:78:32 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:79:31 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:80:33 - undefined_identifier
|
||||
error - Undefined name 'mobileLiveTvUiStateProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:405:22 - undefined_identifier
|
||||
error - The method 'LiveTvUiState' isn't defined for the type '_MobileLiveTVTabState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:406:17 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:423:54 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_live_tv_tab.dart:426:39 - deprecated_member_use
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:499:31 - undefined_identifier
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileChannelCardState' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:570:26 - undefined_method
|
||||
error - The method 'getShortEPG' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:571:33 - unchecked_use_of_nullable_value
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:589:33 - undefined_identifier
|
||||
error - Undefined name 'mobileFavoritesProvider' - lib\features\iptv\widgets\mobile_live_tv_tab.dart:596:19 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_movies_tab.dart:9:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_movies_tab.dart:10:8 - uri_does_not_exist
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_movies_tab.dart:30:8 - non_type_as_type_argument
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_movies_tab.dart:35:8 - non_type_as_type_argument
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:87:26 - undefined_method
|
||||
error - The method 'searchMovies' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:88:37 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:107:26 - undefined_method
|
||||
error - The method 'getVodCategories' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:108:43 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:132:26 - undefined_method
|
||||
error - The method 'getMoviesByCategory' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:133:36 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileMoviesTabState' - lib\features\iptv\widgets\mobile_movies_tab.dart:168:26 - undefined_method
|
||||
error - The method 'clearCache' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_movies_tab.dart:169:15 - unchecked_use_of_nullable_value
|
||||
error - Undefined class 'Movie' - lib\features\iptv\widgets\mobile_movies_tab.dart:200:41 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:221:32 - undefined_identifier
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:222:36 - undefined_identifier
|
||||
info - Use 'const' with the constructor to improve performance - lib\features\iptv\widgets\mobile_movies_tab.dart:402:53 - prefer_const_constructors
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:476:41 - undefined_identifier
|
||||
error - Undefined name 'mobileWatchHistoryProvider' - lib\features\iptv\widgets\mobile_movies_tab.dart:496:41 - undefined_identifier
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_series_tab.dart:11:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_xtream_providers.dart' - lib\features\iptv\widgets\mobile_series_tab.dart:12:8 - uri_does_not_exist
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:29:14 - non_type_as_type_argument
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:30:8 - non_type_as_type_argument
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:89:26 - undefined_method
|
||||
error - The method 'searchSeries' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:90:37 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:111:26 - undefined_method
|
||||
error - The method 'getSeriesPaginated' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:115:12 - unchecked_use_of_nullable_value
|
||||
error - The method 'mobileXtreamServiceProvider' isn't defined for the type '_MobileSeriesTabState' - lib\features\iptv\widgets\mobile_series_tab.dart:144:26 - undefined_method
|
||||
error - The method 'clearCache' can't be unconditionally invoked because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:145:15 - unchecked_use_of_nullable_value
|
||||
error - Undefined class 'Series' - lib\features\iptv\widgets\mobile_series_tab.dart:175:20 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_series_tab.dart:193:32 - undefined_identifier
|
||||
error - The name 'Series' isn't a type, so it can't be used as a type argument - lib\features\iptv\widgets\mobile_series_tab.dart:195:10 - non_type_as_type_argument
|
||||
error - The property 'categoryName' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:202:60 - unchecked_use_of_nullable_value
|
||||
error - The property 'seriesId' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:211:19 - unchecked_use_of_nullable_value
|
||||
error - The property 'name' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:212:22 - unchecked_use_of_nullable_value
|
||||
error - The property 'cover' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:213:38 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:214:25 - unchecked_use_of_nullable_value
|
||||
error - The property 'rating' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:214:61 - unchecked_use_of_nullable_value
|
||||
error - The property 'seriesId' can't be unconditionally accessed because the receiver can be 'null' - lib\features\iptv\widgets\mobile_series_tab.dart:293:42 - unchecked_use_of_nullable_value
|
||||
error - Target of URI doesn't exist: '../../../providers/mobile_settings_providers.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:7:8 - uri_does_not_exist
|
||||
error - Target of URI doesn't exist: '../../../widgets/tv_focusable.dart' - lib\features\iptv\widgets\mobile_settings_tab.dart:8:8 - uri_does_not_exist
|
||||
error - Undefined class 'MobileSettings' - lib\features\iptv\widgets\mobile_settings_tab.dart:44:25 - undefined_class
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:63:32 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:124:23 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:143:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:162:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:180:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:193:25 - undefined_identifier
|
||||
error - Undefined name 'mobileSettingsProvider' - lib\features\iptv\widgets\mobile_settings_tab.dart:206:25 - undefined_identifier
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:334:14 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\iptv\widgets\mobile_settings_tab.dart:376:44 - deprecated_member_use
|
||||
error - The method 'TVFocusable' isn't defined for the type '_MobileSettingsTabState' - lib\features\iptv\widgets\mobile_settings_tab.dart:410:14 - undefined_method
|
||||
warning - Unused import: 'package:hive_flutter/hive_flutter.dart' - lib\main.dart:3:8 - unused_import
|
||||
info - The import of '../../core/models/iptv_models.dart' is unnecessary because all of the used elements are also provided by the import of '../../features/iptv/models/xtream_models.dart' - lib\mobile\providers\mobile_xtream_providers.dart:3:8 - unnecessary_import
|
||||
error - The returned type 'Future<List<Channel>>' isn't returnable from a 'Future<Map<String, List<Channel>>>' function, as required by the closure's context - lib\mobile\providers\mobile_xtream_providers.dart:27:10 - return_of_invalid_type_from_closure
|
||||
error - 1 positional argument expected by 'getLiveChannels', but 0 found - lib\mobile\providers\mobile_xtream_providers.dart:27:34 - not_enough_positional_arguments
|
||||
error - The name 'Movie' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:32:32 - non_type_as_type_argument
|
||||
error - The method 'getMoviesPaginated' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:34:18 - undefined_method
|
||||
error - The method 'getSeriesPaginated' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:41:18 - undefined_method
|
||||
error - The name 'SeriesInfo' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:46:27 - non_type_as_type_argument
|
||||
error - The name 'SeriesInfo' isn't a type, so it can't be used as a type argument - lib\mobile\providers\mobile_xtream_providers.dart:70:27 - non_type_as_type_argument
|
||||
error - The method 'getSeriesInfo' isn't defined for the type 'XtreamServiceMobile' - lib\mobile\providers\mobile_xtream_providers.dart:73:18 - undefined_method
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\theme\mobile_theme.dart:60:50 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:56:24 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:58:58 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:61:43 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:131:32 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:248:36 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\mobile_scaffold.dart:253:41 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:160:34 - deprecated_member_use
|
||||
info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\mobile\widgets\tv_focusable.dart:166:34 - deprecated_member_use
|
||||
info - The imported package 'xtremflow' isn't a dependency of the importing package - test\widget_test.dart:11:8 - depend_on_referenced_packages
|
||||
error - Target of URI doesn't exist: 'package:xtremflow/main.dart' - test\widget_test.dart:11:8 - uri_does_not_exist
|
||||
error - The name 'MyApp' isn't a class - test\widget_test.dart:16:35 - creation_with_non_type
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
[ ] [ +2 ms] kernel_snapshot_program: Starting due to {InvalidatedReasonKind.outputSetAddition: The following outputs were added to the output set: C:\GIT\xtremobile\.dart_tool\flutter_build\eece2bdc462580013a9f8e1cf6058754\app.dill}
|
||||
@@ -52,6 +52,9 @@ class ApiClient {
|
||||
return _token;
|
||||
}
|
||||
|
||||
/// Get underlying Dio instance for direct use
|
||||
Dio get dio => _dio;
|
||||
|
||||
/// Restore token from SharedPreferences
|
||||
Future<void> restoreToken() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
@@ -139,14 +139,6 @@ class UnifiedDnsService {
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Clear DNS cache
|
||||
void clearCache() {
|
||||
_cache.clear();
|
||||
if (kDebugMode) {
|
||||
debugPrint('🗑️ DNS cache cleared');
|
||||
}
|
||||
}
|
||||
|
||||
/// Get cache stats for debugging
|
||||
Map<String, dynamic> getCacheStats() {
|
||||
final expiredCount = _cache.values.where((e) => e.isExpired).length;
|
||||
@@ -158,14 +150,22 @@ class UnifiedDnsService {
|
||||
};
|
||||
}
|
||||
|
||||
/// Cache entry with TTL
|
||||
static class _DnsCacheEntry {
|
||||
final String ip;
|
||||
final DateTime timestamp;
|
||||
|
||||
_DnsCacheEntry(this.ip) : timestamp = DateTime.now();
|
||||
|
||||
bool get isExpired =>
|
||||
DateTime.now().difference(timestamp).inSeconds > _cacheTtlSeconds;
|
||||
/// Clear DNS cache
|
||||
void clearCache() {
|
||||
_cache.clear();
|
||||
if (kDebugMode) {
|
||||
debugPrint('🗑️ DNS cache cleared');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Cache entry with TTL
|
||||
class _DnsCacheEntry {
|
||||
final String ip;
|
||||
final DateTime timestamp;
|
||||
|
||||
_DnsCacheEntry(this.ip) : timestamp = DateTime.now();
|
||||
|
||||
bool get isExpired =>
|
||||
DateTime.now().difference(timestamp).inSeconds > 3600;
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
import 'dart:convert';
|
||||
|
||||
enum StreamType { live, vod, series }
|
||||
|
||||
/// Channel model for Live TV
|
||||
class Channel {
|
||||
final String streamId;
|
||||
@@ -101,6 +104,7 @@ class Series {
|
||||
final String plot;
|
||||
final String categoryId;
|
||||
final String categoryName;
|
||||
final String rating;
|
||||
|
||||
const Series({
|
||||
required this.seriesId,
|
||||
@@ -109,6 +113,7 @@ class Series {
|
||||
this.plot = '',
|
||||
required this.categoryId,
|
||||
required this.categoryName,
|
||||
this.rating = '0',
|
||||
});
|
||||
|
||||
factory Series.fromJson(Map<String, dynamic> json) {
|
||||
@@ -119,6 +124,7 @@ class Series {
|
||||
plot: json['plot']?.toString() ?? '',
|
||||
categoryId: json['category_id']?.toString() ?? '',
|
||||
categoryName: json['category_name']?.toString() ?? '',
|
||||
rating: json['rating']?.toString() ?? '0',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -130,8 +136,14 @@ class Series {
|
||||
'plot': plot,
|
||||
'category_id': categoryId,
|
||||
'category_name': categoryName,
|
||||
'rating': rating,
|
||||
};
|
||||
}
|
||||
|
||||
/// UI Compatibility getters
|
||||
String get streamId => seriesId;
|
||||
String get coverUrl => cover;
|
||||
String get title => name;
|
||||
}
|
||||
|
||||
/// EPG (Electronic Program Guide) entry
|
||||
@@ -192,9 +204,152 @@ class EpgEntry {
|
||||
final totalDuration = endTime.difference(startTime).inSeconds;
|
||||
final elapsed = now.difference(startTime).inSeconds;
|
||||
|
||||
if (totalDuration == 0) return 0.0;
|
||||
return elapsed / totalDuration;
|
||||
} catch (e) {
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Category model
|
||||
class Category {
|
||||
final String categoryId;
|
||||
final String categoryName;
|
||||
final int parentId;
|
||||
|
||||
const Category({
|
||||
required this.categoryId,
|
||||
required this.categoryName,
|
||||
this.parentId = 0,
|
||||
});
|
||||
|
||||
factory Category.fromJson(Map<String, dynamic> json) {
|
||||
return Category(
|
||||
categoryId: json['category_id']?.toString() ?? '',
|
||||
categoryName: json['category_name']?.toString() ?? '',
|
||||
parentId: int.tryParse(json['parent_id']?.toString() ?? '0') ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'category_id': categoryId,
|
||||
'category_name': categoryName,
|
||||
'parent_id': parentId,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// Series Episode model
|
||||
class Episode {
|
||||
final String id;
|
||||
final String title;
|
||||
final String containerExtension;
|
||||
final String season;
|
||||
final int episodeNum;
|
||||
final int duration;
|
||||
|
||||
const Episode({
|
||||
required this.id,
|
||||
required this.title,
|
||||
this.containerExtension = 'mp4',
|
||||
this.season = '1',
|
||||
this.episodeNum = 1,
|
||||
this.duration = 0,
|
||||
});
|
||||
|
||||
/// UI Compatibility getters
|
||||
String get streamId => id;
|
||||
int? get durationSecs => duration;
|
||||
int get seasonNum => int.tryParse(season) ?? 1;
|
||||
|
||||
factory Episode.fromJson(Map<String, dynamic> json) {
|
||||
return Episode(
|
||||
id: json['id']?.toString() ?? '',
|
||||
title: json['title']?.toString() ?? '',
|
||||
containerExtension: json['container_extension']?.toString() ?? 'mp4',
|
||||
season: json['season']?.toString() ?? '1',
|
||||
episodeNum: int.tryParse(json['episode_num']?.toString() ?? '1') ?? 1,
|
||||
duration: int.tryParse(json['duration']?.toString() ?? '0') ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'title': title,
|
||||
'container_extension': containerExtension,
|
||||
'season': season,
|
||||
'episode_num': episodeNum,
|
||||
'duration': duration,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// Detailed Series Info
|
||||
class SeriesInfo {
|
||||
final Series series;
|
||||
final Map<String, List<Episode>> episodes;
|
||||
|
||||
const SeriesInfo({
|
||||
required this.series,
|
||||
required this.episodes,
|
||||
});
|
||||
|
||||
/// UI Compatibility getters
|
||||
String? get coverUrl => series.cover;
|
||||
String get title => series.name;
|
||||
String? get rating => series.rating;
|
||||
String? get plot => series.plot;
|
||||
}
|
||||
|
||||
/// Short EPG model
|
||||
class ShortEPG {
|
||||
final String id;
|
||||
final String title;
|
||||
final String start;
|
||||
final String end;
|
||||
final String description;
|
||||
|
||||
const ShortEPG({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.start,
|
||||
required this.end,
|
||||
this.description = '',
|
||||
});
|
||||
|
||||
factory ShortEPG.fromJson(Map<String, dynamic> json) {
|
||||
return ShortEPG(
|
||||
id: json['id']?.toString() ?? '',
|
||||
title: json['title']?.toString() ?? '',
|
||||
start: json['start']?.toString() ?? '',
|
||||
end: json['end']?.toString() ?? '',
|
||||
description: json['description']?.toString() ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
/// Get progress percentage (compatibility with UI expectations)
|
||||
double get progress {
|
||||
try {
|
||||
final startTime = DateTime.parse(start);
|
||||
final endTime = DateTime.parse(end);
|
||||
final now = DateTime.now();
|
||||
if (now.isBefore(startTime)) return 0.0;
|
||||
if (now.isAfter(endTime)) return 1.0;
|
||||
final total = endTime.difference(startTime).inSeconds;
|
||||
final elapsed = now.difference(startTime).inSeconds;
|
||||
if (total == 0) return 0.0;
|
||||
return elapsed / total;
|
||||
} catch (_) {
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
/// Get current program title
|
||||
String get nowPlaying => title;
|
||||
|
||||
/// Get next program info (mocked or from data if available)
|
||||
String get nextPlaying => "Next Program";
|
||||
}
|
||||
@@ -40,8 +40,8 @@ class StreamResolverPattern {
|
||||
_performDnsResolution(streamUrl).timeout(timeout, onTimeout: () => false),
|
||||
], eagerError: false).catchError((_) => [false, false]);
|
||||
|
||||
final isValid = results[0] as bool;
|
||||
final dnsResolved = results[1] as bool;
|
||||
final isValid = results[0];
|
||||
final dnsResolved = results[1];
|
||||
|
||||
if (!isValid) {
|
||||
return StreamResolverPattern(
|
||||
|
||||
@@ -2,15 +2,18 @@ import 'package:flutter/material.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:media_kit_video/media_kit_video.dart';
|
||||
|
||||
/// Video player selection and wrapper pattern
|
||||
/// Abstracts between MediaKit and other video players
|
||||
/// Handles fallback logic and player initialization
|
||||
/// Enum for supported players
|
||||
enum PlayerType { mediakit, native }
|
||||
|
||||
/// Video player selection and wrapper pattern
|
||||
/// Abstracts between MediaKit and other video players
|
||||
/// Handles fallback logic and player initialization
|
||||
class VideoPlayerWrapper {
|
||||
static const _availablePlayers = ['mediakit'];
|
||||
|
||||
/// Enum for supported players
|
||||
enum PlayerType { mediakit, native }
|
||||
|
||||
/// Get the preferred player type based on stream and platform
|
||||
static PlayerType getPreferredPlayer({
|
||||
required String streamUrl,
|
||||
@@ -50,7 +53,7 @@ class VideoPlayerWrapper {
|
||||
}) {
|
||||
final player = Player(
|
||||
configuration: PlayerConfiguration(
|
||||
logLevel: enableLogs ? MPVLogLevel.debug : MPVLogLevel.no,
|
||||
logLevel: enableLogs ? MPVLogLevel.debug : MPVLogLevel.error,
|
||||
),
|
||||
);
|
||||
return player;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
/// Solution: Specify memCacheWidth/Height for display size, limiting disk cache.
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
|
||||
/// Standard cache manager with 200MB size limit
|
||||
@@ -18,8 +19,6 @@ class AppCacheManager {
|
||||
'xtremflow_image_cache',
|
||||
stalePeriod: const Duration(days: 7),
|
||||
maxNrOfCacheObjects: 500,
|
||||
diskUsagePercentageHigh: 95,
|
||||
diskUsagePercentageGoal: 80,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,22 +6,21 @@ import 'package:video_player/video_player.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:xtremflow/core/models/iptv_models.dart';
|
||||
import 'package:xtremflow/core/models/playlist_config.dart';
|
||||
import 'package:xtremflow/features/iptv/services/xtream_service_mobile.dart';
|
||||
import 'package:xtremflow/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremflow/core/theme/app_colors.dart';
|
||||
import 'package:xtremflow/features/iptv/screens/native_player_screen.dart';
|
||||
import 'package:xtremflow/features/iptv/models/xtream_models.dart' as xm;
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart' as model;
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/features/iptv/services/xtream_service_mobile.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/native_player_screen.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
|
||||
class LitePlayerScreen extends ConsumerStatefulWidget {
|
||||
final String streamId;
|
||||
final String title;
|
||||
final StreamType streamType;
|
||||
final model.StreamType streamType;
|
||||
final String? containerExtension;
|
||||
final PlaylistConfig playlist;
|
||||
final List<Channel>? channels;
|
||||
final List<model.Channel>? channels;
|
||||
final int initialIndex;
|
||||
|
||||
// For series episodes
|
||||
@@ -59,7 +58,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
bool _isPlaying = false;
|
||||
|
||||
// EPG & Clock
|
||||
xm.ShortEPG? _epg;
|
||||
model.ShortEPG? _epg;
|
||||
Timer? _epgTimer;
|
||||
String _currentTime = "";
|
||||
Timer? _clockTimer;
|
||||
@@ -135,7 +134,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
await _xtreamService!.setPlaylistAsync(widget.playlist);
|
||||
_loadStream();
|
||||
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
_updateEPG();
|
||||
_epgTimer = Timer.periodic(
|
||||
const Duration(minutes: 5),
|
||||
@@ -148,7 +147,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
}
|
||||
|
||||
Future<void> _updateEPG() async {
|
||||
if (widget.streamType != StreamType.live || _xtreamService == null) return;
|
||||
if (widget.streamType != model.StreamType.live || _xtreamService == null) return;
|
||||
try {
|
||||
final currentChannelId =
|
||||
widget.channels?[_currentIndex].streamId ?? widget.streamId;
|
||||
@@ -179,11 +178,11 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
? widget.channels![_currentIndex].streamId
|
||||
: widget.streamId;
|
||||
|
||||
if (widget.streamType == StreamType.live) _updateEPG();
|
||||
if (widget.streamType == model.StreamType.live) _updateEPG();
|
||||
|
||||
final streamUrl = widget.streamType == StreamType.live
|
||||
final streamUrl = widget.streamType == model.StreamType.live
|
||||
? _xtreamService!.getLiveStreamUrl(currentStreamId)
|
||||
: (widget.streamType == StreamType.vod
|
||||
: (widget.streamType == model.StreamType.vod
|
||||
? _xtreamService!.getVodStreamUrl(
|
||||
currentStreamId,
|
||||
widget.containerExtension ?? 'mp4',
|
||||
@@ -210,7 +209,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
}
|
||||
|
||||
// Buffer Optimization: Pre-roll delay for TS streams
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
await Future.delayed(const Duration(milliseconds: 2000));
|
||||
}
|
||||
|
||||
@@ -489,7 +488,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
// Seeker (VOD)
|
||||
if (widget.streamType != StreamType.live) _buildSeeker(),
|
||||
if (widget.streamType != model.StreamType.live) _buildSeeker(),
|
||||
|
||||
// Unified Box: EPG & Controls
|
||||
Container(
|
||||
@@ -511,7 +510,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
if (widget.streamType == StreamType.live)
|
||||
if (widget.streamType == model.StreamType.live)
|
||||
TVFocusable(
|
||||
focusNode: _prevFocusNode,
|
||||
onPressed: () => _switchChannel(
|
||||
@@ -539,7 +538,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
if (widget.streamType == StreamType.live)
|
||||
if (widget.streamType == model.StreamType.live)
|
||||
TVFocusable(
|
||||
focusNode: _nextFocusNode,
|
||||
onPressed: () => _switchChannel(
|
||||
@@ -601,7 +600,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
}
|
||||
|
||||
Widget _buildEPGBox(String title) {
|
||||
String program = widget.streamType == StreamType.live
|
||||
String program = widget.streamType == model.StreamType.live
|
||||
? (_epg?.nowPlaying ?? "Pas d'infos EPG")
|
||||
: title;
|
||||
String next =
|
||||
@@ -646,7 +645,7 @@ class _LitePlayerScreenState extends ConsumerState<LitePlayerScreen>
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
if (widget.streamType == StreamType.live &&
|
||||
if (widget.streamType == model.StreamType.live &&
|
||||
_epg?.nowPlaying != null) ...[
|
||||
const SizedBox(height: 6),
|
||||
ClipRRect(
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../widgets/mobile_scaffold.dart';
|
||||
import '../../../theme/mobile_theme.dart';
|
||||
import '../widgets/mobile_live_tv_tab.dart';
|
||||
import '../widgets/mobile_movies_tab.dart';
|
||||
import '../widgets/mobile_series_tab.dart';
|
||||
import '../widgets/mobile_settings_tab.dart';
|
||||
import '../../../providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/mobile/widgets/mobile_scaffold.dart';
|
||||
import 'package:xtremobile/mobile/theme/mobile_theme.dart';
|
||||
import 'package:xtremobile/features/iptv/widgets/mobile_live_tv_tab.dart';
|
||||
import 'package:xtremobile/features/iptv/widgets/mobile_movies_tab.dart';
|
||||
import 'package:xtremobile/features/iptv/widgets/mobile_series_tab.dart';
|
||||
import 'package:xtremobile/features/iptv/widgets/mobile_settings_tab.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_xtream_providers.dart';
|
||||
|
||||
class MobileDashboardScreen extends ConsumerStatefulWidget {
|
||||
final PlaylistConfig playlist;
|
||||
|
||||
@@ -3,7 +3,7 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../theme/mobile_theme.dart';
|
||||
import '../../../mobile/theme/mobile_theme.dart';
|
||||
import '../../../../core/services/playlist_api_service.dart';
|
||||
import 'mobile_dashboard_screen.dart';
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import '../../../../core/services/playlist_api_service.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../theme/mobile_theme.dart';
|
||||
import '../../../mobile/theme/mobile_theme.dart';
|
||||
|
||||
final playlistsProvider = FutureProvider<List<PlaylistConfig>>((ref) async {
|
||||
final service = PlaylistApiService();
|
||||
|
||||
@@ -2,15 +2,16 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../providers/mobile_xtream_providers.dart';
|
||||
import '../../../providers/mobile_settings_providers.dart';
|
||||
import 'native_player_screen.dart';
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../../core/utils/image_cache_config.dart';
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/native_player_screen.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/core/utils/image_cache_config.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart' as model;
|
||||
|
||||
class MobileSeriesDetailScreen extends ConsumerStatefulWidget {
|
||||
final Series series;
|
||||
final model.Series series;
|
||||
final PlaylistConfig playlist;
|
||||
|
||||
const MobileSeriesDetailScreen({
|
||||
@@ -26,7 +27,7 @@ class MobileSeriesDetailScreen extends ConsumerStatefulWidget {
|
||||
|
||||
class _MobileSeriesDetailScreenState
|
||||
extends ConsumerState<MobileSeriesDetailScreen> {
|
||||
SeriesInfo? _seriesInfo;
|
||||
model.SeriesInfo? _seriesInfo;
|
||||
bool _isLoading = true;
|
||||
String? _error;
|
||||
int _selectedSeason = 1;
|
||||
@@ -62,8 +63,9 @@ class _MobileSeriesDetailScreenState
|
||||
setState(() {
|
||||
_seriesInfo = info;
|
||||
_isLoading = false;
|
||||
if (info.episodes.isNotEmpty) {
|
||||
_selectedSeason = info.episodes.keys.first;
|
||||
if (_seriesInfo!.episodes.isNotEmpty) {
|
||||
final firstKey = _seriesInfo!.episodes.keys.first;
|
||||
_selectedSeason = int.tryParse(firstKey.toString()) ?? 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -137,10 +139,10 @@ class _MobileSeriesDetailScreenState
|
||||
background: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
if (_seriesInfo!.cover != null)
|
||||
if (_seriesInfo!.coverUrl != null)
|
||||
// [P1-2 FIX] Optimize series cover image cache (400x600 display)
|
||||
CachedNetworkImage(
|
||||
imageUrl: _seriesInfo!.cover!,
|
||||
imageUrl: _seriesInfo!.coverUrl!,
|
||||
fit: BoxFit.cover,
|
||||
memCacheWidth: 480,
|
||||
memCacheHeight: 720,
|
||||
@@ -175,7 +177,7 @@ class _MobileSeriesDetailScreenState
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
_seriesInfo!.name,
|
||||
_seriesInfo!.title,
|
||||
style: GoogleFonts.inter(
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -224,7 +226,7 @@ class _MobileSeriesDetailScreenState
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Text(
|
||||
_seriesInfo!.plot!,
|
||||
_seriesInfo?.plot ?? '',
|
||||
style: const TextStyle(
|
||||
color: AppColors.textSecondary,
|
||||
height: 1.4,
|
||||
@@ -256,7 +258,7 @@ class _MobileSeriesDetailScreenState
|
||||
selected: isSelected,
|
||||
onSelected: (selected) {
|
||||
if (selected) {
|
||||
setState(() => _selectedSeason = seasonNum);
|
||||
setState(() => _selectedSeason = int.tryParse(seasonNum.toString()) ?? 1);
|
||||
}
|
||||
},
|
||||
backgroundColor: isDark
|
||||
@@ -304,7 +306,7 @@ class _MobileSeriesDetailScreenState
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildEpisodeTile(Episode episode) {
|
||||
Widget _buildEpisodeTile(model.Episode episode) {
|
||||
final watchHistory = ref.watch(mobileWatchHistoryProvider);
|
||||
final episodeKey = MobileWatchHistory.episodeKey(
|
||||
widget.series.seriesId,
|
||||
@@ -316,10 +318,9 @@ class _MobileSeriesDetailScreenState
|
||||
|
||||
// Calculate progress
|
||||
double progress = 0.0;
|
||||
if (episode.durationSecs != null &&
|
||||
episode.durationSecs! > 0 &&
|
||||
if (episode.duration > 0 &&
|
||||
resumePos > 0) {
|
||||
progress = (resumePos / episode.durationSecs!).clamp(0.0, 1.0);
|
||||
progress = (resumePos / episode.duration).clamp(0.0, 1.0);
|
||||
}
|
||||
|
||||
// Force dark mode colors since background is hardcoded dark
|
||||
@@ -335,14 +336,14 @@ class _MobileSeriesDetailScreenState
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => NativePlayerScreen(
|
||||
streamId: episode.streamId,
|
||||
streamId: episode.id,
|
||||
title:
|
||||
"${widget.series.name} S${episode.seasonNum}E${episode.episodeNum}",
|
||||
"${widget.series.name} S${episode.season}E${episode.episodeNum}",
|
||||
playlist: widget.playlist,
|
||||
streamType: StreamType.series,
|
||||
containerExtension: episode.containerExtension ?? 'mp4',
|
||||
streamType: model.StreamType.series,
|
||||
containerExtension: episode.containerExtension,
|
||||
seriesId: widget.series.seriesId,
|
||||
season: episode.seasonNum,
|
||||
season: int.tryParse(episode.season.toString()),
|
||||
episodeNum: episode.episodeNum,
|
||||
// Pass explicit initial position for resume
|
||||
initialPosition:
|
||||
@@ -394,10 +395,9 @@ class _MobileSeriesDetailScreenState
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
if (episode.durationSecs != null &&
|
||||
episode.durationSecs! > 0)
|
||||
if (episode.duration > 0)
|
||||
Text(
|
||||
_formatDuration(episode.durationSecs!),
|
||||
_formatDuration(episode.duration),
|
||||
style: TextStyle(
|
||||
color: secondaryTextColor,
|
||||
fontSize: 12,
|
||||
|
||||
@@ -5,30 +5,29 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:media_kit_video/media_kit_video.dart';
|
||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:xtremflow/core/models/iptv_models.dart';
|
||||
import 'package:xtremflow/core/models/playlist_config.dart';
|
||||
import 'package:xtremflow/features/iptv/services/xtream_service_mobile.dart';
|
||||
import 'package:xtremflow/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremflow/core/theme/app_colors.dart';
|
||||
import 'package:xtremflow/features/iptv/screens/lite_player_screen.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart' as model;
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/features/iptv/services/xtream_service_mobile.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/lite_player_screen.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:xtremflow/mobile/providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremflow/core/utils/device_info.dart';
|
||||
import 'package:xtremobile/core/utils/device_info.dart';
|
||||
|
||||
/// Stream type enum for player
|
||||
enum StreamType { live, vod, series }
|
||||
/// Stream type enum for player
|
||||
// (Moved to global or imported from iptv_models if available)
|
||||
|
||||
/// Native video player screen for Android/iOS
|
||||
/// Uses media_kit (FFmpeg) for full codec support (AC3, EAC3, DTS, etc.)
|
||||
class NativePlayerScreen extends ConsumerStatefulWidget {
|
||||
final String streamId;
|
||||
final String title;
|
||||
final StreamType streamType;
|
||||
final model.StreamType streamType;
|
||||
final String? containerExtension;
|
||||
final PlaylistConfig playlist;
|
||||
final List<Channel>? channels;
|
||||
final List<model.Channel>? channels;
|
||||
final int initialIndex;
|
||||
|
||||
// For series episodes (to track watch history)
|
||||
@@ -160,7 +159,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
// Unified Buffering Logic (Live vs VOD)
|
||||
(_player.platform as dynamic)?.setProperty('cache', 'yes');
|
||||
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
// LIVE PROFILE: Increased stability, no longer low-latency (prevents cuts)
|
||||
debugPrint(
|
||||
'MediaKitPlayer: Applying LIVE optimization profile (STABILITY)',
|
||||
@@ -246,7 +245,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
|
||||
// Low-latency intentionally removed for stability
|
||||
/*
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
(_player.platform as dynamic)?.setProperty('profile', 'low-latency');
|
||||
}
|
||||
*/
|
||||
@@ -310,7 +309,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
_checkAndMarkWatched(position);
|
||||
|
||||
// Auto-save position every 10 seconds (resilience against app kill/crash)
|
||||
if (widget.streamType != StreamType.live && !_hasMarkedAsWatched) {
|
||||
if (widget.streamType != model.StreamType.live && !_hasMarkedAsWatched) {
|
||||
final now = DateTime.now();
|
||||
if (_lastSaveTime == null ||
|
||||
now.difference(_lastSaveTime!) > const Duration(seconds: 10)) {
|
||||
@@ -367,7 +366,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
_player.stream.completed.listen((completed) {
|
||||
if (completed && mounted) {
|
||||
// Logic for Live TV
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
debugPrint(
|
||||
'MediaKitPlayer: Live stream completed unexpectedly, attempting reconnect...',
|
||||
);
|
||||
@@ -431,7 +430,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
if (state == AppLifecycleState.paused ||
|
||||
state == AppLifecycleState.inactive ||
|
||||
state == AppLifecycleState.detached) {
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
// Force stop for Live TV
|
||||
_player.stop();
|
||||
} else {
|
||||
@@ -490,7 +489,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
|
||||
/// Get content ID for resume position storage
|
||||
String get _contentId {
|
||||
if (widget.streamType == StreamType.series &&
|
||||
if (widget.streamType == model.StreamType.series &&
|
||||
widget.seriesId != null &&
|
||||
widget.season != null &&
|
||||
widget.episodeNum != null) {
|
||||
@@ -505,7 +504,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
|
||||
/// Save resume position when exiting player
|
||||
void _saveResumePositionOnExit() {
|
||||
if (widget.streamType == StreamType.live) return;
|
||||
if (widget.streamType == model.StreamType.live) return;
|
||||
|
||||
debugPrint(
|
||||
'MediaKitPlayer: Saving position - pos: ${_position.inSeconds}s, dur: ${_duration.inSeconds}s, contentId: $_contentId',
|
||||
@@ -595,7 +594,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
Future.delayed(Duration(seconds: 2 * _reconnectAttempts), () {
|
||||
if (mounted) {
|
||||
// If VOD/Series, try to resume from current position
|
||||
if (widget.streamType != StreamType.live && _position.inSeconds > 0) {
|
||||
if (widget.streamType != model.StreamType.live && _position.inSeconds > 0) {
|
||||
_loadStream(startAt: _position);
|
||||
} else {
|
||||
_loadStream();
|
||||
@@ -608,7 +607,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
void _checkAndMarkWatched(Duration position) {
|
||||
// Skip if already marked, live TV, or no duration
|
||||
if (_hasMarkedAsWatched) return;
|
||||
if (widget.streamType == StreamType.live) return;
|
||||
if (widget.streamType == model.StreamType.live) return;
|
||||
if (_duration.inSeconds <= 0) return;
|
||||
|
||||
final progress = position.inSeconds / _duration.inSeconds;
|
||||
@@ -617,12 +616,12 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
_hasMarkedAsWatched = true;
|
||||
debugPrint('MediaKitPlayer: 80% reached, marking as watched');
|
||||
|
||||
if (widget.streamType == StreamType.vod) {
|
||||
if (widget.streamType == model.StreamType.vod) {
|
||||
// Mark movie as watched
|
||||
ref
|
||||
.read(mobileWatchHistoryProvider.notifier)
|
||||
.markMovieWatched(widget.streamId);
|
||||
} else if (widget.streamType == StreamType.series &&
|
||||
} else if (widget.streamType == model.StreamType.series &&
|
||||
widget.seriesId != null &&
|
||||
widget.season != null &&
|
||||
widget.episodeNum != null) {
|
||||
@@ -642,7 +641,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
/// Start watchdog timer for live streams
|
||||
void _startLiveWatchdog() {
|
||||
_liveWatchdog?.cancel();
|
||||
if (widget.streamType != StreamType.live) return;
|
||||
if (widget.streamType != model.StreamType.live) return;
|
||||
|
||||
// Check every 30 seconds if stream is still playing
|
||||
_liveWatchdog = Timer.periodic(const Duration(seconds: 30), (_) {
|
||||
@@ -678,7 +677,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
}
|
||||
}
|
||||
|
||||
ShortEPG? _epg;
|
||||
model.ShortEPG? _epg;
|
||||
|
||||
// ... (existing initState)
|
||||
|
||||
@@ -699,7 +698,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
: widget.streamId;
|
||||
|
||||
// Load EPG if Live TV
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
_loadEpg(currentStreamId);
|
||||
}
|
||||
|
||||
@@ -707,9 +706,9 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
// Build stream URL based on type
|
||||
String streamUrl;
|
||||
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
streamUrl = _xtreamService!.getLiveStreamUrl(currentStreamId);
|
||||
} else if (widget.streamType == StreamType.vod) {
|
||||
} else if (widget.streamType == model.StreamType.vod) {
|
||||
streamUrl = _xtreamService!.getVodStreamUrl(
|
||||
currentStreamId,
|
||||
widget.containerExtension ?? 'mp4',
|
||||
@@ -744,12 +743,12 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
});
|
||||
|
||||
// Show watchdog for live streams
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
_startLiveWatchdog();
|
||||
}
|
||||
|
||||
// Resume from saved position (VOD/Series only)
|
||||
if (widget.streamType != StreamType.live) {
|
||||
if (widget.streamType != model.StreamType.live) {
|
||||
// Priority 0: Explicit reconnect position (passed from _attemptReconnect)
|
||||
if (startAt != null && startAt.inSeconds > 0) {
|
||||
debugPrint(
|
||||
@@ -835,7 +834,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
if (_isPlaying) {
|
||||
_player.pause();
|
||||
// Save position on pause
|
||||
if (widget.streamType != StreamType.live) {
|
||||
if (widget.streamType != model.StreamType.live) {
|
||||
ref
|
||||
.read(mobileWatchHistoryProvider.notifier)
|
||||
.saveResumePosition(_contentId, _position.inSeconds);
|
||||
@@ -913,7 +912,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
// Left Arrow - Show controls or navigate, seek in VOD when hidden
|
||||
if (key == LogicalKeyboardKey.arrowLeft) {
|
||||
if (!_showControls) {
|
||||
if (widget.streamType != StreamType.live) {
|
||||
if (widget.streamType != model.StreamType.live) {
|
||||
final newPos = _position - const Duration(seconds: 10);
|
||||
_player.seek(newPos < Duration.zero ? Duration.zero : newPos);
|
||||
}
|
||||
@@ -926,7 +925,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
// Right Arrow - Show controls or navigate, seek in VOD when hidden
|
||||
if (key == LogicalKeyboardKey.arrowRight) {
|
||||
if (!_showControls) {
|
||||
if (widget.streamType != StreamType.live) {
|
||||
if (widget.streamType != model.StreamType.live) {
|
||||
final newPos = _position + const Duration(seconds: 10);
|
||||
if (newPos < _duration) {
|
||||
_player.seek(newPos);
|
||||
@@ -950,7 +949,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
|
||||
// Channel Down = Previous Channel (inverted as requested)
|
||||
if (key == LogicalKeyboardKey.channelDown) {
|
||||
if (widget.streamType == StreamType.live && widget.channels != null) {
|
||||
if (widget.streamType == model.StreamType.live && widget.channels != null) {
|
||||
_playPrevious();
|
||||
_onUserInteraction();
|
||||
return true;
|
||||
@@ -959,7 +958,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
|
||||
// Channel Up = Next Channel (inverted as requested)
|
||||
if (key == LogicalKeyboardKey.channelUp) {
|
||||
if (widget.streamType == StreamType.live && widget.channels != null) {
|
||||
if (widget.streamType == model.StreamType.live && widget.channels != null) {
|
||||
_playNext();
|
||||
_onUserInteraction();
|
||||
return true;
|
||||
@@ -1128,7 +1127,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
if (widget.streamType == StreamType.live)
|
||||
if (widget.streamType == model.StreamType.live)
|
||||
Text(
|
||||
_currentTime,
|
||||
style: const TextStyle(
|
||||
@@ -1387,7 +1386,7 @@ class _NativePlayerScreenState extends ConsumerState<NativePlayerScreen>
|
||||
}
|
||||
|
||||
Widget _buildControlsOverlay(String title) {
|
||||
if (widget.streamType == StreamType.live) {
|
||||
if (widget.streamType == model.StreamType.live) {
|
||||
return _buildUnifiedOSD(title);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import '../models/xtream_models.dart';
|
||||
import 'package:xtremflow/core/models/playlist_config.dart';
|
||||
import 'package:xtremflow/core/api/api_client.dart';
|
||||
import '../models/xtream_models.dart' as model;
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/core/api/api_client.dart';
|
||||
|
||||
/// EPG cache entry with TTL
|
||||
class _EpgCacheEntry {
|
||||
final Map<String, ShortEpg> data;
|
||||
final Map<String, model.ShortEPG> data;
|
||||
final DateTime timestamp;
|
||||
static const int ttlSeconds = 3600; // 1 hour TTL
|
||||
|
||||
@@ -38,22 +38,22 @@ class XtreamServiceMobile {
|
||||
final Map<String, _EpgCacheEntry> _epgBatchCache = {};
|
||||
|
||||
// In-flight batch requests to deduplicate concurrent calls
|
||||
final Map<String, Future<Map<String, ShortEpg>>> _inFlightBatches = {};
|
||||
final Map<String, Future<Map<String, model.ShortEPG>>> _inFlightBatches = {};
|
||||
|
||||
XtreamServiceMobile(this.cacheDir);
|
||||
|
||||
/// Initialize with playlist configuration
|
||||
Future<void> setPlaylistAsync(PlaylistConfig config) async {
|
||||
_baseUrl = config.serverUrl;
|
||||
_baseUrl = config.dns;
|
||||
_username = config.username;
|
||||
_password = config.password;
|
||||
|
||||
// Use shared Dio instance from ApiClient (with DNS resolution, etc.)
|
||||
_dio = ApiClient.instance;
|
||||
_dio = ApiClient().dio;
|
||||
}
|
||||
|
||||
/// Get live channels for a category (with batch EPG support)
|
||||
Future<List<Channel>> getLiveChannels(String categoryId) async {
|
||||
Future<List<model.Channel>> getLiveChannels(String categoryId) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
@@ -71,7 +71,7 @@ class XtreamServiceMobile {
|
||||
|
||||
if (response.statusCode == 200 && response.data is List) {
|
||||
return (response.data as List)
|
||||
.map((e) => Channel.fromJson(e))
|
||||
.map((e) => model.Channel.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
@@ -82,10 +82,15 @@ class XtreamServiceMobile {
|
||||
}
|
||||
|
||||
/// Get SHORT EPG for a SINGLE channel (legacy, avoid - use getBatchEPG instead)
|
||||
Future<ShortEpg> getShortEPG(String streamId) async {
|
||||
Future<model.ShortEPG> getShortEPG(String streamId) async {
|
||||
// For backward compatibility, but prefer batch loading
|
||||
final batch = await getBatchEPG([streamId]);
|
||||
return batch[streamId] ?? ShortEpg(nowPlaying: null, nextPlaying: null);
|
||||
return batch[streamId] ?? model.ShortEPG(
|
||||
id: streamId,
|
||||
title: 'No Program',
|
||||
start: DateTime.now().toIso8601String(),
|
||||
end: DateTime.now().add(const Duration(hours: 1)).toIso8601String(),
|
||||
);
|
||||
}
|
||||
|
||||
/// Get SHORT EPG for MULTIPLE channels in ONE request
|
||||
@@ -93,45 +98,46 @@ class XtreamServiceMobile {
|
||||
/// This is the optimized method that prevents N+1 queries.
|
||||
/// Instead of 50 requests for 50 channels, this loads all at once.
|
||||
/// Results are cached for 1 hour to avoid repeated requests.
|
||||
Future<Map<String, ShortEpg>> getBatchEPG(List<String> streamIds) async {
|
||||
Future<Map<String, model.ShortEPG>> getBatchEPG(List<String> streamIds) async {
|
||||
if (streamIds.isEmpty) return {};
|
||||
|
||||
// Create cache key from sorted IDs for consistency
|
||||
final cacheKey = streamIds.toSet().toString();
|
||||
final cacheKey = streamIds.toSet().toList()..sort();
|
||||
final cacheKeyStr = cacheKey.join(',');
|
||||
|
||||
// Check if we have valid cached data
|
||||
final cached = _epgBatchCache[cacheKey];
|
||||
final cached = _epgBatchCache[cacheKeyStr];
|
||||
if (cached != null && !cached.isExpired) {
|
||||
if (kDebugMode) print('✅ EPG batch cache hit: ${streamIds.length} channels');
|
||||
return cached.data;
|
||||
}
|
||||
|
||||
// Check if this batch is already being loaded (deduplication)
|
||||
if (_inFlightBatches.containsKey(cacheKey)) {
|
||||
if (_inFlightBatches.containsKey(cacheKeyStr)) {
|
||||
if (kDebugMode) print('⏳ Reusing in-flight EPG batch request');
|
||||
return _inFlightBatches[cacheKey]!;
|
||||
return _inFlightBatches[cacheKeyStr]!;
|
||||
}
|
||||
|
||||
// Load the batch
|
||||
final future = _loadEpgBatch(streamIds, cacheKey);
|
||||
_inFlightBatches[cacheKey] = future;
|
||||
final future = _loadEpgBatch(streamIds, cacheKeyStr);
|
||||
_inFlightBatches[cacheKeyStr] = future;
|
||||
|
||||
try {
|
||||
final result = await future;
|
||||
_epgBatchCache[cacheKey] = _EpgCacheEntry(result);
|
||||
_epgBatchCache[cacheKeyStr] = _EpgCacheEntry(result);
|
||||
return result;
|
||||
} finally {
|
||||
_inFlightBatches.remove(cacheKey);
|
||||
_inFlightBatches.remove(cacheKeyStr);
|
||||
}
|
||||
}
|
||||
|
||||
/// Internal: Load EPG batch from API
|
||||
Future<Map<String, ShortEpg>> _loadEpgBatch(
|
||||
Future<Map<String, model.ShortEPG>> _loadEpgBatch(
|
||||
List<String> streamIds, String cacheKey) async {
|
||||
try {
|
||||
final result = <String, ShortEpg>{};
|
||||
final result = <String, model.ShortEPG>{};
|
||||
|
||||
// Join stream IDs for API call (or use multiple calls if API limits)
|
||||
// Join stream IDs for API call
|
||||
final streamIdParam = streamIds.join(',');
|
||||
|
||||
final response = await _dio.get(
|
||||
@@ -154,10 +160,14 @@ class XtreamServiceMobile {
|
||||
for (var item in items) {
|
||||
if (item is Map && item.containsKey('stream_id')) {
|
||||
final streamId = item['stream_id'].toString();
|
||||
result[streamId] = ShortEpg(
|
||||
nowPlaying: item['now_playing'] ?? item['now'],
|
||||
nextPlaying: item['next_playing'] ?? item['next'],
|
||||
);
|
||||
// Assuming the API returns a list of EPG entries for this stream
|
||||
if (item['epg_listings'] is List && (item['epg_listings'] as List).isNotEmpty) {
|
||||
final epgJson = (item['epg_listings'] as List).first;
|
||||
result[streamId] = model.ShortEPG.fromJson({
|
||||
...epgJson,
|
||||
'id': streamId,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,13 +179,12 @@ class XtreamServiceMobile {
|
||||
return result;
|
||||
} catch (e) {
|
||||
if (kDebugMode) print('❌ Error loading EPG batch: $e');
|
||||
// Return empty map on error - EPG is optional
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
/// Get VOD categories
|
||||
Future<List<Category>> getVodCategories() async {
|
||||
Future<List<model.Category>> getVodCategories() async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
@@ -189,7 +198,7 @@ class XtreamServiceMobile {
|
||||
|
||||
if (response.statusCode == 200 && response.data is List) {
|
||||
return (response.data as List)
|
||||
.map((e) => Category.fromJson(e))
|
||||
.map((e) => model.Category.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
@@ -199,60 +208,153 @@ class XtreamServiceMobile {
|
||||
}
|
||||
}
|
||||
|
||||
/// Search VOD movies
|
||||
Future<List<Movie>> searchMovies(String query) async {
|
||||
/// Get movies by category
|
||||
Future<List<model.VodItem>> getMoviesByCategory(String categoryId) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
queryParameters: {
|
||||
'username': _username,
|
||||
'password': _password,
|
||||
'action': 'search',
|
||||
'search': query,
|
||||
'action': 'get_vod_streams',
|
||||
'category_id': categoryId,
|
||||
},
|
||||
options: Options(receiveTimeout: const Duration(seconds: 15)),
|
||||
);
|
||||
|
||||
if (response.statusCode == 200 && response.data is List) {
|
||||
return (response.data as List)
|
||||
.map((e) => Movie.fromJson(e))
|
||||
.map((e) => model.VodItem.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
} catch (e) {
|
||||
if (kDebugMode) print('❌ Error searching movies: $e');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear EPG cache (for manual refresh)
|
||||
void clearEpgCache() {
|
||||
/// Get all movies
|
||||
Future<List<model.VodItem>> getMovies() async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
queryParameters: {
|
||||
'username': _username,
|
||||
'password': _password,
|
||||
'action': 'get_vod_streams',
|
||||
},
|
||||
);
|
||||
if (response.statusCode == 200 && response.data is List) {
|
||||
return (response.data as List)
|
||||
.map((e) => model.VodItem.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/// Search VOD movies
|
||||
Future<List<model.VodItem>> searchMovies(String query) async {
|
||||
final all = await getMovies();
|
||||
return all.where((m) => m.name.toLowerCase().contains(query.toLowerCase())).toList();
|
||||
}
|
||||
|
||||
/// Get all series
|
||||
Future<List<model.Series>> getSeries() async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
queryParameters: {
|
||||
'username': _username,
|
||||
'password': _password,
|
||||
'action': 'get_series',
|
||||
},
|
||||
);
|
||||
if (response.statusCode == 200 && response.data is List) {
|
||||
return (response.data as List)
|
||||
.map((e) => model.Series.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/// Search series
|
||||
Future<List<model.Series>> searchSeries(String query) async {
|
||||
final all = await getSeries();
|
||||
return all.where((s) => s.name.toLowerCase().contains(query.toLowerCase())).toList();
|
||||
}
|
||||
|
||||
/// Get series paginated
|
||||
Future<List<model.Series>> getSeriesPaginated({int? categoryId}) async {
|
||||
return getSeries(); // Simplified for now, can add filtering by categoryId later
|
||||
}
|
||||
|
||||
/// Get series info
|
||||
Future<model.SeriesInfo?> getSeriesInfo(String seriesId) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseUrl/player_api.php',
|
||||
queryParameters: {
|
||||
'username': _username,
|
||||
'password': _password,
|
||||
'action': 'get_series_info',
|
||||
'series_id': seriesId,
|
||||
},
|
||||
);
|
||||
|
||||
if (response.statusCode == 200 && response.data is Map) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final seriesModel = model.Series.fromJson(data['info'] ?? {});
|
||||
|
||||
final episodesMap = <String, List<model.Episode>>{};
|
||||
if (data['episodes'] is Map) {
|
||||
final seasons = data['episodes'] as Map<String, dynamic>;
|
||||
seasons.forEach((seasonNum, episodesList) {
|
||||
if (episodesList is List) {
|
||||
episodesMap[seasonNum] = episodesList
|
||||
.map((e) => model.Episode.fromJson(e as Map<String, dynamic>))
|
||||
.toList();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return model.SeriesInfo(
|
||||
series: seriesModel,
|
||||
episodes: episodesMap,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear cache
|
||||
void clearCache() {
|
||||
_epgBatchCache.clear();
|
||||
_inFlightBatches.clear();
|
||||
if (kDebugMode) print('🗑️ EPG cache cleared');
|
||||
}
|
||||
|
||||
/// Get cache stats for debugging
|
||||
Map<String, dynamic> getCacheStats() {
|
||||
return {
|
||||
'epg_cache_entries': _epgBatchCache.length,
|
||||
'in_flight_batches': _inFlightBatches.length,
|
||||
'expired_entries': _epgBatchCache.values.where((e) => e.isExpired).length,
|
||||
};
|
||||
/// Get Live Stream URL
|
||||
String getLiveStreamUrl(String streamId) {
|
||||
return '$_baseUrl/live/$_username/$_password/$streamId.ts';
|
||||
}
|
||||
}
|
||||
|
||||
/// Short EPG for a channel (now playing + next up)
|
||||
class ShortEpg {
|
||||
final String? nowPlaying;
|
||||
final String? nextPlaying;
|
||||
/// Get VOD Stream URL
|
||||
String getVodStreamUrl(String streamId, String extension) {
|
||||
return '$_baseUrl/movie/$_username/$_password/$streamId.$extension';
|
||||
}
|
||||
|
||||
ShortEpg({required this.nowPlaying, required this.nextPlaying});
|
||||
/// Get Series Stream URL
|
||||
String getSeriesStreamUrl(String streamId, String extension) {
|
||||
return '$_baseUrl/series/$_username/$_password/$streamId.$extension';
|
||||
}
|
||||
|
||||
factory ShortEpg.fromJson(Map<String, dynamic> json) {
|
||||
return ShortEpg(
|
||||
nowPlaying: json['now_playing'] ?? json['now'],
|
||||
nextPlaying: json['next_playing'] ?? json['next'],
|
||||
);
|
||||
/// Dispose service resources
|
||||
void dispose() {
|
||||
clearCache();
|
||||
}
|
||||
}
|
||||
@@ -2,20 +2,21 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import '../../../../core/utils/image_cache_config.dart';
|
||||
import 'package:xtremobile/core/utils/image_cache_config.dart';
|
||||
import 'dart:io';
|
||||
import '../../../providers/mobile_xtream_providers.dart';
|
||||
import '../../../providers/mobile_settings_providers.dart';
|
||||
import '../screens/native_player_screen.dart';
|
||||
import '../../../../core/models/iptv_models.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../../core/api/dns_resolver.dart';
|
||||
import '../../../theme/mobile_theme.dart';
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremflow/features/iptv/screens/lite_player_screen.dart';
|
||||
import 'dart:async';
|
||||
import 'package:xtremobile/mobile/providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/native_player_screen.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart';
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/core/api/dns_resolver.dart';
|
||||
import 'package:xtremobile/mobile/theme/mobile_theme.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/lite_player_screen.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import '../../../../core/services/ip_service.dart';
|
||||
import 'package:xtremobile/core/services/ip_service.dart';
|
||||
|
||||
class MobileLiveTVTab extends ConsumerStatefulWidget {
|
||||
final PlaylistConfig playlist;
|
||||
@@ -157,7 +158,7 @@ class _MobileLiveTVTabState extends ConsumerState<MobileLiveTVTab>
|
||||
),
|
||||
data: (groupedChannels) {
|
||||
// Prepare categories
|
||||
var categories = groupedChannels.keys.toList();
|
||||
var categories = groupedChannels.map((c) => c.categoryName).toSet().toList();
|
||||
if (settings.liveTvKeywords.isNotEmpty) {
|
||||
categories = categories
|
||||
.where((cat) => settings.matchesLiveTvFilter(cat))
|
||||
@@ -189,18 +190,16 @@ class _MobileLiveTVTabState extends ConsumerState<MobileLiveTVTab>
|
||||
|
||||
if (!showGrid) {
|
||||
if (_searchQuery.isNotEmpty) {
|
||||
displayedChannels = groupedChannels.values
|
||||
.expand((l) => l)
|
||||
displayedChannels = groupedChannels
|
||||
.where((c) => c.name.toLowerCase().contains(_searchQuery))
|
||||
.toList();
|
||||
} else if (_showFavoritesOnly) {
|
||||
displayedChannels = groupedChannels.values
|
||||
.expand((l) => l)
|
||||
displayedChannels = groupedChannels
|
||||
.where((c) => favorites.contains(c.streamId))
|
||||
.toList();
|
||||
} else if (uiState.selectedCategory != null) {
|
||||
displayedChannels =
|
||||
groupedChannels[uiState.selectedCategory] ?? [];
|
||||
groupedChannels.where((c) => c.categoryName == uiState.selectedCategory).toList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -569,7 +568,7 @@ class _MobileChannelCardState extends ConsumerState<_MobileChannelCard> {
|
||||
final service =
|
||||
await ref.read(mobileXtreamServiceProvider(widget.playlist).future);
|
||||
final epg = await service.getShortEPG(widget.channel.streamId);
|
||||
if (mounted && epg.nowPlaying != null && epg.nowPlaying!.isNotEmpty) {
|
||||
if (mounted && epg.nowPlaying.isNotEmpty) {
|
||||
setState(() {
|
||||
_epgTitle = epg.nowPlaying;
|
||||
});
|
||||
|
||||
@@ -2,14 +2,14 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremflow/mobile/widgets/mobile_poster_card.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../providers/mobile_settings_providers.dart';
|
||||
import '../../../providers/mobile_xtream_providers.dart';
|
||||
|
||||
import '../screens/native_player_screen.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/mobile/widgets/mobile_poster_card.dart';
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart' as model;
|
||||
import 'package:xtremobile/features/iptv/screens/native_player_screen.dart';
|
||||
|
||||
class MobileMoviesTab extends ConsumerStatefulWidget {
|
||||
final PlaylistConfig playlist;
|
||||
@@ -27,12 +27,12 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab>
|
||||
|
||||
// Data
|
||||
List<MapEntry<String, String>> _categories = [];
|
||||
List<Movie> _categoryMovies = [];
|
||||
List<model.VodItem> _categoryMovies = [];
|
||||
String? _selectedCategoryId;
|
||||
String? _selectedCategoryName;
|
||||
|
||||
// Search
|
||||
List<Movie>? _searchResults;
|
||||
List<model.VodItem>? _searchResults;
|
||||
String _searchQuery = '';
|
||||
bool _isSearchEditing = false;
|
||||
bool _isSearching = false;
|
||||
@@ -85,7 +85,8 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab>
|
||||
try {
|
||||
final service =
|
||||
await ref.read(mobileXtreamServiceProvider(widget.playlist).future);
|
||||
final results = await service.searchMovies(query);
|
||||
final movies = await service.getMovies();
|
||||
final results = movies.where((m) => m.name.toLowerCase().contains(query.toLowerCase())).toList();
|
||||
|
||||
if (mounted && _searchQuery == query) {
|
||||
setState(() {
|
||||
@@ -105,11 +106,11 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab>
|
||||
try {
|
||||
final service =
|
||||
await ref.read(mobileXtreamServiceProvider(widget.playlist).future);
|
||||
final categoriesMap = await service.getVodCategories();
|
||||
final categories = await service.getVodCategories();
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_categories = categoriesMap.entries.toList()
|
||||
_categories = categories.map((c) => MapEntry(c.categoryId, c.categoryName)).toList()
|
||||
..sort((a, b) => a.value.compareTo(b.value));
|
||||
_isLoading = false;
|
||||
});
|
||||
@@ -197,7 +198,7 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab>
|
||||
return originalUrl;
|
||||
}
|
||||
|
||||
void _playMovie(BuildContext context, Movie movie) {
|
||||
void _playMovie(BuildContext context, model.VodItem movie) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
@@ -205,7 +206,7 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab>
|
||||
streamId: movie.streamId,
|
||||
title: movie.name,
|
||||
playlist: widget.playlist,
|
||||
streamType: StreamType.vod,
|
||||
streamType: model.StreamType.vod,
|
||||
containerExtension: movie.containerExtension,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -2,16 +2,15 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremflow/mobile/widgets/mobile_poster_card.dart';
|
||||
import '../../../../core/models/playlist_config.dart';
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../../../../core/widgets/components/hero_carousel.dart';
|
||||
import '../../../../core/widgets/components/ui_components.dart';
|
||||
import '../../../providers/mobile_settings_providers.dart';
|
||||
import '../../../providers/mobile_xtream_providers.dart';
|
||||
import '../../../../features/iptv/services/xtream_service_mobile.dart';
|
||||
import '../screens/mobile_series_detail_screen.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/mobile/widgets/mobile_poster_card.dart';
|
||||
import 'package:xtremobile/core/models/playlist_config.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/core/widgets/components/hero_carousel.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_xtream_providers.dart';
|
||||
import 'package:xtremobile/core/models/iptv_models.dart' as model;
|
||||
import 'package:xtremobile/features/iptv/screens/mobile_series_detail_screen.dart';
|
||||
|
||||
class MobileSeriesTab extends ConsumerStatefulWidget {
|
||||
final PlaylistConfig playlist;
|
||||
@@ -26,15 +25,13 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
final TextEditingController _searchController = TextEditingController();
|
||||
final FocusNode _searchFocusNode = FocusNode();
|
||||
final List<Series> _series = [];
|
||||
List<Series>? _searchResults;
|
||||
final List<model.Series> _series = [];
|
||||
List<model.Series>? _searchResults;
|
||||
String _searchQuery = '';
|
||||
bool _isSearchEditing = false;
|
||||
bool _isLoading = false;
|
||||
bool _isSearching = false;
|
||||
bool _hasMore = true;
|
||||
int _currentOffset = 0;
|
||||
static const int _pageSize = 50;
|
||||
Timer? _searchDebounce;
|
||||
|
||||
@override
|
||||
@@ -87,11 +84,12 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
try {
|
||||
final service =
|
||||
await ref.read(mobileXtreamServiceProvider(widget.playlist).future);
|
||||
final results = await service.searchSeries(query);
|
||||
final results = await service.getSeries(); // Fallback to full list if searchSeries not available
|
||||
final filteredResults = results.where((s) => s.name.toLowerCase().contains(query.toLowerCase())).toList();
|
||||
|
||||
if (mounted && _searchQuery == query) {
|
||||
setState(() {
|
||||
_searchResults = results;
|
||||
_searchResults = filteredResults;
|
||||
_isSearching = false;
|
||||
});
|
||||
}
|
||||
@@ -112,17 +110,13 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
|
||||
// Add timeout to prevent infinite loading state
|
||||
final newSeries = await service
|
||||
.getSeriesPaginated(
|
||||
offset: _currentOffset,
|
||||
limit: _pageSize,
|
||||
)
|
||||
.getSeriesPaginated()
|
||||
.timeout(const Duration(seconds: 15));
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_series.addAll(newSeries);
|
||||
_currentOffset += _pageSize;
|
||||
_hasMore = newSeries.length == _pageSize;
|
||||
_hasMore = false; // Disable pagination for now as it's not supported by simple getSeries
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
@@ -147,7 +141,6 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
|
||||
setState(() {
|
||||
_series.clear();
|
||||
_currentOffset = 0;
|
||||
_hasMore = true;
|
||||
_searchResults = null;
|
||||
_searchQuery = '';
|
||||
@@ -172,7 +165,7 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
return originalUrl;
|
||||
}
|
||||
|
||||
void _openSeries(Series series) {
|
||||
void _openSeries(model.Series series) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
@@ -192,7 +185,7 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
super.build(context); // Required for AutomaticKeepAliveClientMixin
|
||||
final settings = ref.watch(mobileSettingsProvider);
|
||||
|
||||
List<Series> displaySeries;
|
||||
List<model.Series> displaySeries;
|
||||
if (_searchQuery.isNotEmpty && _searchResults != null) {
|
||||
displaySeries = _searchResults!;
|
||||
} else {
|
||||
@@ -207,13 +200,16 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
final heroItems = displaySeries
|
||||
.take(3)
|
||||
.map(
|
||||
(s) => HeroItem(
|
||||
id: s.seriesId.toString(),
|
||||
title: s.name,
|
||||
imageUrl: _getImageUrl(s.cover),
|
||||
subtitle: s.rating != null ? '${_formatRating(s.rating)} ★' : null,
|
||||
onMoreInfo: () => _openSeries(s),
|
||||
),
|
||||
(s) {
|
||||
final serie = s; // model.Series handle is enough
|
||||
return HeroItem(
|
||||
id: serie.streamId,
|
||||
title: serie.name,
|
||||
imageUrl: _getImageUrl(serie.cover),
|
||||
subtitle: serie.rating.isNotEmpty ? '${_formatRating(serie.rating)} ★' : null,
|
||||
onMoreInfo: () => _openSeries(serie),
|
||||
);
|
||||
},
|
||||
)
|
||||
.toList();
|
||||
|
||||
@@ -290,7 +286,7 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab>
|
||||
onTap: (item) {
|
||||
try {
|
||||
final series = _series.firstWhere(
|
||||
(s) => s.seriesId.toString() == item.id,
|
||||
(s) => s.streamId.toString() == item.id,
|
||||
);
|
||||
_openSeries(series);
|
||||
} catch (e) {
|
||||
|
||||
@@ -2,13 +2,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
// import 'package:dio_cache_interceptor_hive_store/dio_cache_interceptor_hive_store.dart';
|
||||
import '../../../providers/mobile_settings_providers.dart';
|
||||
import '../../../widgets/tv_focusable.dart';
|
||||
|
||||
import '../../../../core/theme/app_colors.dart';
|
||||
import '../screens/mobile_playlist_selection_screen.dart';
|
||||
import 'package:xtremobile/mobile/providers/mobile_settings_providers.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/features/iptv/screens/mobile_playlist_selection_screen.dart';
|
||||
|
||||
/// Simplified mobile settings tab - optimized for TV remote control
|
||||
class MobileSettingsTab extends ConsumerStatefulWidget {
|
||||
@@ -80,7 +78,7 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
|
||||
height: 48,
|
||||
// No decoration for free-floating logo
|
||||
child: Image.asset(
|
||||
'assets/images/logo_xtremflow.png',
|
||||
'assets/images/logo_xtremobile.png',
|
||||
fit: BoxFit.contain,
|
||||
errorBuilder: (_, __, ___) => const Icon(
|
||||
Icons.play_circle_filled,
|
||||
@@ -94,7 +92,7 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'XtremFlow Mobile',
|
||||
'Xtremobile Mobile',
|
||||
style: GoogleFonts.inter(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../core/models/playlist_config.dart';
|
||||
import '../../core/models/iptv_models.dart' show Channel;
|
||||
import '../../core/models/iptv_models.dart' as model;
|
||||
import '../../features/iptv/services/xtream_service_mobile.dart';
|
||||
import '../../features/iptv/models/xtream_models.dart';
|
||||
|
||||
export '../../features/iptv/models/xtream_models.dart';
|
||||
|
||||
/// Mobile-specific Xtream service provider
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
@@ -21,30 +18,27 @@ final mobileXtreamServiceProvider =
|
||||
|
||||
/// Mobile-specific live channels provider
|
||||
final mobileLiveChannelsProvider =
|
||||
FutureProvider.family<Map<String, List<Channel>>, PlaylistConfig>(
|
||||
FutureProvider.family<List<model.Channel>, PlaylistConfig>(
|
||||
(ref, playlist) async {
|
||||
final service = await ref.watch(mobileXtreamServiceProvider(playlist).future);
|
||||
return service.getLiveChannels();
|
||||
// Correction: getLiveChannels returns List<Channel>, and we now need a selected category
|
||||
// If no category is selected, we might want to load all or first category.
|
||||
// For now, let's assume it should return all channels or handle category selection elsewhere.
|
||||
return service.getLiveChannels("");
|
||||
});
|
||||
|
||||
/// Mobile-specific movies pagination provider
|
||||
/// Mobile-specific movies provider
|
||||
final mobileMoviesProvider =
|
||||
FutureProvider.family<List<Movie>, PlaylistConfig>((ref, playlist) async {
|
||||
FutureProvider.family<List<model.VodItem>, PlaylistConfig>((ref, playlist) async {
|
||||
final service = await ref.watch(mobileXtreamServiceProvider(playlist).future);
|
||||
return service.getMoviesPaginated(offset: 0, limit: 100);
|
||||
return service.getMoviesByCategory(""); // Fetch all or default
|
||||
});
|
||||
|
||||
/// Mobile-specific series pagination provider
|
||||
final mobileSeriesProvider =
|
||||
FutureProvider.family<List<Series>, PlaylistConfig>((ref, playlist) async {
|
||||
FutureProvider.family<List<model.Series>, PlaylistConfig>((ref, playlist) async {
|
||||
final service = await ref.watch(mobileXtreamServiceProvider(playlist).future);
|
||||
return service.getSeriesPaginated(offset: 0, limit: 100);
|
||||
});
|
||||
|
||||
/// Mobile-specific series info provider
|
||||
final mobileSeriesInfoProvider =
|
||||
FutureProvider.family<SeriesInfo, String>((ref, seriesId) {
|
||||
throw UnimplementedError('Use mobileSeriesInfoByPlaylistProvider instead');
|
||||
return service.getSeriesPaginated();
|
||||
});
|
||||
|
||||
/// Series info with playlist context
|
||||
@@ -67,7 +61,7 @@ class SeriesInfoRequest {
|
||||
}
|
||||
|
||||
final mobileSeriesInfoByPlaylistProvider =
|
||||
FutureProvider.family<SeriesInfo, SeriesInfoRequest>((ref, request) async {
|
||||
FutureProvider.family<model.SeriesInfo?, SeriesInfoRequest>((ref, request) async {
|
||||
final service =
|
||||
await ref.watch(mobileXtreamServiceProvider(request.playlist).future);
|
||||
return service.getSeriesInfo(request.seriesId);
|
||||
@@ -94,8 +88,7 @@ class LiveTvUiState {
|
||||
/// Persistent index for mobile dashboard navigation
|
||||
final mobileDashboardIndexProvider = StateProvider<int>((ref) => 0);
|
||||
|
||||
/// [P0-1 FIX] Batch EPG provider - Load all EPG data for multiple channels at once
|
||||
/// This prevents the N+1 query problem where each channel card makes its own EPG request
|
||||
/// Batch EPG provider
|
||||
class BatchEpgRequest {
|
||||
final PlaylistConfig playlist;
|
||||
final List<String> streamIds;
|
||||
@@ -108,16 +101,15 @@ class BatchEpgRequest {
|
||||
other is BatchEpgRequest &&
|
||||
runtimeType == other.runtimeType &&
|
||||
playlist == other.playlist &&
|
||||
streamIds.toSet() == other.streamIds.toSet();
|
||||
streamIds.toSet().toString() == other.streamIds.toSet().toString();
|
||||
|
||||
@override
|
||||
int get hashCode => playlist.hashCode ^ streamIds.toSet().hashCode;
|
||||
int get hashCode => playlist.hashCode ^ streamIds.toSet().toString().hashCode;
|
||||
}
|
||||
|
||||
/// Load EPG data for multiple streams in one batch request
|
||||
/// Cache is automatically handled by the service with 1-hour TTL
|
||||
final mobileBatchEpgProvider =
|
||||
FutureProvider.family<Map<String, ShortEpg>, BatchEpgRequest>(
|
||||
FutureProvider.family<Map<String, model.ShortEPG>, BatchEpgRequest>(
|
||||
(ref, request) async {
|
||||
if (request.streamIds.isEmpty) return {};
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:xtremflow/core/theme/app_colors.dart';
|
||||
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremflow/core/utils/image_cache_config.dart';
|
||||
import 'package:xtremobile/core/theme/app_colors.dart';
|
||||
import 'package:xtremobile/mobile/widgets/tv_focusable.dart';
|
||||
import 'package:xtremobile/core/utils/image_cache_config.dart';
|
||||
|
||||
class MobilePosterCard extends StatelessWidget {
|
||||
final String title;
|
||||
|
||||
+5
-1
@@ -1,4 +1,4 @@
|
||||
name: xtremflow
|
||||
name: xtremobile
|
||||
description: High-performance IPTV Android Application with Xtream Codes API
|
||||
publish_to: 'none'
|
||||
version: 1.5.1+11
|
||||
@@ -47,6 +47,10 @@ dependencies:
|
||||
path_provider: ^2.1.5
|
||||
video_player: ^2.10.1
|
||||
wakelock_plus: ^1.2.8
|
||||
device_info_plus: ^12.3.0
|
||||
shelf_router: ^1.1.4
|
||||
shelf_static: ^1.1.3
|
||||
flutter_cache_manager: ^3.4.1
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:xtremflow/main.dart';
|
||||
import 'package:xtremobile/main.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||
|
||||
Reference in new issue
Block a user