fixed playing videos in viewer mode

This commit is contained in:
Thibault Deckers 2021-11-24 14:09:32 +09:00
parent 7b8570cc39
commit 769c8f9f2f
4 changed files with 31 additions and 14 deletions

View file

@ -1,3 +1,4 @@
import 'package:aves/app_mode.dart';
import 'package:aves/model/entry.dart';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
@ -74,7 +75,9 @@ class VideoConductorProvider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<VideoConductor>(
create: (context) => VideoConductor(),
create: (context) => VideoConductor(
persistPlayback: context.read<ValueNotifier<AppMode>>().value == AppMode.main,
),
dispose: (context, value) => value.dispose(),
child: child,
);

View file

@ -5,9 +5,12 @@ import 'package:collection/collection.dart';
class VideoConductor {
final List<AvesVideoController> _controllers = [];
final bool persistPlayback;
static const maxControllerCount = 3;
VideoConductor({required this.persistPlayback});
Future<void> dispose() async {
await Future.forEach<AvesVideoController>(_controllers, (controller) => controller.dispose());
_controllers.clear();
@ -18,7 +21,7 @@ class VideoConductor {
if (controller != null) {
_controllers.remove(controller);
} else {
controller = IjkPlayerAvesVideoController(entry);
controller = IjkPlayerAvesVideoController(entry, persistPlayback: persistPlayback);
}
_controllers.insert(0, controller);
while (_controllers.length > maxControllerCount) {

View file

@ -11,10 +11,11 @@ import 'package:flutter/material.dart';
abstract class AvesVideoController {
final AvesEntry _entry;
final bool persistPlayback;
AvesEntry get entry => _entry;
AvesVideoController(AvesEntry entry) : _entry = entry;
AvesVideoController(AvesEntry entry, {required this.persistPlayback}) : _entry = entry;
static const resumeTimeSaveMinProgress = .05;
static const resumeTimeSaveMaxProgress = .95;
@ -29,6 +30,7 @@ abstract class AvesVideoController {
final contentId = entry.contentId;
if (contentId == null || !isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return;
if (persistPlayback) {
final _progress = progress;
if (resumeTimeSaveMinProgress < _progress && _progress < resumeTimeSaveMaxProgress) {
await metadataDb.addVideoPlayback({
@ -41,11 +43,14 @@ abstract class AvesVideoController {
await metadataDb.removeVideoPlayback({contentId});
}
}
}
Future<int?> getResumeTime(BuildContext context) async {
final contentId = entry.contentId;
if (contentId == null) return null;
if (!persistPlayback) return null;
final playback = await metadataDb.loadVideoPlayback(contentId);
final resumeTime = playback?.resumeTimeMillis ?? 0;
if (resumeTime == 0) return null;

View file

@ -55,7 +55,13 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
static const gifLikeBitRateThreshold = 2 << 18; // 512kB/s (4Mb/s)
static const captureFrameEnabled = true;
IjkPlayerAvesVideoController(AvesEntry entry) : super(entry) {
IjkPlayerAvesVideoController(
AvesEntry entry, {
required bool persistPlayback,
}) : super(
entry,
persistPlayback: persistPlayback,
) {
_instance = FijkPlayer();
_valueStream.map((value) => value.videoRenderStart).firstWhere((v) => v, orElse: () => false).then(
(started) => canCaptureFrameNotifier.value = captureFrameEnabled && started,