lukas-heiligenbrunner
bf070ff99a
update dependencies try to infer the prefix of the server url display display size dependent amount on shuffle page
128 lines
3.2 KiB
Dart
128 lines
3.2 KiB
Dart
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<VideoScreen> createState() => _VideoScreenState();
|
|
}
|
|
|
|
class _VideoScreenState extends State<VideoScreen> {
|
|
Player? _player = isDesktop() ? Player(id: Random().nextInt(0x7fffffff)) : null;
|
|
ChewieController? _chewieController;
|
|
|
|
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();
|
|
|
|
// todo hide appbar after some seonds
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
if (isDesktop()) {
|
|
_player?.dispose();
|
|
} else {
|
|
_chewieController?.videoPlayerController.dispose();
|
|
_chewieController?.dispose();
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(widget.metaData.title),
|
|
),
|
|
body: Center(child: isDesktop() ? videoDesktop() : videoNotDesktop()),
|
|
);
|
|
}
|
|
|
|
Widget videoDesktop() {
|
|
return Video(
|
|
player: _player,
|
|
scale: 1.0, // default
|
|
showControls: true
|
|
);
|
|
}
|
|
|
|
Widget videoNotDesktop() {
|
|
if (_chewieController == null) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: const [CircularProgressIndicator(), Text("loading...")],
|
|
);
|
|
}
|
|
return Chewie(
|
|
controller: _chewieController!,
|
|
);
|
|
}
|
|
}
|