First separation commit.
Added LICENSE, README.md, CONTRIBUTORS.md
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
define(["connectionManager", "playbackManager", "events", "inputManager", "focusManager", "appRouter"], function(connectionManager, playbackManager, events, inputManager, focusManager, appRouter) {
|
||||
"use strict";
|
||||
|
||||
function notifyApp() {
|
||||
inputManager.notify()
|
||||
}
|
||||
|
||||
function displayMessage(cmd) {
|
||||
var args = cmd.Arguments;
|
||||
args.TimeoutMs ? require(["toast"], function(toast) {
|
||||
toast({
|
||||
title: args.Header,
|
||||
text: args.Text
|
||||
})
|
||||
}) : require(["alert"], function(alert) {
|
||||
alert({
|
||||
title: args.Header,
|
||||
text: args.Text
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function displayContent(cmd, apiClient) {
|
||||
playbackManager.isPlayingLocally(["Video", "Book", "Game"]) || appRouter.showItem(cmd.Arguments.ItemId, apiClient.serverId())
|
||||
}
|
||||
|
||||
function playTrailers(apiClient, itemId) {
|
||||
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function(item) {
|
||||
playbackManager.playTrailers(item)
|
||||
})
|
||||
}
|
||||
|
||||
function processGeneralCommand(cmd, apiClient) {
|
||||
switch (cmd.Name) {
|
||||
case "Select":
|
||||
return void inputManager.trigger("select");
|
||||
case "Back":
|
||||
return void inputManager.trigger("back");
|
||||
case "MoveUp":
|
||||
return void inputManager.trigger("up");
|
||||
case "MoveDown":
|
||||
return void inputManager.trigger("down");
|
||||
case "MoveLeft":
|
||||
return void inputManager.trigger("left");
|
||||
case "MoveRight":
|
||||
return void inputManager.trigger("right");
|
||||
case "PageUp":
|
||||
return void inputManager.trigger("pageup");
|
||||
case "PageDown":
|
||||
return void inputManager.trigger("pagedown");
|
||||
case "PlayTrailers":
|
||||
playTrailers(apiClient, cmd.Arguments.ItemId);
|
||||
break;
|
||||
case "SetRepeatMode":
|
||||
playbackManager.setRepeatMode(cmd.Arguments.RepeatMode);
|
||||
break;
|
||||
case "VolumeUp":
|
||||
return void inputManager.trigger("volumeup");
|
||||
case "VolumeDown":
|
||||
return void inputManager.trigger("volumedown");
|
||||
case "ChannelUp":
|
||||
return void inputManager.trigger("channelup");
|
||||
case "ChannelDown":
|
||||
return void inputManager.trigger("channeldown");
|
||||
case "Mute":
|
||||
return void inputManager.trigger("mute");
|
||||
case "Unmute":
|
||||
return void inputManager.trigger("unmute");
|
||||
case "ToggleMute":
|
||||
return void inputManager.trigger("togglemute");
|
||||
case "SetVolume":
|
||||
notifyApp(), playbackManager.setVolume(cmd.Arguments.Volume);
|
||||
break;
|
||||
case "SetAudioStreamIndex":
|
||||
notifyApp(), playbackManager.setAudioStreamIndex(parseInt(cmd.Arguments.Index));
|
||||
break;
|
||||
case "SetSubtitleStreamIndex":
|
||||
notifyApp(), playbackManager.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index));
|
||||
break;
|
||||
case "ToggleFullscreen":
|
||||
return void inputManager.trigger("togglefullscreen");
|
||||
case "GoHome":
|
||||
return void inputManager.trigger("home");
|
||||
case "GoToSettings":
|
||||
return void inputManager.trigger("settings");
|
||||
case "DisplayContent":
|
||||
displayContent(cmd, apiClient);
|
||||
break;
|
||||
case "GoToSearch":
|
||||
return void inputManager.trigger("search");
|
||||
case "DisplayMessage":
|
||||
displayMessage(cmd);
|
||||
break;
|
||||
case "ToggleOsd":
|
||||
case "ToggleContextMenu":
|
||||
case "TakeScreenShot":
|
||||
case "SendKey":
|
||||
break;
|
||||
case "SendString":
|
||||
focusManager.sendText(cmd.Arguments.String);
|
||||
break;
|
||||
default:
|
||||
console.log("processGeneralCommand does not recognize: " + cmd.Name)
|
||||
}
|
||||
notifyApp()
|
||||
}
|
||||
|
||||
function onMessageReceived(e, msg) {
|
||||
var apiClient = this;
|
||||
if ("Play" === msg.MessageType) {
|
||||
notifyApp();
|
||||
var serverId = apiClient.serverInfo().Id;
|
||||
"PlayNext" === msg.Data.PlayCommand ? playbackManager.queueNext({
|
||||
ids: msg.Data.ItemIds,
|
||||
serverId: serverId
|
||||
}) : "PlayLast" === msg.Data.PlayCommand ? playbackManager.queue({
|
||||
ids: msg.Data.ItemIds,
|
||||
serverId: serverId
|
||||
}) : playbackManager.play({
|
||||
ids: msg.Data.ItemIds,
|
||||
startPositionTicks: msg.Data.StartPositionTicks,
|
||||
mediaSourceId: msg.Data.MediaSourceId,
|
||||
audioStreamIndex: msg.Data.AudioStreamIndex,
|
||||
subtitleStreamIndex: msg.Data.SubtitleStreamIndex,
|
||||
startIndex: msg.Data.StartIndex,
|
||||
serverId: serverId
|
||||
})
|
||||
} else if ("Playstate" === msg.MessageType) "Stop" === msg.Data.Command ? inputManager.trigger("stop") : "Pause" === msg.Data.Command ? inputManager.trigger("pause") : "Unpause" === msg.Data.Command ? inputManager.trigger("play") : "PlayPause" === msg.Data.Command ? inputManager.trigger("playpause") : "Seek" === msg.Data.Command ? playbackManager.seek(msg.Data.SeekPositionTicks) : "NextTrack" === msg.Data.Command ? inputManager.trigger("next") : "PreviousTrack" === msg.Data.Command ? inputManager.trigger("previous") : notifyApp();
|
||||
else if ("GeneralCommand" === msg.MessageType) {
|
||||
var cmd = msg.Data;
|
||||
processGeneralCommand(cmd, apiClient)
|
||||
} else if ("UserDataChanged" === msg.MessageType) {
|
||||
if (msg.Data.UserId === apiClient.getCurrentUserId())
|
||||
for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) events.trigger(serverNotifications, "UserDataChanged", [apiClient, msg.Data.UserDataList[i]])
|
||||
} else events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data])
|
||||
}
|
||||
|
||||
function bindEvents(apiClient) {
|
||||
events.off(apiClient, "message", onMessageReceived), events.on(apiClient, "message", onMessageReceived)
|
||||
}
|
||||
var serverNotifications = {};
|
||||
return connectionManager.getApiClients().forEach(bindEvents), events.on(connectionManager, "apiclientcreated", function(e, newApiClient) {
|
||||
bindEvents(newApiClient)
|
||||
}), serverNotifications
|
||||
});
|
||||
@@ -0,0 +1,153 @@
|
||||
require(["apphost"], function(appHost) {
|
||||
"use strict";
|
||||
|
||||
function throttle(key) {
|
||||
var time = times[key] || 0;
|
||||
return (new Date).getTime() - time >= 200
|
||||
}
|
||||
|
||||
function resetThrottle(key) {
|
||||
times[key] = (new Date).getTime()
|
||||
}
|
||||
|
||||
function allowInput() {
|
||||
return !(!isElectron && document.hidden) && "Minimized" !== appHost.getWindowState()
|
||||
}
|
||||
|
||||
function raiseEvent(name, key, keyCode) {
|
||||
if (allowInput()) {
|
||||
var event = document.createEvent("Event");
|
||||
event.initEvent(name, !0, !0), event.key = key, event.keyCode = keyCode, (document.activeElement || document.body).dispatchEvent(event)
|
||||
}
|
||||
}
|
||||
|
||||
function clickElement(elem) {
|
||||
allowInput() && elem.click()
|
||||
}
|
||||
|
||||
function raiseKeyEvent(oldPressedState, newPressedState, key, keyCode, enableRepeatKeyDown, clickonKeyUp) {
|
||||
if (!0 === newPressedState) {
|
||||
var fire = !1;
|
||||
!1 === oldPressedState ? (fire = !0, resetThrottle(key)) : enableRepeatKeyDown && (fire = throttle(key)), fire && keyCode && raiseEvent("keydown", key, keyCode)
|
||||
} else !1 === newPressedState && !0 === oldPressedState && (resetThrottle(key), keyCode && raiseEvent("keyup", key, keyCode), clickonKeyUp && clickElement(document.activeElement || window))
|
||||
}
|
||||
|
||||
function runInputLoop() {
|
||||
var gamepads;
|
||||
navigator.getGamepads ? gamepads = navigator.getGamepads() : navigator.webkitGetGamepads && (gamepads = navigator.webkitGetGamepads()), gamepads = gamepads || [];
|
||||
var i, j, len;
|
||||
for (i = 0, len = gamepads.length; i < len; i++) {
|
||||
var gamepad = gamepads[i];
|
||||
if (gamepad) {
|
||||
var axes = gamepad.axes,
|
||||
leftStickX = axes[0],
|
||||
leftStickY = axes[1];
|
||||
leftStickX > _THUMB_STICK_THRESHOLD ? _ButtonPressedState.setleftThumbstickRight(!0) : leftStickX < -_THUMB_STICK_THRESHOLD ? _ButtonPressedState.setleftThumbstickLeft(!0) : leftStickY < -_THUMB_STICK_THRESHOLD ? _ButtonPressedState.setleftThumbstickUp(!0) : leftStickY > _THUMB_STICK_THRESHOLD ? _ButtonPressedState.setleftThumbstickDown(!0) : (_ButtonPressedState.setleftThumbstickLeft(!1), _ButtonPressedState.setleftThumbstickRight(!1), _ButtonPressedState.setleftThumbstickUp(!1), _ButtonPressedState.setleftThumbstickDown(!1));
|
||||
var buttons = gamepad.buttons;
|
||||
for (j = 0, len = buttons.length; j < len; j++)
|
||||
if (-1 !== ProcessedButtons.indexOf(j))
|
||||
if (buttons[j].pressed) switch (j) {
|
||||
case _GAMEPAD_DPAD_UP_BUTTON_INDEX:
|
||||
_ButtonPressedState.setdPadUp(!0);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX:
|
||||
_ButtonPressedState.setdPadDown(!0);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX:
|
||||
_ButtonPressedState.setdPadLeft(!0);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX:
|
||||
_ButtonPressedState.setdPadRight(!0);
|
||||
break;
|
||||
case _GAMEPAD_A_BUTTON_INDEX:
|
||||
_ButtonPressedState.setgamepadA(!0);
|
||||
break;
|
||||
case _GAMEPAD_B_BUTTON_INDEX:
|
||||
_ButtonPressedState.setgamepadB(!0)
|
||||
} else switch (j) {
|
||||
case _GAMEPAD_DPAD_UP_BUTTON_INDEX:
|
||||
_ButtonPressedState.getdPadUp() && _ButtonPressedState.setdPadUp(!1);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX:
|
||||
_ButtonPressedState.getdPadDown() && _ButtonPressedState.setdPadDown(!1);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX:
|
||||
_ButtonPressedState.getdPadLeft() && _ButtonPressedState.setdPadLeft(!1);
|
||||
break;
|
||||
case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX:
|
||||
_ButtonPressedState.getdPadRight() && _ButtonPressedState.setdPadRight(!1);
|
||||
break;
|
||||
case _GAMEPAD_A_BUTTON_INDEX:
|
||||
_ButtonPressedState.getgamepadA() && _ButtonPressedState.setgamepadA(!1);
|
||||
break;
|
||||
case _GAMEPAD_B_BUTTON_INDEX:
|
||||
_ButtonPressedState.getgamepadB() && _ButtonPressedState.setgamepadB(!1)
|
||||
}
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(runInputLoop)
|
||||
}
|
||||
var _GAMEPAD_A_BUTTON_INDEX = 0,
|
||||
_GAMEPAD_B_BUTTON_INDEX = 1,
|
||||
_GAMEPAD_DPAD_UP_BUTTON_INDEX = 12,
|
||||
_GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13,
|
||||
_GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14,
|
||||
_GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15,
|
||||
_THUMB_STICK_THRESHOLD = .75,
|
||||
_leftThumbstickUpPressed = !1,
|
||||
_leftThumbstickDownPressed = !1,
|
||||
_leftThumbstickLeftPressed = !1,
|
||||
_leftThumbstickRightPressed = !1,
|
||||
_dPadUpPressed = !1,
|
||||
_dPadDownPressed = !1,
|
||||
_dPadLeftPressed = !1,
|
||||
_dPadRightPressed = !1,
|
||||
_gamepadAPressed = !1,
|
||||
_gamepadBPressed = !1,
|
||||
ProcessedButtons = [_GAMEPAD_DPAD_UP_BUTTON_INDEX, _GAMEPAD_DPAD_DOWN_BUTTON_INDEX, _GAMEPAD_DPAD_LEFT_BUTTON_INDEX, _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX, _GAMEPAD_A_BUTTON_INDEX, _GAMEPAD_B_BUTTON_INDEX],
|
||||
_ButtonPressedState = {};
|
||||
_ButtonPressedState.getgamepadA = function() {
|
||||
return _gamepadAPressed
|
||||
}, _ButtonPressedState.setgamepadA = function(newPressedState) {
|
||||
raiseKeyEvent(_gamepadAPressed, newPressedState, "GamepadA", 0, !1, !0), _gamepadAPressed = newPressedState
|
||||
}, _ButtonPressedState.getgamepadB = function() {
|
||||
return _gamepadBPressed
|
||||
}, _ButtonPressedState.setgamepadB = function(newPressedState) {
|
||||
raiseKeyEvent(_gamepadBPressed, newPressedState, "GamepadB", 27), _gamepadBPressed = newPressedState
|
||||
}, _ButtonPressedState.getleftThumbstickUp = function() {
|
||||
return _leftThumbstickUpPressed
|
||||
}, _ButtonPressedState.setleftThumbstickUp = function(newPressedState) {
|
||||
raiseKeyEvent(_leftThumbstickUpPressed, newPressedState, "GamepadLeftThumbStickUp", 38, !0), _leftThumbstickUpPressed = newPressedState
|
||||
}, _ButtonPressedState.getleftThumbstickDown = function() {
|
||||
return _leftThumbstickDownPressed
|
||||
}, _ButtonPressedState.setleftThumbstickDown = function(newPressedState) {
|
||||
raiseKeyEvent(_leftThumbstickDownPressed, newPressedState, "GamepadLeftThumbStickDown", 40, !0), _leftThumbstickDownPressed = newPressedState
|
||||
}, _ButtonPressedState.getleftThumbstickLeft = function() {
|
||||
return _leftThumbstickLeftPressed
|
||||
}, _ButtonPressedState.setleftThumbstickLeft = function(newPressedState) {
|
||||
raiseKeyEvent(_leftThumbstickLeftPressed, newPressedState, "GamepadLeftThumbStickLeft", 37, !0), _leftThumbstickLeftPressed = newPressedState
|
||||
}, _ButtonPressedState.getleftThumbstickRight = function() {
|
||||
return _leftThumbstickRightPressed
|
||||
}, _ButtonPressedState.setleftThumbstickRight = function(newPressedState) {
|
||||
raiseKeyEvent(_leftThumbstickRightPressed, newPressedState, "GamepadLeftThumbStickRight", 39, !0), _leftThumbstickRightPressed = newPressedState
|
||||
}, _ButtonPressedState.getdPadUp = function() {
|
||||
return _dPadUpPressed
|
||||
}, _ButtonPressedState.setdPadUp = function(newPressedState) {
|
||||
raiseKeyEvent(_dPadUpPressed, newPressedState, "GamepadDPadUp", 38, !0), _dPadUpPressed = newPressedState
|
||||
}, _ButtonPressedState.getdPadDown = function() {
|
||||
return _dPadDownPressed
|
||||
}, _ButtonPressedState.setdPadDown = function(newPressedState) {
|
||||
raiseKeyEvent(_dPadDownPressed, newPressedState, "GamepadDPadDown", 40, !0), _dPadDownPressed = newPressedState
|
||||
}, _ButtonPressedState.getdPadLeft = function() {
|
||||
return _dPadLeftPressed
|
||||
}, _ButtonPressedState.setdPadLeft = function(newPressedState) {
|
||||
raiseKeyEvent(_dPadLeftPressed, newPressedState, "GamepadDPadLeft", 37, !0), _dPadLeftPressed = newPressedState
|
||||
}, _ButtonPressedState.getdPadRight = function() {
|
||||
return _dPadRightPressed
|
||||
}, _ButtonPressedState.setdPadRight = function(newPressedState) {
|
||||
raiseKeyEvent(_dPadRightPressed, newPressedState, "GamepadDPadRight", 39, !0), _dPadRightPressed = newPressedState
|
||||
};
|
||||
var times = {},
|
||||
isElectron = -1 !== navigator.userAgent.toLowerCase().indexOf("electron");
|
||||
runInputLoop(), window.navigator && "string" == typeof window.navigator.gamepadInputEmulation && (window.navigator.gamepadInputEmulation = "gamepad")
|
||||
});
|
||||
@@ -0,0 +1,75 @@
|
||||
define(["inputManager", "focusManager", "browser", "layoutManager", "events", "dom"], function(inputmanager, focusManager, browser, layoutManager, events, dom) {
|
||||
"use strict";
|
||||
|
||||
function mouseIdleTime() {
|
||||
return (new Date).getTime() - lastMouseInputTime
|
||||
}
|
||||
|
||||
function notifyApp() {
|
||||
inputmanager.notifyMouseMove()
|
||||
}
|
||||
|
||||
function removeIdleClasses() {
|
||||
var classList = document.body.classList;
|
||||
classList.remove("mouseIdle"), classList.remove("mouseIdle-tv")
|
||||
}
|
||||
|
||||
function addIdleClasses() {
|
||||
var classList = document.body.classList;
|
||||
classList.add("mouseIdle"), layoutManager.tv && classList.add("mouseIdle-tv")
|
||||
}
|
||||
|
||||
function onPointerMove(e) {
|
||||
var eventX = e.screenX,
|
||||
eventY = e.screenY;
|
||||
if (void 0 !== eventX || void 0 !== eventY) {
|
||||
var obj = lastPointerMoveData;
|
||||
if (!obj) return void(lastPointerMoveData = {
|
||||
x: eventX,
|
||||
y: eventY
|
||||
});
|
||||
Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10 || (obj.x = eventX, obj.y = eventY, lastMouseInputTime = (new Date).getTime(), notifyApp(), isMouseIdle && (isMouseIdle = !1, removeIdleClasses(), events.trigger(self, "mouseactive")))
|
||||
}
|
||||
}
|
||||
|
||||
function onPointerEnter(e) {
|
||||
if ("mouse" === (e.pointerType || (layoutManager.mobile ? "touch" : "mouse")) && !isMouseIdle) {
|
||||
var parent = focusManager.focusableParent(e.target);
|
||||
parent && focusManager.focus(parent)
|
||||
}
|
||||
}
|
||||
|
||||
function enableFocusWithMouse() {
|
||||
return !!layoutManager.tv && (!browser.web0s && !!browser.tv)
|
||||
}
|
||||
|
||||
function onMouseInterval() {
|
||||
!isMouseIdle && mouseIdleTime() >= 5e3 && (isMouseIdle = !0, addIdleClasses(), events.trigger(self, "mouseidle"))
|
||||
}
|
||||
|
||||
function startMouseInterval() {
|
||||
mouseInterval || (mouseInterval = setInterval(onMouseInterval, 5e3))
|
||||
}
|
||||
|
||||
function stopMouseInterval() {
|
||||
var interval = mouseInterval;
|
||||
interval && (clearInterval(interval), mouseInterval = null), removeIdleClasses()
|
||||
}
|
||||
|
||||
function initMouse() {
|
||||
stopMouseInterval(), dom.removeEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, {
|
||||
passive: !0
|
||||
}), layoutManager.mobile || (startMouseInterval(), dom.addEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, {
|
||||
passive: !0
|
||||
})), dom.removeEventListener(document, window.PointerEvent ? "pointerenter" : "mouseenter", onPointerEnter, {
|
||||
capture: !0,
|
||||
passive: !0
|
||||
}), enableFocusWithMouse() && dom.addEventListener(document, window.PointerEvent ? "pointerenter" : "mouseenter", onPointerEnter, {
|
||||
capture: !0,
|
||||
passive: !0
|
||||
})
|
||||
}
|
||||
var isMouseIdle, lastPointerMoveData, mouseInterval, self = {},
|
||||
lastMouseInputTime = (new Date).getTime();
|
||||
return initMouse(), events.on(layoutManager, "modechange", initMouse), self
|
||||
});
|
||||
Reference in New Issue
Block a user