expo-dlna-player
Version:
A React Native/Expo module for DLNA/AirPlay media casting to smart TVs and streaming devices
90 lines (76 loc) • 2.57 kB
text/typescript
import type { StyleProp, ViewStyle } from 'react-native';
export interface DeviceInfo {
id: string;
name: string;
model?: string;
manufacturer?: string;
ipAddress?: string;
type: 'dlna' | 'airplay' | 'miracast';
controlURL?: string;
renderControlURL?: string;
}
export interface PlaybackStatus {
isPlaying: boolean;
duration: number;
position: number;
volume: number;
}
export type ExpoDlnaPlayerModuleEvents = {
onDeviceFound: (device: DeviceInfo) => void;
onDeviceDisappeared: (deviceId: string) => void;
onConnectionChanged: (params: ConnectionChangedEventPayload) => void;
onPlaybackStatusChanged: (status: PlaybackStatus) => void;
onError: (params: ErrorEventPayload) => void;
onPermissionStatus: (params: PermissionStatusEventPayload) => void;
};
export type ErrorEventPayload = {
code: string;
message: string;
deviceId?: string;
};
export type PermissionStatusEventPayload = {
permission: 'localNetwork' | 'bluetooth' | 'location';
status: 'granted' | 'denied' | 'unavailable';
};
export type ConnectionChangedEventPayload = {
deviceId: string;
connected: boolean;
}
export type ExpoDlnaPlayerViewProps = {
autoDiscover?: boolean;
style?: StyleProp<ViewStyle>;
};
export interface ProjectionMode {
SCREEN_MIRRORING: string;
VIDEO_ONLY: string;
}
interface EventEmitterInterface<T> {
addListener(eventType: keyof T, listener: T[keyof T]): { remove: () => void };
removeListener(eventType: keyof T, listener: T[keyof T]): void;
removeAllListeners(eventType?: keyof T): void;
emit(eventType: keyof T, ...args: any[]): void;
listenerCount(eventType: keyof T): number;
}
export interface DLNAPlayerInterface extends EventEmitterInterface<ExpoDlnaPlayerModuleEvents> {
// 设备搜索相关
startDiscovery(): Promise<void>;
stopDiscovery(): Promise<void>;
getDevices(): Promise<DeviceInfo[]>;
// 连接与控制
connectToDevice(deviceId: string): Promise<boolean>;
disconnectFromDevice(): Promise<void>;
isConnected(): Promise<boolean>;
getConnectedDevice(): Promise<DeviceInfo | null>;
// 媒体控制
play(url: string, title?: string, mimeType?: string): Promise<void>;
pause(): Promise<void>;
resume(): Promise<void>;
stop(): Promise<void>;
seek(position: number): Promise<void>;
setVolume(volume: number): Promise<void>;
getPlaybackStatus(): Promise<PlaybackStatus>;
// Miracast特定功能
startProjection(deviceId: string, mode?: string): Promise<boolean>;
stopProjection(): Promise<void>;
isProjectionSupported(): Promise<boolean>;
}