Enhance video playback features by adding playTime and initialPosition handling, and update PlayerControls for better focus management

This commit is contained in:
zimplexing
2025-07-07 22:14:56 +08:00
parent 08e24dd748
commit bd22fa2996
8 changed files with 94 additions and 55 deletions

View File

@@ -8,9 +8,12 @@ import { MediaButton } from '@/components/MediaButton';
import usePlayerStore from '@/stores/playerStore';
interface PlayerControlsProps {}
interface PlayerControlsProps {
currentFocus: string | null;
setShowControls: (show: boolean) => void;
}
export const PlayerControls: React.FC<PlayerControlsProps> = () => {
export const PlayerControls: React.FC<PlayerControlsProps> = ({ currentFocus, setShowControls }) => {
const router = useRouter();
const {
detail,
@@ -41,6 +44,7 @@ export const PlayerControls: React.FC<PlayerControlsProps> = () => {
const onPlayNextEpisode = () => {
if (hasNextEpisode) {
playEpisode(currentEpisodeIndex + 1);
setShowControls(false);
}
};
@@ -77,11 +81,11 @@ export const PlayerControls: React.FC<PlayerControlsProps> = () => {
</ThemedText>
<View style={styles.bottomControls}>
<MediaButton onPress={() => seek(false)}>
<MediaButton onPress={() => seek(false)} isFocused={currentFocus === 'skipBack'}>
<ChevronsLeft color="white" size={24} />
</MediaButton>
<MediaButton onPress={togglePlayPause}>
<MediaButton onPress={togglePlayPause} isFocused={currentFocus === 'playPause'}>
{status?.isLoaded && status.isPlaying ? (
<Pause color="white" size={24} />
) : (
@@ -89,15 +93,19 @@ export const PlayerControls: React.FC<PlayerControlsProps> = () => {
)}
</MediaButton>
<MediaButton onPress={onPlayNextEpisode} isDisabled={!hasNextEpisode}>
<MediaButton
onPress={onPlayNextEpisode}
isDisabled={!hasNextEpisode}
isFocused={currentFocus === 'nextEpisode'}
>
<SkipForward color={hasNextEpisode ? 'white' : '#666'} size={24} />
</MediaButton>
<MediaButton onPress={() => seek(true)}>
<MediaButton onPress={() => seek(true)} isFocused={currentFocus === 'skipForward'}>
<ChevronsRight color="white" size={24} />
</MediaButton>
<MediaButton onPress={() => setShowEpisodeModal(true)}>
<MediaButton onPress={() => setShowEpisodeModal(true)} isFocused={currentFocus === 'episodes'}>
<List color="white" size={24} />
</MediaButton>
</View>

View File

@@ -16,6 +16,7 @@ interface VideoCardProps {
rate?: string;
sourceName?: string;
progress?: number; // 播放进度0-1之间的小数
playTime?: number; // 播放时间 in ms
episodeIndex?: number; // 剧集索引
totalEpisodes?: number; // 总集数
onFocus?: () => void;
@@ -37,6 +38,7 @@ export default function VideoCard({
onFocus,
onRecordDeleted,
api,
playTime,
}: VideoCardProps) {
const router = useRouter();
const [isFocused, setIsFocused] = useState(false);
@@ -60,7 +62,7 @@ export default function VideoCard({
if (progress !== undefined && episodeIndex !== undefined) {
router.push({
pathname: '/play',
params: { source, id, episodeIndex },
params: { source, id, episodeIndex, position: playTime },
});
} else {
router.push({