feat: keyboard navigation

This commit is contained in:
edde746
2025-11-26 13:51:25 +01:00
parent 0d0388f7a8
commit 01bb1126ef
28 changed files with 5233 additions and 2496 deletions
+41 -18
View File
@@ -123,15 +123,15 @@ class TrackSelectionService {
'Checking language variations for "$preferredLanguage": ${languageVariations.join(", ")}',
);
for (var track in availableTracks) {
final trackLang = track.language?.toLowerCase();
if (trackLang != null && languageVariations.any((lang) => trackLang.startsWith(lang))) {
appLogger.d(
'Found audio track matching profile language "$preferredLanguage" (matched: "$trackLang"): ${track.title ?? "Track ${track.id}"}',
);
return track;
}
}
final match = _findTrackByLanguageVariations<AudioTrack>(
availableTracks,
preferredLanguage,
languageVariations,
(t) => t.language,
(t) => t.title ?? 'Track ${t.id}',
'audio track',
);
if (match != null) return match;
}
appLogger.d(
@@ -258,15 +258,15 @@ class TrackSelectionService {
'Checking language variations for "$preferredLanguage": ${languageVariations.join(", ")}',
);
for (var track in candidateTracks) {
final trackLang = track.language?.toLowerCase();
if (trackLang != null && languageVariations.any((lang) => trackLang.startsWith(lang))) {
appLogger.d(
'Found subtitle matching profile language "$preferredLanguage" (matched: "$trackLang"): ${track.title ?? "Track ${track.id}"}',
);
return track;
}
}
final match = _findTrackByLanguageVariations<SubtitleTrack>(
candidateTracks,
preferredLanguage,
languageVariations,
(t) => t.language,
(t) => t.title ?? 'Track ${t.id}',
'subtitle',
);
if (match != null) return match;
}
appLogger.d(
@@ -370,6 +370,29 @@ class TrackSelectionService {
return title.contains('forced');
}
/// Find a track matching a preferred language from a list of tracks
/// Returns the first track whose language matches any variation of the preferred language
T? _findTrackByLanguageVariations<T>(
List<T> tracks,
String preferredLanguage,
List<String> languageVariations,
String? Function(T) getLanguage,
String Function(T) getTrackDescription,
String trackType,
) {
for (var track in tracks) {
final trackLang = getLanguage(track)?.toLowerCase();
if (trackLang != null &&
languageVariations.any((lang) => trackLang.startsWith(lang))) {
appLogger.d(
'Found $trackType matching profile language "$preferredLanguage" (matched: "$trackLang"): ${getTrackDescription(track)}',
);
return track;
}
}
return null;
}
/// Checks if a track language matches a preferred language
///
/// Handles both 2-letter (ISO 639-1) and 3-letter (ISO 639-2) codes