import 'package:aves/model/entry.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; abstract class AvesVideoController { final AvesEntry _entry; AvesEntry get entry => _entry; AvesVideoController(AvesEntry entry) : _entry = entry; Future dispose(); Future play(); Future pause(); Future seekTo(int targetMillis); Future seekToProgress(double progress) => seekTo((duration * progress).toInt()); Listenable get playCompletedListenable; VideoStatus get status; Stream get statusStream; bool get isReady; bool get isPlaying => status == VideoStatus.playing; int get duration; int get currentPosition; double get progress => currentPosition.toDouble() / duration; Stream get positionStream; Stream get timedTextStream; ValueNotifier get sarNotifier; double get speed; double get minSpeed; double get maxSpeed; set speed(double speed); Future selectStream(StreamType type, StreamSummary? selected); Future getSelectedStream(StreamType type); Map get streams; Future captureFrame(); Widget buildPlayerWidget(BuildContext context); } enum VideoStatus { idle, initialized, paused, playing, completed, error, } enum StreamType { video, audio, text } class StreamSummary { final StreamType type; final int? index, width, height; final String? codecName, language, title; const StreamSummary({ required this.type, required this.index, required this.codecName, required this.language, required this.title, required this.width, required this.height, }); @override String toString() => '$runtimeType#${shortHash(this)}{type: type, index: $index, codecName: $codecName, language: $language, title: $title, width: $width, height: $height}'; }