import 'package:flutter/foundation.dart'; import '../../../core/contracts/playback.dart'; import '../../../providers/subtitle_settings_provider.dart'; enum InitialSubtitleSelectionType { unchanged, disabled, track } class InitialSubtitleSelection { final InitialSubtitleSelectionType type; final EmbySubtitleTrack? track; const InitialSubtitleSelection._({required this.type, this.track}); static const unchanged = InitialSubtitleSelection._( type: InitialSubtitleSelectionType.unchanged, ); static const disabled = InitialSubtitleSelection._( type: InitialSubtitleSelectionType.disabled, ); const InitialSubtitleSelection.track(EmbySubtitleTrack selectedTrack) : this._(type: InitialSubtitleSelectionType.track, track: selectedTrack); } InitialSubtitleSelection resolveInitialSubtitleSelection({ required List subtitles, required int? preferredSubtitleStreamIndex, required int? defaultSubtitleStreamIndex, required RememberedSubtitleTrack? rememberedSubtitle, }) { if (preferredSubtitleStreamIndex != null && preferredSubtitleStreamIndex >= 0) { return _selectionForStreamIndex(subtitles, preferredSubtitleStreamIndex); } if (rememberedSubtitle != null) { if (rememberedSubtitle.isNone) { return InitialSubtitleSelection.disabled; } final rememberedStreamIndex = matchRememberedSubtitle( rememberedSubtitle, subtitles, ); if (rememberedStreamIndex != null) { return _selectionForStreamIndex(subtitles, rememberedStreamIndex); } } if (preferredSubtitleStreamIndex != null && preferredSubtitleStreamIndex < 0) { return InitialSubtitleSelection.disabled; } if (defaultSubtitleStreamIndex != null && defaultSubtitleStreamIndex >= 0) { return _selectionForStreamIndex(subtitles, defaultSubtitleStreamIndex); } if (defaultSubtitleStreamIndex == -1) { return InitialSubtitleSelection.disabled; } return InitialSubtitleSelection.unchanged; } InitialSubtitleSelection _selectionForStreamIndex( List subtitles, int streamIndex, ) { final selectedTrack = subtitles .where((subtitle) => subtitle.index == streamIndex) .firstOrNull; return selectedTrack == null ? InitialSubtitleSelection.unchanged : InitialSubtitleSelection.track(selectedTrack); } @visibleForTesting int? matchRememberedSubtitle( RememberedSubtitleTrack remembered, List subtitles, ) { if (subtitles.isEmpty) return null; final wantedLanguage = remembered.language?.toLowerCase(); final wantedTitle = remembered.title?.toLowerCase(); if (wantedLanguage != null && wantedTitle != null) { for (final subtitle in subtitles) { if (subtitle.language?.toLowerCase() == wantedLanguage && subtitle.title?.toLowerCase() == wantedTitle) { return subtitle.index; } } } if (wantedTitle != null) { for (final subtitle in subtitles) { if (subtitle.title?.toLowerCase() == wantedTitle) { return subtitle.index; } } } if (wantedLanguage != null) { for (final subtitle in subtitles) { if (subtitle.language?.toLowerCase() == wantedLanguage) { return subtitle.index; } } } for (final subtitle in subtitles) { if (subtitle.index == remembered.streamIndex) { return subtitle.index; } } return null; }