mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* chore: bump dart sdk to 3.8 * chore: make build * make pigeon * chore: format files --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
						|
import 'package:native_video_player/native_video_player.dart';
 | 
						|
 | 
						|
enum VideoPlaybackState { initializing, paused, playing, buffering, completed }
 | 
						|
 | 
						|
class VideoPlaybackValue {
 | 
						|
  /// The current position of the video
 | 
						|
  final Duration position;
 | 
						|
 | 
						|
  /// The total duration of the video
 | 
						|
  final Duration duration;
 | 
						|
 | 
						|
  /// The current state of the video playback
 | 
						|
  final VideoPlaybackState state;
 | 
						|
 | 
						|
  /// The volume of the video
 | 
						|
  final double volume;
 | 
						|
 | 
						|
  const VideoPlaybackValue({required this.position, required this.duration, required this.state, required this.volume});
 | 
						|
 | 
						|
  factory VideoPlaybackValue.fromNativeController(NativeVideoPlayerController controller) {
 | 
						|
    final playbackInfo = controller.playbackInfo;
 | 
						|
    final videoInfo = controller.videoInfo;
 | 
						|
 | 
						|
    if (playbackInfo == null || videoInfo == null) {
 | 
						|
      return videoPlaybackValueDefault;
 | 
						|
    }
 | 
						|
 | 
						|
    final VideoPlaybackState status = switch (playbackInfo.status) {
 | 
						|
      PlaybackStatus.playing => VideoPlaybackState.playing,
 | 
						|
      PlaybackStatus.paused => VideoPlaybackState.paused,
 | 
						|
      PlaybackStatus.stopped => VideoPlaybackState.completed,
 | 
						|
    };
 | 
						|
 | 
						|
    return VideoPlaybackValue(
 | 
						|
      position: Duration(seconds: playbackInfo.position),
 | 
						|
      duration: Duration(seconds: videoInfo.duration),
 | 
						|
      state: status,
 | 
						|
      volume: playbackInfo.volume,
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  VideoPlaybackValue copyWith({Duration? position, Duration? duration, VideoPlaybackState? state, double? volume}) {
 | 
						|
    return VideoPlaybackValue(
 | 
						|
      position: position ?? this.position,
 | 
						|
      duration: duration ?? this.duration,
 | 
						|
      state: state ?? this.state,
 | 
						|
      volume: volume ?? this.volume,
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const VideoPlaybackValue videoPlaybackValueDefault = VideoPlaybackValue(
 | 
						|
  position: Duration.zero,
 | 
						|
  duration: Duration.zero,
 | 
						|
  state: VideoPlaybackState.initializing,
 | 
						|
  volume: 0.0,
 | 
						|
);
 | 
						|
 | 
						|
final videoPlaybackValueProvider = StateNotifierProvider<VideoPlaybackValueState, VideoPlaybackValue>((ref) {
 | 
						|
  return VideoPlaybackValueState(ref);
 | 
						|
});
 | 
						|
 | 
						|
class VideoPlaybackValueState extends StateNotifier<VideoPlaybackValue> {
 | 
						|
  VideoPlaybackValueState(this.ref) : super(videoPlaybackValueDefault);
 | 
						|
 | 
						|
  final Ref ref;
 | 
						|
 | 
						|
  VideoPlaybackValue get value => state;
 | 
						|
 | 
						|
  set value(VideoPlaybackValue value) {
 | 
						|
    state = value;
 | 
						|
  }
 | 
						|
 | 
						|
  set position(Duration value) {
 | 
						|
    if (state.position == value) return;
 | 
						|
    state = VideoPlaybackValue(position: value, duration: state.duration, state: state.state, volume: state.volume);
 | 
						|
  }
 | 
						|
 | 
						|
  set status(VideoPlaybackState value) {
 | 
						|
    if (state.state == value) return;
 | 
						|
    state = VideoPlaybackValue(position: state.position, duration: state.duration, state: value, volume: state.volume);
 | 
						|
  }
 | 
						|
 | 
						|
  void reset() {
 | 
						|
    state = videoPlaybackValueDefault;
 | 
						|
  }
 | 
						|
}
 |