From c60dbbb3aeca9f38e96c31ab51b4c9d8ec0b4ed0 Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 29 Jan 2020 15:08:17 +0100 Subject: [PATCH 001/354] Load gamepadtokey.js only when is necessary --- .../serverNotifications/gamepadtokey.js | 6 +--- .../serverNotifications.js | 28 +++++++++---------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/components/serverNotifications/gamepadtokey.js b/src/components/serverNotifications/gamepadtokey.js index abf3ddb38b..9f2c5942fb 100644 --- a/src/components/serverNotifications/gamepadtokey.js +++ b/src/components/serverNotifications/gamepadtokey.js @@ -254,11 +254,7 @@ require(['apphost'], function (appHost) { function runInputLoop() { // Get the latest gamepad state. var gamepads; - if (navigator.getGamepads) { - gamepads = navigator.getGamepads(); - } else if (navigator.webkitGetGamepads) { - gamepads = navigator.webkitGetGamepads(); - } + gamepads = navigator.getGamepads(); gamepads = gamepads || []; var i; var j; diff --git a/src/components/serverNotifications/serverNotifications.js b/src/components/serverNotifications/serverNotifications.js index 1941881b7a..1dfa72ce3a 100644 --- a/src/components/serverNotifications/serverNotifications.js +++ b/src/components/serverNotifications/serverNotifications.js @@ -197,30 +197,30 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus events.on(apiClient, "message", onMessageReceived); } - function enableNativeGamepadKeyMapping() { - if (window.navigator && "string" == typeof window.navigator.gamepadInputEmulation) { - window.navigator.gamepadInputEmulation = "keyboard"; - return true; + function attachgamepad(e) { + if (navigator.getGamepads.length > 0) { + require(["components/serverNotifications/gamepadtokey"]); + console.log("Gamepad connected! Attaching gamepadtokey.js script"); } - - return false; } - function isGamepadSupported() { - return "ongamepadconnected" in window || navigator.getGamepads || navigator.webkitGetGamepads; + function dettachgamepad(e) { + delete require.cache[require(["components/serverNotifications/gamepadtokey"])]; + console.log("Gamepad disconnected! Dettaching gamepadtokey.js"); } connectionManager.getApiClients().forEach(bindEvents); - events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { bindEvents(newApiClient); }); - - if (!enableNativeGamepadKeyMapping() && isGamepadSupported()) { + if (navigator.getGamepads()[0] != null) { require(["components/serverNotifications/gamepadtokey"]); + console.log("Gamepad connected! Attaching gamepadtokey.js script"); + window.addEventListener("gamepaddisconnected", dettachgamepad); + } else { + window.addEventListener("gamepadconnected", attachgamepad); + console.log("No gamepad connected to this device"); } - - require(["components/serverNotifications/mouseManager"]); - + // require(["components/serverNotifications/mouseManager"]); return serverNotifications; }); From ab0a9ef065bb1dbb5231788ad9e067f6cfc42e2e Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 5 Feb 2020 14:13:28 +0100 Subject: [PATCH 002/354] Moved gamepad to input and serverNotofications cleanup --- .../gamepadtokey.js | 166 +++++++++--------- .../mouseManager.js | 0 src/components/keyboardnavigation.js | 39 ++++ .../serverNotifications.js | 22 --- 4 files changed, 120 insertions(+), 107 deletions(-) rename src/components/{serverNotifications => input}/gamepadtokey.js (70%) rename src/components/{serverNotifications => input}/mouseManager.js (100%) diff --git a/src/components/serverNotifications/gamepadtokey.js b/src/components/input/gamepadtokey.js similarity index 70% rename from src/components/serverNotifications/gamepadtokey.js rename to src/components/input/gamepadtokey.js index 9f2c5942fb..865a37f101 100644 --- a/src/components/serverNotifications/gamepadtokey.js +++ b/src/components/input/gamepadtokey.js @@ -255,96 +255,92 @@ require(['apphost'], function (appHost) { // Get the latest gamepad state. var gamepads; gamepads = navigator.getGamepads(); - gamepads = gamepads || []; var i; var j; var len; for (i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; - if (gamepad) { - // Iterate through the axes - var axes = gamepad.axes; - var leftStickX = axes[0]; - var leftStickY = axes[1]; - if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right - _ButtonPressedState.setleftThumbstickRight(true); - } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left - _ButtonPressedState.setleftThumbstickLeft(true); - } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up - _ButtonPressedState.setleftThumbstickUp(true); - } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down - _ButtonPressedState.setleftThumbstickDown(true); - } else { - _ButtonPressedState.setleftThumbstickLeft(false); - _ButtonPressedState.setleftThumbstickRight(false); - _ButtonPressedState.setleftThumbstickUp(false); - _ButtonPressedState.setleftThumbstickDown(false); - } - // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. - var buttons = gamepad.buttons; - for (j = 0, len = buttons.length; j < len; j++) { - if (ProcessedButtons.indexOf(j) !== -1) { - - if (buttons[j].pressed) { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - _ButtonPressedState.setdPadUp(true); - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - _ButtonPressedState.setdPadDown(true); - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - _ButtonPressedState.setdPadLeft(true); - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - _ButtonPressedState.setdPadRight(true); - break; - case _GAMEPAD_A_BUTTON_INDEX: - _ButtonPressedState.setgamepadA(true); - break; - case _GAMEPAD_B_BUTTON_INDEX: - _ButtonPressedState.setgamepadB(true); - break; - default: - // No-op - break; - } - } else { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - if (_ButtonPressedState.getdPadUp()) { - _ButtonPressedState.setdPadUp(false); - } - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - if (_ButtonPressedState.getdPadDown()) { - _ButtonPressedState.setdPadDown(false); - } - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadLeft()) { - _ButtonPressedState.setdPadLeft(false); - } - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadRight()) { - _ButtonPressedState.setdPadRight(false); - } - break; - case _GAMEPAD_A_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadA()) { - _ButtonPressedState.setgamepadA(false); - } - break; - case _GAMEPAD_B_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadB()) { - _ButtonPressedState.setgamepadB(false); - } - break; - default: - // No-op - break; - } + // Iterate through the axes + var axes = gamepad.axes; + var leftStickX = axes[0]; + var leftStickY = axes[1]; + if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right + _ButtonPressedState.setleftThumbstickRight(true); + } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left + _ButtonPressedState.setleftThumbstickLeft(true); + } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up + _ButtonPressedState.setleftThumbstickUp(true); + } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down + _ButtonPressedState.setleftThumbstickDown(true); + } else { + _ButtonPressedState.setleftThumbstickLeft(false); + _ButtonPressedState.setleftThumbstickRight(false); + _ButtonPressedState.setleftThumbstickUp(false); + _ButtonPressedState.setleftThumbstickDown(false); + } + // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. + var buttons = gamepad.buttons; + for (j = 0, len = buttons.length; j < len; j++) { + if (ProcessedButtons.indexOf(j) !== -1) { + if (buttons[j].pressed) { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + _ButtonPressedState.setdPadUp(true); + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + _ButtonPressedState.setdPadDown(true); + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + _ButtonPressedState.setdPadLeft(true); + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + _ButtonPressedState.setdPadRight(true); + break; + case _GAMEPAD_A_BUTTON_INDEX: + _ButtonPressedState.setgamepadA(true); + break; + case _GAMEPAD_B_BUTTON_INDEX: + _ButtonPressedState.setgamepadB(true); + break; + default: + // No-op + break; + } + } else { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + if (_ButtonPressedState.getdPadUp()) { + _ButtonPressedState.setdPadUp(false); + } + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + if (_ButtonPressedState.getdPadDown()) { + _ButtonPressedState.setdPadDown(false); + } + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadLeft()) { + _ButtonPressedState.setdPadLeft(false); + } + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadRight()) { + _ButtonPressedState.setdPadRight(false); + } + break; + case _GAMEPAD_A_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadA()) { + _ButtonPressedState.setgamepadA(false); + } + break; + case _GAMEPAD_B_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadB()) { + _ButtonPressedState.setgamepadB(false); + } + break; + default: + // No-op + break; } } } diff --git a/src/components/serverNotifications/mouseManager.js b/src/components/input/mouseManager.js similarity index 100% rename from src/components/serverNotifications/mouseManager.js rename to src/components/input/mouseManager.js diff --git a/src/components/keyboardnavigation.js b/src/components/keyboardnavigation.js index d1ed03138c..2490a72974 100644 --- a/src/components/keyboardnavigation.js +++ b/src/components/keyboardnavigation.js @@ -126,6 +126,45 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) }); } + function isGamepadConnected() { + var gamepads = navigator.getGamepads(); + var i, len; + for (i = 0, len = gamepads.length; i < len; i++) { + var gamepad = gamepads[i]; + if (gamepad) { + console.log(gamepad); + return true; + } + } + return false; + } + + function attachGamepad(e) { + if (isGamepadConnected()) { + require(["components/input/gamepadtokey"]); + console.log("Gamepad connected! Attaching gamepadtokey.js script"); + } + } + + function dettachGamepad(e) { + if (!isGamepadConnected()) { + delete require.cache[require(["components/input/gamepadtokey"])]; + console.log("Gamepad disconnected! No other gamepads are connected, dettaching gamepadtokey.js"); + } else { + console.log("Gamepad disconnected! There are gamepads still connected."); + } + } + + if (isGamepadConnected()) { + console.log("Gamepad connected! Attaching gamepadtokey.js script"); + } else { + console.log("No gamepad connected to this device"); + } + // No need to check for gamepads manually at load time, the eventhandler will be fired at load time as well + window.addEventListener("gamepaddisconnected", dettachGamepad); + window.addEventListener("gamepadconnected", attachGamepad); + require(["components/input/mouseManager"]); + return { enable: enable, getKeyName: getKeyName diff --git a/src/components/serverNotifications/serverNotifications.js b/src/components/serverNotifications/serverNotifications.js index 1dfa72ce3a..9945941d28 100644 --- a/src/components/serverNotifications/serverNotifications.js +++ b/src/components/serverNotifications/serverNotifications.js @@ -191,36 +191,14 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); } } - function bindEvents(apiClient) { events.off(apiClient, "message", onMessageReceived); events.on(apiClient, "message", onMessageReceived); } - function attachgamepad(e) { - if (navigator.getGamepads.length > 0) { - require(["components/serverNotifications/gamepadtokey"]); - console.log("Gamepad connected! Attaching gamepadtokey.js script"); - } - } - - function dettachgamepad(e) { - delete require.cache[require(["components/serverNotifications/gamepadtokey"])]; - console.log("Gamepad disconnected! Dettaching gamepadtokey.js"); - } - connectionManager.getApiClients().forEach(bindEvents); events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { bindEvents(newApiClient); }); - if (navigator.getGamepads()[0] != null) { - require(["components/serverNotifications/gamepadtokey"]); - console.log("Gamepad connected! Attaching gamepadtokey.js script"); - window.addEventListener("gamepaddisconnected", dettachgamepad); - } else { - window.addEventListener("gamepadconnected", attachgamepad); - console.log("No gamepad connected to this device"); - } - // require(["components/serverNotifications/mouseManager"]); return serverNotifications; }); From 2b4cf6f5b732d2088f46588e9e3d6aadb227d23e Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 5 Feb 2020 14:17:03 +0100 Subject: [PATCH 003/354] Fix lint --- src/components/keyboardnavigation.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/keyboardnavigation.js b/src/components/keyboardnavigation.js index 2490a72974..fb66335514 100644 --- a/src/components/keyboardnavigation.js +++ b/src/components/keyboardnavigation.js @@ -128,7 +128,8 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) function isGamepadConnected() { var gamepads = navigator.getGamepads(); - var i, len; + var i; + var len; for (i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; if (gamepad) { @@ -154,7 +155,7 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) console.log("Gamepad disconnected! There are gamepads still connected."); } } - + if (isGamepadConnected()) { console.log("Gamepad connected! Attaching gamepadtokey.js script"); } else { From 417e7dae8876fdfb80ed3d247ba0cd1e4fc349b2 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 6 Feb 2020 20:06:57 +0100 Subject: [PATCH 004/354] Removed unnecessary check --- src/components/keyboardnavigation.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/keyboardnavigation.js b/src/components/keyboardnavigation.js index fb66335514..8e0bc2f9d4 100644 --- a/src/components/keyboardnavigation.js +++ b/src/components/keyboardnavigation.js @@ -156,12 +156,7 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) } } - if (isGamepadConnected()) { - console.log("Gamepad connected! Attaching gamepadtokey.js script"); - } else { - console.log("No gamepad connected to this device"); - } - // No need to check for gamepads manually at load time, the eventhandler will be fired at load time as well + // No need to check for gamepads manually at load time, the eventhandler will be fired for that window.addEventListener("gamepaddisconnected", dettachGamepad); window.addEventListener("gamepadconnected", attachGamepad); require(["components/input/mouseManager"]); From 145324a2097490af1349d3ba0996536436565c77 Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 7 Feb 2020 14:32:45 +0100 Subject: [PATCH 005/354] Removed logs for testing and changed attempt --- src/components/input/gamepadtokey.js | 13 +++++++------ src/components/{ => input}/keyboardnavigation.js | 6 +----- .../serverNotifications.js | 0 src/scripts/site.js | 4 ++-- 4 files changed, 10 insertions(+), 13 deletions(-) rename src/components/{ => input}/keyboardnavigation.js (95%) rename src/components/{serverNotifications => }/serverNotifications.js (100%) diff --git a/src/components/input/gamepadtokey.js b/src/components/input/gamepadtokey.js index 865a37f101..0b17981f55 100644 --- a/src/components/input/gamepadtokey.js +++ b/src/components/input/gamepadtokey.js @@ -253,13 +253,13 @@ require(['apphost'], function (appHost) { function runInputLoop() { // Get the latest gamepad state. - var gamepads; - gamepads = navigator.getGamepads(); - var i; - var j; - var len; - for (i = 0, len = gamepads.length; i < len; i++) { + var gamepads = navigator.getGamepads(); + for (var i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; + if (!gamepad) + { + return; + } // Iterate through the axes var axes = gamepad.axes; var leftStickX = axes[0]; @@ -280,6 +280,7 @@ require(['apphost'], function (appHost) { } // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. var buttons = gamepad.buttons; + var j; for (j = 0, len = buttons.length; j < len; j++) { if (ProcessedButtons.indexOf(j) !== -1) { if (buttons[j].pressed) { diff --git a/src/components/keyboardnavigation.js b/src/components/input/keyboardnavigation.js similarity index 95% rename from src/components/keyboardnavigation.js rename to src/components/input/keyboardnavigation.js index 8e0bc2f9d4..3840c08e8a 100644 --- a/src/components/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -128,12 +128,9 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) function isGamepadConnected() { var gamepads = navigator.getGamepads(); - var i; - var len; - for (i = 0, len = gamepads.length; i < len; i++) { + for (var i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; if (gamepad) { - console.log(gamepad); return true; } } @@ -149,7 +146,6 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) function dettachGamepad(e) { if (!isGamepadConnected()) { - delete require.cache[require(["components/input/gamepadtokey"])]; console.log("Gamepad disconnected! No other gamepads are connected, dettaching gamepadtokey.js"); } else { console.log("Gamepad disconnected! There are gamepads still connected."); diff --git a/src/components/serverNotifications/serverNotifications.js b/src/components/serverNotifications.js similarity index 100% rename from src/components/serverNotifications/serverNotifications.js rename to src/components/serverNotifications.js diff --git a/src/scripts/site.js b/src/scripts/site.js index 3a10dc85a1..4ad1d10352 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -882,9 +882,9 @@ var AppInfo = {}; define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency); define("viewContainer", [componentsPath + "/viewContainer"], returnFirstDependency); define("dialogHelper", [componentsPath + "/dialogHelper/dialogHelper"], returnFirstDependency); - define("serverNotifications", [componentsPath + "/serverNotifications/serverNotifications"], returnFirstDependency); + define("serverNotifications", [componentsPath + "/serverNotifications"], returnFirstDependency); define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency); - define("keyboardnavigation", [componentsPath + "/keyboardnavigation"], returnFirstDependency); + define("keyboardnavigation", [componentsPath + "/input/keyboardnavigation"], returnFirstDependency); define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency); define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency); define("connectionManager", [], function () { From f8c544c1cff732981a19dbd229414bd7ed9e3daf Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 7 Feb 2020 14:35:31 +0100 Subject: [PATCH 006/354] Fix lint --- src/components/input/gamepadtokey.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/input/gamepadtokey.js b/src/components/input/gamepadtokey.js index 0b17981f55..2bd5f94f7a 100644 --- a/src/components/input/gamepadtokey.js +++ b/src/components/input/gamepadtokey.js @@ -256,8 +256,7 @@ require(['apphost'], function (appHost) { var gamepads = navigator.getGamepads(); for (var i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; - if (!gamepad) - { + if (!gamepad) { return; } // Iterate through the axes From 36118b926bc43578a380972b010aa87417896eba Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 14 Feb 2020 23:24:38 +0900 Subject: [PATCH 007/354] add missing string --- src/strings/en-us.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index c8df7b69db..421108aa87 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1223,6 +1223,7 @@ "PlayFromBeginning": "Play from beginning", "PlayNext": "Play next", "PlayNextEpisodeAutomatically": "Play next episode automatically", + "PlaybackErrorNoCompatibleStream": "There are no available formats that are compatible with this device.", "Played": "Played", "Playlists": "Playlists", "PleaseAddAtLeastOneFolder": "Please add at least one folder to this library by clicking the Add button.", From ea9e79f4d35446d527c49ae9059e240896037980 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 16 Feb 2020 12:17:13 +0900 Subject: [PATCH 008/354] add basic web client configuration --- .gitignore | 584 +--------------------------- src/components/apphost.js | 8 +- src/config.example.json | 3 + src/scripts/settings/webSettings.js | 30 ++ src/scripts/site.js | 1 + 5 files changed, 47 insertions(+), 579 deletions(-) create mode 100644 src/config.example.json create mode 100644 src/scripts/settings/webSettings.js diff --git a/.gitignore b/.gitignore index 2e12adf220..2bb5bc64d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,578 +1,10 @@ +# config +config.json -# Created by https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode -# Edit at https://www.gitignore.io/?templates=node,rider,macos,linux,windows,visualstudio,visualstudiocode +# npm +dist +node_modules -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Dependency lockfile -package-lock.json - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -### Rider ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/modules.xml -# .idea/*.iml -# .idea/modules - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### VisualStudio ### -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ -# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true -**/wwwroot/lib/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- Backup*.rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode - -# dist for webpack output -dist \ No newline at end of file +# ide +.idea +.vscode diff --git a/src/components/apphost.js b/src/components/apphost.js index 2a0b7b19e9..5058148ae6 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -1,4 +1,4 @@ -define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSettings, browser, events, htmlMediaHelper) { +define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], function (appSettings, browser, events, htmlMediaHelper, webSettings) { "use strict"; function getBaseProfileOptions(item) { @@ -276,10 +276,12 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet features.push("otherapppromotions"); features.push("displaymode"); features.push("targetblank"); - // allows users to connect to more than one server - //features.push("multiserver"); features.push("screensaver"); + if (webSettings.getMultiserver()) { + features.push("multiserver") + } + if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { features.push("subtitleappearancesettings"); } diff --git a/src/config.example.json b/src/config.example.json new file mode 100644 index 0000000000..1e79270943 --- /dev/null +++ b/src/config.example.json @@ -0,0 +1,3 @@ +{ + "multiserver": true +} diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js new file mode 100644 index 0000000000..e5bafb0b9d --- /dev/null +++ b/src/scripts/settings/webSettings.js @@ -0,0 +1,30 @@ +define(['appStorage', 'events'], function (appStorage, events) { + 'use strict'; + + function readConfig(path, callback) { + var file = new XMLHttpRequest(); + file.overrideMimeType("application/json"); + file.open("GET", path, true); + file.onreadystatechange = function() { + if (file.readyState === 4 && file.status == "200") { + callback(file.responseText); + } + } + + file.send(null); + } + + var data = {}; + + function WebSettings() { + readConfig("/config.json", function(text) { + data = JSON.parse(text); + }); + } + + WebSettings.prototype.getMultiserver = function () { + return data.multiserver !== false; + }; + + return new WebSettings(); +}); diff --git a/src/scripts/site.js b/src/scripts/site.js index f26e6b68ba..e1ea480f5d 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -809,6 +809,7 @@ var AppInfo = {}; define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency); define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency); + define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency); define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency); define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency); From ed1b35f50fcf7bb2746842ab0cb566d2e230b9f0 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 16 Feb 2020 22:11:36 +0900 Subject: [PATCH 009/354] update some strings and use fetch for the global config --- src/components/apphost.js | 2 +- .../displaysettings.template.html | 2 +- src/components/skinManager.js | 4 ++-- .../subtitlesettings/subtitlesettings.js | 13 ++--------- .../subtitlesettings.template.html | 11 +++++---- src/scripts/settings/appSettings.js | 16 ++++++------- src/scripts/settings/webSettings.js | 23 ++++--------------- src/strings/en-us.json | 16 ++++++------- 8 files changed, 34 insertions(+), 53 deletions(-) diff --git a/src/components/apphost.js b/src/components/apphost.js index 5058148ae6..0a9b9d638c 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -278,7 +278,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f features.push("targetblank"); features.push("screensaver"); - if (webSettings.getMultiserver()) { + if (webSettings.getMultiServer()) { features.push("multiserver") } diff --git a/src/components/displaysettings/displaysettings.template.html b/src/components/displaysettings/displaysettings.template.html index 16bbf0dd8a..4ef8c8b1ca 100644 --- a/src/components/displaysettings/displaysettings.template.html +++ b/src/components/displaysettings/displaysettings.template.html @@ -63,7 +63,7 @@
+
@@ -34,7 +34,6 @@
-

${HeaderSubtitleAppearance}

@@ -61,6 +60,7 @@
+
+
+
+
+ ${PreferEmbeddedEpisodeInfosOverFileNames} + +
${PreferEmbeddedEpisodeInfosOverFileNamesHelp}
+