mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-24 12:24:42 +08:00
Enhance video playback features by adding playTime and initialPosition handling, and update PlayerControls for better focus management
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user