fixed playing videos in viewer mode
This commit is contained in:
parent
7b8570cc39
commit
769c8f9f2f
4 changed files with 31 additions and 14 deletions
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue