mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
fix(ci): exclude bin/ from root analyzer and clean remaining warnings
The frontend CI job ran `flutter analyze` from the repo root, which also analyzed the bin/ server package without its dependencies resolved (shelf_router, sqlite3, bcrypt, test), producing hundreds of uri_does_not_exist errors. bin/ is a standalone package covered by the backend job, so it is now excluded from root analysis. Also: - Remove all unused fields/variables flagged as analyzer warnings (api_client, cache_service, player_screen, subtitle_service, live_tv_tab, mobile screens) - Run `flutter analyze --no-fatal-infos` in CI: pre-existing deprecation infos (withOpacity, dart:html) stay non-fatal while errors and warnings still fail the build Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
60d3f42901
commit
969d40dec5
10 files changed
+30
-20
No files matched your search
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"WebFetch(domain:stitch.withgoogle.com)",
|
||||||
|
"Bash(curl -s -L \"https://stitch.withgoogle.com/preview/1188087097403086912?node-id=a711e3bd0ffd4ff5b8e403ecdb54f247\")",
|
||||||
|
"WebSearch",
|
||||||
|
"Bash(flutter analyze *)",
|
||||||
|
"Bash(flutter *)",
|
||||||
|
"PowerShell(Get-Content *)",
|
||||||
|
"Bash(git push *)",
|
||||||
|
"Bash(git pull *)",
|
||||||
|
"Bash(git checkout *)",
|
||||||
|
"Bash(git reset *)",
|
||||||
|
"Bash(git rm *)",
|
||||||
|
"Bash(rtk git *)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
channel: stable
|
channel: stable
|
||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
- run: flutter analyze
|
# Infos (pre-existing withOpacity/dart:html deprecations) are not
|
||||||
|
# fatal; errors and warnings still fail the build.
|
||||||
|
- run: flutter analyze --no-fatal-infos
|
||||||
- run: flutter test
|
- run: flutter test
|
||||||
- run: flutter build web --release
|
- run: flutter build web --release
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
include: package:flutter_lints/flutter.yaml
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
analyzer:
|
||||||
|
exclude:
|
||||||
|
# bin/ is a standalone Dart package (server) with its own pubspec and
|
||||||
|
# analysis; it is analyzed by the backend CI job via `dart analyze`.
|
||||||
|
- bin/**
|
||||||
|
|
||||||
linter:
|
linter:
|
||||||
rules:
|
rules:
|
||||||
- prefer_const_constructors
|
- prefer_const_constructors
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ class ApiClient {
|
|||||||
factory ApiClient() => _instance;
|
factory ApiClient() => _instance;
|
||||||
|
|
||||||
late final Dio _dio;
|
late final Dio _dio;
|
||||||
String? _token;
|
|
||||||
|
|
||||||
ApiClient._internal() {
|
ApiClient._internal() {
|
||||||
_dio = Dio(BaseOptions(
|
_dio = Dio(BaseOptions(
|
||||||
@@ -35,7 +34,7 @@ class ApiClient {
|
|||||||
void _restoreTokenFromStorage() {
|
void _restoreTokenFromStorage() {
|
||||||
final storedToken = getStoredToken();
|
final storedToken = getStoredToken();
|
||||||
if (storedToken != null) {
|
if (storedToken != null) {
|
||||||
_token = storedToken;
|
|
||||||
_dio.options.headers['Authorization'] = 'Bearer $storedToken';
|
_dio.options.headers['Authorization'] = 'Bearer $storedToken';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,7 +47,7 @@ class ApiClient {
|
|||||||
|
|
||||||
/// Set authentication token
|
/// Set authentication token
|
||||||
void setToken(String? token) {
|
void setToken(String? token) {
|
||||||
_token = token;
|
|
||||||
if (token != null) {
|
if (token != null) {
|
||||||
_dio.options.headers['Authorization'] = 'Bearer $token';
|
_dio.options.headers['Authorization'] = 'Bearer $token';
|
||||||
// Store in localStorage for persistence
|
// Store in localStorage for persistence
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ class CacheEntry<T> {
|
|||||||
/// Optimized cache service for memory management
|
/// Optimized cache service for memory management
|
||||||
class CacheService {
|
class CacheService {
|
||||||
static const _maxMemoryCacheSizeMb = 200;
|
static const _maxMemoryCacheSizeMb = 200;
|
||||||
static const _maxImageCacheItems = 500;
|
|
||||||
|
|
||||||
final Map<String, CacheEntry> _cache = {};
|
final Map<String, CacheEntry> _cache = {};
|
||||||
int _totalSizeBytes = 0;
|
int _totalSizeBytes = 0;
|
||||||
@@ -83,7 +82,6 @@ class CacheService {
|
|||||||
|
|
||||||
/// Clear expired entries
|
/// Clear expired entries
|
||||||
void clearExpired() {
|
void clearExpired() {
|
||||||
final now = DateTime.now();
|
|
||||||
final toRemove = _cache.entries
|
final toRemove = _cache.entries
|
||||||
.where((e) => e.value.isExpired())
|
.where((e) => e.value.isExpired())
|
||||||
.map((e) => e.key)
|
.map((e) => e.key)
|
||||||
|
|||||||
@@ -54,14 +54,10 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
|||||||
bool _isInitialized = false;
|
bool _isInitialized = false;
|
||||||
bool _isLoading = true;
|
bool _isLoading = true;
|
||||||
StreamSubscription? _messageSubscription;
|
StreamSubscription? _messageSubscription;
|
||||||
final String _aspectRatio = 'contain';
|
|
||||||
bool _isSeeking = false;
|
bool _isSeeking = false;
|
||||||
late final String _viewIdPrefix =
|
late final String _viewIdPrefix =
|
||||||
DateTime.now().millisecondsSinceEpoch.toString();
|
DateTime.now().millisecondsSinceEpoch.toString();
|
||||||
String _viewId = 'iptv-player';
|
String _viewId = 'iptv-player';
|
||||||
String? _currentStreamUrl;
|
|
||||||
String _statusMessage = 'Loading...';
|
|
||||||
String? _errorMessage;
|
|
||||||
bool _isMuted = false;
|
bool _isMuted = false;
|
||||||
bool _ignoreStatusUpdates = false;
|
bool _ignoreStatusUpdates = false;
|
||||||
|
|
||||||
@@ -104,7 +100,6 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
|||||||
}) async {
|
}) async {
|
||||||
setState(() {
|
setState(() {
|
||||||
_isLoading = true;
|
_isLoading = true;
|
||||||
_statusMessage = 'Loading...';
|
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -164,8 +159,6 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
|||||||
service.isPlaybackLoading = false;
|
service.isPlaybackLoading = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
_currentStreamUrl = streamUrl;
|
|
||||||
|
|
||||||
final encodedUrl = Uri.encodeComponent(streamUrl);
|
final encodedUrl = Uri.encodeComponent(streamUrl);
|
||||||
// Force player choice based on stream type:
|
// Force player choice based on stream type:
|
||||||
// - Live TV: Player Lite (simple TS playback with mpegts.js)
|
// - Live TV: Player Lite (simple TS playback with mpegts.js)
|
||||||
@@ -222,9 +215,9 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
print('[PlayerScreen] Failed to load stream: $e');
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_errorMessage = 'Failed to load stream: $e';
|
|
||||||
_isLoading = false;
|
_isLoading = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,9 +42,6 @@ class SubtitleEntry {
|
|||||||
|
|
||||||
/// Service for handling subtitles
|
/// Service for handling subtitles
|
||||||
class SubtitleService {
|
class SubtitleService {
|
||||||
static const _srtPattern =
|
|
||||||
r'(\d+)\n(\d{2}):(\d{2}):(\d{2}),(\d{3}) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})\n([\s\S]*?)(?=\n\n|\Z)';
|
|
||||||
|
|
||||||
/// Parse SRT subtitle content
|
/// Parse SRT subtitle content
|
||||||
static List<SubtitleEntry> parseSrt(String content) {
|
static List<SubtitleEntry> parseSrt(String content) {
|
||||||
final entries = <SubtitleEntry>[];
|
final entries = <SubtitleEntry>[];
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ class LiveTVTab extends ConsumerStatefulWidget {
|
|||||||
class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||||
with AutomaticKeepAliveClientMixin {
|
with AutomaticKeepAliveClientMixin {
|
||||||
String? _selectedCategory;
|
String? _selectedCategory;
|
||||||
final bool _isGridView = true;
|
|
||||||
final TextEditingController _searchController = TextEditingController();
|
final TextEditingController _searchController = TextEditingController();
|
||||||
bool _showFavoritesOnly = false;
|
bool _showFavoritesOnly = false;
|
||||||
String _searchQuery = '';
|
String _searchQuery = '';
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final currentUser = ref.watch(authProvider).currentUser;
|
|
||||||
final playlistsAsync = ref.watch(playlistsProvider);
|
final playlistsAsync = ref.watch(playlistsProvider);
|
||||||
|
|
||||||
return Theme(
|
return Theme(
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final currentUser = ref.watch(authProvider).currentUser;
|
final currentUser = ref.watch(authProvider).currentUser;
|
||||||
final settings = ref.watch(iptvSettingsProvider);
|
final settings = ref.watch(iptvSettingsProvider);
|
||||||
final themeState = ref.watch(themeProvider);
|
|
||||||
final themeNotifier = ref.read(themeProvider.notifier);
|
final themeNotifier = ref.read(themeProvider.notifier);
|
||||||
final isDark = Theme.of(context).brightness == Brightness.dark;
|
final isDark = Theme.of(context).brightness == Brightness.dark;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user