interface WebKitVideoElement extends HTMLVideoElement {
webkitShowPlaybackTargetPicker(): void;
}
export class AirPlayController {
private video: WebKitVideoElement | null = null;
private available = false;
private handler: ((e: Event) => void) | null = null;
isSupported(): boolean {
return "WebKitPlaybackTargetAvailabilityEvent" in window;
}
attach(video: HTMLVideoElement): void {
this.detach();
this.video = video as WebKitVideoElement;
this.handler = (e: Event) => {
this.available = (e as any).availability === "available";
};
this.video.addEventListener("webkitplaybacktargetavailabilitychanged", this.handler);
}
isAvailable(): boolean {
return this.available;
}
showPicker(): void {
this.video?.webkitShowPlaybackTargetPicker();
}
detach(): void {
if (this.video && this.handler) {
this.video.removeEventListener("webkitplaybacktargetavailabilitychanged", this.handler);
}
this.video = null;
this.handler = null;
this.available = false;
}
}