mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-04 03:36:29 +08:00
67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
import React, { useRef } from "react";
|
|
import { View, StyleSheet, Text, ActivityIndicator } from "react-native";
|
|
import { Video, ResizeMode, AVPlaybackStatus } from "expo-av";
|
|
|
|
interface LivePlayerProps {
|
|
streamUrl: string | null;
|
|
channelTitle?: string | null;
|
|
onPlaybackStatusUpdate: (status: AVPlaybackStatus) => void;
|
|
}
|
|
|
|
export default function LivePlayer({ streamUrl, channelTitle, onPlaybackStatusUpdate }: LivePlayerProps) {
|
|
const video = useRef<Video>(null);
|
|
|
|
if (!streamUrl) {
|
|
return (
|
|
<View style={styles.container}>
|
|
<Text>Select a channel to play.</Text>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<Video
|
|
ref={video}
|
|
style={styles.video}
|
|
source={{
|
|
uri: streamUrl,
|
|
}}
|
|
resizeMode={ResizeMode.CONTAIN}
|
|
shouldPlay
|
|
onPlaybackStatusUpdate={onPlaybackStatusUpdate}
|
|
/>
|
|
{channelTitle && (
|
|
<View style={styles.overlay}>
|
|
<Text style={styles.title}>{channelTitle}</Text>
|
|
</View>
|
|
)}
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
justifyContent: "center",
|
|
alignItems: "center",
|
|
backgroundColor: "#000",
|
|
},
|
|
video: {
|
|
flex: 1,
|
|
alignSelf: "stretch",
|
|
},
|
|
overlay: {
|
|
position: "absolute",
|
|
top: 20,
|
|
left: 20,
|
|
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
|
padding: 10,
|
|
borderRadius: 5,
|
|
},
|
|
title: {
|
|
color: "#fff",
|
|
fontSize: 18,
|
|
},
|
|
});
|