mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-09 17:19:59 +00:00
114 lines
3.2 KiB
TypeScript
114 lines
3.2 KiB
TypeScript
"use strict";
|
|
|
|
import { Channel } from "castv2";
|
|
|
|
import Session from "./Session";
|
|
|
|
import { Message
|
|
, SendMessageCallback } from "./types";
|
|
|
|
|
|
const MEDIA_NAMESPACE = "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 sessionId: number;
|
|
private mediaSessionId: number;
|
|
private referenceId: string;
|
|
private session: Session;
|
|
private channel: Channel;
|
|
private sendMessageCallback: SendMessageCallback;
|
|
|
|
constructor (
|
|
sessionId: number
|
|
, mediaSessionId: number
|
|
, referenceId: string
|
|
, session: Session
|
|
, sendMessageCallback: SendMessageCallback) {
|
|
|
|
this.sessionId = sessionId;
|
|
this.mediaSessionId = mediaSessionId;
|
|
this.referenceId = referenceId;
|
|
this.session = session;
|
|
this.sendMessageCallback = sendMessageCallback;
|
|
|
|
this.session.createChannel(MEDIA_NAMESPACE);
|
|
this.channel = this.session.channelMap.get(MEDIA_NAMESPACE);
|
|
|
|
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 = {
|
|
_lastCurrentTime: Date.now() / 1000
|
|
, _volumeLevel: status.volume.level
|
|
, _volumeMuted: status.volume.muted
|
|
|
|
, currentTime: status.currentTime
|
|
, customData: status.customData
|
|
, playbackRate: status.playbackRate
|
|
, playerState: status.playerState
|
|
, repeatMode: status.repeatMode
|
|
} as UpdateMessageData;
|
|
|
|
if (status.media) {
|
|
messageData.media = status.media;
|
|
}
|
|
if (status.mediaSessionId) {
|
|
messageData.mediaSessionId = status.mediaSessionId;
|
|
}
|
|
|
|
this.sendMessage("shim:/media/update", messageData);
|
|
|
|
// Update ID
|
|
if (status.mediaSessionId) {
|
|
this.mediaSessionId = status.mediaSessionId;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
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 = {}) {
|
|
this.sendMessageCallback({
|
|
subject
|
|
, data
|
|
, _id: this.referenceId
|
|
});
|
|
}
|
|
}
|