feature: Add support for mediaSegments (#138)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2024-11-09 19:40:12 +01:00 committed by GitHub
parent 36758bd508
commit 5c560e54b5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 6823 additions and 8312 deletions

View file

@ -1,9 +1,9 @@
import 'package:fladder/providers/video_player_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:media_kit/media_kit.dart';
import 'package:fladder/providers/video_player_provider.dart';
import 'package:fladder/screens/video_player/components/video_player_chapters.dart';
import 'package:fladder/screens/video_player/components/video_player_queue.dart';
@ -84,10 +84,10 @@ class IntroSkipButton extends ConsumerWidget {
}
}
class CreditsSkipButton extends ConsumerWidget {
class OutroSkipButton extends ConsumerWidget {
final bool isOverlayVisible;
final Function()? skipCredits;
const CreditsSkipButton({this.skipCredits, required this.isOverlayVisible, super.key});
final Function()? skipOutro;
const OutroSkipButton({this.skipOutro, required this.isOverlayVisible, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
@ -96,7 +96,7 @@ class CreditsSkipButton extends ConsumerWidget {
opacity: 1,
duration: const Duration(milliseconds: 250),
child: ElevatedButton(
onPressed: () => skipCredits?.call(),
onPressed: () => skipOutro?.call(),
style: ElevatedButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))),
child: const Padding(
padding: EdgeInsets.all(8),

View file

@ -81,7 +81,7 @@ class _VideoPlayerNextWrapperState extends ConsumerState<VideoPlayerNextWrapper>
return;
}
final credits = ref.read(playBackModel)?.introSkipModel?.credits;
final credits = ref.read(playBackModel)?.mediaSegments?.outro;
if (nextType == AutoNextType.static || credits == null) {
if ((model.duration - model.position).abs() < const Duration(seconds: 32)) {

View file

@ -6,7 +6,7 @@ import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/items/chapters_model.dart';
import 'package:fladder/models/items/intro_skip_model.dart';
import 'package:fladder/models/items/media_segments_model.dart';
import 'package:fladder/providers/video_player_provider.dart';
import 'package:fladder/util/duration_extensions.dart';
import 'package:fladder/util/list_padding.dart';
@ -54,7 +54,7 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
final isVisible = (onDragStart ? true : onHoverStart);
final player = ref.watch(videoPlayerProvider);
final position = onDragStart ? currentDuration : widget.position;
final IntroOutSkipModel? introCreditsModel = ref.read(playBackModel.select((value) => value?.introSkipModel));
final MediaSegmentsModel? mediaSegments = ref.read(playBackModel.select((value) => value?.mediaSegments));
final relativeFraction = position.inMilliseconds / widget.duration.inMilliseconds;
return LayoutBuilder(
builder: (context, constraints) {
@ -138,36 +138,22 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
child: Stack(
alignment: Alignment.center,
children: [
if (introCreditsModel?.intro?.start != null && introCreditsModel?.intro?.end != null)
Positioned(
left: calculateStartOffset(constraints, introCreditsModel!.intro!.start),
right: calculateRightOffset(constraints, introCreditsModel.intro!.end),
...?mediaSegments?.segments.map(
(segment) => Positioned(
left: calculateStartOffset(constraints, segment.start),
right: calculateRightOffset(constraints, segment.end),
bottom: 0,
child: Container(
height: 6,
decoration: BoxDecoration(
color: Colors.greenAccent.withOpacity(0.8),
borderRadius: BorderRadius.circular(
100,
),
),
),
),
if (introCreditsModel?.credits?.start != null && introCreditsModel?.credits?.end != null)
Positioned(
left: calculateStartOffset(constraints, introCreditsModel!.credits!.start),
right: calculateRightOffset(constraints, introCreditsModel.credits!.end),
bottom: 0,
child: Container(
height: 6,
decoration: BoxDecoration(
color: Colors.orangeAccent.withOpacity(0.8),
color: segment.type.color,
borderRadius: BorderRadius.circular(
100,
),
),
),
),
),
if (!widget.buffering) ...{
//VideoBufferBar
Positioned(