import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_meedu_videoplayer/meedu_player.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart' as riv; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/modules/anime/providers/stream_controller_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/services/get_anime_servers.dart'; import 'package:mangayomi/utils/media_query.dart'; class AnimeStreamView extends riv.ConsumerWidget { final Chapter episode; const AnimeStreamView({ super.key, required this.episode, }); @override Widget build(BuildContext context, WidgetRef ref) { SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, overlays: []); final serversData = ref.watch(getAnimeServersProvider( chapter: episode, )); return serversData.when( data: (data) { if (data.isEmpty && (episode.manga.value!.isLocalArchive ?? false) == false) { return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, appBar: AppBar( title: const Text(''), leading: BackButton( onPressed: () { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); }, ), ), body: WillPopScope( onWillPop: () async { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); return false; }, child: const Center( child: Text("Error"), ), ), ); } data.sort( (a, b) => a.quality.compareTo(b.quality), ); return AnimeStreamPage( episode: episode, videos: data, ); }, error: (error, stackTrace) => Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, appBar: AppBar( title: const Text(''), leading: BackButton( onPressed: () { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); }, ), ), body: WillPopScope( onWillPop: () async { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); return false; }, child: Center( child: Text(error.toString()), ), ), ), loading: () { return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, body: WillPopScope( onWillPop: () async { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); return false; }, child: Stack( children: [ MeeduVideoPlayer( header: (context, controller, responsive) => AppBar( leading: BackButton( color: Colors.white, onPressed: () { SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); Navigator.pop(context); }, ), ), controller: MeeduPlayerController( autoHideControls: false, responsive: Responsive( fontSizeRelativeToScreen: 2.0, maxFontSize: 12, iconsSizeRelativeToScreen: 10, maxIconsSize: 50, buttonsSizeRelativeToScreen: 10, maxButtonsSize: 50, ), enabledButtons: const EnabledButtons(playPauseAndRepeat: false), screenManager: const ScreenManager( forceLandScapeInFullscreen: false, ), ), ), const ProgressCenter(), ], ), ), ); }, ); } } class AnimeStreamPage extends StatefulWidget { final List