mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 02:27:08 -04:00 
			
		
		
		
	* Fixes double video auto initialize issue and placeholder for video controller * WIP unravel stack index * Refactors video player controller format fixing video format Working format * Fixes hide on pause * Got hiding when tapped working * Hides controls when video starts and fixes placeholder for memory card Remove prints * Fixes show controls with microtask * fix LivePhotos not playing * removes unused function callbacks and moves wakelock * Update motion video * Fixing motion photo playing * Renames to isPlayingVideo * Fixes playing video on change * pause on dispose * fixing issues with sync between controls * Adds gallery app bar * Switches to memoized * Fixes pause * Revert "Switches to memoized" This reverts commit 234e6741dea05aa0b967dde746f1d625f15bed94. * uses stateful widget * Fixes double video play by using provider and new chewie video player wip format Fixes motion photos format --------- Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
		
			
				
	
	
		
			157 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:chewie/chewie.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:video_player/video_player.dart';
 | |
| 
 | |
| /// Provides the initialized video player controller
 | |
| /// If the asset is local, use the local file
 | |
| /// Otherwise, use a video player with a URL
 | |
| ChewieController useChewieController({
 | |
|   required VideoPlayerController controller,
 | |
|   EdgeInsets controlsSafeAreaMinimum = const EdgeInsets.only(
 | |
|     bottom: 100,
 | |
|   ),
 | |
|   bool showOptions = true,
 | |
|   bool showControlsOnInitialize = false,
 | |
|   bool autoPlay = true,
 | |
|   bool allowFullScreen = false,
 | |
|   bool allowedScreenSleep = false,
 | |
|   bool showControls = true,
 | |
|   Widget? customControls,
 | |
|   Widget? placeholder,
 | |
|   Duration hideControlsTimer = const Duration(seconds: 1),
 | |
|   VoidCallback? onPlaying,
 | |
|   VoidCallback? onPaused,
 | |
|   VoidCallback? onVideoEnded,
 | |
| }) {
 | |
|   return use(
 | |
|     _ChewieControllerHook(
 | |
|       controller: controller,
 | |
|       placeholder: placeholder,
 | |
|       showOptions: showOptions,
 | |
|       controlsSafeAreaMinimum: controlsSafeAreaMinimum,
 | |
|       autoPlay: autoPlay,
 | |
|       allowFullScreen: allowFullScreen,
 | |
|       customControls: customControls,
 | |
|       hideControlsTimer: hideControlsTimer,
 | |
|       showControlsOnInitialize: showControlsOnInitialize,
 | |
|       showControls: showControls,
 | |
|       allowedScreenSleep: allowedScreenSleep,
 | |
|       onPlaying: onPlaying,
 | |
|       onPaused: onPaused,
 | |
|       onVideoEnded: onVideoEnded,
 | |
|     ),
 | |
|   );
 | |
| }
 | |
| 
 | |
| class _ChewieControllerHook extends Hook<ChewieController> {
 | |
|   final VideoPlayerController controller;
 | |
|   final EdgeInsets controlsSafeAreaMinimum;
 | |
|   final bool showOptions;
 | |
|   final bool showControlsOnInitialize;
 | |
|   final bool autoPlay;
 | |
|   final bool allowFullScreen;
 | |
|   final bool allowedScreenSleep;
 | |
|   final bool showControls;
 | |
|   final Widget? customControls;
 | |
|   final Widget? placeholder;
 | |
|   final Duration hideControlsTimer;
 | |
|   final VoidCallback? onPlaying;
 | |
|   final VoidCallback? onPaused;
 | |
|   final VoidCallback? onVideoEnded;
 | |
| 
 | |
|   const _ChewieControllerHook({
 | |
|     required this.controller,
 | |
|     this.controlsSafeAreaMinimum = const EdgeInsets.only(
 | |
|       bottom: 100,
 | |
|     ),
 | |
|     this.showOptions = true,
 | |
|     this.showControlsOnInitialize = false,
 | |
|     this.autoPlay = true,
 | |
|     this.allowFullScreen = false,
 | |
|     this.allowedScreenSleep = false,
 | |
|     this.showControls = true,
 | |
|     this.customControls,
 | |
|     this.placeholder,
 | |
|     this.hideControlsTimer = const Duration(seconds: 3),
 | |
|     this.onPlaying,
 | |
|     this.onPaused,
 | |
|     this.onVideoEnded,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   createState() => _ChewieControllerHookState();
 | |
| }
 | |
| 
 | |
| class _ChewieControllerHookState
 | |
|     extends HookState<ChewieController, _ChewieControllerHook> {
 | |
|   late ChewieController chewieController = ChewieController(
 | |
|     videoPlayerController: hook.controller,
 | |
|     controlsSafeAreaMinimum: hook.controlsSafeAreaMinimum,
 | |
|     showOptions: hook.showOptions,
 | |
|     showControlsOnInitialize: hook.showControlsOnInitialize,
 | |
|     autoPlay: hook.autoPlay,
 | |
|     allowFullScreen: hook.allowFullScreen,
 | |
|     allowedScreenSleep: hook.allowedScreenSleep,
 | |
|     showControls: hook.showControls,
 | |
|     customControls: hook.customControls,
 | |
|     placeholder: hook.placeholder,
 | |
|     hideControlsTimer: hook.hideControlsTimer,
 | |
|   );
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     chewieController.dispose();
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   ChewieController build(BuildContext context) {
 | |
|     return chewieController;
 | |
|   }
 | |
| 
 | |
|   /*
 | |
|   /// Initializes the chewie controller and video player controller
 | |
|   Future<void> _initialize() async {
 | |
|     if (hook.asset.isLocal && hook.asset.livePhotoVideoId == null) {
 | |
|       // Use a local file for the video player controller
 | |
|       final file = await hook.asset.local!.file;
 | |
|       if (file == null) {
 | |
|         throw Exception('No file found for the video');
 | |
|       }
 | |
|       videoPlayerController = VideoPlayerController.file(file);
 | |
|     } else {
 | |
|       // Use a network URL for the video player controller
 | |
|       final serverEndpoint = store.Store.get(store.StoreKey.serverEndpoint);
 | |
|       final String videoUrl = hook.asset.livePhotoVideoId != null
 | |
|           ? '$serverEndpoint/asset/file/${hook.asset.livePhotoVideoId}'
 | |
|           : '$serverEndpoint/asset/file/${hook.asset.remoteId}';
 | |
| 
 | |
|       final url = Uri.parse(videoUrl);
 | |
|       final accessToken = store.Store.get(StoreKey.accessToken);
 | |
| 
 | |
|       videoPlayerController = VideoPlayerController.networkUrl(
 | |
|         url,
 | |
|         httpHeaders: {"x-immich-user-token": accessToken},
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     await videoPlayerController!.initialize();
 | |
| 
 | |
|     chewieController = ChewieController(
 | |
|       videoPlayerController: videoPlayerController!,
 | |
|       controlsSafeAreaMinimum: hook.controlsSafeAreaMinimum,
 | |
|       showOptions: hook.showOptions,
 | |
|       showControlsOnInitialize: hook.showControlsOnInitialize,
 | |
|       autoPlay: hook.autoPlay,
 | |
|       allowFullScreen: hook.allowFullScreen,
 | |
|       allowedScreenSleep: hook.allowedScreenSleep,
 | |
|       showControls: hook.showControls,
 | |
|       customControls: hook.customControls,
 | |
|       placeholder: hook.placeholder,
 | |
|       hideControlsTimer: hook.hideControlsTimer,
 | |
|     );
 | |
|   }
 | |
|   */
 | |
| }
 |