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/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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue