Files
fx_cast/app/src/bridge/components/chromecast/Media.ts
2021-04-25 04:26:53 +01:00

98 lines
2.6 KiB
TypeScript

"use strict";
import castv2 from "castv2";
import Session from "./Session";
import { Message } from "../../types";
import { sendMessage } from "../../lib/messaging"
const NS_MEDIA = "urn:x-cast:com.google.cast.media";
export interface UpdateMessageData {
_volumeLevel?: number;
_volumeMuted?: boolean;
_lastCurrentTime: number;
currentTime: number;
customData?: any;
playbackRate: number;
playerState: string;
repeatMode?: string;
media?: any;
mediaSessionId?: number;
}
export default class Media {
private channel: castv2.Channel;
constructor (
private referenceId: string
, private session: Session) {
this.session.createChannel(NS_MEDIA);
this.channel = this.session.channelMap.get(NS_MEDIA)!;
this.channel.on("message", (data: any) => {
if (data && data.type === "MEDIA_STATUS"
&& data.status && data.status.length > 0) {
const status = data.status[0];
const messageData: UpdateMessageData = {
_lastCurrentTime: Date.now() / 1000
, currentTime: status.currentTime
, customData: status.customData
, playbackRate: status.playbackRate
, playerState: status.playerState
, repeatMode: status.repeatMode
};
if (status.volume) {
messageData._volumeLevel = status.volume.level;
messageData._volumeMuted = status.volume.muted;
}
if (status.media) {
messageData.media = status.media;
}
if (status.mediaSessionId) {
messageData.mediaSessionId = status.mediaSessionId;
}
this.sendMessage("shim:/media/update", messageData);
}
});
}
public messageHandler (message: Message) {
switch (message.subject) {
case "bridge:/media/sendMediaMessage": {
let error = false;
try {
this.channel.send(message.data.message);
} catch (err) {
error = true;
}
this.sendMessage("shim:/media/sendMediaMessageResponse", {
messageId: message.data.messageId
, error
});
break;
}
}
}
private sendMessage (subject: string, data: any) {
data._id = this.referenceId;
(sendMessage as any)({
subject
, data
});
}
}