84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:io';
 | |
| import 'package:flutter/foundation.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 | |
| import 'package:flutter_riverpod/flutter_riverpod.dart';
 | |
| import 'package:island/pods/network.dart';
 | |
| import 'package:island/talker.dart';
 | |
| import 'package:media_kit/media_kit.dart';
 | |
| import 'package:media_kit_video/media_kit_video.dart';
 | |
| 
 | |
| class UniversalVideo extends ConsumerStatefulWidget {
 | |
|   final String uri;
 | |
|   final double aspectRatio;
 | |
|   final bool autoplay;
 | |
|   const UniversalVideo({
 | |
|     super.key,
 | |
|     required this.uri,
 | |
|     this.aspectRatio = 16 / 9,
 | |
|     this.autoplay = false,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   ConsumerState<UniversalVideo> createState() => _UniversalVideoState();
 | |
| }
 | |
| 
 | |
| class _UniversalVideoState extends ConsumerState<UniversalVideo> {
 | |
|   Player? _player;
 | |
|   VideoController? _videoController;
 | |
| 
 | |
|   void _openVideo() async {
 | |
|     final url = widget.uri;
 | |
|     MediaKit.ensureInitialized();
 | |
| 
 | |
|     _player = Player();
 | |
|     _videoController = VideoController(_player!);
 | |
| 
 | |
|     String? uri;
 | |
|     final inCacheInfo = await DefaultCacheManager().getFileFromCache(url);
 | |
|     if (inCacheInfo == null) {
 | |
|       talker.info('[MediaPlayer] Miss cache: $url');
 | |
|       final token = ref.watch(tokenProvider)?.token;
 | |
|       DefaultCacheManager().downloadFile(
 | |
|         url,
 | |
|         authHeaders: {'Authorization': 'AtField $token'},
 | |
|       );
 | |
|       uri = url;
 | |
|     } else {
 | |
|       uri = inCacheInfo.file.path;
 | |
|       talker.info('[MediaPlayer] Hit cache: $url');
 | |
|     }
 | |
| 
 | |
|     _player!.open(Media(uri), play: widget.autoplay);
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     super.initState();
 | |
|     _openVideo();
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     super.dispose();
 | |
|     _player?.dispose();
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     if (_videoController == null) {
 | |
|       return Center(child: CircularProgressIndicator());
 | |
|     }
 | |
| 
 | |
|     return Video(
 | |
|       controller: _videoController!,
 | |
|       aspectRatio: widget.aspectRatio != 1 ? widget.aspectRatio : null,
 | |
|       fit: BoxFit.contain,
 | |
|       controls:
 | |
|           !kIsWeb && (Platform.isAndroid || Platform.isIOS)
 | |
|               ? MaterialVideoControls
 | |
|               : MaterialDesktopVideoControls,
 | |
|     );
 | |
|   }
 | |
| }
 |