1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/scripts/site.js

1159 lines
49 KiB
JavaScript
Raw Normal View History

2018-10-23 01:05:09 +03:00
function getWindowLocationSearch(win) {
"use strict";
2018-10-23 01:05:09 +03:00
var search = (win || window).location.search;
2018-10-23 01:05:09 +03:00
if (!search) {
var index = window.location.href.indexOf("?");
if (-1 != index) {
search = window.location.href.substring(index);
}
2018-10-23 01:05:09 +03:00
}
return search || "";
2018-10-23 01:05:09 +03:00
}
function getParameterByName(name, url) {
"use strict";
2018-10-23 01:05:09 +03:00
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS, "i");
var results = regex.exec(url || getWindowLocationSearch());
if (null == results) {
return "";
}
return decodeURIComponent(results[1].replace(/\+/g, " "));
2018-10-23 01:05:09 +03:00
}
function pageClassOn(eventName, className, fn) {
"use strict";
2019-03-04 20:38:39 +00:00
document.addEventListener(eventName, function (event) {
var target = event.target;
if (target.classList.contains(className)) {
2019-03-04 20:38:39 +00:00
fn.call(target, event);
}
});
2018-10-23 01:05:09 +03:00
}
function pageIdOn(eventName, id, fn) {
"use strict";
2019-03-04 20:38:39 +00:00
document.addEventListener(eventName, function (event) {
var target = event.target;
if (target.id === id) {
2019-03-04 20:38:39 +00:00
fn.call(target, event);
}
});
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
var Dashboard = {
getCurrentUser: function () {
return window.ApiClient.getCurrentUser(false);
},
//TODO: investigate url prefix support for serverAddress function
serverAddress: function () {
if (AppInfo.isNativeApp) {
var apiClient = window.ApiClient;
if (apiClient) {
return apiClient.serverAddress();
}
return null;
}
var urlLower = window.location.href.toLowerCase();
var index = urlLower.lastIndexOf("/web");
if (-1 != index) {
return urlLower.substring(0, index);
}
var loc = window.location;
var address = loc.protocol + "//" + loc.hostname;
if (loc.port) {
address += ":" + loc.port;
}
return address;
},
getCurrentUserId: function () {
var apiClient = window.ApiClient;
if (apiClient) {
return apiClient.getCurrentUserId();
}
return null;
},
onServerChanged: function (userId, accessToken, apiClient) {
apiClient = apiClient || window.ApiClient;
window.ApiClient = apiClient;
},
logout: function () {
ConnectionManager.logout().then(function () {
var loginPage;
2019-01-04 12:32:24 +01:00
if (AppInfo.isNativeApp) {
loginPage = "selectserver.html";
window.ApiClient = null;
} else {
loginPage = "login.html";
2018-10-23 01:05:09 +03:00
}
Dashboard.navigate(loginPage);
});
},
getConfigurationPageUrl: function (name) {
return "configurationpage?name=" + encodeURIComponent(name);
},
getConfigurationResourceUrl: function (name) {
if (AppInfo.isNativeApp) {
return ApiClient.getUrl("web/ConfigurationPage", {
2018-10-23 01:05:09 +03:00
name: name
});
}
return Dashboard.getConfigurationPageUrl(name);
},
navigate: function (url, preserveQueryString) {
if (!url) {
throw new Error("url cannot be null or empty");
}
var queryString = getWindowLocationSearch();
if (preserveQueryString && queryString) {
url += queryString;
}
return new Promise(function (resolve, reject) {
require(["appRouter"], function (appRouter) {
return appRouter.show(url).then(resolve, reject);
});
});
},
navigate_direct: function (path) {
return new Promise(function (resolve, reject) {
require(["appRouter"], function (appRouter) {
return appRouter.showDirect(path).then(resolve, reject);
});
});
},
processPluginConfigurationUpdateResult: function () {
require(["loading", "toast"], function (loading, toast) {
loading.hide();
toast(Globalize.translate("MessageSettingsSaved"));
});
},
processServerConfigurationUpdateResult: function (result) {
require(["loading", "toast"], function (loading, toast) {
loading.hide();
toast(Globalize.translate("MessageSettingsSaved"));
});
},
processErrorResponse: function (response) {
require(["loading"], function (loading) {
loading.hide();
});
var status = "" + response.status;
if (response.statusText) {
status = response.statusText;
}
Dashboard.alert({
title: status,
message: response.headers ? response.headers.get("X-Application-Error-Code") : null
});
},
alert: function (options) {
if ("string" == typeof options) {
return void require(["toast"], function (toast) {
2018-10-23 01:05:09 +03:00
toast({
text: options
});
2018-10-23 01:05:09 +03:00
});
}
require(["alert"], function (alert) {
alert({
title: options.title || Globalize.translate("HeaderAlert"),
text: options.message
}).then(options.callback || function () {});
});
},
restartServer: function () {
var apiClient = window.ApiClient;
if (apiClient) {
require(["serverRestartDialog", "events"], function (ServerRestartDialog, events) {
2018-10-23 01:05:09 +03:00
var dialog = new ServerRestartDialog({
apiClient: apiClient
});
events.on(dialog, "restarted", function () {
if (AppInfo.isNativeApp) {
apiClient.ensureWebSocket();
} else {
window.location.reload(true);
}
});
dialog.show();
});
2018-10-23 01:05:09 +03:00
}
},
capabilities: function (appHost) {
var capabilities = {
PlayableMediaTypes: ["Audio", "Video"],
SupportedCommands: ["MoveUp", "MoveDown", "MoveLeft", "MoveRight", "PageUp", "PageDown", "PreviousLetter", "NextLetter", "ToggleOsd", "ToggleContextMenu", "Select", "Back", "SendKey", "SendString", "GoHome", "GoToSettings", "VolumeUp", "VolumeDown", "Mute", "Unmute", "ToggleMute", "SetVolume", "SetAudioStreamIndex", "SetSubtitleStreamIndex", "DisplayContent", "GoToSearch", "DisplayMessage", "SetRepeatMode", "ChannelUp", "ChannelDown", "PlayMediaSource", "PlayTrailers"],
SupportsPersistentIdentifier: "cordova" === self.appMode || "android" === self.appMode,
SupportsMediaControl: true
};
appHost.getPushTokenInfo();
return capabilities = Object.assign(capabilities, appHost.getPushTokenInfo());
},
selectServer: function () {
if (window.NativeShell && typeof window.NativeShell.selectServer === "function") {
window.NativeShell.selectServer();
} else {
Dashboard.navigate("selectserver.html");
}
}
};
var AppInfo = {};
!function () {
2018-10-23 01:05:09 +03:00
"use strict";
function defineConnectionManager(connectionManager) {
window.ConnectionManager = connectionManager;
define("connectionManager", [], function () {
return connectionManager;
});
2018-10-23 01:05:09 +03:00
}
function bindConnectionManagerEvents(connectionManager, events, userSettings) {
window.Events = events;
connectionManager.currentApiClient = function () {
2018-10-23 01:05:09 +03:00
if (!localApiClient) {
var server = connectionManager.getLastUsedServer();
if (server) {
localApiClient = connectionManager.getApiClient(server.Id);
}
2018-10-23 01:05:09 +03:00
}
return localApiClient;
};
connectionManager.onLocalUserSignedIn = function (user) {
localApiClient = connectionManager.getApiClient(user.ServerId);
window.ApiClient = localApiClient;
return userSettings.setUserInfo(user.Id, localApiClient);
};
events.on(connectionManager, "localusersignedout", function () {
userSettings.setUserInfo(null, null);
});
2018-10-23 01:05:09 +03:00
}
function createConnectionManager() {
return require(["connectionManagerFactory", "apphost", "credentialprovider", "events", "userSettings"], function (ConnectionManager, apphost, credentialProvider, events, userSettings) {
var credentialProviderInstance = new credentialProvider();
var promises = [apphost.getSyncProfile(), apphost.init()];
2019-03-17 22:24:49 +01:00
return Promise.all(promises).then(function (responses) {
var deviceProfile = responses[0];
var capabilities = Dashboard.capabilities(apphost);
capabilities.DeviceProfile = deviceProfile;
2020-03-11 21:31:04 +01:00
var connectionManager = new ConnectionManager(credentialProviderInstance, apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId(), capabilities);
defineConnectionManager(connectionManager);
bindConnectionManagerEvents(connectionManager, events, userSettings);
if (!AppInfo.isNativeApp) {
2020-02-16 03:44:43 +01:00
console.debug("loading ApiClient singleton");
return require(["apiclient"], function (apiClientFactory) {
2020-02-16 03:44:43 +01:00
console.debug("creating ApiClient singleton");
2020-03-11 21:31:04 +01:00
var apiClient = new apiClientFactory(Dashboard.serverAddress(), apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId());
2019-03-17 22:24:49 +01:00
apiClient.enableAutomaticNetworking = false;
apiClient.manualAddressOnly = true;
connectionManager.addApiClient(apiClient);
window.ApiClient = apiClient;
localApiClient = apiClient;
2020-02-16 03:44:43 +01:00
console.debug("loaded ApiClient singleton");
});
}
return Promise.resolve();
2019-01-21 17:47:10 +09:00
});
});
2018-10-23 01:05:09 +03:00
}
function returnFirstDependency(obj) {
return obj;
2018-10-23 01:05:09 +03:00
}
function getBowerPath() {
2019-11-11 01:47:28 +09:00
return "libraries";
2018-10-23 01:05:09 +03:00
}
function getComponentsPath() {
return "components";
}
function getElementsPath() {
return "elements";
}
function getScriptsPath() {
return "scripts";
}
2018-10-23 01:05:09 +03:00
function getPlaybackManager(playbackManager) {
2019-03-04 20:38:39 +00:00
window.addEventListener("beforeunload", function () {
2018-10-23 01:05:09 +03:00
try {
2019-01-21 17:47:10 +09:00
playbackManager.onAppClose();
2018-10-23 01:05:09 +03:00
} catch (err) {
2020-02-16 03:44:43 +01:00
console.error("error in onAppClose: " + err);
2018-10-23 01:05:09 +03:00
}
2019-01-21 17:47:10 +09:00
});
return playbackManager;
2018-10-23 01:05:09 +03:00
}
function getLayoutManager(layoutManager, appHost) {
2019-01-21 17:47:10 +09:00
if (appHost.getDefaultLayout) {
layoutManager.defaultLayout = appHost.getDefaultLayout();
}
2019-01-21 17:47:10 +09:00
layoutManager.init();
return layoutManager;
2018-10-23 01:05:09 +03:00
}
function createSharedAppFooter(appFooter) {
2019-01-21 17:47:10 +09:00
return new appFooter({});
2018-10-23 01:05:09 +03:00
}
function onRequireJsError(requireType, requireModules) {
2020-02-16 03:44:43 +01:00
console.error("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(","));
2018-10-23 01:05:09 +03:00
}
function defineResizeObserver() {
if (self.ResizeObserver) {
define("ResizeObserver", [], function () {
return self.ResizeObserver;
});
} else {
2019-11-11 01:45:01 +09:00
define("ResizeObserver", ["resize-observer-polyfill"], returnFirstDependency);
}
2018-10-23 01:05:09 +03:00
}
function initRequireWithBrowser(browser) {
2019-01-16 02:47:29 +09:00
var bowerPath = getBowerPath();
var componentsPath = getComponentsPath();
var scriptsPath = getScriptsPath();
2019-01-16 02:47:29 +09:00
define("filesystem", [scriptsPath + "/filesystem"], returnFirstDependency);
if (window.IntersectionObserver && !browser.edge) {
define("lazyLoader", [componentsPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency);
} else {
define("lazyLoader", [componentsPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency);
}
define("shell", [componentsPath + "/shell"], returnFirstDependency);
define("apiclient", [bowerPath + "/apiclient/apiclient"], returnFirstDependency);
if ("registerElement" in document) {
define("registerElement", []);
} else if (browser.msie) {
2019-11-11 01:45:01 +09:00
define("registerElement", ["webcomponents"], returnFirstDependency);
} else {
2019-11-11 01:45:01 +09:00
define("registerElement", ["document-register-element"], returnFirstDependency);
}
2019-02-28 00:36:12 +00:00
define("imageFetcher", [componentsPath + "/images/imageFetcher"], returnFirstDependency);
2019-01-16 02:47:29 +09:00
2018-10-23 01:05:09 +03:00
var preferNativeAlerts = browser.tv;
define("alert", [componentsPath + "/alert"], returnFirstDependency);
2019-01-16 02:47:29 +09:00
defineResizeObserver();
define("dialog", [componentsPath + "/dialog/dialog"], returnFirstDependency);
define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency);
define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency);
define("loading", [componentsPath + "/loading/loading"], returnFirstDependency);
define("multi-download", [componentsPath + "/multidownload"], returnFirstDependency);
define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency);
define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency);
2020-03-23 16:49:00 +01:00
define("castSenderApiLoader", [componentsPath + "/castSenderApi"], returnFirstDependency);
define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency);
define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency);
define("localsync", [bowerPath + "/apiclient/sync/localsync"], returnFirstDependency);
}
2018-10-23 01:05:09 +03:00
function init() {
define("livetvcss", ["css!assets/css/livetv.css"], returnFirstDependency);
define("detailtablecss", ["css!assets/css/detailtable.css"], returnFirstDependency);
var promises = [];
2019-05-05 23:55:42 +02:00
if (!window.fetch) {
promises.push(require(["fetch"]));
}
Promise.all(promises).then(function () {
createConnectionManager().then(function () {
2020-02-16 03:44:43 +01:00
console.debug("initAfterDependencies promises resolved");
require(["globalize", "browser"], function (globalize, browser) {
window.Globalize = globalize;
loadCoreDictionary(globalize).then(function () {
onGlobalizeInit(browser);
});
});
require(["keyboardnavigation"], function(keyboardnavigation) {
keyboardnavigation.enable();
});
2020-02-28 13:51:41 +01:00
require(["mouseManager"]);
require(["focusPreventScroll"]);
2019-11-02 20:38:58 +03:00
require(["autoFocuser"], function(autoFocuser) {
autoFocuser.enable();
});
require(['globalize', 'connectionManager', 'events'], function (globalize, connectionManager, events) {
events.on(connectionManager, 'localusersignedin', globalize.updateCurrentCulture);
});
});
});
2018-10-23 01:05:09 +03:00
}
function loadCoreDictionary(globalize) {
var languages = ["ar", "be-by", "bg-bg", "ca", "cs", "da", "de", "el", "en-gb", "en-us", "es", "es-ar", "es-mx", "fa", "fi", "fr", "fr-ca", "gsw", "he", "hi-in", "hr", "hu", "id", "it", "kk", "ko", "lt-lt", "ms", "nb", "nl", "pl", "pt-br", "pt-pt", "ro", "ru", "sk", "sl-si", "sv", "tr", "uk", "vi", "zh-cn", "zh-hk", "zh-tw"];
2019-03-04 20:38:39 +00:00
var translations = languages.map(function (language) {
return {
2019-03-04 20:38:39 +00:00
lang: language,
path: "strings/" + language + ".json"
};
});
globalize.defaultModule("core");
return globalize.loadStrings({
2018-10-23 01:05:09 +03:00
name: "core",
translations: translations
});
2018-10-23 01:05:09 +03:00
}
function onGlobalizeInit(browser) {
if ("android" === self.appMode) {
if (-1 !== self.location.href.toString().toLowerCase().indexOf("start=backgroundsync")) {
return onAppReady(browser);
}
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
document.title = Globalize.translateDocument(document.title, "core");
if (browser.tv && !browser.android) {
2020-02-16 03:44:43 +01:00
console.debug("using system fonts with explicit sizes");
require(["systemFontsSizedCss"]);
} else {
2020-02-16 03:44:43 +01:00
console.debug("using default fonts");
require(["systemFontsCss"]);
}
require(["apphost", "css!assets/css/librarybrowser"], function (appHost) {
2019-05-21 22:28:48 +01:00
loadPlugins(appHost, browser).then(function () {
2019-01-21 17:47:10 +09:00
onAppReady(browser);
});
});
2018-10-23 01:05:09 +03:00
}
2019-05-21 22:28:48 +01:00
function loadPlugins(appHost, browser, shell) {
2020-02-16 03:44:43 +01:00
console.debug("loading installed plugins");
var list = [
2019-03-12 21:41:16 +00:00
"components/playback/playaccessvalidation",
"components/playback/experimentalwarnings",
"components/htmlaudioplayer/plugin",
"components/htmlvideoplayer/plugin",
"components/photoplayer/plugin",
2019-11-23 23:25:10 +03:00
"components/youtubeplayer/plugin",
"components/backdropscreensaver/plugin",
"components/logoscreensaver/plugin"
];
if (appHost.supports("remotecontrol")) {
list.push("components/sessionplayer");
if (browser.chrome || browser.opera) {
list.push("components/chromecast/chromecastplayer");
}
}
2019-05-21 22:28:48 +01:00
if (window.NativeShell) {
list = list.concat(window.NativeShell.getPlugins());
}
return new Promise(function (resolve, reject) {
Promise.all(list.map(loadPlugin)).then(function () {
require(["packageManager"], function (packageManager) {
packageManager.init().then(resolve, reject);
});
}, reject);
});
2018-10-23 01:05:09 +03:00
}
function loadPlugin(url) {
return new Promise(function (resolve, reject) {
require(["pluginManager"], function (pluginManager) {
pluginManager.loadPlugin(url).then(resolve, reject);
});
});
2018-10-23 01:05:09 +03:00
}
function onAppReady(browser) {
2020-02-16 03:44:43 +01:00
console.debug("begin onAppReady");
// ensure that appHost is loaded in this point
require(['apphost', 'appRouter'], function (appHost, appRouter) {
window.Emby = {};
console.debug("onAppReady: loading dependencies");
if (browser.iOS) {
require(['css!assets/css/ios.css']);
}
window.Emby.Page = appRouter;
require(['emby-button', 'scripts/themeloader', 'libraryMenu', 'scripts/routes'], function () {
Emby.Page.start({
click: false,
hashbang: true
});
require(["components/thememediaplayer", "scripts/autobackdrops"]);
if (!browser.tv && !browser.xboxOne && !browser.ps4) {
require(["components/nowplayingbar/nowplayingbar"]);
}
if (appHost.supports("remotecontrol")) {
require(["playerSelectionMenu", "components/playback/remotecontrolautoplay"]);
}
2020-04-26 19:54:55 +02:00
require(["libraries/screensavermanager"]);
2019-11-23 23:25:10 +03:00
if (!appHost.supports("physicalvolumecontrol") || browser.touch) {
require(["components/playback/volumeosd"]);
}
require(["mediaSession", "serverNotifications"]);
require(["date-fns", "date-fns/locale"]);
if (!browser.tv && !browser.xboxOne) {
require(["components/playback/playbackorientation"]);
registerServiceWorker();
if (window.Notification) {
require(["components/notifications/notifications"]);
}
}
require(["playerSelectionMenu"]);
2020-02-04 15:40:32 -05:00
var apiClient = window.ConnectionManager && window.ConnectionManager.currentApiClient();
if (apiClient) {
fetch(apiClient.getUrl("Branding/Css"))
.then(function(response) {
if (!response.ok) {
throw new Error(response.status + ' ' + response.statusText);
}
return response.text();
})
.then(function(css) {
// Inject the branding css as a dom element in body so it will take
// precedence over other stylesheets
var style = document.createElement('style');
style.appendChild(document.createTextNode(css));
document.body.appendChild(style);
})
.catch(function(err) {
console.warn('Error applying custom css', err);
});
}
});
});
2018-10-23 01:05:09 +03:00
}
function registerServiceWorker() {
/* eslint-disable compat/compat */
if (navigator.serviceWorker && self.appMode !== "cordova" && self.appMode !== "android") {
try {
navigator.serviceWorker.register("serviceworker.js");
} catch (err) {
2020-02-16 03:44:43 +01:00
console.error("error registering serviceWorker: " + err);
}
} else {
console.warn("serviceWorker unsupported");
2018-10-23 01:05:09 +03:00
}
/* eslint-enable compat/compat */
2018-10-23 01:05:09 +03:00
}
function onWebComponentsReady(browser) {
initRequireWithBrowser(browser);
if (self.appMode === 'cordova' || self.appMode === 'android' || self.appMode === 'standalone') {
AppInfo.isNativeApp = true;
}
init();
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
var localApiClient;
(function () {
var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate());
2019-01-21 17:47:10 +09:00
var bowerPath = getBowerPath();
var componentsPath = getComponentsPath();
var elementsPath = getElementsPath();
var scriptsPath = getScriptsPath();
2019-01-21 17:47:10 +09:00
var paths = {
2019-10-03 02:33:21 +09:00
browserdeviceprofile: "scripts/browserdeviceprofile",
browser: "scripts/browser",
libraryBrowser: "scripts/librarybrowser",
inputManager: "scripts/inputManager",
datetime: "scripts/datetime",
globalize: "scripts/globalize",
dfnshelper: "scripts/dfnshelper",
2019-10-03 02:33:21 +09:00
libraryMenu: "scripts/librarymenu",
2019-09-11 03:22:22 -07:00
playlisteditor: componentsPath + "/playlisteditor/playlisteditor",
medialibrarycreator: componentsPath + "/medialibrarycreator/medialibrarycreator",
medialibraryeditor: componentsPath + "/medialibraryeditor/medialibraryeditor",
imageoptionseditor: componentsPath + "/imageoptionseditor/imageoptionseditor",
apphost: componentsPath + "/apphost",
visibleinviewport: bowerPath + "/visibleinviewport",
qualityoptions: componentsPath + "/qualityoptions",
2019-04-02 00:01:33 +01:00
focusManager: componentsPath + "/focusManager",
itemHelper: componentsPath + "/itemhelper",
itemShortcuts: componentsPath + "/shortcuts",
playQueueManager: componentsPath + "/playback/playqueuemanager",
nowPlayingHelper: componentsPath + "/playback/nowplayinghelper",
2019-04-03 22:33:50 +01:00
pluginManager: componentsPath + "/pluginManager",
2019-11-23 23:25:10 +03:00
packageManager: componentsPath + "/packagemanager",
screensaverManager: componentsPath + "/screensavermanager"
2019-01-21 17:47:10 +09:00
};
2019-09-30 00:05:20 -04:00
requirejs.onError = onRequireJsError;
2019-09-30 00:05:20 -04:00
requirejs.config({
waitSeconds: 0,
map: {
"*": {
css: "components/require/requirecss",
text: "components/require/requiretext"
}
},
bundles: {
bundle: [
"document-register-element",
2019-11-11 01:45:01 +09:00
"fetch",
"flvjs",
"jstree",
"jQuery",
"hlsjs",
"howler",
2019-11-11 01:45:01 +09:00
"native-promise-only",
"resize-observer-polyfill",
"shaka",
"swiper",
2020-03-12 23:55:59 +09:00
"queryString",
"sortable",
"webcomponents",
"material-icons",
2020-03-02 01:15:49 +03:00
"jellyfin-noto",
"date-fns",
2020-03-13 09:43:30 +01:00
"page",
"polyfill",
"fast-text-encoding",
"intersection-observer",
"classlist-polyfill",
2020-04-24 18:03:55 +02:00
"screenfull",
"headroom"
]
2019-09-30 00:05:20 -04:00
},
urlArgs: urlArgs,
paths: paths,
onError: onRequireJsError
});
require(["fetch"]);
2020-03-13 09:43:30 +01:00
require(["polyfill"]);
require(["fast-text-encoding"]);
require(["intersection-observer"]);
2020-04-04 16:00:38 +02:00
require(["classlist-polyfill"]);
2020-03-13 09:43:30 +01:00
2019-09-30 00:05:20 -04:00
// Expose jQuery globally
require(["jQuery"], function(jQuery) {
window.$ = jQuery;
window.jQuery = jQuery;
});
require(["css!assets/css/site"]);
require(["jellyfin-noto"]);
2019-10-03 02:33:21 +09:00
// define styles
// TODO determine which of these files can be moved to the components themselves
define("systemFontsCss", ["css!assets/css/fonts"], returnFirstDependency);
define("systemFontsSizedCss", ["css!assets/css/fonts.sized"], returnFirstDependency);
define("scrollStyles", ["css!assets/css/scrollstyles"], returnFirstDependency);
define("dashboardcss", ["css!assets/css/dashboard"], returnFirstDependency);
2019-10-03 02:33:21 +09:00
define("programStyles", ["css!" + componentsPath + "/guide/programs"], returnFirstDependency);
define("listViewStyle", ["css!" + componentsPath + "/listview/listview"], returnFirstDependency);
define("formDialogStyle", ["css!" + componentsPath + "/formdialog"], returnFirstDependency);
define("clearButtonStyle", ["css!assets/css/clearbutton"], returnFirstDependency);
2019-10-03 02:33:21 +09:00
define("cardStyle", ["css!" + componentsPath + "/cardbuilder/card"], returnFirstDependency);
define("flexStyles", ["css!assets/css/flexstyles"], returnFirstDependency);
2019-10-03 02:33:21 +09:00
// define legacy features
// TODO delete the rest of these
define("fnchecked", ["legacy/fnchecked"], returnFirstDependency);
define("legacyDashboard", ["legacy/dashboard"], returnFirstDependency);
define("legacySelectMenu", ["legacy/selectmenu"], returnFirstDependency);
// there are several objects that need to be instantiated
// TODO find a better way to do this
define("appFooter", [componentsPath + "/appfooter/appfooter"], returnFirstDependency);
define("appFooter-shared", ["appFooter"], createSharedAppFooter);
// TODO pull apiclient out of this repository
define('events', [bowerPath + "/apiclient/events"], returnFirstDependency);
define('credentialprovider', [bowerPath + "/apiclient/credentialprovider"], returnFirstDependency);
define('connectionManagerFactory', [bowerPath + "/apiclient/connectionmanager"], returnFirstDependency);
define('appStorage', [bowerPath + "/apiclient/appStorage"], returnFirstDependency);
define("serversync", [bowerPath + "/apiclient/sync/serversync"], returnFirstDependency);
define("multiserversync", [bowerPath + "/apiclient/sync/multiserversync"], returnFirstDependency);
define("mediasync", [bowerPath + "/apiclient/sync/mediasync"], returnFirstDependency);
define("itemrepository", [bowerPath + "/apiclient/sync/itemrepository"], returnFirstDependency);
define("useractionrepository", [bowerPath + "/apiclient/sync/useractionrepository"], returnFirstDependency);
2019-11-11 01:59:23 +09:00
// TODO remove these libraries
2020-01-05 14:17:25 +09:00
// all of these have been modified so we need to fix that first
define("scroller", [bowerPath + "/scroller"], returnFirstDependency);
define("navdrawer", [bowerPath + "/navdrawer/navdrawer"], returnFirstDependency);
2019-10-03 02:33:21 +09:00
2019-12-11 23:54:56 +09:00
define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency);
define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency);
define("emby-checkbox", [elementsPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency);
define("emby-collapse", [elementsPath + "/emby-collapse/emby-collapse"], returnFirstDependency);
define("emby-input", [elementsPath + "/emby-input/emby-input"], returnFirstDependency);
define("emby-progressring", [elementsPath + "/emby-progressring/emby-progressring"], returnFirstDependency);
define("emby-radio", [elementsPath + "/emby-radio/emby-radio"], returnFirstDependency);
define("emby-select", [elementsPath + "/emby-select/emby-select"], returnFirstDependency);
define("emby-slider", [elementsPath + "/emby-slider/emby-slider"], returnFirstDependency);
define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency);
define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency);
2020-04-13 13:09:01 +02:00
define("emby-scroller", [elementsPath + "/emby-scroller/emby-scroller"], returnFirstDependency);
define("emby-tabs", [elementsPath + "/emby-tabs/emby-tabs"], returnFirstDependency);
define("emby-scrollbuttons", [elementsPath + "/emby-scrollbuttons/emby-scrollbuttons"], returnFirstDependency);
define("emby-itemrefreshindicator", [elementsPath + "/emby-itemrefreshindicator/emby-itemrefreshindicator"], returnFirstDependency);
define("emby-itemscontainer", [elementsPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency);
define("emby-playstatebutton", [elementsPath + "/emby-playstatebutton/emby-playstatebutton"], returnFirstDependency);
define("emby-ratingbutton", [elementsPath + "/emby-ratingbutton/emby-ratingbutton"], returnFirstDependency);
define("emby-progressbar", [elementsPath + "/emby-progressbar/emby-progressbar"], returnFirstDependency);
define("emby-programcell", [elementsPath + "/emby-programcell/emby-programcell"], returnFirstDependency);
2019-12-11 23:54:56 +09:00
2020-02-16 12:17:13 +09:00
define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency);
define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency);
2020-04-03 03:16:06 +09:00
define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency);
define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency);
define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency);
define("actionsheet", [componentsPath + "/actionsheet/actionsheet"], returnFirstDependency);
2019-09-11 03:22:22 -07:00
define("tunerPicker", [componentsPath + "/tunerpicker"], returnFirstDependency);
define("mainTabsManager", [componentsPath + "/maintabsmanager"], returnFirstDependency);
2019-02-28 00:36:12 +00:00
define("imageLoader", [componentsPath + "/images/imageLoader"], returnFirstDependency);
2019-09-11 03:22:22 -07:00
define("directorybrowser", [componentsPath + "/directorybrowser/directorybrowser"], returnFirstDependency);
define("metadataEditor", [componentsPath + "/metadataeditor/metadataeditor"], returnFirstDependency);
define("personEditor", [componentsPath + "/metadataeditor/personeditor"], returnFirstDependency);
define("playerSelectionMenu", [componentsPath + "/playback/playerSelectionMenu"], returnFirstDependency);
define("playerSettingsMenu", [componentsPath + "/playback/playersettingsmenu"], returnFirstDependency);
define("playMethodHelper", [componentsPath + "/playback/playmethodhelper"], returnFirstDependency);
define("brightnessOsd", [componentsPath + "/playback/brightnessosd"], returnFirstDependency);
define("alphaNumericShortcuts", [scriptsPath + "/alphanumericshortcuts"], returnFirstDependency);
define("multiSelect", [componentsPath + "/multiselect/multiselect"], returnFirstDependency);
define("alphaPicker", [componentsPath + "/alphapicker/alphapicker"], returnFirstDependency);
define("tabbedView", [componentsPath + "/tabbedview/tabbedview"], returnFirstDependency);
define("itemsTab", [componentsPath + "/tabbedview/itemstab"], returnFirstDependency);
define("collectionEditor", [componentsPath + "/collectioneditor/collectioneditor"], returnFirstDependency);
define("serverRestartDialog", [componentsPath + "/serverRestartDialog"], returnFirstDependency);
define("playlistEditor", [componentsPath + "/playlisteditor/playlisteditor"], returnFirstDependency);
define("recordingCreator", [componentsPath + "/recordingcreator/recordingcreator"], returnFirstDependency);
define("recordingEditor", [componentsPath + "/recordingcreator/recordingeditor"], returnFirstDependency);
define("seriesRecordingEditor", [componentsPath + "/recordingcreator/seriesrecordingeditor"], returnFirstDependency);
define("recordingFields", [componentsPath + "/recordingcreator/recordingfields"], returnFirstDependency);
define("recordingButton", [componentsPath + "/recordingcreator/recordingbutton"], returnFirstDependency);
define("recordingHelper", [componentsPath + "/recordingcreator/recordinghelper"], returnFirstDependency);
define("subtitleEditor", [componentsPath + "/subtitleeditor/subtitleeditor"], returnFirstDependency);
define("subtitleSync", [componentsPath + "/subtitlesync/subtitlesync"], returnFirstDependency);
define("itemIdentifier", [componentsPath + "/itemidentifier/itemidentifier"], returnFirstDependency);
define("itemMediaInfo", [componentsPath + "/itemMediaInfo/itemMediaInfo"], returnFirstDependency);
define("mediaInfo", [componentsPath + "/mediainfo/mediainfo"], returnFirstDependency);
define("itemContextMenu", [componentsPath + "/itemcontextmenu"], returnFirstDependency);
define("imageEditor", [componentsPath + "/imageeditor/imageeditor"], returnFirstDependency);
define("imageDownloader", [componentsPath + "/imagedownloader/imagedownloader"], returnFirstDependency);
define("dom", [scriptsPath + "/dom"], returnFirstDependency);
define("playerStats", [componentsPath + "/playerstats/playerstats"], returnFirstDependency);
define("searchFields", [componentsPath + "/search/searchfields"], returnFirstDependency);
define("searchResults", [componentsPath + "/search/searchresults"], returnFirstDependency);
define("upNextDialog", [componentsPath + "/upnextdialog/upnextdialog"], returnFirstDependency);
define("subtitleAppearanceHelper", [componentsPath + "/subtitlesettings/subtitleappearancehelper"], returnFirstDependency);
define("subtitleSettings", [componentsPath + "/subtitlesettings/subtitlesettings"], returnFirstDependency);
define("settingsHelper", [componentsPath + "/settingshelper"], returnFirstDependency);
define("displaySettings", [componentsPath + "/displaysettings/displaysettings"], returnFirstDependency);
define("playbackSettings", [componentsPath + "/playbacksettings/playbacksettings"], returnFirstDependency);
define("homescreenSettings", [componentsPath + "/homescreensettings/homescreensettings"], returnFirstDependency);
define("playbackManager", [componentsPath + "/playback/playbackmanager"], getPlaybackManager);
2019-04-03 22:33:50 +01:00
define("layoutManager", [componentsPath + "/layoutManager", "apphost"], getLayoutManager);
define("homeSections", [componentsPath + "/homesections/homesections"], returnFirstDependency);
define("playMenu", [componentsPath + "/playmenu"], returnFirstDependency);
define("refreshDialog", [componentsPath + "/refreshdialog/refreshdialog"], returnFirstDependency);
define("backdrop", [componentsPath + "/backdrop/backdrop"], returnFirstDependency);
define("fetchHelper", [componentsPath + "/fetchhelper"], returnFirstDependency);
2019-04-02 00:01:33 +01:00
define("cardBuilder", [componentsPath + "/cardbuilder/cardBuilder"], returnFirstDependency);
define("peoplecardbuilder", [componentsPath + "/cardbuilder/peoplecardbuilder"], returnFirstDependency);
define("chaptercardbuilder", [componentsPath + "/cardbuilder/chaptercardbuilder"], returnFirstDependency);
define("deleteHelper", [componentsPath + "/deletehelper"], returnFirstDependency);
define("tvguide", [componentsPath + "/guide/guide"], returnFirstDependency);
define("guide-settings-dialog", [componentsPath + "/guide/guide-settings"], returnFirstDependency);
define("loadingDialog", [componentsPath + "/loadingdialog/loadingdialog"], returnFirstDependency);
2019-02-27 23:26:11 +00:00
define("viewManager", [componentsPath + "/viewManager/viewManager"], function (viewManager) {
window.ViewManager = viewManager;
viewManager.dispatchPageEvents(true);
return viewManager;
2019-01-21 17:47:10 +09:00
});
define("slideshow", [componentsPath + "/slideshow/slideshow"], returnFirstDependency);
define("focusPreventScroll", ["legacy/focusPreventScroll"], returnFirstDependency);
define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency);
define("listView", [componentsPath + "/listview/listview"], returnFirstDependency);
define("indicators", [componentsPath + "/indicators/indicators"], returnFirstDependency);
define("viewSettings", [componentsPath + "/viewsettings/viewsettings"], returnFirstDependency);
define("filterMenu", [componentsPath + "/filtermenu/filtermenu"], returnFirstDependency);
define("sortMenu", [componentsPath + "/sortmenu/sortmenu"], returnFirstDependency);
define("idb", [componentsPath + "/idb"], returnFirstDependency);
define("sanitizefilename", [componentsPath + "/sanitizefilename"], returnFirstDependency);
define("toast", [componentsPath + "/toast/toast"], returnFirstDependency);
define("scrollHelper", [componentsPath + "/scrollhelper"], returnFirstDependency);
define("touchHelper", [componentsPath + "/touchhelper"], returnFirstDependency);
define("imageUploader", [componentsPath + "/imageuploader/imageuploader"], returnFirstDependency);
2019-02-28 00:50:03 +00:00
define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency);
2019-09-11 03:22:22 -07:00
define("viewContainer", [componentsPath + "/viewContainer"], returnFirstDependency);
define("dialogHelper", [componentsPath + "/dialogHelper/dialogHelper"], returnFirstDependency);
define("serverNotifications", [componentsPath + "/serverNotifications"], returnFirstDependency);
define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency);
define("keyboardnavigation", [scriptsPath + "/keyboardnavigation"], returnFirstDependency);
define("mouseManager", [scriptsPath + "/mouseManager"], returnFirstDependency);
define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency);
2019-11-02 20:38:58 +03:00
define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency);
define("connectionManager", [], function () {
return ConnectionManager;
2019-01-21 17:47:10 +09:00
});
define("apiClientResolver", [], function () {
return function () {
return window.ApiClient;
};
2019-01-21 17:47:10 +09:00
});
define("appRouter", [componentsPath + "/appRouter", "itemHelper"], function (appRouter, itemHelper) {
2018-10-23 01:05:09 +03:00
function showItem(item, serverId, options) {
if ("string" == typeof item) {
require(["connectionManager"], function (connectionManager) {
var apiClient = connectionManager.currentApiClient();
apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) {
appRouter.showItem(item, options);
});
});
} else {
if (2 == arguments.length) {
options = arguments[1];
}
appRouter.show("/" + appRouter.getRouteUrl(item, options), {
item: item
});
}
2018-10-23 01:05:09 +03:00
}
appRouter.showLocalLogin = function (serverId, manualLogin) {
Dashboard.navigate("login.html?serverid=" + serverId);
};
appRouter.showVideoOsd = function () {
return Dashboard.navigate("videoosd.html");
};
appRouter.showSelectServer = function () {
Dashboard.navigate(AppInfo.isNativeApp ? "selectserver.html" : "login.html");
};
appRouter.showWelcome = function () {
Dashboard.navigate(AppInfo.isNativeApp ? "selectserver.html" : "login.html");
};
appRouter.showSettings = function () {
Dashboard.navigate("mypreferencesmenu.html");
};
appRouter.showGuide = function () {
Dashboard.navigate("livetv.html?tab=1");
};
appRouter.goHome = function () {
Dashboard.navigate("home.html");
};
appRouter.showSearch = function () {
Dashboard.navigate("search.html");
};
appRouter.showLiveTV = function () {
Dashboard.navigate("livetv.html");
};
appRouter.showRecordedTV = function () {
Dashboard.navigate("livetv.html?tab=3");
};
appRouter.showFavorites = function () {
Dashboard.navigate("home.html?tab=1");
};
appRouter.showSettings = function () {
Dashboard.navigate("mypreferencesmenu.html");
};
appRouter.setTitle = function (title) {
LibraryMenu.setTitle(title);
};
appRouter.getRouteUrl = function (item, options) {
if (!item) {
throw new Error("item cannot be null");
}
if (item.url) {
return item.url;
}
var context = options ? options.context : null;
var id = item.Id || item.ItemId;
if (!options) {
options = {};
}
var url;
var itemType = item.Type || (options ? options.itemType : null);
var serverId = item.ServerId || options.serverId;
if ("settings" === item) {
return "mypreferencesmenu.html";
}
if ("wizard" === item) {
return "wizardstart.html";
}
if ("manageserver" === item) {
return "dashboard.html";
}
if ("recordedtv" === item) {
return "livetv.html?tab=3&serverId=" + options.serverId;
}
if ("nextup" === item) {
2019-03-29 15:09:51 -07:00
return "list.html?type=nextup&serverId=" + options.serverId;
}
2018-10-23 01:05:09 +03:00
if ("list" === item) {
2019-03-29 15:09:51 -07:00
var url = "list.html?serverId=" + options.serverId + "&type=" + options.itemTypes;
if (options.isFavorite) {
url += "&IsFavorite=true";
}
return url;
}
if ("livetv" === item) {
if ("programs" === options.section) {
return "livetv.html?tab=0&serverId=" + options.serverId;
2019-09-11 03:22:22 -07:00
}
if ("guide" === options.section) {
return "livetv.html?tab=1&serverId=" + options.serverId;
}
if ("movies" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsMovie=true&serverId=" + options.serverId;
}
if ("shows" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=" + options.serverId;
}
if ("sports" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsSports=true&serverId=" + options.serverId;
}
if ("kids" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsKids=true&serverId=" + options.serverId;
}
if ("news" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsNews=true&serverId=" + options.serverId;
}
if ("onnow" === options.section) {
2019-03-29 15:09:51 -07:00
return "list.html?type=Programs&IsAiring=true&serverId=" + options.serverId;
}
if ("dvrschedule" === options.section) {
return "livetv.html?tab=4&serverId=" + options.serverId;
}
if ("seriesrecording" === options.section) {
return "livetv.html?tab=5&serverId=" + options.serverId;
}
return "livetv.html?serverId=" + options.serverId;
}
if ("SeriesTimer" == itemType) {
return "itemdetails.html?seriesTimerId=" + id + "&serverId=" + serverId;
}
if ("livetv" == item.CollectionType) {
return "livetv.html";
}
if ("Genre" === item.Type) {
2019-03-29 15:09:51 -07:00
url = "list.html?genreId=" + item.Id + "&serverId=" + serverId;
if ("livetv" === context) {
url += "&type=Programs";
}
if (options.parentId) {
url += "&parentId=" + options.parentId;
}
return url;
}
if ("MusicGenre" === item.Type) {
2019-03-29 15:09:51 -07:00
url = "list.html?musicGenreId=" + item.Id + "&serverId=" + serverId;
if (options.parentId) {
url += "&parentId=" + options.parentId;
}
return url;
}
if ("Studio" === item.Type) {
2019-03-29 15:09:51 -07:00
url = "list.html?studioId=" + item.Id + "&serverId=" + serverId;
if (options.parentId) {
url += "&parentId=" + options.parentId;
}
return url;
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
if ("folders" !== context && !itemHelper.isLocalItem(item)) {
if ("movies" == item.CollectionType) {
url = "movies.html?topParentId=" + item.Id;
if (options && "latest" === options.section) {
url += "&tab=1";
}
return url;
}
if ("tvshows" == item.CollectionType) {
url = "tv.html?topParentId=" + item.Id;
if (options && "latest" === options.section) {
url += "&tab=2";
}
return url;
}
if ("music" == item.CollectionType) {
return "music.html?topParentId=" + item.Id;
}
}
var itemTypes = ["Playlist", "TvChannel", "Program", "BoxSet", "MusicAlbum", "MusicGenre", "Person", "Recording", "MusicArtist"];
if (itemTypes.indexOf(itemType) >= 0) {
return "itemdetails.html?id=" + id + "&serverId=" + serverId;
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
var contextSuffix = context ? "&context=" + context : "";
2019-01-21 17:47:10 +09:00
if ("Series" == itemType || "Season" == itemType || "Episode" == itemType) {
return "itemdetails.html?id=" + id + contextSuffix + "&serverId=" + serverId;
}
if (item.IsFolder) {
if (id) {
2019-03-29 15:09:51 -07:00
return "list.html?parentId=" + id + "&serverId=" + serverId;
}
return "#";
}
return "itemdetails.html?id=" + id + "&serverId=" + serverId;
};
appRouter.showItem = showItem;
return appRouter;
});
})();
return require(["browser"], onWebComponentsReady);
}();
pageClassOn("viewshow", "standalonePage", function () {
2019-01-21 17:47:10 +09:00
document.querySelector(".skinHeader").classList.add("noHeaderRight");
});
pageClassOn("viewhide", "standalonePage", function () {
2019-01-21 17:47:10 +09:00
document.querySelector(".skinHeader").classList.remove("noHeaderRight");
2018-12-11 00:46:50 -05:00
});