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:
MichaelandClaude Fable 5 committed 2026-06-10 10:17:40 +02:00
1 parent 60d3f42901
commit 969d40dec5
10 files changed
+30 -20

No files matched your search

+2 -3
View File
@@ -8,7 +8,6 @@ class ApiClient {
factory ApiClient() => _instance;
late final Dio _dio;
String? _token;
ApiClient._internal() {
_dio = Dio(BaseOptions(
@@ -35,7 +34,7 @@ class ApiClient {
void _restoreTokenFromStorage() {
final storedToken = getStoredToken();
if (storedToken != null) {
_token = storedToken;
_dio.options.headers['Authorization'] = 'Bearer $storedToken';
}
}
@@ -48,7 +47,7 @@ class ApiClient {
/// Set authentication token
void setToken(String? token) {
_token = token;
if (token != null) {
_dio.options.headers['Authorization'] = 'Bearer $token';
// Store in localStorage for persistence
-2
View File
@@ -28,7 +28,6 @@ class CacheEntry<T> {
/// Optimized cache service for memory management
class CacheService {
static const _maxMemoryCacheSizeMb = 200;
static const _maxImageCacheItems = 500;
final Map<String, CacheEntry> _cache = {};
int _totalSizeBytes = 0;
@@ -83,7 +82,6 @@ class CacheService {
/// Clear expired entries
void clearExpired() {
final now = DateTime.now();
final toRemove = _cache.entries
.where((e) => e.value.isExpired())
.map((e) => e.key)
+1 -8
View File
@@ -54,14 +54,10 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
bool _isInitialized = false;
bool _isLoading = true;
StreamSubscription? _messageSubscription;
final String _aspectRatio = 'contain';
bool _isSeeking = false;
late final String _viewIdPrefix =
DateTime.now().millisecondsSinceEpoch.toString();
String _viewId = 'iptv-player';
String? _currentStreamUrl;
String _statusMessage = 'Loading...';
String? _errorMessage;
bool _isMuted = false;
bool _ignoreStatusUpdates = false;
@@ -104,7 +100,6 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
}) async {
setState(() {
_isLoading = true;
_statusMessage = 'Loading...';
});
try {
@@ -164,8 +159,6 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
service.isPlaybackLoading = false;
});
_currentStreamUrl = streamUrl;
final encodedUrl = Uri.encodeComponent(streamUrl);
// Force player choice based on stream type:
// - Live TV: Player Lite (simple TS playback with mpegts.js)
@@ -222,9 +215,9 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
});
}
} catch (e) {
print('[PlayerScreen] Failed to load stream: $e');
if (mounted) {
setState(() {
_errorMessage = 'Failed to load stream: $e';
_isLoading = false;
});
}
@@ -42,9 +42,6 @@ class SubtitleEntry {
/// Service for handling subtitles
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
static List<SubtitleEntry> parseSrt(String content) {
final entries = <SubtitleEntry>[];
@@ -26,7 +26,6 @@ class LiveTVTab extends ConsumerStatefulWidget {
class _LiveTVTabState extends ConsumerState<LiveTVTab>
with AutomaticKeepAliveClientMixin {
String? _selectedCategory;
final bool _isGridView = true;
final TextEditingController _searchController = TextEditingController();
bool _showFavoritesOnly = false;
String _searchQuery = '';
@@ -19,7 +19,6 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final currentUser = ref.watch(authProvider).currentUser;
final playlistsAsync = ref.watch(playlistsProvider);
return Theme(
@@ -62,7 +62,6 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
Widget build(BuildContext context) {
final currentUser = ref.watch(authProvider).currentUser;
final settings = ref.watch(iptvSettingsProvider);
final themeState = ref.watch(themeProvider);
final themeNotifier = ref.read(themeProvider.notifier);
final isDark = Theme.of(context).brightness == Brightness.dark;