mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-10 17:49:58 +00:00
98 lines
2.6 KiB
TypeScript
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
|
|
});
|
|
}
|
|
}
|