import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'package:chewie/chewie.dart'; import "package:dart_vlc/dart_vlc.dart"; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:openmediacentermobile/preview_tile.dart'; import 'package:video_player/video_player.dart'; import 'api/api.dart'; import 'api/token.dart'; import 'log/log.dart'; import 'platform.dart'; class VideoScreen extends StatefulWidget { const VideoScreen({Key? key, required this.metaData}) : super(key: key); final VideoT metaData; @override State createState() => _VideoScreenState(); } class _VideoScreenState extends State { Player? _player = isDesktop() ? Player(id: Random().nextInt(0x7fffffff)) : null; ChewieController? _chewieController; bool _appBarVisible = true; Timer? _appBarTimer; void loadData() async { final data = await API.query("video", "loadVideo", {'MovieId': widget.metaData.id}); final d = jsonDecode(data); final url = d["MovieUrl"]; final token = await Token.getInstance().getToken(); if (token == null) return; final baseurl = token.domain; // todo not static middle path final path = baseurl + "/videos/vids/" + url; if (isDesktop()) { final media2 = Media.network(path); _player?.open( media2, autoStart: true, // default ); } else { final VideoPlayerController _controller = VideoPlayerController.network(path); await _controller.initialize(); _chewieController = ChewieController( videoPlayerController: _controller, autoPlay: true, looping: true, allowFullScreen: true, allowMuting: true, allowPlaybackSpeedChanging: true, zoomAndPan: true); setState(() {}); } } @override void initState() { super.initState(); if (isDesktop()) { RawKeyboard.instance.addListener((value) { if (value.logicalKey == LogicalKeyboardKey.arrowRight) { _player?.seek(_player!.position.position! + const Duration(seconds: 5)); } else if (value.logicalKey == LogicalKeyboardKey.arrowLeft) { _player?.seek(_player!.position.position! + const Duration(seconds: -5)); } }); } loadData(); _setAppBarTimer(); } @override void dispose() { super.dispose(); if (isDesktop()) { _player?.dispose(); } else { _chewieController?.videoPlayerController.dispose(); _chewieController?.dispose(); } } void _setAppBarTimer() { _appBarTimer?.cancel(); _appBarTimer = Timer( Duration(seconds: 3), () { setState(() { _appBarVisible = false; }); }, ); } @override Widget build(BuildContext context) { return Scaffold( extendBody: true, extendBodyBehindAppBar: true, appBar: _appBarVisible ? AppBar(title: Text(widget.metaData.title)) : null, body: MouseRegion( onHover: (PointerEvent event) { if (event.delta.dx != 0 || event.delta.dy != 0) { setState(() { _appBarVisible = true; }); _setAppBarTimer(); } }, child: Center(child: isDesktop() ? videoDesktop() : videoNotDesktop()), ), ); } Widget videoDesktop() { return Video( player: _player, scale: 1.0, // default showControls: true, playlistLength: 1, ); } Widget videoNotDesktop() { if (_chewieController == null) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: const [CircularProgressIndicator(), Text("loading...")], ); } return Chewie( controller: _chewieController!, ); } }