mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-17 19:08:18 -07:00
Merge branch 'master' into artworks2
This commit is contained in:
commit
5af72d6c9f
1
.eslintignore
Normal file
1
.eslintignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
libraries/
|
@ -2,3 +2,26 @@ env:
|
|||||||
es6: true
|
es6: true
|
||||||
browser: true
|
browser: true
|
||||||
amd: true
|
amd: true
|
||||||
|
|
||||||
|
rules:
|
||||||
|
block-spacing: ["error"]
|
||||||
|
brace-style: ["error"]
|
||||||
|
comma-dangle: ["error", "never"]
|
||||||
|
comma-spacing: ["error"]
|
||||||
|
eol-last: ["off"]
|
||||||
|
indent: ["error", 4, { "SwitchCase": 1 }]
|
||||||
|
keyword-spacing: ["error"]
|
||||||
|
line-comment-position: ["off"]
|
||||||
|
max-statements-per-line: ["error"]
|
||||||
|
no-empty: ["error"]
|
||||||
|
no-extra-semi: ["error"]
|
||||||
|
no-floating-decimal: ["error"]
|
||||||
|
no-multi-spaces: ["error"]
|
||||||
|
no-multiple-empty-lines: ["error", { "max": 1 }]
|
||||||
|
no-trailing-spaces: ["error"]
|
||||||
|
no-void: ["off"]
|
||||||
|
one-var: ["error", "never"]
|
||||||
|
padding-line-between-statements: ["off"]
|
||||||
|
semi: ["off"]
|
||||||
|
space-before-blocks: ["error"]
|
||||||
|
yoda: ["off"]
|
||||||
|
1
.github/stale.yml
vendored
1
.github/stale.yml
vendored
@ -8,6 +8,7 @@ exemptLabels:
|
|||||||
- future
|
- future
|
||||||
- feature
|
- feature
|
||||||
- enhancement
|
- enhancement
|
||||||
|
- confirmed
|
||||||
# Label to use when marking an issue as stale
|
# Label to use when marking an issue as stale
|
||||||
staleLabel: stale
|
staleLabel: stale
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
- [Nickbert7](https://github.com/Nickbert7)
|
- [Nickbert7](https://github.com/Nickbert7)
|
||||||
- [ferferga](https://github.com/ferferga)
|
- [ferferga](https://github.com/ferferga)
|
||||||
- [bilde2910](https://github.com/bilde2910)
|
- [bilde2910](https://github.com/bilde2910)
|
||||||
|
- [Daniel Hartung](https://github.com/dhartung)
|
||||||
|
- [Ryan Hartzell](https://github.com/ryan-hartzell)
|
||||||
|
|
||||||
# Emby Contributors
|
# Emby Contributors
|
||||||
|
|
||||||
|
10
package.json
10
package.json
@ -5,6 +5,7 @@
|
|||||||
"repository": "https://github.com/jellyfin/jellyfin-web",
|
"repository": "https://github.com/jellyfin/jellyfin-web",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"clean-webpack-plugin": "^3.0.0",
|
||||||
"copy-webpack-plugin": "^5.0.3",
|
"copy-webpack-plugin": "^5.0.3",
|
||||||
"css-loader": "^2.1.0",
|
"css-loader": "^2.1.0",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^5.16.0",
|
||||||
@ -16,15 +17,22 @@
|
|||||||
"webpack-merge": "^4.2.2"
|
"webpack-merge": "^4.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"alameda": "^1.3.0",
|
||||||
|
"document-register-element": "^0.5.4",
|
||||||
"flv.js": "^1.5.0",
|
"flv.js": "^1.5.0",
|
||||||
"hls.js": "^0.12.4",
|
"hls.js": "^0.12.4",
|
||||||
"howler": "^2.1.2",
|
"howler": "^2.1.2",
|
||||||
"jquery": "^3.4.1",
|
"jquery": "^3.4.1",
|
||||||
"jstree": "^3.3.7",
|
"jstree": "^3.3.7",
|
||||||
"libjass": "^0.11.0",
|
"libjass": "^0.11.0",
|
||||||
|
"native-promise-only": "^0.8.0-a",
|
||||||
|
"requirejs": "^2.3.5",
|
||||||
|
"resize-observer-polyfill": "^1.5.1",
|
||||||
"shaka-player": "^2.5.5",
|
"shaka-player": "^2.5.5",
|
||||||
"sortablejs": "^1.9.0",
|
"sortablejs": "^1.9.0",
|
||||||
"swiper": "^3.4.2"
|
"swiper": "^3.4.2",
|
||||||
|
"webcomponents.js-2": "^0.7.24",
|
||||||
|
"whatwg-fetch": "^1.1.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "webpack-dev-server --config webpack.dev.js --open",
|
"serve": "webpack-dev-server --config webpack.dev.js --open",
|
||||||
|
419
src/bower_components/alameda/alameda.js
vendored
419
src/bower_components/alameda/alameda.js
vendored
@ -1,419 +0,0 @@
|
|||||||
var requirejs, require, define;
|
|
||||||
! function(global, Promise, undef) {
|
|
||||||
function commentReplace(match, singlePrefix) {
|
|
||||||
return singlePrefix || ""
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasProp(obj, prop) {
|
|
||||||
return hasOwn.call(obj, prop)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getOwn(obj, prop) {
|
|
||||||
return obj && hasProp(obj, prop) && obj[prop]
|
|
||||||
}
|
|
||||||
|
|
||||||
function obj() {
|
|
||||||
return Object.create(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
function eachProp(obj, func) {
|
|
||||||
var prop;
|
|
||||||
for (prop in obj)
|
|
||||||
if (hasProp(obj, prop) && func(obj[prop], prop)) break
|
|
||||||
}
|
|
||||||
|
|
||||||
function mixin(target, source, force, deepStringMixin) {
|
|
||||||
return source && eachProp(source, function(value, prop) {
|
|
||||||
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || Array.isArray(value) || "function" == typeof value || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
|
|
||||||
}), target
|
|
||||||
}
|
|
||||||
|
|
||||||
function getGlobal(value) {
|
|
||||||
if (!value) return value;
|
|
||||||
var g = global;
|
|
||||||
return value.split(".").forEach(function(part) {
|
|
||||||
g = g[part]
|
|
||||||
}), g
|
|
||||||
}
|
|
||||||
|
|
||||||
function newContext(contextName) {
|
|
||||||
function trimDots(ary) {
|
|
||||||
var i, part, length = ary.length;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
|
|
||||||
else if (".." === part) {
|
|
||||||
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
|
|
||||||
i > 0 && (ary.splice(i - 1, 2), i -= 2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalize(name, baseName, applyMap) {
|
|
||||||
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, baseParts = baseName && baseName.split("/"),
|
|
||||||
normalizedBaseParts = baseParts,
|
|
||||||
map = config.map,
|
|
||||||
starMap = map && map["*"];
|
|
||||||
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
|
|
||||||
nameParts = name.split("/");
|
|
||||||
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
|
|
||||||
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
|
|
||||||
for (j = baseParts.length; j > 0; j -= 1)
|
|
||||||
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
|
|
||||||
foundMap = mapValue, foundI = i;
|
|
||||||
break outerLoop
|
|
||||||
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
|
|
||||||
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
|
|
||||||
}
|
|
||||||
return getOwn(config.pkgs, name) || name
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeShimExports(value) {
|
|
||||||
function fn() {
|
|
||||||
var ret;
|
|
||||||
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
|
|
||||||
}
|
|
||||||
return fn
|
|
||||||
}
|
|
||||||
|
|
||||||
function takeQueue(anonId) {
|
|
||||||
var i, id, args, shim;
|
|
||||||
for (i = 0; i < queue.length; i += 1) {
|
|
||||||
if ("string" != typeof queue[i][0]) {
|
|
||||||
if (!anonId) break;
|
|
||||||
queue[i].unshift(anonId), anonId = undef
|
|
||||||
}
|
|
||||||
args = queue.shift(), id = args[0], i -= 1, id in defined || id in waiting || (id in deferreds ? main.apply(undef, args) : waiting[id] = args)
|
|
||||||
}
|
|
||||||
anonId && (shim = getOwn(config.shim, anonId) || {}, main(anonId, shim.deps || [], shim.exportsFn))
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeRequire(relName, topLevel) {
|
|
||||||
var req = function(deps, callback, errback, alt) {
|
|
||||||
var name, cfg;
|
|
||||||
if (topLevel && takeQueue(), "string" == typeof deps) {
|
|
||||||
if (handlers[deps]) return handlers[deps](relName);
|
|
||||||
if (!((name = makeMap(deps, relName, !0).id) in defined)) throw new Error("Not loaded: " + name);
|
|
||||||
return defined[name]
|
|
||||||
}
|
|
||||||
return deps && !Array.isArray(deps) && (cfg = deps, deps = undef, Array.isArray(callback) && (deps = callback, callback = errback, errback = alt), topLevel) ? req.config(cfg)(deps, callback, errback) : (callback = callback || function() {
|
|
||||||
return slice.call(arguments, 0)
|
|
||||||
}, asyncResolve.then(function() {
|
|
||||||
return takeQueue(), main(undef, deps || [], callback, errback, relName)
|
|
||||||
}))
|
|
||||||
};
|
|
||||||
return req.isBrowser = "undefined" != typeof document && "undefined" != typeof navigator, req.nameToUrl = function(moduleName, ext, skipExt) {
|
|
||||||
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
|
|
||||||
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return req.nameToUrl(bundleId, ext, skipExt);
|
|
||||||
if (urlRegExp.test(moduleName)) url = moduleName + (ext || "");
|
|
||||||
else {
|
|
||||||
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
|
|
||||||
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
|
|
||||||
Array.isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
|
|
||||||
break
|
|
||||||
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
|
|
||||||
}
|
|
||||||
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
|
|
||||||
}, req.toUrl = function(moduleNamePlusExt) {
|
|
||||||
var ext, index = moduleNamePlusExt.lastIndexOf("."),
|
|
||||||
segment = moduleNamePlusExt.split("/")[0],
|
|
||||||
isRelative = "." === segment || ".." === segment;
|
|
||||||
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), req.nameToUrl(normalize(moduleNamePlusExt, relName), ext, !0)
|
|
||||||
}, req.defined = function(id) {
|
|
||||||
return makeMap(id, relName, !0).id in defined
|
|
||||||
}, req.specified = function(id) {
|
|
||||||
return (id = makeMap(id, relName, !0).id) in defined || id in deferreds
|
|
||||||
}, req
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(name, d, value) {
|
|
||||||
name && (defined[name] = value, requirejs.onResourceLoad && requirejs.onResourceLoad(context, d.map, d.deps)), d.finished = !0, d.resolve(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
function reject(d, err) {
|
|
||||||
d.finished = !0, d.rejected = !0, d.reject(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeNormalize(relName) {
|
|
||||||
return function(name) {
|
|
||||||
return normalize(name, relName, !0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function defineModule(d) {
|
|
||||||
d.factoryCalled = !0;
|
|
||||||
var ret, name = d.map.id;
|
|
||||||
try {
|
|
||||||
ret = context.execCb(name, d.factory, d.values, defined[name])
|
|
||||||
} catch (err) {
|
|
||||||
return reject(d, err)
|
|
||||||
}
|
|
||||||
name ? ret === undef && (d.cjsModule ? ret = d.cjsModule.exports : d.usingExports && (ret = defined[name])) : requireDeferreds.splice(requireDeferreds.indexOf(d), 1), resolve(name, d, ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
function depFinished(val, i) {
|
|
||||||
this.rejected || this.depDefined[i] || (this.depDefined[i] = !0, this.depCount += 1, this.values[i] = val, this.depending || this.depCount !== this.depMax || defineModule(this))
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeDefer(name, calculatedMap) {
|
|
||||||
var d = {};
|
|
||||||
return d.promise = new Promise(function(resolve, reject) {
|
|
||||||
d.resolve = resolve, d.reject = function(err) {
|
|
||||||
name || requireDeferreds.splice(requireDeferreds.indexOf(d), 1), reject(err)
|
|
||||||
}
|
|
||||||
}), d.map = name ? calculatedMap || makeMap(name) : {}, d.depCount = 0, d.depMax = 0, d.values = [], d.depDefined = [], d.depFinished = depFinished, d.map.pr && (d.deps = [makeMap(d.map.pr)]), d
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDefer(name, calculatedMap) {
|
|
||||||
var d;
|
|
||||||
return name ? (d = name in deferreds && deferreds[name]) || (d = deferreds[name] = makeDefer(name, calculatedMap)) : (d = makeDefer(), requireDeferreds.push(d)), d
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeErrback(d, name) {
|
|
||||||
return function(err) {
|
|
||||||
d.rejected || (err.dynaId || (err.dynaId = "id" + (errCount += 1), err.requireModules = [name]), reject(d, err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function waitForDep(depMap, relName, d, i) {
|
|
||||||
d.depMax += 1, callDep(depMap, relName).then(function(val) {
|
|
||||||
d.depFinished(val, i)
|
|
||||||
}, makeErrback(d, depMap.id)).catch(makeErrback(d, d.map.id))
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeLoad(id) {
|
|
||||||
function load(value) {
|
|
||||||
fromTextCalled || resolve(id, getDefer(id), value)
|
|
||||||
}
|
|
||||||
var fromTextCalled;
|
|
||||||
return load.error = function(err) {
|
|
||||||
reject(getDefer(id), err)
|
|
||||||
}, load.fromText = function(text, textAlt) {
|
|
||||||
var execError, d = getDefer(id),
|
|
||||||
map = makeMap(makeMap(id).n),
|
|
||||||
plainId = map.id;
|
|
||||||
fromTextCalled = !0, d.factory = function(p, val) {
|
|
||||||
return val
|
|
||||||
}, textAlt && (text = textAlt), hasProp(config.config, id) && (config.config[plainId] = config.config[id]);
|
|
||||||
try {
|
|
||||||
req.exec(text)
|
|
||||||
} catch (e) {
|
|
||||||
execError = new Error("fromText eval for " + plainId + " failed: " + e), execError.requireType = "fromtexteval", reject(d, execError)
|
|
||||||
}
|
|
||||||
takeQueue(plainId), d.deps = [map], waitForDep(map, null, d, d.deps.length)
|
|
||||||
}, load
|
|
||||||
}
|
|
||||||
|
|
||||||
function callPlugin(plugin, map, relName) {
|
|
||||||
plugin.load(map.n, makeRequire(relName), makeLoad(map.id), config)
|
|
||||||
}
|
|
||||||
|
|
||||||
function splitPrefix(name) {
|
|
||||||
var prefix, index = name ? name.indexOf("!") : -1;
|
|
||||||
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
|
|
||||||
}
|
|
||||||
|
|
||||||
function breakCycle(d, traced, processed) {
|
|
||||||
var id = d.map.id;
|
|
||||||
traced[id] = !0, !d.finished && d.deps && d.deps.forEach(function(depMap) {
|
|
||||||
var depId = depMap.id,
|
|
||||||
dep = !hasProp(handlers, depId) && getDefer(depId, depMap);
|
|
||||||
!dep || dep.finished || processed[depId] || (hasProp(traced, depId) ? d.deps.forEach(function(depMap, i) {
|
|
||||||
depMap.id === depId && d.depFinished(defined[depId], i)
|
|
||||||
}) : breakCycle(dep, traced, processed))
|
|
||||||
}), processed[id] = !0
|
|
||||||
}
|
|
||||||
|
|
||||||
function check(d) {
|
|
||||||
var err, mid, dfd, notFinished = [],
|
|
||||||
waitInterval = 1e3 * config.waitSeconds,
|
|
||||||
expired = waitInterval && startTime + waitInterval < (new Date).getTime();
|
|
||||||
if (0 === loadCount && (d ? d.finished || breakCycle(d, {}, {}) : requireDeferreds.length && requireDeferreds.forEach(function(d) {
|
|
||||||
breakCycle(d, {}, {})
|
|
||||||
})), expired) {
|
|
||||||
for (mid in deferreds) dfd = deferreds[mid], dfd.finished || notFinished.push(dfd.map.id);
|
|
||||||
err = new Error("Timeout for modules: " + notFinished), err.requireModules = notFinished, err.requireType = "timeout", notFinished.forEach(function(id) {
|
|
||||||
reject(getDefer(id), err)
|
|
||||||
})
|
|
||||||
} else(loadCount || requireDeferreds.length) && (checkingLater || (checkingLater = !0, setTimeout(function() {
|
|
||||||
checkingLater = !1, check()
|
|
||||||
}, 70)))
|
|
||||||
}
|
|
||||||
|
|
||||||
function delayedError(e) {
|
|
||||||
console.log(e.stack);
|
|
||||||
return setTimeout(function() {
|
|
||||||
e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e))
|
|
||||||
}), e
|
|
||||||
}
|
|
||||||
var req, main, makeMap, callDep, handlers, checkingLater, load, context, defined = obj(),
|
|
||||||
waiting = obj(),
|
|
||||||
config = {
|
|
||||||
waitSeconds: 7,
|
|
||||||
baseUrl: "./",
|
|
||||||
paths: {},
|
|
||||||
bundles: {},
|
|
||||||
pkgs: {},
|
|
||||||
shim: {},
|
|
||||||
config: {}
|
|
||||||
},
|
|
||||||
mapCache = obj(),
|
|
||||||
requireDeferreds = [],
|
|
||||||
deferreds = obj(),
|
|
||||||
calledDefine = obj(),
|
|
||||||
calledPlugin = obj(),
|
|
||||||
loadCount = 0,
|
|
||||||
startTime = (new Date).getTime(),
|
|
||||||
errCount = 0,
|
|
||||||
trackedErrors = obj(),
|
|
||||||
urlFetched = obj(),
|
|
||||||
bundlesMap = obj(),
|
|
||||||
asyncResolve = Promise.resolve(undefined);
|
|
||||||
return load = "function" == typeof importScripts ? function(map) {
|
|
||||||
var url = map.url;
|
|
||||||
urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id))
|
|
||||||
} : function(map) {
|
|
||||||
var script, id = map.id,
|
|
||||||
url = map.url;
|
|
||||||
urlFetched[url] || (urlFetched[url] = !0, script = document.createElement("script"), script.setAttribute("data-requiremodule", id), script.type = config.scriptType || "text/javascript", script.charset = "utf-8", script.async = !0, loadCount += 1, script.addEventListener("load", function() {
|
|
||||||
loadCount -= 1, takeQueue(id)
|
|
||||||
}, !1), script.addEventListener("error", function() {
|
|
||||||
loadCount -= 1;
|
|
||||||
var err, pathConfig = getOwn(config.paths, id);
|
|
||||||
if (pathConfig && Array.isArray(pathConfig) && pathConfig.length > 1) {
|
|
||||||
script.parentNode.removeChild(script), pathConfig.shift();
|
|
||||||
var d = getDefer(id);
|
|
||||||
d.map = makeMap(id), d.map.url = req.nameToUrl(id), load(d.map)
|
|
||||||
} else err = new Error("Load failed: " + id + ": " + script.src), err.requireModules = [id], err.requireType = "scripterror", reject(getDefer(id), err)
|
|
||||||
}, !1), script.src = url, 10 === document.documentMode ? asap.then(function() {
|
|
||||||
document.head.appendChild(script)
|
|
||||||
}) : document.head.appendChild(script))
|
|
||||||
}, callDep = function(map, relName) {
|
|
||||||
var args, bundleId, name = map.id,
|
|
||||||
shim = config.shim[name];
|
|
||||||
if (name in waiting) args = waiting[name], delete waiting[name], main.apply(undef, args);
|
|
||||||
else if (!(name in deferreds))
|
|
||||||
if (map.pr) {
|
|
||||||
if (!(bundleId = getOwn(bundlesMap, name))) return callDep(makeMap(map.pr)).then(function(plugin) {
|
|
||||||
var newMap = map.prn ? map : makeMap(name, relName, !0),
|
|
||||||
newId = newMap.id,
|
|
||||||
shim = getOwn(config.shim, newId);
|
|
||||||
return newId in calledPlugin || (calledPlugin[newId] = !0, shim && shim.deps ? req(shim.deps, function() {
|
|
||||||
callPlugin(plugin, newMap, relName)
|
|
||||||
}) : callPlugin(plugin, newMap, relName)), getDefer(newId).promise
|
|
||||||
});
|
|
||||||
map.url = req.nameToUrl(bundleId), load(map)
|
|
||||||
} else shim && shim.deps ? req(shim.deps, function() {
|
|
||||||
load(map)
|
|
||||||
}) : load(map);
|
|
||||||
return getDefer(name).promise
|
|
||||||
}, makeMap = function(name, relName, applyMap) {
|
|
||||||
if ("string" != typeof name) return name;
|
|
||||||
var plugin, url, parts, prefix, result, prefixNormalized, cacheKey = name + " & " + (relName || "") + " & " + !!applyMap;
|
|
||||||
return parts = splitPrefix(name), prefix = parts[0], name = parts[1], !prefix && cacheKey in mapCache ? mapCache[cacheKey] : (prefix && (prefix = normalize(prefix, relName, applyMap), plugin = prefix in defined && defined[prefix]), prefix ? plugin && plugin.normalize ? (name = plugin.normalize(name, makeNormalize(relName)), prefixNormalized = !0) : name = -1 === name.indexOf("!") ? normalize(name, relName, applyMap) : name : (name = normalize(name, relName, applyMap), parts = splitPrefix(name), prefix = parts[0], name = parts[1], url = req.nameToUrl(name)), result = {
|
|
||||||
id: prefix ? prefix + "!" + name : name,
|
|
||||||
n: name,
|
|
||||||
pr: prefix,
|
|
||||||
url: url,
|
|
||||||
prn: prefix && prefixNormalized
|
|
||||||
}, prefix || (mapCache[cacheKey] = result), result)
|
|
||||||
}, handlers = {
|
|
||||||
require: function(name) {
|
|
||||||
return makeRequire(name)
|
|
||||||
},
|
|
||||||
exports: function(name) {
|
|
||||||
var e = defined[name];
|
|
||||||
return void 0 !== e ? e : defined[name] = {}
|
|
||||||
},
|
|
||||||
module: function(name) {
|
|
||||||
return {
|
|
||||||
id: name,
|
|
||||||
uri: "",
|
|
||||||
exports: handlers.exports(name),
|
|
||||||
config: function() {
|
|
||||||
return getOwn(config.config, name) || {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, main = function(name, deps, factory, errback, relName) {
|
|
||||||
if (name) {
|
|
||||||
if (name in calledDefine) return;
|
|
||||||
calledDefine[name] = !0
|
|
||||||
}
|
|
||||||
var d = getDefer(name);
|
|
||||||
return deps && !Array.isArray(deps) && (factory = deps, deps = []), deps = deps ? slice.call(deps, 0) : null, errback || (hasProp(config, "defaultErrback") ? config.defaultErrback && (errback = config.defaultErrback) : errback = delayedError), errback && d.promise.catch(errback), relName = relName || name, "function" == typeof factory ? (!deps.length && factory.length && (factory.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
|
|
||||||
deps.push(dep)
|
|
||||||
}), deps = (1 === factory.length ? ["require"] : ["require", "exports", "module"]).concat(deps)), d.factory = factory, d.deps = deps, d.depending = !0, deps.forEach(function(depName, i) {
|
|
||||||
var depMap;
|
|
||||||
deps[i] = depMap = makeMap(depName, relName, !0), depName = depMap.id, "require" === depName ? d.values[i] = handlers.require(name) : "exports" === depName ? (d.values[i] = handlers.exports(name), d.usingExports = !0) : "module" === depName ? d.values[i] = d.cjsModule = handlers.module(name) : void 0 === depName ? d.values[i] = void 0 : waitForDep(depMap, relName, d, i)
|
|
||||||
}), d.depending = !1, d.depCount === d.depMax && defineModule(d)) : name && resolve(name, d, factory), startTime = (new Date).getTime(), name || check(d), d.promise
|
|
||||||
}, req = makeRequire(null, !0), req.config = function(cfg) {
|
|
||||||
if (cfg.context && cfg.context !== contextName) {
|
|
||||||
var existingContext = getOwn(contexts, cfg.context);
|
|
||||||
return existingContext ? existingContext.req.config(cfg) : newContext(cfg.context).config(cfg)
|
|
||||||
}
|
|
||||||
if (mapCache = obj(), cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
|
|
||||||
var urlArgs = cfg.urlArgs;
|
|
||||||
cfg.urlArgs = function(id, url) {
|
|
||||||
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var shim = config.shim,
|
|
||||||
objs = {
|
|
||||||
paths: !0,
|
|
||||||
bundles: !0,
|
|
||||||
config: !0,
|
|
||||||
map: !0
|
|
||||||
};
|
|
||||||
return eachProp(cfg, function(value, prop) {
|
|
||||||
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
|
|
||||||
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
|
|
||||||
value.forEach(function(v) {
|
|
||||||
v !== prop && (bundlesMap[v] = prop)
|
|
||||||
})
|
|
||||||
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
|
|
||||||
Array.isArray(value) && (value = {
|
|
||||||
deps: value
|
|
||||||
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = makeShimExports(value)), shim[id] = value
|
|
||||||
}), config.shim = shim), cfg.packages && cfg.packages.forEach(function(pkgObj) {
|
|
||||||
var location, name;
|
|
||||||
pkgObj = "string" == typeof pkgObj ? {
|
|
||||||
name: pkgObj
|
|
||||||
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
|
|
||||||
}), (cfg.deps || cfg.callback) && req(cfg.deps, cfg.callback), req
|
|
||||||
}, req.onError = function(err) {
|
|
||||||
throw err
|
|
||||||
}, context = {
|
|
||||||
id: contextName,
|
|
||||||
defined: defined,
|
|
||||||
waiting: waiting,
|
|
||||||
config: config,
|
|
||||||
deferreds: deferreds,
|
|
||||||
req: req,
|
|
||||||
execCb: function(name, callback, args, exports) {
|
|
||||||
return callback.apply(exports, args)
|
|
||||||
}
|
|
||||||
}, contexts[contextName] = context, req
|
|
||||||
}
|
|
||||||
if (!Promise) throw new Error("No Promise implementation available");
|
|
||||||
var topReq, dataMain, src, subPath, bootstrapConfig = requirejs || require,
|
|
||||||
hasOwn = Object.prototype.hasOwnProperty,
|
|
||||||
contexts = {},
|
|
||||||
queue = [],
|
|
||||||
currDirRegExp = /^\.\//,
|
|
||||||
urlRegExp = /^\/|\:|\?|\.js$/,
|
|
||||||
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
|
|
||||||
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
|
||||||
jsSuffixRegExp = /\.js$/,
|
|
||||||
slice = Array.prototype.slice;
|
|
||||||
if ("function" != typeof requirejs) {
|
|
||||||
var asap = Promise.resolve(void 0);
|
|
||||||
requirejs = topReq = newContext("_"), "function" != typeof require && (require = topReq), topReq.exec = function(text) {
|
|
||||||
return eval(text)
|
|
||||||
}, topReq.contexts = contexts, define = function() {
|
|
||||||
queue.push(slice.call(arguments, 0))
|
|
||||||
}, define.amd = {
|
|
||||||
jQuery: !0
|
|
||||||
}, bootstrapConfig && topReq.config(bootstrapConfig), topReq.isBrowser && !contexts._.config.skipDataMain && (dataMain = document.querySelectorAll("script[data-main]")[0], (dataMain = dataMain && dataMain.getAttribute("data-main")) && (dataMain = dataMain.replace(jsSuffixRegExp, ""), bootstrapConfig && bootstrapConfig.baseUrl || -1 !== dataMain.indexOf("!") || (src = dataMain.split("/"), dataMain = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", topReq.config({
|
|
||||||
baseUrl: subPath
|
|
||||||
})), topReq([dataMain])))
|
|
||||||
}
|
|
||||||
}(this, "undefined" != typeof Promise ? Promise : void 0);
|
|
747
src/bower_components/apiclient/connectionmanager.js
vendored
747
src/bower_components/apiclient/connectionmanager.js
vendored
@ -1,747 +0,0 @@
|
|||||||
define(["events", "apiclient", "appStorage"], function(events, apiClientFactory, appStorage) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function getServerAddress(server, mode) {
|
|
||||||
switch (mode) {
|
|
||||||
case ConnectionMode.Local:
|
|
||||||
return server.LocalAddress;
|
|
||||||
case ConnectionMode.Manual:
|
|
||||||
return server.ManualAddress;
|
|
||||||
case ConnectionMode.Remote:
|
|
||||||
return server.RemoteAddress;
|
|
||||||
default:
|
|
||||||
return server.ManualAddress || server.LocalAddress || server.RemoteAddress
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function paramsToString(params) {
|
|
||||||
var values = [];
|
|
||||||
for (var key in params) {
|
|
||||||
var value = params[key];
|
|
||||||
null !== value && void 0 !== value && "" !== value && values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value))
|
|
||||||
}
|
|
||||||
return values.join("&")
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolveFailure(instance, resolve) {
|
|
||||||
resolve({
|
|
||||||
State: "Unavailable",
|
|
||||||
ConnectUser: instance.connectUser()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function mergeServers(credentialProvider, list1, list2) {
|
|
||||||
for (var i = 0, length = list2.length; i < length; i++) credentialProvider.addOrUpdateServer(list1, list2[i]);
|
|
||||||
return list1
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateServerInfo(server, systemInfo) {
|
|
||||||
server.Name = systemInfo.ServerName, systemInfo.Id && (server.Id = systemInfo.Id), systemInfo.LocalAddress && (server.LocalAddress = systemInfo.LocalAddress)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getEmbyServerUrl(baseUrl, handler) {
|
|
||||||
return baseUrl + "/" + handler
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFetchPromise(request) {
|
|
||||||
var headers = request.headers || {};
|
|
||||||
"json" === request.dataType && (headers.accept = "application/json");
|
|
||||||
var fetchRequest = {
|
|
||||||
headers: headers,
|
|
||||||
method: request.type,
|
|
||||||
credentials: "same-origin"
|
|
||||||
},
|
|
||||||
contentType = request.contentType;
|
|
||||||
return request.data && ("string" == typeof request.data ? fetchRequest.body = request.data : (fetchRequest.body = paramsToString(request.data), contentType = contentType || "application/x-www-form-urlencoded; charset=UTF-8")), contentType && (headers["Content-Type"] = contentType), request.timeout ? fetchWithTimeout(request.url, fetchRequest, request.timeout) : fetch(request.url, fetchRequest)
|
|
||||||
}
|
|
||||||
|
|
||||||
function fetchWithTimeout(url, options, timeoutMs) {
|
|
||||||
return console.log("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url), new Promise(function(resolve, reject) {
|
|
||||||
var timeout = setTimeout(reject, timeoutMs);
|
|
||||||
options = options || {}, options.credentials = "same-origin", fetch(url, options).then(function(response) {
|
|
||||||
clearTimeout(timeout), console.log("fetchWithTimeout: succeeded connecting to url: " + url), resolve(response)
|
|
||||||
}, function(error) {
|
|
||||||
clearTimeout(timeout), console.log("fetchWithTimeout: timed out connecting to url: " + url), reject()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function ajax(request) {
|
|
||||||
if (!request) throw new Error("Request cannot be null");
|
|
||||||
return request.headers = request.headers || {}, console.log("ConnectionManager requesting url: " + request.url), getFetchPromise(request).then(function(response) {
|
|
||||||
return console.log("ConnectionManager response status: " + response.status + ", url: " + request.url), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : response : Promise.reject(response)
|
|
||||||
}, function(err) {
|
|
||||||
throw console.log("ConnectionManager request failed to url: " + request.url), err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConnectUrl(handler) {
|
|
||||||
return "https://connect.emby.media/service/" + handler
|
|
||||||
}
|
|
||||||
|
|
||||||
function replaceAll(originalString, strReplace, strWith) {
|
|
||||||
var reg = new RegExp(strReplace, "ig");
|
|
||||||
return originalString.replace(reg, strWith)
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeAddress(address) {
|
|
||||||
return address = address.trim(), 0 !== address.toLowerCase().indexOf("http") && (address = "http://" + address), address = replaceAll(address, "Http:", "http:"), address = replaceAll(address, "Https:", "https:")
|
|
||||||
}
|
|
||||||
|
|
||||||
function stringEqualsIgnoreCase(str1, str2) {
|
|
||||||
return (str1 || "").toLowerCase() === (str2 || "").toLowerCase()
|
|
||||||
}
|
|
||||||
|
|
||||||
function compareVersions(a, b) {
|
|
||||||
a = a.split("."), b = b.split(".");
|
|
||||||
for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) {
|
|
||||||
var aVal = parseInt(a[i] || "0"),
|
|
||||||
bVal = parseInt(b[i] || "0");
|
|
||||||
if (aVal < bVal) return -1;
|
|
||||||
if (aVal > bVal) return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
var defaultTimeout = 2e4,
|
|
||||||
ConnectionMode = {
|
|
||||||
Local: 0,
|
|
||||||
Remote: 1,
|
|
||||||
Manual: 2
|
|
||||||
},
|
|
||||||
ConnectionManager = function(credentialProvider, appName, appVersion, deviceName, deviceId, capabilities, devicePixelRatio) {
|
|
||||||
function onConnectUserSignIn(user) {
|
|
||||||
connectUser = user, events.trigger(self, "connectusersignedin", [user])
|
|
||||||
}
|
|
||||||
|
|
||||||
function onAuthenticated(apiClient, result, options, saveCredentials) {
|
|
||||||
var credentials = credentialProvider.credentials(),
|
|
||||||
servers = credentials.Servers.filter(function(s) {
|
|
||||||
return s.Id === result.ServerId
|
|
||||||
}),
|
|
||||||
server = servers.length ? servers[0] : apiClient.serverInfo();
|
|
||||||
return !1 !== options.updateDateLastAccessed && (server.DateLastAccessed = (new Date).getTime()), server.Id = result.ServerId, saveCredentials ? (server.UserId = result.User.Id, server.AccessToken = result.AccessToken) : (server.UserId = null, server.AccessToken = null), credentialProvider.addOrUpdateServer(credentials.Servers, server), credentialProvider.credentials(credentials), apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, apiClient.serverInfo(server), afterConnected(apiClient, options), onLocalUserSignIn(server, apiClient.serverAddress(), result.User)
|
|
||||||
}
|
|
||||||
|
|
||||||
function afterConnected(apiClient, options) {
|
|
||||||
options = options || {}, !1 !== options.reportCapabilities && apiClient.reportCapabilities(capabilities), apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, !1 !== options.enableWebSocket && (console.log("calling apiClient.ensureWebSocket"), apiClient.ensureWebSocket())
|
|
||||||
}
|
|
||||||
|
|
||||||
function onLocalUserSignIn(server, serverUrl, user) {
|
|
||||||
return self._getOrAddApiClient(server, serverUrl), (self.onLocalUserSignedIn ? self.onLocalUserSignedIn.call(self, user) : Promise.resolve()).then(function() {
|
|
||||||
events.trigger(self, "localusersignedin", [user])
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureConnectUser(credentials) {
|
|
||||||
return connectUser && connectUser.Id === credentials.ConnectUserId ? Promise.resolve() : credentials.ConnectUserId && credentials.ConnectAccessToken ? (connectUser = null, getConnectUser(credentials.ConnectUserId, credentials.ConnectAccessToken).then(function(user) {
|
|
||||||
return onConnectUserSignIn(user), Promise.resolve()
|
|
||||||
}, function() {
|
|
||||||
return Promise.resolve()
|
|
||||||
})) : Promise.resolve()
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConnectUser(userId, accessToken) {
|
|
||||||
if (!userId) throw new Error("null userId");
|
|
||||||
if (!accessToken) throw new Error("null accessToken");
|
|
||||||
return ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: "https://connect.emby.media/service/user?id=" + userId,
|
|
||||||
dataType: "json",
|
|
||||||
headers: {
|
|
||||||
"X-Application": appName + "/" + appVersion,
|
|
||||||
"X-Connect-UserToken": accessToken
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function addAuthenticationInfoFromConnect(server, serverUrl, credentials) {
|
|
||||||
if (!server.ExchangeToken) throw new Error("server.ExchangeToken cannot be null");
|
|
||||||
if (!credentials.ConnectUserId) throw new Error("credentials.ConnectUserId cannot be null");
|
|
||||||
var url = getEmbyServerUrl(serverUrl, "Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId),
|
|
||||||
auth = 'MediaBrowser Client="' + appName + '", Device="' + deviceName + '", DeviceId="' + deviceId + '", Version="' + appVersion + '"';
|
|
||||||
return ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: url,
|
|
||||||
dataType: "json",
|
|
||||||
headers: {
|
|
||||||
"X-MediaBrowser-Token": server.ExchangeToken,
|
|
||||||
"X-Emby-Authorization": auth
|
|
||||||
}
|
|
||||||
}).then(function(auth) {
|
|
||||||
return server.UserId = auth.LocalUserId, server.AccessToken = auth.AccessToken, auth
|
|
||||||
}, function() {
|
|
||||||
return server.UserId = null, server.AccessToken = null, Promise.reject()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function validateAuthentication(server, serverUrl) {
|
|
||||||
return ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: getEmbyServerUrl(serverUrl, "System/Info"),
|
|
||||||
dataType: "json",
|
|
||||||
headers: {
|
|
||||||
"X-MediaBrowser-Token": server.AccessToken
|
|
||||||
}
|
|
||||||
}).then(function(systemInfo) {
|
|
||||||
return updateServerInfo(server, systemInfo), Promise.resolve()
|
|
||||||
}, function() {
|
|
||||||
return server.UserId = null, server.AccessToken = null, Promise.resolve()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function getImageUrl(localUser) {
|
|
||||||
if (connectUser && connectUser.ImageUrl) return {
|
|
||||||
url: connectUser.ImageUrl
|
|
||||||
};
|
|
||||||
if (localUser && localUser.PrimaryImageTag) {
|
|
||||||
return {
|
|
||||||
url: self.getApiClient(localUser).getUserImageUrl(localUser.Id, {
|
|
||||||
tag: localUser.PrimaryImageTag,
|
|
||||||
type: "Primary"
|
|
||||||
}),
|
|
||||||
supportsParams: !0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
url: null,
|
|
||||||
supportsParams: !1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function logoutOfServer(apiClient) {
|
|
||||||
var serverInfo = apiClient.serverInfo() || {},
|
|
||||||
logoutInfo = {
|
|
||||||
serverId: serverInfo.Id
|
|
||||||
};
|
|
||||||
return apiClient.logout().then(function() {
|
|
||||||
events.trigger(self, "localusersignedout", [logoutInfo])
|
|
||||||
}, function() {
|
|
||||||
events.trigger(self, "localusersignedout", [logoutInfo])
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConnectServers(credentials) {
|
|
||||||
return console.log("Begin getConnectServers"), credentials.ConnectAccessToken && credentials.ConnectUserId ? ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: "https://connect.emby.media/service/servers?userId=" + credentials.ConnectUserId,
|
|
||||||
dataType: "json",
|
|
||||||
headers: {
|
|
||||||
"X-Application": appName + "/" + appVersion,
|
|
||||||
"X-Connect-UserToken": credentials.ConnectAccessToken
|
|
||||||
}
|
|
||||||
}).then(function(servers) {
|
|
||||||
return servers.map(function(i) {
|
|
||||||
return {
|
|
||||||
ExchangeToken: i.AccessKey,
|
|
||||||
ConnectServerId: i.Id,
|
|
||||||
Id: i.SystemId,
|
|
||||||
Name: i.Name,
|
|
||||||
RemoteAddress: i.Url,
|
|
||||||
LocalAddress: i.LocalAddress,
|
|
||||||
UserLinkType: "guest" === (i.UserType || "").toLowerCase() ? "Guest" : "LinkedUser"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, function() {
|
|
||||||
return credentials.Servers.slice(0).filter(function(s) {
|
|
||||||
return s.ExchangeToken
|
|
||||||
})
|
|
||||||
}) : Promise.resolve([])
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterServers(servers, connectServers) {
|
|
||||||
return servers.filter(function(server) {
|
|
||||||
return !server.ExchangeToken || connectServers.filter(function(connectServer) {
|
|
||||||
return server.Id === connectServer.Id
|
|
||||||
}).length > 0
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function findServers() {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
var onFinish = function(foundServers) {
|
|
||||||
var servers = foundServers.map(function(foundServer) {
|
|
||||||
var info = {
|
|
||||||
Id: foundServer.Id,
|
|
||||||
LocalAddress: convertEndpointAddressToManualAddress(foundServer) || foundServer.Address,
|
|
||||||
Name: foundServer.Name
|
|
||||||
};
|
|
||||||
return info.LastConnectionMode = info.ManualAddress ? ConnectionMode.Manual : ConnectionMode.Local, info
|
|
||||||
});
|
|
||||||
resolve(servers)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (window.NativeShell && typeof window.NativeShell.findServers === 'function') {
|
|
||||||
window.NativeShell.findServers(1e3).then(onFinish, function() {
|
|
||||||
onFinish([])
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
resolve([]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function convertEndpointAddressToManualAddress(info) {
|
|
||||||
if (info.Address && info.EndpointAddress) {
|
|
||||||
var address = info.EndpointAddress.split(":")[0],
|
|
||||||
parts = info.Address.split(":");
|
|
||||||
if (parts.length > 1) {
|
|
||||||
var portString = parts[parts.length - 1];
|
|
||||||
isNaN(parseInt(portString)) || (address += ":" + portString)
|
|
||||||
}
|
|
||||||
return normalizeAddress(address)
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTryConnectPromise(url, connectionMode, state, resolve, reject) {
|
|
||||||
console.log("getTryConnectPromise " + url), ajax({
|
|
||||||
url: getEmbyServerUrl(url, "system/info/public"),
|
|
||||||
timeout: defaultTimeout,
|
|
||||||
type: "GET",
|
|
||||||
dataType: "json"
|
|
||||||
}).then(function(result) {
|
|
||||||
state.resolved || (state.resolved = !0, console.log("Reconnect succeeded to " + url), resolve({
|
|
||||||
url: url,
|
|
||||||
connectionMode: connectionMode,
|
|
||||||
data: result
|
|
||||||
}))
|
|
||||||
}, function() {
|
|
||||||
state.resolved || (console.log("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function tryReconnect(serverInfo) {
|
|
||||||
var addresses = [],
|
|
||||||
addressesStrings = [];
|
|
||||||
return !serverInfo.manualAddressOnly && serverInfo.LocalAddress && -1 === addressesStrings.indexOf(serverInfo.LocalAddress) && (addresses.push({
|
|
||||||
url: serverInfo.LocalAddress,
|
|
||||||
mode: ConnectionMode.Local,
|
|
||||||
timeout: 0
|
|
||||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.ManualAddress && -1 === addressesStrings.indexOf(serverInfo.ManualAddress) && (addresses.push({
|
|
||||||
url: serverInfo.ManualAddress,
|
|
||||||
mode: ConnectionMode.Manual,
|
|
||||||
timeout: 100
|
|
||||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), !serverInfo.manualAddressOnly && serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress) && (addresses.push({
|
|
||||||
url: serverInfo.RemoteAddress,
|
|
||||||
mode: ConnectionMode.Remote,
|
|
||||||
timeout: 200
|
|
||||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), console.log("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) {
|
|
||||||
var state = {};
|
|
||||||
state.numAddresses = addresses.length, state.rejects = 0, addresses.map(function(url) {
|
|
||||||
setTimeout(function() {
|
|
||||||
state.resolved || getTryConnectPromise(url.url, url.mode, state, resolve, reject)
|
|
||||||
}, url.timeout)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function onSuccessfulConnection(server, systemInfo, connectionMode, serverUrl, options, resolve) {
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
options = options || {}, credentials.ConnectAccessToken && !1 !== options.enableAutoLogin ? ensureConnectUser(credentials).then(function() {
|
|
||||||
server.ExchangeToken ? addAuthenticationInfoFromConnect(server, serverUrl, credentials).then(function() {
|
|
||||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
|
||||||
}, function() {
|
|
||||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
|
||||||
}) : afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
|
||||||
}) : afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
|
||||||
}
|
|
||||||
|
|
||||||
function afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, verifyLocalAuthentication, options, resolve) {
|
|
||||||
if (options = options || {}, !1 === options.enableAutoLogin) server.UserId = null, server.AccessToken = null;
|
|
||||||
else if (verifyLocalAuthentication && server.AccessToken && !1 !== options.enableAutoLogin) return void validateAuthentication(server, serverUrl).then(function() {
|
|
||||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !1, options, resolve)
|
|
||||||
});
|
|
||||||
updateServerInfo(server, systemInfo), server.LastConnectionMode = connectionMode, !1 !== options.updateDateLastAccessed && (server.DateLastAccessed = (new Date).getTime()), credentialProvider.addOrUpdateServer(credentials.Servers, server), credentialProvider.credentials(credentials);
|
|
||||||
var result = {
|
|
||||||
Servers: []
|
|
||||||
};
|
|
||||||
result.ApiClient = self._getOrAddApiClient(server, serverUrl), result.ApiClient.setSystemInfo(systemInfo), result.State = server.AccessToken && !1 !== options.enableAutoLogin ? "SignedIn" : "ServerSignIn", result.Servers.push(server), result.ApiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, result.ApiClient.updateServerInfo(server, serverUrl);
|
|
||||||
var resolveActions = function() {
|
|
||||||
resolve(result), events.trigger(self, "connected", [result])
|
|
||||||
};
|
|
||||||
"SignedIn" === result.State ? (afterConnected(result.ApiClient, options), result.ApiClient.getCurrentUser().then(function(user) {
|
|
||||||
onLocalUserSignIn(server, serverUrl, user).then(resolveActions, resolveActions)
|
|
||||||
}, resolveActions)) : resolveActions()
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCacheKey(feature, apiClient, options) {
|
|
||||||
options = options || {};
|
|
||||||
var viewOnly = options.viewOnly,
|
|
||||||
cacheKey = "regInfo-" + apiClient.serverId();
|
|
||||||
return viewOnly && (cacheKey += "-viewonly"), cacheKey
|
|
||||||
}
|
|
||||||
|
|
||||||
function addAppInfoToConnectRequest(request) {
|
|
||||||
request.headers = request.headers || {}, request.headers["X-Application"] = appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
function exchangePin(pinInfo) {
|
|
||||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
|
||||||
var request = {
|
|
||||||
type: "POST",
|
|
||||||
url: getConnectUrl("pin/authenticate"),
|
|
||||||
data: {
|
|
||||||
deviceId: pinInfo.DeviceId,
|
|
||||||
pin: pinInfo.Pin
|
|
||||||
},
|
|
||||||
dataType: "json"
|
|
||||||
};
|
|
||||||
return addAppInfoToConnectRequest(request), ajax(request)
|
|
||||||
}
|
|
||||||
console.log("Begin ConnectionManager constructor");
|
|
||||||
var self = this;
|
|
||||||
this._apiClients = [];
|
|
||||||
var connectUser;
|
|
||||||
self.connectUser = function() {
|
|
||||||
return connectUser
|
|
||||||
}, self._minServerVersion = "3.2.33", self.appVersion = function() {
|
|
||||||
return appVersion
|
|
||||||
}, self.appName = function() {
|
|
||||||
return appName
|
|
||||||
}, self.capabilities = function() {
|
|
||||||
return capabilities
|
|
||||||
}, self.deviceId = function() {
|
|
||||||
return deviceId
|
|
||||||
}, self.credentialProvider = function() {
|
|
||||||
return credentialProvider
|
|
||||||
}, self.connectUserId = function() {
|
|
||||||
return credentialProvider.credentials().ConnectUserId
|
|
||||||
}, self.connectToken = function() {
|
|
||||||
return credentialProvider.credentials().ConnectAccessToken
|
|
||||||
}, self.getServerInfo = function(id) {
|
|
||||||
return credentialProvider.credentials().Servers.filter(function(s) {
|
|
||||||
return s.Id === id
|
|
||||||
})[0]
|
|
||||||
}, self.getLastUsedServer = function() {
|
|
||||||
var servers = credentialProvider.credentials().Servers;
|
|
||||||
return servers.sort(function(a, b) {
|
|
||||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
|
||||||
}), servers.length ? servers[0] : null
|
|
||||||
}, self.addApiClient = function(apiClient) {
|
|
||||||
self._apiClients.push(apiClient);
|
|
||||||
var existingServers = credentialProvider.credentials().Servers.filter(function(s) {
|
|
||||||
return stringEqualsIgnoreCase(s.ManualAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.LocalAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.RemoteAddress, apiClient.serverAddress())
|
|
||||||
}),
|
|
||||||
existingServer = existingServers.length ? existingServers[0] : apiClient.serverInfo();
|
|
||||||
if (existingServer.DateLastAccessed = (new Date).getTime(), existingServer.LastConnectionMode = ConnectionMode.Manual, existingServer.ManualAddress = apiClient.serverAddress(), apiClient.manualAddressOnly && (existingServer.manualAddressOnly = !0), apiClient.serverInfo(existingServer), apiClient.onAuthenticated = function(instance, result) {
|
|
||||||
return onAuthenticated(instance, result, {}, !0)
|
|
||||||
}, !existingServers.length) {
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
credentials.Servers = [existingServer], credentialProvider.credentials(credentials)
|
|
||||||
}
|
|
||||||
events.trigger(self, "apiclientcreated", [apiClient])
|
|
||||||
}, self.clearData = function() {
|
|
||||||
console.log("connection manager clearing data"), connectUser = null;
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
credentials.ConnectAccessToken = null, credentials.ConnectUserId = null, credentials.Servers = [], credentialProvider.credentials(credentials)
|
|
||||||
}, self._getOrAddApiClient = function(server, serverUrl) {
|
|
||||||
var apiClient = self.getApiClient(server.Id);
|
|
||||||
return apiClient || (apiClient = new apiClientFactory(serverUrl, appName, appVersion, deviceName, deviceId, devicePixelRatio), self._apiClients.push(apiClient), apiClient.serverInfo(server), apiClient.onAuthenticated = function(instance, result) {
|
|
||||||
return onAuthenticated(instance, result, {}, !0)
|
|
||||||
}, events.trigger(self, "apiclientcreated", [apiClient])), console.log("returning instance from getOrAddApiClient"), apiClient
|
|
||||||
}, self.getOrCreateApiClient = function(serverId) {
|
|
||||||
var credentials = credentialProvider.credentials(),
|
|
||||||
servers = credentials.Servers.filter(function(s) {
|
|
||||||
return stringEqualsIgnoreCase(s.Id, serverId)
|
|
||||||
});
|
|
||||||
if (!servers.length) throw new Error("Server not found: " + serverId);
|
|
||||||
var server = servers[0];
|
|
||||||
return self._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode))
|
|
||||||
}, self.user = function(apiClient) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
function onLocalUserDone(e) {
|
|
||||||
var image = getImageUrl(localUser);
|
|
||||||
resolve({
|
|
||||||
localUser: localUser,
|
|
||||||
name: connectUser ? connectUser.Name : localUser ? localUser.Name : null,
|
|
||||||
imageUrl: image.url,
|
|
||||||
supportsImageParams: image.supportsParams,
|
|
||||||
connectUser: connectUser
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function onEnsureConnectUserDone() {
|
|
||||||
apiClient && apiClient.getCurrentUserId() ? apiClient.getCurrentUser().then(function(u) {
|
|
||||||
localUser = u, onLocalUserDone()
|
|
||||||
}, onLocalUserDone) : onLocalUserDone()
|
|
||||||
}
|
|
||||||
var localUser, credentials = credentialProvider.credentials();
|
|
||||||
!credentials.ConnectUserId || !credentials.ConnectAccessToken || apiClient && apiClient.getCurrentUserId() ? onEnsureConnectUserDone() : ensureConnectUser(credentials).then(onEnsureConnectUserDone, onEnsureConnectUserDone)
|
|
||||||
})
|
|
||||||
}, self.logout = function() {
|
|
||||||
console.log("begin connectionManager loguot");
|
|
||||||
for (var promises = [], i = 0, length = self._apiClients.length; i < length; i++) {
|
|
||||||
var apiClient = self._apiClients[i];
|
|
||||||
apiClient.accessToken() && promises.push(logoutOfServer(apiClient))
|
|
||||||
}
|
|
||||||
return Promise.all(promises).then(function() {
|
|
||||||
for (var credentials = credentialProvider.credentials(), servers = credentials.Servers.filter(function(u) {
|
|
||||||
return "Guest" !== u.UserLinkType
|
|
||||||
}), j = 0, numServers = servers.length; j < numServers; j++) {
|
|
||||||
var server = servers[j];
|
|
||||||
server.UserId = null, server.AccessToken = null, server.ExchangeToken = null
|
|
||||||
}
|
|
||||||
credentials.Servers = servers, credentials.ConnectAccessToken = null, credentials.ConnectUserId = null, credentialProvider.credentials(credentials), connectUser && (connectUser = null, events.trigger(self, "connectusersignedout"))
|
|
||||||
})
|
|
||||||
}, self.getSavedServers = function() {
|
|
||||||
var credentials = credentialProvider.credentials(),
|
|
||||||
servers = credentials.Servers.slice(0);
|
|
||||||
return servers.sort(function(a, b) {
|
|
||||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
|
||||||
}), servers
|
|
||||||
}, self.getAvailableServers = function() {
|
|
||||||
console.log("Begin getAvailableServers");
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
return Promise.all([getConnectServers(credentials), findServers()]).then(function(responses) {
|
|
||||||
var connectServers = responses[0],
|
|
||||||
foundServers = responses[1],
|
|
||||||
servers = credentials.Servers.slice(0);
|
|
||||||
return mergeServers(credentialProvider, servers, foundServers), mergeServers(credentialProvider, servers, connectServers), servers = filterServers(servers, connectServers), servers.sort(function(a, b) {
|
|
||||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
|
||||||
}), credentials.Servers = servers, credentialProvider.credentials(credentials), servers
|
|
||||||
})
|
|
||||||
}, self.connectToServers = function(servers, options) {
|
|
||||||
console.log("Begin connectToServers, with " + servers.length + " servers");
|
|
||||||
var firstServer = servers.length ? servers[0] : null;
|
|
||||||
return firstServer ? self.connectToServer(firstServer, options).then(function(result) {
|
|
||||||
return "Unavailable" === result.State && (result.State = "ServerSelection"), console.log("resolving connectToServers with result.State: " + result.State), result
|
|
||||||
}) : Promise.resolve({
|
|
||||||
Servers: servers,
|
|
||||||
State: servers.length || self.connectUser() ? "ServerSelection" : "ConnectSignIn",
|
|
||||||
ConnectUser: self.connectUser()
|
|
||||||
})
|
|
||||||
}, self.connectToServer = function(server, options) {
|
|
||||||
return console.log("begin connectToServer"), new Promise(function(resolve, reject) {
|
|
||||||
options = options || {}, tryReconnect(server).then(function(result) {
|
|
||||||
var serverUrl = result.url,
|
|
||||||
connectionMode = result.connectionMode;
|
|
||||||
result = result.data, 1 === compareVersions(self.minServerVersion(), result.Version) ? (console.log("minServerVersion requirement not met. Server version: " + result.Version), resolve({
|
|
||||||
State: "ServerUpdateNeeded",
|
|
||||||
Servers: [server]
|
|
||||||
})) : server.Id && result.Id !== server.Id ? (console.log("http request succeeded, but found a different server Id than what was expected"), resolveFailure(self, resolve)) : onSuccessfulConnection(server, result, connectionMode, serverUrl, options, resolve)
|
|
||||||
}, function() {
|
|
||||||
resolveFailure(self, resolve)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}, self.connectToAddress = function(address, options) {
|
|
||||||
function onFail() {
|
|
||||||
return console.log("connectToAddress " + address + " failed"), Promise.resolve({
|
|
||||||
State: "Unavailable",
|
|
||||||
ConnectUser: instance.connectUser()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if (!address) return Promise.reject();
|
|
||||||
address = normalizeAddress(address);
|
|
||||||
var instance = this,
|
|
||||||
server = {
|
|
||||||
ManualAddress: address,
|
|
||||||
LastConnectionMode: ConnectionMode.Manual
|
|
||||||
};
|
|
||||||
return self.connectToServer(server, options).catch(onFail)
|
|
||||||
}, self.loginToConnect = function(username, password) {
|
|
||||||
return username && password ? ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: "https://connect.emby.media/service/user/authenticate",
|
|
||||||
data: {
|
|
||||||
nameOrEmail: username,
|
|
||||||
rawpw: password
|
|
||||||
},
|
|
||||||
dataType: "json",
|
|
||||||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
|
||||||
headers: {
|
|
||||||
"X-Application": appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
}).then(function(result) {
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
return credentials.ConnectAccessToken = result.AccessToken, credentials.ConnectUserId = result.User.Id, credentialProvider.credentials(credentials), onConnectUserSignIn(result.User), result
|
|
||||||
}) : Promise.reject()
|
|
||||||
}, self.signupForConnect = function(options) {
|
|
||||||
var email = options.email,
|
|
||||||
username = options.username,
|
|
||||||
password = options.password,
|
|
||||||
passwordConfirm = options.passwordConfirm;
|
|
||||||
if (!email) return Promise.reject({
|
|
||||||
errorCode: "invalidinput"
|
|
||||||
});
|
|
||||||
if (!username) return Promise.reject({
|
|
||||||
errorCode: "invalidinput"
|
|
||||||
});
|
|
||||||
if (!password) return Promise.reject({
|
|
||||||
errorCode: "invalidinput"
|
|
||||||
});
|
|
||||||
if (!passwordConfirm) return Promise.reject({
|
|
||||||
errorCode: "passwordmatch"
|
|
||||||
});
|
|
||||||
if (password !== passwordConfirm) return Promise.reject({
|
|
||||||
errorCode: "passwordmatch"
|
|
||||||
});
|
|
||||||
var data = {
|
|
||||||
email: email,
|
|
||||||
userName: username,
|
|
||||||
rawpw: password
|
|
||||||
};
|
|
||||||
return options.grecaptcha && (data.grecaptcha = options.grecaptcha), ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: "https://connect.emby.media/service/register",
|
|
||||||
data: data,
|
|
||||||
dataType: "json",
|
|
||||||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
|
||||||
headers: {
|
|
||||||
"X-Application": appName + "/" + appVersion,
|
|
||||||
"X-CONNECT-TOKEN": "CONNECT-REGISTER"
|
|
||||||
}
|
|
||||||
}).catch(function(response) {
|
|
||||||
try {
|
|
||||||
return response.json()
|
|
||||||
} catch (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}).then(function(result) {
|
|
||||||
if (result && result.Status) return "SUCCESS" === result.Status ? Promise.resolve(result) : Promise.reject({
|
|
||||||
errorCode: result.Status
|
|
||||||
});
|
|
||||||
Promise.reject()
|
|
||||||
})
|
|
||||||
}, self.getUserInvitations = function() {
|
|
||||||
var connectToken = self.connectToken();
|
|
||||||
if (!connectToken) throw new Error("null connectToken");
|
|
||||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
|
||||||
return ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: "https://connect.emby.media/service/servers?userId=" + self.connectUserId() + "&status=Waiting",
|
|
||||||
dataType: "json",
|
|
||||||
headers: {
|
|
||||||
"X-Connect-UserToken": connectToken,
|
|
||||||
"X-Application": appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, self.deleteServer = function(serverId) {
|
|
||||||
if (!serverId) throw new Error("null serverId");
|
|
||||||
var server = credentialProvider.credentials().Servers.filter(function(s) {
|
|
||||||
return s.Id === serverId
|
|
||||||
});
|
|
||||||
return server = server.length ? server[0] : null, new Promise(function(resolve, reject) {
|
|
||||||
function onDone() {
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
credentials.Servers = credentials.Servers.filter(function(s) {
|
|
||||||
return s.Id !== serverId
|
|
||||||
}), credentialProvider.credentials(credentials), resolve()
|
|
||||||
}
|
|
||||||
if (!server.ConnectServerId) return void onDone();
|
|
||||||
var connectToken = self.connectToken(),
|
|
||||||
connectUserId = self.connectUserId();
|
|
||||||
if (!connectToken || !connectUserId) return void onDone();
|
|
||||||
ajax({
|
|
||||||
type: "DELETE",
|
|
||||||
url: "https://connect.emby.media/service/serverAuthorizations?serverId=" + server.ConnectServerId + "&userId=" + connectUserId,
|
|
||||||
headers: {
|
|
||||||
"X-Connect-UserToken": connectToken,
|
|
||||||
"X-Application": appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
}).then(onDone, onDone)
|
|
||||||
})
|
|
||||||
}, self.rejectServer = function(serverId) {
|
|
||||||
var connectToken = self.connectToken();
|
|
||||||
if (!serverId) throw new Error("null serverId");
|
|
||||||
if (!connectToken) throw new Error("null connectToken");
|
|
||||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
|
||||||
var url = "https://connect.emby.media/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
|
|
||||||
return fetch(url, {
|
|
||||||
method: "DELETE",
|
|
||||||
headers: {
|
|
||||||
"X-Connect-UserToken": connectToken,
|
|
||||||
"X-Application": appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, self.acceptServer = function(serverId) {
|
|
||||||
var connectToken = self.connectToken();
|
|
||||||
if (!serverId) throw new Error("null serverId");
|
|
||||||
if (!connectToken) throw new Error("null connectToken");
|
|
||||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
|
||||||
return ajax({
|
|
||||||
type: "GET",
|
|
||||||
url: "https://connect.emby.media/service/ServerAuthorizations/accept?serverId=" + serverId + "&userId=" + self.connectUserId(),
|
|
||||||
headers: {
|
|
||||||
"X-Connect-UserToken": connectToken,
|
|
||||||
"X-Application": appName + "/" + appVersion
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, self.resetRegistrationInfo = function(apiClient) {
|
|
||||||
var cacheKey = getCacheKey("themes", apiClient, {
|
|
||||||
viewOnly: !0
|
|
||||||
});
|
|
||||||
appStorage.removeItem(cacheKey), cacheKey = getCacheKey("themes", apiClient, {
|
|
||||||
viewOnly: !1
|
|
||||||
}), appStorage.removeItem(cacheKey)
|
|
||||||
}, self.getRegistrationInfo = function(feature, apiClient, options) {
|
|
||||||
var cacheKey = getCacheKey(feature, apiClient, options);
|
|
||||||
appStorage.setItem(cacheKey, JSON.stringify({
|
|
||||||
lastValidDate: new Date().getTime(),
|
|
||||||
deviceId: self.deviceId()
|
|
||||||
}));
|
|
||||||
return Promise.resolve();
|
|
||||||
}, self.createPin = function() {
|
|
||||||
var request = {
|
|
||||||
type: "POST",
|
|
||||||
url: getConnectUrl("pin"),
|
|
||||||
data: {
|
|
||||||
deviceId: deviceId
|
|
||||||
},
|
|
||||||
dataType: "json"
|
|
||||||
};
|
|
||||||
return addAppInfoToConnectRequest(request), ajax(request)
|
|
||||||
}, self.getPinStatus = function(pinInfo) {
|
|
||||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
|
||||||
var queryString = {
|
|
||||||
deviceId: pinInfo.DeviceId,
|
|
||||||
pin: pinInfo.Pin
|
|
||||||
},
|
|
||||||
request = {
|
|
||||||
type: "GET",
|
|
||||||
url: getConnectUrl("pin") + "?" + paramsToString(queryString),
|
|
||||||
dataType: "json"
|
|
||||||
};
|
|
||||||
return addAppInfoToConnectRequest(request), ajax(request)
|
|
||||||
}, self.exchangePin = function(pinInfo) {
|
|
||||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
|
||||||
return exchangePin(pinInfo).then(function(result) {
|
|
||||||
var credentials = credentialProvider.credentials();
|
|
||||||
return credentials.ConnectAccessToken = result.AccessToken, credentials.ConnectUserId = result.UserId, credentialProvider.credentials(credentials), ensureConnectUser(credentials)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return ConnectionManager.prototype.connect = function(options) {
|
|
||||||
console.log("Begin connect");
|
|
||||||
var instance = this;
|
|
||||||
return instance.getAvailableServers().then(function(servers) {
|
|
||||||
return instance.connectToServers(servers, options)
|
|
||||||
})
|
|
||||||
}, ConnectionManager.prototype.isLoggedIntoConnect = function() {
|
|
||||||
return !(!this.connectToken() || !this.connectUserId())
|
|
||||||
}, ConnectionManager.prototype.getApiClients = function() {
|
|
||||||
for (var servers = this.getSavedServers(), i = 0, length = servers.length; i < length; i++) {
|
|
||||||
var server = servers[i];
|
|
||||||
server.Id && this._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode))
|
|
||||||
}
|
|
||||||
return this._apiClients
|
|
||||||
}, ConnectionManager.prototype.getApiClient = function(item) {
|
|
||||||
if (!item) throw new Error("item or serverId cannot be null");
|
|
||||||
return item.ServerId && (item = item.ServerId), this._apiClients.filter(function(a) {
|
|
||||||
var serverInfo = a.serverInfo();
|
|
||||||
return !serverInfo || serverInfo.Id === item
|
|
||||||
})[0]
|
|
||||||
}, ConnectionManager.prototype.minServerVersion = function(val) {
|
|
||||||
return val && (this._minServerVersion = val), this._minServerVersion
|
|
||||||
}, ConnectionManager.prototype.handleMessageReceived = function(msg) {
|
|
||||||
var serverId = msg.ServerId;
|
|
||||||
if (serverId) {
|
|
||||||
var apiClient = this.getApiClient(serverId);
|
|
||||||
if (apiClient) {
|
|
||||||
if ("string" == typeof msg.Data) try {
|
|
||||||
msg.Data = JSON.parse(msg.Data)
|
|
||||||
} catch (err) {}
|
|
||||||
apiClient.handleMessageReceived(msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, ConnectionManager
|
|
||||||
});
|
|
@ -1,12 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>testing my-element</title>
|
|
||||||
<script src="build/document-register-element.js"></script>
|
|
||||||
<script src="test/my-element.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<my-element>
|
|
||||||
some content
|
|
||||||
</my-element>
|
|
||||||
</body>
|
|
@ -1,246 +0,0 @@
|
|||||||
/*! (C) WebReflection Mit Style License */
|
|
||||||
(function(e, t, n, r) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function rt(e, t) {
|
|
||||||
for (var n = 0, r = e.length; n < r; n++) vt(e[n], t)
|
|
||||||
}
|
|
||||||
|
|
||||||
function it(e) {
|
|
||||||
for (var t = 0, n = e.length, r; t < n; t++) r = e[t], nt(r, b[ot(r)])
|
|
||||||
}
|
|
||||||
|
|
||||||
function st(e) {
|
|
||||||
return function(t) {
|
|
||||||
j(t) && (vt(t, e), rt(t.querySelectorAll(w), e))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function ot(e) {
|
|
||||||
var t = e.getAttribute("is"),
|
|
||||||
n = e.nodeName.toUpperCase(),
|
|
||||||
r = S.call(y, t ? v + t.toUpperCase() : d + n);
|
|
||||||
return t && -1 < r && !ut(n, t) ? -1 : r
|
|
||||||
}
|
|
||||||
|
|
||||||
function ut(e, t) {
|
|
||||||
return -1 < w.indexOf(e + '[is="' + t + '"]')
|
|
||||||
}
|
|
||||||
|
|
||||||
function at(e) {
|
|
||||||
var t = e.currentTarget,
|
|
||||||
n = e.attrChange,
|
|
||||||
r = e.attrName,
|
|
||||||
i = e.target;
|
|
||||||
Q && (!i || i === t) && t.attributeChangedCallback && r !== "style" && e.prevValue !== e.newValue && t.attributeChangedCallback(r, n === e[a] ? null : e.prevValue, n === e[l] ? null : e.newValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
function ft(e) {
|
|
||||||
var t = st(e);
|
|
||||||
return function(e) {
|
|
||||||
X.push(t, e.target)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function lt(e) {
|
|
||||||
K && (K = !1, e.currentTarget.removeEventListener(h, lt)), rt((e.target || t).querySelectorAll(w), e.detail === o ? o : s), B && pt()
|
|
||||||
}
|
|
||||||
|
|
||||||
function ct(e, t) {
|
|
||||||
var n = this;
|
|
||||||
q.call(n, e, t), G.call(n, {
|
|
||||||
target: n
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function ht(e, t) {
|
|
||||||
D(e, t), et ? et.observe(e, z) : (J && (e.setAttribute = ct, e[i] = Z(e), e.addEventListener(p, G)), e.addEventListener(c, at)), e.createdCallback && Q && (e.created = !0, e.createdCallback(), e.created = !1)
|
|
||||||
}
|
|
||||||
|
|
||||||
function pt() {
|
|
||||||
for (var e, t = 0, n = F.length; t < n; t++) e = F[t], E.contains(e) || (n--, F.splice(t--, 1), vt(e, o))
|
|
||||||
}
|
|
||||||
|
|
||||||
function dt(e) {
|
|
||||||
throw new Error("A " + e + " type is already registered")
|
|
||||||
}
|
|
||||||
|
|
||||||
function vt(e, t) {
|
|
||||||
var n, r = ot(e); - 1 < r && (tt(e, b[r]), r = 0, t === s && !e[s] ? (e[o] = !1, e[s] = !0, r = 1, B && S.call(F, e) < 0 && F.push(e)) : t === o && !e[o] && (e[s] = !1, e[o] = !0, r = 1), r && (n = e[t + "Callback"]) && n.call(e))
|
|
||||||
}
|
|
||||||
if (r in t) return;
|
|
||||||
var i = "__" + r + (Math.random() * 1e5 >> 0),
|
|
||||||
s = "attached",
|
|
||||||
o = "detached",
|
|
||||||
u = "extends",
|
|
||||||
a = "ADDITION",
|
|
||||||
f = "MODIFICATION",
|
|
||||||
l = "REMOVAL",
|
|
||||||
c = "DOMAttrModified",
|
|
||||||
h = "DOMContentLoaded",
|
|
||||||
p = "DOMSubtreeModified",
|
|
||||||
d = "<",
|
|
||||||
v = "=",
|
|
||||||
m = /^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/,
|
|
||||||
g = ["ANNOTATION-XML", "COLOR-PROFILE", "FONT-FACE", "FONT-FACE-SRC", "FONT-FACE-URI", "FONT-FACE-FORMAT", "FONT-FACE-NAME", "MISSING-GLYPH"],
|
|
||||||
y = [],
|
|
||||||
b = [],
|
|
||||||
w = "",
|
|
||||||
E = t.documentElement,
|
|
||||||
S = y.indexOf || function(e) {
|
|
||||||
for (var t = this.length; t-- && this[t] !== e;);
|
|
||||||
return t
|
|
||||||
},
|
|
||||||
x = n.prototype,
|
|
||||||
T = x.hasOwnProperty,
|
|
||||||
N = x.isPrototypeOf,
|
|
||||||
C = n.defineProperty,
|
|
||||||
k = n.getOwnPropertyDescriptor,
|
|
||||||
L = n.getOwnPropertyNames,
|
|
||||||
A = n.getPrototypeOf,
|
|
||||||
O = n.setPrototypeOf,
|
|
||||||
M = !!n.__proto__,
|
|
||||||
_ = n.create || function mt(e) {
|
|
||||||
return e ? (mt.prototype = e, new mt) : this
|
|
||||||
},
|
|
||||||
D = O || (M ? function(e, t) {
|
|
||||||
return e.__proto__ = t, e
|
|
||||||
} : L && k ? function() {
|
|
||||||
function e(e, t) {
|
|
||||||
for (var n, r = L(t), i = 0, s = r.length; i < s; i++) n = r[i], T.call(e, n) || C(e, n, k(t, n))
|
|
||||||
}
|
|
||||||
return function(t, n) {
|
|
||||||
do e(t, n); while ((n = A(n)) && !N.call(n, t));
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
}() : function(e, t) {
|
|
||||||
for (var n in t) e[n] = t[n];
|
|
||||||
return e
|
|
||||||
}),
|
|
||||||
P = e.MutationObserver || e.WebKitMutationObserver,
|
|
||||||
H = (e.HTMLElement || e.Element || e.Node).prototype,
|
|
||||||
B = !N.call(H, E),
|
|
||||||
j = B ? function(e) {
|
|
||||||
return e.nodeType === 1
|
|
||||||
} : function(e) {
|
|
||||||
return N.call(H, e)
|
|
||||||
},
|
|
||||||
F = B && [],
|
|
||||||
I = H.cloneNode,
|
|
||||||
q = H.setAttribute,
|
|
||||||
R = H.removeAttribute,
|
|
||||||
U = t.createElement,
|
|
||||||
z = P && {
|
|
||||||
attributes: !0,
|
|
||||||
characterData: !0,
|
|
||||||
attributeOldValue: !0
|
|
||||||
},
|
|
||||||
W = P || function(e) {
|
|
||||||
J = !1, E.removeEventListener(c, W)
|
|
||||||
},
|
|
||||||
X, V = e.requestAnimationFrame || e.webkitRequestAnimationFrame || e.mozRequestAnimationFrame || e.msRequestAnimationFrame || function(e) {
|
|
||||||
setTimeout(e, 10)
|
|
||||||
},
|
|
||||||
$ = !1,
|
|
||||||
J = !0,
|
|
||||||
K = !0,
|
|
||||||
Q = !0,
|
|
||||||
G, Y, Z, et, tt, nt;
|
|
||||||
O || M ? (tt = function(e, t) {
|
|
||||||
N.call(t, e) || ht(e, t)
|
|
||||||
}, nt = ht) : (tt = function(e, t) {
|
|
||||||
e[i] || (e[i] = n(!0), ht(e, t))
|
|
||||||
}, nt = tt), B ? (J = !1, function() {
|
|
||||||
var e = k(H, "addEventListener"),
|
|
||||||
t = e.value,
|
|
||||||
n = function(e) {
|
|
||||||
var t = new CustomEvent(c, {
|
|
||||||
bubbles: !0
|
|
||||||
});
|
|
||||||
t.attrName = e, t.prevValue = this.getAttribute(e), t.newValue = null, t[l] = t.attrChange = 2, R.call(this, e), this.dispatchEvent(t)
|
|
||||||
},
|
|
||||||
r = function(e, t) {
|
|
||||||
var n = this.hasAttribute(e),
|
|
||||||
r = n && this.getAttribute(e),
|
|
||||||
i = new CustomEvent(c, {
|
|
||||||
bubbles: !0
|
|
||||||
});
|
|
||||||
q.call(this, e, t), i.attrName = e, i.prevValue = n ? r : null, i.newValue = t, n ? i[f] = i.attrChange = 1 : i[a] = i.attrChange = 0, this.dispatchEvent(i)
|
|
||||||
},
|
|
||||||
s = function(e) {
|
|
||||||
var t = e.currentTarget,
|
|
||||||
n = t[i],
|
|
||||||
r = e.propertyName,
|
|
||||||
s;
|
|
||||||
n.hasOwnProperty(r) && (n = n[r], s = new CustomEvent(c, {
|
|
||||||
bubbles: !0
|
|
||||||
}), s.attrName = n.name, s.prevValue = n.value || null, s.newValue = n.value = t[r] || null, s.prevValue == null ? s[a] = s.attrChange = 0 : s[f] = s.attrChange = 1, t.dispatchEvent(s))
|
|
||||||
};
|
|
||||||
e.value = function(e, o, u) {
|
|
||||||
e === c && this.attributeChangedCallback && this.setAttribute !== r && (this[i] = {
|
|
||||||
className: {
|
|
||||||
name: "class",
|
|
||||||
value: this.className
|
|
||||||
}
|
|
||||||
}, this.setAttribute = r, this.removeAttribute = n, t.call(this, "propertychange", s)), t.call(this, e, o, u)
|
|
||||||
}, C(H, "addEventListener", e)
|
|
||||||
}()) : P || (E.addEventListener(c, W), E.setAttribute(i, 1), E.removeAttribute(i), J && (G = function(e) {
|
|
||||||
var t = this,
|
|
||||||
n, r, s;
|
|
||||||
if (t === e.target) {
|
|
||||||
n = t[i], t[i] = r = Z(t);
|
|
||||||
for (s in r) {
|
|
||||||
if (!(s in n)) return Y(0, t, s, n[s], r[s], a);
|
|
||||||
if (r[s] !== n[s]) return Y(1, t, s, n[s], r[s], f)
|
|
||||||
}
|
|
||||||
for (s in n)
|
|
||||||
if (!(s in r)) return Y(2, t, s, n[s], r[s], l)
|
|
||||||
}
|
|
||||||
}, Y = function(e, t, n, r, i, s) {
|
|
||||||
var o = {
|
|
||||||
attrChange: e,
|
|
||||||
currentTarget: t,
|
|
||||||
attrName: n,
|
|
||||||
prevValue: r,
|
|
||||||
newValue: i
|
|
||||||
};
|
|
||||||
o[s] = e, at(o)
|
|
||||||
}, Z = function(e) {
|
|
||||||
for (var t, n, r = {}, i = e.attributes, s = 0, o = i.length; s < o; s++) t = i[s], n = t.name, n !== "setAttribute" && (r[n] = t.value);
|
|
||||||
return r
|
|
||||||
})), t[r] = function(n, r) {
|
|
||||||
c = n.toUpperCase(), $ || ($ = !0, P ? (et = function(e, t) {
|
|
||||||
function n(e, t) {
|
|
||||||
for (var n = 0, r = e.length; n < r; t(e[n++]));
|
|
||||||
}
|
|
||||||
return new P(function(r) {
|
|
||||||
for (var i, s, o, u = 0, a = r.length; u < a; u++) i = r[u], i.type === "childList" ? (n(i.addedNodes, e), n(i.removedNodes, t)) : (s = i.target, Q && s.attributeChangedCallback && i.attributeName !== "style" && (o = s.getAttribute(i.attributeName), o !== i.oldValue && s.attributeChangedCallback(i.attributeName, i.oldValue, o)))
|
|
||||||
})
|
|
||||||
}(st(s), st(o)), et.observe(t, {
|
|
||||||
childList: !0,
|
|
||||||
subtree: !0
|
|
||||||
})) : (X = [], V(function E() {
|
|
||||||
while (X.length) X.shift().call(null, X.shift());
|
|
||||||
V(E)
|
|
||||||
}), t.addEventListener("DOMNodeInserted", ft(s)), t.addEventListener("DOMNodeRemoved", ft(o))), t.addEventListener(h, lt), t.addEventListener("readystatechange", lt), t.createElement = function(e, n) {
|
|
||||||
var r = U.apply(t, arguments),
|
|
||||||
i = "" + e,
|
|
||||||
s = S.call(y, (n ? v : d) + (n || i).toUpperCase()),
|
|
||||||
o = -1 < s;
|
|
||||||
return n && (r.setAttribute("is", n = n.toLowerCase()), o && (o = ut(i.toUpperCase(), n))), Q = !t.createElement.innerHTMLHelper, o && nt(r, b[s]), r
|
|
||||||
}, H.cloneNode = function(e) {
|
|
||||||
var t = I.call(this, !!e),
|
|
||||||
n = ot(t);
|
|
||||||
return -1 < n && nt(t, b[n]), e && it(t.querySelectorAll(w)), t
|
|
||||||
}), -2 < S.call(y, v + c) + S.call(y, d + c) && dt(n);
|
|
||||||
if (!m.test(c) || -1 < S.call(g, c)) throw new Error("The type " + n + " is invalid");
|
|
||||||
var i = function() {
|
|
||||||
return f ? t.createElement(l, c) : t.createElement(l)
|
|
||||||
},
|
|
||||||
a = r || x,
|
|
||||||
f = T.call(a, u),
|
|
||||||
l = f ? r[u].toUpperCase() : c,
|
|
||||||
c, p;
|
|
||||||
return f && -1 < S.call(y, d + l) && dt(l), p = y.push((f ? v : d) + c) - 1, w = w.concat(w.length ? "," : "", f ? l + '[is="' + n.toLowerCase() + '"]' : l), i.prototype = b[p] = T.call(a, "prototype") ? a.prototype : _(H), rt(t.querySelectorAll(w), s), i
|
|
||||||
}
|
|
||||||
})(window, document, Object, "registerElement");
|
|
263
src/bower_components/fetch/fetch.js
vendored
263
src/bower_components/fetch/fetch.js
vendored
@ -1,263 +0,0 @@
|
|||||||
! function(self) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function normalizeName(name) {
|
|
||||||
if ("string" != typeof name && (name = String(name)), /[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) throw new TypeError("Invalid character in header field name");
|
|
||||||
return name.toLowerCase()
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeValue(value) {
|
|
||||||
return "string" != typeof value && (value = String(value)), value
|
|
||||||
}
|
|
||||||
|
|
||||||
function iteratorFor(items) {
|
|
||||||
var iterator = {
|
|
||||||
next: function() {
|
|
||||||
var value = items.shift();
|
|
||||||
return {
|
|
||||||
done: void 0 === value,
|
|
||||||
value: value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return support.iterable && (iterator[Symbol.iterator] = function() {
|
|
||||||
return iterator
|
|
||||||
}), iterator
|
|
||||||
}
|
|
||||||
|
|
||||||
function Headers(headers) {
|
|
||||||
this.map = {}, headers instanceof Headers ? headers.forEach(function(value, name) {
|
|
||||||
this.append(name, value)
|
|
||||||
}, this) : headers && Object.getOwnPropertyNames(headers).forEach(function(name) {
|
|
||||||
this.append(name, headers[name])
|
|
||||||
}, this)
|
|
||||||
}
|
|
||||||
|
|
||||||
function consumed(body) {
|
|
||||||
if (body.bodyUsed) return Promise.reject(new TypeError("Already read"));
|
|
||||||
body.bodyUsed = !0
|
|
||||||
}
|
|
||||||
|
|
||||||
function fileReaderReady(reader) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
reader.onload = function() {
|
|
||||||
resolve(reader.result)
|
|
||||||
}, reader.onerror = function() {
|
|
||||||
reject(reader.error)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function readBlobAsArrayBuffer(blob) {
|
|
||||||
var reader = new FileReader,
|
|
||||||
promise = fileReaderReady(reader);
|
|
||||||
return reader.readAsArrayBuffer(blob), promise
|
|
||||||
}
|
|
||||||
|
|
||||||
function readBlobAsText(blob) {
|
|
||||||
var reader = new FileReader,
|
|
||||||
promise = fileReaderReady(reader);
|
|
||||||
return reader.readAsText(blob), promise
|
|
||||||
}
|
|
||||||
|
|
||||||
function readArrayBufferAsText(buf) {
|
|
||||||
for (var view = new Uint8Array(buf), chars = new Array(view.length), i = 0; i < view.length; i++) chars[i] = String.fromCharCode(view[i]);
|
|
||||||
return chars.join("")
|
|
||||||
}
|
|
||||||
|
|
||||||
function bufferClone(buf) {
|
|
||||||
if (buf.slice) return buf.slice(0);
|
|
||||||
var view = new Uint8Array(buf.byteLength);
|
|
||||||
return view.set(new Uint8Array(buf)), view.buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
function Body() {
|
|
||||||
return this.bodyUsed = !1, this._initBody = function(body) {
|
|
||||||
if (this._bodyInit = body, body)
|
|
||||||
if ("string" == typeof body) this._bodyText = body;
|
|
||||||
else if (support.blob && Blob.prototype.isPrototypeOf(body)) this._bodyBlob = body;
|
|
||||||
else if (support.formData && FormData.prototype.isPrototypeOf(body)) this._bodyFormData = body;
|
|
||||||
else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) this._bodyText = body.toString();
|
|
||||||
else if (support.arrayBuffer && support.blob && isDataView(body)) this._bodyArrayBuffer = bufferClone(body.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer]);
|
|
||||||
else {
|
|
||||||
if (!support.arrayBuffer || !ArrayBuffer.prototype.isPrototypeOf(body) && !isArrayBufferView(body)) throw new Error("unsupported BodyInit type");
|
|
||||||
this._bodyArrayBuffer = bufferClone(body)
|
|
||||||
} else this._bodyText = "";
|
|
||||||
this.headers.get("content-type") || ("string" == typeof body ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : support.searchParams && URLSearchParams.prototype.isPrototypeOf(body) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"))
|
|
||||||
}, support.blob && (this.blob = function() {
|
|
||||||
var rejected = consumed(this);
|
|
||||||
if (rejected) return rejected;
|
|
||||||
if (this._bodyBlob) return Promise.resolve(this._bodyBlob);
|
|
||||||
if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer]));
|
|
||||||
if (this._bodyFormData) throw new Error("could not read FormData body as blob");
|
|
||||||
return Promise.resolve(new Blob([this._bodyText]))
|
|
||||||
}, this.arrayBuffer = function() {
|
|
||||||
return this._bodyArrayBuffer ? consumed(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(readBlobAsArrayBuffer)
|
|
||||||
}), this.text = function() {
|
|
||||||
var rejected = consumed(this);
|
|
||||||
if (rejected) return rejected;
|
|
||||||
if (this._bodyBlob) return readBlobAsText(this._bodyBlob);
|
|
||||||
if (this._bodyArrayBuffer) return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
|
|
||||||
if (this._bodyFormData) throw new Error("could not read FormData body as text");
|
|
||||||
return Promise.resolve(this._bodyText)
|
|
||||||
}, support.formData && (this.formData = function() {
|
|
||||||
return this.text().then(decode)
|
|
||||||
}), this.json = function() {
|
|
||||||
return this.text().then(JSON.parse)
|
|
||||||
}, this
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeMethod(method) {
|
|
||||||
var upcased = method.toUpperCase();
|
|
||||||
return methods.indexOf(upcased) > -1 ? upcased : method
|
|
||||||
}
|
|
||||||
|
|
||||||
function Request(input, options) {
|
|
||||||
options = options || {};
|
|
||||||
var body = options.body;
|
|
||||||
if ("string" == typeof input) this.url = input;
|
|
||||||
else {
|
|
||||||
if (input.bodyUsed) throw new TypeError("Already read");
|
|
||||||
this.url = input.url, this.credentials = input.credentials, options.headers || (this.headers = new Headers(input.headers)), this.method = input.method, this.mode = input.mode, body || null == input._bodyInit || (body = input._bodyInit, input.bodyUsed = !0)
|
|
||||||
}
|
|
||||||
if (this.credentials = options.credentials || this.credentials || "omit", !options.headers && this.headers || (this.headers = new Headers(options.headers)), this.method = normalizeMethod(options.method || this.method || "GET"), this.mode = options.mode || this.mode || null, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && body) throw new TypeError("Body not allowed for GET or HEAD requests");
|
|
||||||
this._initBody(body)
|
|
||||||
}
|
|
||||||
|
|
||||||
function decode(body) {
|
|
||||||
var form = new FormData;
|
|
||||||
return body.trim().split("&").forEach(function(bytes) {
|
|
||||||
if (bytes) {
|
|
||||||
var split = bytes.split("="),
|
|
||||||
name = split.shift().replace(/\+/g, " "),
|
|
||||||
value = split.join("=").replace(/\+/g, " ");
|
|
||||||
form.append(decodeURIComponent(name), decodeURIComponent(value))
|
|
||||||
}
|
|
||||||
}), form
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseHeaders(rawHeaders) {
|
|
||||||
var headers = new Headers;
|
|
||||||
return rawHeaders.split("\r\n").forEach(function(line) {
|
|
||||||
var parts = line.split(":"),
|
|
||||||
key = parts.shift().trim();
|
|
||||||
if (key) {
|
|
||||||
var value = parts.join(":").trim();
|
|
||||||
headers.append(key, value)
|
|
||||||
}
|
|
||||||
}), headers
|
|
||||||
}
|
|
||||||
|
|
||||||
function Response(bodyInit, options) {
|
|
||||||
options || (options = {}), this.type = "default", this.status = "status" in options ? options.status : 200, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in options ? options.statusText : "OK", this.headers = new Headers(options.headers), this.url = options.url || "", this._initBody(bodyInit)
|
|
||||||
}
|
|
||||||
if (!self.fetch) {
|
|
||||||
var support = {
|
|
||||||
searchParams: "URLSearchParams" in self,
|
|
||||||
iterable: "Symbol" in self && "iterator" in Symbol,
|
|
||||||
blob: "FileReader" in self && "Blob" in self && function() {
|
|
||||||
try {
|
|
||||||
return new Blob, !0
|
|
||||||
} catch (e) {
|
|
||||||
return !1
|
|
||||||
}
|
|
||||||
}(),
|
|
||||||
formData: "FormData" in self,
|
|
||||||
arrayBuffer: "ArrayBuffer" in self
|
|
||||||
};
|
|
||||||
if (support.arrayBuffer) var viewClasses = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"],
|
|
||||||
isDataView = function(obj) {
|
|
||||||
return obj && DataView.prototype.isPrototypeOf(obj)
|
|
||||||
},
|
|
||||||
isArrayBufferView = ArrayBuffer.isView || function(obj) {
|
|
||||||
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
|
|
||||||
};
|
|
||||||
Headers.prototype.append = function(name, value) {
|
|
||||||
name = normalizeName(name), value = normalizeValue(value);
|
|
||||||
var list = this.map[name];
|
|
||||||
list || (list = [], this.map[name] = list), list.push(value)
|
|
||||||
}, Headers.prototype.delete = function(name) {
|
|
||||||
delete this.map[normalizeName(name)]
|
|
||||||
}, Headers.prototype.get = function(name) {
|
|
||||||
var values = this.map[normalizeName(name)];
|
|
||||||
return values ? values[0] : null
|
|
||||||
}, Headers.prototype.getAll = function(name) {
|
|
||||||
return this.map[normalizeName(name)] || []
|
|
||||||
}, Headers.prototype.has = function(name) {
|
|
||||||
return this.map.hasOwnProperty(normalizeName(name))
|
|
||||||
}, Headers.prototype.set = function(name, value) {
|
|
||||||
this.map[normalizeName(name)] = [normalizeValue(value)]
|
|
||||||
}, Headers.prototype.forEach = function(callback, thisArg) {
|
|
||||||
Object.getOwnPropertyNames(this.map).forEach(function(name) {
|
|
||||||
this.map[name].forEach(function(value) {
|
|
||||||
callback.call(thisArg, value, name, this)
|
|
||||||
}, this)
|
|
||||||
}, this)
|
|
||||||
}, Headers.prototype.keys = function() {
|
|
||||||
var items = [];
|
|
||||||
return this.forEach(function(value, name) {
|
|
||||||
items.push(name)
|
|
||||||
}), iteratorFor(items)
|
|
||||||
}, Headers.prototype.values = function() {
|
|
||||||
var items = [];
|
|
||||||
return this.forEach(function(value) {
|
|
||||||
items.push(value)
|
|
||||||
}), iteratorFor(items)
|
|
||||||
}, Headers.prototype.entries = function() {
|
|
||||||
var items = [];
|
|
||||||
return this.forEach(function(value, name) {
|
|
||||||
items.push([name, value])
|
|
||||||
}), iteratorFor(items)
|
|
||||||
}, support.iterable && (Headers.prototype[Symbol.iterator] = Headers.prototype.entries);
|
|
||||||
var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
|
|
||||||
Request.prototype.clone = function() {
|
|
||||||
return new Request(this, {
|
|
||||||
body: this._bodyInit
|
|
||||||
})
|
|
||||||
}, Body.call(Request.prototype), Body.call(Response.prototype), Response.prototype.clone = function() {
|
|
||||||
return new Response(this._bodyInit, {
|
|
||||||
status: this.status,
|
|
||||||
statusText: this.statusText,
|
|
||||||
headers: new Headers(this.headers),
|
|
||||||
url: this.url
|
|
||||||
})
|
|
||||||
}, Response.error = function() {
|
|
||||||
var response = new Response(null, {
|
|
||||||
status: 0,
|
|
||||||
statusText: ""
|
|
||||||
});
|
|
||||||
return response.type = "error", response
|
|
||||||
};
|
|
||||||
var redirectStatuses = [301, 302, 303, 307, 308];
|
|
||||||
Response.redirect = function(url, status) {
|
|
||||||
if (-1 === redirectStatuses.indexOf(status)) throw new RangeError("Invalid status code");
|
|
||||||
return new Response(null, {
|
|
||||||
status: status,
|
|
||||||
headers: {
|
|
||||||
location: url
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, self.Headers = Headers, self.Request = Request, self.Response = Response, self.fetch = function(input, init) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
var request = new Request(input, init),
|
|
||||||
xhr = new XMLHttpRequest;
|
|
||||||
xhr.onload = function() {
|
|
||||||
var options = {
|
|
||||||
status: xhr.status,
|
|
||||||
statusText: xhr.statusText,
|
|
||||||
headers: parseHeaders(xhr.getAllResponseHeaders() || "")
|
|
||||||
};
|
|
||||||
options.url = "responseURL" in xhr ? xhr.responseURL : options.headers.get("X-Request-URL");
|
|
||||||
var body = "response" in xhr ? xhr.response : xhr.responseText;
|
|
||||||
resolve(new Response(body, options))
|
|
||||||
}, xhr.onerror = function() {
|
|
||||||
reject(new TypeError("Network request failed"))
|
|
||||||
}, xhr.ontimeout = function() {
|
|
||||||
reject(new TypeError("Network request failed"))
|
|
||||||
}, xhr.open(request.method, request.url, !0), "include" === request.credentials && (xhr.withCredentials = !0), "responseType" in xhr && support.blob && (xhr.responseType = "blob"), request.headers.forEach(function(value, name) {
|
|
||||||
xhr.setRequestHeader(name, value)
|
|
||||||
}), xhr.send(void 0 === request._bodyInit ? null : request._bodyInit)
|
|
||||||
})
|
|
||||||
}, self.fetch.polyfill = !0
|
|
||||||
}
|
|
||||||
}("undefined" != typeof self ? self : this);
|
|
@ -1,373 +0,0 @@
|
|||||||
/*! Native Promise Only
|
|
||||||
v0.8.0-a (c) Kyle Simpson
|
|
||||||
MIT License: http://getify.mit-license.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function UMD(name,context,definition){
|
|
||||||
// special form of UMD for polyfilling across evironments
|
|
||||||
context[name] = definition();
|
|
||||||
if (typeof module != "undefined" && module.exports) { module.exports = context[name]; }
|
|
||||||
else if (typeof define == "function" && define.amd) { define(function $AMD$(){ return context[name]; }); }
|
|
||||||
})("Promise",typeof global != "undefined" ? global : this,function DEF(){
|
|
||||||
/*jshint validthis:true */
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var builtInProp, cycle, scheduling_queue,
|
|
||||||
ToString = Object.prototype.toString,
|
|
||||||
timer = (typeof setImmediate != "undefined") ?
|
|
||||||
function timer(fn) { return setImmediate(fn); } :
|
|
||||||
setTimeout
|
|
||||||
;
|
|
||||||
|
|
||||||
// dammit, IE8.
|
|
||||||
try {
|
|
||||||
Object.defineProperty({},"x",{});
|
|
||||||
builtInProp = function builtInProp(obj,name,val,config) {
|
|
||||||
return Object.defineProperty(obj,name,{
|
|
||||||
value: val,
|
|
||||||
writable: true,
|
|
||||||
configurable: config !== false
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
builtInProp = function builtInProp(obj,name,val) {
|
|
||||||
obj[name] = val;
|
|
||||||
return obj;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: using a queue instead of array for efficiency
|
|
||||||
scheduling_queue = (function Queue() {
|
|
||||||
var first, last, item;
|
|
||||||
|
|
||||||
function Item(fn,self) {
|
|
||||||
this.fn = fn;
|
|
||||||
this.self = self;
|
|
||||||
this.next = void 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
add: function add(fn,self) {
|
|
||||||
item = new Item(fn,self);
|
|
||||||
if (last) {
|
|
||||||
last.next = item;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
first = item;
|
|
||||||
}
|
|
||||||
last = item;
|
|
||||||
item = void 0;
|
|
||||||
},
|
|
||||||
drain: function drain() {
|
|
||||||
var f = first;
|
|
||||||
first = last = cycle = void 0;
|
|
||||||
|
|
||||||
while (f) {
|
|
||||||
f.fn.call(f.self);
|
|
||||||
f = f.next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
function schedule(fn,self) {
|
|
||||||
scheduling_queue.add(fn,self);
|
|
||||||
if (!cycle) {
|
|
||||||
cycle = timer(scheduling_queue.drain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// promise duck typing
|
|
||||||
function isThenable(o) {
|
|
||||||
var _then, o_type = typeof o;
|
|
||||||
|
|
||||||
if (o != null &&
|
|
||||||
(
|
|
||||||
o_type == "object" || o_type == "function"
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
_then = o.then;
|
|
||||||
}
|
|
||||||
return typeof _then == "function" ? _then : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function notify() {
|
|
||||||
for (var i=0; i<this.chain.length; i++) {
|
|
||||||
notifyIsolated(
|
|
||||||
this,
|
|
||||||
(this.state === 1) ? this.chain[i].success : this.chain[i].failure,
|
|
||||||
this.chain[i]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this.chain.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: This is a separate function to isolate
|
|
||||||
// the `try..catch` so that other code can be
|
|
||||||
// optimized better
|
|
||||||
function notifyIsolated(self,cb,chain) {
|
|
||||||
var ret, _then;
|
|
||||||
try {
|
|
||||||
if (cb === false) {
|
|
||||||
chain.reject(self.msg);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (cb === true) {
|
|
||||||
ret = self.msg;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = cb.call(void 0,self.msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret === chain.promise) {
|
|
||||||
chain.reject(TypeError("Promise-chain cycle"));
|
|
||||||
}
|
|
||||||
else if (_then = isThenable(ret)) {
|
|
||||||
_then.call(ret,chain.resolve,chain.reject);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
chain.resolve(ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
chain.reject(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(msg) {
|
|
||||||
var _then, self = this;
|
|
||||||
|
|
||||||
// already triggered?
|
|
||||||
if (self.triggered) { return; }
|
|
||||||
|
|
||||||
self.triggered = true;
|
|
||||||
|
|
||||||
// unwrap
|
|
||||||
if (self.def) {
|
|
||||||
self = self.def;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (_then = isThenable(msg)) {
|
|
||||||
schedule(function(){
|
|
||||||
var def_wrapper = new MakeDefWrapper(self);
|
|
||||||
try {
|
|
||||||
_then.call(msg,
|
|
||||||
function $resolve$(){ resolve.apply(def_wrapper,arguments); },
|
|
||||||
function $reject$(){ reject.apply(def_wrapper,arguments); }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
reject.call(def_wrapper,err);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self.msg = msg;
|
|
||||||
self.state = 1;
|
|
||||||
if (self.chain.length > 0) {
|
|
||||||
schedule(notify,self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
reject.call(new MakeDefWrapper(self),err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reject(msg) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
// already triggered?
|
|
||||||
if (self.triggered) { return; }
|
|
||||||
|
|
||||||
self.triggered = true;
|
|
||||||
|
|
||||||
// unwrap
|
|
||||||
if (self.def) {
|
|
||||||
self = self.def;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.msg = msg;
|
|
||||||
self.state = 2;
|
|
||||||
if (self.chain.length > 0) {
|
|
||||||
schedule(notify,self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function iteratePromises(Constructor,arr,resolver,rejecter) {
|
|
||||||
for (var idx=0; idx<arr.length; idx++) {
|
|
||||||
(function IIFE(idx){
|
|
||||||
Constructor.resolve(arr[idx])
|
|
||||||
.then(
|
|
||||||
function $resolver$(msg){
|
|
||||||
resolver(idx,msg);
|
|
||||||
},
|
|
||||||
rejecter
|
|
||||||
);
|
|
||||||
})(idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function MakeDefWrapper(self) {
|
|
||||||
this.def = self;
|
|
||||||
this.triggered = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function MakeDef(self) {
|
|
||||||
this.promise = self;
|
|
||||||
this.state = 0;
|
|
||||||
this.triggered = false;
|
|
||||||
this.chain = [];
|
|
||||||
this.msg = void 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Promise(executor) {
|
|
||||||
if (typeof executor != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.__NPO__ !== 0) {
|
|
||||||
throw TypeError("Not a promise");
|
|
||||||
}
|
|
||||||
|
|
||||||
// instance shadowing the inherited "brand"
|
|
||||||
// to signal an already "initialized" promise
|
|
||||||
this.__NPO__ = 1;
|
|
||||||
|
|
||||||
var def = new MakeDef(this);
|
|
||||||
|
|
||||||
this["then"] = function then(success,failure) {
|
|
||||||
var o = {
|
|
||||||
success: typeof success == "function" ? success : true,
|
|
||||||
failure: typeof failure == "function" ? failure : false
|
|
||||||
};
|
|
||||||
// Note: `then(..)` itself can be borrowed to be used against
|
|
||||||
// a different promise constructor for making the chained promise,
|
|
||||||
// by substituting a different `this` binding.
|
|
||||||
o.promise = new this.constructor(function extractChain(resolve,reject) {
|
|
||||||
if (typeof resolve != "function" || typeof reject != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
o.resolve = resolve;
|
|
||||||
o.reject = reject;
|
|
||||||
});
|
|
||||||
def.chain.push(o);
|
|
||||||
|
|
||||||
if (def.state !== 0) {
|
|
||||||
schedule(notify,def);
|
|
||||||
}
|
|
||||||
|
|
||||||
return o.promise;
|
|
||||||
};
|
|
||||||
this["catch"] = function $catch$(failure) {
|
|
||||||
return this.then(void 0,failure);
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
executor.call(
|
|
||||||
void 0,
|
|
||||||
function publicResolve(msg){
|
|
||||||
resolve.call(def,msg);
|
|
||||||
},
|
|
||||||
function publicReject(msg) {
|
|
||||||
reject.call(def,msg);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
reject.call(def,err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var PromisePrototype = builtInProp({},"constructor",Promise,
|
|
||||||
/*configurable=*/false
|
|
||||||
);
|
|
||||||
|
|
||||||
// Note: Android 4 cannot use `Object.defineProperty(..)` here
|
|
||||||
Promise.prototype = PromisePrototype;
|
|
||||||
|
|
||||||
// built-in "brand" to signal an "uninitialized" promise
|
|
||||||
builtInProp(PromisePrototype,"__NPO__",0,
|
|
||||||
/*configurable=*/false
|
|
||||||
);
|
|
||||||
|
|
||||||
builtInProp(Promise,"resolve",function Promise$resolve(msg) {
|
|
||||||
var Constructor = this;
|
|
||||||
|
|
||||||
// spec mandated checks
|
|
||||||
// note: best "isPromise" check that's practical for now
|
|
||||||
if (msg && typeof msg == "object" && msg.__NPO__ === 1) {
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Constructor(function executor(resolve,reject){
|
|
||||||
if (typeof resolve != "function" || typeof reject != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(msg);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
builtInProp(Promise,"reject",function Promise$reject(msg) {
|
|
||||||
return new this(function executor(resolve,reject){
|
|
||||||
if (typeof resolve != "function" || typeof reject != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
reject(msg);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
builtInProp(Promise,"all",function Promise$all(arr) {
|
|
||||||
var Constructor = this;
|
|
||||||
|
|
||||||
// spec mandated checks
|
|
||||||
if (ToString.call(arr) != "[object Array]") {
|
|
||||||
return Constructor.reject(TypeError("Not an array"));
|
|
||||||
}
|
|
||||||
if (arr.length === 0) {
|
|
||||||
return Constructor.resolve([]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Constructor(function executor(resolve,reject){
|
|
||||||
if (typeof resolve != "function" || typeof reject != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
var len = arr.length, msgs = Array(len), count = 0;
|
|
||||||
|
|
||||||
iteratePromises(Constructor,arr,function resolver(idx,msg) {
|
|
||||||
msgs[idx] = msg;
|
|
||||||
if (++count === len) {
|
|
||||||
resolve(msgs);
|
|
||||||
}
|
|
||||||
},reject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
builtInProp(Promise,"race",function Promise$race(arr) {
|
|
||||||
var Constructor = this;
|
|
||||||
|
|
||||||
// spec mandated checks
|
|
||||||
if (ToString.call(arr) != "[object Array]") {
|
|
||||||
return Constructor.reject(TypeError("Not an array"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Constructor(function executor(resolve,reject){
|
|
||||||
if (typeof resolve != "function" || typeof reject != "function") {
|
|
||||||
throw TypeError("Not a function");
|
|
||||||
}
|
|
||||||
|
|
||||||
iteratePromises(Constructor,arr,function resolver(idx,msg){
|
|
||||||
resolve(msg);
|
|
||||||
},reject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return Promise;
|
|
||||||
});
|
|
@ -1,21 +0,0 @@
|
|||||||
// Adapter for "promises-aplus-tests" test runner
|
|
||||||
|
|
||||||
var path = require("path");
|
|
||||||
var Promise = require(path.join(__dirname,"lib","npo.src.js"));
|
|
||||||
|
|
||||||
module.exports.deferred = function __deferred__() {
|
|
||||||
var o = {};
|
|
||||||
o.promise = new Promise(function __Promise__(resolve,reject){
|
|
||||||
o.resolve = resolve;
|
|
||||||
o.reject = reject;
|
|
||||||
});
|
|
||||||
return o;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports.resolved = function __resolved__(val) {
|
|
||||||
return Promise.resolve(val);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports.rejected = function __rejected__(reason) {
|
|
||||||
return Promise.reject(reason);
|
|
||||||
};
|
|
607
src/bower_components/requirejs/require.js
vendored
607
src/bower_components/requirejs/require.js
vendored
@ -1,607 +0,0 @@
|
|||||||
var requirejs, require, define;
|
|
||||||
! function(global, setTimeout) {
|
|
||||||
function commentReplace(match, singlePrefix) {
|
|
||||||
return singlePrefix || ""
|
|
||||||
}
|
|
||||||
|
|
||||||
function isFunction(it) {
|
|
||||||
return "[object Function]" === ostring.call(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
function isArray(it) {
|
|
||||||
return "[object Array]" === ostring.call(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
function each(ary, func) {
|
|
||||||
if (ary) {
|
|
||||||
var i;
|
|
||||||
for (i = 0; i < ary.length && (!ary[i] || !func(ary[i], i, ary)); i += 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function eachReverse(ary, func) {
|
|
||||||
if (ary) {
|
|
||||||
var i;
|
|
||||||
for (i = ary.length - 1; i > -1 && (!ary[i] || !func(ary[i], i, ary)); i -= 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasProp(obj, prop) {
|
|
||||||
return hasOwn.call(obj, prop)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getOwn(obj, prop) {
|
|
||||||
return hasProp(obj, prop) && obj[prop]
|
|
||||||
}
|
|
||||||
|
|
||||||
function eachProp(obj, func) {
|
|
||||||
var prop;
|
|
||||||
for (prop in obj)
|
|
||||||
if (hasProp(obj, prop) && func(obj[prop], prop)) break
|
|
||||||
}
|
|
||||||
|
|
||||||
function mixin(target, source, force, deepStringMixin) {
|
|
||||||
return source && eachProp(source, function(value, prop) {
|
|
||||||
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || isArray(value) || isFunction(value) || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
|
|
||||||
}), target
|
|
||||||
}
|
|
||||||
|
|
||||||
function bind(obj, fn) {
|
|
||||||
return function() {
|
|
||||||
return fn.apply(obj, arguments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function scripts() {
|
|
||||||
return document.getElementsByTagName("script")
|
|
||||||
}
|
|
||||||
|
|
||||||
function defaultOnError(err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
|
|
||||||
function getGlobal(value) {
|
|
||||||
if (!value) return value;
|
|
||||||
var g = global;
|
|
||||||
return each(value.split("."), function(part) {
|
|
||||||
g = g[part]
|
|
||||||
}), g
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeError(id, msg, err, requireModules) {
|
|
||||||
var e = new Error(msg + "\nhttp://requirejs.org/docs/errors.html#" + id);
|
|
||||||
return e.requireType = id, e.requireModules = requireModules, err && (e.originalError = err), e
|
|
||||||
}
|
|
||||||
|
|
||||||
function newContext(contextName) {
|
|
||||||
function trimDots(ary) {
|
|
||||||
var i, part;
|
|
||||||
for (i = 0; i < ary.length; i++)
|
|
||||||
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
|
|
||||||
else if (".." === part) {
|
|
||||||
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
|
|
||||||
i > 0 && (ary.splice(i - 1, 2), i -= 2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalize(name, baseName, applyMap) {
|
|
||||||
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, normalizedBaseParts, baseParts = baseName && baseName.split("/"),
|
|
||||||
map = config.map,
|
|
||||||
starMap = map && map["*"];
|
|
||||||
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
|
|
||||||
nameParts = name.split("/");
|
|
||||||
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
|
|
||||||
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
|
|
||||||
for (j = baseParts.length; j > 0; j -= 1)
|
|
||||||
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
|
|
||||||
foundMap = mapValue, foundI = i;
|
|
||||||
break outerLoop
|
|
||||||
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
|
|
||||||
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
|
|
||||||
}
|
|
||||||
return getOwn(config.pkgs, name) || name
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeScript(name) {
|
|
||||||
isBrowser && each(scripts(), function(scriptNode) {
|
|
||||||
if (scriptNode.getAttribute("data-requiremodule") === name && scriptNode.getAttribute("data-requirecontext") === context.contextName) return scriptNode.parentNode.removeChild(scriptNode), !0
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasPathFallback(id) {
|
|
||||||
var pathConfig = getOwn(config.paths, id);
|
|
||||||
if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) return pathConfig.shift(), context.require.undef(id), context.makeRequire(null, {
|
|
||||||
skipMap: !0
|
|
||||||
})([id]), !0
|
|
||||||
}
|
|
||||||
|
|
||||||
function splitPrefix(name) {
|
|
||||||
var prefix, index = name ? name.indexOf("!") : -1;
|
|
||||||
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
|
|
||||||
var url, pluginModule, suffix, nameParts, prefix = null,
|
|
||||||
parentName = parentModuleMap ? parentModuleMap.name : null,
|
|
||||||
originalName = name,
|
|
||||||
isDefine = !0,
|
|
||||||
normalizedName = "";
|
|
||||||
return name || (isDefine = !1, name = "_@r" + (requireCounter += 1)), nameParts = splitPrefix(name), prefix = nameParts[0], name = nameParts[1], prefix && (prefix = normalize(prefix, parentName, applyMap), pluginModule = getOwn(defined, prefix)), name && (prefix ? normalizedName = isNormalized ? name : pluginModule && pluginModule.normalize ? pluginModule.normalize(name, function(name) {
|
|
||||||
return normalize(name, parentName, applyMap)
|
|
||||||
}) : -1 === name.indexOf("!") ? normalize(name, parentName, applyMap) : name : (normalizedName = normalize(name, parentName, applyMap), nameParts = splitPrefix(normalizedName), prefix = nameParts[0], normalizedName = nameParts[1], isNormalized = !0, url = context.nameToUrl(normalizedName))), suffix = !prefix || pluginModule || isNormalized ? "" : "_unnormalized" + (unnormalizedCounter += 1), {
|
|
||||||
prefix: prefix,
|
|
||||||
name: normalizedName,
|
|
||||||
parentMap: parentModuleMap,
|
|
||||||
unnormalized: !!suffix,
|
|
||||||
url: url,
|
|
||||||
originalName: originalName,
|
|
||||||
isDefine: isDefine,
|
|
||||||
id: (prefix ? prefix + "!" + normalizedName : normalizedName) + suffix
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getModule(depMap) {
|
|
||||||
var id = depMap.id,
|
|
||||||
mod = getOwn(registry, id);
|
|
||||||
return mod || (mod = registry[id] = new context.Module(depMap)), mod
|
|
||||||
}
|
|
||||||
|
|
||||||
function on(depMap, name, fn) {
|
|
||||||
var id = depMap.id,
|
|
||||||
mod = getOwn(registry, id);
|
|
||||||
!hasProp(defined, id) || mod && !mod.defineEmitComplete ? (mod = getModule(depMap), mod.error && "error" === name ? fn(mod.error) : mod.on(name, fn)) : "defined" === name && fn(defined[id])
|
|
||||||
}
|
|
||||||
|
|
||||||
function onError(err, errback) {
|
|
||||||
var ids = err.requireModules,
|
|
||||||
notified = !1;
|
|
||||||
errback ? errback(err) : (each(ids, function(id) {
|
|
||||||
var mod = getOwn(registry, id);
|
|
||||||
mod && (mod.error = err, mod.events.error && (notified = !0, mod.emit("error", err)))
|
|
||||||
}), notified || req.onError(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
function takeGlobalQueue() {
|
|
||||||
globalDefQueue.length && (each(globalDefQueue, function(queueItem) {
|
|
||||||
var id = queueItem[0];
|
|
||||||
"string" == typeof id && (context.defQueueMap[id] = !0), defQueue.push(queueItem)
|
|
||||||
}), globalDefQueue = [])
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanRegistry(id) {
|
|
||||||
delete registry[id], delete enabledRegistry[id]
|
|
||||||
}
|
|
||||||
|
|
||||||
function breakCycle(mod, traced, processed) {
|
|
||||||
var id = mod.map.id;
|
|
||||||
mod.error ? mod.emit("error", mod.error) : (traced[id] = !0, each(mod.depMaps, function(depMap, i) {
|
|
||||||
var depId = depMap.id,
|
|
||||||
dep = getOwn(registry, depId);
|
|
||||||
!dep || mod.depMatched[i] || processed[depId] || (getOwn(traced, depId) ? (mod.defineDep(i, defined[depId]), mod.check()) : breakCycle(dep, traced, processed))
|
|
||||||
}), processed[id] = !0)
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkLoaded() {
|
|
||||||
var err, usingPathFallback, waitInterval = 1e3 * config.waitSeconds,
|
|
||||||
expired = waitInterval && context.startTime + waitInterval < (new Date).getTime(),
|
|
||||||
noLoads = [],
|
|
||||||
reqCalls = [],
|
|
||||||
stillLoading = !1,
|
|
||||||
needCycleCheck = !0;
|
|
||||||
if (!inCheckLoaded) {
|
|
||||||
if (inCheckLoaded = !0, eachProp(enabledRegistry, function(mod) {
|
|
||||||
var map = mod.map,
|
|
||||||
modId = map.id;
|
|
||||||
if (mod.enabled && (map.isDefine || reqCalls.push(mod), !mod.error))
|
|
||||||
if (!mod.inited && expired) hasPathFallback(modId) ? (usingPathFallback = !0, stillLoading = !0) : (noLoads.push(modId), removeScript(modId));
|
|
||||||
else if (!mod.inited && mod.fetched && map.isDefine && (stillLoading = !0, !map.prefix)) return needCycleCheck = !1
|
|
||||||
}), expired && noLoads.length) return err = makeError("timeout", "Load timeout for modules: " + noLoads, null, noLoads), err.contextName = context.contextName, onError(err);
|
|
||||||
needCycleCheck && each(reqCalls, function(mod) {
|
|
||||||
breakCycle(mod, {}, {})
|
|
||||||
}), expired && !usingPathFallback || !stillLoading || !isBrowser && !isWebWorker || checkLoadedTimeoutId || (checkLoadedTimeoutId = setTimeout(function() {
|
|
||||||
checkLoadedTimeoutId = 0, checkLoaded()
|
|
||||||
}, 50)), inCheckLoaded = !1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function callGetModule(args) {
|
|
||||||
hasProp(defined, args[0]) || getModule(makeModuleMap(args[0], null, !0)).init(args[1], args[2])
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeListener(node, func, name, ieName) {
|
|
||||||
node.detachEvent && !isOpera ? ieName && node.detachEvent(ieName, func) : node.removeEventListener(name, func, !1)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getScriptData(evt) {
|
|
||||||
var node = evt.currentTarget || evt.srcElement;
|
|
||||||
return removeListener(node, context.onScriptLoad, "load", "onreadystatechange"), removeListener(node, context.onScriptError, "error"), {
|
|
||||||
node: node,
|
|
||||||
id: node && node.getAttribute("data-requiremodule")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function intakeDefines() {
|
|
||||||
var args;
|
|
||||||
for (takeGlobalQueue(); defQueue.length;) {
|
|
||||||
if (args = defQueue.shift(), null === args[0]) return onError(makeError("mismatch", "Mismatched anonymous define() module: " + args[args.length - 1]));
|
|
||||||
callGetModule(args)
|
|
||||||
}
|
|
||||||
context.defQueueMap = {}
|
|
||||||
}
|
|
||||||
var inCheckLoaded, Module, context, handlers, checkLoadedTimeoutId, config = {
|
|
||||||
waitSeconds: 7,
|
|
||||||
baseUrl: "./",
|
|
||||||
paths: {},
|
|
||||||
bundles: {},
|
|
||||||
pkgs: {},
|
|
||||||
shim: {},
|
|
||||||
config: {}
|
|
||||||
},
|
|
||||||
registry = {},
|
|
||||||
enabledRegistry = {},
|
|
||||||
undefEvents = {},
|
|
||||||
defQueue = [],
|
|
||||||
defined = {},
|
|
||||||
urlFetched = {},
|
|
||||||
bundlesMap = {},
|
|
||||||
requireCounter = 1,
|
|
||||||
unnormalizedCounter = 1;
|
|
||||||
return handlers = {
|
|
||||||
require: function(mod) {
|
|
||||||
return mod.require ? mod.require : mod.require = context.makeRequire(mod.map)
|
|
||||||
},
|
|
||||||
exports: function(mod) {
|
|
||||||
if (mod.usingExports = !0, mod.map.isDefine) return mod.exports ? defined[mod.map.id] = mod.exports : mod.exports = defined[mod.map.id] = {}
|
|
||||||
},
|
|
||||||
module: function(mod) {
|
|
||||||
return mod.module ? mod.module : mod.module = {
|
|
||||||
id: mod.map.id,
|
|
||||||
uri: mod.map.url,
|
|
||||||
config: function() {
|
|
||||||
return getOwn(config.config, mod.map.id) || {}
|
|
||||||
},
|
|
||||||
exports: mod.exports || (mod.exports = {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, Module = function(map) {
|
|
||||||
this.events = getOwn(undefEvents, map.id) || {}, this.map = map, this.shim = getOwn(config.shim, map.id), this.depExports = [], this.depMaps = [], this.depMatched = [], this.pluginMaps = {}, this.depCount = 0
|
|
||||||
}, Module.prototype = {
|
|
||||||
init: function(depMaps, factory, errback, options) {
|
|
||||||
options = options || {}, this.inited || (this.factory = factory, errback ? this.on("error", errback) : this.events.error && (errback = bind(this, function(err) {
|
|
||||||
this.emit("error", err)
|
|
||||||
})), this.depMaps = depMaps && depMaps.slice(0), this.errback = errback, this.inited = !0, this.ignore = options.ignore, options.enabled || this.enabled ? this.enable() : this.check())
|
|
||||||
},
|
|
||||||
defineDep: function(i, depExports) {
|
|
||||||
this.depMatched[i] || (this.depMatched[i] = !0, this.depCount -= 1, this.depExports[i] = depExports)
|
|
||||||
},
|
|
||||||
fetch: function() {
|
|
||||||
if (!this.fetched) {
|
|
||||||
this.fetched = !0, context.startTime = (new Date).getTime();
|
|
||||||
var map = this.map;
|
|
||||||
if (!this.shim) return map.prefix ? this.callPlugin() : this.load();
|
|
||||||
context.makeRequire(this.map, {
|
|
||||||
enableBuildCallback: !0
|
|
||||||
})(this.shim.deps || [], bind(this, function() {
|
|
||||||
return map.prefix ? this.callPlugin() : this.load()
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
},
|
|
||||||
load: function() {
|
|
||||||
var url = this.map.url;
|
|
||||||
urlFetched[url] || (urlFetched[url] = !0, context.load(this.map.id, url))
|
|
||||||
},
|
|
||||||
check: function() {
|
|
||||||
if (this.enabled && !this.enabling) {
|
|
||||||
var err, cjsModule, id = this.map.id,
|
|
||||||
depExports = this.depExports,
|
|
||||||
exports = this.exports,
|
|
||||||
factory = this.factory;
|
|
||||||
if (this.inited) {
|
|
||||||
if (this.error) this.emit("error", this.error);
|
|
||||||
else if (!this.defining) {
|
|
||||||
if (this.defining = !0, this.depCount < 1 && !this.defined) {
|
|
||||||
if (isFunction(factory)) {
|
|
||||||
if (this.events.error && this.map.isDefine || req.onError !== defaultOnError) try {
|
|
||||||
exports = context.execCb(id, factory, depExports, exports)
|
|
||||||
} catch (e) {
|
|
||||||
err = e
|
|
||||||
} else exports = context.execCb(id, factory, depExports, exports);
|
|
||||||
if (this.map.isDefine && void 0 === exports && (cjsModule = this.module, cjsModule ? exports = cjsModule.exports : this.usingExports && (exports = this.exports)), err) return err.requireMap = this.map, err.requireModules = this.map.isDefine ? [this.map.id] : null, err.requireType = this.map.isDefine ? "define" : "require", onError(this.error = err)
|
|
||||||
} else exports = factory;
|
|
||||||
if (this.exports = exports, this.map.isDefine && !this.ignore && (defined[id] = exports, req.onResourceLoad)) {
|
|
||||||
var resLoadMaps = [];
|
|
||||||
each(this.depMaps, function(depMap) {
|
|
||||||
resLoadMaps.push(depMap.normalizedMap || depMap)
|
|
||||||
}), req.onResourceLoad(context, this.map, resLoadMaps)
|
|
||||||
}
|
|
||||||
cleanRegistry(id), this.defined = !0
|
|
||||||
}
|
|
||||||
this.defining = !1, this.defined && !this.defineEmitted && (this.defineEmitted = !0, this.emit("defined", this.exports), this.defineEmitComplete = !0)
|
|
||||||
}
|
|
||||||
} else hasProp(context.defQueueMap, id) || this.fetch()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
callPlugin: function() {
|
|
||||||
var map = this.map,
|
|
||||||
id = map.id,
|
|
||||||
pluginMap = makeModuleMap(map.prefix);
|
|
||||||
this.depMaps.push(pluginMap), on(pluginMap, "defined", bind(this, function(plugin) {
|
|
||||||
var load, normalizedMap, normalizedMod, bundleId = getOwn(bundlesMap, this.map.id),
|
|
||||||
name = this.map.name,
|
|
||||||
parentName = this.map.parentMap ? this.map.parentMap.name : null,
|
|
||||||
localRequire = context.makeRequire(map.parentMap, {
|
|
||||||
enableBuildCallback: !0
|
|
||||||
});
|
|
||||||
return this.map.unnormalized ? (plugin.normalize && (name = plugin.normalize(name, function(name) {
|
|
||||||
return normalize(name, parentName, !0)
|
|
||||||
}) || ""), normalizedMap = makeModuleMap(map.prefix + "!" + name, this.map.parentMap, !0), on(normalizedMap, "defined", bind(this, function(value) {
|
|
||||||
this.map.normalizedMap = normalizedMap, this.init([], function() {
|
|
||||||
return value
|
|
||||||
}, null, {
|
|
||||||
enabled: !0,
|
|
||||||
ignore: !0
|
|
||||||
})
|
|
||||||
})), void((normalizedMod = getOwn(registry, normalizedMap.id)) && (this.depMaps.push(normalizedMap), this.events.error && normalizedMod.on("error", bind(this, function(err) {
|
|
||||||
this.emit("error", err)
|
|
||||||
})), normalizedMod.enable()))) : bundleId ? (this.map.url = context.nameToUrl(bundleId), void this.load()) : (load = bind(this, function(value) {
|
|
||||||
this.init([], function() {
|
|
||||||
return value
|
|
||||||
}, null, {
|
|
||||||
enabled: !0
|
|
||||||
})
|
|
||||||
}), load.error = bind(this, function(err) {
|
|
||||||
this.inited = !0, this.error = err, err.requireModules = [id], eachProp(registry, function(mod) {
|
|
||||||
0 === mod.map.id.indexOf(id + "_unnormalized") && cleanRegistry(mod.map.id)
|
|
||||||
}), onError(err)
|
|
||||||
}), load.fromText = bind(this, function(text, textAlt) {
|
|
||||||
var moduleName = map.name,
|
|
||||||
moduleMap = makeModuleMap(moduleName),
|
|
||||||
hasInteractive = useInteractive;
|
|
||||||
textAlt && (text = textAlt), hasInteractive && (useInteractive = !1), getModule(moduleMap), hasProp(config.config, id) && (config.config[moduleName] = config.config[id]);
|
|
||||||
try {
|
|
||||||
req.exec(text)
|
|
||||||
} catch (e) {
|
|
||||||
return onError(makeError("fromtexteval", "fromText eval for " + id + " failed: " + e, e, [id]))
|
|
||||||
}
|
|
||||||
hasInteractive && (useInteractive = !0), this.depMaps.push(moduleMap), context.completeLoad(moduleName), localRequire([moduleName], load)
|
|
||||||
}), void plugin.load(map.name, localRequire, load, config))
|
|
||||||
})), context.enable(pluginMap, this), this.pluginMaps[pluginMap.id] = pluginMap
|
|
||||||
},
|
|
||||||
enable: function() {
|
|
||||||
enabledRegistry[this.map.id] = this, this.enabled = !0, this.enabling = !0, each(this.depMaps, bind(this, function(depMap, i) {
|
|
||||||
var id, mod, handler;
|
|
||||||
if ("string" == typeof depMap) {
|
|
||||||
if (depMap = makeModuleMap(depMap, this.map.isDefine ? this.map : this.map.parentMap, !1, !this.skipMap), this.depMaps[i] = depMap, handler = getOwn(handlers, depMap.id)) return void(this.depExports[i] = handler(this));
|
|
||||||
this.depCount += 1, on(depMap, "defined", bind(this, function(depExports) {
|
|
||||||
this.undefed || (this.defineDep(i, depExports), this.check())
|
|
||||||
})), this.errback ? on(depMap, "error", bind(this, this.errback)) : this.events.error && on(depMap, "error", bind(this, function(err) {
|
|
||||||
this.emit("error", err)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
id = depMap.id, mod = registry[id], hasProp(handlers, id) || !mod || mod.enabled || context.enable(depMap, this)
|
|
||||||
})), eachProp(this.pluginMaps, bind(this, function(pluginMap) {
|
|
||||||
var mod = getOwn(registry, pluginMap.id);
|
|
||||||
mod && !mod.enabled && context.enable(pluginMap, this)
|
|
||||||
})), this.enabling = !1, this.check()
|
|
||||||
},
|
|
||||||
on: function(name, cb) {
|
|
||||||
var cbs = this.events[name];
|
|
||||||
cbs || (cbs = this.events[name] = []), cbs.push(cb)
|
|
||||||
},
|
|
||||||
emit: function(name, evt) {
|
|
||||||
each(this.events[name], function(cb) {
|
|
||||||
cb(evt)
|
|
||||||
}), "error" === name && delete this.events[name]
|
|
||||||
}
|
|
||||||
}, context = {
|
|
||||||
config: config,
|
|
||||||
contextName: contextName,
|
|
||||||
registry: registry,
|
|
||||||
defined: defined,
|
|
||||||
urlFetched: urlFetched,
|
|
||||||
defQueue: defQueue,
|
|
||||||
defQueueMap: {},
|
|
||||||
Module: Module,
|
|
||||||
makeModuleMap: makeModuleMap,
|
|
||||||
nextTick: req.nextTick,
|
|
||||||
onError: onError,
|
|
||||||
configure: function(cfg) {
|
|
||||||
if (cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
|
|
||||||
var urlArgs = cfg.urlArgs;
|
|
||||||
cfg.urlArgs = function(id, url) {
|
|
||||||
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var shim = config.shim,
|
|
||||||
objs = {
|
|
||||||
paths: !0,
|
|
||||||
bundles: !0,
|
|
||||||
config: !0,
|
|
||||||
map: !0
|
|
||||||
};
|
|
||||||
eachProp(cfg, function(value, prop) {
|
|
||||||
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
|
|
||||||
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
|
|
||||||
each(value, function(v) {
|
|
||||||
v !== prop && (bundlesMap[v] = prop)
|
|
||||||
})
|
|
||||||
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
|
|
||||||
isArray(value) && (value = {
|
|
||||||
deps: value
|
|
||||||
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = context.makeShimExports(value)), shim[id] = value
|
|
||||||
}), config.shim = shim), cfg.packages && each(cfg.packages, function(pkgObj) {
|
|
||||||
var location, name;
|
|
||||||
pkgObj = "string" == typeof pkgObj ? {
|
|
||||||
name: pkgObj
|
|
||||||
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
|
|
||||||
}), eachProp(registry, function(mod, id) {
|
|
||||||
mod.inited || mod.map.unnormalized || (mod.map = makeModuleMap(id, null, !0))
|
|
||||||
}), (cfg.deps || cfg.callback) && context.require(cfg.deps || [], cfg.callback)
|
|
||||||
},
|
|
||||||
makeShimExports: function(value) {
|
|
||||||
function fn() {
|
|
||||||
var ret;
|
|
||||||
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
|
|
||||||
}
|
|
||||||
return fn
|
|
||||||
},
|
|
||||||
makeRequire: function(relMap, options) {
|
|
||||||
function localRequire(deps, callback, errback) {
|
|
||||||
var id, map, requireMod;
|
|
||||||
return options.enableBuildCallback && callback && isFunction(callback) && (callback.__requireJsBuild = !0), "string" == typeof deps ? isFunction(callback) ? onError(makeError("requireargs", "Invalid require call"), errback) : relMap && hasProp(handlers, deps) ? handlers[deps](registry[relMap.id]) : req.get ? req.get(context, deps, relMap, localRequire) : (map = makeModuleMap(deps, relMap, !1, !0), id = map.id, hasProp(defined, id) ? defined[id] : onError(makeError("notloaded", 'Module name "' + id + '" has not been loaded yet for context: ' + contextName + (relMap ? "" : ". Use require([])")))) : (intakeDefines(), context.nextTick(function() {
|
|
||||||
intakeDefines(), requireMod = getModule(makeModuleMap(null, relMap)), requireMod.skipMap = options.skipMap, requireMod.init(deps, callback, errback, {
|
|
||||||
enabled: !0
|
|
||||||
}), checkLoaded()
|
|
||||||
}), localRequire)
|
|
||||||
}
|
|
||||||
return options = options || {}, mixin(localRequire, {
|
|
||||||
isBrowser: isBrowser,
|
|
||||||
toUrl: function(moduleNamePlusExt) {
|
|
||||||
var ext, index = moduleNamePlusExt.lastIndexOf("."),
|
|
||||||
segment = moduleNamePlusExt.split("/")[0],
|
|
||||||
isRelative = "." === segment || ".." === segment;
|
|
||||||
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), context.nameToUrl(normalize(moduleNamePlusExt, relMap && relMap.id, !0), ext, !0)
|
|
||||||
},
|
|
||||||
defined: function(id) {
|
|
||||||
return hasProp(defined, makeModuleMap(id, relMap, !1, !0).id)
|
|
||||||
},
|
|
||||||
specified: function(id) {
|
|
||||||
return id = makeModuleMap(id, relMap, !1, !0).id, hasProp(defined, id) || hasProp(registry, id)
|
|
||||||
}
|
|
||||||
}), relMap || (localRequire.undef = function(id) {
|
|
||||||
takeGlobalQueue();
|
|
||||||
var map = makeModuleMap(id, relMap, !0),
|
|
||||||
mod = getOwn(registry, id);
|
|
||||||
mod.undefed = !0, removeScript(id), delete defined[id], delete urlFetched[map.url], delete undefEvents[id], eachReverse(defQueue, function(args, i) {
|
|
||||||
args[0] === id && defQueue.splice(i, 1)
|
|
||||||
}), delete context.defQueueMap[id], mod && (mod.events.defined && (undefEvents[id] = mod.events), cleanRegistry(id))
|
|
||||||
}), localRequire
|
|
||||||
},
|
|
||||||
enable: function(depMap) {
|
|
||||||
getOwn(registry, depMap.id) && getModule(depMap).enable()
|
|
||||||
},
|
|
||||||
completeLoad: function(moduleName) {
|
|
||||||
var found, args, mod, shim = getOwn(config.shim, moduleName) || {},
|
|
||||||
shExports = shim.exports;
|
|
||||||
for (takeGlobalQueue(); defQueue.length;) {
|
|
||||||
if (args = defQueue.shift(), null === args[0]) {
|
|
||||||
if (args[0] = moduleName, found) break;
|
|
||||||
found = !0
|
|
||||||
} else args[0] === moduleName && (found = !0);
|
|
||||||
callGetModule(args)
|
|
||||||
}
|
|
||||||
if (context.defQueueMap = {}, mod = getOwn(registry, moduleName), !found && !hasProp(defined, moduleName) && mod && !mod.inited) {
|
|
||||||
if (!(!config.enforceDefine || shExports && getGlobal(shExports))) return hasPathFallback(moduleName) ? void 0 : onError(makeError("nodefine", "No define call for " + moduleName, null, [moduleName]));
|
|
||||||
callGetModule([moduleName, shim.deps || [], shim.exportsFn])
|
|
||||||
}
|
|
||||||
checkLoaded()
|
|
||||||
},
|
|
||||||
nameToUrl: function(moduleName, ext, skipExt) {
|
|
||||||
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
|
|
||||||
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return context.nameToUrl(bundleId, ext, skipExt);
|
|
||||||
if (req.jsExtRegExp.test(moduleName)) url = moduleName + (ext || "");
|
|
||||||
else {
|
|
||||||
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
|
|
||||||
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
|
|
||||||
isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
|
|
||||||
break
|
|
||||||
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
|
|
||||||
}
|
|
||||||
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
|
|
||||||
},
|
|
||||||
load: function(id, url) {
|
|
||||||
req.load(context, id, url)
|
|
||||||
},
|
|
||||||
execCb: function(name, callback, args, exports) {
|
|
||||||
return callback.apply(exports, args)
|
|
||||||
},
|
|
||||||
onScriptLoad: function(evt) {
|
|
||||||
if ("load" === evt.type || readyRegExp.test((evt.currentTarget || evt.srcElement).readyState)) {
|
|
||||||
interactiveScript = null;
|
|
||||||
var data = getScriptData(evt);
|
|
||||||
context.completeLoad(data.id)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onScriptError: function(evt) {
|
|
||||||
var data = getScriptData(evt);
|
|
||||||
if (!hasPathFallback(data.id)) {
|
|
||||||
var parents = [];
|
|
||||||
return eachProp(registry, function(value, key) {
|
|
||||||
0 !== key.indexOf("_@r") && each(value.depMaps, function(depMap) {
|
|
||||||
if (depMap.id === data.id) return parents.push(key), !0
|
|
||||||
})
|
|
||||||
}), onError(makeError("scripterror", 'Script error for "' + data.id + (parents.length ? '", needed by: ' + parents.join(", ") : '"'), evt, [data.id]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, context.require = context.makeRequire(), context
|
|
||||||
}
|
|
||||||
|
|
||||||
function getInteractiveScript() {
|
|
||||||
return interactiveScript && "interactive" === interactiveScript.readyState ? interactiveScript : (eachReverse(scripts(), function(script) {
|
|
||||||
if ("interactive" === script.readyState) return interactiveScript = script
|
|
||||||
}), interactiveScript)
|
|
||||||
}
|
|
||||||
var req, s, head, baseElement, dataMain, src, interactiveScript, currentlyAddingScript, mainScript, subPath, version = "2.3.5",
|
|
||||||
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
|
|
||||||
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
|
||||||
jsSuffixRegExp = /\.js$/,
|
|
||||||
currDirRegExp = /^\.\//,
|
|
||||||
op = Object.prototype,
|
|
||||||
ostring = op.toString,
|
|
||||||
hasOwn = op.hasOwnProperty,
|
|
||||||
isBrowser = !("undefined" == typeof window || "undefined" == typeof navigator || !window.document),
|
|
||||||
isWebWorker = !isBrowser && "undefined" != typeof importScripts,
|
|
||||||
readyRegExp = isBrowser && "PLAYSTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/,
|
|
||||||
defContextName = "_",
|
|
||||||
isOpera = "undefined" != typeof opera && "[object Opera]" === opera.toString(),
|
|
||||||
contexts = {},
|
|
||||||
cfg = {},
|
|
||||||
globalDefQueue = [],
|
|
||||||
useInteractive = !1;
|
|
||||||
if (void 0 === define) {
|
|
||||||
if (void 0 !== requirejs) {
|
|
||||||
if (isFunction(requirejs)) return;
|
|
||||||
cfg = requirejs, requirejs = void 0
|
|
||||||
}
|
|
||||||
void 0 === require || isFunction(require) || (cfg = require, require = void 0), req = requirejs = function(deps, callback, errback, optional) {
|
|
||||||
var context, config, contextName = defContextName;
|
|
||||||
return isArray(deps) || "string" == typeof deps || (config = deps, isArray(callback) ? (deps = callback, callback = errback, errback = optional) : deps = []), config && config.context && (contextName = config.context), context = getOwn(contexts, contextName), context || (context = contexts[contextName] = req.s.newContext(contextName)), config && context.configure(config), context.require(deps, callback, errback)
|
|
||||||
}, req.config = function(config) {
|
|
||||||
return req(config)
|
|
||||||
}, req.nextTick = void 0 !== setTimeout ? function(fn) {
|
|
||||||
setTimeout(fn, 4)
|
|
||||||
} : function(fn) {
|
|
||||||
fn()
|
|
||||||
}, require || (require = req), req.version = version, req.jsExtRegExp = /^\/|:|\?|\.js$/, req.isBrowser = isBrowser, s = req.s = {
|
|
||||||
contexts: contexts,
|
|
||||||
newContext: newContext
|
|
||||||
}, req({}), each(["toUrl", "undef", "defined", "specified"], function(prop) {
|
|
||||||
req[prop] = function() {
|
|
||||||
var ctx = contexts[defContextName];
|
|
||||||
return ctx.require[prop].apply(ctx, arguments)
|
|
||||||
}
|
|
||||||
}), isBrowser && (head = s.head = document.getElementsByTagName("head")[0], (baseElement = document.getElementsByTagName("base")[0]) && (head = s.head = baseElement.parentNode)), req.onError = defaultOnError, req.createNode = function(config, moduleName, url) {
|
|
||||||
var node = config.xhtml ? document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") : document.createElement("script");
|
|
||||||
return node.type = config.scriptType || "text/javascript", node.charset = "utf-8", node.async = !0, node
|
|
||||||
}, req.load = function(context, moduleName, url) {
|
|
||||||
var node, config = context && context.config || {};
|
|
||||||
if (isBrowser) return node = req.createNode(config, moduleName, url), node.setAttribute("data-requirecontext", context.contextName), node.setAttribute("data-requiremodule", moduleName), !node.attachEvent || node.attachEvent.toString && node.attachEvent.toString().indexOf("[native code") < 0 || isOpera ? (node.addEventListener("load", context.onScriptLoad, !1), node.addEventListener("error", context.onScriptError, !1)) : (useInteractive = !0, node.attachEvent("onreadystatechange", context.onScriptLoad)), node.src = url, config.onNodeCreated && config.onNodeCreated(node, config, moduleName, url), currentlyAddingScript = node, baseElement ? head.insertBefore(node, baseElement) : head.appendChild(node), currentlyAddingScript = null, node;
|
|
||||||
if (isWebWorker) try {
|
|
||||||
setTimeout(function() {}, 0), importScripts(url), context.completeLoad(moduleName)
|
|
||||||
} catch (e) {
|
|
||||||
context.onError(makeError("importscripts", "importScripts failed for " + moduleName + " at " + url, e, [moduleName]))
|
|
||||||
}
|
|
||||||
}, isBrowser && !cfg.skipDataMain && eachReverse(scripts(), function(script) {
|
|
||||||
if (head || (head = script.parentNode), dataMain = script.getAttribute("data-main")) return mainScript = dataMain, cfg.baseUrl || -1 !== mainScript.indexOf("!") || (src = mainScript.split("/"), mainScript = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", cfg.baseUrl = subPath), mainScript = mainScript.replace(jsSuffixRegExp, ""), req.jsExtRegExp.test(mainScript) && (mainScript = dataMain), cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript], !0
|
|
||||||
}), define = function(name, deps, callback) {
|
|
||||||
var node, context;
|
|
||||||
"string" != typeof name && (callback = deps, deps = name, name = null), isArray(deps) || (callback = deps, deps = null), !deps && isFunction(callback) && (deps = [], callback.length && (callback.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
|
|
||||||
deps.push(dep)
|
|
||||||
}), deps = (1 === callback.length ? ["require"] : ["require", "exports", "module"]).concat(deps))), useInteractive && (node = currentlyAddingScript || getInteractiveScript()) && (name || (name = node.getAttribute("data-requiremodule")), context = contexts[node.getAttribute("data-requirecontext")]), context ? (context.defQueue.push([name, deps, callback]), context.defQueueMap[name] = !0) : globalDefQueue.push([name, deps, callback])
|
|
||||||
}, define.amd = {
|
|
||||||
jQuery: !0
|
|
||||||
}, req.exec = function(text) {
|
|
||||||
return eval(text)
|
|
||||||
}, req(cfg)
|
|
||||||
}
|
|
||||||
}(this, "undefined" == typeof setTimeout ? void 0 : setTimeout);
|
|
@ -1,939 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
||||||
typeof define === 'function' && define.amd ? define(factory) :
|
|
||||||
(global.ResizeObserver = factory());
|
|
||||||
}(this, (function () { 'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A collection of shims that provide minimal functionality of the ES6 collections.
|
|
||||||
*
|
|
||||||
* These implementations are not meant to be used outside of the ResizeObserver
|
|
||||||
* modules as they cover only a limited range of use cases.
|
|
||||||
*/
|
|
||||||
/* eslint-disable require-jsdoc, valid-jsdoc */
|
|
||||||
var MapShim = (function () {
|
|
||||||
if (typeof Map !== 'undefined') {
|
|
||||||
return Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns index in provided array that matches the specified key.
|
|
||||||
*
|
|
||||||
* @param {Array<Array>} arr
|
|
||||||
* @param {*} key
|
|
||||||
* @returns {number}
|
|
||||||
*/
|
|
||||||
function getIndex(arr, key) {
|
|
||||||
var result = -1;
|
|
||||||
|
|
||||||
arr.some(function (entry, index) {
|
|
||||||
if (entry[0] === key) {
|
|
||||||
result = index;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (function () {
|
|
||||||
function anonymous() {
|
|
||||||
this.__entries__ = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
var prototypeAccessors = { size: { configurable: true } };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
prototypeAccessors.size.get = function () {
|
|
||||||
return this.__entries__.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {*} key
|
|
||||||
* @returns {*}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.get = function (key) {
|
|
||||||
var index = getIndex(this.__entries__, key);
|
|
||||||
var entry = this.__entries__[index];
|
|
||||||
|
|
||||||
return entry && entry[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {*} key
|
|
||||||
* @param {*} value
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.set = function (key, value) {
|
|
||||||
var index = getIndex(this.__entries__, key);
|
|
||||||
|
|
||||||
if (~index) {
|
|
||||||
this.__entries__[index][1] = value;
|
|
||||||
} else {
|
|
||||||
this.__entries__.push([key, value]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {*} key
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.delete = function (key) {
|
|
||||||
var entries = this.__entries__;
|
|
||||||
var index = getIndex(entries, key);
|
|
||||||
|
|
||||||
if (~index) {
|
|
||||||
entries.splice(index, 1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {*} key
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.has = function (key) {
|
|
||||||
return !!~getIndex(this.__entries__, key);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.clear = function () {
|
|
||||||
this.__entries__.splice(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {*} [ctx=null]
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
anonymous.prototype.forEach = function (callback, ctx) {
|
|
||||||
var this$1 = this;
|
|
||||||
if ( ctx === void 0 ) ctx = null;
|
|
||||||
|
|
||||||
for (var i = 0, list = this$1.__entries__; i < list.length; i += 1) {
|
|
||||||
var entry = list[i];
|
|
||||||
|
|
||||||
callback.call(ctx, entry[1], entry[0]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.defineProperties( anonymous.prototype, prototypeAccessors );
|
|
||||||
|
|
||||||
return anonymous;
|
|
||||||
}());
|
|
||||||
})();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects whether window and document objects are available in current environment.
|
|
||||||
*/
|
|
||||||
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;
|
|
||||||
|
|
||||||
// Returns global object of a current environment.
|
|
||||||
var global$1 = (function () {
|
|
||||||
if (typeof global !== 'undefined' && global.Math === Math) {
|
|
||||||
return global;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof self !== 'undefined' && self.Math === Math) {
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof window !== 'undefined' && window.Math === Math) {
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-new-func
|
|
||||||
return Function('return this')();
|
|
||||||
})();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A shim for the requestAnimationFrame which falls back to the setTimeout if
|
|
||||||
* first one is not supported.
|
|
||||||
*
|
|
||||||
* @returns {number} Requests' identifier.
|
|
||||||
*/
|
|
||||||
var requestAnimationFrame$1 = (function () {
|
|
||||||
if (typeof requestAnimationFrame === 'function') {
|
|
||||||
// It's required to use a bounded function because IE sometimes throws
|
|
||||||
// an "Invalid calling object" error if rAF is invoked without the global
|
|
||||||
// object on the left hand side.
|
|
||||||
return requestAnimationFrame.bind(global$1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };
|
|
||||||
})();
|
|
||||||
|
|
||||||
// Defines minimum timeout before adding a trailing call.
|
|
||||||
var trailingTimeout = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a wrapper function which ensures that provided callback will be
|
|
||||||
* invoked only once during the specified delay period.
|
|
||||||
*
|
|
||||||
* @param {Function} callback - Function to be invoked after the delay period.
|
|
||||||
* @param {number} delay - Delay after which to invoke callback.
|
|
||||||
* @returns {Function}
|
|
||||||
*/
|
|
||||||
var throttle = function (callback, delay) {
|
|
||||||
var leadingCall = false,
|
|
||||||
trailingCall = false,
|
|
||||||
lastCallTime = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes the original callback function and schedules new invocation if
|
|
||||||
* the "proxy" was called during current request.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function resolvePending() {
|
|
||||||
if (leadingCall) {
|
|
||||||
leadingCall = false;
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trailingCall) {
|
|
||||||
proxy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback invoked after the specified delay. It will further postpone
|
|
||||||
* invocation of the original function delegating it to the
|
|
||||||
* requestAnimationFrame.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function timeoutCallback() {
|
|
||||||
requestAnimationFrame$1(resolvePending);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedules invocation of the original function.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function proxy() {
|
|
||||||
var timeStamp = Date.now();
|
|
||||||
|
|
||||||
if (leadingCall) {
|
|
||||||
// Reject immediately following calls.
|
|
||||||
if (timeStamp - lastCallTime < trailingTimeout) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schedule new call to be in invoked when the pending one is resolved.
|
|
||||||
// This is important for "transitions" which never actually start
|
|
||||||
// immediately so there is a chance that we might miss one if change
|
|
||||||
// happens amids the pending invocation.
|
|
||||||
trailingCall = true;
|
|
||||||
} else {
|
|
||||||
leadingCall = true;
|
|
||||||
trailingCall = false;
|
|
||||||
|
|
||||||
setTimeout(timeoutCallback, delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastCallTime = timeStamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return proxy;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Minimum delay before invoking the update of observers.
|
|
||||||
var REFRESH_DELAY = 20;
|
|
||||||
|
|
||||||
// A list of substrings of CSS properties used to find transition events that
|
|
||||||
// might affect dimensions of observed elements.
|
|
||||||
var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];
|
|
||||||
|
|
||||||
// Check if MutationObserver is available.
|
|
||||||
var mutationObserverSupported = typeof MutationObserver !== 'undefined';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Singleton controller class which handles updates of ResizeObserver instances.
|
|
||||||
*/
|
|
||||||
var ResizeObserverController = function() {
|
|
||||||
this.connected_ = false;
|
|
||||||
this.mutationEventsAdded_ = false;
|
|
||||||
this.mutationsObserver_ = null;
|
|
||||||
this.observers_ = [];
|
|
||||||
|
|
||||||
this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
|
|
||||||
this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds observer to observers list.
|
|
||||||
*
|
|
||||||
* @param {ResizeObserverSPI} observer - Observer to be added.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds reference to the controller's instance.
|
|
||||||
*
|
|
||||||
* @private {ResizeObserverController}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keeps reference to the instance of MutationObserver.
|
|
||||||
*
|
|
||||||
* @private {MutationObserver}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates whether DOM listeners have been added.
|
|
||||||
*
|
|
||||||
* @private {boolean}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.addObserver = function (observer) {
|
|
||||||
if (!~this.observers_.indexOf(observer)) {
|
|
||||||
this.observers_.push(observer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add listeners if they haven't been added yet.
|
|
||||||
if (!this.connected_) {
|
|
||||||
this.connect_();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes observer from observers list.
|
|
||||||
*
|
|
||||||
* @param {ResizeObserverSPI} observer - Observer to be removed.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.removeObserver = function (observer) {
|
|
||||||
var observers = this.observers_;
|
|
||||||
var index = observers.indexOf(observer);
|
|
||||||
|
|
||||||
// Remove observer if it's present in registry.
|
|
||||||
if (~index) {
|
|
||||||
observers.splice(index, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove listeners if controller has no connected observers.
|
|
||||||
if (!observers.length && this.connected_) {
|
|
||||||
this.disconnect_();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes the update of observers. It will continue running updates insofar
|
|
||||||
* it detects changes.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.refresh = function () {
|
|
||||||
var changesDetected = this.updateObservers_();
|
|
||||||
|
|
||||||
// Continue running updates if changes have been detected as there might
|
|
||||||
// be future ones caused by CSS transitions.
|
|
||||||
if (changesDetected) {
|
|
||||||
this.refresh();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates every observer from observers list and notifies them of queued
|
|
||||||
* entries.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {boolean} Returns "true" if any observer has detected changes in
|
|
||||||
* dimensions of it's elements.
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.updateObservers_ = function () {
|
|
||||||
// Collect observers that have active observations.
|
|
||||||
var activeObservers = this.observers_.filter(function (observer) {
|
|
||||||
return observer.gatherActive(), observer.hasActive();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Deliver notifications in a separate cycle in order to avoid any
|
|
||||||
// collisions between observers, e.g. when multiple instances of
|
|
||||||
// ResizeObserver are tracking the same element and the callback of one
|
|
||||||
// of them changes content dimensions of the observed target. Sometimes
|
|
||||||
// this may result in notifications being blocked for the rest of observers.
|
|
||||||
activeObservers.forEach(function (observer) { return observer.broadcastActive(); });
|
|
||||||
|
|
||||||
return activeObservers.length > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes DOM listeners.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.connect_ = function () {
|
|
||||||
// Do nothing if running in a non-browser environment or if listeners
|
|
||||||
// have been already added.
|
|
||||||
if (!isBrowser || this.connected_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Subscription to the "Transitionend" event is used as a workaround for
|
|
||||||
// delayed transitions. This way it's possible to capture at least the
|
|
||||||
// final state of an element.
|
|
||||||
document.addEventListener('transitionend', this.onTransitionEnd_);
|
|
||||||
|
|
||||||
window.addEventListener('resize', this.refresh);
|
|
||||||
window.addEventListener('orientationchange', this.refresh);
|
|
||||||
|
|
||||||
if (mutationObserverSupported) {
|
|
||||||
this.mutationsObserver_ = new MutationObserver(this.refresh);
|
|
||||||
|
|
||||||
this.mutationsObserver_.observe(document, {
|
|
||||||
attributes: true,
|
|
||||||
childList: true,
|
|
||||||
characterData: true,
|
|
||||||
subtree: true
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
document.addEventListener('DOMSubtreeModified', this.refresh);
|
|
||||||
|
|
||||||
this.mutationEventsAdded_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.connected_ = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes DOM listeners.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.disconnect_ = function () {
|
|
||||||
// Do nothing if running in a non-browser environment or if listeners
|
|
||||||
// have been already removed.
|
|
||||||
if (!isBrowser || !this.connected_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
document.removeEventListener('transitionend', this.onTransitionEnd_);
|
|
||||||
window.removeEventListener('resize', this.refresh);
|
|
||||||
window.removeEventListener('orientationchange', this.refresh);
|
|
||||||
|
|
||||||
if (this.mutationsObserver_) {
|
|
||||||
this.mutationsObserver_.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.mutationEventsAdded_) {
|
|
||||||
document.removeEventListener('DOMSubtreeModified', this.refresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.mutationsObserver_ = null;
|
|
||||||
this.mutationEventsAdded_ = false;
|
|
||||||
this.connected_ = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* "Transitionend" event handler.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {TransitionEvent} event
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.prototype.onTransitionEnd_ = function (ref) {
|
|
||||||
var propertyName = ref.propertyName; if ( propertyName === void 0 ) propertyName = '';
|
|
||||||
|
|
||||||
// Detect whether transition may affect dimensions of an element.
|
|
||||||
var isReflowProperty = transitionKeys.some(function (key) {
|
|
||||||
return !!~propertyName.indexOf(key);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (isReflowProperty) {
|
|
||||||
this.refresh();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns instance of the ResizeObserverController.
|
|
||||||
*
|
|
||||||
* @returns {ResizeObserverController}
|
|
||||||
*/
|
|
||||||
ResizeObserverController.getInstance = function () {
|
|
||||||
if (!this.instance_) {
|
|
||||||
this.instance_ = new ResizeObserverController();
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.instance_;
|
|
||||||
};
|
|
||||||
|
|
||||||
ResizeObserverController.instance_ = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines non-writable/enumerable properties of the provided target object.
|
|
||||||
*
|
|
||||||
* @param {Object} target - Object for which to define properties.
|
|
||||||
* @param {Object} props - Properties to be defined.
|
|
||||||
* @returns {Object} Target object.
|
|
||||||
*/
|
|
||||||
var defineConfigurable = (function (target, props) {
|
|
||||||
for (var i = 0, list = Object.keys(props); i < list.length; i += 1) {
|
|
||||||
var key = list[i];
|
|
||||||
|
|
||||||
Object.defineProperty(target, key, {
|
|
||||||
value: props[key],
|
|
||||||
enumerable: false,
|
|
||||||
writable: false,
|
|
||||||
configurable: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return target;
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the global object associated with provided element.
|
|
||||||
*
|
|
||||||
* @param {Object} target
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
var getWindowOf = (function (target) {
|
|
||||||
// Assume that the element is an instance of Node, which means that it
|
|
||||||
// has the "ownerDocument" property from which we can retrieve a
|
|
||||||
// corresponding global object.
|
|
||||||
var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
|
|
||||||
|
|
||||||
// Return the local global object if it's not possible extract one from
|
|
||||||
// provided element.
|
|
||||||
return ownerGlobal || global$1;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Placeholder of an empty content rectangle.
|
|
||||||
var emptyRect = createRectInit(0, 0, 0, 0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts provided string to a number.
|
|
||||||
*
|
|
||||||
* @param {number|string} value
|
|
||||||
* @returns {number}
|
|
||||||
*/
|
|
||||||
function toFloat(value) {
|
|
||||||
return parseFloat(value) || 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts borders size from provided styles.
|
|
||||||
*
|
|
||||||
* @param {CSSStyleDeclaration} styles
|
|
||||||
* @param {...string} positions - Borders positions (top, right, ...)
|
|
||||||
* @returns {number}
|
|
||||||
*/
|
|
||||||
function getBordersSize(styles) {
|
|
||||||
var positions = [], len = arguments.length - 1;
|
|
||||||
while ( len-- > 0 ) positions[ len ] = arguments[ len + 1 ];
|
|
||||||
|
|
||||||
return positions.reduce(function (size, position) {
|
|
||||||
var value = styles['border-' + position + '-width'];
|
|
||||||
|
|
||||||
return size + toFloat(value);
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts paddings sizes from provided styles.
|
|
||||||
*
|
|
||||||
* @param {CSSStyleDeclaration} styles
|
|
||||||
* @returns {Object} Paddings box.
|
|
||||||
*/
|
|
||||||
function getPaddings(styles) {
|
|
||||||
var positions = ['top', 'right', 'bottom', 'left'];
|
|
||||||
var paddings = {};
|
|
||||||
|
|
||||||
for (var i = 0, list = positions; i < list.length; i += 1) {
|
|
||||||
var position = list[i];
|
|
||||||
|
|
||||||
var value = styles['padding-' + position];
|
|
||||||
|
|
||||||
paddings[position] = toFloat(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return paddings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates content rectangle of provided SVG element.
|
|
||||||
*
|
|
||||||
* @param {SVGGraphicsElement} target - Element content rectangle of which needs
|
|
||||||
* to be calculated.
|
|
||||||
* @returns {DOMRectInit}
|
|
||||||
*/
|
|
||||||
function getSVGContentRect(target) {
|
|
||||||
var bbox = target.getBBox();
|
|
||||||
|
|
||||||
return createRectInit(0, 0, bbox.width, bbox.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates content rectangle of provided HTMLElement.
|
|
||||||
*
|
|
||||||
* @param {HTMLElement} target - Element for which to calculate the content rectangle.
|
|
||||||
* @returns {DOMRectInit}
|
|
||||||
*/
|
|
||||||
function getHTMLElementContentRect(target) {
|
|
||||||
|
|
||||||
var rect = target.getBoundingClientRect();
|
|
||||||
return createRectInit(rect.left, rect.top, rect.width, rect.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether provided element is a document element (<html>).
|
|
||||||
*
|
|
||||||
* @param {Element} target - Element to be checked.
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
function isDocumentElement(target) {
|
|
||||||
return target === getWindowOf(target).document.documentElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates an appropriate content rectangle for provided html or svg element.
|
|
||||||
*
|
|
||||||
* @param {Element} target - Element content rectangle of which needs to be calculated.
|
|
||||||
* @returns {DOMRectInit}
|
|
||||||
*/
|
|
||||||
function getContentRect(target) {
|
|
||||||
if (!isBrowser) {
|
|
||||||
return emptyRect;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getHTMLElementContentRect(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates rectangle with an interface of the DOMRectReadOnly.
|
|
||||||
* Spec: https://drafts.fxtf.org/geometry/#domrectreadonly
|
|
||||||
*
|
|
||||||
* @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.
|
|
||||||
* @returns {DOMRectReadOnly}
|
|
||||||
*/
|
|
||||||
function createReadOnlyRect(ref) {
|
|
||||||
var x = ref.x;
|
|
||||||
var y = ref.y;
|
|
||||||
var width = ref.width;
|
|
||||||
var height = ref.height;
|
|
||||||
|
|
||||||
// If DOMRectReadOnly is available use it as a prototype for the rectangle.
|
|
||||||
var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;
|
|
||||||
var rect = Object.create(Constr.prototype);
|
|
||||||
|
|
||||||
// Rectangle's properties are not writable and non-enumerable.
|
|
||||||
defineConfigurable(rect, {
|
|
||||||
x: x, y: y, width: width, height: height,
|
|
||||||
top: y,
|
|
||||||
right: x + width,
|
|
||||||
bottom: height + y,
|
|
||||||
left: x
|
|
||||||
});
|
|
||||||
|
|
||||||
return rect;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.
|
|
||||||
* Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit
|
|
||||||
*
|
|
||||||
* @param {number} x - X coordinate.
|
|
||||||
* @param {number} y - Y coordinate.
|
|
||||||
* @param {number} width - Rectangle's width.
|
|
||||||
* @param {number} height - Rectangle's height.
|
|
||||||
* @returns {DOMRectInit}
|
|
||||||
*/
|
|
||||||
function createRectInit(x, y, width, height) {
|
|
||||||
return { x: x, y: y, width: width, height: height };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class that is responsible for computations of the content rectangle of
|
|
||||||
* provided DOM element and for keeping track of it's changes.
|
|
||||||
*/
|
|
||||||
var ResizeObservation = function(target) {
|
|
||||||
this.broadcastWidth = 0;
|
|
||||||
this.broadcastHeight = 0;
|
|
||||||
this.contentRect_ = createRectInit(0, 0, 0, 0);
|
|
||||||
|
|
||||||
this.target = target;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates content rectangle and tells whether it's width or height properties
|
|
||||||
* have changed since the last broadcast.
|
|
||||||
*
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reference to the last observed content rectangle.
|
|
||||||
*
|
|
||||||
* @private {DOMRectInit}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Broadcasted width of content rectangle.
|
|
||||||
*
|
|
||||||
* @type {number}
|
|
||||||
*/
|
|
||||||
ResizeObservation.prototype.isActive = function () {
|
|
||||||
var rect = getContentRect(this.target);
|
|
||||||
|
|
||||||
this.contentRect_ = rect;
|
|
||||||
return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates 'broadcastWidth' and 'broadcastHeight' properties with a data
|
|
||||||
* from the corresponding properties of the last observed content rectangle.
|
|
||||||
*
|
|
||||||
* @returns {DOMRectInit} Last observed content rectangle.
|
|
||||||
*/
|
|
||||||
ResizeObservation.prototype.broadcastRect = function () {
|
|
||||||
var rect = this.contentRect_;
|
|
||||||
|
|
||||||
this.broadcastWidth = rect.width;
|
|
||||||
this.broadcastHeight = rect.height;
|
|
||||||
|
|
||||||
return rect;
|
|
||||||
};
|
|
||||||
|
|
||||||
var ResizeObserverEntry = function(target, rectInit) {
|
|
||||||
var contentRect = createReadOnlyRect(rectInit);
|
|
||||||
|
|
||||||
// According to the specification following properties are not writable
|
|
||||||
// and are also not enumerable in the native implementation.
|
|
||||||
//
|
|
||||||
// Property accessors are not being used as they'd require to define a
|
|
||||||
// private WeakMap storage which may cause memory leaks in browsers that
|
|
||||||
// don't support this type of collections.
|
|
||||||
defineConfigurable(this, { target: target, contentRect: contentRect });
|
|
||||||
};
|
|
||||||
|
|
||||||
var ResizeObserverSPI = function(callback, controller, callbackCtx) {
|
|
||||||
this.activeObservations_ = [];
|
|
||||||
this.observations_ = new MapShim();
|
|
||||||
|
|
||||||
if (typeof callback !== 'function') {
|
|
||||||
throw new TypeError('The callback provided as parameter 1 is not a function.');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.callback_ = callback;
|
|
||||||
this.controller_ = controller;
|
|
||||||
this.callbackCtx_ = callbackCtx;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts observing provided element.
|
|
||||||
*
|
|
||||||
* @param {Element} target - Element to be observed.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registry of the ResizeObservation instances.
|
|
||||||
*
|
|
||||||
* @private {Map<Element, ResizeObservation>}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public ResizeObserver instance which will be passed to the callback
|
|
||||||
* function and used as a value of it's "this" binding.
|
|
||||||
*
|
|
||||||
* @private {ResizeObserver}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collection of resize observations that have detected changes in dimensions
|
|
||||||
* of elements.
|
|
||||||
*
|
|
||||||
* @private {Array<ResizeObservation>}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.observe = function (target) {
|
|
||||||
if (!arguments.length) {
|
|
||||||
throw new TypeError('1 argument required, but only 0 present.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do nothing if current environment doesn't have the Element interface.
|
|
||||||
if (typeof Element === 'undefined' || !(Element instanceof Object)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(target instanceof getWindowOf(target).Element)) {
|
|
||||||
throw new TypeError('parameter 1 is not of type "Element".');
|
|
||||||
}
|
|
||||||
|
|
||||||
var observations = this.observations_;
|
|
||||||
|
|
||||||
// Do nothing if element is already being observed.
|
|
||||||
if (observations.has(target)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
observations.set(target, new ResizeObservation(target));
|
|
||||||
|
|
||||||
this.controller_.addObserver(this);
|
|
||||||
|
|
||||||
// Force the update of observations.
|
|
||||||
this.controller_.refresh();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops observing provided element.
|
|
||||||
*
|
|
||||||
* @param {Element} target - Element to stop observing.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.unobserve = function (target) {
|
|
||||||
if (!arguments.length) {
|
|
||||||
throw new TypeError('1 argument required, but only 0 present.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do nothing if current environment doesn't have the Element interface.
|
|
||||||
if (typeof Element === 'undefined' || !(Element instanceof Object)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(target instanceof getWindowOf(target).Element)) {
|
|
||||||
throw new TypeError('parameter 1 is not of type "Element".');
|
|
||||||
}
|
|
||||||
|
|
||||||
var observations = this.observations_;
|
|
||||||
|
|
||||||
// Do nothing if element is not being observed.
|
|
||||||
if (!observations.has(target)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
observations.delete(target);
|
|
||||||
|
|
||||||
if (!observations.size) {
|
|
||||||
this.controller_.removeObserver(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops observing all elements.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.disconnect = function () {
|
|
||||||
this.clearActive();
|
|
||||||
this.observations_.clear();
|
|
||||||
this.controller_.removeObserver(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collects observation instances the associated element of which has changed
|
|
||||||
* it's content rectangle.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.gatherActive = function () {
|
|
||||||
var this$1 = this;
|
|
||||||
|
|
||||||
this.clearActive();
|
|
||||||
|
|
||||||
this.observations_.forEach(function (observation) {
|
|
||||||
if (observation.isActive()) {
|
|
||||||
this$1.activeObservations_.push(observation);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes initial callback function with a list of ResizeObserverEntry
|
|
||||||
* instances collected from active resize observations.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.broadcastActive = function () {
|
|
||||||
// Do nothing if observer doesn't have active observations.
|
|
||||||
if (!this.hasActive()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ctx = this.callbackCtx_;
|
|
||||||
|
|
||||||
// Create ResizeObserverEntry instance for every active observation.
|
|
||||||
var entries = this.activeObservations_.map(function (observation) {
|
|
||||||
return new ResizeObserverEntry(observation.target, observation.broadcastRect());
|
|
||||||
});
|
|
||||||
|
|
||||||
this.callback_.call(ctx, entries, ctx);
|
|
||||||
this.clearActive();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears the collection of active observations.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.clearActive = function () {
|
|
||||||
this.activeObservations_.splice(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tells whether observer has active observations.
|
|
||||||
*
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
ResizeObserverSPI.prototype.hasActive = function () {
|
|
||||||
return this.activeObservations_.length > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Registry of internal observers. If WeakMap is not available use current shim
|
|
||||||
// for the Map collection as it has all required methods and because WeakMap
|
|
||||||
// can't be fully polyfilled anyway.
|
|
||||||
var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
|
|
||||||
* exposing only those methods and properties that are defined in the spec.
|
|
||||||
*/
|
|
||||||
var ResizeObserver = function(callback) {
|
|
||||||
if (!(this instanceof ResizeObserver)) {
|
|
||||||
throw new TypeError('Cannot call a class as a function.');
|
|
||||||
}
|
|
||||||
if (!arguments.length) {
|
|
||||||
throw new TypeError('1 argument required, but only 0 present.');
|
|
||||||
}
|
|
||||||
|
|
||||||
var controller = ResizeObserverController.getInstance();
|
|
||||||
var observer = new ResizeObserverSPI(callback, controller, this);
|
|
||||||
|
|
||||||
observers.set(this, observer);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Expose public methods of ResizeObserver.
|
|
||||||
['observe', 'unobserve', 'disconnect'].forEach(function (method) {
|
|
||||||
ResizeObserver.prototype[method] = function () {
|
|
||||||
return (ref = observers.get(this))[method].apply(ref, arguments);
|
|
||||||
var ref;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
var index = (function () {
|
|
||||||
// Export existing implementation if available.
|
|
||||||
if (typeof global$1.ResizeObserver !== 'undefined') {
|
|
||||||
return global$1.ResizeObserver;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResizeObserver;
|
|
||||||
})();
|
|
||||||
|
|
||||||
return index;
|
|
||||||
|
|
||||||
})));
|
|
File diff suppressed because it is too large
Load Diff
@ -4,41 +4,89 @@
|
|||||||
// Use define from require.js not webpack's define
|
// Use define from require.js not webpack's define
|
||||||
var _define = window.define;
|
var _define = window.define;
|
||||||
|
|
||||||
|
// document-register-element
|
||||||
|
var docRegister = require("document-register-element");
|
||||||
|
_define("document-register-element", function() {
|
||||||
|
return docRegister;
|
||||||
|
});
|
||||||
|
|
||||||
|
// fetch
|
||||||
|
var fetch = require("whatwg-fetch");
|
||||||
|
_define("fetch", function() {
|
||||||
|
return fetch
|
||||||
|
});
|
||||||
|
|
||||||
// flvjs
|
// flvjs
|
||||||
var flvjs = require("flv.js");
|
var flvjs = require("flv.js");
|
||||||
_define("flvjs", function() { return flvjs; });
|
_define("flvjs", function() {
|
||||||
|
return flvjs;
|
||||||
|
});
|
||||||
|
|
||||||
// jstree
|
// jstree
|
||||||
var jstree = require("jstree");
|
var jstree = require("jstree");
|
||||||
require("jstree/dist/themes/default/style.css");
|
require("jstree/dist/themes/default/style.css");
|
||||||
_define("jstree", function() { return jstree; });
|
_define("jstree", function() {
|
||||||
|
return jstree;
|
||||||
|
});
|
||||||
|
|
||||||
// jquery
|
// jquery
|
||||||
var jquery = require("jquery");
|
var jquery = require("jquery");
|
||||||
_define("jQuery", function() { return jquery; });
|
_define("jQuery", function() {
|
||||||
|
return jquery;
|
||||||
|
});
|
||||||
|
|
||||||
// hlsjs
|
// hlsjs
|
||||||
var hlsjs = require("hls.js");
|
var hlsjs = require("hls.js");
|
||||||
_define("hlsjs", function() { return hlsjs; });
|
_define("hlsjs", function() {
|
||||||
|
return hlsjs;
|
||||||
|
});
|
||||||
|
|
||||||
// howler
|
// howler
|
||||||
var howler = require("howler");
|
var howler = require("howler");
|
||||||
_define("howler", function() { return howler; });
|
_define("howler", function() {
|
||||||
|
return howler;
|
||||||
|
});
|
||||||
|
|
||||||
|
// native-promise-only
|
||||||
|
var nativePromise = require("native-promise-only");
|
||||||
|
_define("native-promise-only", function() {
|
||||||
|
return nativePromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
// resize-observer-polyfill
|
||||||
|
var resize = require("resize-observer-polyfill");
|
||||||
|
_define("resize-observer-polyfill", function() {
|
||||||
|
return resize;
|
||||||
|
});
|
||||||
|
|
||||||
// shaka
|
// shaka
|
||||||
var shaka = require("shaka-player");
|
var shaka = require("shaka-player");
|
||||||
_define("shaka", function() { return shaka; });
|
_define("shaka", function() {
|
||||||
|
return shaka;
|
||||||
|
});
|
||||||
|
|
||||||
// swiper
|
// swiper
|
||||||
var swiper = require("swiper");
|
var swiper = require("swiper");
|
||||||
require("swiper/dist/css/swiper.min.css");
|
require("swiper/dist/css/swiper.min.css");
|
||||||
_define("swiper", function() { return swiper; });
|
_define("swiper", function() {
|
||||||
|
return swiper;
|
||||||
|
});
|
||||||
|
|
||||||
// sortable
|
// sortable
|
||||||
var sortable = require("sortablejs");
|
var sortable = require("sortablejs");
|
||||||
_define("sortable", function() { return sortable; });
|
_define("sortable", function() {
|
||||||
|
return sortable;
|
||||||
|
});
|
||||||
|
|
||||||
|
// webcomponents
|
||||||
|
var webcomponents = require("webcomponents.js-2");
|
||||||
|
_define("webcomponents", function() {
|
||||||
|
return webcomponents
|
||||||
|
});
|
||||||
|
|
||||||
// libjass
|
// libjass
|
||||||
var libjass = require("libjass");
|
var libjass = require("libjass");
|
||||||
require("libjass/libjass.css");
|
require("libjass/libjass.css");
|
||||||
_define("libjass", function() { return libjass; });
|
_define("libjass", function() {
|
||||||
|
return libjass;
|
||||||
|
});
|
||||||
|
@ -1,19 +1,33 @@
|
|||||||
define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "formDialogStyle"], function(dialogHelper, datetime) {
|
define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "formDialogStyle"], function (dialogHelper, datetime) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function getDisplayTime(hours) {
|
function getDisplayTime(hours) {
|
||||||
var minutes = 0,
|
var minutes = 0;
|
||||||
pct = hours % 1;
|
var pct = hours % 1;
|
||||||
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
|
|
||||||
|
if (pct) {
|
||||||
|
minutes = parseInt(60 * pct);
|
||||||
|
}
|
||||||
|
|
||||||
|
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
function populateHours(context) {
|
function populateHours(context) {
|
||||||
for (var html = "", i = 0; i < 24; i++) html += '<option value="' + i + '">' + getDisplayTime(i) + "</option>";
|
var html = "";
|
||||||
html += '<option value="24">' + getDisplayTime(0) + "</option>", context.querySelector("#selectStart").innerHTML = html, context.querySelector("#selectEnd").innerHTML = html
|
|
||||||
|
for (var i = 0; i < 24; i++) {
|
||||||
|
html += '<option value="' + i + '">' + getDisplayTime(i) + "</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
html += '<option value="24">' + getDisplayTime(0) + "</option>";
|
||||||
|
context.querySelector("#selectStart").innerHTML = html;
|
||||||
|
context.querySelector("#selectEnd").innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSchedule(context, schedule) {
|
function loadSchedule(context, schedule) {
|
||||||
context.querySelector("#selectDay").value = schedule.DayOfWeek || "Sunday", context.querySelector("#selectStart").value = schedule.StartHour || 0, context.querySelector("#selectEnd").value = schedule.EndHour || 0
|
context.querySelector("#selectDay").value = schedule.DayOfWeek || "Sunday";
|
||||||
|
context.querySelector("#selectStart").value = schedule.StartHour || 0;
|
||||||
|
context.querySelector("#selectEnd").value = schedule.EndHour || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function submitSchedule(context, options) {
|
function submitSchedule(context, options) {
|
||||||
@ -22,30 +36,54 @@ define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "f
|
|||||||
StartHour: context.querySelector("#selectStart").value,
|
StartHour: context.querySelector("#selectStart").value,
|
||||||
EndHour: context.querySelector("#selectEnd").value
|
EndHour: context.querySelector("#selectEnd").value
|
||||||
};
|
};
|
||||||
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) return void alert(Globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
|
|
||||||
context.submitted = !0, options.schedule = Object.assign(options.schedule, updatedSchedule), dialogHelper.close(context)
|
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) {
|
||||||
|
return void alert(Globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
|
||||||
|
}
|
||||||
|
|
||||||
|
context.submitted = true;
|
||||||
|
options.schedule = Object.assign(options.schedule, updatedSchedule);
|
||||||
|
dialogHelper.close(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
show: function(options) {
|
show: function (options) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var xhr = new XMLHttpRequest;
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", "components/accessschedule/accessschedule.template.html", !0), xhr.onload = function(e) {
|
xhr.open("GET", "components/accessschedule/accessschedule.template.html", true);
|
||||||
var template = this.response,
|
|
||||||
dlg = dialogHelper.createDialog({
|
xhr.onload = function (e) {
|
||||||
removeOnClose: !0,
|
var template = this.response;
|
||||||
size: "small"
|
var dlg = dialogHelper.createDialog({
|
||||||
});
|
removeOnClose: true,
|
||||||
|
size: "small"
|
||||||
|
});
|
||||||
dlg.classList.add("formDialog");
|
dlg.classList.add("formDialog");
|
||||||
var html = "";
|
var html = "";
|
||||||
html += Globalize.translateDocument(template), dlg.innerHTML = html, populateHours(dlg), loadSchedule(dlg, options.schedule), dialogHelper.open(dlg), dlg.addEventListener("close", function() {
|
html += Globalize.translateDocument(template);
|
||||||
dlg.submitted ? resolve(options.schedule) : reject()
|
dlg.innerHTML = html;
|
||||||
}), dlg.querySelector(".btnCancel").addEventListener("click", function(e) {
|
populateHours(dlg);
|
||||||
dialogHelper.close(dlg)
|
loadSchedule(dlg, options.schedule);
|
||||||
}), dlg.querySelector("form").addEventListener("submit", function(e) {
|
dialogHelper.open(dlg);
|
||||||
return submitSchedule(dlg, options), e.preventDefault(), !1
|
dlg.addEventListener("close", function () {
|
||||||
})
|
if (dlg.submitted) {
|
||||||
}, xhr.send()
|
resolve(options.schedule);
|
||||||
})
|
} else {
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||||
|
dialogHelper.close(dlg);
|
||||||
|
});
|
||||||
|
dlg.querySelector("form").addEventListener("submit", function (e) {
|
||||||
|
submitSchedule(dlg, options);
|
||||||
|
e.preventDefault();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.send();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
@ -139,7 +139,9 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-bu
|
|||||||
style += "min-width:" + minWidth + "px;";
|
style += "min-width:" + minWidth + "px;";
|
||||||
}
|
}
|
||||||
|
|
||||||
var i, length, option;
|
var i;
|
||||||
|
var length;
|
||||||
|
var option;
|
||||||
var renderIcon = false;
|
var renderIcon = false;
|
||||||
var icons = [];
|
var icons = [];
|
||||||
var itemIcon;
|
var itemIcon;
|
||||||
@ -225,8 +227,7 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-bu
|
|||||||
if (itemIcon) {
|
if (itemIcon) {
|
||||||
|
|
||||||
html += '<i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent md-icon">' + itemIcon + '</i>';
|
html += '<i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent md-icon">' + itemIcon + '</i>';
|
||||||
}
|
} else if (renderIcon && !center) {
|
||||||
else if (renderIcon && !center) {
|
|
||||||
html += '<i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent md-icon" style="visibility:hidden;">check</i>';
|
html += '<i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent md-icon" style="visibility:hidden;">check</i>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function(events, globalize, dom, datetime, userSettings, serverNotifications, connectionManager) {
|
define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function (events, globalize, dom, datetime, userSettings, serverNotifications, connectionManager) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function getEntryHtml(entry, apiClient) {
|
function getEntryHtml(entry, apiClient) {
|
||||||
var html = "";
|
var html = "";
|
||||||
html += '<div class="listItem listItem-border">';
|
html += '<div class="listItem listItem-border">';
|
||||||
var color = "#00a4dc";
|
var color = "#00a4dc";
|
||||||
var icon = "notifications";
|
var icon = "notifications";
|
||||||
|
|
||||||
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
||||||
color = "#cc0000";
|
color = "#cc0000";
|
||||||
icon = "notification_important";
|
icon = "notification_important";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry.UserId && entry.UserPrimaryImageTag) {
|
if (entry.UserId && entry.UserPrimaryImageTag) {
|
||||||
html += '<i class="listItemIcon md-icon" style="width:2em!important;height:2em!important;padding:0;color:transparent;background-color:' + color + ";background-image:url('" + apiClient.getUserImageUrl(entry.UserId, {
|
html += '<i class="listItemIcon md-icon" style="width:2em!important;height:2em!important;padding:0;color:transparent;background-color:' + color + ";background-image:url('" + apiClient.getUserImageUrl(entry.UserId, {
|
||||||
type: "Primary",
|
type: "Primary",
|
||||||
@ -18,78 +20,138 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific
|
|||||||
} else {
|
} else {
|
||||||
html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">' + icon + '</i>';
|
html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">' + icon + '</i>';
|
||||||
}
|
}
|
||||||
html += '<div class="listItemBody three-line">', html += '<div class="listItemBodyText">', html += entry.Name, html += "</div>", html += '<div class="listItemBodyText secondary">';
|
|
||||||
var date = datetime.parseISO8601Date(entry.Date, !0);
|
html += '<div class="listItemBody three-line">';
|
||||||
return html += datetime.toLocaleString(date).toLowerCase(), html += "</div>", html += '<div class="listItemBodyText secondary listItemBodyText-nowrap">', html += entry.ShortOverview || "", html += "</div>", html += "</div>", entry.Overview && (html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate("Info") + '"><i class="md-icon">info</i></button>'), html += "</div>"
|
html += '<div class="listItemBodyText">';
|
||||||
|
html += entry.Name;
|
||||||
|
html += "</div>";
|
||||||
|
html += '<div class="listItemBodyText secondary">';
|
||||||
|
var date = datetime.parseISO8601Date(entry.Date, true);
|
||||||
|
html += datetime.toLocaleString(date).toLowerCase();
|
||||||
|
html += "</div>";
|
||||||
|
html += '<div class="listItemBodyText secondary listItemBodyText-nowrap">';
|
||||||
|
html += entry.ShortOverview || "";
|
||||||
|
html += "</div>";
|
||||||
|
html += "</div>";
|
||||||
|
|
||||||
|
if (entry.Overview) {
|
||||||
|
html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate("Info") + '"><i class="md-icon">info</i></button>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderList(elem, apiClient, result, startIndex, limit) {
|
function renderList(elem, apiClient, result, startIndex, limit) {
|
||||||
elem.innerHTML = result.Items.map(function(i) {
|
elem.innerHTML = result.Items.map(function (i) {
|
||||||
return getEntryHtml(i, apiClient)
|
return getEntryHtml(i, apiClient);
|
||||||
}).join("")
|
}).join("");
|
||||||
}
|
}
|
||||||
|
|
||||||
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
||||||
null == startIndex && (startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0")), limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7");
|
if (null == startIndex) {
|
||||||
var minDate = new Date,
|
startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0");
|
||||||
hasUserId = "false" !== elem.getAttribute("data-useractivity");
|
}
|
||||||
hasUserId ? minDate.setTime(minDate.getTime() - 864e5) : minDate.setTime(minDate.getTime() - 6048e5), ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", {
|
|
||||||
|
limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7");
|
||||||
|
var minDate = new Date();
|
||||||
|
var hasUserId = "false" !== elem.getAttribute("data-useractivity");
|
||||||
|
|
||||||
|
if (hasUserId) {
|
||||||
|
minDate.setTime(minDate.getTime() - 24 * 60 * 60 * 1000); // one day back
|
||||||
|
} else {
|
||||||
|
minDate.setTime(minDate.getTime() - 7 * 24 * 60 * 60 * 1000); // one week back
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", {
|
||||||
startIndex: startIndex,
|
startIndex: startIndex,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
minDate: minDate.toISOString(),
|
minDate: minDate.toISOString(),
|
||||||
hasUserId: hasUserId
|
hasUserId: hasUserId
|
||||||
})).then(function(result) {
|
})).then(function (result) {
|
||||||
if (elem.setAttribute("data-activitystartindex", startIndex), elem.setAttribute("data-activitylimit", limit), !startIndex) {
|
elem.setAttribute("data-activitystartindex", startIndex);
|
||||||
|
elem.setAttribute("data-activitylimit", limit);
|
||||||
|
if (!startIndex) {
|
||||||
var activityContainer = dom.parentWithClass(elem, "activityContainer");
|
var activityContainer = dom.parentWithClass(elem, "activityContainer");
|
||||||
activityContainer && (result.Items.length ? activityContainer.classList.remove("hide") : activityContainer.classList.add("hide"))
|
|
||||||
|
if (activityContainer) {
|
||||||
|
if (result.Items.length) {
|
||||||
|
activityContainer.classList.remove("hide");
|
||||||
|
} else {
|
||||||
|
activityContainer.classList.add("hide");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
instance.items = result.Items, renderList(elem, apiClient, result, startIndex, limit)
|
|
||||||
})
|
instance.items = result.Items;
|
||||||
|
renderList(elem, apiClient, result, startIndex, limit);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onActivityLogUpdate(e, apiClient, data) {
|
function onActivityLogUpdate(e, apiClient, data) {
|
||||||
var options = this.options;
|
var options = this.options;
|
||||||
options && options.serverId === apiClient.serverId() && reloadData(this, options.element, apiClient)
|
|
||||||
|
if (options && options.serverId === apiClient.serverId()) {
|
||||||
|
reloadData(this, options.element, apiClient);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onListClick(e) {
|
function onListClick(e) {
|
||||||
var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo");
|
var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo");
|
||||||
|
|
||||||
if (btnEntryInfo) {
|
if (btnEntryInfo) {
|
||||||
var id = btnEntryInfo.getAttribute("data-id"),
|
var id = btnEntryInfo.getAttribute("data-id");
|
||||||
items = this.items;
|
var items = this.items;
|
||||||
|
|
||||||
if (items) {
|
if (items) {
|
||||||
var item = items.filter(function(i) {
|
var item = items.filter(function (i) {
|
||||||
return i.Id.toString() === id
|
return i.Id.toString() === id;
|
||||||
})[0];
|
})[0];
|
||||||
item && showItemOverview(item)
|
|
||||||
|
if (item) {
|
||||||
|
showItemOverview(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showItemOverview(item) {
|
function showItemOverview(item) {
|
||||||
require(["alert"], function(alert) {
|
require(["alert"], function (alert) {
|
||||||
alert({
|
alert({
|
||||||
text: item.Overview
|
text: item.Overview
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function ActivityLog(options) {
|
function ActivityLog(options) {
|
||||||
this.options = options;
|
this.options = options;
|
||||||
var element = options.element;
|
var element = options.element;
|
||||||
element.classList.add("activityLogListWidget"), element.addEventListener("click", onListClick.bind(this));
|
element.classList.add("activityLogListWidget");
|
||||||
|
element.addEventListener("click", onListClick.bind(this));
|
||||||
var apiClient = connectionManager.getApiClient(options.serverId);
|
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||||
reloadData(this, element, apiClient);
|
reloadData(this, element, apiClient);
|
||||||
var onUpdate = onActivityLogUpdate.bind(this);
|
var onUpdate = onActivityLogUpdate.bind(this);
|
||||||
this.updateFn = onUpdate, events.on(serverNotifications, "ActivityLogEntry", onUpdate), apiClient.sendMessage("ActivityLogEntryStart", "0,1500")
|
this.updateFn = onUpdate;
|
||||||
|
events.on(serverNotifications, "ActivityLogEntry", onUpdate);
|
||||||
|
apiClient.sendMessage("ActivityLogEntryStart", "0,1500");
|
||||||
}
|
}
|
||||||
return ActivityLog.prototype.destroy = function() {
|
|
||||||
|
ActivityLog.prototype.destroy = function () {
|
||||||
var options = this.options;
|
var options = this.options;
|
||||||
|
|
||||||
if (options) {
|
if (options) {
|
||||||
options.element.classList.remove("activityLogListWidget");
|
options.element.classList.remove("activityLogListWidget");
|
||||||
connectionManager.getApiClient(options.serverId).sendMessage("ActivityLogEntryStop", "0,1500")
|
connectionManager.getApiClient(options.serverId).sendMessage("ActivityLogEntryStop", "0,1500");
|
||||||
}
|
}
|
||||||
|
|
||||||
var onUpdate = this.updateFn;
|
var onUpdate = this.updateFn;
|
||||||
onUpdate && events.off(serverNotifications, "ActivityLogEntry", onUpdate), this.items = null, this.options = null
|
|
||||||
}, ActivityLog
|
if (onUpdate) {
|
||||||
|
events.off(serverNotifications, "ActivityLogEntry", onUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.items = null;
|
||||||
|
this.options = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
return ActivityLog;
|
||||||
});
|
});
|
||||||
|
@ -35,7 +35,7 @@ define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize)
|
|||||||
if (result === 'ok') {
|
if (result === 'ok') {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.reject();
|
return Promise.reject();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -50,9 +50,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b
|
|||||||
|
|
||||||
var vertical = element.classList.contains('alphaPicker-vertical');
|
var vertical = element.classList.contains('alphaPicker-vertical');
|
||||||
|
|
||||||
if (vertical) {
|
if (!vertical) {
|
||||||
|
|
||||||
} else {
|
|
||||||
element.classList.add('focuscontainer-x');
|
element.classList.add('focuscontainer-x');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +228,8 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b
|
|||||||
AlphaPicker.prototype.value = function (value, applyValue) {
|
AlphaPicker.prototype.value = function (value, applyValue) {
|
||||||
|
|
||||||
var element = this.options.element;
|
var element = this.options.element;
|
||||||
var btn, selected;
|
var btn;
|
||||||
|
var selected;
|
||||||
|
|
||||||
if (value !== undefined) {
|
if (value !== undefined) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
|
@ -313,7 +313,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
|||||||
var deviceId;
|
var deviceId;
|
||||||
var deviceName;
|
var deviceName;
|
||||||
var appName = "Jellyfin Web";
|
var appName = "Jellyfin Web";
|
||||||
var appVersion = "10.4.0";
|
var appVersion = "10.5.0";
|
||||||
var visibilityChange;
|
var visibilityChange;
|
||||||
var visibilityState;
|
var visibilityState;
|
||||||
|
|
||||||
|
@ -26,24 +26,12 @@ button {
|
|||||||
font-weight: inherit !important;
|
font-weight: inherit !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-nofocustransform {
|
.card:not(.show-animation) {
|
||||||
contain: layout style paint;
|
contain: layout style paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
.itemsContainer {
|
.itemsContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-left: -0.6em;
|
|
||||||
margin-right: -0.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO replace this with a proper fix */
|
|
||||||
/* doesnt work on mobile devices */
|
|
||||||
/* negative margin fixes annoying misalignment with cards and title */
|
|
||||||
@media all and (max-width:50em) {
|
|
||||||
.itemsContainer {
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.vertical-list {
|
.vertical-list {
|
||||||
@ -98,20 +86,21 @@ button {
|
|||||||
contain: layout style;
|
contain: layout style;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cardBox-withfocuscontent-large {
|
.card.show-focus:not(.show-animation) .cardBox {
|
||||||
margin: .4em;
|
margin: .4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-focuscontent-large {
|
.card.show-focus:not(.show-animation) .cardBox.visualCardBox,
|
||||||
|
.card.show-focus:not(.show-animation) .cardBox:not(.visualCardBox) .cardScalable {
|
||||||
border: .5em solid transparent;
|
border: .5em solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cardBox-focustransform {
|
.card.show-animation .cardBox {
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
transition: transform 200ms ease-out;
|
transition: transform 200ms ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:focus > .cardBox-focustransform {
|
.card.show-animation:focus > .cardBox {
|
||||||
transform: scale(1.18, 1.18);
|
transform: scale(1.18, 1.18);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,9 +352,6 @@ button {
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
/*display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.textActionButton:hover {
|
.textActionButton:hover {
|
||||||
|
@ -3,7 +3,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var devicePixelRatio = window.devicePixelRatio || 1;
|
var devicePixelRatio = window.devicePixelRatio || 1;
|
||||||
var enableFocusTransfrom = !browser.slow && !browser.edge;
|
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
function getCardsHtml(items, options) {
|
function getCardsHtml(items, options) {
|
||||||
if (arguments.length === 1) {
|
if (arguments.length === 1) {
|
||||||
@ -321,7 +321,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
var apiClient;
|
var apiClient;
|
||||||
var lastServerId;
|
var lastServerId;
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = items.length; i < length; i++) {
|
for (i = 0, length = items.length; i < length; i++) {
|
||||||
|
|
||||||
@ -339,19 +340,14 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
if (options.indexBy === 'PremiereDate') {
|
if (options.indexBy === 'PremiereDate') {
|
||||||
if (item.PremiereDate) {
|
if (item.PremiereDate) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' });
|
newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' });
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
console.log('error parsing timestamp for premiere date');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (options.indexBy === 'ProductionYear') {
|
||||||
|
|
||||||
else if (options.indexBy === 'ProductionYear') {
|
|
||||||
newIndexValue = item.ProductionYear;
|
newIndexValue = item.ProductionYear;
|
||||||
}
|
} else if (options.indexBy === 'CommunityRating') {
|
||||||
|
|
||||||
else if (options.indexBy === 'CommunityRating') {
|
|
||||||
newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + (item.CommunityRating % 1 >= 0.5 ? 0.5 : 0)) + '+' : null;
|
newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + (item.CommunityRating % 1 >= 0.5 ? 0.5 : 0)) + '+' : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -571,22 +567,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
|
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (item.ParentPrimaryImageTag) {
|
||||||
else if (item.ParentPrimaryImageTag) {
|
|
||||||
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, {
|
imgUrl = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, {
|
||||||
type: "Primary",
|
type: "Primary",
|
||||||
tag: item.ParentPrimaryImageTag
|
tag: item.ParentPrimaryImageTag
|
||||||
});
|
});
|
||||||
}
|
} else if (item.SeriesPrimaryImageTag) {
|
||||||
else if (item.SeriesPrimaryImageTag) {
|
|
||||||
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.SeriesId, {
|
imgUrl = apiClient.getScaledImageUrl(item.SeriesId, {
|
||||||
type: "Primary",
|
type: "Primary",
|
||||||
tag: item.SeriesPrimaryImageTag
|
tag: item.SeriesPrimaryImageTag
|
||||||
});
|
});
|
||||||
}
|
} else if (item.AlbumId && item.AlbumPrimaryImageTag) {
|
||||||
else if (item.AlbumId && item.AlbumPrimaryImageTag) {
|
|
||||||
|
|
||||||
width = primaryImageAspectRatio ? Math.round(height * primaryImageAspectRatio) : null;
|
width = primaryImageAspectRatio ? Math.round(height * primaryImageAspectRatio) : null;
|
||||||
|
|
||||||
@ -601,16 +594,14 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
|
coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (item.Type === 'Season' && item.ImageTags && item.ImageTags.Thumb) {
|
||||||
else if (item.Type === 'Season' && item.ImageTags && item.ImageTags.Thumb) {
|
|
||||||
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
||||||
type: "Thumb",
|
type: "Thumb",
|
||||||
tag: item.ImageTags.Thumb
|
tag: item.ImageTags.Thumb
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
} else if (item.BackdropImageTags && item.BackdropImageTags.length) {
|
||||||
else if (item.BackdropImageTags && item.BackdropImageTags.length) {
|
|
||||||
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
||||||
type: "Backdrop",
|
type: "Backdrop",
|
||||||
@ -681,7 +672,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
var html = '';
|
var html = '';
|
||||||
|
|
||||||
var valid = 0;
|
var valid = 0;
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = lines.length; i < length; i++) {
|
for (i = 0, length = lines.length; i < length; i++) {
|
||||||
|
|
||||||
@ -745,8 +737,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
date = datetime.parseISO8601Date(item.EndDate);
|
date = datetime.parseISO8601Date(item.EndDate);
|
||||||
airTimeText += ' - ' + datetime.getDisplayTime(date);
|
airTimeText += ' - ' + datetime.getDisplayTime(date);
|
||||||
}
|
}
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.StartDate);
|
console.log("Error parsing date: " + item.StartDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -794,8 +785,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
} else {
|
} else {
|
||||||
lines.push(item.SeriesName);
|
lines.push(item.SeriesName);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
if (isUsingLiveTvNaming(item)) {
|
if (isUsingLiveTvNaming(item)) {
|
||||||
|
|
||||||
@ -976,8 +966,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
if (options.showSeriesTimerChannel) {
|
if (options.showSeriesTimerChannel) {
|
||||||
if (item.RecordAnyChannel) {
|
if (item.RecordAnyChannel) {
|
||||||
lines.push(globalize.translate('AllChannels'));
|
lines.push(globalize.translate('AllChannels'));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
lines.push(item.ChannelName || globalize.translate('OneChannel'));
|
lines.push(item.ChannelName || globalize.translate('OneChannel'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -985,8 +974,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
if (options.showPersonRoleOrType) {
|
if (options.showPersonRoleOrType) {
|
||||||
if (item.Role) {
|
if (item.Role) {
|
||||||
lines.push('as ' + item.Role);
|
lines.push('as ' + item.Role);
|
||||||
}
|
} else if (item.Type) {
|
||||||
else if (item.Type) {
|
|
||||||
lines.push(globalize.translate('' + item.Type));
|
lines.push(globalize.translate('' + item.Type));
|
||||||
} else {
|
} else {
|
||||||
lines.push('');
|
lines.push('');
|
||||||
@ -1060,8 +1048,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
|
|
||||||
counts.push(childText);
|
counts.push(childText);
|
||||||
|
|
||||||
}
|
} else if (item.Type === 'Genre' || item.Type === 'Studio') {
|
||||||
else if (item.Type === 'Genre' || item.Type === 'Studio') {
|
|
||||||
|
|
||||||
if (item.MovieCount) {
|
if (item.MovieCount) {
|
||||||
|
|
||||||
@ -1140,8 +1127,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
|
|
||||||
if (item.IsPremiere) {
|
if (item.IsPremiere) {
|
||||||
html += '<div class="premiereTvProgram programAttributeIndicator">' + globalize.translate('Premiere') + '</div>';
|
html += '<div class="premiereTvProgram programAttributeIndicator">' + globalize.translate('Premiere') + '</div>';
|
||||||
}
|
} else if (item.IsSeries && !item.IsRepeat) {
|
||||||
else if (item.IsSeries && !item.IsRepeat) {
|
|
||||||
html += '<div class="newTvProgram programAttributeIndicator">' + globalize.translate('AttributeNew') + '</div>';
|
html += '<div class="newTvProgram programAttributeIndicator">' + globalize.translate('AttributeNew') + '</div>';
|
||||||
}
|
}
|
||||||
//else if (item.IsRepeat) {
|
//else if (item.IsRepeat) {
|
||||||
@ -1176,8 +1162,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
if (action === 'play' && item.IsFolder) {
|
if (action === 'play' && item.IsFolder) {
|
||||||
// If this hard-coding is ever removed make sure to test nested photo albums
|
// If this hard-coding is ever removed make sure to test nested photo albums
|
||||||
action = 'link';
|
action = 'link';
|
||||||
}
|
} else if (item.MediaType === 'Photo') {
|
||||||
else if (item.MediaType === 'Photo') {
|
|
||||||
action = 'play';
|
action = 'play';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1203,6 +1188,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
shape = shape || 'mixedSquare';
|
shape = shape || 'mixedSquare';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var className = 'card';
|
var className = 'card';
|
||||||
|
|
||||||
if (shape) {
|
if (shape) {
|
||||||
@ -1221,8 +1208,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
className += ' card-hoverable';
|
className += ' card-hoverable';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!enableFocusTransfrom || !layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
className += ' card-nofocustransform';
|
className += ' show-focus';
|
||||||
|
|
||||||
|
if (enableFocusTransform) {
|
||||||
|
className += ' show-animation';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var imgInfo = getCardImageUrl(item, apiClient, options, shape);
|
var imgInfo = getCardImageUrl(item, apiClient, options, shape);
|
||||||
@ -1250,23 +1241,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
|
|
||||||
var cardBoxClass = options.cardLayout ? 'cardBox visualCardBox' : 'cardBox';
|
var cardBoxClass = options.cardLayout ? 'cardBox visualCardBox' : 'cardBox';
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
|
|
||||||
if (enableFocusTransfrom) {
|
|
||||||
cardBoxClass += ' cardBox-focustransform cardBox-withfocuscontent';
|
|
||||||
} else {
|
|
||||||
cardBoxClass += ' cardBox-withfocuscontent-large';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.cardLayout) {
|
|
||||||
cardBoxClass += ' card-focuscontent';
|
|
||||||
|
|
||||||
if (!enableFocusTransfrom) {
|
|
||||||
cardBoxClass += ' card-focuscontent-large';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var footerCssClass;
|
var footerCssClass;
|
||||||
var progressHtml = indicators.getProgressBarHtml(item);
|
var progressHtml = indicators.getProgressBarHtml(item);
|
||||||
|
|
||||||
@ -1283,8 +1257,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
height: logoHeight,
|
height: logoHeight,
|
||||||
tag: item.ChannelPrimaryImageTag
|
tag: item.ChannelPrimaryImageTag
|
||||||
});
|
});
|
||||||
}
|
} else if (options.showLogo && item.ParentLogoImageTag) {
|
||||||
else if (options.showLogo && item.ParentLogoImageTag) {
|
|
||||||
logoUrl = apiClient.getScaledImageUrl(item.ParentLogoItemId, {
|
logoUrl = apiClient.getScaledImageUrl(item.ParentLogoItemId, {
|
||||||
type: "Logo",
|
type: "Logo",
|
||||||
height: logoHeight,
|
height: logoHeight,
|
||||||
@ -1299,8 +1272,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter';
|
footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter';
|
||||||
innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, logoUrl, false);
|
innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, logoUrl, false);
|
||||||
footerOverlayed = true;
|
footerOverlayed = true;
|
||||||
}
|
} else if (progressHtml) {
|
||||||
else if (progressHtml) {
|
|
||||||
innerCardFooter += '<div class="innerCardFooter fullInnerCardFooter innerCardFooterClear">';
|
innerCardFooter += '<div class="innerCardFooter fullInnerCardFooter innerCardFooterClear">';
|
||||||
innerCardFooter += progressHtml;
|
innerCardFooter += progressHtml;
|
||||||
innerCardFooter += '</div>';
|
innerCardFooter += '</div>';
|
||||||
@ -1385,15 +1357,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
|
|
||||||
var cardScalableClass = 'cardScalable';
|
var cardScalableClass = 'cardScalable';
|
||||||
|
|
||||||
if (layoutManager.tv && !options.cardLayout) {
|
|
||||||
|
|
||||||
cardScalableClass += ' card-focuscontent';
|
|
||||||
|
|
||||||
if (!enableFocusTransfrom) {
|
|
||||||
cardScalableClass += ' card-focuscontent-large';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cardImageContainerOpen = '<div class="' + cardBoxClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + shape + '"></div>' + cardImageContainerOpen;
|
cardImageContainerOpen = '<div class="' + cardBoxClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + shape + '"></div>' + cardImageContainerOpen;
|
||||||
cardBoxClose = '</div>';
|
cardBoxClose = '</div>';
|
||||||
cardScalableClose = '</div>';
|
cardScalableClose = '</div>';
|
||||||
@ -1414,8 +1377,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
|
indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
|
||||||
minCount: 1
|
minCount: 1
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
|
indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1676,8 +1638,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||||||
}
|
}
|
||||||
|
|
||||||
itemProgressBar.innerHTML = progressHtml;
|
itemProgressBar.innerHTML = progressHtml;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
itemProgressBar = card.querySelector('.itemProgressBar');
|
itemProgressBar = card.querySelector('.itemProgressBar');
|
||||||
if (itemProgressBar) {
|
if (itemProgressBar) {
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browser'], function (datetime, imageLoader, connectionManager, layoutManager, browser) {
|
define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browser'], function (datetime, imageLoader, connectionManager, layoutManager, browser) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
function buildChapterCardsHtml(item, chapters, options) {
|
function buildChapterCardsHtml(item, chapters, options) {
|
||||||
|
|
||||||
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var className = 'card itemAction chapterCard';
|
var className = 'card itemAction chapterCard';
|
||||||
|
|
||||||
if (layoutManager.tv && (browser.animate || browser.edge)) {
|
if (layoutManager.tv) {
|
||||||
className += ' card-focusscale';
|
className += ' show-focus';
|
||||||
|
|
||||||
|
if (enableFocusTransform) {
|
||||||
|
className += ' show-animation';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || [];
|
var mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || [];
|
||||||
@ -92,19 +100,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse
|
|||||||
var cardBoxCssClass = 'cardBox';
|
var cardBoxCssClass = 'cardBox';
|
||||||
var cardScalableClass = 'cardScalable';
|
var cardScalableClass = 'cardScalable';
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
var enableFocusTransfrom = !browser.slow && !browser.edge;
|
|
||||||
|
|
||||||
cardScalableClass += ' card-focuscontent';
|
|
||||||
|
|
||||||
if (enableFocusTransfrom) {
|
|
||||||
cardBoxCssClass += ' cardBox-focustransform cardBox-withfocuscontent';
|
|
||||||
} else {
|
|
||||||
cardBoxCssClass += ' cardBox-withfocuscontent-large';
|
|
||||||
cardScalableClass += ' card-focuscontent-large';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var html = '<button type="button" class="' + className + '"' + dataAttributes + '><div class="' + cardBoxCssClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + shape + '"></div>' + cardImageContainer + '</div><div class="innerCardFooter">' + nameHtml + '</div></div></div></button>';
|
var html = '<button type="button" class="' + className + '"' + dataAttributes + '><div class="' + cardBoxCssClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + shape + '"></div>' + cardImageContainer + '</div><div class="innerCardFooter">' + nameHtml + '</div></div></div></button>';
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
@ -137,4 +132,4 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse
|
|||||||
buildChapterCards: buildChapterCards
|
buildChapterCards: buildChapterCards
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function(dialogHelper, loading, connectionManager, globalize, actionsheet) {
|
define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dialogHelper, loading, connectionManager, globalize, actionsheet) {
|
||||||
"use strict";
|
"use strict";
|
||||||
return function(options) {
|
|
||||||
|
return function (options) {
|
||||||
function parentWithClass(elem, className) {
|
function parentWithClass(elem, className) {
|
||||||
for (; !elem.classList || !elem.classList.contains(className);)
|
while (!elem.classList || !elem.classList.contains(className)) {
|
||||||
if (!(elem = elem.parentNode)) return null;
|
elem = elem.parentNode;
|
||||||
return elem
|
if (!elem) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapChannel(button, channelId, providerChannelId) {
|
function mapChannel(button, channelId, providerChannelId) {
|
||||||
@ -19,33 +25,35 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
|||||||
providerChannelId: providerChannelId
|
providerChannelId: providerChannelId
|
||||||
},
|
},
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
}).then(function(mapping) {
|
}).then(function (mapping) {
|
||||||
var listItem = parentWithClass(button, "listItem");
|
var listItem = parentWithClass(button, "listItem");
|
||||||
button.setAttribute("data-providerid", mapping.ProviderChannelId), listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName), loading.hide()
|
button.setAttribute("data-providerid", mapping.ProviderChannelId);
|
||||||
})
|
listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName);
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onChannelsElementClick(e) {
|
function onChannelsElementClick(e) {
|
||||||
var btnMap = parentWithClass(e.target, "btnMap");
|
var btnMap = parentWithClass(e.target, "btnMap");
|
||||||
|
|
||||||
if (btnMap) {
|
if (btnMap) {
|
||||||
var channelId = btnMap.getAttribute("data-id");
|
var channelId = btnMap.getAttribute("data-id");
|
||||||
var providerChannelId = btnMap.getAttribute("data-providerid");
|
var providerChannelId = btnMap.getAttribute("data-providerid");
|
||||||
var menuItems = currentMappingOptions.ProviderChannels.map(function(m) {
|
var menuItems = currentMappingOptions.ProviderChannels.map(function (m) {
|
||||||
return {
|
return {
|
||||||
name: m.Name,
|
name: m.Name,
|
||||||
id: m.Id,
|
id: m.Id,
|
||||||
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
|
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
|
||||||
}
|
};
|
||||||
}).sort(function (a, b) {
|
}).sort(function (a, b) {
|
||||||
return a.name.localeCompare(b.name);
|
return a.name.localeCompare(b.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
actionsheet.show({
|
actionsheet.show({
|
||||||
positionTo: btnMap,
|
positionTo: btnMap,
|
||||||
items: menuItems
|
items: menuItems
|
||||||
}).then(function(newChannelId) {
|
}).then(function (newChannelId) {
|
||||||
mapChannel(btnMap, channelId, newChannelId)
|
mapChannel(btnMap, channelId, newChannelId);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,47 +61,87 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
|
|||||||
var apiClient = connectionManager.getApiClient(serverId);
|
var apiClient = connectionManager.getApiClient(serverId);
|
||||||
return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", {
|
return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", {
|
||||||
providerId: providerId
|
providerId: providerId
|
||||||
}))
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMappingSecondaryName(mapping, providerName) {
|
function getMappingSecondaryName(mapping, providerName) {
|
||||||
return (mapping.ProviderChannelName || "") + " - " + providerName
|
return (mapping.ProviderChannelName || "") + " - " + providerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTunerChannelHtml(channel, providerName) {
|
function getTunerChannelHtml(channel, providerName) {
|
||||||
var html = "";
|
var html = "";
|
||||||
return html += '<div class="listItem">', html += '<i class="md-icon listItemIcon">dvr</i>', html += '<div class="listItemBody two-line">', html += '<h3 class="listItemBodyText">', html += channel.Name, html += "</h3>", html += '<div class="secondary listItemBodyText">', channel.ProviderChannelName && (html += getMappingSecondaryName(channel, providerName)), html += "</div>", html += "</div>", html += '<button class="btnMap autoSize" is="paper-icon-button-light" type="button" data-id="' + channel.Id + '" data-providerid="' + channel.ProviderChannelId + '"><i class="md-icon">mode_edit</i></button>', html += "</div>"
|
html += '<div class="listItem">';
|
||||||
|
html += '<i class="md-icon listItemIcon">dvr</i>';
|
||||||
|
html += '<div class="listItemBody two-line">';
|
||||||
|
html += '<h3 class="listItemBodyText">';
|
||||||
|
html += channel.Name;
|
||||||
|
html += "</h3>";
|
||||||
|
html += '<div class="secondary listItemBodyText">';
|
||||||
|
|
||||||
|
if (channel.ProviderChannelName) {
|
||||||
|
html += getMappingSecondaryName(channel, providerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
html += "</div>";
|
||||||
|
html += "</div>";
|
||||||
|
html += '<button class="btnMap autoSize" is="paper-icon-button-light" type="button" data-id="' + channel.Id + '" data-providerid="' + channel.ProviderChannelId + '"><i class="md-icon">mode_edit</i></button>';
|
||||||
|
return html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEditorHtml() {
|
function getEditorHtml() {
|
||||||
var html = "";
|
var html = "";
|
||||||
return html += '<div class="formDialogContent">', html += '<div class="dialogContentInner dialog-content-centered">', html += '<form style="margin:auto;">', html += "<h1>" + globalize.translate("HeaderChannels") + "</h1>", html += '<div class="channels paperList">', html += "</div>", html += "</form>", html += "</div>", html += "</div>"
|
html += '<div class="formDialogContent">';
|
||||||
|
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||||
|
html += '<form style="margin:auto;">';
|
||||||
|
html += "<h1>" + globalize.translate("HeaderChannels") + "</h1>";
|
||||||
|
html += '<div class="channels paperList">';
|
||||||
|
html += "</div>";
|
||||||
|
html += "</form>";
|
||||||
|
html += "</div>";
|
||||||
|
return html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
function initEditor(dlg, options) {
|
function initEditor(dlg, options) {
|
||||||
getChannelMappingOptions(options.serverId, options.providerId).then(function(result) {
|
getChannelMappingOptions(options.serverId, options.providerId).then(function (result) {
|
||||||
currentMappingOptions = result;
|
currentMappingOptions = result;
|
||||||
var channelsElement = dlg.querySelector(".channels");
|
var channelsElement = dlg.querySelector(".channels");
|
||||||
channelsElement.innerHTML = result.TunerChannels.map(function(channel) {
|
channelsElement.innerHTML = result.TunerChannels.map(function (channel) {
|
||||||
return getTunerChannelHtml(channel, result.ProviderName)
|
return getTunerChannelHtml(channel, result.ProviderName);
|
||||||
}).join(""), channelsElement.addEventListener("click", onChannelsElementClick)
|
}).join("");
|
||||||
})
|
channelsElement.addEventListener("click", onChannelsElementClick);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
var currentMappingOptions, self = this;
|
|
||||||
self.show = function() {
|
var currentMappingOptions;
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.show = function () {
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
removeOnClose: !0
|
removeOnClose: true
|
||||||
};
|
};
|
||||||
dialogOptions.size = "small";
|
dialogOptions.size = "small";
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
dlg.classList.add("formDialog"), dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a");
|
dlg.classList.add("formDialog");
|
||||||
var html = "",
|
dlg.classList.add("ui-body-a");
|
||||||
title = globalize.translate("MapChannels");
|
dlg.classList.add("background-theme-a");
|
||||||
return html += '<div class="formDialogHeader">', html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>', html += '<h3 class="formDialogHeaderTitle">', html += title, html += "</h3>", html += "</div>", html += getEditorHtml(), dlg.innerHTML = html, initEditor(dlg, options), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
var html = "";
|
||||||
dialogHelper.close(dlg)
|
var title = globalize.translate("MapChannels");
|
||||||
}), new Promise(function(resolve, reject) {
|
html += '<div class="formDialogHeader">';
|
||||||
dlg.addEventListener("close", resolve), dialogHelper.open(dlg)
|
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||||
})
|
html += '<h3 class="formDialogHeaderTitle">';
|
||||||
}
|
html += title;
|
||||||
}
|
html += "</h3>";
|
||||||
|
html += "</div>";
|
||||||
|
html += getEditorHtml();
|
||||||
|
dlg.innerHTML = html;
|
||||||
|
initEditor(dlg, options);
|
||||||
|
dlg.querySelector(".btnCancel").addEventListener("click", function () {
|
||||||
|
dialogHelper.close(dlg);
|
||||||
|
});
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
dlg.addEventListener("close", resolve);
|
||||||
|
dialogHelper.open(dlg);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
@ -5,7 +5,7 @@ define(['events'], function (events) {
|
|||||||
//
|
//
|
||||||
// https://github.com/ravisorg/LinkParser
|
// https://github.com/ravisorg/LinkParser
|
||||||
//
|
//
|
||||||
// Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and
|
// Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and
|
||||||
// IPv6, unrecognised TLDs, and more.
|
// IPv6, unrecognised TLDs, and more.
|
||||||
//
|
//
|
||||||
// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
|
// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
|
||||||
@ -14,26 +14,26 @@ define(['events'], function (events) {
|
|||||||
|
|
||||||
// Original URL regex from the Android android.text.util.Linkify function, found here:
|
// Original URL regex from the Android android.text.util.Linkify function, found here:
|
||||||
// http://stackoverflow.com/a/19696443
|
// http://stackoverflow.com/a/19696443
|
||||||
//
|
//
|
||||||
// However there were problems with it, most probably related to the fact it was
|
// However there were problems with it, most probably related to the fact it was
|
||||||
// written in 2007, and it's been highly modified.
|
// written in 2007, and it's been highly modified.
|
||||||
//
|
//
|
||||||
// 1) I didn't like the fact that it was tied to specific TLDs, since new ones
|
// 1) I didn't like the fact that it was tied to specific TLDs, since new ones
|
||||||
// are being added all the time it wouldn't be reasonable to expect developer to
|
// are being added all the time it wouldn't be reasonable to expect developer to
|
||||||
// be continually updating their regular expressions.
|
// be continually updating their regular expressions.
|
||||||
//
|
//
|
||||||
// 2) It didn't allow unicode characters in the domains which are now allowed in
|
// 2) It didn't allow unicode characters in the domains which are now allowed in
|
||||||
// many languages, (including some IDN TLDs). Again these are constantly being
|
// many languages, (including some IDN TLDs). Again these are constantly being
|
||||||
// added to and it doesn't seem reasonable to hard-code them. Note this ended up
|
// added to and it doesn't seem reasonable to hard-code them. Note this ended up
|
||||||
// not being possible in standard JS due to the way it handles multibyte strings.
|
// not being possible in standard JS due to the way it handles multibyte strings.
|
||||||
// It is possible using XRegExp, however a big performance hit results. Disabled
|
// It is possible using XRegExp, however a big performance hit results. Disabled
|
||||||
// for now.
|
// for now.
|
||||||
//
|
//
|
||||||
// 3) It didn't allow for IPv6 hostnames
|
// 3) It didn't allow for IPv6 hostnames
|
||||||
// IPv6 regex from http://stackoverflow.com/a/17871737
|
// IPv6 regex from http://stackoverflow.com/a/17871737
|
||||||
//
|
//
|
||||||
// 4) It was very poorly commented
|
// 4) It was very poorly commented
|
||||||
//
|
//
|
||||||
// 5) It wasn't as smart as it could have been about what should be part of a
|
// 5) It wasn't as smart as it could have been about what should be part of a
|
||||||
// URL and what should be part of human language.
|
// URL and what should be part of human language.
|
||||||
|
|
||||||
@ -102,8 +102,8 @@ define(['events'], function (events) {
|
|||||||
+ "|(?:\\%[a-f0-9]{2})"
|
+ "|(?:\\%[a-f0-9]{2})"
|
||||||
// some characters are much more likely to be used AFTER a url and
|
// some characters are much more likely to be used AFTER a url and
|
||||||
// were not intended to be included in the url itself. Mostly end
|
// were not intended to be included in the url itself. Mostly end
|
||||||
// of sentence type things. It's also likely that the URL would
|
// of sentence type things. It's also likely that the URL would
|
||||||
// still work if any of these characters were missing from the end
|
// still work if any of these characters were missing from the end
|
||||||
// because we parsed it incorrectly. For these characters to be accepted
|
// because we parsed it incorrectly. For these characters to be accepted
|
||||||
// they must be followed by another character that we're reasonably
|
// they must be followed by another character that we're reasonably
|
||||||
// sure is part of the url
|
// sure is part of the url
|
||||||
|
@ -479,8 +479,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||||||
TotalRecordCount: 1
|
TotalRecordCount: 1
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
query.Limit = query.Limit || 100;
|
query.Limit = query.Limit || 100;
|
||||||
query.ExcludeLocationTypes = "Virtual";
|
query.ExcludeLocationTypes = "Virtual";
|
||||||
@ -752,8 +751,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||||||
|
|
||||||
ChromecastPlayer.prototype.volumeDown = function () {
|
ChromecastPlayer.prototype.volumeDown = function () {
|
||||||
var vol = this._castPlayer.session.receiver.volume.level;
|
var vol = this._castPlayer.session.receiver.volume.level;
|
||||||
if (vol == null)
|
if (vol == null) {
|
||||||
{
|
|
||||||
vol = 0.5;
|
vol = 0.5;
|
||||||
}
|
}
|
||||||
vol -= 0.05;
|
vol -= 0.05;
|
||||||
@ -776,8 +774,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||||||
|
|
||||||
ChromecastPlayer.prototype.volumeUp = function () {
|
ChromecastPlayer.prototype.volumeUp = function () {
|
||||||
var vol = this._castPlayer.session.receiver.volume.level;
|
var vol = this._castPlayer.session.receiver.volume.level;
|
||||||
if (vol == null)
|
if (vol == null) {
|
||||||
{
|
|
||||||
vol = 0.5;
|
vol = 0.5;
|
||||||
}
|
}
|
||||||
vol += 0.05;
|
vol += 0.05;
|
||||||
|
@ -51,7 +51,8 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're
|
|||||||
dlg.querySelector('.dialogContentInner').classList.add('hide');
|
dlg.querySelector('.dialogContentInner').classList.add('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
var html = '';
|
var html = '';
|
||||||
var hasDescriptions = false;
|
var hasDescriptions = false;
|
||||||
|
|
||||||
|
@ -18,8 +18,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager',
|
|||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
if (dlg.classList.contains('scrollX')) {
|
if (dlg.classList.contains('scrollX')) {
|
||||||
centerFocus(dlg, true, false);
|
centerFocus(dlg, true, false);
|
||||||
}
|
} else if (dlg.classList.contains('smoothScrollY')) {
|
||||||
else if (dlg.classList.contains('smoothScrollY')) {
|
|
||||||
centerFocus(dlg, false, false);
|
centerFocus(dlg, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,8 +167,8 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager',
|
|||||||
close(dlg);
|
close(dlg);
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function isHistoryEnabled(dlg) {
|
function isHistoryEnabled(dlg) {
|
||||||
@ -433,8 +432,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager',
|
|||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
centerFocus(dlg, true, true);
|
centerFocus(dlg, true, true);
|
||||||
}
|
}
|
||||||
}
|
} else if (options.scrollY !== false) {
|
||||||
else if (options.scrollY !== false) {
|
|
||||||
dlg.classList.add('smoothScrollY');
|
dlg.classList.add('smoothScrollY');
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
|
@ -115,7 +115,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
|
|||||||
var readOnlyAttribute = options.pathReadOnly ? " readonly" : "";
|
var readOnlyAttribute = options.pathReadOnly ? " readonly" : "";
|
||||||
html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + Globalize.translate(labelKey) + '"/>';
|
html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + Globalize.translate(labelKey) + '"/>';
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
if (!readOnlyAttribute) {
|
if (!readOnlyAttribute) {
|
||||||
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="md-icon">search</i></button>';
|
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="md-icon">search</i></button>';
|
||||||
}
|
}
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
@ -188,9 +188,9 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
|
|||||||
var path = lnkPath.getAttribute("data-path");
|
var path = lnkPath.getAttribute("data-path");
|
||||||
if (lnkPath.classList.contains("lnkFile")) {
|
if (lnkPath.classList.contains("lnkFile")) {
|
||||||
content.querySelector("#txtDirectoryPickerPath").value = path;
|
content.querySelector("#txtDirectoryPickerPath").value = path;
|
||||||
} else {
|
} else {
|
||||||
refreshDirectoryBrowser(content, path, fileOptions, true)
|
refreshDirectoryBrowser(content, path, fileOptions, true)
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -254,10 +254,10 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
|
|||||||
var systemInfo = responses[0];
|
var systemInfo = responses[0];
|
||||||
var initialPath = responses[1];
|
var initialPath = responses[1];
|
||||||
var dlg = dialogHelper.createDialog({
|
var dlg = dialogHelper.createDialog({
|
||||||
size: "medium-tall",
|
size: "medium-tall",
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
});
|
});
|
||||||
dlg.classList.add("ui-body-a");
|
dlg.classList.add("ui-body-a");
|
||||||
dlg.classList.add("background-theme-a");
|
dlg.classList.add("background-theme-a");
|
||||||
dlg.classList.add("directoryPicker");
|
dlg.classList.add("directoryPicker");
|
||||||
|
@ -68,7 +68,9 @@ define([], function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
window.addEventListener("test", null, opts);
|
window.addEventListener("test", null, opts);
|
||||||
} catch (e) { }
|
} catch (e) {
|
||||||
|
console.log('error checking capture support');
|
||||||
|
}
|
||||||
|
|
||||||
function addEventListenerWithOptions(target, type, handler, options) {
|
function addEventListenerWithOptions(target, type, handler, options) {
|
||||||
var optionsOrCapture = options;
|
var optionsOrCapture = options;
|
||||||
@ -116,8 +118,8 @@ define([], function () {
|
|||||||
return _animationEvent;
|
return _animationEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
var t,
|
var t;
|
||||||
el = document.createElement("div");
|
var el = document.createElement("div");
|
||||||
var animations = {
|
var animations = {
|
||||||
"animation": "animationend",
|
"animation": "animationend",
|
||||||
"OAnimation": "oAnimationEnd",
|
"OAnimation": "oAnimationEnd",
|
||||||
@ -146,8 +148,8 @@ define([], function () {
|
|||||||
return _transitionEvent;
|
return _transitionEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
var t,
|
var t;
|
||||||
el = document.createElement("div");
|
var el = document.createElement("div");
|
||||||
var transitions = {
|
var transitions = {
|
||||||
"transition": "transitionend",
|
"transition": "transitionend",
|
||||||
"OTransition": "oTransitionEnd",
|
"OTransition": "oTransitionEnd",
|
||||||
|
@ -28,11 +28,12 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement'
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmbyInputPrototype.createdCallback = function () {
|
EmbyInputPrototype.createdCallback = function () {
|
||||||
|
|
||||||
if (!this.id) {
|
if (!this.id) {
|
||||||
this.id = 'embyinput' + inputId;
|
this.id = 'embyinput' + inputId;
|
||||||
inputId++;
|
inputId++;
|
||||||
} if (this.classList.contains('emby-input')) {
|
}
|
||||||
|
|
||||||
|
if (this.classList.contains('emby-input')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +47,7 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ
|
|||||||
this.querySelector('.animate-25-50-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-25-50-b').style.transform = 'rotate(-90deg)';
|
||||||
this.querySelector('.animate-50-75-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-50-75-b').style.transform = 'rotate(-90deg)';
|
||||||
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
||||||
}
|
} else if (progress >= 25 && progress < 50) {
|
||||||
else if (progress >= 25 && progress < 50) {
|
|
||||||
|
|
||||||
angle = -90 + ((progress - 25) / 100) * 360;
|
angle = -90 + ((progress - 25) / 100) * 360;
|
||||||
|
|
||||||
@ -57,8 +56,7 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ
|
|||||||
|
|
||||||
this.querySelector('.animate-50-75-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-50-75-b').style.transform = 'rotate(-90deg)';
|
||||||
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
||||||
}
|
} else if (progress >= 50 && progress < 75) {
|
||||||
else if (progress >= 50 && progress < 75) {
|
|
||||||
angle = -90 + ((progress - 50) / 100) * 360;
|
angle = -90 + ((progress - 50) / 100) * 360;
|
||||||
|
|
||||||
this.querySelector('.animate-0-25-b').style.transform = 'none';
|
this.querySelector('.animate-0-25-b').style.transform = 'none';
|
||||||
@ -66,8 +64,7 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ
|
|||||||
this.querySelector('.animate-50-75-b').style.transform = 'rotate(' + angle + 'deg)';
|
this.querySelector('.animate-50-75-b').style.transform = 'rotate(' + angle + 'deg)';
|
||||||
|
|
||||||
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
this.querySelector('.animate-75-100-b').style.transform = 'rotate(-90deg)';
|
||||||
}
|
} else if (progress >= 75 && progress <= 100) {
|
||||||
else if (progress >= 75 && progress <= 100) {
|
|
||||||
angle = -90 + ((progress - 75) / 100) * 360;
|
angle = -90 + ((progress - 75) / 100) * 360;
|
||||||
|
|
||||||
this.querySelector('.animate-0-25-b').style.transform = 'none';
|
this.querySelector('.animate-0-25-b').style.transform = 'none';
|
||||||
@ -85,7 +82,6 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ
|
|||||||
|
|
||||||
EmbyProgressRing.detachedCallback = function () {
|
EmbyProgressRing.detachedCallback = function () {
|
||||||
|
|
||||||
|
|
||||||
var observer = this.observer;
|
var observer = this.observer;
|
||||||
|
|
||||||
if (observer) {
|
if (observer) {
|
||||||
|
@ -7,6 +7,17 @@
|
|||||||
margin-right: 3.3%;
|
margin-right: 3.3%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* align first card in scroller to heading */
|
||||||
|
.emby-scroller .card:first-of-type > .cardBox {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* align heading for normal item containers */
|
||||||
|
/* still not ideal solution but better than the last method */
|
||||||
|
.verticalSection > .itemsContainer .cardBox {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
@media all and (max-width:50em) {
|
@media all and (max-width:50em) {
|
||||||
.emby-scroller {
|
.emby-scroller {
|
||||||
padding-left: 3.3%;
|
padding-left: 3.3%;
|
||||||
|
@ -87,6 +87,10 @@ _:-ms-input-placeholder {
|
|||||||
transform: scale(1.6);
|
transform: scale(1.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mdl-slider.show-focus:focus::-webkit-slider-thumb {
|
||||||
|
transform: scale(1.6);
|
||||||
|
}
|
||||||
|
|
||||||
.slider-no-webkit-thumb::-webkit-slider-thumb {
|
.slider-no-webkit-thumb::-webkit-slider-thumb {
|
||||||
opacity: 0 !important;
|
opacity: 0 !important;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,11 @@ define(['browser', 'dom', 'layoutManager', 'css!./emby-slider', 'registerElement
|
|||||||
|
|
||||||
function updateValues() {
|
function updateValues() {
|
||||||
|
|
||||||
|
// Do not update values when dragging with keyboard to keep current progress for reference
|
||||||
|
if (!!this.keyboardDragging) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var range = this;
|
var range = this;
|
||||||
var value = range.value;
|
var value = range.value;
|
||||||
|
|
||||||
@ -82,6 +87,9 @@ define(['browser', 'dom', 'layoutManager', 'css!./emby-slider', 'registerElement
|
|||||||
if (!layoutManager.mobile) {
|
if (!layoutManager.mobile) {
|
||||||
this.classList.add('mdl-slider-hoverthumb');
|
this.classList.add('mdl-slider-hoverthumb');
|
||||||
}
|
}
|
||||||
|
if (layoutManager.tv) {
|
||||||
|
this.classList.add('show-focus');
|
||||||
|
}
|
||||||
|
|
||||||
var containerElement = this.parentNode;
|
var containerElement = this.parentNode;
|
||||||
containerElement.classList.add('mdl-slider-container');
|
containerElement.classList.add('mdl-slider-container');
|
||||||
@ -177,6 +185,108 @@ define(['browser', 'dom', 'layoutManager', 'css!./emby-slider', 'registerElement
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keyboard dragging timeout.
|
||||||
|
* After this delay "change" event will be fired.
|
||||||
|
*/
|
||||||
|
var KeyboardDraggingTimeout = 1000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keyboard dragging timer.
|
||||||
|
*/
|
||||||
|
var keyboardDraggingTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start keyboard dragging.
|
||||||
|
*
|
||||||
|
* @param {Object} elem slider itself
|
||||||
|
*/
|
||||||
|
function startKeyboardDragging(elem) {
|
||||||
|
elem.keyboardDragging = true;
|
||||||
|
|
||||||
|
clearTimeout(keyboardDraggingTimer);
|
||||||
|
keyboardDraggingTimer = setTimeout(function () {
|
||||||
|
finishKeyboardDragging(elem);
|
||||||
|
}, KeyboardDraggingTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finish keyboard dragging.
|
||||||
|
*
|
||||||
|
* @param {Object} elem slider itself
|
||||||
|
*/
|
||||||
|
function finishKeyboardDragging(elem) {
|
||||||
|
clearTimeout(keyboardDraggingTimer);
|
||||||
|
keyboardDraggingTimer = undefined;
|
||||||
|
|
||||||
|
elem.keyboardDragging = false;
|
||||||
|
|
||||||
|
var event = new Event('change', {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: false
|
||||||
|
});
|
||||||
|
elem.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do step by delta.
|
||||||
|
*
|
||||||
|
* @param {Object} elem slider itself
|
||||||
|
* @param {number} delta step amount
|
||||||
|
*/
|
||||||
|
function stepKeyboard(elem, delta) {
|
||||||
|
startKeyboardDragging(elem);
|
||||||
|
|
||||||
|
elem.value = Math.max(elem.min, Math.min(elem.max, parseFloat(elem.value) + delta));
|
||||||
|
|
||||||
|
var event = new Event('input', {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: false
|
||||||
|
});
|
||||||
|
elem.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle KeyDown event
|
||||||
|
*/
|
||||||
|
function onKeyDown(e) {
|
||||||
|
switch (e.key) {
|
||||||
|
case 'ArrowLeft':
|
||||||
|
case 'Left':
|
||||||
|
stepKeyboard(this, -this.keyboardStepDown || -1);
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
break;
|
||||||
|
case 'ArrowRight':
|
||||||
|
case 'Right':
|
||||||
|
stepKeyboard(this, this.keyboardStepUp || 1);
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable keyboard dragging.
|
||||||
|
*/
|
||||||
|
EmbySliderPrototype.enableKeyboardDragging = function () {
|
||||||
|
if (!this.keyboardDraggingEnabled) {
|
||||||
|
this.addEventListener('keydown', onKeyDown);
|
||||||
|
this.keyboardDraggingEnabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set steps for keyboard input.
|
||||||
|
*
|
||||||
|
* @param {number} stepDown step to reduce
|
||||||
|
* @param {number} stepUp step to increase
|
||||||
|
*/
|
||||||
|
EmbySliderPrototype.setKeyboardSteps = function (stepDown, stepUp) {
|
||||||
|
this.keyboardStepDown = stepDown || stepUp || 1;
|
||||||
|
this.keyboardStepUp = stepUp || stepDown || 1;
|
||||||
|
}
|
||||||
|
|
||||||
function setRange(elem, startPercent, endPercent) {
|
function setRange(elem, startPercent, endPercent) {
|
||||||
|
|
||||||
var style = elem.style;
|
var style = elem.style;
|
||||||
|
@ -10,23 +10,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
|||||||
newButton.classList.add(activeButtonClass);
|
newButton.classList.add(activeButtonClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFocusCallback(tabs, e) {
|
|
||||||
return function () {
|
|
||||||
onClick.call(tabs, e);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function onFocus(e) {
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
|
|
||||||
if (this.focusTimeout) {
|
|
||||||
clearTimeout(this.focusTimeout);
|
|
||||||
}
|
|
||||||
this.focusTimeout = setTimeout(getFocusCallback(this, e), 700);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTabPanel(tabs, index) {
|
function getTabPanel(tabs, index) {
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -87,10 +70,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
|||||||
|
|
||||||
function onClick(e) {
|
function onClick(e) {
|
||||||
|
|
||||||
if (this.focusTimeout) {
|
|
||||||
clearTimeout(this.focusTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
var tabs = this;
|
var tabs = this;
|
||||||
|
|
||||||
var current = tabs.querySelector('.' + activeButtonClass);
|
var current = tabs.querySelector('.' + activeButtonClass);
|
||||||
@ -163,7 +142,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
|||||||
tabs.classList.add('scrollX');
|
tabs.classList.add('scrollX');
|
||||||
tabs.classList.add('hiddenScrollX');
|
tabs.classList.add('hiddenScrollX');
|
||||||
tabs.classList.add('smoothScrollX');
|
tabs.classList.add('smoothScrollX');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EmbyTabs.createdCallback = function () {
|
EmbyTabs.createdCallback = function () {
|
||||||
@ -177,10 +156,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
|||||||
dom.addEventListener(this, 'click', onClick, {
|
dom.addEventListener(this, 'click', onClick, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(this, 'focus', onFocus, {
|
|
||||||
passive: true,
|
|
||||||
capture: true
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EmbyTabs.focus = function () {
|
EmbyTabs.focus = function () {
|
||||||
@ -237,10 +212,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
|||||||
dom.removeEventListener(this, 'click', onClick, {
|
dom.removeEventListener(this, 'click', onClick, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(this, 'focus', onFocus, {
|
|
||||||
passive: true,
|
|
||||||
capture: true
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function getSelectedTabButton(elem) {
|
function getSelectedTabButton(elem) {
|
||||||
|
@ -14,9 +14,9 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e
|
|||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
self.getOffset = function (textarea) {
|
self.getOffset = function (textarea) {
|
||||||
var style = window.getComputedStyle(textarea, null),
|
var style = window.getComputedStyle(textarea, null);
|
||||||
props = ['paddingTop', 'paddingBottom'],
|
var props = ['paddingTop', 'paddingBottom'];
|
||||||
offset = 0;
|
var offset = 0;
|
||||||
|
|
||||||
for (var i = 0; i < props.length; i++) {
|
for (var i = 0; i < props.length; i++) {
|
||||||
offset += parseInt(style[props[i]]);
|
offset += parseInt(style[props[i]]);
|
||||||
@ -43,13 +43,13 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e
|
|||||||
textarea.rows = 3;
|
textarea.rows = 3;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var newHeight = 0, hasGrown = false;
|
var newHeight = 0;
|
||||||
|
var hasGrown = false;
|
||||||
|
|
||||||
if ((textarea.scrollHeight - offset) > self.maxAllowedHeight) {
|
if ((textarea.scrollHeight - offset) > self.maxAllowedHeight) {
|
||||||
textarea.style.overflowY = 'scroll';
|
textarea.style.overflowY = 'scroll';
|
||||||
newHeight = self.maxAllowedHeight;
|
newHeight = self.maxAllowedHeight;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
textarea.style.overflowY = 'hidden';
|
textarea.style.overflowY = 'hidden';
|
||||||
textarea.style.height = 'auto';
|
textarea.style.height = 'auto';
|
||||||
newHeight = textarea.scrollHeight/* - offset*/;
|
newHeight = textarea.scrollHeight/* - offset*/;
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoader", "globalize", "layoutManager", "scrollStyles", "emby-itemscontainer"], function(loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
|
define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoader", "globalize", "layoutManager", "scrollStyles", "emby-itemscontainer"], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function enableScrollX() {
|
function enableScrollX() {
|
||||||
return !layoutManager.desktop
|
return !layoutManager.desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getThumbShape() {
|
function getThumbShape() {
|
||||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPosterShape() {
|
function getPosterShape() {
|
||||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSquareShape() {
|
function getSquareShape() {
|
||||||
return enableScrollX() ? "overflowSquare" : "square"
|
return enableScrollX() ? "overflowSquare" : "square";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSections() {
|
function getSections() {
|
||||||
@ -23,147 +23,208 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad
|
|||||||
types: "Movie",
|
types: "Movie",
|
||||||
id: "favoriteMovies",
|
id: "favoriteMovies",
|
||||||
shape: getPosterShape(),
|
shape: getPosterShape(),
|
||||||
showTitle: !1,
|
showTitle: false,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteShows",
|
name: "HeaderFavoriteShows",
|
||||||
types: "Series",
|
types: "Series",
|
||||||
id: "favoriteShows",
|
id: "favoriteShows",
|
||||||
shape: getPosterShape(),
|
shape: getPosterShape(),
|
||||||
showTitle: !1,
|
showTitle: false,
|
||||||
overlayPlayButton: !0
|
overlayPlayButton: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteEpisodes",
|
name: "HeaderFavoriteEpisodes",
|
||||||
types: "Episode",
|
types: "Episode",
|
||||||
id: "favoriteEpisode",
|
id: "favoriteEpisode",
|
||||||
shape: getThumbShape(),
|
shape: getThumbShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
centerText: !0
|
centerText: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteVideos",
|
name: "HeaderFavoriteVideos",
|
||||||
types: "Video,MusicVideo",
|
types: "Video,MusicVideo",
|
||||||
id: "favoriteVideos",
|
id: "favoriteVideos",
|
||||||
shape: getThumbShape(),
|
shape: getThumbShape(),
|
||||||
preferThumb: !0,
|
preferThumb: true,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
centerText: !0
|
centerText: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteArtists",
|
name: "HeaderFavoriteArtists",
|
||||||
types: "MusicArtist",
|
types: "MusicArtist",
|
||||||
id: "favoriteArtists",
|
id: "favoriteArtists",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !1,
|
showParentTitle: false,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteAlbums",
|
name: "HeaderFavoriteAlbums",
|
||||||
types: "MusicAlbum",
|
types: "MusicAlbum",
|
||||||
id: "favoriteAlbums",
|
id: "favoriteAlbums",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayPlayButton: !0,
|
overlayPlayButton: true,
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}, {
|
}, {
|
||||||
name: "HeaderFavoriteSongs",
|
name: "HeaderFavoriteSongs",
|
||||||
types: "Audio",
|
types: "Audio",
|
||||||
id: "favoriteSongs",
|
id: "favoriteSongs",
|
||||||
shape: getSquareShape(),
|
shape: getSquareShape(),
|
||||||
preferThumb: !1,
|
preferThumb: false,
|
||||||
showTitle: !0,
|
showTitle: true,
|
||||||
overlayText: !1,
|
overlayText: false,
|
||||||
showParentTitle: !0,
|
showParentTitle: true,
|
||||||
centerText: !0,
|
centerText: true,
|
||||||
overlayMoreButton: !0,
|
overlayMoreButton: true,
|
||||||
action: "instantmix",
|
action: "instantmix",
|
||||||
coverImage: !0
|
coverImage: true
|
||||||
}]
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
||||||
var screenWidth = dom.getWindowSize().innerWidth,
|
var screenWidth = dom.getWindowSize().innerWidth;
|
||||||
options = {
|
var options = {
|
||||||
SortBy: "SortName",
|
SortBy: "SortName",
|
||||||
SortOrder: "Ascending",
|
SortOrder: "Ascending",
|
||||||
Filters: "IsFavorite",
|
Filters: "IsFavorite",
|
||||||
Recursive: !0,
|
Recursive: true,
|
||||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||||
CollapseBoxSetItems: !1,
|
CollapseBoxSetItems: false,
|
||||||
ExcludeLocationTypes: "Virtual",
|
ExcludeLocationTypes: "Virtual",
|
||||||
EnableTotalRecordCount: !1
|
EnableTotalRecordCount: false
|
||||||
};
|
};
|
||||||
topParentId && (options.ParentId = topParentId), isSingleSection || (options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6, enableScrollX() && (options.Limit = 20));
|
|
||||||
|
if (topParentId) {
|
||||||
|
options.ParentId = topParentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isSingleSection) {
|
||||||
|
options.Limit = screenWidth >= 1920 ? 10 : screenWidth >= 1440 ? 8 : 6;
|
||||||
|
|
||||||
|
if (enableScrollX()) {
|
||||||
|
options.Limit = 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var promise;
|
var promise;
|
||||||
return "MusicArtist" === section.types ? promise = ApiClient.getArtists(userId, options) : (options.IncludeItemTypes = section.types, promise = ApiClient.getItems(userId, options)), promise.then(function(result) {
|
|
||||||
|
if ("MusicArtist" === section.types) {
|
||||||
|
promise = ApiClient.getArtists(userId, options);
|
||||||
|
} else {
|
||||||
|
options.IncludeItemTypes = section.types;
|
||||||
|
promise = ApiClient.getItems(userId, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
return promise.then(function (result) {
|
||||||
var html = "";
|
var html = "";
|
||||||
|
|
||||||
if (result.Items.length) {
|
if (result.Items.length) {
|
||||||
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
|
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
|
||||||
html += '<a is="emby-linkbutton" href="' + ("list.html?serverId=" + ApiClient.serverId() + "&type=" + section.types + "&IsFavorite=true") + '" class="more button-flat button-flat-mini sectionTitleTextButton">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += globalize.translate(section.name), html += "</h2>", html += '<i class="md-icon"></i>', html += "</a>"
|
html += '<a is="emby-linkbutton" href="' + ("list.html?serverId=" + ApiClient.serverId() + "&type=" + section.types + "&IsFavorite=true") + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
|
||||||
} else html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate(section.name) + "</h2>";
|
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||||
if (html += "</div>", enableScrollX()) {
|
html += globalize.translate(section.name);
|
||||||
|
html += "</h2>";
|
||||||
|
html += '<i class="md-icon"></i>';
|
||||||
|
html += "</a>";
|
||||||
|
} else {
|
||||||
|
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate(section.name) + "</h2>";
|
||||||
|
}
|
||||||
|
|
||||||
|
html += "</div>";
|
||||||
|
if (enableScrollX()) {
|
||||||
var scrollXClass = "scrollX hiddenScrollX";
|
var scrollXClass = "scrollX hiddenScrollX";
|
||||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
|
if (layoutManager.tv) {
|
||||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
scrollXClass += " smoothScrollX";
|
||||||
var supportsImageAnalysis = appHost.supports("imageanalysis"),
|
}
|
||||||
cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle;
|
|
||||||
cardLayout = !1, html += cardBuilder.getCardsHtml(result.Items, {
|
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
|
||||||
|
} else {
|
||||||
|
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||||
|
}
|
||||||
|
|
||||||
|
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||||
|
var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle;
|
||||||
|
cardLayout = false;
|
||||||
|
html += cardBuilder.getCardsHtml(result.Items, {
|
||||||
preferThumb: section.preferThumb,
|
preferThumb: section.preferThumb,
|
||||||
shape: section.shape,
|
shape: section.shape,
|
||||||
centerText: section.centerText && !cardLayout,
|
centerText: section.centerText && !cardLayout,
|
||||||
overlayText: !1 !== section.overlayText,
|
overlayText: false !== section.overlayText,
|
||||||
showTitle: section.showTitle,
|
showTitle: section.showTitle,
|
||||||
showParentTitle: section.showParentTitle,
|
showParentTitle: section.showParentTitle,
|
||||||
scalable: !0,
|
scalable: true,
|
||||||
coverImage: section.coverImage,
|
coverImage: section.coverImage,
|
||||||
overlayPlayButton: section.overlayPlayButton,
|
overlayPlayButton: section.overlayPlayButton,
|
||||||
overlayMoreButton: section.overlayMoreButton && !cardLayout,
|
overlayMoreButton: section.overlayMoreButton && !cardLayout,
|
||||||
action: section.action,
|
action: section.action,
|
||||||
allowBottomPadding: !enableScrollX(),
|
allowBottomPadding: !enableScrollX(),
|
||||||
cardLayout: cardLayout
|
cardLayout: cardLayout
|
||||||
}), html += "</div>"
|
});
|
||||||
|
html += "</div>";
|
||||||
}
|
}
|
||||||
elem.innerHTML = html, imageLoader.lazyChildren(elem)
|
|
||||||
})
|
elem.innerHTML = html;
|
||||||
|
imageLoader.lazyChildren(elem);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSections(page, userId, topParentId, types) {
|
function loadSections(page, userId, topParentId, types) {
|
||||||
loading.show();
|
loading.show();
|
||||||
var sections = getSections(),
|
var sections = getSections();
|
||||||
sectionid = getParameterByName("sectionid");
|
var sectionid = getParameterByName("sectionid");
|
||||||
sectionid && (sections = sections.filter(function(s) {
|
|
||||||
return s.id === sectionid
|
if (sectionid) {
|
||||||
})), types && (sections = sections.filter(function(s) {
|
sections = sections.filter(function (s) {
|
||||||
return -1 !== types.indexOf(s.id)
|
return s.id === sectionid;
|
||||||
}));
|
});
|
||||||
var i, length, elem = page.querySelector(".favoriteSections");
|
}
|
||||||
|
|
||||||
|
if (types) {
|
||||||
|
sections = sections.filter(function (s) {
|
||||||
|
return -1 !== types.indexOf(s.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var i;
|
||||||
|
var length;
|
||||||
|
var elem = page.querySelector(".favoriteSections");
|
||||||
|
|
||||||
if (!elem.innerHTML) {
|
if (!elem.innerHTML) {
|
||||||
var html = "";
|
var html = "";
|
||||||
for (i = 0, length = sections.length; i < length; i++) html += '<div class="verticalSection section' + sections[i].id + '"></div>';
|
|
||||||
elem.innerHTML = html
|
for (i = 0, length = sections.length; i < length; i++) {
|
||||||
|
html += '<div class="verticalSection section' + sections[i].id + '"></div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
var promises = [];
|
var promises = [];
|
||||||
|
|
||||||
for (i = 0, length = sections.length; i < length; i++) {
|
for (i = 0, length = sections.length; i < length; i++) {
|
||||||
var section = sections[i];
|
var section = sections[i];
|
||||||
elem = page.querySelector(".section" + section.id), promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length))
|
elem = page.querySelector(".section" + section.id);
|
||||||
|
promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length));
|
||||||
}
|
}
|
||||||
Promise.all(promises).then(function() {
|
|
||||||
loading.hide()
|
Promise.all(promises).then(function () {
|
||||||
})
|
loading.hide();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
render: loadSections
|
render: loadSections
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
@ -94,7 +94,8 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
|
|||||||
context.querySelector('form').addEventListener('submit', onSubmit);
|
context.querySelector('form').addEventListener('submit', onSubmit);
|
||||||
|
|
||||||
var elems = context.querySelectorAll('.simpleFilter');
|
var elems = context.querySelectorAll('.simpleFilter');
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
for (i = 0, length = elems.length; i < length; i++) {
|
||||||
|
|
||||||
@ -137,7 +138,8 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
|
|||||||
function saveValues(context, settings, settingsKey) {
|
function saveValues(context, settings, settingsKey) {
|
||||||
|
|
||||||
var elems = context.querySelectorAll('.simpleFilter');
|
var elems = context.querySelectorAll('.simpleFilter');
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
for (i = 0, length = elems.length; i < length; i++) {
|
||||||
|
|
||||||
if (elems[i].tagName === 'INPUT') {
|
if (elems[i].tagName === 'INPUT') {
|
||||||
|
@ -99,7 +99,7 @@ define(['dom'], function (dom) {
|
|||||||
return normalizeFocusable(elem, originalElement);
|
return normalizeFocusable(elem, originalElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determines if a focusable element can be focused at a given point in time
|
// Determines if a focusable element can be focused at a given point in time
|
||||||
function isCurrentlyFocusableInternal(elem) {
|
function isCurrentlyFocusableInternal(elem) {
|
||||||
|
|
||||||
// http://stackoverflow.com/questions/19669786/check-if-element-is-visible-in-dom
|
// http://stackoverflow.com/questions/19669786/check-if-element-is-visible-in-dom
|
||||||
@ -110,7 +110,7 @@ define(['dom'], function (dom) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determines if a focusable element can be focused at a given point in time
|
// Determines if a focusable element can be focused at a given point in time
|
||||||
function isCurrentlyFocusable(elem) {
|
function isCurrentlyFocusable(elem) {
|
||||||
|
|
||||||
if (elem.disabled) {
|
if (elem.disabled) {
|
||||||
@ -181,21 +181,18 @@ define(['dom'], function (dom) {
|
|||||||
if (classList.contains('focuscontainer-left')) {
|
if (classList.contains('focuscontainer-left')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} else if (direction === 1) {
|
||||||
else if (direction === 1) {
|
|
||||||
if (classList.contains('focuscontainer-x')) {
|
if (classList.contains('focuscontainer-x')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (classList.contains('focuscontainer-right')) {
|
if (classList.contains('focuscontainer-right')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} else if (direction === 2) {
|
||||||
else if (direction === 2) {
|
|
||||||
if (classList.contains('focuscontainer-y')) {
|
if (classList.contains('focuscontainer-y')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} else if (direction === 3) {
|
||||||
else if (direction === 3) {
|
|
||||||
if (classList.contains('focuscontainer-y')) {
|
if (classList.contains('focuscontainer-y')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -275,14 +272,14 @@ define(['dom'], function (dom) {
|
|||||||
var rect = getOffset(activeElement);
|
var rect = getOffset(activeElement);
|
||||||
|
|
||||||
// Get elements and work out x/y points
|
// Get elements and work out x/y points
|
||||||
var cache = [],
|
var cache = [];
|
||||||
point1x = parseFloat(rect.left) || 0,
|
var point1x = parseFloat(rect.left) || 0;
|
||||||
point1y = parseFloat(rect.top) || 0,
|
var point1y = parseFloat(rect.top) || 0;
|
||||||
point2x = parseFloat(point1x + rect.width - 1) || point1x,
|
var point2x = parseFloat(point1x + rect.width - 1) || point1x;
|
||||||
point2y = parseFloat(point1y + rect.height - 1) || point1y,
|
var point2y = parseFloat(point1y + rect.height - 1) || point1y;
|
||||||
// Shortcuts to help with compression
|
// Shortcuts to help with compression
|
||||||
min = Math.min,
|
var min = Math.min;
|
||||||
max = Math.max;
|
var max = Math.max;
|
||||||
|
|
||||||
var sourceMidX = rect.left + (rect.width / 2);
|
var sourceMidX = rect.left + (rect.width / 2);
|
||||||
var sourceMidY = rect.top + (rect.height / 2);
|
var sourceMidY = rect.top + (rect.height / 2);
|
||||||
@ -357,10 +354,10 @@ define(['dom'], function (dom) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var x = elementRect.left,
|
var x = elementRect.left;
|
||||||
y = elementRect.top,
|
var y = elementRect.top;
|
||||||
x2 = x + elementRect.width - 1,
|
var x2 = x + elementRect.width - 1;
|
||||||
y2 = y + elementRect.height - 1;
|
var y2 = y + elementRect.height - 1;
|
||||||
|
|
||||||
var intersectX = intersects(point1x, point2x, x, x2);
|
var intersectX = intersects(point1x, point2x, x, x2);
|
||||||
var intersectY = intersects(point1y, point2y, y, y2);
|
var intersectY = intersects(point1y, point2y, y, y2);
|
||||||
@ -470,7 +467,9 @@ define(['dom'], function (dom) {
|
|||||||
|
|
||||||
var elems = container.querySelectorAll(focusableSelector);
|
var elems = container.querySelectorAll(focusableSelector);
|
||||||
var list = [];
|
var list = [];
|
||||||
var i, length, elem;
|
var i;
|
||||||
|
var length;
|
||||||
|
var elem;
|
||||||
|
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
for (i = 0, length = elems.length; i < length; i++) {
|
||||||
|
|
||||||
@ -513,32 +512,24 @@ define(['dom'], function (dom) {
|
|||||||
focusableParent: focusableParent,
|
focusableParent: focusableParent,
|
||||||
getFocusableElements: getFocusableElements,
|
getFocusableElements: getFocusableElements,
|
||||||
moveLeft: function (sourceElement, options) {
|
moveLeft: function (sourceElement, options) {
|
||||||
|
|
||||||
var container = options ? options.container : null;
|
var container = options ? options.container : null;
|
||||||
var focusableElements = options ? options.focusableElements : null;
|
var focusableElements = options ? options.focusableElements : null;
|
||||||
nav(sourceElement, 0, container, focusableElements);
|
nav(sourceElement, 0, container, focusableElements);
|
||||||
|
|
||||||
},
|
},
|
||||||
moveRight: function (sourceElement, options) {
|
moveRight: function (sourceElement, options) {
|
||||||
|
|
||||||
var container = options ? options.container : null;
|
var container = options ? options.container : null;
|
||||||
var focusableElements = options ? options.focusableElements : null;
|
var focusableElements = options ? options.focusableElements : null;
|
||||||
nav(sourceElement, 1, container, focusableElements);
|
nav(sourceElement, 1, container, focusableElements);
|
||||||
|
|
||||||
},
|
},
|
||||||
moveUp: function (sourceElement, options) {
|
moveUp: function (sourceElement, options) {
|
||||||
|
|
||||||
var container = options ? options.container : null;
|
var container = options ? options.container : null;
|
||||||
var focusableElements = options ? options.focusableElements : null;
|
var focusableElements = options ? options.focusableElements : null;
|
||||||
nav(sourceElement, 2, container, focusableElements);
|
nav(sourceElement, 2, container, focusableElements);
|
||||||
|
|
||||||
},
|
},
|
||||||
moveDown: function (sourceElement, options) {
|
moveDown: function (sourceElement, options) {
|
||||||
|
|
||||||
var container = options ? options.container : null;
|
var container = options ? options.container : null;
|
||||||
var focusableElements = options ? options.focusableElements : null;
|
var focusableElements = options ? options.focusableElements : null;
|
||||||
nav(sourceElement, 3, container, focusableElements);
|
nav(sourceElement, 3, container, focusableElements);
|
||||||
|
|
||||||
},
|
},
|
||||||
sendText: sendText,
|
sendText: sendText,
|
||||||
isCurrentlyFocusable: isCurrentlyFocusable,
|
isCurrentlyFocusable: isCurrentlyFocusable,
|
||||||
|
@ -55,7 +55,7 @@ define(['events', 'dom', 'apphost', 'browser'], function (events, dom, appHost,
|
|||||||
return document.fullscreen ||
|
return document.fullscreen ||
|
||||||
document.mozFullScreen ||
|
document.mozFullScreen ||
|
||||||
document.webkitIsFullScreen ||
|
document.webkitIsFullScreen ||
|
||||||
document.msFullscreenElement || /* IE/Edge syntax */
|
document.msFullscreenElement || /* IE/Edge syntax */
|
||||||
document.fullscreenElement || /* Standard syntax */
|
document.fullscreenElement || /* Standard syntax */
|
||||||
document.webkitFullscreenElement || /* Chrome, Safari and Opera syntax */
|
document.webkitFullscreenElement || /* Chrome, Safari and Opera syntax */
|
||||||
document.mozFullScreenElement; /* Firefox syntax */
|
document.mozFullScreenElement; /* Firefox syntax */
|
||||||
|
@ -1,32 +1,45 @@
|
|||||||
define(["dom", "appRouter", "connectionManager"], function(dom, appRouter, connectionManager) {
|
define(["dom", "appRouter", "connectionManager"], function (dom, appRouter, connectionManager) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function onGroupedCardClick(e, card) {
|
function onGroupedCardClick(e, card) {
|
||||||
var itemId = card.getAttribute("data-id"),
|
var itemId = card.getAttribute("data-id");
|
||||||
serverId = card.getAttribute("data-serverid"),
|
var serverId = card.getAttribute("data-serverid");
|
||||||
apiClient = connectionManager.getApiClient(serverId),
|
var apiClient = connectionManager.getApiClient(serverId);
|
||||||
userId = apiClient.getCurrentUserId(),
|
var userId = apiClient.getCurrentUserId();
|
||||||
playedIndicator = card.querySelector(".playedIndicator"),
|
var playedIndicator = card.querySelector(".playedIndicator");
|
||||||
playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null,
|
var playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null;
|
||||||
options = {
|
var options = {
|
||||||
Limit: parseInt(playedIndicatorHtml || "10"),
|
Limit: parseInt(playedIndicatorHtml || "10"),
|
||||||
Fields: "PrimaryImageAspectRatio,DateCreated",
|
Fields: "PrimaryImageAspectRatio,DateCreated",
|
||||||
ParentId: itemId,
|
ParentId: itemId,
|
||||||
GroupItems: !1
|
GroupItems: false
|
||||||
},
|
};
|
||||||
actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]);
|
var actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]);
|
||||||
if (!actionableParent || actionableParent.classList.contains("cardContent")) return apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
|
||||||
if (1 === items.length) return void appRouter.showItem(items[0]);
|
if (!actionableParent || actionableParent.classList.contains("cardContent")) {
|
||||||
var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId;
|
apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
|
||||||
Dashboard.navigate(url)
|
if (1 === items.length) {
|
||||||
}), e.stopPropagation(), e.preventDefault(), !1
|
return void appRouter.showItem(items[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId;
|
||||||
|
Dashboard.navigate(url);
|
||||||
|
});
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onItemsContainerClick(e) {
|
function onItemsContainerClick(e) {
|
||||||
var groupedCard = dom.parentWithClass(e.target, "groupedCard");
|
var groupedCard = dom.parentWithClass(e.target, "groupedCard");
|
||||||
groupedCard && onGroupedCardClick(e, groupedCard)
|
|
||||||
|
if (groupedCard) {
|
||||||
|
onGroupedCardClick(e, groupedCard);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
onItemsContainerClick: onItemsContainerClick
|
onItemsContainerClick: onItemsContainerClick
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
@ -39,7 +39,8 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio
|
|||||||
|
|
||||||
function save(context) {
|
function save(context) {
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
||||||
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
||||||
@ -62,7 +63,8 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio
|
|||||||
|
|
||||||
function load(context) {
|
function load(context) {
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
||||||
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
||||||
|
@ -277,7 +277,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
var nextDay = new Date(date.getTime() + msPerDay - 2000);
|
var nextDay = new Date(date.getTime() + msPerDay - 2000);
|
||||||
|
|
||||||
// Normally we'd want to just let responsive css handle this,
|
// Normally we'd want to just let responsive css handle this,
|
||||||
// but since mobile browsers are often underpowered,
|
// but since mobile browsers are often underpowered,
|
||||||
// it can help performance to get them out of the markup
|
// it can help performance to get them out of the markup
|
||||||
var allowIndicators = dom.getWindowSize().innerWidth >= 600;
|
var allowIndicators = dom.getWindowSize().innerWidth >= 600;
|
||||||
|
|
||||||
@ -392,27 +392,20 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parseDates(program) {
|
function parseDates(program) {
|
||||||
|
|
||||||
if (!program.StartDateLocal) {
|
if (!program.StartDateLocal) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true });
|
program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true });
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
console.log('error parsing timestamp for start date');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!program.EndDateLocal) {
|
if (!program.EndDateLocal) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true });
|
program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true });
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
console.log('error parsing timestamp for end date');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -424,16 +417,13 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
|
|
||||||
if (item.Type === 'SeriesTimer') {
|
if (item.Type === 'SeriesTimer') {
|
||||||
return '<i class="md-icon programIcon seriesTimerIcon"></i>';
|
return '<i class="md-icon programIcon seriesTimerIcon"></i>';
|
||||||
}
|
} else if (item.TimerId || item.SeriesTimerId) {
|
||||||
else if (item.TimerId || item.SeriesTimerId) {
|
|
||||||
|
|
||||||
status = item.Status || 'Cancelled';
|
status = item.Status || 'Cancelled';
|
||||||
}
|
} else if (item.Type === 'Timer') {
|
||||||
else if (item.Type === 'Timer') {
|
|
||||||
|
|
||||||
status = item.Status;
|
status = item.Status;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,11 +519,9 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
} else if (program.IsMovie) {
|
} else if (program.IsMovie) {
|
||||||
displayInnerContent = displayMovieContent;
|
displayInnerContent = displayMovieContent;
|
||||||
accentCssClass = 'movie';
|
accentCssClass = 'movie';
|
||||||
}
|
} else if (program.IsSeries) {
|
||||||
else if (program.IsSeries) {
|
|
||||||
displayInnerContent = displaySeriesContent;
|
displayInnerContent = displaySeriesContent;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
displayInnerContent = displayMovieContent && displayNewsContent && displaySportsContent && displayKidsContent && displaySeriesContent;
|
displayInnerContent = displayMovieContent && displayNewsContent && displaySportsContent && displayKidsContent && displaySeriesContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -569,14 +557,11 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
var indicatorHtml = null;
|
var indicatorHtml = null;
|
||||||
if (program.IsLive && options.showLiveIndicator) {
|
if (program.IsLive && options.showLiveIndicator) {
|
||||||
indicatorHtml = '<span class="liveTvProgram guideProgramIndicator">' + globalize.translate('Live') + '</span>';
|
indicatorHtml = '<span class="liveTvProgram guideProgramIndicator">' + globalize.translate('Live') + '</span>';
|
||||||
}
|
} else if (program.IsPremiere && options.showPremiereIndicator) {
|
||||||
else if (program.IsPremiere && options.showPremiereIndicator) {
|
|
||||||
indicatorHtml = '<span class="premiereTvProgram guideProgramIndicator">' + globalize.translate('Premiere') + '</span>';
|
indicatorHtml = '<span class="premiereTvProgram guideProgramIndicator">' + globalize.translate('Premiere') + '</span>';
|
||||||
}
|
} else if (program.IsSeries && !program.IsRepeat && options.showNewIndicator) {
|
||||||
else if (program.IsSeries && !program.IsRepeat && options.showNewIndicator) {
|
|
||||||
indicatorHtml = '<span class="newTvProgram guideProgramIndicator">' + globalize.translate('AttributeNew') + '</span>';
|
indicatorHtml = '<span class="newTvProgram guideProgramIndicator">' + globalize.translate('AttributeNew') + '</span>';
|
||||||
}
|
} else if (program.IsSeries && program.IsRepeat && options.showRepeatIndicator) {
|
||||||
else if (program.IsSeries && program.IsRepeat && options.showRepeatIndicator) {
|
|
||||||
indicatorHtml = '<span class="repeatTvProgram guideProgramIndicator">' + globalize.translate('Repeat') + '</span>';
|
indicatorHtml = '<span class="repeatTvProgram guideProgramIndicator">' + globalize.translate('Repeat') + '</span>';
|
||||||
}
|
}
|
||||||
html += indicatorHtml || '';
|
html += indicatorHtml || '';
|
||||||
@ -614,7 +599,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function renderChannelHeaders(context, channels, apiClient) {
|
function renderChannelHeaders(context, channels, apiClient) {
|
||||||
|
|
||||||
var html = '';
|
var html = '';
|
||||||
@ -1079,17 +1063,13 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
|
|
||||||
scrollHelper.toStart(programGrid, programCell, true, true);
|
scrollHelper.toStart(programGrid, programCell, true, true);
|
||||||
}
|
}
|
||||||
}
|
} else if (lastFocusDirection === 'right') {
|
||||||
|
|
||||||
else if (lastFocusDirection === 'right') {
|
|
||||||
|
|
||||||
if (programCell) {
|
if (programCell) {
|
||||||
|
|
||||||
scrollHelper.toCenter(programGrid, programCell, true, true);
|
scrollHelper.toCenter(programGrid, programCell, true, true);
|
||||||
}
|
}
|
||||||
}
|
} else if (lastFocusDirection === 'up' || lastFocusDirection === 'down') {
|
||||||
|
|
||||||
else if (lastFocusDirection === 'up' || lastFocusDirection === 'down') {
|
|
||||||
|
|
||||||
var verticalScroller = dom.parentWithClass(target, 'guideVerticalScroller');
|
var verticalScroller = dom.parentWithClass(target, 'guideVerticalScroller');
|
||||||
if (verticalScroller) {
|
if (verticalScroller) {
|
||||||
@ -1195,14 +1175,14 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
|
|||||||
dom.addEventListener(programGrid, 'scroll', function (e) {
|
dom.addEventListener(programGrid, 'scroll', function (e) {
|
||||||
onProgramGridScroll(context, this, timeslotHeaders);
|
onProgramGridScroll(context, this, timeslotHeaders);
|
||||||
}, {
|
}, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
|
||||||
dom.addEventListener(timeslotHeaders, 'scroll', function () {
|
dom.addEventListener(timeslotHeaders, 'scroll', function () {
|
||||||
onTimeslotHeadersScroll(context, this);
|
onTimeslotHeadersScroll(context, this);
|
||||||
}, {
|
}, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
|
||||||
programGrid.addEventListener('click', onProgramGridClick);
|
programGrid.addEventListener('click', onProgramGridClick);
|
||||||
|
|
||||||
|
@ -255,8 +255,8 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay
|
|||||||
* @return {bool} true if should unpin, false otherwise
|
* @return {bool} true if should unpin, false otherwise
|
||||||
*/
|
*/
|
||||||
this.shouldUnpin = function (currentScrollY) {
|
this.shouldUnpin = function (currentScrollY) {
|
||||||
var scrollingDown = currentScrollY > this.lastKnownScrollY,
|
var scrollingDown = currentScrollY > this.lastKnownScrollY;
|
||||||
pastOffset = currentScrollY >= this.offset;
|
var pastOffset = currentScrollY >= this.offset;
|
||||||
|
|
||||||
return scrollingDown && pastOffset;
|
return scrollingDown && pastOffset;
|
||||||
};
|
};
|
||||||
@ -267,8 +267,8 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay
|
|||||||
* @return {bool} true if should pin, false otherwise
|
* @return {bool} true if should pin, false otherwise
|
||||||
*/
|
*/
|
||||||
this.shouldPin = function (currentScrollY) {
|
this.shouldPin = function (currentScrollY) {
|
||||||
var scrollingUp = currentScrollY < this.lastKnownScrollY,
|
var scrollingUp = currentScrollY < this.lastKnownScrollY;
|
||||||
pastOffset = currentScrollY <= this.offset;
|
var pastOffset = currentScrollY <= this.offset;
|
||||||
|
|
||||||
return scrollingUp || pastOffset;
|
return scrollingUp || pastOffset;
|
||||||
};
|
};
|
||||||
@ -290,11 +290,9 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay
|
|||||||
|
|
||||||
if (currentScrollY <= (isTv ? 120 : 10)) {
|
if (currentScrollY <= (isTv ? 120 : 10)) {
|
||||||
this.clear();
|
this.clear();
|
||||||
}
|
} else if (this.shouldUnpin(currentScrollY)) {
|
||||||
else if (this.shouldUnpin(currentScrollY)) {
|
|
||||||
this.unpin();
|
this.unpin();
|
||||||
}
|
} else if (this.shouldPin(currentScrollY)) {
|
||||||
else if (this.shouldPin(currentScrollY)) {
|
|
||||||
|
|
||||||
var toleranceExceeded = Math.abs(currentScrollY - lastKnownScrollY) >= 14;
|
var toleranceExceeded = Math.abs(currentScrollY - lastKnownScrollY) >= 14;
|
||||||
|
|
||||||
@ -310,7 +308,6 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay
|
|||||||
this.lastKnownScrollY = currentScrollY;
|
this.lastKnownScrollY = currentScrollY;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
if (browser.supportsCssAnimation()) {
|
if (browser.supportsCssAnimation()) {
|
||||||
for (var i = 0, length = this.elems.length; i < length; i++) {
|
for (var i = 0, length = this.elems.length; i < length; i++) {
|
||||||
this.elems[i].classList.add(this.initialClass);
|
this.elems[i].classList.add(this.initialClass);
|
||||||
|
@ -57,8 +57,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
name: globalize.translate('Collections'),
|
name: globalize.translate('Collections'),
|
||||||
value: 'collections'
|
value: 'collections'
|
||||||
});
|
});
|
||||||
}
|
} else if (type === 'tvshows') {
|
||||||
else if (type === 'tvshows') {
|
|
||||||
|
|
||||||
list.push({
|
list.push({
|
||||||
name: globalize.translate('Shows'),
|
name: globalize.translate('Shows'),
|
||||||
@ -78,8 +77,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
name: globalize.translate('Favorites'),
|
name: globalize.translate('Favorites'),
|
||||||
value: 'favorites'
|
value: 'favorites'
|
||||||
});
|
});
|
||||||
}
|
} else if (type === 'music') {
|
||||||
else if (type === 'music') {
|
|
||||||
|
|
||||||
list.push({
|
list.push({
|
||||||
name: globalize.translate('Suggestions'),
|
name: globalize.translate('Suggestions'),
|
||||||
@ -111,8 +109,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
name: globalize.translate('Genres'),
|
name: globalize.translate('Genres'),
|
||||||
value: 'genres'
|
value: 'genres'
|
||||||
});
|
});
|
||||||
}
|
} else if (type === 'livetv') {
|
||||||
else if (type === 'livetv') {
|
|
||||||
|
|
||||||
list.push({
|
list.push({
|
||||||
name: globalize.translate('Suggestions'),
|
name: globalize.translate('Suggestions'),
|
||||||
@ -256,7 +253,6 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
html += '</div>';
|
html += '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,6 +326,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
if (next) {
|
if (next) {
|
||||||
viewItem.parentNode.removeChild(viewItem);
|
viewItem.parentNode.removeChild(viewItem);
|
||||||
next.parentNode.insertBefore(viewItem, next.nextSibling);
|
next.parentNode.insertBefore(viewItem, next.nextSibling);
|
||||||
|
focusManager.focus(e.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -339,6 +336,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
if (prev) {
|
if (prev) {
|
||||||
viewItem.parentNode.removeChild(viewItem);
|
viewItem.parentNode.removeChild(viewItem);
|
||||||
prev.parentNode.insertBefore(viewItem, prev);
|
prev.parentNode.insertBefore(viewItem, prev);
|
||||||
|
focusManager.focus(e.target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -382,7 +380,8 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
|||||||
|
|
||||||
var viewItems = context.querySelectorAll('.viewItem');
|
var viewItems = context.querySelectorAll('.viewItem');
|
||||||
var orderedViews = [];
|
var orderedViews = [];
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
for (i = 0, length = viewItems.length; i < length; i++) {
|
for (i = 0, length = viewItems.length; i < length; i++) {
|
||||||
orderedViews.push(viewItems[i].getAttribute('data-viewid'));
|
orderedViews.push(viewItems[i].getAttribute('data-viewid'));
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'layoutManager', 'imageLoader', 'globalize', 'itemShortcuts', 'itemHelper', 'appRouter', 'scripts/imagehelper','paper-icon-button-light', 'emby-itemscontainer', 'emby-scroller', 'emby-button', 'css!./homesections'], function (connectionManager, cardBuilder, appSettings, dom, appHost, layoutManager, imageLoader, globalize, itemShortcuts, itemHelper, appRouter, imageHelper) {
|
define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'layoutManager', 'imageLoader', 'globalize', 'itemShortcuts', 'itemHelper', 'appRouter', 'scripts/imagehelper', 'paper-icon-button-light', 'emby-itemscontainer', 'emby-scroller', 'emby-button', 'css!./homesections'], function (connectionManager, cardBuilder, appSettings, dom, appHost, layoutManager, imageLoader, globalize, itemShortcuts, itemHelper, appRouter, imageHelper) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function getDefaultSection(index) {
|
function getDefaultSection(index) {
|
||||||
@ -83,7 +83,8 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
|
|||||||
|
|
||||||
function resume(elem, options) {
|
function resume(elem, options) {
|
||||||
var elems = elem.querySelectorAll('.itemsContainer');
|
var elems = elem.querySelectorAll('.itemsContainer');
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
var promises = [];
|
var promises = [];
|
||||||
|
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
for (i = 0, length = elems.length; i < length; i++) {
|
||||||
@ -560,31 +561,31 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
|
|||||||
|
|
||||||
if (enableScrollX()) {
|
if (enableScrollX()) {
|
||||||
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true" data-scrollbuttons="false">';
|
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true" data-scrollbuttons="false">';
|
||||||
html += '<div class="padded-left padded-right padded-top padded-bottom scrollSlider focuscontainer-x">';
|
html += '<div class="padded-top padded-bottom scrollSlider focuscontainer-x">';
|
||||||
} else {
|
} else {
|
||||||
html += '<div class="padded-left padded-right padded-top padded-bottom focuscontainer-x">';
|
html += '<div class="padded-top padded-bottom focuscontainer-x">';
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '<a style="margin-left:.8em;margin-right:0;" is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
||||||
serverId: apiClient.serverId(),
|
serverId: apiClient.serverId(),
|
||||||
section: 'programs'
|
section: 'programs'
|
||||||
}) + '" class="raised"><span>' + globalize.translate('Programs') + '</span></a>';
|
}) + '" class="raised"><span>' + globalize.translate('Programs') + '</span></a>';
|
||||||
|
|
||||||
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
||||||
serverId: apiClient.serverId(),
|
serverId: apiClient.serverId(),
|
||||||
section: 'guide'
|
section: 'guide'
|
||||||
}) + '" class="raised"><span>' + globalize.translate('Guide') + '</span></a>';
|
}) + '" class="raised"><span>' + globalize.translate('Guide') + '</span></a>';
|
||||||
|
|
||||||
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter.getRouteUrl('recordedtv', {
|
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('recordedtv', {
|
||||||
serverId: apiClient.serverId()
|
serverId: apiClient.serverId()
|
||||||
}) + '" class="raised"><span>' + globalize.translate('Recordings') + '</span></a>';
|
}) + '" class="raised"><span>' + globalize.translate('Recordings') + '</span></a>';
|
||||||
|
|
||||||
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
||||||
serverId: apiClient.serverId(),
|
serverId: apiClient.serverId(),
|
||||||
section: 'dvrschedule'
|
section: 'dvrschedule'
|
||||||
}) + '" class="raised"><span>' + globalize.translate('Schedule') + '</span></a>';
|
}) + '" class="raised"><span>' + globalize.translate('Schedule') + '</span></a>';
|
||||||
|
|
||||||
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
|
||||||
serverId: apiClient.serverId(),
|
serverId: apiClient.serverId(),
|
||||||
section: 'seriesrecording'
|
section: 'seriesrecording'
|
||||||
}) + '" class="raised"><span>' + globalize.translate('Series') + '</span></a>';
|
}) + '" class="raised"><span>' + globalize.translate('Series') + '</span></a>';
|
||||||
|
@ -12,7 +12,6 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getCrossOriginValue(mediaSource) {
|
function getCrossOriginValue(mediaSource) {
|
||||||
|
|
||||||
if (mediaSource.IsRemote) {
|
if (mediaSource.IsRemote) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -97,7 +96,8 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var recoverDecodingErrorDate, recoverSwapAudioCodecDate;
|
var recoverDecodingErrorDate;
|
||||||
|
var recoverSwapAudioCodecDate;
|
||||||
function handleHlsJsMediaError(instance, reject) {
|
function handleHlsJsMediaError(instance, reject) {
|
||||||
|
|
||||||
var hlsPlayer = instance._hlsPlayer;
|
var hlsPlayer = instance._hlsPlayer;
|
||||||
@ -144,7 +144,8 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
|
|||||||
events.trigger(instance, 'error', [
|
events.trigger(instance, 'error', [
|
||||||
{
|
{
|
||||||
type: type
|
type: type
|
||||||
}]);
|
}
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isValidDuration(duration) {
|
function isValidDuration(duration) {
|
||||||
@ -156,7 +157,6 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setCurrentTimeIfNeeded(element, seconds) {
|
function setCurrentTimeIfNeeded(element, seconds) {
|
||||||
|
|
||||||
if (Math.abs(element.currentTime || 0, seconds) <= 1) {
|
if (Math.abs(element.currentTime || 0, seconds) <= 1) {
|
||||||
element.currentTime = seconds;
|
element.currentTime = seconds;
|
||||||
}
|
}
|
||||||
@ -354,9 +354,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
|
|||||||
} else {
|
} else {
|
||||||
onErrorInternal(instance, 'network');
|
onErrorInternal(instance, 'network');
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
|
||||||
else {
|
|
||||||
console.log("fatal network error encountered, try to recover");
|
console.log("fatal network error encountered, try to recover");
|
||||||
hls.startLoad();
|
hls.startLoad();
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||||||
function supportsFade() {
|
function supportsFade() {
|
||||||
|
|
||||||
if (browser.tv) {
|
if (browser.tv) {
|
||||||
// Not working on tizen.
|
// Not working on tizen.
|
||||||
// We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive
|
// We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -168,7 +168,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}, function () {
|
}, function () {
|
||||||
|
|
||||||
elem.autoplay = true;
|
elem.autoplay = true;
|
||||||
|
@ -298,10 +298,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
type: 'flv',
|
type: 'flv',
|
||||||
url: url
|
url: url
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
seekType: 'range',
|
seekType: 'range',
|
||||||
lazyLoad: false
|
lazyLoad: false
|
||||||
});
|
});
|
||||||
|
|
||||||
flvPlayer.attachMediaElement(elem);
|
flvPlayer.attachMediaElement(elem);
|
||||||
flvPlayer.load();
|
flvPlayer.load();
|
||||||
@ -420,7 +420,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
function onMediaManagerLoadMedia(event) {
|
function onMediaManagerLoadMedia(event) {
|
||||||
|
|
||||||
if (self._castPlayer) {
|
if (self._castPlayer) {
|
||||||
self._castPlayer.unload(); // Must unload before starting again.
|
self._castPlayer.unload(); // Must unload before starting again.
|
||||||
}
|
}
|
||||||
self._castPlayer = null;
|
self._castPlayer = null;
|
||||||
|
|
||||||
@ -532,12 +532,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
} else*/ if (browser.chromecast && val.indexOf('.m3u8') !== -1 && options.mediaSource.RunTimeTicks) {
|
} else*/ if (browser.chromecast && val.indexOf('.m3u8') !== -1 && options.mediaSource.RunTimeTicks) {
|
||||||
|
|
||||||
return setCurrentSrcChromecast(self, elem, options, val);
|
return setCurrentSrcChromecast(self, elem, options, val);
|
||||||
}
|
} else if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) {
|
||||||
|
|
||||||
else if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) {
|
|
||||||
|
|
||||||
return setSrcWithHlsJs(self, elem, options, val);
|
return setSrcWithHlsJs(self, elem, options, val);
|
||||||
|
|
||||||
} else if (options.playMethod !== 'Transcode' && options.mediaSource.Container === 'flv') {
|
} else if (options.playMethod !== 'Transcode' && options.mediaSource.Container === 'flv') {
|
||||||
|
|
||||||
return setSrcWithFlvJs(self, elem, options, val);
|
return setSrcWithFlvJs(self, elem, options, val);
|
||||||
@ -575,43 +571,41 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
self.setSubtitleOffset = function(offset) {
|
self.setSubtitleOffset = function(offset) {
|
||||||
|
|
||||||
var offsetValue = parseFloat(offset);
|
var offsetValue = parseFloat(offset);
|
||||||
var videoElement = self._mediaElement;
|
|
||||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
|
||||||
|
|
||||||
Array.from(videoElement.textTracks)
|
// if .ass currently rendering
|
||||||
.filter(function(trackElement) {
|
if (currentAssRenderer) {
|
||||||
if (customTrackIndex === -1 ) {
|
updateCurrentTrackOffset(offsetValue);
|
||||||
|
} else {
|
||||||
|
var videoElement = self._mediaElement;
|
||||||
|
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||||
|
|
||||||
|
Array.from(videoElement.textTracks)
|
||||||
|
.filter(function(trackElement) {
|
||||||
// get showing .vtt textTacks
|
// get showing .vtt textTacks
|
||||||
return trackElement.mode === 'showing';
|
return trackElement.mode === 'showing';
|
||||||
} else {
|
})
|
||||||
// get current .ass textTrack
|
.forEach(function(trackElement) {
|
||||||
return ("textTrack" + customTrackIndex) === trackElement.id;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.forEach(function(trackElement) {
|
|
||||||
|
|
||||||
var track = mediaStreamTextTracks.filter(function(stream) {
|
var track = customTrackIndex === -1 ? null : mediaStreamTextTracks.filter(function (t) {
|
||||||
return ("textTrack" + stream.Index) === trackElement.id;
|
return t.Index === customTrackIndex;
|
||||||
})[0];
|
})[0];
|
||||||
|
|
||||||
if(track) {
|
if (track) {
|
||||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||||
var format = (track.Codec || '').toLowerCase();
|
setVttSubtitleOffset(trackElement, offsetValue);
|
||||||
if (format !== 'ass' && format !== 'ssa') {
|
} else {
|
||||||
setVttSubtitleOffset(trackElement, offsetValue);
|
console.log("No available track, cannot apply offset : " + offsetValue);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
console.log("No available track, cannot apply offset : " + offsetValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function updateCurrentTrackOffset(offsetValue) {
|
function updateCurrentTrackOffset(offsetValue) {
|
||||||
|
|
||||||
var relativeOffset = offsetValue;
|
var relativeOffset = offsetValue;
|
||||||
var newTrackOffset = offsetValue;
|
var newTrackOffset = offsetValue;
|
||||||
if(currentTrackOffset){
|
if (currentTrackOffset) {
|
||||||
relativeOffset -= currentTrackOffset;
|
relativeOffset -= currentTrackOffset;
|
||||||
}
|
}
|
||||||
currentTrackOffset = newTrackOffset;
|
currentTrackOffset = newTrackOffset;
|
||||||
@ -621,12 +615,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
|
|
||||||
function setVttSubtitleOffset(currentTrack, offsetValue) {
|
function setVttSubtitleOffset(currentTrack, offsetValue) {
|
||||||
|
|
||||||
if(currentTrack.cues) {
|
if (currentTrack.cues) {
|
||||||
Array.from(currentTrack.cues)
|
Array.from(currentTrack.cues)
|
||||||
.forEach(function(cue) {
|
.forEach(function(cue) {
|
||||||
cue.startTime -= offsetValue;
|
cue.startTime -= offsetValue;
|
||||||
cue.endTime -= offsetValue;
|
cue.endTime -= offsetValue;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -652,7 +646,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
|
|
||||||
return profiles.filter(function (p) {
|
return profiles.filter(function (p) {
|
||||||
|
|
||||||
|
|
||||||
if (p.Type === 'Video') {
|
if (p.Type === 'Video') {
|
||||||
|
|
||||||
if (!p.AudioCodec) {
|
if (!p.AudioCodec) {
|
||||||
@ -685,7 +678,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
var audioIndex = -1;
|
var audioIndex = -1;
|
||||||
var i, length, stream;
|
var i;
|
||||||
|
var length;
|
||||||
|
var stream;
|
||||||
|
|
||||||
for (i = 0, length = streams.length; i < length; i++) {
|
for (i = 0, length = streams.length; i < length; i++) {
|
||||||
stream = streams[i];
|
stream = streams[i];
|
||||||
@ -1031,8 +1026,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
if (browser.ps4) {
|
if (browser.ps4) {
|
||||||
// Text outlines are not rendering very well
|
// Text outlines are not rendering very well
|
||||||
rendererSettings.enableSvg = false;
|
rendererSettings.enableSvg = false;
|
||||||
}
|
} else if (browser.edge || browser.msie) {
|
||||||
else if (browser.edge || browser.msie) {
|
|
||||||
// svg not rendering at all
|
// svg not rendering at all
|
||||||
rendererSettings.enableSvg = false;
|
rendererSettings.enableSvg = false;
|
||||||
}
|
}
|
||||||
@ -1192,50 +1186,49 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
var trackElement = null;
|
var trackElement = null;
|
||||||
var expectedId = 'manualTrack' + track.Index;
|
if (videoElement.textTracks && videoElement.textTracks.length > 0) {
|
||||||
|
trackElement = videoElement.textTracks[0];
|
||||||
|
|
||||||
// get list of tracks
|
// This throws an error in IE, but is fine in chrome
|
||||||
var allTracks = videoElement.textTracks;
|
// In IE it's not necessary anyway because changing the src seems to be enough
|
||||||
for (var i = 0; i < allTracks.length; i++) {
|
try {
|
||||||
|
|
||||||
var currentTrack = allTracks[i];
|
|
||||||
|
|
||||||
if (currentTrack.label === expectedId) {
|
|
||||||
trackElement = currentTrack;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
currentTrack.mode = 'disabled';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!trackElement) {
|
|
||||||
trackElement = videoElement.addTextTrack('subtitles', 'manualTrack' + track.Index, track.Language || 'und');
|
|
||||||
|
|
||||||
// download the track json
|
|
||||||
fetchSubtitles(track, item).then(function (data) {
|
|
||||||
|
|
||||||
// show in ui
|
|
||||||
console.log('downloaded ' + data.TrackEvents.length + ' track events');
|
|
||||||
// add some cues to show the text
|
|
||||||
// in safari, the cues need to be added before setting the track mode to showing
|
|
||||||
data.TrackEvents.forEach(function (trackEvent) {
|
|
||||||
|
|
||||||
var trackCueObject = window.VTTCue || window.TextTrackCue;
|
|
||||||
var cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text));
|
|
||||||
|
|
||||||
trackElement.addCue(cue);
|
|
||||||
});
|
|
||||||
trackElement.mode = 'showing';
|
trackElement.mode = 'showing';
|
||||||
});
|
while (trackElement.cues.length) {
|
||||||
|
trackElement.removeCue(trackElement.cues[0]);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error removing cue from textTrack');
|
||||||
|
}
|
||||||
|
|
||||||
|
trackElement.mode = 'disabled';
|
||||||
} else {
|
} else {
|
||||||
trackElement.mode = 'showing';
|
// There is a function addTextTrack but no function for removeTextTrack
|
||||||
|
// Therefore we add ONE element and replace its cue data
|
||||||
|
trackElement = videoElement.addTextTrack('subtitles', 'manualTrack', 'und');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// download the track json
|
||||||
|
fetchSubtitles(track, item).then(function (data) {
|
||||||
|
|
||||||
|
// show in ui
|
||||||
|
console.log('downloaded ' + data.TrackEvents.length + ' track events');
|
||||||
|
// add some cues to show the text
|
||||||
|
// in safari, the cues need to be added before setting the track mode to showing
|
||||||
|
data.TrackEvents.forEach(function (trackEvent) {
|
||||||
|
|
||||||
|
var trackCueObject = window.VTTCue || window.TextTrackCue;
|
||||||
|
var cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text));
|
||||||
|
|
||||||
|
trackElement.addCue(cue);
|
||||||
|
});
|
||||||
|
trackElement.mode = 'showing';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateSubtitleText(timeMs) {
|
function updateSubtitleText(timeMs) {
|
||||||
|
|
||||||
// handle offset for ass tracks
|
// handle offset for ass tracks
|
||||||
if(currentTrackOffset) {
|
if (currentTrackOffset) {
|
||||||
timeMs += (currentTrackOffset * 1000);
|
timeMs += (currentTrackOffset * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1484,6 +1477,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
list.push('SetBrightness');
|
list.push('SetBrightness');
|
||||||
|
list.push("SetAspectRatio")
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
@ -1564,8 +1558,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
this.isPip = isEnabled;
|
this.isPip = isEnabled;
|
||||||
if (isEnabled) {
|
if (isEnabled) {
|
||||||
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay);
|
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.default);
|
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.default);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1712,7 +1705,15 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
};
|
};
|
||||||
|
|
||||||
HtmlVideoPlayer.prototype.setAspectRatio = function (val) {
|
HtmlVideoPlayer.prototype.setAspectRatio = function (val) {
|
||||||
|
var mediaElement = this._mediaElement;
|
||||||
|
if (mediaElement) {
|
||||||
|
if ("auto" === val) {
|
||||||
|
mediaElement.style.removeProperty("object-fit")
|
||||||
|
} else {
|
||||||
|
mediaElement.style["object-fit"] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._currentAspectRatio = val
|
||||||
};
|
};
|
||||||
|
|
||||||
HtmlVideoPlayer.prototype.getAspectRatio = function () {
|
HtmlVideoPlayer.prototype.getAspectRatio = function () {
|
||||||
@ -1720,7 +1721,16 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||||||
};
|
};
|
||||||
|
|
||||||
HtmlVideoPlayer.prototype.getSupportedAspectRatios = function () {
|
HtmlVideoPlayer.prototype.getSupportedAspectRatios = function () {
|
||||||
return [];
|
return [{
|
||||||
|
name: "Auto",
|
||||||
|
id: "auto"
|
||||||
|
}, {
|
||||||
|
name: "Cover",
|
||||||
|
id: "cover"
|
||||||
|
}, {
|
||||||
|
name: "Fill",
|
||||||
|
id: "fill"
|
||||||
|
}]
|
||||||
};
|
};
|
||||||
|
|
||||||
HtmlVideoPlayer.prototype.togglePictureInPicture = function () {
|
HtmlVideoPlayer.prototype.togglePictureInPicture = function () {
|
||||||
|
@ -1,28 +1,45 @@
|
|||||||
define(["datetime"], function(datetime) {
|
define(["datetime"], function (datetime) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function humaneDate(date_str) {
|
function humaneDate(date_str) {
|
||||||
var format, time_formats = [
|
var format;
|
||||||
[90, "a minute"],
|
var time_formats = [
|
||||||
[3600, "minutes", 60],
|
[90, "a minute"],
|
||||||
[5400, "an hour"],
|
[3600, "minutes", 60],
|
||||||
[86400, "hours", 3600],
|
[5400, "an hour"],
|
||||||
[129600, "a day"],
|
[86400, "hours", 3600],
|
||||||
[604800, "days", 86400],
|
[129600, "a day"],
|
||||||
[907200, "a week"],
|
[604800, "days", 86400],
|
||||||
[2628e3, "weeks", 604800],
|
[907200, "a week"],
|
||||||
[3942e3, "a month"],
|
[2628e3, "weeks", 604800],
|
||||||
[31536e3, "months", 2628e3],
|
[3942e3, "a month"],
|
||||||
[47304e3, "a year"],
|
[31536e3, "months", 2628e3],
|
||||||
[31536e5, "years", 31536e3]
|
[47304e3, "a year"],
|
||||||
],
|
[31536e5, "years", 31536e3]
|
||||||
dt = new Date,
|
];
|
||||||
date = datetime.parseISO8601Date(date_str, !0),
|
var dt = new Date();
|
||||||
seconds = (dt - date) / 1e3,
|
var date = datetime.parseISO8601Date(date_str, true);
|
||||||
i = 0;
|
var seconds = (dt - date) / 1000.0;
|
||||||
for (seconds < 0 && (seconds = Math.abs(seconds)); format = time_formats[i++];)
|
var i = 0;
|
||||||
if (seconds < format[0]) return 2 == format.length ? format[1] + " ago" : Math.round(seconds / format[2]) + " " + format[1] + " ago";
|
|
||||||
return seconds > 47304e5 ? Math.round(seconds / 47304e5) + " centuries ago" : date_str
|
if (seconds < 0) {
|
||||||
|
seconds = Math.abs(seconds);
|
||||||
|
}
|
||||||
|
for (; format = time_formats[i++];) {
|
||||||
|
if (seconds < format[0]) {
|
||||||
|
if (2 == format.length) {
|
||||||
|
return format[1] + " ago";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.round(seconds / format[2]) + " " + format[1] + " ago";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (seconds > 47304e5) {
|
||||||
|
return Math.round(seconds / 47304e5) + " centuries ago";
|
||||||
|
}
|
||||||
|
|
||||||
|
return date_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
function humaneElapsed(firstDateStr, secondDateStr) {
|
function humaneElapsed(firstDateStr, secondDateStr) {
|
||||||
@ -30,12 +47,10 @@ define(["datetime"], function(datetime) {
|
|||||||
var dateOne = new Date(firstDateStr);
|
var dateOne = new Date(firstDateStr);
|
||||||
var dateTwo = new Date(secondDateStr);
|
var dateTwo = new Date(secondDateStr);
|
||||||
var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3;
|
var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3;
|
||||||
|
|
||||||
var days = Math.floor(delta % 31536e3 / 86400);
|
var days = Math.floor(delta % 31536e3 / 86400);
|
||||||
var hours = Math.floor(delta % 31536e3 % 86400 / 3600);
|
var hours = Math.floor(delta % 31536e3 % 86400 / 3600);
|
||||||
var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60);
|
var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60);
|
||||||
var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60);
|
var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60);
|
||||||
|
|
||||||
var elapsed = "";
|
var elapsed = "";
|
||||||
elapsed += 1 == days ? days + " day " : "";
|
elapsed += 1 == days ? days + " day " : "";
|
||||||
elapsed += days > 1 ? days + " days " : "";
|
elapsed += days > 1 ? days + " days " : "";
|
||||||
@ -46,15 +61,13 @@ define(["datetime"], function(datetime) {
|
|||||||
elapsed += elapsed.length > 0 ? "and " : "";
|
elapsed += elapsed.length > 0 ? "and " : "";
|
||||||
elapsed += 1 == seconds ? seconds + " second" : "";
|
elapsed += 1 == seconds ? seconds + " second" : "";
|
||||||
elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : "";
|
elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : "";
|
||||||
|
|
||||||
return elapsed;
|
return elapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
window.humaneDate = humaneDate;
|
window.humaneDate = humaneDate;
|
||||||
window.humaneElapsed = humaneElapsed;
|
window.humaneElapsed = humaneElapsed;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
humaneDate: humaneDate,
|
humaneDate: humaneDate,
|
||||||
humaneElapsed: humaneElapsed
|
humaneElapsed: humaneElapsed
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) {
|
define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
var currentItemId;
|
var currentItemId;
|
||||||
var currentItemType;
|
var currentItemType;
|
||||||
var currentResolve;
|
var currentResolve;
|
||||||
@ -164,6 +166,8 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
|
|||||||
var tagName = layoutManager.tv ? 'button' : 'div';
|
var tagName = layoutManager.tv ? 'button' : 'div';
|
||||||
var enableFooterButtons = !layoutManager.tv;
|
var enableFooterButtons = !layoutManager.tv;
|
||||||
|
|
||||||
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var html = '';
|
var html = '';
|
||||||
|
|
||||||
var cssClass = "card scalableCard imageEditorCard";
|
var cssClass = "card scalableCard imageEditorCard";
|
||||||
@ -172,22 +176,17 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
|
|||||||
var shape = 'backdrop';
|
var shape = 'backdrop';
|
||||||
if (imageType === "Backdrop" || imageType === "Art" || imageType === "Thumb" || imageType === "Logo") {
|
if (imageType === "Backdrop" || imageType === "Art" || imageType === "Thumb" || imageType === "Logo") {
|
||||||
shape = 'backdrop';
|
shape = 'backdrop';
|
||||||
}
|
} else if (imageType === "Banner") {
|
||||||
else if (imageType === "Banner") {
|
|
||||||
shape = 'banner';
|
shape = 'banner';
|
||||||
}
|
} else if (imageType === "Disc") {
|
||||||
else if (imageType === "Disc") {
|
|
||||||
shape = 'square';
|
shape = 'square';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
if (currentItemType === "Episode") {
|
if (currentItemType === "Episode") {
|
||||||
shape = 'backdrop';
|
shape = 'backdrop';
|
||||||
}
|
} else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
||||||
else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
|
||||||
shape = 'square';
|
shape = 'square';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
shape = 'portrait';
|
shape = 'portrait';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,12 +195,12 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
|
|||||||
if (tagName === 'button') {
|
if (tagName === 'button') {
|
||||||
cssClass += ' btnImageCard';
|
cssClass += ' btnImageCard';
|
||||||
|
|
||||||
if (layoutManager.tv && !browser.slow) {
|
|
||||||
cardBoxCssClass += ' cardBox-focustransform';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
cardBoxCssClass += ' card-focuscontent cardBox-withfocuscontent';
|
cssClass += ' show-focus';
|
||||||
|
|
||||||
|
if (enableFocusTransform) {
|
||||||
|
cssClass += ' show-animation';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '<button type="button" class="' + cssClass + '"';
|
html += '<button type="button" class="' + cssClass + '"';
|
||||||
@ -220,8 +219,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
|
|||||||
|
|
||||||
if (layoutManager.tv || !appHost.supports('externallinks')) {
|
if (layoutManager.tv || !appHost.supports('externallinks')) {
|
||||||
html += '<div class="cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></div>';
|
html += '<div class="cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></div>';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
html += '<a is="emby-linkbutton" target="_blank" href="' + getDisplayUrl(image.Url, apiClient) + '" class="button-link cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></a>';
|
html += '<a is="emby-linkbutton" target="_blank" href="' + getDisplayUrl(image.Url, apiClient) + '" class="button-link cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,4 +411,4 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 'focusManager', 'globalize', 'scrollHelper', 'imageLoader', 'require', 'browser', 'apphost', 'cardStyle', 'formDialogStyle', 'emby-button', 'paper-icon-button-light', 'css!./imageeditor'], function (dialogHelper, connectionManager, loading, dom, layoutManager, focusManager, globalize, scrollHelper, imageLoader, require, browser, appHost) {
|
define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 'focusManager', 'globalize', 'scrollHelper', 'imageLoader', 'require', 'browser', 'apphost', 'cardStyle', 'formDialogStyle', 'emby-button', 'paper-icon-button-light', 'css!./imageeditor'], function (dialogHelper, connectionManager, loading, dom, layoutManager, focusManager, globalize, scrollHelper, imageLoader, require, browser, appHost) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
var currentItem;
|
var currentItem;
|
||||||
var hasChanges = false;
|
var hasChanges = false;
|
||||||
|
|
||||||
@ -22,8 +24,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
|||||||
if (item) {
|
if (item) {
|
||||||
apiClient = connectionManager.getApiClient(item.ServerId);
|
apiClient = connectionManager.getApiClient(item.ServerId);
|
||||||
reloadItem(page, item, apiClient, focusContext);
|
reloadItem(page, item, apiClient, focusContext);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
apiClient = connectionManager.getApiClient(currentItem.ServerId);
|
apiClient = connectionManager.getApiClient(currentItem.ServerId);
|
||||||
apiClient.getItem(apiClient.getCurrentUserId(), currentItem.Id).then(function (item) {
|
apiClient.getItem(apiClient.getCurrentUserId(), currentItem.Id).then(function (item) {
|
||||||
@ -58,7 +59,6 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
apiClient.getItemImageInfos(currentItem.Id).then(function (imageInfos) {
|
apiClient.getItemImageInfos(currentItem.Id).then(function (imageInfos) {
|
||||||
|
|
||||||
renderStandardImages(page, apiClient, item, imageInfos, providers);
|
renderStandardImages(page, apiClient, item, imageInfos, providers);
|
||||||
@ -95,6 +95,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
|||||||
|
|
||||||
function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) {
|
function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) {
|
||||||
|
|
||||||
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var html = '';
|
var html = '';
|
||||||
|
|
||||||
var cssClass = "card scalableCard imageEditorCard";
|
var cssClass = "card scalableCard imageEditorCard";
|
||||||
@ -105,12 +107,12 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
|||||||
if (tagName === 'button') {
|
if (tagName === 'button') {
|
||||||
cssClass += ' btnImageCard';
|
cssClass += ' btnImageCard';
|
||||||
|
|
||||||
if (layoutManager.tv && !browser.slow) {
|
|
||||||
cardBoxCssClass += ' cardBox-focustransform';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
cardBoxCssClass += ' card-focuscontent cardBox-withfocuscontent';
|
cssClass += ' show-focus';
|
||||||
|
|
||||||
|
if (enableFocusTransform) {
|
||||||
|
cssClass += ' show-animation';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '<button type="button" class="' + cssClass + '"';
|
html += '<button type="button" class="' + cssClass + '"';
|
||||||
@ -163,8 +165,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
|||||||
} else {
|
} else {
|
||||||
html += '<button type="button" is="paper-icon-button-light" class="autoSize" disabled title="' + globalize.translate('MoveRight') + '"><i class="md-icon">chevron_right</i></button>';
|
html += '<button type="button" is="paper-icon-button-light" class="autoSize" disabled title="' + globalize.translate('MoveRight') + '"><i class="md-icon">chevron_right</i></button>';
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (imageProviders.length) {
|
if (imageProviders.length) {
|
||||||
html += '<button type="button" is="paper-icon-button-light" data-imagetype="' + image.ImageType + '" class="btnSearchImages autoSize" title="' + globalize.translate('Search') + '"><i class="md-icon">search</i></button>';
|
html += '<button type="button" is="paper-icon-button-light" data-imagetype="' + image.ImageType + '" class="btnSearchImages autoSize" title="' + globalize.translate('Search') + '"><i class="md-icon">search</i></button>';
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emby-input"], function(globalize, dom, dialogHelper) {
|
define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emby-input"], function (globalize, dom, dialogHelper) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function getDefaultImageConfig(itemType, type) {
|
function getDefaultImageConfig(itemType, type) {
|
||||||
@ -6,72 +6,107 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb
|
|||||||
Type: type,
|
Type: type,
|
||||||
MinWidth: 0,
|
MinWidth: 0,
|
||||||
Limit: "Primary" === type ? 1 : 0
|
Limit: "Primary" === type ? 1 : 0
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function findImageOptions(imageOptions, type) {
|
function findImageOptions(imageOptions, type) {
|
||||||
return imageOptions.filter(function(i) {
|
return imageOptions.filter(function (i) {
|
||||||
return i.Type == type
|
return i.Type == type;
|
||||||
})[0]
|
})[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getImageConfig(options, availableOptions, imageType, itemType) {
|
function getImageConfig(options, availableOptions, imageType, itemType) {
|
||||||
return findImageOptions(options.ImageOptions || [], imageType) || findImageOptions(availableOptions.DefaultImageOptions || [], imageType) || getDefaultImageConfig(itemType, imageType)
|
return findImageOptions(options.ImageOptions || [], imageType) || findImageOptions(availableOptions.DefaultImageOptions || [], imageType) || getDefaultImageConfig(itemType, imageType);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setVisibilityOfBackdrops(elem, visible) {
|
function setVisibilityOfBackdrops(elem, visible) {
|
||||||
visible ? (elem.classList.remove("hide"), elem.querySelector("input").setAttribute("required", "required")) : (elem.classList.add("hide"), elem.querySelector("input").setAttribute("required", ""), elem.querySelector("input").removeAttribute("required"))
|
if (visible) {
|
||||||
|
elem.classList.remove("hide");
|
||||||
|
elem.querySelector("input").setAttribute("required", "required");
|
||||||
|
} else {
|
||||||
|
elem.classList.add("hide");
|
||||||
|
elem.querySelector("input").setAttribute("required", "");
|
||||||
|
elem.querySelector("input").removeAttribute("required");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadValues(context, itemType, options, availableOptions) {
|
function loadValues(context, itemType, options, availableOptions) {
|
||||||
var supportedImageTypes = availableOptions.SupportedImageTypes || [];
|
var supportedImageTypes = availableOptions.SupportedImageTypes || [];
|
||||||
setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop")), setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot")), Array.prototype.forEach.call(context.querySelectorAll(".imageType"), function(i) {
|
setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop"));
|
||||||
var imageType = i.getAttribute("data-imagetype"),
|
setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot"));
|
||||||
container = dom.parentWithTag(i, "LABEL"); - 1 == supportedImageTypes.indexOf(imageType) ? container.classList.add("hide") : container.classList.remove("hide"), getImageConfig(options, availableOptions, imageType, itemType).Limit ? i.checked = !0 : i.checked = !1
|
Array.prototype.forEach.call(context.querySelectorAll(".imageType"), function (i) {
|
||||||
|
var imageType = i.getAttribute("data-imagetype");
|
||||||
|
var container = dom.parentWithTag(i, "LABEL");
|
||||||
|
|
||||||
|
if (-1 == supportedImageTypes.indexOf(imageType)) {
|
||||||
|
container.classList.add("hide");
|
||||||
|
} else {
|
||||||
|
container.classList.remove("hide");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getImageConfig(options, availableOptions, imageType, itemType).Limit) {
|
||||||
|
i.checked = true;
|
||||||
|
} else {
|
||||||
|
i.checked = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
var backdropConfig = getImageConfig(options, availableOptions, "Backdrop", itemType);
|
var backdropConfig = getImageConfig(options, availableOptions, "Backdrop", itemType);
|
||||||
context.querySelector("#txtMaxBackdrops").value = backdropConfig.Limit, context.querySelector("#txtMinBackdropDownloadWidth").value = backdropConfig.MinWidth;
|
context.querySelector("#txtMaxBackdrops").value = backdropConfig.Limit;
|
||||||
|
context.querySelector("#txtMinBackdropDownloadWidth").value = backdropConfig.MinWidth;
|
||||||
var screenshotConfig = getImageConfig(options, availableOptions, "Screenshot", itemType);
|
var screenshotConfig = getImageConfig(options, availableOptions, "Screenshot", itemType);
|
||||||
context.querySelector("#txtMaxScreenshots").value = screenshotConfig.Limit, context.querySelector("#txtMinScreenshotDownloadWidth").value = screenshotConfig.MinWidth
|
context.querySelector("#txtMaxScreenshots").value = screenshotConfig.Limit;
|
||||||
|
context.querySelector("#txtMinScreenshotDownloadWidth").value = screenshotConfig.MinWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveValues(context, options) {
|
function saveValues(context, options) {
|
||||||
options.ImageOptions = Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"), function(c) {
|
options.ImageOptions = Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"), function (c) {
|
||||||
return {
|
return {
|
||||||
Type: c.getAttribute("data-imagetype"),
|
Type: c.getAttribute("data-imagetype"),
|
||||||
Limit: c.checked ? 1 : 0,
|
Limit: c.checked ? 1 : 0,
|
||||||
MinWidth: 0
|
MinWidth: 0
|
||||||
}
|
};
|
||||||
}), options.ImageOptions.push({
|
});
|
||||||
|
options.ImageOptions.push({
|
||||||
Type: "Backdrop",
|
Type: "Backdrop",
|
||||||
Limit: context.querySelector("#txtMaxBackdrops").value,
|
Limit: context.querySelector("#txtMaxBackdrops").value,
|
||||||
MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value
|
MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value
|
||||||
}), options.ImageOptions.push({
|
});
|
||||||
|
options.ImageOptions.push({
|
||||||
Type: "Screenshot",
|
Type: "Screenshot",
|
||||||
Limit: context.querySelector("#txtMaxScreenshots").value,
|
Limit: context.querySelector("#txtMaxScreenshots").value,
|
||||||
MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value
|
MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function editor() {
|
function editor() {
|
||||||
this.show = function(itemType, options, availableOptions) {
|
this.show = function (itemType, options, availableOptions) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
var xhr = new XMLHttpRequest;
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", !0), xhr.onload = function(e) {
|
xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", true);
|
||||||
var template = this.response,
|
|
||||||
dlg = dialogHelper.createDialog({
|
xhr.onload = function (e) {
|
||||||
size: "medium-tall",
|
var template = this.response;
|
||||||
removeOnClose: !0,
|
var dlg = dialogHelper.createDialog({
|
||||||
scrollY: !1
|
size: "medium-tall",
|
||||||
});
|
removeOnClose: true,
|
||||||
dlg.classList.add("formDialog"), dlg.innerHTML = globalize.translateDocument(template), dlg.addEventListener("close", function() {
|
scrollY: false
|
||||||
saveValues(dlg, options)
|
});
|
||||||
}), loadValues(dlg, itemType, options, availableOptions), dialogHelper.open(dlg).then(resolve, resolve), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
dlg.classList.add("formDialog");
|
||||||
dialogHelper.close(dlg)
|
dlg.innerHTML = globalize.translateDocument(template);
|
||||||
})
|
dlg.addEventListener("close", function () {
|
||||||
}, xhr.send()
|
saveValues(dlg, options);
|
||||||
})
|
});
|
||||||
}
|
loadValues(dlg, itemType, options, availableOptions);
|
||||||
|
dialogHelper.open(dlg).then(resolve, resolve);
|
||||||
|
dlg.querySelector(".btnCancel").addEventListener("click", function () {
|
||||||
|
dialogHelper.close(dlg);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.send();
|
||||||
|
});
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return editor
|
|
||||||
});
|
return editor;
|
||||||
|
});
|
||||||
|
@ -70,7 +70,9 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings',
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use the median
|
// Use the median
|
||||||
values.sort(function (a, b) { return a - b; });
|
values.sort(function (a, b) {
|
||||||
|
return a - b;
|
||||||
|
});
|
||||||
|
|
||||||
var half = Math.floor(values.length / 2);
|
var half = Math.floor(values.length / 2);
|
||||||
|
|
||||||
@ -78,8 +80,7 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings',
|
|||||||
|
|
||||||
if (values.length % 2) {
|
if (values.length % 2) {
|
||||||
result = values[half];
|
result = values[half];
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
result = (values[half - 1] + values[half]) / 2.0;
|
result = (values[half - 1] + values[half]) / 2.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', '
|
|||||||
scrollHelper.centerFocus.on(dlg, false);
|
scrollHelper.centerFocus.on(dlg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Has to be assigned a z-index after the call to .open()
|
// Has to be assigned a z-index after the call to .open()
|
||||||
dlg.addEventListener('close', function () {
|
dlg.addEventListener('close', function () {
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
|
@ -52,8 +52,6 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
|
|||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (item.IsFolder || item.Type === "MusicArtist" || item.Type === "MusicGenre") {
|
if (item.IsFolder || item.Type === "MusicArtist" || item.Type === "MusicGenre") {
|
||||||
if (item.CollectionType !== "livetv") {
|
if (item.CollectionType !== "livetv") {
|
||||||
if (options.shuffle !== false) {
|
if (options.shuffle !== false) {
|
||||||
|
@ -250,9 +250,7 @@ define(['apphost', 'globalize'], function (appHost, globalize) {
|
|||||||
if (item.Type !== 'TvChannel') {
|
if (item.Type !== 'TvChannel') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} else if (item.MediaType === 'Audio') {
|
||||||
|
|
||||||
else if (item.MediaType === 'Audio') {
|
|
||||||
if (item.Type === 'AudioPodcast') {
|
if (item.Type === 'AudioPodcast') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -274,7 +272,13 @@ define(['apphost', 'globalize'], function (appHost, globalize) {
|
|||||||
|
|
||||||
canRate: function (item) {
|
canRate: function (item) {
|
||||||
|
|
||||||
if (item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'SeriesTimer' || item.Type === 'CollectionFolder' || item.Type === 'UserView' || item.Type === 'Channel') {
|
if (item.Type === 'Program'
|
||||||
|
|| item.Type === 'Timer'
|
||||||
|
|| item.Type === 'SeriesTimer'
|
||||||
|
|| item.Type === 'CollectionFolder'
|
||||||
|
|| item.Type === 'UserView'
|
||||||
|
|| item.Type === 'Channel'
|
||||||
|
|| !item.UserData) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', 'scrollHelper', 'layoutManager', 'focusManager', 'browser', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'cardStyle'], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) {
|
define(["dialogHelper", "loading", "connectionManager", "require", "globalize", "scrollHelper", "layoutManager", "focusManager", "browser", "emby-input", "emby-checkbox", "paper-icon-button-light", "css!./../formdialog", "material-icons", "cardStyle"], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) {
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
|
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
var currentItem;
|
var currentItem;
|
||||||
var currentItemType;
|
var currentItemType;
|
||||||
@ -19,8 +21,9 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
ProviderIds: {}
|
ProviderIds: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
var identifyField = page.querySelectorAll('.identifyField');
|
var length;
|
||||||
|
var identifyField = page.querySelectorAll(".identifyField");
|
||||||
var value;
|
var value;
|
||||||
for (i = 0, length = identifyField.length; i < length; i++) {
|
for (i = 0, length = identifyField.length; i < length; i++) {
|
||||||
|
|
||||||
@ -28,17 +31,17 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
||||||
if (identifyField[i].type === 'number') {
|
if (identifyField[i].type === "number") {
|
||||||
value = parseInt(value);
|
value = parseInt(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
lookupInfo[identifyField[i].getAttribute('data-lookup')] = value;
|
lookupInfo[identifyField[i].getAttribute("data-lookup")] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var hasId = false;
|
var hasId = false;
|
||||||
|
|
||||||
var txtLookupId = page.querySelectorAll('.txtLookupId');
|
var txtLookupId = page.querySelectorAll(".txtLookupId");
|
||||||
for (i = 0, length = txtLookupId.length; i < length; i++) {
|
for (i = 0, length = txtLookupId.length; i < length; i++) {
|
||||||
|
|
||||||
value = txtLookupId[i].value;
|
value = txtLookupId[i].value;
|
||||||
@ -46,12 +49,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
if (value) {
|
if (value) {
|
||||||
hasId = true;
|
hasId = true;
|
||||||
}
|
}
|
||||||
lookupInfo.ProviderIds[txtLookupId[i].getAttribute('data-providerkey')] = value;
|
lookupInfo.ProviderIds[txtLookupId[i].getAttribute("data-providerkey")] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasId && !lookupInfo.Name) {
|
if (!hasId && !lookupInfo.Name) {
|
||||||
require(['toast'], function (toast) {
|
require(["toast"], function (toast) {
|
||||||
toast(globalize.translate('PleaseEnterNameOrId'));
|
toast(globalize.translate("PleaseEnterNameOrId"));
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -62,8 +65,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
if (currentItem && currentItem.Id) {
|
if (currentItem && currentItem.Id) {
|
||||||
lookupInfo.ItemId = currentItem.Id;
|
lookupInfo.ItemId = currentItem.Id;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
lookupInfo.IncludeDisabledProviders = true;
|
lookupInfo.IncludeDisabledProviders = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +78,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType),
|
url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType),
|
||||||
data: JSON.stringify(lookupInfo),
|
data: JSON.stringify(lookupInfo),
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
dataType: 'json'
|
dataType: "json"
|
||||||
|
|
||||||
}).then(function (results) {
|
}).then(function (results) {
|
||||||
|
|
||||||
@ -87,26 +89,27 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
function showIdentificationSearchResults(page, results) {
|
function showIdentificationSearchResults(page, results) {
|
||||||
|
|
||||||
var identificationSearchResults = page.querySelector('.identificationSearchResults');
|
var identificationSearchResults = page.querySelector(".identificationSearchResults");
|
||||||
|
|
||||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||||
identificationSearchResults.classList.remove('hide');
|
identificationSearchResults.classList.remove("hide");
|
||||||
page.querySelector('.identifyOptionsForm').classList.add('hide');
|
page.querySelector(".identifyOptionsForm").classList.add("hide");
|
||||||
page.querySelector('.dialogContentInner').classList.remove('dialog-content-centered');
|
page.querySelector(".dialogContentInner").classList.remove("dialog-content-centered");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
for (i = 0, length = results.length; i < length; i++) {
|
for (i = 0, length = results.length; i < length; i++) {
|
||||||
|
|
||||||
var result = results[i];
|
var result = results[i];
|
||||||
html += getSearchResultHtml(result, i);
|
html += getSearchResultHtml(result, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
var elem = page.querySelector('.identificationSearchResultList');
|
var elem = page.querySelector(".identificationSearchResultList");
|
||||||
elem.innerHTML = html;
|
elem.innerHTML = html;
|
||||||
|
|
||||||
function onSearchImageClick() {
|
function onSearchImageClick() {
|
||||||
var index = parseInt(this.getAttribute('data-index'));
|
var index = parseInt(this.getAttribute("data-index"));
|
||||||
|
|
||||||
var currentResult = results[index];
|
var currentResult = results[index];
|
||||||
|
|
||||||
@ -119,10 +122,10 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var searchImages = elem.querySelectorAll('.card');
|
var searchImages = elem.querySelectorAll(".card");
|
||||||
for (i = 0, length = searchImages.length; i < length; i++) {
|
for (i = 0, length = searchImages.length; i < length; i++) {
|
||||||
|
|
||||||
searchImages[i].addEventListener('click', onSearchImageClick);
|
searchImages[i].addEventListener("click", onSearchImageClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
@ -140,13 +143,13 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
function showIdentifyOptions(page, identifyResult) {
|
function showIdentifyOptions(page, identifyResult) {
|
||||||
|
|
||||||
var identifyOptionsForm = page.querySelector('.identifyOptionsForm');
|
var identifyOptionsForm = page.querySelector(".identifyOptionsForm");
|
||||||
|
|
||||||
page.querySelector('.popupIdentifyForm').classList.add('hide');
|
page.querySelector(".popupIdentifyForm").classList.add("hide");
|
||||||
page.querySelector('.identificationSearchResults').classList.add('hide');
|
page.querySelector(".identificationSearchResults").classList.add("hide");
|
||||||
identifyOptionsForm.classList.remove('hide');
|
identifyOptionsForm.classList.remove("hide");
|
||||||
page.querySelector('#chkIdentifyReplaceImages').checked = true;
|
page.querySelector("#chkIdentifyReplaceImages").checked = true;
|
||||||
page.querySelector('.dialogContentInner').classList.add('dialog-content-centered');
|
page.querySelector(".dialogContentInner").classList.add("dialog-content-centered");
|
||||||
|
|
||||||
currentSearchResult = identifyResult;
|
currentSearchResult = identifyResult;
|
||||||
|
|
||||||
@ -157,49 +160,49 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
lines.push(identifyResult.ProductionYear);
|
lines.push(identifyResult.ProductionYear);
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultHtml = lines.join('<br/>');
|
var resultHtml = lines.join("<br/>");
|
||||||
|
|
||||||
if (identifyResult.ImageUrl) {
|
if (identifyResult.ImageUrl) {
|
||||||
var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName);
|
var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName);
|
||||||
|
|
||||||
resultHtml = '<div style="display:flex;align-items:center;"><img src="' + displayUrl + '" style="max-height:240px;" /><div style="margin-left:1em;">' + resultHtml + '</div>';
|
resultHtml = '<div style="display:flex;align-items:center;"><img src="' + displayUrl + '" style="max-height:240px;" /><div style="margin-left:1em;">' + resultHtml + "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
page.querySelector('.selectedSearchResult').innerHTML = resultHtml;
|
page.querySelector(".selectedSearchResult").innerHTML = resultHtml;
|
||||||
|
|
||||||
focusManager.focus(identifyOptionsForm.querySelector('.btnSubmit'));
|
focusManager.focus(identifyOptionsForm.querySelector(".btnSubmit"));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSearchResultHtml(result, index) {
|
function getSearchResultHtml(result, index) {
|
||||||
|
|
||||||
var html = '';
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
|
var html = "";
|
||||||
var cssClass = "card scalableCard";
|
var cssClass = "card scalableCard";
|
||||||
var cardBoxCssClass = 'cardBox';
|
var cardBoxCssClass = "cardBox";
|
||||||
var padderClass;
|
var padderClass;
|
||||||
|
|
||||||
if (currentItemType === "Episode") {
|
if (currentItemType === "Episode") {
|
||||||
cssClass += " backdropCard backdropCard-scalable";
|
cssClass += " backdropCard backdropCard-scalable";
|
||||||
padderClass = 'cardPadder-backdrop';
|
padderClass = "cardPadder-backdrop";
|
||||||
}
|
} else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
||||||
else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") {
|
|
||||||
cssClass += " squareCard squareCard-scalable";
|
cssClass += " squareCard squareCard-scalable";
|
||||||
padderClass = 'cardPadder-square';
|
padderClass = "cardPadder-square";
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
cssClass += " portraitCard portraitCard-scalable";
|
cssClass += " portraitCard portraitCard-scalable";
|
||||||
padderClass = 'cardPadder-portrait';
|
padderClass = "cardPadder-portrait";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layoutManager.tv && !browser.slow) {
|
|
||||||
cardBoxCssClass += ' cardBox-focustransform';
|
|
||||||
}
|
|
||||||
|
|
||||||
cardBoxCssClass += ' cardBox-bottompadded';
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
cardBoxCssClass += ' card-focuscontent cardBox-withfocuscontent';
|
cssClass += " show-focus";
|
||||||
|
|
||||||
|
if (enableFocusTransform) {
|
||||||
|
cssClass += " show-animation";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cardBoxCssClass += " cardBox-bottompadded";
|
||||||
|
|
||||||
html += '<button type="button" class="' + cssClass + '" data-index="' + index + '">';
|
html += '<button type="button" class="' + cssClass + '" data-index="' + index + '">';
|
||||||
html += '<div class="' + cardBoxCssClass + '">';
|
html += '<div class="' + cardBoxCssClass + '">';
|
||||||
html += '<div class="cardScalable">';
|
html += '<div class="cardScalable">';
|
||||||
@ -215,8 +218,8 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
html += '<div class="cardImageContainer coveredImage defaultCardBackground defaultCardBackground1"><div class="cardText cardCenteredText">' + result.Name + '</div></div>';
|
html += '<div class="cardImageContainer coveredImage defaultCardBackground defaultCardBackground1"><div class="cardText cardCenteredText">' + result.Name + '</div></div>';
|
||||||
}
|
}
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
|
|
||||||
var numLines = 2;
|
var numLines = 2;
|
||||||
if (currentItemType === "MusicAlbum") {
|
if (currentItemType === "MusicAlbum") {
|
||||||
@ -239,12 +242,12 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
} else {
|
} else {
|
||||||
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
html += '<div class="cardText cardText-secondary cardTextCentered">';
|
||||||
}
|
}
|
||||||
html += lines[i] || ' ';
|
html += lines[i] || " ";
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
html += '</button>';
|
html += "</button>";
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +262,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
ReplaceAllImages: page.querySelector('#chkIdentifyReplaceImages').checked
|
ReplaceAllImages: page.querySelector("#chkIdentifyReplaceImages").checked
|
||||||
};
|
};
|
||||||
|
|
||||||
var apiClient = getApiClient();
|
var apiClient = getApiClient();
|
||||||
@ -291,7 +294,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) {
|
apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) {
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
|
|
||||||
var providerIds = item.ProviderIds || {};
|
var providerIds = item.ProviderIds || {};
|
||||||
|
|
||||||
@ -303,30 +306,30 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
html += '<div class="inputContainer">';
|
html += '<div class="inputContainer">';
|
||||||
|
|
||||||
var idLabel = globalize.translate('LabelDynamicExternalId').replace('{0}', idInfo.Name);
|
var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", idInfo.Name);
|
||||||
|
|
||||||
var value = providerIds[idInfo.Key] || '';
|
var value = providerIds[idInfo.Key] || "";
|
||||||
|
|
||||||
html += '<input is="emby-input" class="txtLookupId" data-providerkey="' + idInfo.Key + '" id="' + id + '" label="' + idLabel + '"/>';
|
html += '<input is="emby-input" class="txtLookupId" data-providerkey="' + idInfo.Key + '" id="' + id + '" label="' + idLabel + '"/>';
|
||||||
|
|
||||||
html += '</div>';
|
html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
page.querySelector('#txtLookupName').value = '';
|
page.querySelector("#txtLookupName").value = "";
|
||||||
|
|
||||||
if (item.Type === "Person" || item.Type === "BoxSet") {
|
if (item.Type === "Person" || item.Type === "BoxSet") {
|
||||||
|
|
||||||
page.querySelector('.fldLookupYear').classList.add('hide');
|
page.querySelector(".fldLookupYear").classList.add("hide");
|
||||||
page.querySelector('#txtLookupYear').value = '';
|
page.querySelector("#txtLookupYear").value = "";
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
page.querySelector('.fldLookupYear').classList.remove('hide');
|
page.querySelector(".fldLookupYear").classList.remove("hide");
|
||||||
page.querySelector('#txtLookupYear').value = '';
|
page.querySelector("#txtLookupYear").value = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
page.querySelector('.identifyProviderIds').innerHTML = html;
|
page.querySelector(".identifyProviderIds").innerHTML = html;
|
||||||
|
|
||||||
page.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Identify');
|
page.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Identify");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +337,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
require(['text!./itemidentifier.template.html'], function (template) {
|
require(["text!./itemidentifier.template.html"], function (template) {
|
||||||
|
|
||||||
var apiClient = getApiClient();
|
var apiClient = getApiClient();
|
||||||
|
|
||||||
@ -344,54 +347,62 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
currentItemType = currentItem.Type;
|
currentItemType = currentItem.Type;
|
||||||
|
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
size: 'fullscreen-border',
|
size: "fullscreen-border",
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
dialogOptions.size = 'fullscreen';
|
dialogOptions.size = "fullscreen";
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
dlg.classList.add("formDialog");
|
||||||
dlg.classList.add('recordingDialog');
|
dlg.classList.add("recordingDialog");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
html += globalize.translateDocument(template, 'core');
|
html += globalize.translateDocument(template, "core");
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
dlg.innerHTML = html;
|
||||||
|
|
||||||
// Has to be assigned a z-index after the call to .open()
|
// Has to be assigned a z-index after the call to .open()
|
||||||
dlg.addEventListener('close', onDialogClosed);
|
dlg.addEventListener("close", onDialogClosed);
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item.Path) {
|
||||||
|
dlg.querySelector('.fldPath').classList.remove('hide');
|
||||||
|
} else {
|
||||||
|
dlg.querySelector('.fldPath').classList.add('hide');
|
||||||
|
}
|
||||||
|
|
||||||
|
dlg.querySelector('.txtPath').innerHTML = item.Path || '';
|
||||||
|
|
||||||
dialogHelper.open(dlg);
|
dialogHelper.open(dlg);
|
||||||
|
|
||||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
searchForIdentificationResults(dlg);
|
searchForIdentificationResults(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.identifyOptionsForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".identifyOptionsForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
submitIdentficationResult(dlg);
|
submitIdentficationResult(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||||
|
|
||||||
dialogHelper.close(dlg);
|
dialogHelper.close(dlg);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.classList.add('identifyDialog');
|
dlg.classList.add("identifyDialog");
|
||||||
|
|
||||||
showIdentificationForm(dlg, item);
|
showIdentificationForm(dlg, item);
|
||||||
loading.hide();
|
loading.hide();
|
||||||
@ -414,47 +425,47 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
currentItem = null;
|
currentItem = null;
|
||||||
currentItemType = itemType;
|
currentItemType = itemType;
|
||||||
|
|
||||||
require(['text!./itemidentifier.template.html'], function (template) {
|
require(["text!./itemidentifier.template.html"], function (template) {
|
||||||
|
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
size: 'fullscreen-border',
|
size: "fullscreen-border",
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
};
|
};
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
dialogOptions.size = 'fullscreen';
|
dialogOptions.size = "fullscreen";
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
dlg.classList.add("formDialog");
|
||||||
dlg.classList.add('recordingDialog');
|
dlg.classList.add("recordingDialog");
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
html += globalize.translateDocument(template, 'core');
|
html += globalize.translateDocument(template, "core");
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
dlg.innerHTML = html;
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogHelper.open(dlg);
|
dialogHelper.open(dlg);
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
dlg.querySelector(".btnCancel").addEventListener("click", function (e) {
|
||||||
|
|
||||||
dialogHelper.close(dlg);
|
dialogHelper.close(dlg);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) {
|
dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) {
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
searchForIdentificationResults(dlg);
|
searchForIdentificationResults(dlg);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
dlg.addEventListener("close", function () {
|
||||||
|
|
||||||
loading.hide();
|
loading.hide();
|
||||||
var foundItem = hasChanges ? currentSearchResult : null;
|
var foundItem = hasChanges ? currentSearchResult : null;
|
||||||
@ -462,7 +473,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
resolveFunc(foundItem);
|
resolveFunc(foundItem);
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.classList.add('identifyDialog');
|
dlg.classList.add("identifyDialog");
|
||||||
|
|
||||||
showIdentificationFormFindNew(dlg, itemName, itemYear, itemType);
|
showIdentificationFormFindNew(dlg, itemName, itemYear, itemType);
|
||||||
});
|
});
|
||||||
@ -470,20 +481,20 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
|
|||||||
|
|
||||||
function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) {
|
function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) {
|
||||||
|
|
||||||
dlg.querySelector('#txtLookupName').value = itemName;
|
dlg.querySelector("#txtLookupName").value = itemName;
|
||||||
|
|
||||||
if (itemType === "Person" || itemType === "BoxSet") {
|
if (itemType === "Person" || itemType === "BoxSet") {
|
||||||
|
|
||||||
dlg.querySelector('.fldLookupYear').classList.add('hide');
|
dlg.querySelector(".fldLookupYear").classList.add("hide");
|
||||||
dlg.querySelector('#txtLookupYear').value = '';
|
dlg.querySelector("#txtLookupYear").value = "";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
dlg.querySelector('.fldLookupYear').classList.remove('hide');
|
dlg.querySelector(".fldLookupYear").classList.remove("hide");
|
||||||
dlg.querySelector('#txtLookupYear').value = itemYear;
|
dlg.querySelector("#txtLookupYear").value = itemYear;
|
||||||
}
|
}
|
||||||
|
|
||||||
dlg.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Search');
|
dlg.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Search");
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<div class="formDialogHeader">
|
<div class="formDialogHeader">
|
||||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>
|
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1">
|
||||||
|
<i class="md-icon"></i>
|
||||||
|
</button>
|
||||||
<h3 class="formDialogHeaderTitle">
|
<h3 class="formDialogHeaderTitle">
|
||||||
${Identify}
|
${Identify}
|
||||||
</h3>
|
</h3>
|
||||||
@ -10,11 +12,17 @@
|
|||||||
<form class="popupIdentifyForm" style="margin:auto;">
|
<form class="popupIdentifyForm" style="margin:auto;">
|
||||||
|
|
||||||
<p>${HeaderIdentifyItemHelp}</p>
|
<p>${HeaderIdentifyItemHelp}</p>
|
||||||
|
<div class="padded-bottom fldPath hide">
|
||||||
|
<div>${LabelPath}</div>
|
||||||
|
<div class="txtPath fieldDescription"></div>
|
||||||
|
</div>
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input is="emby-input" type="text" id="txtLookupName" class="identifyField" data-lookup="Name" label="${LabelName}" />
|
<input is="emby-input" type="text" id="txtLookupName" class="identifyField" data-lookup="Name"
|
||||||
|
label="${LabelName}" />
|
||||||
</div>
|
</div>
|
||||||
<div class="fldLookupYear inputContainer">
|
<div class="fldLookupYear inputContainer">
|
||||||
<input is="emby-input" type="number" id="txtLookupYear" class="identifyField" data-lookup="Year" pattern="[0-9]*" min="1800" label="${LabelYear}" />
|
<input is="emby-input" type="number" id="txtLookupYear" class="identifyField" data-lookup="Year"
|
||||||
|
pattern="[0-9]*" min="1800" label="${LabelYear}" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="identifyProviderIds">
|
<div class="identifyProviderIds">
|
||||||
@ -43,10 +51,11 @@
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="formDialogFooter">
|
<div class="formDialogFooter">
|
||||||
<button is="emby-button" type="submit" class="raised button-submit block btnSubmit formDialogFooterItem">
|
<button is="emby-button" type="submit"
|
||||||
|
class="raised button-submit block btnSubmit formDialogFooterItem">
|
||||||
<span>${ButtonOk}</span>
|
<span>${ButtonOk}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11,8 +11,7 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
|
|||||||
if (eventsToMonitor.indexOf('markfavorite') !== -1) {
|
if (eventsToMonitor.indexOf('markfavorite') !== -1) {
|
||||||
|
|
||||||
instance.notifyRefreshNeeded();
|
instance.notifyRefreshNeeded();
|
||||||
}
|
} else if (eventsToMonitor.indexOf('markplayed') !== -1) {
|
||||||
else if (eventsToMonitor.indexOf('markplayed') !== -1) {
|
|
||||||
|
|
||||||
instance.notifyRefreshNeeded();
|
instance.notifyRefreshNeeded();
|
||||||
}
|
}
|
||||||
@ -115,9 +114,7 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM
|
|||||||
instance.notifyRefreshNeeded(true);
|
instance.notifyRefreshNeeded(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') {
|
||||||
|
|
||||||
else if (state.NowPlayingItem && state.NowPlayingItem.MediaType === 'Audio') {
|
|
||||||
|
|
||||||
if (eventsToMonitor.indexOf('audioplayback') !== -1) {
|
if (eventsToMonitor.indexOf('audioplayback') !== -1) {
|
||||||
|
|
||||||
|
@ -8,20 +8,20 @@ define(['inputManager', 'focusManager'], function(inputManager, focusManager) {
|
|||||||
var capture = true;
|
var capture = true;
|
||||||
|
|
||||||
switch (e.keyCode) {
|
switch (e.keyCode) {
|
||||||
case 37: // ArrowLeft
|
case 37: // ArrowLeft
|
||||||
inputManager.handle('left');
|
inputManager.handle('left');
|
||||||
break;
|
break;
|
||||||
case 38: // ArrowUp
|
case 38: // ArrowUp
|
||||||
inputManager.handle('up');
|
inputManager.handle('up');
|
||||||
break;
|
break;
|
||||||
case 39: // ArrowRight
|
case 39: // ArrowRight
|
||||||
inputManager.handle('right');
|
inputManager.handle('right');
|
||||||
break;
|
break;
|
||||||
case 40: // ArrowDown
|
case 40: // ArrowDown
|
||||||
inputManager.handle('down');
|
inputManager.handle('down');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
capture = false;
|
capture = false;
|
||||||
}
|
}
|
||||||
if (capture) {
|
if (capture) {
|
||||||
console.log("Disabling default event handling");
|
console.log("Disabling default event handling");
|
||||||
@ -31,6 +31,6 @@ define(['inputManager', 'focusManager'], function(inputManager, focusManager) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
enable: enable,
|
enable: enable
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -45,7 +45,7 @@ define(['require', 'browser'], function (require, browser) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
observerOptions
|
observerOptions
|
||||||
);
|
);
|
||||||
|
|
||||||
this.observer = observer;
|
this.observer = observer;
|
||||||
|
@ -9,7 +9,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
}
|
}
|
||||||
|
|
||||||
var sortBy = (options.sortBy || '').toLowerCase();
|
var sortBy = (options.sortBy || '').toLowerCase();
|
||||||
var code, name;
|
var code;
|
||||||
|
var name;
|
||||||
|
|
||||||
if (sortBy.indexOf('sortname') === 0) {
|
if (sortBy.indexOf('sortname') === 0) {
|
||||||
|
|
||||||
@ -85,15 +86,12 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
|
|
||||||
options.tag = item.AlbumPrimaryImageTag;
|
options.tag = item.AlbumPrimaryImageTag;
|
||||||
return apiClient.getScaledImageUrl(item.AlbumId, options);
|
return apiClient.getScaledImageUrl(item.AlbumId, options);
|
||||||
}
|
} else if (item.SeriesId && item.SeriesPrimaryImageTag) {
|
||||||
|
|
||||||
else if (item.SeriesId && item.SeriesPrimaryImageTag) {
|
|
||||||
|
|
||||||
options.tag = item.SeriesPrimaryImageTag;
|
options.tag = item.SeriesPrimaryImageTag;
|
||||||
return apiClient.getScaledImageUrl(item.SeriesId, options);
|
return apiClient.getScaledImageUrl(item.SeriesId, options);
|
||||||
|
|
||||||
}
|
} else if (item.ParentPrimaryImageTag) {
|
||||||
else if (item.ParentPrimaryImageTag) {
|
|
||||||
|
|
||||||
options.tag = item.ParentPrimaryImageTag;
|
options.tag = item.ParentPrimaryImageTag;
|
||||||
return apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, options);
|
return apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, options);
|
||||||
@ -209,8 +207,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
|
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
html += '<h2 class="listGroupHeader listGroupHeader-first">';
|
html += '<h2 class="listGroupHeader listGroupHeader-first">';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
html += '<h2 class="listGroupHeader">';
|
html += '<h2 class="listGroupHeader">';
|
||||||
}
|
}
|
||||||
html += itemGroupTitle;
|
html += itemGroupTitle;
|
||||||
@ -349,9 +346,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
if (options.showParentTitle) {
|
if (options.showParentTitle) {
|
||||||
if (item.Type === 'Episode') {
|
if (item.Type === 'Episode') {
|
||||||
parentTitle = item.SeriesName;
|
parentTitle = item.SeriesName;
|
||||||
}
|
} else if (item.IsSeries || (item.EpisodeTitle && item.Name)) {
|
||||||
|
|
||||||
else if (item.IsSeries || (item.EpisodeTitle && item.Name)) {
|
|
||||||
parentTitle = item.Name;
|
parentTitle = item.Name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -375,8 +370,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
}
|
}
|
||||||
|
|
||||||
textlines.push(parentTitle || '');
|
textlines.push(parentTitle || '');
|
||||||
}
|
} else if (options.showParentTitle) {
|
||||||
else if (options.showParentTitle) {
|
|
||||||
textlines.push(parentTitle || '');
|
textlines.push(parentTitle || '');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,8 +394,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
|||||||
|
|
||||||
if (!artistItems || !artistItems.length) {
|
if (!artistItems || !artistItems.length) {
|
||||||
showArtist = true;
|
showArtist = true;
|
||||||
}
|
} else if (artistItems.length > 1 || containerAlbumArtistIds.indexOf(artistItems[0].Id) === -1) {
|
||||||
else if (artistItems.length > 1 || containerAlbumArtistIds.indexOf(artistItems[0].Id) === -1) {
|
|
||||||
showArtist = true;
|
showArtist = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,8 @@ define(['components/loading/loadingLegacy', 'browser', 'css!./loading'], functio
|
|||||||
layer3.classList.add('mdl-spinner__layer-3-active');
|
layer3.classList.add('mdl-spinner__layer-3-active');
|
||||||
layer4.classList.add('mdl-spinner__layer-4-active');
|
layer4.classList.add('mdl-spinner__layer-4-active');
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = circleLefts.length; i < length; i++) {
|
for (i = 0, length = circleLefts.length; i < length; i++) {
|
||||||
circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
|
circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
|
||||||
@ -67,7 +68,8 @@ define(['components/loading/loadingLegacy', 'browser', 'css!./loading'], functio
|
|||||||
elem.classList.remove('mdl-spinner__layer-3-active');
|
elem.classList.remove('mdl-spinner__layer-3-active');
|
||||||
elem.classList.remove('mdl-spinner__layer-4-active');
|
elem.classList.remove('mdl-spinner__layer-4-active');
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = circleLefts.length; i < length; i++) {
|
for (i = 0, length = circleLefts.length; i < length; i++) {
|
||||||
circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
|
circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
|
||||||
|
@ -7,16 +7,13 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
|
|
||||||
if (item.Type === 'SeriesTimer') {
|
if (item.Type === 'SeriesTimer') {
|
||||||
return '<i class="md-icon mediaInfoItem mediaInfoIconItem mediaInfoTimerIcon"></i>';
|
return '<i class="md-icon mediaInfoItem mediaInfoIconItem mediaInfoTimerIcon"></i>';
|
||||||
}
|
} else if (item.TimerId || item.SeriesTimerId) {
|
||||||
else if (item.TimerId || item.SeriesTimerId) {
|
|
||||||
|
|
||||||
status = item.Status || 'Cancelled';
|
status = item.Status || 'Cancelled';
|
||||||
}
|
} else if (item.Type === 'Timer') {
|
||||||
else if (item.Type === 'Timer') {
|
|
||||||
|
|
||||||
status = item.Status;
|
status = item.Status;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,7 +33,8 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
var html = '';
|
var html = '';
|
||||||
|
|
||||||
var miscInfo = [];
|
var miscInfo = [];
|
||||||
var text, date;
|
var text;
|
||||||
|
var date;
|
||||||
|
|
||||||
if (item.StartDate && options.programTime !== false) {
|
if (item.StartDate && options.programTime !== false) {
|
||||||
|
|
||||||
@ -58,8 +56,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
}
|
}
|
||||||
|
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.StartDate);
|
console.log("Error parsing date: " + item.StartDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,7 +104,9 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
|
|
||||||
var miscInfo = [];
|
var miscInfo = [];
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var text, date, minutes;
|
var text;
|
||||||
|
var date;
|
||||||
|
var minutes;
|
||||||
var count;
|
var count;
|
||||||
|
|
||||||
var showFolderRuntime = item.Type === "MusicAlbum" || item.MediaType === 'MusicArtist' || item.MediaType === 'Playlist' || item.MediaType === 'MusicGenre';
|
var showFolderRuntime = item.Type === "MusicAlbum" || item.MediaType === 'MusicArtist' || item.MediaType === 'Playlist' || item.MediaType === 'MusicGenre';
|
||||||
@ -124,9 +123,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
if (item.RunTimeTicks) {
|
if (item.RunTimeTicks) {
|
||||||
miscInfo.push(datetime.getDisplayRunningTime(item.RunTimeTicks));
|
miscInfo.push(datetime.getDisplayRunningTime(item.RunTimeTicks));
|
||||||
}
|
}
|
||||||
}
|
} else if (item.Type === "PhotoAlbum" || item.Type === "BoxSet") {
|
||||||
|
|
||||||
else if (item.Type === "PhotoAlbum" || item.Type === "BoxSet") {
|
|
||||||
|
|
||||||
count = item.ChildCount;
|
count = item.ChildCount;
|
||||||
|
|
||||||
@ -145,8 +142,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
|
|
||||||
text = datetime.toLocaleDateString(date);
|
text = datetime.toLocaleDateString(date);
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.PremiereDate);
|
console.log("Error parsing date: " + item.PremiereDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,8 +158,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
|
|
||||||
if (item.RecordAnyChannel) {
|
if (item.RecordAnyChannel) {
|
||||||
miscInfo.push(globalize.translate('AllChannels'));
|
miscInfo.push(globalize.translate('AllChannels'));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
miscInfo.push(item.ChannelName || globalize.translate('OneChannel'));
|
miscInfo.push(item.ChannelName || globalize.translate('OneChannel'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,8 +175,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
text = datetime.getDisplayTime(date);
|
text = datetime.getDisplayTime(date);
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
}
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.StartDate);
|
console.log("Error parsing date: " + item.StartDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -191,8 +185,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
if (item.Status === "Continuing") {
|
if (item.Status === "Continuing") {
|
||||||
miscInfo.push(globalize.translate('SeriesYearToPresent', item.ProductionYear));
|
miscInfo.push(globalize.translate('SeriesYearToPresent', item.ProductionYear));
|
||||||
|
|
||||||
}
|
} else if (item.ProductionYear) {
|
||||||
else if (item.ProductionYear) {
|
|
||||||
|
|
||||||
text = item.ProductionYear;
|
text = item.ProductionYear;
|
||||||
|
|
||||||
@ -206,8 +199,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
text += "-" + datetime.parseISO8601Date(item.EndDate).getFullYear();
|
text += "-" + datetime.parseISO8601Date(item.EndDate).getFullYear();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.EndDate);
|
console.log("Error parsing date: " + item.EndDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,18 +215,15 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
miscInfo.push({
|
miscInfo.push({
|
||||||
html: '<div class="mediaInfoProgramAttribute mediaInfoItem liveTvProgram">' + globalize.translate('Live') + '</div>'
|
html: '<div class="mediaInfoProgramAttribute mediaInfoItem liveTvProgram">' + globalize.translate('Live') + '</div>'
|
||||||
});
|
});
|
||||||
}
|
} else if (item.IsPremiere) {
|
||||||
else if (item.IsPremiere) {
|
|
||||||
miscInfo.push({
|
miscInfo.push({
|
||||||
html: '<div class="mediaInfoProgramAttribute mediaInfoItem premiereTvProgram">' + globalize.translate('Premiere') + '</div>'
|
html: '<div class="mediaInfoProgramAttribute mediaInfoItem premiereTvProgram">' + globalize.translate('Premiere') + '</div>'
|
||||||
});
|
});
|
||||||
}
|
} else if (item.IsSeries && !item.IsRepeat) {
|
||||||
else if (item.IsSeries && !item.IsRepeat) {
|
|
||||||
miscInfo.push({
|
miscInfo.push({
|
||||||
html: '<div class="mediaInfoProgramAttribute mediaInfoItem newTvProgram">' + globalize.translate('AttributeNew') + '</div>'
|
html: '<div class="mediaInfoProgramAttribute mediaInfoItem newTvProgram">' + globalize.translate('AttributeNew') + '</div>'
|
||||||
});
|
});
|
||||||
}
|
} else if (item.IsSeries && item.IsRepeat) {
|
||||||
else if (item.IsSeries && item.IsRepeat) {
|
|
||||||
miscInfo.push({
|
miscInfo.push({
|
||||||
html: '<div class="mediaInfoProgramAttribute mediaInfoItem repeatTvProgram">' + globalize.translate('Repeat') + '</div>'
|
html: '<div class="mediaInfoProgramAttribute mediaInfoItem repeatTvProgram">' + globalize.translate('Repeat') + '</div>'
|
||||||
});
|
});
|
||||||
@ -250,20 +239,15 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
if (text) {
|
if (text) {
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
}
|
||||||
}
|
} else if (item.IsMovie && item.ProductionYear && options.originalAirDate !== false) {
|
||||||
|
|
||||||
else if (item.IsMovie && item.ProductionYear && options.originalAirDate !== false) {
|
|
||||||
miscInfo.push(item.ProductionYear);
|
miscInfo.push(item.ProductionYear);
|
||||||
}
|
} else if (item.PremiereDate && options.originalAirDate !== false) {
|
||||||
|
|
||||||
else if (item.PremiereDate && options.originalAirDate !== false) {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
date = datetime.parseISO8601Date(item.PremiereDate);
|
date = datetime.parseISO8601Date(item.PremiereDate);
|
||||||
text = globalize.translate('OriginalAirDateValue', datetime.toLocaleDateString(date));
|
text = globalize.translate('OriginalAirDateValue', datetime.toLocaleDateString(date));
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.PremiereDate);
|
console.log("Error parsing date: " + item.PremiereDate);
|
||||||
}
|
}
|
||||||
} else if (item.ProductionYear) {
|
} else if (item.ProductionYear) {
|
||||||
@ -277,14 +261,12 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
|
|||||||
if (item.ProductionYear) {
|
if (item.ProductionYear) {
|
||||||
|
|
||||||
miscInfo.push(item.ProductionYear);
|
miscInfo.push(item.ProductionYear);
|
||||||
}
|
} else if (item.PremiereDate) {
|
||||||
else if (item.PremiereDate) {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
text = datetime.parseISO8601Date(item.PremiereDate).getFullYear();
|
text = datetime.parseISO8601Date(item.PremiereDate).getFullYear();
|
||||||
miscInfo.push(text);
|
miscInfo.push(text);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.log("Error parsing date: " + item.PremiereDate);
|
console.log("Error parsing date: " + item.PremiereDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,13 +151,13 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||||||
var xhr = new XMLHttpRequest;
|
var xhr = new XMLHttpRequest;
|
||||||
xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", true);
|
xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", true);
|
||||||
xhr.onload = function(e) {
|
xhr.onload = function(e) {
|
||||||
var template = this.response,
|
var template = this.response;
|
||||||
dlg = dialogHelper.createDialog({
|
var dlg = dialogHelper.createDialog({
|
||||||
size: "medium-tall",
|
size: "medium-tall",
|
||||||
modal: false,
|
modal: false,
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
});
|
});
|
||||||
dlg.classList.add("ui-body-a");
|
dlg.classList.add("ui-body-a");
|
||||||
dlg.classList.add("background-theme-a");
|
dlg.classList.add("background-theme-a");
|
||||||
dlg.classList.add("dlg-librarycreator");
|
dlg.classList.add("dlg-librarycreator");
|
||||||
|
@ -144,7 +144,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
AirTime: form.querySelector('#txtAirTime').value,
|
AirTime: form.querySelector('#txtAirTime').value,
|
||||||
Genres: getListValues(form.querySelector("#listGenres")),
|
Genres: getListValues(form.querySelector("#listGenres")),
|
||||||
Tags: getListValues(form.querySelector("#listTags")),
|
Tags: getListValues(form.querySelector("#listTags")),
|
||||||
Studios: getListValues(form.querySelector("#listStudios")).map(function (element) { return { Name: element }; }),
|
Studios: getListValues(form.querySelector("#listStudios")).map(function (element) {
|
||||||
|
return { Name: element };
|
||||||
|
}),
|
||||||
|
|
||||||
PremiereDate: getDateValue(form, '#txtPremiereDate', 'PremiereDate'),
|
PremiereDate: getDateValue(form, '#txtPremiereDate', 'PremiereDate'),
|
||||||
DateCreated: getDateValue(form, '#txtDateAdded', 'DateCreated'),
|
DateCreated: getDateValue(form, '#txtDateAdded', 'DateCreated'),
|
||||||
@ -202,7 +204,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getListValues(list) {
|
function getListValues(list) {
|
||||||
return Array.prototype.map.call(list.querySelectorAll('.textValue'), function (el) { return el.textContent; });
|
return Array.prototype.map.call(list.querySelectorAll('.textValue'), function (el) {
|
||||||
|
return el.textContent;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function addElementToList(source, sortCallback) {
|
function addElementToList(source, sortCallback) {
|
||||||
@ -439,7 +443,6 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
|
|
||||||
var html = metadataInfo.ContentTypeOptions.map(function (i) {
|
var html = metadataInfo.ContentTypeOptions.map(function (i) {
|
||||||
|
|
||||||
|
|
||||||
return '<option value="' + i.Value + '">' + i.Name + '</option>';
|
return '<option value="' + i.Value + '">' + i.Name + '</option>';
|
||||||
|
|
||||||
}).join('');
|
}).join('');
|
||||||
@ -744,7 +747,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
populateListView(context.querySelector('#listGenres'), item.Genres);
|
populateListView(context.querySelector('#listGenres'), item.Genres);
|
||||||
populatePeople(context, item.People || []);
|
populatePeople(context, item.People || []);
|
||||||
|
|
||||||
populateListView(context.querySelector('#listStudios'), (item.Studios || []).map(function (element) { return element.Name || ''; }));
|
populateListView(context.querySelector('#listStudios'), (item.Studios || []).map(function (element) {
|
||||||
|
return element.Name || '';
|
||||||
|
}));
|
||||||
|
|
||||||
populateListView(context.querySelector('#listTags'), item.Tags);
|
populateListView(context.querySelector('#listTags'), item.Tags);
|
||||||
|
|
||||||
@ -783,8 +788,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
|
|
||||||
if (item.Type === 'Series') {
|
if (item.Type === 'Series') {
|
||||||
context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || '';
|
context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || '';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || '';
|
context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -859,7 +863,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
html += "<option value=''></option>";
|
html += "<option value=''></option>";
|
||||||
|
|
||||||
var ratings = [];
|
var ratings = [];
|
||||||
var i, length, rating;
|
var i;
|
||||||
|
var length;
|
||||||
|
var rating;
|
||||||
|
|
||||||
var currentValueFound = false;
|
var currentValueFound = false;
|
||||||
|
|
||||||
@ -901,7 +907,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
|
|||||||
|
|
||||||
items = items || [];
|
items = items || [];
|
||||||
if (typeof (sortCallback) === 'undefined') {
|
if (typeof (sortCallback) === 'undefined') {
|
||||||
items.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
|
items.sort(function (a, b) {
|
||||||
|
return a.toLowerCase().localeCompare(b.toLowerCase());
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
items = sortCallback(items);
|
items = sortCallback(items);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'globalize', 'appRouter', 'dom', 'css!./multiselect'], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) {
|
define(["browser", "appStorage", "apphost", "loading", "connectionManager", "globalize", "appRouter", "dom", "css!./multiselect"], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) {
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
var selectedItems = [];
|
var selectedItems = [];
|
||||||
var selectedElements = [];
|
var selectedElements = [];
|
||||||
@ -15,12 +15,12 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
selectedItems = [];
|
selectedItems = [];
|
||||||
selectedElements = [];
|
selectedElements = [];
|
||||||
var elems = document.querySelectorAll('.itemSelectionPanel');
|
var elems = document.querySelectorAll(".itemSelectionPanel");
|
||||||
for (var i = 0, length = elems.length; i < length; i++) {
|
for (var i = 0, length = elems.length; i < length; i++) {
|
||||||
|
|
||||||
var parent = elems[i].parentNode;
|
var parent = elems[i].parentNode;
|
||||||
parent.removeChild(elems[i]);
|
parent.removeChild(elems[i]);
|
||||||
parent.classList.remove('withMultiSelect');
|
parent.classList.remove("withMultiSelect");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,13 +28,13 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
function onItemSelectionPanelClick(e, itemSelectionPanel) {
|
function onItemSelectionPanelClick(e, itemSelectionPanel) {
|
||||||
|
|
||||||
// toggle the checkbox, if it wasn't clicked on
|
// toggle the checkbox, if it wasn't clicked on
|
||||||
if (!dom.parentWithClass(e.target, 'chkItemSelect')) {
|
if (!dom.parentWithClass(e.target, "chkItemSelect")) {
|
||||||
var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect');
|
var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect");
|
||||||
|
|
||||||
if (chkItemSelect) {
|
if (chkItemSelect) {
|
||||||
|
|
||||||
if (chkItemSelect.classList.contains('checkedInitial')) {
|
if (chkItemSelect.classList.contains("checkedInitial")) {
|
||||||
chkItemSelect.classList.remove('checkedInitial');
|
chkItemSelect.classList.remove("checkedInitial");
|
||||||
} else {
|
} else {
|
||||||
var newValue = !chkItemSelect.checked;
|
var newValue = !chkItemSelect.checked;
|
||||||
chkItemSelect.checked = newValue;
|
chkItemSelect.checked = newValue;
|
||||||
@ -50,7 +50,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
function updateItemSelection(chkItemSelect, selected) {
|
function updateItemSelection(chkItemSelect, selected) {
|
||||||
|
|
||||||
var id = dom.parentWithAttribute(chkItemSelect, 'data-id').getAttribute('data-id');
|
var id = dom.parentWithAttribute(chkItemSelect, "data-id").getAttribute("data-id");
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (selectedItems.length) {
|
if (selectedItems.length) {
|
||||||
var itemSelectionCount = document.querySelector('.itemSelectionCount');
|
var itemSelectionCount = document.querySelector(".itemSelectionCount");
|
||||||
if (itemSelectionCount) {
|
if (itemSelectionCount) {
|
||||||
itemSelectionCount.innerHTML = selectedItems.length;
|
itemSelectionCount.innerHTML = selectedItems.length;
|
||||||
}
|
}
|
||||||
@ -88,27 +88,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
function showSelection(item, isChecked) {
|
function showSelection(item, isChecked) {
|
||||||
|
|
||||||
var itemSelectionPanel = item.querySelector('.itemSelectionPanel');
|
var itemSelectionPanel = item.querySelector(".itemSelectionPanel");
|
||||||
|
|
||||||
if (!itemSelectionPanel) {
|
if (!itemSelectionPanel) {
|
||||||
|
|
||||||
itemSelectionPanel = document.createElement('div');
|
itemSelectionPanel = document.createElement("div");
|
||||||
itemSelectionPanel.classList.add('itemSelectionPanel');
|
itemSelectionPanel.classList.add("itemSelectionPanel");
|
||||||
|
|
||||||
var parent = item.querySelector('.cardBox') || item.querySelector('.cardContent');
|
var parent = item.querySelector(".cardBox") || item.querySelector(".cardContent");
|
||||||
parent.classList.add('withMultiSelect');
|
parent.classList.add("withMultiSelect");
|
||||||
parent.appendChild(itemSelectionPanel);
|
parent.appendChild(itemSelectionPanel);
|
||||||
|
|
||||||
var cssClass = 'chkItemSelect';
|
var cssClass = "chkItemSelect";
|
||||||
if (isChecked && !browser.firefox) {
|
if (isChecked && !browser.firefox) {
|
||||||
// In firefox, the initial tap hold doesnt' get treated as a click
|
// In firefox, the initial tap hold doesnt' get treated as a click
|
||||||
// In other browsers it does, so we need to make sure that initial click is ignored
|
// In other browsers it does, so we need to make sure that initial click is ignored
|
||||||
cssClass += ' checkedInitial';
|
cssClass += " checkedInitial";
|
||||||
}
|
}
|
||||||
var checkedAttribute = isChecked ? ' checked' : '';
|
var checkedAttribute = isChecked ? " checked" : "";
|
||||||
itemSelectionPanel.innerHTML = '<label class="checkboxContainer"><input type="checkbox" is="emby-checkbox" data-outlineclass="multiSelectCheckboxOutline" class="' + cssClass + '"' + checkedAttribute + '/><span></span></label>';
|
itemSelectionPanel.innerHTML = '<label class="checkboxContainer"><input type="checkbox" is="emby-checkbox" data-outlineclass="multiSelectCheckboxOutline" class="' + cssClass + '"' + checkedAttribute + '/><span></span></label>';
|
||||||
var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect');
|
var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect");
|
||||||
chkItemSelect.addEventListener('change', onSelectionChange);
|
chkItemSelect.addEventListener("change", onSelectionChange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,27 +118,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
if (!selectionCommandsPanel) {
|
if (!selectionCommandsPanel) {
|
||||||
|
|
||||||
selectionCommandsPanel = document.createElement('div');
|
selectionCommandsPanel = document.createElement("div");
|
||||||
selectionCommandsPanel.classList.add('selectionCommandsPanel');
|
selectionCommandsPanel.classList.add("selectionCommandsPanel");
|
||||||
|
|
||||||
document.body.appendChild(selectionCommandsPanel);
|
document.body.appendChild(selectionCommandsPanel);
|
||||||
currentSelectionCommandsPanel = selectionCommandsPanel;
|
currentSelectionCommandsPanel = selectionCommandsPanel;
|
||||||
|
|
||||||
var html = '';
|
var html = "";
|
||||||
|
|
||||||
html += '<button is="paper-icon-button-light" class="btnCloseSelectionPanel autoSize"><i class="md-icon">close</i></button>';
|
html += '<button is="paper-icon-button-light" class="btnCloseSelectionPanel autoSize"><i class="md-icon">close</i></button>';
|
||||||
html += '<h1 class="itemSelectionCount"></h1>';
|
html += '<h1 class="itemSelectionCount"></h1>';
|
||||||
|
|
||||||
var moreIcon = '';
|
var moreIcon = "";
|
||||||
html += '<button is="paper-icon-button-light" class="btnSelectionPanelOptions autoSize" style="margin-left:auto;"><i class="md-icon">' + moreIcon + '</i></button>';
|
html += '<button is="paper-icon-button-light" class="btnSelectionPanelOptions autoSize" style="margin-left:auto;"><i class="md-icon">' + moreIcon + '</i></button>';
|
||||||
|
|
||||||
selectionCommandsPanel.innerHTML = html;
|
selectionCommandsPanel.innerHTML = html;
|
||||||
|
|
||||||
selectionCommandsPanel.querySelector('.btnCloseSelectionPanel').addEventListener('click', hideSelections);
|
selectionCommandsPanel.querySelector(".btnCloseSelectionPanel").addEventListener("click", hideSelections);
|
||||||
|
|
||||||
var btnSelectionPanelOptions = selectionCommandsPanel.querySelector('.btnSelectionPanelOptions');
|
var btnSelectionPanelOptions = selectionCommandsPanel.querySelector(".btnSelectionPanelOptions");
|
||||||
|
|
||||||
dom.addEventListener(btnSelectionPanelOptions, 'click', showMenuForSelectedItems, { passive: true });
|
dom.addEventListener(btnSelectionPanelOptions, "click", showMenuForSelectedItems, { passive: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
require(['alert'], function (alert) {
|
require(["alert"], function (alert) {
|
||||||
alert(options).then(resolve, resolve);
|
alert(options).then(resolve, resolve);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -156,15 +156,15 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
var msg = globalize.translate('ConfirmDeleteItem');
|
var msg = globalize.translate("ConfirmDeleteItem");
|
||||||
var title = globalize.translate('HeaderDeleteItem');
|
var title = globalize.translate("HeaderDeleteItem");
|
||||||
|
|
||||||
if (itemIds.length > 1) {
|
if (itemIds.length > 1) {
|
||||||
msg = globalize.translate('ConfirmDeleteItems');
|
msg = globalize.translate("ConfirmDeleteItems");
|
||||||
title = globalize.translate('HeaderDeleteItems');
|
title = globalize.translate("HeaderDeleteItems");
|
||||||
}
|
}
|
||||||
|
|
||||||
require(['confirm'], function (confirm) {
|
require(["confirm"], function (confirm) {
|
||||||
|
|
||||||
confirm(msg, title).then(function () {
|
confirm(msg, title).then(function () {
|
||||||
var promises = itemIds.map(function (itemId) {
|
var promises = itemIds.map(function (itemId) {
|
||||||
@ -173,7 +173,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
Promise.all(promises).then(resolve, function () {
|
Promise.all(promises).then(resolve, function () {
|
||||||
|
|
||||||
alertText(globalize.translate('ErrorDeletingItem')).then(reject, reject);
|
alertText(globalize.translate("ErrorDeletingItem")).then(reject, reject);
|
||||||
});
|
});
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
@ -190,59 +190,60 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
var menuItems = [];
|
var menuItems = [];
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('AddToCollection'),
|
name: globalize.translate("AddToCollection"),
|
||||||
id: 'addtocollection',
|
id: "addtocollection",
|
||||||
ironIcon: 'add'
|
icon: "add"
|
||||||
});
|
});
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('AddToPlaylist'),
|
name: globalize.translate("AddToPlaylist"),
|
||||||
id: 'playlist',
|
id: "playlist",
|
||||||
ironIcon: 'playlist-add'
|
icon: "playlist_add"
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Be more dynamic based on what is selected
|
// TODO: Be more dynamic based on what is selected
|
||||||
if (user.Policy.EnableContentDeletion) {
|
if (user.Policy.EnableContentDeletion) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('Delete'),
|
name: globalize.translate("Delete"),
|
||||||
id: 'delete',
|
id: "delete",
|
||||||
ironIcon: 'delete'
|
icon: "delete"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Policy.EnableContentDownloading && appHost.supports('filedownload')) {
|
if (user.Policy.EnableContentDownloading && appHost.supports("filedownload")) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: Globalize.translate('ButtonDownload'),
|
name: Globalize.translate("ButtonDownload"),
|
||||||
id: 'download',
|
id: "download",
|
||||||
ironIcon: 'file-download'
|
icon: "file_download"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Policy.IsAdministrator) {
|
if (user.Policy.IsAdministrator) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('GroupVersions'),
|
name: globalize.translate("GroupVersions"),
|
||||||
id: 'groupvideos',
|
id: "groupvideos",
|
||||||
ironIcon: 'call-merge'
|
icon: "call_merge"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('MarkPlayed'),
|
name: globalize.translate("MarkPlayed"),
|
||||||
id: 'markplayed'
|
id: "markplayed",
|
||||||
|
icon: "check_box"
|
||||||
});
|
});
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('MarkUnplayed'),
|
name: globalize.translate("MarkUnplayed"),
|
||||||
id: 'markunplayed'
|
id: "markunplayed",
|
||||||
|
icon: "check_box_outline_blank"
|
||||||
});
|
});
|
||||||
|
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
name: globalize.translate('RefreshMetadata'),
|
name: globalize.translate("RefreshMetadata"),
|
||||||
id: 'refresh'
|
id: "refresh",
|
||||||
|
icon: "refresh"
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require(['actionsheet'], function (actionsheet) {
|
require(['actionsheet'], function (actionsheet) {
|
||||||
actionsheet.show({
|
actionsheet.show({
|
||||||
items: menuItems,
|
items: menuItems,
|
||||||
@ -252,8 +253,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
var serverId = apiClient.serverInfo().Id;
|
var serverId = apiClient.serverInfo().Id;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 'addtocollection':
|
case "addtocollection":
|
||||||
require(['collectionEditor'], function (collectionEditor) {
|
require(["collectionEditor"], function (collectionEditor) {
|
||||||
new collectionEditor().show({
|
new collectionEditor().show({
|
||||||
items: items,
|
items: items,
|
||||||
serverId: serverId
|
serverId: serverId
|
||||||
@ -262,8 +263,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
hideSelections();
|
hideSelections();
|
||||||
dispatchNeedsRefresh();
|
dispatchNeedsRefresh();
|
||||||
break;
|
break;
|
||||||
case 'playlist':
|
case "playlist":
|
||||||
require(['playlistEditor'], function (playlistEditor) {
|
require(["playlistEditor"], function (playlistEditor) {
|
||||||
new playlistEditor().show({
|
new playlistEditor().show({
|
||||||
items: items,
|
items: items,
|
||||||
serverId: serverId
|
serverId: serverId
|
||||||
@ -272,30 +273,30 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
hideSelections();
|
hideSelections();
|
||||||
dispatchNeedsRefresh();
|
dispatchNeedsRefresh();
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case "delete":
|
||||||
deleteItems(apiClient, items).then(dispatchNeedsRefresh);
|
deleteItems(apiClient, items).then(dispatchNeedsRefresh);
|
||||||
hideSelections();
|
hideSelections();
|
||||||
dispatchNeedsRefresh();
|
dispatchNeedsRefresh();
|
||||||
break;
|
break;
|
||||||
case 'groupvideos':
|
case "groupvideos":
|
||||||
combineVersions(apiClient, items);
|
combineVersions(apiClient, items);
|
||||||
break;
|
break;
|
||||||
case 'markplayed':
|
case "markplayed":
|
||||||
items.forEach(function (itemId) {
|
items.forEach(function (itemId) {
|
||||||
apiClient.markPlayed(apiClient.getCurrentUserId(), itemId);
|
apiClient.markPlayed(apiClient.getCurrentUserId(), itemId);
|
||||||
});
|
});
|
||||||
hideSelections();
|
hideSelections();
|
||||||
dispatchNeedsRefresh();
|
dispatchNeedsRefresh();
|
||||||
break;
|
break;
|
||||||
case 'markunplayed':
|
case "markunplayed":
|
||||||
items.forEach(function (itemId) {
|
items.forEach(function (itemId) {
|
||||||
apiClient.markUnplayed(apiClient.getCurrentUserId(), itemId);
|
apiClient.markUnplayed(apiClient.getCurrentUserId(), itemId);
|
||||||
});
|
});
|
||||||
hideSelections();
|
hideSelections();
|
||||||
dispatchNeedsRefresh();
|
dispatchNeedsRefresh();
|
||||||
break;
|
break;
|
||||||
case 'refresh':
|
case "refresh":
|
||||||
require(['refreshDialog'], function (refreshDialog) {
|
require(["refreshDialog"], function (refreshDialog) {
|
||||||
new refreshDialog({
|
new refreshDialog({
|
||||||
itemIds: items,
|
itemIds: items,
|
||||||
serverId: serverId
|
serverId: serverId
|
||||||
@ -320,7 +321,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
[].forEach.call(selectedElements, function (i) {
|
[].forEach.call(selectedElements, function (i) {
|
||||||
|
|
||||||
var container = dom.parentWithAttribute(i, 'is', 'emby-itemscontainer');
|
var container = dom.parentWithAttribute(i, "is", "emby-itemscontainer");
|
||||||
|
|
||||||
if (container && elems.indexOf(container) === -1) {
|
if (container && elems.indexOf(container) === -1) {
|
||||||
elems.push(container);
|
elems.push(container);
|
||||||
@ -336,9 +337,9 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
if (selection.length < 2) {
|
if (selection.length < 2) {
|
||||||
|
|
||||||
require(['alert'], function (alert) {
|
require(["alert"], function (alert) {
|
||||||
alert({
|
alert({
|
||||||
text: globalize.translate('PleaseSelectTwoItems')
|
text: globalize.translate("PleaseSelectTwoItems")
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@ -349,7 +350,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
apiClient.ajax({
|
apiClient.ajax({
|
||||||
|
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') })
|
url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(",") })
|
||||||
|
|
||||||
}).then(function () {
|
}).then(function () {
|
||||||
|
|
||||||
@ -361,8 +362,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
function showSelections(initialCard) {
|
function showSelections(initialCard) {
|
||||||
|
|
||||||
require(['emby-checkbox'], function () {
|
require(["emby-checkbox"], function () {
|
||||||
var cards = document.querySelectorAll('.card');
|
var cards = document.querySelectorAll(".card");
|
||||||
for (var i = 0, length = cards.length; i < length; i++) {
|
for (var i = 0, length = cards.length; i < length; i++) {
|
||||||
showSelection(cards[i], initialCard === cards[i]);
|
showSelection(cards[i], initialCard === cards[i]);
|
||||||
}
|
}
|
||||||
@ -378,9 +379,9 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
if (selectedItems.length) {
|
if (selectedItems.length) {
|
||||||
|
|
||||||
var card = dom.parentWithClass(target, 'card');
|
var card = dom.parentWithClass(target, "card");
|
||||||
if (card) {
|
if (card) {
|
||||||
var itemSelectionPanel = card.querySelector('.itemSelectionPanel');
|
var itemSelectionPanel = card.querySelector(".itemSelectionPanel");
|
||||||
if (itemSelectionPanel) {
|
if (itemSelectionPanel) {
|
||||||
return onItemSelectionPanelClick(e, itemSelectionPanel);
|
return onItemSelectionPanelClick(e, itemSelectionPanel);
|
||||||
}
|
}
|
||||||
@ -392,7 +393,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('viewbeforehide', hideSelections);
|
document.addEventListener("viewbeforehide", hideSelections);
|
||||||
|
|
||||||
return function (options) {
|
return function (options) {
|
||||||
|
|
||||||
@ -402,7 +403,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
function onTapHold(e) {
|
function onTapHold(e) {
|
||||||
|
|
||||||
var card = dom.parentWithClass(e.target, 'card');
|
var card = dom.parentWithClass(e.target, "card");
|
||||||
|
|
||||||
if (card) {
|
if (card) {
|
||||||
|
|
||||||
@ -439,7 +440,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
var element = touch.target;
|
var element = touch.target;
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
var card = dom.parentWithClass(element, 'card');
|
var card = dom.parentWithClass(element, "card");
|
||||||
|
|
||||||
if (card) {
|
if (card) {
|
||||||
|
|
||||||
@ -508,7 +509,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var card = dom.parentWithClass(touchTarget, 'card');
|
var card = dom.parentWithClass(touchTarget, "card");
|
||||||
touchTarget = null;
|
touchTarget = null;
|
||||||
|
|
||||||
if (card) {
|
if (card) {
|
||||||
@ -521,27 +522,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
|
|
||||||
// mobile safari doesn't allow contextmenu override
|
// mobile safari doesn't allow contextmenu override
|
||||||
if (browser.touch && !browser.safari) {
|
if (browser.touch && !browser.safari) {
|
||||||
element.addEventListener('contextmenu', onTapHold);
|
element.addEventListener("contextmenu", onTapHold);
|
||||||
} else {
|
} else {
|
||||||
dom.addEventListener(element, 'touchstart', onTouchStart, {
|
dom.addEventListener(element, "touchstart", onTouchStart, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'touchmove', onTouchMove, {
|
dom.addEventListener(element, "touchmove", onTouchMove, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'touchend', onTouchEnd, {
|
dom.addEventListener(element, "touchend", onTouchEnd, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'touchcancel', onTouchEnd, {
|
dom.addEventListener(element, "touchcancel", onTouchEnd, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'mousedown', onMouseDown, {
|
dom.addEventListener(element, "mousedown", onMouseDown, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'mouseleave', onMouseOut, {
|
dom.addEventListener(element, "mouseleave", onMouseOut, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(element, 'mouseup', onMouseOut, {
|
dom.addEventListener(element, "mouseup", onMouseOut, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -550,38 +551,38 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
|
|||||||
initTapHold(container);
|
initTapHold(container);
|
||||||
|
|
||||||
if (options.bindOnClick !== false) {
|
if (options.bindOnClick !== false) {
|
||||||
container.addEventListener('click', onContainerClick);
|
container.addEventListener("click", onContainerClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.onContainerClick = onContainerClick;
|
self.onContainerClick = onContainerClick;
|
||||||
|
|
||||||
self.destroy = function () {
|
self.destroy = function () {
|
||||||
|
|
||||||
container.removeEventListener('click', onContainerClick);
|
container.removeEventListener("click", onContainerClick);
|
||||||
container.removeEventListener('contextmenu', onTapHold);
|
container.removeEventListener("contextmenu", onTapHold);
|
||||||
|
|
||||||
var element = container;
|
var element = container;
|
||||||
|
|
||||||
dom.removeEventListener(element, 'touchstart', onTouchStart, {
|
dom.removeEventListener(element, "touchstart", onTouchStart, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(element, 'touchmove', onTouchMove, {
|
dom.removeEventListener(element, "touchmove", onTouchMove, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(element, 'touchend', onTouchEnd, {
|
dom.removeEventListener(element, "touchend", onTouchEnd, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
// this fires in safari due to magnifying class
|
// this fires in safari due to magnifying class
|
||||||
//dom.removeEventListener(element, 'touchcancel', onTouchEnd, {
|
//dom.removeEventListener(element, "touchcancel", onTouchEnd, {
|
||||||
// passive: true
|
// passive: true
|
||||||
//});
|
//});
|
||||||
dom.removeEventListener(element, 'mousedown', onMouseDown, {
|
dom.removeEventListener(element, "mousedown", onMouseDown, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(element, 'mouseleave', onMouseOut, {
|
dom.removeEventListener(element, "mouseleave", onMouseOut, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(element, 'mouseup', onMouseOut, {
|
dom.removeEventListener(element, "mouseup", onMouseOut, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -21,13 +21,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onMenuTouchMove(e) {
|
function onMenuTouchMove(e) {
|
||||||
var isOpen = self.visible,
|
var isOpen = self.visible;
|
||||||
touches = getTouches(e),
|
var touches = getTouches(e);
|
||||||
touch = touches[0] || {},
|
var touch = touches[0] || {};
|
||||||
endX = touch.clientX || 0,
|
var endX = touch.clientX || 0;
|
||||||
endY = touch.clientY || 0,
|
var endY = touch.clientY || 0;
|
||||||
deltaX = endX - (menuTouchStartX || 0),
|
var deltaX = endX - (menuTouchStartX || 0);
|
||||||
deltaY = endY - (menuTouchStartY || 0);
|
var deltaY = endY - (menuTouchStartY || 0);
|
||||||
setVelocity(deltaX), isOpen && 1 !== dragMode && deltaX > 0 && (dragMode = 2), 0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5 ? (dragMode = 1, scrollContainer.addEventListener("scroll", disableEvent), self.showMask()) : 0 === dragMode && Math.abs(deltaY) >= 5 && (dragMode = 2), 1 === dragMode && (newPos = currentPos + deltaX, self.changeMenuPos())
|
setVelocity(deltaX), isOpen && 1 !== dragMode && deltaX > 0 && (dragMode = 2), 0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5 ? (dragMode = 1, scrollContainer.addEventListener("scroll", disableEvent), self.showMask()) : 0 === dragMode && Math.abs(deltaY) >= 5 && (dragMode = 2), 1 === dragMode && (newPos = currentPos + deltaX, self.changeMenuPos())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,12 +36,12 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
scrollContainer.removeEventListener("scroll", disableEvent);
|
scrollContainer.removeEventListener("scroll", disableEvent);
|
||||||
dragMode = 0;
|
dragMode = 0;
|
||||||
|
|
||||||
var touches = getTouches(e),
|
var touches = getTouches(e);
|
||||||
touch = touches[0] || {},
|
var touch = touches[0] || {};
|
||||||
endX = touch.clientX || 0,
|
var endX = touch.clientX || 0;
|
||||||
endY = touch.clientY || 0,
|
var endY = touch.clientY || 0;
|
||||||
deltaX = endX - (menuTouchStartX || 0),
|
var deltaX = endX - (menuTouchStartX || 0);
|
||||||
deltaY = endY - (menuTouchStartY || 0);
|
var deltaY = endY - (menuTouchStartY || 0);
|
||||||
|
|
||||||
currentPos = deltaX;
|
currentPos = deltaX;
|
||||||
self.checkMenuState(deltaX, deltaY);
|
self.checkMenuState(deltaX, deltaY);
|
||||||
@ -78,15 +78,15 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onBackgroundTouchStart(e) {
|
function onBackgroundTouchStart(e) {
|
||||||
var touches = getTouches(e),
|
var touches = getTouches(e);
|
||||||
touch = touches[0] || {};
|
var touch = touches[0] || {};
|
||||||
backgroundTouchStartX = touch.clientX, backgroundTouchStartTime = (new Date).getTime()
|
backgroundTouchStartX = touch.clientX, backgroundTouchStartTime = (new Date).getTime()
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBackgroundTouchMove(e) {
|
function onBackgroundTouchMove(e) {
|
||||||
var touches = getTouches(e),
|
var touches = getTouches(e);
|
||||||
touch = touches[0] || {},
|
var touch = touches[0] || {};
|
||||||
endX = touch.clientX || 0;
|
var endX = touch.clientX || 0;
|
||||||
if (endX <= options.width && self.isVisible) {
|
if (endX <= options.width && self.isVisible) {
|
||||||
countStart++;
|
countStart++;
|
||||||
var deltaX = endX - (backgroundTouchStartX || 0);
|
var deltaX = endX - (backgroundTouchStartX || 0);
|
||||||
@ -100,10 +100,10 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onBackgroundTouchEnd(e) {
|
function onBackgroundTouchEnd(e) {
|
||||||
var touches = getTouches(e),
|
var touches = getTouches(e);
|
||||||
touch = touches[0] || {},
|
var touch = touches[0] || {};
|
||||||
endX = touch.clientX || 0,
|
var endX = touch.clientX || 0;
|
||||||
deltaX = endX - (backgroundTouchStartX || 0);
|
var deltaX = endX - (backgroundTouchStartX || 0);
|
||||||
self.checkMenuState(deltaX), countStart = 0
|
self.checkMenuState(deltaX), countStart = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,21 +111,24 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
var classList = mask.classList;
|
var classList = mask.classList;
|
||||||
classList.contains("backdrop") || classList.add("hide")
|
classList.contains("backdrop") || classList.add("hide")
|
||||||
}
|
}
|
||||||
var self, defaults, mask, newPos = 0,
|
var self;
|
||||||
currentPos = 0,
|
var defaults;
|
||||||
startPoint = 0,
|
var mask;
|
||||||
countStart = 0,
|
var newPos = 0;
|
||||||
velocity = 0;
|
var currentPos = 0;
|
||||||
|
var startPoint = 0;
|
||||||
|
var countStart = 0;
|
||||||
|
var velocity = 0;
|
||||||
options.target.classList.add("transition");
|
options.target.classList.add("transition");
|
||||||
var dragMode = 0,
|
var dragMode = 0;
|
||||||
scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer");
|
var scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer");
|
||||||
scrollContainer.classList.add("scrollY");
|
scrollContainer.classList.add("scrollY");
|
||||||
var TouchMenuLA = function() {
|
var TouchMenuLA = function() {
|
||||||
self = this, defaults = {
|
self = this, defaults = {
|
||||||
width: 260,
|
width: 260,
|
||||||
handleSize: 10,
|
handleSize: 10,
|
||||||
disableMask: !1,
|
disableMask: !1,
|
||||||
maxMaskOpacity: .5
|
maxMaskOpacity: 0.5
|
||||||
}, this.isVisible = !1, this.initialize()
|
}, this.isVisible = !1, this.initialize()
|
||||||
};
|
};
|
||||||
TouchMenuLA.prototype.initElements = function() {
|
TouchMenuLA.prototype.initElements = function() {
|
||||||
@ -133,8 +136,11 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
passive: !0
|
passive: !0
|
||||||
}))
|
}))
|
||||||
};
|
};
|
||||||
var menuTouchStartX, menuTouchStartY, menuTouchStartTime, edgeContainer = document.querySelector(".mainDrawerHandle"),
|
var menuTouchStartX;
|
||||||
isPeeking = !1;
|
var menuTouchStartY;
|
||||||
|
var menuTouchStartTime;
|
||||||
|
var edgeContainer = document.querySelector(".mainDrawerHandle");
|
||||||
|
var isPeeking = false;
|
||||||
TouchMenuLA.prototype.animateToPosition = function(pos) {
|
TouchMenuLA.prototype.animateToPosition = function(pos) {
|
||||||
requestAnimationFrame(function() {
|
requestAnimationFrame(function() {
|
||||||
options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"
|
options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"
|
||||||
@ -146,7 +152,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
self.close()
|
self.close()
|
||||||
})
|
})
|
||||||
}, TouchMenuLA.prototype.checkMenuState = function(deltaX, deltaY) {
|
}, TouchMenuLA.prototype.checkMenuState = function(deltaX, deltaY) {
|
||||||
velocity >= .4 ? deltaX >= 0 || Math.abs(deltaY || 0) >= 70 ? self.open() : self.close() : newPos >= 100 ? self.open() : newPos && self.close()
|
velocity >= 0.4 ? deltaX >= 0 || Math.abs(deltaY || 0) >= 70 ? self.open() : self.close() : newPos >= 100 ? self.open() : newPos && self.close()
|
||||||
}, TouchMenuLA.prototype.open = function() {
|
}, TouchMenuLA.prototype.open = function() {
|
||||||
this.animateToPosition(options.width), currentPos = options.width, this.isVisible = !0, options.target.classList.add("drawer-open"), self.showMask(), self.invoke(options.onChange)
|
this.animateToPosition(options.width), currentPos = options.width, this.isVisible = !0, options.target.classList.add("drawer-open"), self.showMask(), self.invoke(options.onChange)
|
||||||
}, TouchMenuLA.prototype.close = function() {
|
}, TouchMenuLA.prototype.close = function() {
|
||||||
@ -154,7 +160,8 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||||||
}, TouchMenuLA.prototype.toggle = function() {
|
}, TouchMenuLA.prototype.toggle = function() {
|
||||||
self.isVisible ? self.close() : self.open()
|
self.isVisible ? self.close() : self.open()
|
||||||
};
|
};
|
||||||
var backgroundTouchStartX, backgroundTouchStartTime;
|
var backgroundTouchStartX;
|
||||||
|
var backgroundTouchStartTime;
|
||||||
TouchMenuLA.prototype.showMask = function() {
|
TouchMenuLA.prototype.showMask = function() {
|
||||||
mask.classList.remove("hide"), mask.offsetWidth, mask.classList.add("backdrop")
|
mask.classList.remove("hide"), mask.offsetWidth, mask.classList.add("backdrop")
|
||||||
}, TouchMenuLA.prototype.hideMask = function() {
|
}, TouchMenuLA.prototype.hideMask = function() {
|
||||||
|
@ -21,8 +21,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
|
|||||||
|
|
||||||
if (notification.close) {
|
if (notification.close) {
|
||||||
notification.close();
|
notification.close();
|
||||||
}
|
} else if (notification.cancel) {
|
||||||
else if (notification.cancel) {
|
|
||||||
notification.cancel();
|
notification.cancel();
|
||||||
}
|
}
|
||||||
}, timeoutMs);
|
}, timeoutMs);
|
||||||
@ -180,15 +179,12 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
|
|||||||
if (status === 'completed') {
|
if (status === 'completed') {
|
||||||
notification.title = globalize.translate('PackageInstallCompleted').replace('{0}', installation.Name + ' ' + installation.Version);
|
notification.title = globalize.translate('PackageInstallCompleted').replace('{0}', installation.Name + ' ' + installation.Version);
|
||||||
notification.vibrate = true;
|
notification.vibrate = true;
|
||||||
}
|
} else if (status === 'cancelled') {
|
||||||
else if (status === 'cancelled') {
|
|
||||||
notification.title = globalize.translate('PackageInstallCancelled').replace('{0}', installation.Name + ' ' + installation.Version);
|
notification.title = globalize.translate('PackageInstallCancelled').replace('{0}', installation.Name + ' ' + installation.Version);
|
||||||
}
|
} else if (status === 'failed') {
|
||||||
else if (status === 'failed') {
|
|
||||||
notification.title = globalize.translate('PackageInstallFailed').replace('{0}', installation.Name + ' ' + installation.Version);
|
notification.title = globalize.translate('PackageInstallFailed').replace('{0}', installation.Name + ' ' + installation.Version);
|
||||||
notification.vibrate = true;
|
notification.vibrate = true;
|
||||||
}
|
} else if (status === 'progress') {
|
||||||
else if (status === 'progress') {
|
|
||||||
notification.title = globalize.translate('InstallingPackage').replace('{0}', installation.Name + ' ' + installation.Version);
|
notification.title = globalize.translate('InstallingPackage').replace('{0}', installation.Name + ' ' + installation.Version);
|
||||||
|
|
||||||
notification.actions =
|
notification.actions =
|
||||||
|
@ -134,7 +134,8 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
playPauseButtons = elem.querySelectorAll('.playPauseButton');
|
playPauseButtons = elem.querySelectorAll('.playPauseButton');
|
||||||
for (i = 0, length = playPauseButtons.length; i < length; i++) {
|
for (i = 0, length = playPauseButtons.length; i < length; i++) {
|
||||||
playPauseButtons[i].addEventListener('click', onPlayPauseClick);
|
playPauseButtons[i].addEventListener('click', onPlayPauseClick);
|
||||||
@ -195,7 +196,6 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
|
|||||||
volumeSlider.addEventListener('mousemove', setVolume);
|
volumeSlider.addEventListener('mousemove', setVolume);
|
||||||
volumeSlider.addEventListener('touchmove', setVolume);
|
volumeSlider.addEventListener('touchmove', setVolume);
|
||||||
|
|
||||||
|
|
||||||
positionSlider = elem.querySelector('.nowPlayingBarPositionSlider');
|
positionSlider = elem.querySelector('.nowPlayingBarPositionSlider');
|
||||||
positionSlider.addEventListener('change', function () {
|
positionSlider.addEventListener('change', function () {
|
||||||
|
|
||||||
@ -282,8 +282,8 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updatePlayPauseState(isPaused) {
|
function updatePlayPauseState(isPaused) {
|
||||||
|
var i;
|
||||||
var i, length;
|
var length;
|
||||||
|
|
||||||
if (playPauseButtons) {
|
if (playPauseButtons) {
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
@ -345,8 +345,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
|
|||||||
if (repeatMode === 'RepeatAll') {
|
if (repeatMode === 'RepeatAll') {
|
||||||
toggleRepeatButtonIcon.innerHTML = "repeat";
|
toggleRepeatButtonIcon.innerHTML = "repeat";
|
||||||
toggleRepeatButton.classList.add('repeatButton-active');
|
toggleRepeatButton.classList.add('repeatButton-active');
|
||||||
}
|
} else if (repeatMode === 'RepeatOne') {
|
||||||
else if (repeatMode === 'RepeatOne') {
|
|
||||||
toggleRepeatButtonIcon.innerHTML = "repeat_one";
|
toggleRepeatButtonIcon.innerHTML = "repeat_one";
|
||||||
toggleRepeatButton.classList.add('repeatButton-active');
|
toggleRepeatButton.classList.add('repeatButton-active');
|
||||||
} else {
|
} else {
|
||||||
|
@ -48,9 +48,7 @@ define([], function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
timeout = setTimeout(testAutoplay, 500);
|
timeout = setTimeout(testAutoplay, 500);
|
||||||
}
|
} catch (e) {
|
||||||
|
|
||||||
catch (e) {
|
|
||||||
reject();
|
reject();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -103,8 +103,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
|
|||||||
if (iconElement) {
|
if (iconElement) {
|
||||||
if (brightness >= 80) {
|
if (brightness >= 80) {
|
||||||
iconElement.innerHTML = '';
|
iconElement.innerHTML = '';
|
||||||
}
|
} else if (brightness >= 20) {
|
||||||
else if (brightness >= 20) {
|
|
||||||
iconElement.innerHTML = '';
|
iconElement.innerHTML = '';
|
||||||
} else {
|
} else {
|
||||||
iconElement.innerHTML = '';
|
iconElement.innerHTML = '';
|
||||||
|
@ -158,7 +158,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
|
|||||||
|
|
||||||
lastUpdateTime = now;
|
lastUpdateTime = now;
|
||||||
|
|
||||||
if (navigator.mediaSession){
|
if (navigator.mediaSession) {
|
||||||
navigator.mediaSession.metadata = new MediaMetadata({
|
navigator.mediaSession.metadata = new MediaMetadata({
|
||||||
title: title,
|
title: title,
|
||||||
artist: artist,
|
artist: artist,
|
||||||
@ -278,7 +278,6 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
|
|||||||
}
|
}
|
||||||
if (navigator.mediaSession) {
|
if (navigator.mediaSession) {
|
||||||
|
|
||||||
|
|
||||||
navigator.mediaSession.setActionHandler('previoustrack', function () {
|
navigator.mediaSession.setActionHandler('previoustrack', function () {
|
||||||
execute('previousTrack');
|
execute('previousTrack');
|
||||||
});
|
});
|
||||||
|
@ -43,8 +43,7 @@ define([], function () {
|
|||||||
} else if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
|
} else if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
|
||||||
|
|
||||||
bottomText = nowPlayingItem.Artists.join(', ');
|
bottomText = nowPlayingItem.Artists.join(', ');
|
||||||
}
|
} else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
|
||||||
else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
|
|
||||||
bottomText = topText;
|
bottomText = topText;
|
||||||
topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
|
topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
|
||||||
|
|
||||||
@ -60,8 +59,7 @@ define([], function () {
|
|||||||
} else {
|
} else {
|
||||||
topItem = null;
|
topItem = null;
|
||||||
}
|
}
|
||||||
}
|
} else if (nowPlayingItem.ProductionYear && includeNonNameInfo !== false) {
|
||||||
else if (nowPlayingItem.ProductionYear && includeNonNameInfo !== false) {
|
|
||||||
bottomText = nowPlayingItem.ProductionYear;
|
bottomText = nowPlayingItem.ProductionYear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,8 +107,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
TotalRecordCount: 1
|
TotalRecordCount: 1
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
query.Limit = query.Limit || 300;
|
query.Limit = query.Limit || 300;
|
||||||
query.Fields = "Chapters";
|
query.Fields = "Chapters";
|
||||||
@ -182,8 +181,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
if (container === 'm4a') {
|
if (container === 'm4a') {
|
||||||
return 'audio/mp4';
|
return 'audio/mp4';
|
||||||
}
|
}
|
||||||
}
|
} else if (type === 'video') {
|
||||||
else if (type === 'video') {
|
|
||||||
if (container === 'mkv') {
|
if (container === 'mkv') {
|
||||||
return 'video/x-matroska';
|
return 'video/x-matroska';
|
||||||
}
|
}
|
||||||
@ -212,8 +210,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
var results = regex.exec(url);
|
var results = regex.exec(url);
|
||||||
if (results == null) {
|
if (results == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return decodeURIComponent(results[1].replace(/\+/g, " "));
|
return decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -649,13 +646,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
// If this is the only way it can be played, then allow it
|
// If this is the only way it can be played, then allow it
|
||||||
if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) {
|
if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) {
|
||||||
return Promise.resolve(true);
|
return Promise.resolve(true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return isHostReachable(mediaSource, apiClient);
|
return isHostReachable(mediaSource, apiClient);
|
||||||
}
|
}
|
||||||
}
|
} else if (mediaSource.Protocol === 'File') {
|
||||||
|
|
||||||
else if (mediaSource.Protocol === 'File') {
|
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
@ -1272,7 +1266,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
|
|
||||||
var currentMediaSource = self.currentMediaSource(player);
|
var currentMediaSource = self.currentMediaSource(player);
|
||||||
var mediaStreams = [];
|
var mediaStreams = [];
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
|
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
|
||||||
if (currentMediaSource.MediaStreams[i].Type === 'Audio') {
|
if (currentMediaSource.MediaStreams[i].Type === 'Audio') {
|
||||||
mediaStreams.push(currentMediaSource.MediaStreams[i]);
|
mediaStreams.push(currentMediaSource.MediaStreams[i]);
|
||||||
@ -1316,7 +1311,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
|
|
||||||
var currentMediaSource = self.currentMediaSource(player);
|
var currentMediaSource = self.currentMediaSource(player);
|
||||||
var mediaStreams = [];
|
var mediaStreams = [];
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
|
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
|
||||||
if (currentMediaSource.MediaStreams[i].Type === 'Subtitle') {
|
if (currentMediaSource.MediaStreams[i].Type === 'Subtitle') {
|
||||||
mediaStreams.push(currentMediaSource.MediaStreams[i]);
|
mediaStreams.push(currentMediaSource.MediaStreams[i]);
|
||||||
@ -1360,7 +1356,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
function isAudioStreamSupported(mediaSource, index, deviceProfile) {
|
function isAudioStreamSupported(mediaSource, index, deviceProfile) {
|
||||||
|
|
||||||
var mediaStream;
|
var mediaStream;
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
var mediaStreams = mediaSource.MediaStreams;
|
var mediaStreams = mediaSource.MediaStreams;
|
||||||
|
|
||||||
for (i = 0, length = mediaStreams.length; i < length; i++) {
|
for (i = 0, length = mediaStreams.length; i < length; i++) {
|
||||||
@ -1423,8 +1420,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
if (isAudioStreamSupported(self.currentMediaSource(player), index, profile)) {
|
if (isAudioStreamSupported(self.currentMediaSource(player), index, profile)) {
|
||||||
player.setAudioStreamIndex(index);
|
player.setAudioStreamIndex(index);
|
||||||
getPlayerData(player).audioStreamIndex = index;
|
getPlayerData(player).audioStreamIndex = index;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
changeStream(player, getCurrentTicks(player), { AudioStreamIndex: index });
|
changeStream(player, getCurrentTicks(player), { AudioStreamIndex: index });
|
||||||
getPlayerData(player).audioStreamIndex = index;
|
getPlayerData(player).audioStreamIndex = index;
|
||||||
}
|
}
|
||||||
@ -1595,8 +1591,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
// Need to change the transcoded stream to remove subs
|
// Need to change the transcoded stream to remove subs
|
||||||
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: -1 });
|
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: -1 });
|
||||||
}
|
}
|
||||||
}
|
} else if (!currentStream && newStream) {
|
||||||
else if (!currentStream && newStream) {
|
|
||||||
|
|
||||||
if (getDeliveryMethod(newStream) === 'External') {
|
if (getDeliveryMethod(newStream) === 'External') {
|
||||||
selectedTrackElementIndex = index;
|
selectedTrackElementIndex = index;
|
||||||
@ -1607,8 +1602,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
// Need to change the transcoded stream to add subs
|
// Need to change the transcoded stream to add subs
|
||||||
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: index });
|
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: index });
|
||||||
}
|
}
|
||||||
}
|
} else if (currentStream && newStream) {
|
||||||
else if (currentStream && newStream) {
|
|
||||||
|
|
||||||
// Switching tracks
|
// Switching tracks
|
||||||
// We can handle this clientside if the new track is external or the new track is embedded and we're not transcoding
|
// We can handle this clientside if the new track is external or the new track is embedded and we're not transcoding
|
||||||
@ -1645,7 +1639,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
player = player || self._currentPlayer;
|
player = player || self._currentPlayer;
|
||||||
if (player.disableShowingSubtitleOffset) {
|
if (player.disableShowingSubtitleOffset) {
|
||||||
player.disableShowingSubtitleOffset();
|
player.disableShowingSubtitleOffset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.isShowingSubtitleOffsetEnabled = function(player) {
|
self.isShowingSubtitleOffsetEnabled = function(player) {
|
||||||
@ -1667,14 +1661,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
|
|
||||||
self.getPlayerSubtitleOffset = function(player) {
|
self.getPlayerSubtitleOffset = function(player) {
|
||||||
player = player || self._currentPlayer;
|
player = player || self._currentPlayer;
|
||||||
if (player.getPlayerSubtitleOffset) {
|
if (player.getSubtitleOffset) {
|
||||||
return player.getSubtitleOffset();
|
return player.getSubtitleOffset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.canHandleOffsetOnCurrentSubtitle = function(player) {
|
self.canHandleOffsetOnCurrentSubtitle = function(player) {
|
||||||
var index = self.getSubtitleStreamIndex(player);
|
var index = self.getSubtitleStreamIndex(player);
|
||||||
return index !== -1 && self.isSubtitleStreamExternal(index, player);
|
return index !== -1 && self.isSubtitleStreamExternal(index, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.seek = function (ticks, player) {
|
self.seek = function (ticks, player) {
|
||||||
@ -1865,17 +1859,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
if (firstItem.Type === "Program") {
|
if (firstItem.Type === "Program") {
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
Ids: firstItem.ChannelId,
|
Ids: firstItem.ChannelId
|
||||||
});
|
});
|
||||||
}
|
} else if (firstItem.Type === "Playlist") {
|
||||||
else if (firstItem.Type === "Playlist") {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
SortBy: options.shuffle ? 'Random' : null
|
SortBy: options.shuffle ? 'Random' : null
|
||||||
});
|
});
|
||||||
}
|
} else if (firstItem.Type === "MusicArtist") {
|
||||||
else if (firstItem.Type === "MusicArtist") {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
ArtistIds: firstItem.Id,
|
ArtistIds: firstItem.Id,
|
||||||
@ -1885,8 +1877,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
MediaTypes: "Audio"
|
MediaTypes: "Audio"
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
} else if (firstItem.MediaType === "Photo") {
|
||||||
else if (firstItem.MediaType === "Photo") {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
ParentId: firstItem.ParentId,
|
ParentId: firstItem.ParentId,
|
||||||
@ -1915,8 +1906,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
return Promise.resolve(result);
|
return Promise.resolve(result);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
} else if (firstItem.Type === "PhotoAlbum") {
|
||||||
else if (firstItem.Type === "PhotoAlbum") {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
@ -1928,8 +1918,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
Limit: 1000
|
Limit: 1000
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
} else if (firstItem.Type === "MusicGenre") {
|
||||||
else if (firstItem.Type === "MusicGenre") {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
GenreIds: firstItem.Id,
|
GenreIds: firstItem.Id,
|
||||||
@ -1938,8 +1927,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
SortBy: options.shuffle ? 'Random' : 'SortName',
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
MediaTypes: "Audio"
|
MediaTypes: "Audio"
|
||||||
});
|
});
|
||||||
}
|
} else if (firstItem.IsFolder) {
|
||||||
else if (firstItem.IsFolder) {
|
|
||||||
|
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
|
|
||||||
@ -1951,8 +1939,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
MediaTypes: "Audio,Video"
|
MediaTypes: "Audio,Video"
|
||||||
|
|
||||||
}, queryOptions));
|
}, queryOptions));
|
||||||
}
|
} else if (firstItem.Type === "Episode" && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
||||||
else if (firstItem.Type === "Episode" && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
|
||||||
|
|
||||||
promise = new Promise(function (resolve, reject) {
|
promise = new Promise(function (resolve, reject) {
|
||||||
var apiClient = connectionManager.getApiClient(firstItem.ServerId);
|
var apiClient = connectionManager.getApiClient(firstItem.ServerId);
|
||||||
@ -2537,16 +2524,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
|
|
||||||
playMethod = 'DirectPlay';
|
playMethod = 'DirectPlay';
|
||||||
|
|
||||||
}
|
} else if (mediaSource.StreamUrl) {
|
||||||
|
|
||||||
else if (mediaSource.StreamUrl) {
|
|
||||||
|
|
||||||
// Only used for audio
|
// Only used for audio
|
||||||
playMethod = 'Transcode';
|
playMethod = 'Transcode';
|
||||||
mediaUrl = mediaSource.StreamUrl;
|
mediaUrl = mediaSource.StreamUrl;
|
||||||
}
|
} else if (mediaSource.SupportsDirectStream) {
|
||||||
|
|
||||||
else if (mediaSource.SupportsDirectStream) {
|
|
||||||
|
|
||||||
directOptions = {
|
directOptions = {
|
||||||
Static: true,
|
Static: true,
|
||||||
@ -2706,9 +2689,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
return p.canPlayItem(item, playOptions);
|
return p.canPlayItem(item, playOptions);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (item.Url && p.canPlayUrl) {
|
||||||
|
|
||||||
else if (item.Url && p.canPlayUrl) {
|
|
||||||
return p.canPlayUrl(item.Url);
|
return p.canPlayUrl(item.Url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3222,8 +3203,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
|
|||||||
|
|
||||||
if (displayErrorCode && typeof (displayErrorCode) === 'string') {
|
if (displayErrorCode && typeof (displayErrorCode) === 'string') {
|
||||||
showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
|
showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
|
||||||
}
|
} else if (nextItem) {
|
||||||
else if (nextItem) {
|
|
||||||
self.nextTrack();
|
self.nextTrack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
|
|||||||
// returns a boolean
|
// returns a boolean
|
||||||
orientationLocked = promise;
|
orientationLocked = promise;
|
||||||
}
|
}
|
||||||
}
|
} catch (err) {
|
||||||
catch (err) {
|
|
||||||
onOrientationChangeError(err);
|
onOrientationChangeError(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -46,8 +45,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
|
|||||||
if (unlockOrientation) {
|
if (unlockOrientation) {
|
||||||
try {
|
try {
|
||||||
unlockOrientation();
|
unlockOrientation();
|
||||||
}
|
} catch (err) {
|
||||||
catch (err) {
|
|
||||||
console.log('error unlocking orientation: ' + err);
|
console.log('error unlocking orientation: ' + err);
|
||||||
}
|
}
|
||||||
orientationLocked = false;
|
orientationLocked = false;
|
||||||
|
@ -153,7 +153,6 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function disconnectFromPlayer(currentDeviceName) {
|
function disconnectFromPlayer(currentDeviceName) {
|
||||||
|
|
||||||
if (playbackManager.getSupportedCommands().indexOf('EndSession') !== -1) {
|
if (playbackManager.getSupportedCommands().indexOf('EndSession') !== -1) {
|
||||||
@ -193,7 +192,6 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
playbackManager.setDefaultPlayerActive();
|
playbackManager.setDefaultPlayerActive();
|
||||||
@ -275,8 +273,7 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
|
|||||||
dialogHelper.open(dlg).then(function () {
|
dialogHelper.open(dlg).then(function () {
|
||||||
if (destination === 'nowplaying') {
|
if (destination === 'nowplaying') {
|
||||||
appRouter.showNowPlaying();
|
appRouter.showNowPlaying();
|
||||||
}
|
} else if (destination === 'disconnectFromPlayer') {
|
||||||
else if (destination === 'disconnectFromPlayer') {
|
|
||||||
disconnectFromPlayer(currentDeviceName);
|
disconnectFromPlayer(currentDeviceName);
|
||||||
}
|
}
|
||||||
}, emptyCallback);
|
}, emptyCallback);
|
||||||
|
@ -9,14 +9,11 @@ define([], function () {
|
|||||||
|
|
||||||
if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) {
|
if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) {
|
||||||
return 'DirectStream';
|
return 'DirectStream';
|
||||||
}
|
} else if (session.PlayState.PlayMethod === 'Transcode') {
|
||||||
else if (session.PlayState.PlayMethod === 'Transcode') {
|
|
||||||
return 'Transcode';
|
return 'Transcode';
|
||||||
}
|
} else if (session.PlayState.PlayMethod === 'DirectStream') {
|
||||||
else if (session.PlayState.PlayMethod === 'DirectStream') {
|
|
||||||
return 'DirectPlay';
|
return 'DirectPlay';
|
||||||
}
|
} else if (session.PlayState.PlayMethod === 'DirectPlay') {
|
||||||
else if (session.PlayState.PlayMethod === 'DirectPlay') {
|
|
||||||
return 'DirectPlay';
|
return 'DirectPlay';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,15 +58,15 @@ define([], function () {
|
|||||||
|
|
||||||
function arrayInsertAt(destArray, pos, arrayToInsert) {
|
function arrayInsertAt(destArray, pos, arrayToInsert) {
|
||||||
var args = [];
|
var args = [];
|
||||||
args.push(pos); // where to insert
|
args.push(pos); // where to insert
|
||||||
args.push(0); // nothing to remove
|
args.push(0); // nothing to remove
|
||||||
args = args.concat(arrayToInsert); // add on array to insert
|
args = args.concat(arrayToInsert); // add on array to insert
|
||||||
destArray.splice.apply(destArray, args); // splice it in
|
destArray.splice.apply(destArray, args); // splice it in
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayQueueManager.prototype.queueNext = function (items) {
|
PlayQueueManager.prototype.queueNext = function (items) {
|
||||||
|
var i;
|
||||||
var i, length;
|
var length;
|
||||||
|
|
||||||
for (i = 0, length = items.length; i < length; i++) {
|
for (i = 0, length = items.length; i < length; i++) {
|
||||||
|
|
||||||
|
@ -364,8 +364,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth
|
|||||||
var category = playerStats[i];
|
var category = playerStats[i];
|
||||||
if (category.type === 'audio') {
|
if (category.type === 'audio') {
|
||||||
category.name = 'Audio Info';
|
category.name = 'Audio Info';
|
||||||
}
|
} else if (category.type === 'video') {
|
||||||
else if (category.type === 'video') {
|
|
||||||
category.name = 'Video Info';
|
category.name = 'Video Info';
|
||||||
}
|
}
|
||||||
categories.push(category);
|
categories.push(category);
|
||||||
|
@ -46,16 +46,13 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom'
|
|||||||
|
|
||||||
if (item.Type === 'SeriesTimer') {
|
if (item.Type === 'SeriesTimer') {
|
||||||
return '';
|
return '';
|
||||||
}
|
} else if (item.TimerId || item.SeriesTimerId) {
|
||||||
else if (item.TimerId || item.SeriesTimerId) {
|
|
||||||
|
|
||||||
status = item.Status || 'Cancelled';
|
status = item.Status || 'Cancelled';
|
||||||
}
|
} else if (item.Type === 'Timer') {
|
||||||
else if (item.Type === 'Timer') {
|
|
||||||
|
|
||||||
status = item.Status;
|
status = item.Status;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,8 +40,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
|||||||
maxHeight: imageHeight,
|
maxHeight: imageHeight,
|
||||||
tag: item.ImageTags.Primary
|
tag: item.ImageTags.Primary
|
||||||
});
|
});
|
||||||
}
|
} else if (imageTags.Thumb) {
|
||||||
else if (imageTags.Thumb) {
|
|
||||||
|
|
||||||
return apiClient.getScaledImageUrl(item.Id, {
|
return apiClient.getScaledImageUrl(item.Id, {
|
||||||
type: "Thumb",
|
type: "Thumb",
|
||||||
|
@ -95,7 +95,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
|||||||
currentResolve = resolve;
|
currentResolve = resolve;
|
||||||
|
|
||||||
require(['text!./recordingeditor.template.html'], function (template) {
|
require(['text!./recordingeditor.template.html'], function (template) {
|
||||||
|
|
||||||
var dialogOptions = {
|
var dialogOptions = {
|
||||||
removeOnClose: true,
|
removeOnClose: true,
|
||||||
scrollY: false
|
scrollY: false
|
||||||
@ -103,7 +102,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
|||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
dialogOptions.size = 'fullscreen';
|
dialogOptions.size = 'fullscreen';
|
||||||
} else {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
@ -166,8 +166,7 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
|
|||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
||||||
}
|
} else if (result === 'cancelseriestimer') {
|
||||||
else if (result === 'cancelseriestimer') {
|
|
||||||
|
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
|||||||
|
|
||||||
context.querySelector('.selectKeepUpTo').innerHTML = html;
|
context.querySelector('.selectKeepUpTo').innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onFieldChange(e) {
|
function onFieldChange(e) {
|
||||||
this.querySelector('.btnSubmit').click();
|
this.querySelector('.btnSubmit').click();
|
||||||
}
|
}
|
||||||
|
@ -179,15 +179,15 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
|
|||||||
if (player) {
|
if (player) {
|
||||||
switch (playbackManager.getRepeatMode(player)) {
|
switch (playbackManager.getRepeatMode(player)) {
|
||||||
case "RepeatNone":
|
case "RepeatNone":
|
||||||
playbackManager.setRepeatMode("RepeatAll", player);
|
playbackManager.setRepeatMode("RepeatAll", player);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "RepeatAll":
|
case "RepeatAll":
|
||||||
playbackManager.setRepeatMode("RepeatOne", player);
|
playbackManager.setRepeatMode("RepeatOne", player);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "RepeatOne":
|
case "RepeatOne":
|
||||||
playbackManager.setRepeatMode("RepeatNone", player);
|
playbackManager.setRepeatMode("RepeatNone", player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,18 +34,14 @@ define([], function () {
|
|||||||
// when parsing previous hi-surrogate, 3 is added to byteLength
|
// when parsing previous hi-surrogate, 3 is added to byteLength
|
||||||
if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
|
if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
|
||||||
byteLength += 1;
|
byteLength += 1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
byteLength += 3;
|
byteLength += 3;
|
||||||
}
|
}
|
||||||
}
|
} else if (codePoint <= 0x7f) {
|
||||||
else if (codePoint <= 0x7f) {
|
|
||||||
byteLength += 1;
|
byteLength += 1;
|
||||||
}
|
} else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
|
||||||
else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
|
|
||||||
byteLength += 2;
|
byteLength += 2;
|
||||||
}
|
} else if (codePoint >= 0x800 && codePoint <= 0xffff) {
|
||||||
else if (codePoint >= 0x800 && codePoint <= 0xffff) {
|
|
||||||
byteLength += 3;
|
byteLength += 3;
|
||||||
}
|
}
|
||||||
prevCodePoint = codePoint;
|
prevCodePoint = codePoint;
|
||||||
@ -77,8 +73,7 @@ define([], function () {
|
|||||||
|
|
||||||
if (curByteLength === byteLength) {
|
if (curByteLength === byteLength) {
|
||||||
return string.slice(0, i + 1);
|
return string.slice(0, i + 1);
|
||||||
}
|
} else if (curByteLength > byteLength) {
|
||||||
else if (curByteLength > byteLength) {
|
|
||||||
return string.slice(0, i - segment.length + 1);
|
return string.slice(0, i - segment.length + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,11 +84,11 @@ define([], function () {
|
|||||||
return {
|
return {
|
||||||
sanitize: function (input, replacement) {
|
sanitize: function (input, replacement) {
|
||||||
var sanitized = input
|
var sanitized = input
|
||||||
.replace(illegalRe, replacement)
|
.replace(illegalRe, replacement)
|
||||||
.replace(controlRe, replacement)
|
.replace(controlRe, replacement)
|
||||||
.replace(reservedRe, replacement)
|
.replace(reservedRe, replacement)
|
||||||
.replace(windowsReservedRe, replacement)
|
.replace(windowsReservedRe, replacement)
|
||||||
.replace(windowsTrailingRe, replacement);
|
.replace(windowsTrailingRe, replacement);
|
||||||
return truncate(sanitized, 255);
|
return truncate(sanitized, 255);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -82,7 +82,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
|
|||||||
intervactive: null, // Selector for special interactive elements.
|
intervactive: null, // Selector for special interactive elements.
|
||||||
|
|
||||||
// Mixed options
|
// Mixed options
|
||||||
speed: 0, // Animations speed in milliseconds. 0 to disable animations.
|
speed: 0 // Animations speed in milliseconds. 0 to disable animations.
|
||||||
|
|
||||||
}, options);
|
}, options);
|
||||||
|
|
||||||
@ -93,17 +93,14 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
|
|||||||
// in cases with firefox, if the smooth scroll api is supported then use that because their implementation is very good
|
// in cases with firefox, if the smooth scroll api is supported then use that because their implementation is very good
|
||||||
if (options.allowNativeScroll === false) {
|
if (options.allowNativeScroll === false) {
|
||||||
options.enableNativeScroll = false;
|
options.enableNativeScroll = false;
|
||||||
}
|
} else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) {
|
||||||
else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) {
|
|
||||||
// native smooth scroll
|
// native smooth scroll
|
||||||
options.enableNativeScroll = true;
|
options.enableNativeScroll = true;
|
||||||
}
|
} else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
|
||||||
else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
|
|
||||||
|
|
||||||
// transform is the only way to guarantee animation
|
// transform is the only way to guarantee animation
|
||||||
options.enableNativeScroll = false;
|
options.enableNativeScroll = false;
|
||||||
}
|
} else if (!layoutManager.tv || !browser.animate) {
|
||||||
else if (!layoutManager.tv || !browser.animate) {
|
|
||||||
|
|
||||||
options.enableNativeScroll = true;
|
options.enableNativeScroll = true;
|
||||||
}
|
}
|
||||||
@ -211,7 +208,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
|
|||||||
self.frameResizeObserver.observe(frame);
|
self.frameResizeObserver.observe(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.reload = function () { load(); };
|
self.reload = function () {
|
||||||
|
load();
|
||||||
|
};
|
||||||
|
|
||||||
self.getScrollEventName = function () {
|
self.getScrollEventName = function () {
|
||||||
return transform ? 'scrollanimate' : 'scroll';
|
return transform ? 'scrollanimate' : 'scroll';
|
||||||
@ -227,7 +226,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
|
|||||||
|
|
||||||
function nativeScrollTo(container, pos, immediate) {
|
function nativeScrollTo(container, pos, immediate) {
|
||||||
|
|
||||||
|
|
||||||
if (container.scroll) {
|
if (container.scroll) {
|
||||||
if (o.horizontal) {
|
if (o.horizontal) {
|
||||||
|
|
||||||
@ -242,8 +240,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
|
|||||||
behavior: immediate ? 'instant' : 'smooth'
|
behavior: immediate ? 'instant' : 'smooth'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
} else if (!immediate && container.scrollTo) {
|
||||||
else if (!immediate && container.scrollTo) {
|
|
||||||
if (o.horizontal) {
|
if (o.horizontal) {
|
||||||
container.scrollTo(Math.round(pos), 0);
|
container.scrollTo(Math.round(pos), 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,8 +56,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
if (instance.options.collectionType === 'tvshows') {
|
if (instance.options.collectionType === 'tvshows') {
|
||||||
if (query.IncludeArtists) {
|
if (query.IncludeArtists) {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
} else if (queryIncludeItemTypes === 'Movie' ||
|
||||||
else if (queryIncludeItemTypes === 'Movie' ||
|
|
||||||
queryIncludeItemTypes === 'LiveTvProgram' ||
|
queryIncludeItemTypes === 'LiveTvProgram' ||
|
||||||
queryIncludeItemTypes === 'MusicAlbum' ||
|
queryIncludeItemTypes === 'MusicAlbum' ||
|
||||||
queryIncludeItemTypes === 'Audio' ||
|
queryIncludeItemTypes === 'Audio' ||
|
||||||
@ -69,12 +68,10 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
query.MediaTypes === 'Photo') {
|
query.MediaTypes === 'Photo') {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
}
|
||||||
}
|
} else if (instance.options.collectionType === 'movies') {
|
||||||
else if (instance.options.collectionType === 'movies') {
|
|
||||||
if (query.IncludeArtists) {
|
if (query.IncludeArtists) {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
} else if (queryIncludeItemTypes === 'Series' ||
|
||||||
else if (queryIncludeItemTypes === 'Series' ||
|
|
||||||
queryIncludeItemTypes === 'Episode' ||
|
queryIncludeItemTypes === 'Episode' ||
|
||||||
queryIncludeItemTypes === 'LiveTvProgram' ||
|
queryIncludeItemTypes === 'LiveTvProgram' ||
|
||||||
queryIncludeItemTypes === 'MusicAlbum' ||
|
queryIncludeItemTypes === 'MusicAlbum' ||
|
||||||
@ -87,23 +84,19 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
query.MediaTypes === 'Photo') {
|
query.MediaTypes === 'Photo') {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
}
|
||||||
}
|
} else if (instance.options.collectionType === 'music') {
|
||||||
else if (instance.options.collectionType === 'music') {
|
|
||||||
if (query.People) {
|
if (query.People) {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
} else if (queryIncludeItemTypes === 'Series' ||
|
||||||
else if (queryIncludeItemTypes === 'Series' ||
|
|
||||||
queryIncludeItemTypes === 'Episode' ||
|
queryIncludeItemTypes === 'Episode' ||
|
||||||
queryIncludeItemTypes === 'LiveTvProgram' ||
|
queryIncludeItemTypes === 'LiveTvProgram' ||
|
||||||
queryIncludeItemTypes === 'Movie') {
|
queryIncludeItemTypes === 'Movie') {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
}
|
||||||
}
|
} else if (instance.options.collectionType === 'livetv') {
|
||||||
else if (instance.options.collectionType === 'livetv') {
|
|
||||||
if (query.IncludeArtists || query.IncludePeople) {
|
if (query.IncludeArtists || query.IncludePeople) {
|
||||||
allowSearch = false;
|
allowSearch = false;
|
||||||
}
|
} else if (queryIncludeItemTypes === 'Series' ||
|
||||||
else if (queryIncludeItemTypes === 'Series' ||
|
|
||||||
queryIncludeItemTypes === 'Episode' ||
|
queryIncludeItemTypes === 'Episode' ||
|
||||||
queryIncludeItemTypes === 'MusicAlbum' ||
|
queryIncludeItemTypes === 'MusicAlbum' ||
|
||||||
queryIncludeItemTypes === 'Audio' ||
|
queryIncludeItemTypes === 'Audio' ||
|
||||||
@ -142,7 +135,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
} else if (query.IncludeArtists) {
|
} else if (query.IncludeArtists) {
|
||||||
methodName = 'getArtists';
|
methodName = 'getArtists';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return apiClient[methodName](apiClient.getCurrentUserId(), query);
|
return apiClient[methodName](apiClient.getCurrentUserId(), query);
|
||||||
@ -179,19 +172,19 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.movieResults', {
|
}, context, '.movieResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowPortrait' : 'portrait'),
|
shape: (enableScrollX() ? 'overflowPortrait' : 'portrait'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
@ -205,11 +198,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.movieResults', {
|
}, context, '.movieResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
showYear: true
|
showYear: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
@ -223,11 +216,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.seriesResults', {
|
}, context, '.seriesResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
showYear: true
|
showYear: true
|
||||||
});
|
});
|
||||||
|
|
||||||
if (instance.options.collectionType === 'livetv') {
|
if (instance.options.collectionType === 'livetv') {
|
||||||
|
|
||||||
@ -246,19 +239,19 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.episodeResults', {
|
}, context, '.episodeResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -273,10 +266,10 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.episodeResults', {
|
}, context, '.episodeResults', {
|
||||||
|
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
showParentTitle: true
|
showParentTitle: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
@ -292,20 +285,20 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.sportsResults', {
|
}, context, '.sportsResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -320,20 +313,20 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.kidsResults', {
|
}, context, '.kidsResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -348,20 +341,20 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.newsResults', {
|
}, context, '.newsResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -379,20 +372,20 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.programResults', {
|
}, context, '.programResults', {
|
||||||
|
|
||||||
preferThumb: true,
|
preferThumb: true,
|
||||||
inheritThumb: false,
|
inheritThumb: false,
|
||||||
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
shape: (enableScrollX() ? 'overflowBackdrop' : 'backdrop'),
|
||||||
showParentTitleOrTitle: true,
|
showParentTitleOrTitle: true,
|
||||||
showTitle: false,
|
showTitle: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
overlayMoreButton: true,
|
overlayMoreButton: true,
|
||||||
showAirTime: true,
|
showAirTime: true,
|
||||||
showAirDateTime: true,
|
showAirDateTime: true,
|
||||||
showChannelName: true
|
showChannelName: true
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -406,11 +399,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.videoResults', {
|
}, context, '.videoResults', {
|
||||||
|
|
||||||
showParentTitle: true,
|
showParentTitle: true,
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -422,9 +415,9 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.peopleResults', {
|
}, context, '.peopleResults', {
|
||||||
|
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
showTitle: true
|
showTitle: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -435,9 +428,9 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
IncludeArtists: true
|
IncludeArtists: true
|
||||||
|
|
||||||
}, context, '.artistResults', {
|
}, context, '.artistResults', {
|
||||||
coverImage: true,
|
coverImage: true,
|
||||||
showTitle: true
|
showTitle: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -450,11 +443,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.albumResults', {
|
}, context, '.albumResults', {
|
||||||
|
|
||||||
showParentTitle: true,
|
showParentTitle: true,
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -467,13 +460,13 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.songResults', {
|
}, context, '.songResults', {
|
||||||
|
|
||||||
showParentTitle: true,
|
showParentTitle: true,
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true,
|
centerText: true,
|
||||||
action: 'play'
|
action: 'play'
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -486,11 +479,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.photoResults', {
|
}, context, '.photoResults', {
|
||||||
|
|
||||||
showParentTitle: false,
|
showParentTitle: false,
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -503,10 +496,10 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.photoAlbumResults', {
|
}, context, '.photoAlbumResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -519,11 +512,11 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.bookResults', {
|
}, context, '.bookResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -536,10 +529,10 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.audioBookResults', {
|
}, context, '.audioBookResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
|
|
||||||
searchType(instance, apiClient, {
|
searchType(instance, apiClient, {
|
||||||
searchTerm: value,
|
searchTerm: value,
|
||||||
@ -552,10 +545,10 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager',
|
|||||||
|
|
||||||
}, context, '.playlistResults', {
|
}, context, '.playlistResults', {
|
||||||
|
|
||||||
showTitle: true,
|
showTitle: true,
|
||||||
overlayText: false,
|
overlayText: false,
|
||||||
centerText: true
|
centerText: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function searchType(instance, apiClient, query, context, section, cardOptions) {
|
function searchType(instance, apiClient, query, context, section, cardOptions) {
|
||||||
|
@ -22,44 +22,44 @@
|
|||||||
require(['apphost'], function (appHost) {
|
require(['apphost'], function (appHost) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _GAMEPAD_A_BUTTON_INDEX = 0,
|
var _GAMEPAD_A_BUTTON_INDEX = 0;
|
||||||
_GAMEPAD_B_BUTTON_INDEX = 1,
|
var _GAMEPAD_B_BUTTON_INDEX = 1;
|
||||||
_GAMEPAD_DPAD_UP_BUTTON_INDEX = 12,
|
var _GAMEPAD_DPAD_UP_BUTTON_INDEX = 12;
|
||||||
_GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13,
|
var _GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13;
|
||||||
_GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14,
|
var _GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14;
|
||||||
_GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15,
|
var _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15;
|
||||||
_GAMEPAD_A_KEY = "GamepadA",
|
var _GAMEPAD_A_KEY = "GamepadA";
|
||||||
_GAMEPAD_B_KEY = "GamepadB",
|
var _GAMEPAD_B_KEY = "GamepadB";
|
||||||
_GAMEPAD_DPAD_UP_KEY = "GamepadDPadUp",
|
var _GAMEPAD_DPAD_UP_KEY = "GamepadDPadUp";
|
||||||
_GAMEPAD_DPAD_DOWN_KEY = "GamepadDPadDown",
|
var _GAMEPAD_DPAD_DOWN_KEY = "GamepadDPadDown";
|
||||||
_GAMEPAD_DPAD_LEFT_KEY = "GamepadDPadLeft",
|
var _GAMEPAD_DPAD_LEFT_KEY = "GamepadDPadLeft";
|
||||||
_GAMEPAD_DPAD_RIGHT_KEY = "GamepadDPadRight",
|
var _GAMEPAD_DPAD_RIGHT_KEY = "GamepadDPadRight";
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_UP_KEY = "GamepadLeftThumbStickUp",
|
var _GAMEPAD_LEFT_THUMBSTICK_UP_KEY = "GamepadLeftThumbStickUp";
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = "GamepadLeftThumbStickDown",
|
var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = "GamepadLeftThumbStickDown";
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = "GamepadLeftThumbStickLeft",
|
var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = "GamepadLeftThumbStickLeft";
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = "GamepadLeftThumbStickRight",
|
var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = "GamepadLeftThumbStickRight";
|
||||||
_GAMEPAD_A_KEYCODE = 0,
|
var _GAMEPAD_A_KEYCODE = 0;
|
||||||
_GAMEPAD_B_KEYCODE = 27,
|
var _GAMEPAD_B_KEYCODE = 27;
|
||||||
_GAMEPAD_DPAD_UP_KEYCODE = 38,
|
var _GAMEPAD_DPAD_UP_KEYCODE = 38;
|
||||||
_GAMEPAD_DPAD_DOWN_KEYCODE = 40,
|
var _GAMEPAD_DPAD_DOWN_KEYCODE = 40;
|
||||||
_GAMEPAD_DPAD_LEFT_KEYCODE = 37,
|
var _GAMEPAD_DPAD_LEFT_KEYCODE = 37;
|
||||||
_GAMEPAD_DPAD_RIGHT_KEYCODE = 39,
|
var _GAMEPAD_DPAD_RIGHT_KEYCODE = 39;
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE = 38,
|
var _GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE = 38;
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE = 40,
|
var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE = 40;
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE = 37,
|
var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE = 37;
|
||||||
_GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE = 39,
|
var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE = 39;
|
||||||
_THUMB_STICK_THRESHOLD = 0.75;
|
var _THUMB_STICK_THRESHOLD = 0.75;
|
||||||
|
|
||||||
var _leftThumbstickUpPressed = false,
|
var _leftThumbstickUpPressed = false;
|
||||||
_leftThumbstickDownPressed = false,
|
var _leftThumbstickDownPressed = false;
|
||||||
_leftThumbstickLeftPressed = false,
|
var _leftThumbstickLeftPressed = false;
|
||||||
_leftThumbstickRightPressed = false,
|
var _leftThumbstickRightPressed = false;
|
||||||
_dPadUpPressed = false,
|
var _dPadUpPressed = false;
|
||||||
_dPadDownPressed = false,
|
var _dPadDownPressed = false;
|
||||||
_dPadLeftPressed = false,
|
var _dPadLeftPressed = false;
|
||||||
_dPadRightPressed = false,
|
var _dPadRightPressed = false;
|
||||||
_gamepadAPressed = false,
|
var _gamepadAPressed = false;
|
||||||
_gamepadBPressed = false;
|
var _gamepadBPressed = false;
|
||||||
|
|
||||||
// The set of buttons on the gamepad we listen for.
|
// The set of buttons on the gamepad we listen for.
|
||||||
var ProcessedButtons = [
|
var ProcessedButtons = [
|
||||||
@ -260,7 +260,9 @@ require(['apphost'], function (appHost) {
|
|||||||
gamepads = navigator.webkitGetGamepads();
|
gamepads = navigator.webkitGetGamepads();
|
||||||
}
|
}
|
||||||
gamepads = gamepads || [];
|
gamepads = gamepads || [];
|
||||||
var i, j, len;
|
var i;
|
||||||
|
var j;
|
||||||
|
var len;
|
||||||
for (i = 0, len = gamepads.length; i < len; i++) {
|
for (i = 0, len = gamepads.length; i < len; i++) {
|
||||||
var gamepad = gamepads[i];
|
var gamepad = gamepads[i];
|
||||||
if (gamepad) {
|
if (gamepad) {
|
||||||
|
@ -18,8 +18,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus
|
|||||||
toast({ title: args.Header, text: args.Text });
|
toast({ title: args.Header, text: args.Text });
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
require(['alert'], function (alert) {
|
require(['alert'], function (alert) {
|
||||||
alert({ title: args.Header, text: args.Text });
|
alert({ title: args.Header, text: args.Text });
|
||||||
});
|
});
|
||||||
@ -157,11 +156,9 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus
|
|||||||
|
|
||||||
if (msg.Data.PlayCommand === "PlayNext") {
|
if (msg.Data.PlayCommand === "PlayNext") {
|
||||||
playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId });
|
playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId });
|
||||||
}
|
} else if (msg.Data.PlayCommand === "PlayLast") {
|
||||||
else if (msg.Data.PlayCommand === "PlayLast") {
|
|
||||||
playbackManager.queue({ ids: msg.Data.ItemIds, serverId: serverId });
|
playbackManager.queue({ ids: msg.Data.ItemIds, serverId: serverId });
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
playbackManager.play({
|
playbackManager.play({
|
||||||
ids: msg.Data.ItemIds,
|
ids: msg.Data.ItemIds,
|
||||||
startPositionTicks: msg.Data.StartPositionTicks,
|
startPositionTicks: msg.Data.StartPositionTicks,
|
||||||
@ -173,38 +170,29 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} else if (msg.MessageType === "Playstate") {
|
||||||
else if (msg.MessageType === "Playstate") {
|
|
||||||
|
|
||||||
if (msg.Data.Command === 'Stop') {
|
if (msg.Data.Command === 'Stop') {
|
||||||
inputManager.trigger('stop');
|
inputManager.trigger('stop');
|
||||||
}
|
} else if (msg.Data.Command === 'Pause') {
|
||||||
else if (msg.Data.Command === 'Pause') {
|
|
||||||
inputManager.trigger('pause');
|
inputManager.trigger('pause');
|
||||||
}
|
} else if (msg.Data.Command === 'Unpause') {
|
||||||
else if (msg.Data.Command === 'Unpause') {
|
|
||||||
inputManager.trigger('play');
|
inputManager.trigger('play');
|
||||||
}
|
} else if (msg.Data.Command === 'PlayPause') {
|
||||||
else if (msg.Data.Command === 'PlayPause') {
|
|
||||||
inputManager.trigger('playpause');
|
inputManager.trigger('playpause');
|
||||||
}
|
} else if (msg.Data.Command === 'Seek') {
|
||||||
else if (msg.Data.Command === 'Seek') {
|
|
||||||
playbackManager.seek(msg.Data.SeekPositionTicks);
|
playbackManager.seek(msg.Data.SeekPositionTicks);
|
||||||
}
|
} else if (msg.Data.Command === 'NextTrack') {
|
||||||
else if (msg.Data.Command === 'NextTrack') {
|
|
||||||
inputManager.trigger('next');
|
inputManager.trigger('next');
|
||||||
}
|
} else if (msg.Data.Command === 'PreviousTrack') {
|
||||||
else if (msg.Data.Command === 'PreviousTrack') {
|
|
||||||
inputManager.trigger('previous');
|
inputManager.trigger('previous');
|
||||||
} else {
|
} else {
|
||||||
notifyApp();
|
notifyApp();
|
||||||
}
|
}
|
||||||
}
|
} else if (msg.MessageType === "GeneralCommand") {
|
||||||
else if (msg.MessageType === "GeneralCommand") {
|
|
||||||
var cmd = msg.Data;
|
var cmd = msg.Data;
|
||||||
processGeneralCommand(cmd, apiClient);
|
processGeneralCommand(cmd, apiClient);
|
||||||
}
|
} else if (msg.MessageType === "UserDataChanged") {
|
||||||
else if (msg.MessageType === "UserDataChanged") {
|
|
||||||
|
|
||||||
if (msg.Data.UserId === apiClient.getCurrentUserId()) {
|
if (msg.Data.UserId === apiClient.getCurrentUserId()) {
|
||||||
|
|
||||||
@ -212,8 +200,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus
|
|||||||
events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]);
|
events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]);
|
events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]);
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,7 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
var currentInstance;
|
var currentInstance;
|
||||||
|
|
||||||
function reloadPageWhenServerAvailable(retryCount) {
|
function reloadPageWhenServerAvailable(retryCount) {
|
||||||
|
|
||||||
var apiClient = currentApiClient;
|
var apiClient = currentApiClient;
|
||||||
|
|
||||||
if (!apiClient) {
|
if (!apiClient) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -31,7 +29,6 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
|
|
||||||
function retryReload(retryCount) {
|
function retryReload(retryCount) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
|
|
||||||
retryCount = retryCount || 0;
|
retryCount = retryCount || 0;
|
||||||
retryCount++;
|
retryCount++;
|
||||||
|
|
||||||
@ -42,15 +39,12 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
}
|
}
|
||||||
|
|
||||||
function startRestart(instance, apiClient, dlg) {
|
function startRestart(instance, apiClient, dlg) {
|
||||||
|
|
||||||
currentApiClient = apiClient;
|
currentApiClient = apiClient;
|
||||||
currentDlg = dlg;
|
currentDlg = dlg;
|
||||||
currentInstance = instance;
|
currentInstance = instance;
|
||||||
|
|
||||||
apiClient.restartServer().then(function () {
|
apiClient.restartServer().then(function () {
|
||||||
|
|
||||||
setTimeout(reloadPageWhenServerAvailable, 250);
|
setTimeout(reloadPageWhenServerAvailable, 250);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +88,8 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
|
|
||||||
dlg.querySelector('.text').innerHTML = globalize.translate('RestartPleaseWaitMessage');
|
dlg.querySelector('.text').innerHTML = globalize.translate('RestartPleaseWaitMessage');
|
||||||
|
|
||||||
var i, length;
|
var i;
|
||||||
|
var length;
|
||||||
var html = '';
|
var html = '';
|
||||||
for (i = 0, length = configuredButtons.length; i < length; i++) {
|
for (i = 0, length = configuredButtons.length; i < length; i++) {
|
||||||
var item = configuredButtons[i];
|
var item = configuredButtons[i];
|
||||||
@ -138,12 +133,10 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ServerRestartDialog(options) {
|
function ServerRestartDialog(options) {
|
||||||
|
|
||||||
this.options = options;
|
this.options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerRestartDialog.prototype.show = function () {
|
ServerRestartDialog.prototype.show = function () {
|
||||||
|
|
||||||
var instance = this;
|
var instance = this;
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
@ -155,7 +148,6 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp
|
|||||||
};
|
};
|
||||||
|
|
||||||
ServerRestartDialog.prototype.destroy = function () {
|
ServerRestartDialog.prototype.destroy = function () {
|
||||||
|
|
||||||
currentApiClient = null;
|
currentApiClient = null;
|
||||||
currentDlg = null;
|
currentDlg = null;
|
||||||
currentInstance = null;
|
currentInstance = null;
|
||||||
|
@ -8,7 +8,7 @@ define([], function () {
|
|||||||
} else {
|
} else {
|
||||||
window.open(url, target || '_blank');
|
window.open(url, target || '_blank');
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
canExec: false,
|
canExec: false,
|
||||||
exec: function (options) {
|
exec: function (options) {
|
||||||
|
@ -128,8 +128,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl
|
|||||||
|
|
||||||
if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') {
|
if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') {
|
||||||
executeAction(card, options.positionTo, result.command);
|
executeAction(card, options.positionTo, result.command);
|
||||||
}
|
} else if (result.updated || result.deleted) {
|
||||||
else if (result.updated || result.deleted) {
|
|
||||||
notifyRefreshNeeded(card, options.itemsContainer);
|
notifyRefreshNeeded(card, options.itemsContainer);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -204,21 +203,15 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl
|
|||||||
context: card.getAttribute('data-context'),
|
context: card.getAttribute('data-context'),
|
||||||
parentId: card.getAttribute('data-parentid')
|
parentId: card.getAttribute('data-parentid')
|
||||||
});
|
});
|
||||||
}
|
} else if (action === 'programdialog') {
|
||||||
|
|
||||||
else if (action === 'programdialog') {
|
|
||||||
|
|
||||||
showProgramDialog(item);
|
showProgramDialog(item);
|
||||||
}
|
} else if (action === 'instantmix') {
|
||||||
|
|
||||||
else if (action === 'instantmix') {
|
|
||||||
playbackManager.instantMix({
|
playbackManager.instantMix({
|
||||||
Id: playableItemId,
|
Id: playableItemId,
|
||||||
ServerId: serverId
|
ServerId: serverId
|
||||||
});
|
});
|
||||||
}
|
} else if (action === 'play' || action === 'resume') {
|
||||||
|
|
||||||
else if (action === 'play' || action === 'resume') {
|
|
||||||
|
|
||||||
var startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0');
|
var startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0');
|
||||||
|
|
||||||
@ -227,9 +220,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl
|
|||||||
startPositionTicks: startPositionTicks,
|
startPositionTicks: startPositionTicks,
|
||||||
serverId: serverId
|
serverId: serverId
|
||||||
});
|
});
|
||||||
}
|
} else if (action === 'queue') {
|
||||||
|
|
||||||
else if (action === 'queue') {
|
|
||||||
|
|
||||||
if (playbackManager.isPlaying()) {
|
if (playbackManager.isPlaying()) {
|
||||||
playbackManager.queue({
|
playbackManager.queue({
|
||||||
@ -243,25 +234,15 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl
|
|||||||
serverId: serverId
|
serverId: serverId
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
} else if (action === 'playallfromhere') {
|
||||||
|
|
||||||
else if (action === 'playallfromhere') {
|
|
||||||
playAllFromHere(card, serverId);
|
playAllFromHere(card, serverId);
|
||||||
}
|
} else if (action === 'queueallfromhere') {
|
||||||
|
|
||||||
else if (action === 'queueallfromhere') {
|
|
||||||
playAllFromHere(card, serverId, true);
|
playAllFromHere(card, serverId, true);
|
||||||
}
|
} else if (action === 'setplaylistindex') {
|
||||||
|
|
||||||
else if (action === 'setplaylistindex') {
|
|
||||||
playbackManager.setCurrentPlaylistItem(card.getAttribute('data-playlistitemid'));
|
playbackManager.setCurrentPlaylistItem(card.getAttribute('data-playlistitemid'));
|
||||||
}
|
} else if (action === 'record') {
|
||||||
|
|
||||||
else if (action === 'record') {
|
|
||||||
onRecordCommand(serverId, id, type, card.getAttribute('data-timerid'), card.getAttribute('data-seriestimerid'));
|
onRecordCommand(serverId, id, type, card.getAttribute('data-timerid'), card.getAttribute('data-seriestimerid'));
|
||||||
}
|
} else if (action === 'menu') {
|
||||||
|
|
||||||
else if (action === 'menu') {
|
|
||||||
|
|
||||||
var options = target.getAttribute('data-playoptions') === 'false' ?
|
var options = target.getAttribute('data-playoptions') === 'false' ?
|
||||||
{
|
{
|
||||||
@ -277,27 +258,17 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl
|
|||||||
options.positionTo = target;
|
options.positionTo = target;
|
||||||
|
|
||||||
showContextMenu(card, options);
|
showContextMenu(card, options);
|
||||||
}
|
} else if (action === 'playmenu') {
|
||||||
|
|
||||||
else if (action === 'playmenu') {
|
|
||||||
showPlayMenu(card, target);
|
showPlayMenu(card, target);
|
||||||
}
|
} else if (action === 'edit') {
|
||||||
|
|
||||||
else if (action === 'edit') {
|
|
||||||
getItem(target).then(function (item) {
|
getItem(target).then(function (item) {
|
||||||
editItem(item, serverId);
|
editItem(item, serverId);
|
||||||
});
|
});
|
||||||
}
|
} else if (action === 'playtrailer') {
|
||||||
|
|
||||||
else if (action === 'playtrailer') {
|
|
||||||
getItem(target).then(playTrailer);
|
getItem(target).then(playTrailer);
|
||||||
}
|
} else if (action === 'addtoplaylist') {
|
||||||
|
|
||||||
else if (action === 'addtoplaylist') {
|
|
||||||
getItem(target).then(addToPlaylist);
|
getItem(target).then(addToPlaylist);
|
||||||
}
|
} else if (action === 'custom') {
|
||||||
|
|
||||||
else if (action === 'custom') {
|
|
||||||
|
|
||||||
var customAction = target.getAttribute('data-customaction');
|
var customAction = target.getAttribute('data-customaction');
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr
|
|||||||
} else {
|
} else {
|
||||||
Emby.Page.goHome();
|
Emby.Page.goHome();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function getThemes() {
|
function getThemes() {
|
||||||
return [{
|
return [{
|
||||||
@ -36,7 +36,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr
|
|||||||
isDefaultServerDashboard: true
|
isDefaultServerDashboard: true
|
||||||
}, {
|
}, {
|
||||||
name: "Emby",
|
name: "Emby",
|
||||||
id: "emby",
|
id: "emby"
|
||||||
}, {
|
}, {
|
||||||
name: "Light",
|
name: "Light",
|
||||||
id: "light"
|
id: "light"
|
||||||
@ -47,7 +47,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr
|
|||||||
name: "Windows Media Center",
|
name: "Windows Media Center",
|
||||||
id: "wmc"
|
id: "wmc"
|
||||||
}];
|
}];
|
||||||
};
|
}
|
||||||
|
|
||||||
var skinManager = {
|
var skinManager = {
|
||||||
getThemes: getThemes,
|
getThemes: getThemes,
|
||||||
|
@ -77,8 +77,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
appHost.setUserScalable(scalable);
|
appHost.setUserScalable(scalable);
|
||||||
}
|
} catch (err) {
|
||||||
catch (err) {
|
|
||||||
console.log('error in appHost.setUserScalable: ' + err);
|
console.log('error in appHost.setUserScalable: ' + err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user