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

View file

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

View file

@ -11,10 +11,11 @@ import 'package:flutter/material.dart';
abstract class AvesVideoController { abstract class AvesVideoController {
final AvesEntry _entry; final AvesEntry _entry;
final bool persistPlayback;
AvesEntry get entry => _entry; AvesEntry get entry => _entry;
AvesVideoController(AvesEntry entry) : _entry = entry; AvesVideoController(AvesEntry entry, {required this.persistPlayback}) : _entry = entry;
static const resumeTimeSaveMinProgress = .05; static const resumeTimeSaveMinProgress = .05;
static const resumeTimeSaveMaxProgress = .95; static const resumeTimeSaveMaxProgress = .95;
@ -29,16 +30,18 @@ abstract class AvesVideoController {
final contentId = entry.contentId; final contentId = entry.contentId;
if (contentId == null || !isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return; if (contentId == null || !isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return;
final _progress = progress; if (persistPlayback) {
if (resumeTimeSaveMinProgress < _progress && _progress < resumeTimeSaveMaxProgress) { final _progress = progress;
await metadataDb.addVideoPlayback({ if (resumeTimeSaveMinProgress < _progress && _progress < resumeTimeSaveMaxProgress) {
VideoPlaybackRow( await metadataDb.addVideoPlayback({
contentId: contentId, VideoPlaybackRow(
resumeTimeMillis: currentPosition, contentId: contentId,
) resumeTimeMillis: currentPosition,
}); )
} else { });
await metadataDb.removeVideoPlayback({contentId}); } else {
await metadataDb.removeVideoPlayback({contentId});
}
} }
} }
@ -46,6 +49,8 @@ abstract class AvesVideoController {
final contentId = entry.contentId; final contentId = entry.contentId;
if (contentId == null) return null; if (contentId == null) return null;
if (!persistPlayback) return null;
final playback = await metadataDb.loadVideoPlayback(contentId); final playback = await metadataDb.loadVideoPlayback(contentId);
final resumeTime = playback?.resumeTimeMillis ?? 0; final resumeTime = playback?.resumeTimeMillis ?? 0;
if (resumeTime == 0) return null; 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 gifLikeBitRateThreshold = 2 << 18; // 512kB/s (4Mb/s)
static const captureFrameEnabled = true; static const captureFrameEnabled = true;
IjkPlayerAvesVideoController(AvesEntry entry) : super(entry) { IjkPlayerAvesVideoController(
AvesEntry entry, {
required bool persistPlayback,
}) : super(
entry,
persistPlayback: persistPlayback,
) {
_instance = FijkPlayer(); _instance = FijkPlayer();
_valueStream.map((value) => value.videoRenderStart).firstWhere((v) => v, orElse: () => false).then( _valueStream.map((value) => value.videoRenderStart).firstWhere((v) => v, orElse: () => false).then(
(started) => canCaptureFrameNotifier.value = captureFrameEnabled && started, (started) => canCaptureFrameNotifier.value = captureFrameEnabled && started,