mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-25 02:23:11 +00:00
Audio selection bug fixes
This commit is contained in:
parent
2dd2b7fc0b
commit
8d488298cf
3 changed files with 46 additions and 38 deletions
|
|
@ -1186,13 +1186,25 @@ const AndroidVideoPlayer: React.FC = () => {
|
||||||
});
|
});
|
||||||
setRnVideoAudioTracks(formattedAudioTracks);
|
setRnVideoAudioTracks(formattedAudioTracks);
|
||||||
|
|
||||||
// Use system auto-selection
|
// Auto-select audio track if none is selected (similar to iOS behavior)
|
||||||
if (selectedAudioTrack?.type === SelectedTrackType.SYSTEM && formattedAudioTracks.length > 0) {
|
if (selectedAudioTrack?.type === SelectedTrackType.SYSTEM && formattedAudioTracks.length > 0) {
|
||||||
|
// Look for English track first
|
||||||
|
const englishTrack = formattedAudioTracks.find((track: {id: number, name: string, language?: string}) => {
|
||||||
|
const lang = (track.language || '').toLowerCase();
|
||||||
|
return lang === 'english' || lang === 'en' || lang === 'eng' ||
|
||||||
|
(track.name && track.name.toLowerCase().includes('english'));
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedTrack = englishTrack || formattedAudioTracks[0];
|
||||||
|
setSelectedAudioTrack({ type: SelectedTrackType.INDEX, value: selectedTrack.id });
|
||||||
|
|
||||||
if (DEBUG_MODE) {
|
if (DEBUG_MODE) {
|
||||||
logger.log(`[AndroidVideoPlayer] Using system auto-selection for ${formattedAudioTracks.length} audio tracks`);
|
if (englishTrack) {
|
||||||
logger.log(`[AndroidVideoPlayer] Available tracks:`, formattedAudioTracks.map((t: any) => `${t.name} (${t.language})`));
|
logger.log(`[AndroidVideoPlayer] Auto-selected English audio track: ${selectedTrack.name} (ID: ${selectedTrack.id})`);
|
||||||
|
} else {
|
||||||
|
logger.log(`[AndroidVideoPlayer] No English track found, auto-selected first audio track: ${selectedTrack.name} (ID: ${selectedTrack.id})`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Keep using system selection
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG_MODE) {
|
if (DEBUG_MODE) {
|
||||||
|
|
@ -1820,6 +1832,12 @@ const AndroidVideoPlayer: React.FC = () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Wrapper function to convert number to SelectedTrack for modal usage
|
||||||
|
const selectAudioTrackById = (trackId: number) => {
|
||||||
|
const trackSelection: SelectedTrack = { type: SelectedTrackType.INDEX, value: trackId };
|
||||||
|
selectAudioTrack(trackSelection);
|
||||||
|
};
|
||||||
|
|
||||||
const selectTextTrack = (trackId: number) => {
|
const selectTextTrack = (trackId: number) => {
|
||||||
if (trackId === -999) {
|
if (trackId === -999) {
|
||||||
setUseCustomSubtitles(true);
|
setUseCustomSubtitles(true);
|
||||||
|
|
@ -2982,7 +3000,7 @@ const AndroidVideoPlayer: React.FC = () => {
|
||||||
zoomScale={zoomScale}
|
zoomScale={zoomScale}
|
||||||
currentResizeMode={resizeMode}
|
currentResizeMode={resizeMode}
|
||||||
vlcAudioTracks={rnVideoAudioTracks}
|
vlcAudioTracks={rnVideoAudioTracks}
|
||||||
selectedAudioTrack={selectedAudioTrack}
|
selectedAudioTrack={selectedAudioTrack?.type === SelectedTrackType.INDEX && selectedAudioTrack.value !== undefined ? Number(selectedAudioTrack.value) : null}
|
||||||
availableStreams={availableStreams}
|
availableStreams={availableStreams}
|
||||||
togglePlayback={togglePlayback}
|
togglePlayback={togglePlayback}
|
||||||
skip={skip}
|
skip={skip}
|
||||||
|
|
@ -3621,8 +3639,8 @@ const AndroidVideoPlayer: React.FC = () => {
|
||||||
showAudioModal={showAudioModal}
|
showAudioModal={showAudioModal}
|
||||||
setShowAudioModal={setShowAudioModal}
|
setShowAudioModal={setShowAudioModal}
|
||||||
vlcAudioTracks={rnVideoAudioTracks}
|
vlcAudioTracks={rnVideoAudioTracks}
|
||||||
selectedAudioTrack={selectedAudioTrack}
|
selectedAudioTrack={selectedAudioTrack?.type === SelectedTrackType.INDEX && selectedAudioTrack.value !== undefined ? Number(selectedAudioTrack.value) : null}
|
||||||
selectAudioTrack={selectAudioTrack}
|
selectAudioTrack={selectAudioTrackById}
|
||||||
/>
|
/>
|
||||||
<SubtitleModals
|
<SubtitleModals
|
||||||
showSubtitleModal={showSubtitleModal}
|
showSubtitleModal={showSubtitleModal}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import { View, Text, TouchableOpacity, Animated, StyleSheet, Platform } from 're
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Ionicons } from '@expo/vector-icons';
|
||||||
import { LinearGradient } from 'expo-linear-gradient';
|
import { LinearGradient } from 'expo-linear-gradient';
|
||||||
import Slider from '@react-native-community/slider';
|
import Slider from '@react-native-community/slider';
|
||||||
import { SelectedTrack, SelectedTrackType } from 'react-native-video';
|
|
||||||
import { styles } from '../utils/playerStyles';
|
import { styles } from '../utils/playerStyles';
|
||||||
import { getTrackDisplayName } from '../utils/playerUtils';
|
import { getTrackDisplayName } from '../utils/playerUtils';
|
||||||
import { useTheme } from '../../../contexts/ThemeContext';
|
import { useTheme } from '../../../contexts/ThemeContext';
|
||||||
|
|
@ -25,7 +24,7 @@ interface PlayerControlsProps {
|
||||||
zoomScale: number;
|
zoomScale: number;
|
||||||
currentResizeMode?: string;
|
currentResizeMode?: string;
|
||||||
vlcAudioTracks: Array<{id: number, name: string, language?: string}>;
|
vlcAudioTracks: Array<{id: number, name: string, language?: string}>;
|
||||||
selectedAudioTrack: SelectedTrack | null;
|
selectedAudioTrack: number | null;
|
||||||
availableStreams?: { [providerId: string]: { streams: any[]; addonName: string } };
|
availableStreams?: { [providerId: string]: { streams: any[]; addonName: string } };
|
||||||
togglePlayback: () => void;
|
togglePlayback: () => void;
|
||||||
skip: (seconds: number) => void;
|
skip: (seconds: number) => void;
|
||||||
|
|
@ -180,7 +179,9 @@ export const PlayerControls: React.FC<PlayerControlsProps> = ({
|
||||||
<Ionicons name="volume-high" size={20} color={vlcAudioTracks.length <= 1 ? 'grey' : 'white'} />
|
<Ionicons name="volume-high" size={20} color={vlcAudioTracks.length <= 1 ? 'grey' : 'white'} />
|
||||||
<Text style={[styles.bottomButtonText, vlcAudioTracks.length <= 1 && {color: 'grey'}]} numberOfLines={1}>
|
<Text style={[styles.bottomButtonText, vlcAudioTracks.length <= 1 && {color: 'grey'}]} numberOfLines={1}>
|
||||||
{(() => {
|
{(() => {
|
||||||
const trackName = getTrackDisplayName(vlcAudioTracks.find(t => t.id === (selectedAudioTrack?.type === SelectedTrackType.INDEX ? selectedAudioTrack.value : null)) || {id: -1, name: 'Default'});
|
const trackName = getTrackDisplayName(
|
||||||
|
vlcAudioTracks.find(t => t.id === selectedAudioTrack) || { id: -1, name: 'Default' }
|
||||||
|
);
|
||||||
// Truncate long audio track names to prevent UI cramping
|
// Truncate long audio track names to prevent UI cramping
|
||||||
const maxLength = 12; // Limit to 12 characters
|
const maxLength = 12; // Limit to 12 characters
|
||||||
return trackName.length > maxLength ? `${trackName.substring(0, maxLength)}...` : trackName;
|
return trackName.length > maxLength ? `${trackName.substring(0, maxLength)}...` : trackName;
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,13 @@ import Animated, {
|
||||||
} from 'react-native-reanimated';
|
} from 'react-native-reanimated';
|
||||||
import { getTrackDisplayName, DEBUG_MODE } from '../utils/playerUtils';
|
import { getTrackDisplayName, DEBUG_MODE } from '../utils/playerUtils';
|
||||||
import { logger } from '../../../utils/logger';
|
import { logger } from '../../../utils/logger';
|
||||||
import { SelectedTrack, SelectedTrackType } from 'react-native-video';
|
|
||||||
|
|
||||||
interface AudioTrackModalProps {
|
interface AudioTrackModalProps {
|
||||||
showAudioModal: boolean;
|
showAudioModal: boolean;
|
||||||
setShowAudioModal: (show: boolean) => void;
|
setShowAudioModal: (show: boolean) => void;
|
||||||
vlcAudioTracks: Array<{id: number, name: string, language?: string}>;
|
vlcAudioTracks: Array<{id: number, name: string, language?: string}>;
|
||||||
selectedAudioTrack: SelectedTrack | null;
|
selectedAudioTrack: number | null;
|
||||||
selectAudioTrack: (trackSelection: SelectedTrack) => void;
|
selectAudioTrack: (trackId: number) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { width } = Dimensions.get('window');
|
const { width } = Dimensions.get('window');
|
||||||
|
|
@ -38,15 +37,13 @@ export const AudioTrackModal: React.FC<AudioTrackModalProps> = ({
|
||||||
if (showAudioModal && DEBUG_MODE) {
|
if (showAudioModal && DEBUG_MODE) {
|
||||||
logger.log(`[AudioTrackModal] Modal opened with selectedAudioTrack:`, selectedAudioTrack);
|
logger.log(`[AudioTrackModal] Modal opened with selectedAudioTrack:`, selectedAudioTrack);
|
||||||
logger.log(`[AudioTrackModal] Available tracks:`, vlcAudioTracks);
|
logger.log(`[AudioTrackModal] Available tracks:`, vlcAudioTracks);
|
||||||
if (selectedAudioTrack?.type === 'index' && selectedAudioTrack.value !== undefined) {
|
if (typeof selectedAudioTrack === 'number') {
|
||||||
const selectedTrack = vlcAudioTracks.find(track => track.id === selectedAudioTrack.value);
|
const selectedTrack = vlcAudioTracks.find(track => track.id === selectedAudioTrack);
|
||||||
if (selectedTrack) {
|
if (selectedTrack) {
|
||||||
logger.log(`[AudioTrackModal] Selected track found: ${selectedTrack.name} (${selectedTrack.language})`);
|
logger.log(`[AudioTrackModal] Selected track found: ${selectedTrack.name} (${selectedTrack.language})`);
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`[AudioTrackModal] Selected track ${selectedAudioTrack.value} not found in available tracks`);
|
logger.warn(`[AudioTrackModal] Selected track ${selectedAudioTrack} not found in available tracks`);
|
||||||
}
|
}
|
||||||
} else if (selectedAudioTrack?.type === 'system') {
|
|
||||||
logger.log(`[AudioTrackModal] Using system auto-selection`);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [showAudioModal, selectedAudioTrack, vlcAudioTracks]);
|
}, [showAudioModal, selectedAudioTrack, vlcAudioTracks]);
|
||||||
|
|
@ -152,15 +149,7 @@ export const AudioTrackModal: React.FC<AudioTrackModalProps> = ({
|
||||||
<View style={{ gap: 8 }}>
|
<View style={{ gap: 8 }}>
|
||||||
{vlcAudioTracks.map((track) => {
|
{vlcAudioTracks.map((track) => {
|
||||||
// Determine if track is selected
|
// Determine if track is selected
|
||||||
let isSelected = false;
|
const isSelected = selectedAudioTrack === track.id;
|
||||||
if (selectedAudioTrack?.type === 'index' && selectedAudioTrack.value === track.id) {
|
|
||||||
isSelected = true;
|
|
||||||
} else if (selectedAudioTrack?.type === 'system' && track.id === vlcAudioTracks[0]?.id) {
|
|
||||||
// Show first track as selected when using system selection
|
|
||||||
isSelected = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// All tracks are now available for selection
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
|
|
@ -176,7 +165,7 @@ export const AudioTrackModal: React.FC<AudioTrackModalProps> = ({
|
||||||
if (DEBUG_MODE) {
|
if (DEBUG_MODE) {
|
||||||
logger.log(`[AudioTrackModal] Selecting track: ${track.id} (${track.name})`);
|
logger.log(`[AudioTrackModal] Selecting track: ${track.id} (${track.name})`);
|
||||||
}
|
}
|
||||||
selectAudioTrack({ type: SelectedTrackType.INDEX, value: track.id });
|
selectAudioTrack(track.id);
|
||||||
// Close modal after selection
|
// Close modal after selection
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setShowAudioModal(false);
|
setShowAudioModal(false);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue