Files
fx_cast/ext/src/shim/media/classes/Media.js

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");
}
}