mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-09 17:19:59 +00:00
198 lines
6.5 KiB
JavaScript
198 lines
6.5 KiB
JavaScript
"use strict";
|
|
|
|
|
|
import Volume from "../../cast/classes/Volume";
|
|
|
|
import { PlayerState
|
|
, RepeatMode
|
|
, MediaCommand } from "../enums";
|
|
|
|
import _Error from "../../cast/classes/Error";
|
|
import { ErrorCode } from "../../cast/enums";
|
|
|
|
import { onMessage, sendMessage } from "../../messageBridge";
|
|
|
|
import uuid from "uuid/v1";
|
|
|
|
|
|
export default class Media {
|
|
constructor (sessionId, mediaSessionId, _internalSessionId) {
|
|
this._id = uuid();
|
|
|
|
this.activeTrackIds = null;
|
|
this.currentItemId = null;
|
|
this.customData = null;
|
|
this.currentTime = 0;
|
|
this.idleReason = null;
|
|
this.items = null;
|
|
this.loadingItemId = null;
|
|
this.media = null;
|
|
this.mediaSessionId = mediaSessionId;
|
|
this.playbackRate = 1;
|
|
this.playerState = PlayerState.IDLE;
|
|
this.preloadedItemId = null;
|
|
this.repeatMode = RepeatMode.OFF;
|
|
this.sessionId = sessionId;
|
|
this.supportedMediaCommands = [];
|
|
this.volume = new Volume();
|
|
|
|
this._sendMessage("bridge:/media/initialize", {
|
|
sessionId
|
|
, mediaSessionId
|
|
, _internalSessionId
|
|
});
|
|
|
|
onMessage(message => {
|
|
if (!message._id || message._id !== this._id) {
|
|
return;
|
|
}
|
|
|
|
switch (message.subject) {
|
|
case "shim:/media/update":
|
|
const status = message.data;
|
|
this.currentTime = status.currentTime;
|
|
this._lastCurrentTime = status._lastCurrentTime;
|
|
this.customData = status.customData;
|
|
this.volume = new Volume(
|
|
status._volumeLevel
|
|
, status._volumeMuted);
|
|
this.playbackRate = status.playbackRate;
|
|
this.playerState = status.playerState;
|
|
this.repeatMode = status.repeatMode;
|
|
|
|
if (status.media) {
|
|
this.media = status.media;
|
|
}
|
|
if (status.mediaSessionId) {
|
|
this.mediaSessionId = status.mediaSessionId;
|
|
}
|
|
|
|
// Call update listeners
|
|
this._updateListeners.forEach(listener => listener(true));
|
|
|
|
break;
|
|
|
|
case "shim:/media/sendMediaMessageResponse":
|
|
const { messageId, error } = message.data;
|
|
const [ successCallback, errorCallback ]
|
|
= this._sendMediaMessageCallbacks.get(messageId);
|
|
|
|
if (error && errorCallback) {
|
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
|
} else if (successCallback) {
|
|
successCallback();
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
});
|
|
|
|
this._updateListeners = new Set();
|
|
this._sendMediaMessageCallbacks = new Map();
|
|
}
|
|
|
|
_sendMessage (subject, data) {
|
|
sendMessage({
|
|
subject
|
|
, data
|
|
, _id: this._id
|
|
});
|
|
}
|
|
|
|
_sendMediaMessage (message, successCallback, errorCallback) {
|
|
message.mediaSessionId = this.mediaSessionId;
|
|
message.requestId = 0;
|
|
message.sessionId = this.sessionId;
|
|
message.customData = null;
|
|
|
|
const messageId = uuid();
|
|
|
|
this._sendMediaMessageCallbacks.set(messageId, [
|
|
successCallback
|
|
, errorCallback
|
|
]);
|
|
|
|
this._sendMessage("bridge:/media/sendMediaMessage", {
|
|
message
|
|
, messageId
|
|
});
|
|
}
|
|
|
|
addUpdateListener (listener) {
|
|
this._updateListeners.add(listener);
|
|
}
|
|
editTracksInfo (editTracksInfoRequest, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#editTracksInfo");
|
|
}
|
|
getEstimatedTime () {
|
|
if (!this.currentTime) return 0;
|
|
return this.currentTime + ((Date.now() / 1000) - this._lastCurrentTime);
|
|
}
|
|
getStatus (getStatusRequest, successCallback, errorCallback) {
|
|
this._sendMediaMessage({ type: "MEDIA_GET_STATUS" }
|
|
, successCallback, errorCallback);
|
|
}
|
|
pause (pauseRequest, successCallback, errorCallback) {
|
|
this._sendMediaMessage({ type: "PAUSE" }
|
|
, successCallback, errorCallback);
|
|
}
|
|
play (playRequest, successCallback, errorCallback) {
|
|
this._sendMediaMessage({ type: "PLAY" }
|
|
, successCallback, errorCallback);
|
|
}
|
|
queueAppendItem (item, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueAppendItem");
|
|
}
|
|
queueInsertItems (queueInsertItemsRequest, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueInsertItems");
|
|
}
|
|
queueJumpToItem (itemId, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueJumpToItem");
|
|
}
|
|
queueMoveItemToNewIndex (itemId, newIndex, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueMoveItemToNewIndex");
|
|
}
|
|
queueNext (successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueNext");
|
|
}
|
|
queuePrev (successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queuePrev");
|
|
}
|
|
queueRemoveItem(itemId, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueRemoveItem");
|
|
}
|
|
queueReorderItems (queueReorderItemsRequest, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueReorderItems");
|
|
}
|
|
queueSetRepeatMode (repeatMode, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueSetRepeatMode");
|
|
}
|
|
queueUpdateItems (queueUpdateItemsRequest, successCallback, errorCallback) {
|
|
console.log("STUB :: Media#queueUpdateItems");
|
|
}
|
|
removeUpdateListener (listener) {
|
|
this._updateListeners.delete(listener);
|
|
}
|
|
seek (seekRequest, successCallback, errorCallback) {
|
|
console.log(seekRequest);
|
|
this._sendMediaMessage({
|
|
type: "SEEK"
|
|
, currentTime: seekRequest.currentTime
|
|
}, successCallback, errorCallback);
|
|
}
|
|
setVolume (volumeRequest, successCallback, errorCallback) {
|
|
this._sendMediaMessage({
|
|
type: "SET_VOLUME"
|
|
, volume: volumeRequest.volume
|
|
}, successCallback, errorCallback);
|
|
}
|
|
stop (stopRequest, successCallback, errorCallback) {
|
|
this._sendMediaMessage({ type: "STOP" }
|
|
, successCallback, errorCallback);
|
|
}
|
|
supportsCommand (command) {
|
|
console.log("STUB :: Media#supportsCommand");
|
|
}
|
|
}
|