fix: change skip credit to Next Episode

convenience is king
This commit is contained in:
Tazio
2025-11-09 13:14:01 +01:00
parent cb4a446509
commit 15dd8f813a
3 changed files with 58 additions and 38 deletions
+1 -4
View File
@@ -508,10 +508,7 @@ class PlexClient {
if (metadataJson != null && metadataJson['Chapter'] != null) {
final chapterList = metadataJson['Chapter'] as List;
final markerList = [
chapterList.first,
chapterList[chapterList.length - 2],
];
final markerList = [chapterList.first, chapterList.last];
return markerList.map((marker) {
return PlexMarker(
id: marker['id'] as int,
+43 -30
View File
@@ -1,24 +1,26 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import 'package:provider/provider.dart';
import 'package:os_media_controls/os_media_controls.dart';
import 'package:provider/provider.dart';
import '../models/plex_media_version.dart';
import '../models/plex_metadata.dart';
import '../models/plex_user_profile.dart';
import '../providers/plex_client_provider.dart';
import '../providers/playback_state_provider.dart';
import '../providers/plex_client_provider.dart';
import '../providers/settings_provider.dart';
import '../utils/provider_extensions.dart';
import '../widgets/video_controls/video_controls.dart';
import '../utils/language_codes.dart';
import '../utils/app_logger.dart';
import '../services/settings_service.dart';
import '../utils/app_logger.dart';
import '../utils/language_codes.dart';
import '../utils/orientation_helper.dart';
import '../utils/video_player_navigation.dart';
import '../utils/platform_detector.dart';
import '../models/plex_media_version.dart';
import '../utils/provider_extensions.dart';
import '../utils/video_player_navigation.dart';
import '../widgets/video_controls/video_controls.dart';
class VideoPlayerScreen extends StatefulWidget {
final PlexMetadata metadata;
@@ -240,7 +242,6 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
}
}
Future<void> _loadAdjacentEpisodes() async {
if (widget.metadata.type.toLowerCase() != 'episode') {
return;
@@ -269,7 +270,9 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
widget.metadata.ratingKey,
loopQueue: loopQueue,
);
previous = playbackState.getPreviousEpisode(widget.metadata.ratingKey);
previous = playbackState.getPreviousEpisode(
widget.metadata.ratingKey,
);
} else {
// Use chronological order even in shuffle mode
next = await client.findAdjacentEpisode(widget.metadata, 1);
@@ -1204,7 +1207,9 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
// Get artwork URL
String? artworkUrl;
if (client == null) {
appLogger.w('Cannot get artwork URL for media controls: Plex client is null');
appLogger.w(
'Cannot get artwork URL for media controls: Plex client is null',
);
} else {
final thumbUrl = metadata.type.toLowerCase() == 'episode'
? metadata.grandparentThumb ?? metadata.thumb
@@ -1235,15 +1240,17 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
}
}
await OsMediaControls.setMetadata(MediaMetadata(
title: title,
artist: artist,
album: album,
duration: metadata.duration != null
? Duration(milliseconds: metadata.duration!)
: null,
artworkUrl: artworkUrl,
));
await OsMediaControls.setMetadata(
MediaMetadata(
title: title,
artist: artist,
album: album,
duration: metadata.duration != null
? Duration(milliseconds: metadata.duration!)
: null,
artworkUrl: artworkUrl,
),
);
// Set initial playback state
_updateMediaControlsPlaybackState();
@@ -1252,11 +1259,15 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
void _updateMediaControlsPlaybackState() {
if (player == null) return;
OsMediaControls.setPlaybackState(MediaPlaybackState(
state: player!.state.playing ? PlaybackState.playing : PlaybackState.paused,
position: player!.state.position,
speed: player!.state.rate,
));
OsMediaControls.setPlaybackState(
MediaPlaybackState(
state: player!.state.playing
? PlaybackState.playing
: PlaybackState.paused,
position: player!.state.position,
speed: player!.state.rate,
),
);
}
void _updateMediaControlsPosition() {
@@ -1264,11 +1275,13 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
// Only update if playing to avoid excessive updates
if (player!.state.playing) {
OsMediaControls.setPlaybackState(MediaPlaybackState(
state: PlaybackState.playing,
position: player!.state.position,
speed: player!.state.rate,
));
OsMediaControls.setPlaybackState(
MediaPlaybackState(
state: PlaybackState.playing,
position: player!.state.position,
speed: player!.state.rate,
),
);
}
}
+14 -4
View File
@@ -926,12 +926,22 @@ class _PlexVideoControlsState extends State<PlexVideoControls>
}
Widget _buildSkipMarkerButton() {
final markerType = _currentMarker!.isIntro ? 'Intro' : 'Credits';
final isCredits = _currentMarker!.isCredits;
final hasNextEpisode = widget.onNext != null;
// Show "Next Episode" for credits when next episode is available
final bool showNextEpisode = isCredits && hasNextEpisode;
final String buttonText = showNextEpisode
? 'Next Episode'
: (isCredits ? 'Skip Credits' : 'Skip Intro');
final IconData buttonIcon = showNextEpisode
? Icons.skip_next
: Icons.fast_forward;
return Material(
color: Colors.transparent,
child: InkWell(
onTap: _skipMarker,
onTap: showNextEpisode ? widget.onNext : _skipMarker,
borderRadius: BorderRadius.circular(8),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
@@ -950,7 +960,7 @@ class _PlexVideoControlsState extends State<PlexVideoControls>
mainAxisSize: MainAxisSize.min,
children: [
Text(
'Skip $markerType',
buttonText,
style: const TextStyle(
color: Colors.black,
fontSize: 16,
@@ -958,7 +968,7 @@ class _PlexVideoControlsState extends State<PlexVideoControls>
),
),
const SizedBox(width: 8),
const Icon(Icons.fast_forward, color: Colors.black, size: 20),
Icon(buttonIcon, color: Colors.black, size: 20),
],
),
),