diff --git a/dashboard-ui/addplugin.html b/dashboard-ui/addplugin.html index a348b58a1..ac2723818 100644 --- a/dashboard-ui/addplugin.html +++ b/dashboard-ui/addplugin.html @@ -1,4 +1,4 @@ -
+
@@ -27,7 +27,7 @@

@@ -65,7 +65,6 @@ @@ -78,14 +77,6 @@

-
-
-
-
-
-
-
-

diff --git a/dashboard-ui/autoorganizetv.html b/dashboard-ui/autoorganizetv.html index c7688684e..4d6eccfbf 100644 --- a/dashboard-ui/autoorganizetv.html +++ b/dashboard-ui/autoorganizetv.html @@ -6,7 +6,6 @@

${AutoOrganizeHelp}

-

${AutoOrganizeTvHelp}

- +
@@ -35,8 +34,6 @@
-
-

@@ -157,7 +154,7 @@
${LabelDeleteEmptyFoldersHelp}
- +
diff --git a/dashboard-ui/bower_components/document-register-element/.bower.json b/dashboard-ui/bower_components/document-register-element/.bower.json new file mode 100644 index 000000000..4fbb40a04 --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/.bower.json @@ -0,0 +1,35 @@ +{ + "name": "document-register-element", + "description": "A stand-alone working lightweight version of the W3C Custom Elements specification", + "main": "./build/document-register-element.js", + "ignore": [ + "test", + ".jshintrc", + ".travis.yml", + ".TO_LOCALE.md", + ".gitignore", + ".gitmodules", + ".npmignore", + "benchmark", + "dom4", + "ie8", + "src", + "template", + "package.json", + "index.html", + "testrhino.js", + "Makefile" + ], + "homepage": "https://github.com/WebReflection/document-register-element", + "version": "0.5.4", + "_release": "0.5.4", + "_resolution": { + "type": "version", + "tag": "0.5.4", + "commit": "d1d0e80a1c8a0e3f9369280fca834e2cbac2ce6e" + }, + "_source": "https://github.com/WebReflection/document-register-element.git", + "_target": "^0.5.4", + "_originalSource": "document-register-element", + "_direct": true +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/document-register-element/LICENSE.txt b/dashboard-ui/bower_components/document-register-element/LICENSE.txt new file mode 100644 index 000000000..6cadd51ee --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (C) 2014-2015 by WebReflection + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/dashboard-ui/bower_components/document-register-element/RESOURCES.md b/dashboard-ui/bower_components/document-register-element/RESOURCES.md new file mode 100644 index 000000000..8cb3d7abb --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/RESOURCES.md @@ -0,0 +1,9 @@ +# A list of resources related to Custom Elements and this polyfill + +## Demo + + * [Self contained Custom Elements via restyle()](http://webreflection.blogspot.co.uk/2014/08/self-contained-custom-elements-via.html) post and its cross browser [demo](https://webreflection.github.io/custom-element/) + * [transform-3d](https://github.com/kentaromiura/transform-3d/) repo and [its demo](http://kentaromiura.github.io/transform-3d/) + * comparison against Polymer and demos in [Why Web Components Are Ready For Production](http://developer.telerik.com/featured/web-components-ready-production/) + * [W3C Specifications](http://w3c.github.io/webcomponents/spec/custom/) + * [HTML5 Rocks Article](http://www.html5rocks.com/en/tutorials/webcomponents/customelements/) except for the Shadow DOM being completely different specification \ No newline at end of file diff --git a/dashboard-ui/bower_components/document-register-element/basic.html b/dashboard-ui/bower_components/document-register-element/basic.html new file mode 100644 index 000000000..713a029e4 --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/basic.html @@ -0,0 +1,12 @@ + + + + testing my-element + + + + + + some content + + \ No newline at end of file diff --git a/dashboard-ui/bower_components/document-register-element/bower.json b/dashboard-ui/bower_components/document-register-element/bower.json new file mode 100644 index 000000000..231af542c --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/bower.json @@ -0,0 +1,23 @@ +{ + "name": "document-register-element", + "description": "A stand-alone working lightweight version of the W3C Custom Elements specification", + "main": "./build/document-register-element.js", + "ignore": [ + "test", + ".jshintrc", + ".travis.yml", + ".TO_LOCALE.md", + ".gitignore", + ".gitmodules", + ".npmignore", + "benchmark", + "dom4", + "ie8", + "src", + "template", + "package.json", + "index.html", + "testrhino.js", + "Makefile" + ] +} diff --git a/dashboard-ui/bower_components/document-register-element/build/document-register-element.js b/dashboard-ui/bower_components/document-register-element/build/document-register-element.js new file mode 100644 index 000000000..02fbeaf06 --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/build/document-register-element.js @@ -0,0 +1,2 @@ +/*! (C) WebReflection Mit Style License */ +(function(e,t,n,r){"use strict";function rt(e,t){for(var n=0,r=e.length;n>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 0; }); @@ -924,11 +925,11 @@ console.log('Begin connectToServers, with ' + servers.length + ' servers'); - if (servers.length == 1) { + if (servers.length === 1) { return self.connectToServer(servers[0], options).then(function (result) { - if (result.State == ConnectionState.Unavailable) { + if (result.State === ConnectionState.Unavailable) { result.State = result.ConnectUser == null ? ConnectionState.ConnectSignIn : @@ -945,7 +946,7 @@ if (firstServer) { return self.connectToServer(firstServer, options).then(function (result) { - if (result.State == ConnectionState.SignedIn) { + if (result.State === ConnectionState.SignedIn) { return result; @@ -992,9 +993,9 @@ if (server.LastConnectionMode != null) { //tests.push(server.LastConnectionMode); } - if (tests.indexOf(ConnectionMode.Manual) == -1) { tests.push(ConnectionMode.Manual); } - if (tests.indexOf(ConnectionMode.Local) == -1) { tests.push(ConnectionMode.Local); } - if (tests.indexOf(ConnectionMode.Remote) == -1) { tests.push(ConnectionMode.Remote); } + if (tests.indexOf(ConnectionMode.Manual) === -1) { tests.push(ConnectionMode.Manual); } + if (tests.indexOf(ConnectionMode.Local) === -1) { tests.push(ConnectionMode.Local); } + if (tests.indexOf(ConnectionMode.Remote) === -1) { tests.push(ConnectionMode.Remote); } //beginWakeServer(server); @@ -1007,7 +1008,7 @@ function stringEqualsIgnoreCase(str1, str2) { - return (str1 || '').toLowerCase() == (str2 || '').toLowerCase(); + return (str1 || '').toLowerCase() === (str2 || '').toLowerCase(); } function compareVersions(a, b) { @@ -1049,7 +1050,7 @@ var skipTest = false; var timeout = defaultTimeout; - if (mode == ConnectionMode.Local) { + if (mode === ConnectionMode.Local) { enableRetry = true; timeout = 8000; @@ -1060,7 +1061,7 @@ } } - else if (mode == ConnectionMode.Manual) { + else if (mode === ConnectionMode.Manual) { if (stringEqualsIgnoreCase(address, server.LocalAddress)) { enableRetry = true; @@ -1078,7 +1079,7 @@ tryConnect(address, timeout).then(function (result) { - if (compareVersions(self.minServerVersion(), result.Version) == 1) { + if (compareVersions(self.minServerVersion(), result.Version) === 1) { console.log('minServerVersion requirement not met. Server version: ' + result.Version); resolve({ @@ -1086,6 +1087,11 @@ Servers: [server] }); + } if (result.Id !== server.Id) { + + // http request succeeded, but it's a different server than what was expected + testNextConnectionMode(tests, index + 1, server, options, resolve); + } else { console.log('calling onSuccessfulConnection with connection mode ' + mode + ' with server ' + server.Name); onSuccessfulConnection(server, result, mode, options, resolve); @@ -1178,7 +1184,7 @@ result.Servers.push(server); result.ApiClient.updateServerInfo(server, connectionMode); - if (result.State == ConnectionState.SignedIn) { + if (result.State === ConnectionState.SignedIn) { afterConnected(result.ApiClient, options); } @@ -1197,7 +1203,7 @@ // attempt to correct bad input address = address.trim(); - if (address.toLowerCase().indexOf('http') != 0) { + if (address.toLowerCase().indexOf('http') !== 0) { address = "http://" + address; } @@ -1314,7 +1320,7 @@ reject({ errorCode: 'passwordmatch' }); return; } - if (password != passwordConfirm) { + if (password !== passwordConfirm) { reject({ errorCode: 'passwordmatch' }); return; } @@ -1406,7 +1412,7 @@ var serverInfo = a.serverInfo(); // We have to keep this hack in here because of the addApiClient method - return !serverInfo || serverInfo.Id == item; + return !serverInfo || serverInfo.Id === item; })[0]; }; @@ -1443,7 +1449,7 @@ } var server = credentialProvider.credentials().Servers.filter(function (s) { - return s.Id == serverId; + return s.Id === serverId; }); server = server.length ? server[0] : null; @@ -1453,7 +1459,7 @@ var credentials = credentialProvider.credentials(); credentials.Servers = credentials.Servers.filter(function (s) { - return s.Id != serverId; + return s.Id !== serverId; }); credentialProvider.credentials(credentials); @@ -1560,7 +1566,7 @@ console.log('getRegistrationInfo has cached info'); - if (regInfo.deviceId == params.deviceId) { + if (regInfo.deviceId === params.deviceId) { console.log('getRegistrationInfo returning cached info'); return Promise.resolve(); } @@ -1593,17 +1599,17 @@ var status = response.status; console.log('getRegistrationInfo response: ' + status); - if (status == 200) { + if (status === 200) { appStorage.setItem(cacheKey, JSON.stringify({ lastValidDate: new Date().getTime(), deviceId: params.deviceId })); return Promise.resolve(); } - if (status == 401) { + if (status === 401) { return Promise.reject(); } - if (status == 403) { + if (status === 403) { return Promise.reject('overlimit'); } diff --git a/dashboard-ui/bower_components/emby-apiclient/credentials.js b/dashboard-ui/bower_components/emby-apiclient/credentials.js index 35807d3a0..35c37d999 100644 --- a/dashboard-ui/bower_components/emby-apiclient/credentials.js +++ b/dashboard-ui/bower_components/emby-apiclient/credentials.js @@ -1,4 +1,5 @@ define(['events', 'appStorage'], function (events, appStorage) { + 'use strict'; return function (key) { @@ -57,7 +58,7 @@ } var existing = list.filter(function (s) { - return s.Id == server.Id; + return s.Id === server.Id; })[0]; if (existing) { @@ -109,7 +110,7 @@ server.Users = server.Users || []; var existing = server.Users.filter(function (s) { - return s.Id == user.Id; + return s.Id === user.Id; })[0]; if (existing) { diff --git a/dashboard-ui/bower_components/emby-apiclient/events.js b/dashboard-ui/bower_components/emby-apiclient/events.js index 39ed006f5..f356da578 100644 --- a/dashboard-ui/bower_components/emby-apiclient/events.js +++ b/dashboard-ui/bower_components/emby-apiclient/events.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function getCallbacks(obj, name) { @@ -32,7 +33,7 @@ var list = getCallbacks(obj, eventName); var i = list.indexOf(fn); - if (i != -1) { + if (i !== -1) { list.splice(i, 1); } }, diff --git a/dashboard-ui/bower_components/emby-apiclient/fileupload.js b/dashboard-ui/bower_components/emby-apiclient/fileupload.js index 4007c646b..2b8db0dde 100644 --- a/dashboard-ui/bower_components/emby-apiclient/fileupload.js +++ b/dashboard-ui/bower_components/emby-apiclient/fileupload.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; return function () { diff --git a/dashboard-ui/bower_components/emby-apiclient/localassetmanager.js b/dashboard-ui/bower_components/emby-apiclient/localassetmanager.js index a365f2f56..4ced1f00c 100644 --- a/dashboard-ui/bower_components/emby-apiclient/localassetmanager.js +++ b/dashboard-ui/bower_components/emby-apiclient/localassetmanager.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function getLocalMediaSource(serverId, itemId) { return Promise.resolve(null); diff --git a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-chrome.js b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-chrome.js index 019333abd..5cc54c97d 100644 --- a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-chrome.js +++ b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-chrome.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function stringToArrayBuffer(string) { // UTF-16LE @@ -79,7 +80,7 @@ console.log(info); - if (info != null && info.socketId == socketId) { + if (info != null && info.socketId === socketId) { var json = arrayBufferToString(info.data); console.log('Server discovery json: ' + json); var server = JSON.parse(json); @@ -119,7 +120,7 @@ console.log('chrome.sockets.udp.bind'); chrome.sockets.udp.bind(createInfo.socketId, '0.0.0.0', 0, function (bindResult) { - if (getResultCode(bindResult) != 0) { + if (getResultCode(bindResult) !== 0) { console.log('bind fail: ' + bindResult); return; } @@ -130,7 +131,7 @@ chrome.sockets.udp.send(createInfo.socketId, data, '255.255.255.255', port, function (sendResult) { - if (getResultCode(sendResult) != 0) { + if (getResultCode(sendResult) !== 0) { console.log('send fail: ' + sendResult); } else { diff --git a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-winjs.js b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-winjs.js index 06de593f0..93e8bc26c 100644 --- a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-winjs.js +++ b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery-winjs.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function listenerSession(resolve, timeoutMs) { @@ -78,7 +79,7 @@ var stringLength = eventArguments.getDataReader().unconsumedBufferLength; var receivedMessage = eventArguments.getDataReader().readString(stringLength); - if (receivedMessage == stringToSend) { + if (receivedMessage === stringToSend) { return; } @@ -97,7 +98,7 @@ servers.push(server); } catch (exception) { - onError("Error receiving message: " + receivedMessage); + onError("Error receiving message: " + exception); } } diff --git a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery.js b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery.js index 10c926a16..5406b102b 100644 --- a/dashboard-ui/bower_components/emby-apiclient/serverdiscovery.js +++ b/dashboard-ui/bower_components/emby-apiclient/serverdiscovery.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; return { diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js b/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js index 90e62e310..b3c423e93 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js @@ -1,4 +1,5 @@ define(['localassetmanager'], function (localAssetManager) { + 'use strict'; return function (connectionManager) { @@ -43,9 +44,9 @@ return uploadHistory.FilesUploaded.filter(function (u) { - return getUploadId(file) == u.Id; + return getUploadId(file) === u.Id; - }).length == 0; + }).length === 0; }); } diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js b/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js index 296508417..bf0046002 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js @@ -1,4 +1,5 @@ define(['localassetmanager'], function (LocalAssetManager) { + 'use strict'; return function () { @@ -248,55 +249,54 @@ // Just for now while media syncing gets worked out deferred.resolve(); - return; - var libraryItem = localItem.Item; + //var libraryItem = localItem.Item; - var serverId = libraryItem.ServerId; - var itemId = null; - var imageTag = null; - var imageType = "Primary"; + //var serverId = libraryItem.ServerId; + //var itemId = null; + //var imageTag = null; + //var imageType = "Primary"; - switch (index) { + //switch (index) { - case 0: - itemId = libraryItem.Id; - imageType = "Primary"; - imageTag = (libraryItem.ImageTags || {})["Primary"]; - break; - case 1: - itemId = libraryItem.SeriesId; - imageType = "Primary"; - imageTag = libraryItem.SeriesPrimaryImageTag; - break; - case 2: - itemId = libraryItem.SeriesId; - imageType = "Thumb"; - imageTag = libraryItem.SeriesPrimaryImageTag; - break; - case 3: - itemId = libraryItem.AlbumId; - imageType = "Primary"; - imageTag = libraryItem.AlbumPrimaryImageTag; - break; - default: - break; - } + // case 0: + // itemId = libraryItem.Id; + // imageType = "Primary"; + // imageTag = (libraryItem.ImageTags || {})["Primary"]; + // break; + // case 1: + // itemId = libraryItem.SeriesId; + // imageType = "Primary"; + // imageTag = libraryItem.SeriesPrimaryImageTag; + // break; + // case 2: + // itemId = libraryItem.SeriesId; + // imageType = "Thumb"; + // imageTag = libraryItem.SeriesPrimaryImageTag; + // break; + // case 3: + // itemId = libraryItem.AlbumId; + // imageType = "Primary"; + // imageTag = libraryItem.AlbumPrimaryImageTag; + // break; + // default: + // break; + //} - if (!itemId || !imageTag) { - getNextImage(index + 1, apiClient, localItem, deferred); - return; - } + //if (!itemId || !imageTag) { + // getNextImage(index + 1, apiClient, localItem, deferred); + // return; + //} - downloadImage(apiClient, serverId, itemId, imageTag, imageType).then(function () { + //downloadImage(apiClient, serverId, itemId, imageTag, imageType).then(function () { - // For the sake of simplicity, limit to one image - deferred.resolve(); - return; + // // For the sake of simplicity, limit to one image + // deferred.resolve(); + // return; - getNextImage(index + 1, apiClient, localItem, deferred); + // getNextImage(index + 1, apiClient, localItem, deferred); - }, getOnFail(deferred)); + //}, getOnFail(deferred)); } function downloadImage(apiClient, serverId, itemId, imageTag, imageType) { @@ -340,7 +340,7 @@ } var files = jobItem.AdditionalFiles.filter(function (f) { - return f.Type == 'Subtitles'; + return f.Type === 'Subtitles'; }); var mediaSource = jobItem.Item.MediaSources[0]; @@ -375,7 +375,7 @@ var deferred = DeferredBuilder.Deferred(); var subtitleStream = mediaSource.MediaStreams.filter(function (m) { - return m.Type == 'Subtitle' && m.Index == file.Index; + return m.Type === 'Subtitle' && m.Index === file.Index; })[0]; if (!subtitleStream) { @@ -445,7 +445,7 @@ var userIdsWithAccess = syncDataResult.ItemUserAccess[itemId]; - if (userIdsWithAccess.join(',') == savedUserIdsWithAccess.join(',')) { + if (userIdsWithAccess.join(',') === savedUserIdsWithAccess.join(',')) { // Hasn't changed, nothing to do deferred.resolve(); } diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js b/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js index 9b9975136..d23a916aa 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js @@ -1,4 +1,5 @@ define(['serversync'], function (ServerSync) { + 'use strict'; function syncNext(connectionManager, servers, index, options, resolve, reject) { diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js b/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js index aebecc3e4..712782b88 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js @@ -1,4 +1,5 @@ define(['localassetmanager'], function (localAssetManager) { + 'use strict'; function syncNext(users, index, resolve, reject, apiClient, server) { diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js b/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js index e31d8b076..ea050ec29 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; return function (connectionManager) { @@ -20,7 +21,7 @@ return connectionManager.connectToServer(server, connectionOptions).then(function (result) { - if (result.State == MediaBrowser.ConnectionState.SignedIn) { + if (result.State === MediaBrowser.ConnectionState.SignedIn) { return performSync(server, options); } else { console.log('Unable to connect to server id: ' + server.Id); @@ -42,7 +43,7 @@ var uploadPhotos = options.uploadPhotos !== false; - if (options.cameraUploadServers && options.cameraUploadServers.indexOf(server.Id) == -1) { + if (options.cameraUploadServers && options.cameraUploadServers.indexOf(server.Id) === -1) { uploadPhotos = false; } diff --git a/dashboard-ui/bower_components/emby-apiclient/wakeonlan.js b/dashboard-ui/bower_components/emby-apiclient/wakeonlan.js index 7897b199e..b6f3cbd8a 100644 --- a/dashboard-ui/bower_components/emby-apiclient/wakeonlan.js +++ b/dashboard-ui/bower_components/emby-apiclient/wakeonlan.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function send(info) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 3041ce57b..9a98379bd 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.236", - "_release": "1.4.236", + "version": "1.4.299", + "_release": "1.4.299", "_resolution": { "type": "version", - "tag": "1.4.236", - "commit": "d369818012719cb7fd38b052073428631937ae6f" + "tag": "1.4.299", + "commit": "7e708cf27aa74f7f0d0aaa30d95d3e1f09b71ce3" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css index d2ab1dd2f..3149ba5da 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css @@ -4,10 +4,21 @@ padding: 0; border: none; max-height: 84%; + border-radius: 1px !important; + color: #fff; +} + +.actionsheet-not-fullscreen { + background-color: #2a2a2a; +} + +.actionSheetMenuItem:hover { + background-color: #333; } .actionsheet-fullscreen { max-height: none; + border-radius: 0 !important; } .actionSheetContent-centered { @@ -35,6 +46,8 @@ font-weight: inherit; align-items: center; flex-shrink: 0; + background: transparent; + box-shadow: none; } .actionSheetMenuItem-noflex { @@ -94,4 +107,4 @@ position: fixed; top: .75em; left: .5em; -} \ No newline at end of file +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js index a49f3e5db..fd06b26f5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js @@ -1,4 +1,5 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-button', 'css!./actionsheet', 'material-icons', 'scrollStyles'], function (dialogHelper, layoutManager, globalize, browser, dom) { + 'use strict'; function getOffsets(elems) { @@ -25,7 +26,9 @@ results[i] = { top: box.top, - left: box.left + left: box.left, + width: box.width, + height: box.height }; } @@ -44,11 +47,11 @@ var pos = getOffsets([options.positionTo])[0]; - if (options.positionY != 'top') { - pos.top += options.positionTo.offsetHeight / 2; + if (options.positionY !== 'top') { + pos.top += (pos.height || 0) / 2; } - pos.left += options.positionTo.offsetWidth / 2; + pos.left += (pos.width || 0) / 2; var height = dlg.offsetHeight || 300; var width = dlg.offsetWidth || 160; @@ -119,6 +122,8 @@ if (isFullscreen) { dlg.classList.add('actionsheet-fullscreen'); + } else { + dlg.classList.add('actionsheet-not-fullscreen'); } var extraSpacing = !layoutManager.tv; diff --git a/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js b/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js index 8bbfd86f4..83090c8d4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js +++ b/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js @@ -1,4 +1,5 @@ define(['dialog', 'globalize'], function (dialog, globalize) { + 'use strict'; return function (text, title) { @@ -15,7 +16,7 @@ define(['dialog', 'globalize'], function (dialog, globalize) { var items = []; items.push({ - name: globalize.translate('sharedcomponents#ButtonOk'), + name: globalize.translate('sharedcomponents#ButtonGotIt'), id: 'ok', type: 'submit' }); @@ -23,7 +24,7 @@ define(['dialog', 'globalize'], function (dialog, globalize) { options.buttons = items; return dialog(options).then(function (result) { - if (result == 'ok') { + if (result === 'ok') { return Promise.resolve(); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/alert/nativealert.js b/dashboard-ui/bower_components/emby-webcomponents/alert/nativealert.js index 271638f02..f565e802c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alert/nativealert.js +++ b/dashboard-ui/bower_components/emby-webcomponents/alert/nativealert.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function replaceAll(str, find, replace) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js index 2404dab5c..5ba87cb3d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js +++ b/dashboard-ui/bower_components/emby-webcomponents/alphapicker/alphapicker.js @@ -1,14 +1,16 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material-icons'], function (focusManager) { + 'use strict'; var selectedButtonClass = 'alphaPickerButton-selected'; function focus() { - var selected = this.querySelector('.' + selectedButtonClass); + var scope = this; + var selected = scope.querySelector('.' + selectedButtonClass); if (selected) { focusManager.focus(selected); } else { - focusManager.autoFocus(this, true); + focusManager.autoFocus(scope, true); } } @@ -25,11 +27,9 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- var letters; html += '
'; - if (options.mode == 'keyboard') { + if (options.mode === 'keyboard') { // space_bar icon - html += ''; + html += ''; } else { letters = ['#']; html += letters.map(getLetterButton).join(''); @@ -38,11 +38,9 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; html += letters.map(getLetterButton).join(''); - if (options.mode == 'keyboard') { + if (options.mode === 'keyboard') { // backspace icon - html += ''; + html += ''; html += '
'; letters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; @@ -60,7 +58,7 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- element.focus = focus; } - function alphaPicker(options) { + function AlphaPicker(options) { var self = this; @@ -83,7 +81,7 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- alphaFocusTimeout = null; - if (document.activeElement == alphaFocusedElement) { + if (document.activeElement === alphaFocusedElement) { var value = alphaFocusedElement.getAttribute('data-value'); self.value(value, true); } @@ -125,7 +123,7 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- if (alphaPickerButton) { var value = alphaPickerButton.getAttribute('data-value'); - if (currentValue == value.toUpperCase()) { + if (currentValue === value.toUpperCase()) { self.value(null, true); } else { self.value(value, true); @@ -173,7 +171,7 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- itemsContainer.addEventListener('focus', onItemsFocusIn, true); } - if (options.mode == 'keyboard') { + if (options.mode === 'keyboard') { element.addEventListener('click', onAlphaPickerInKeyboardModeClick); } @@ -225,14 +223,14 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- value = value.toUpperCase(); currentValue = value; - if (options.mode != 'keyboard') { + if (options.mode !== 'keyboard') { selected = element.querySelector('.' + selectedButtonClass); btn = element.querySelector('.alphaPickerButton[data-value=\'' + value + '\']'); - if (btn && btn != selected) { + if (btn && btn !== selected) { btn.classList.add(selectedButtonClass); } - if (selected && selected != btn) { + if (selected && selected !== btn) { selected.classList.remove(selectedButtonClass); } } @@ -281,5 +279,5 @@ define(['focusManager', 'css!./style.css', 'paper-icon-button-light', 'material- self.visible(true); } - return alphaPicker; + return AlphaPicker; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/appsettings.js b/dashboard-ui/bower_components/emby-webcomponents/appsettings.js index 8d331b9e4..06b4a79cc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/appsettings.js +++ b/dashboard-ui/bower_components/emby-webcomponents/appsettings.js @@ -1,4 +1,5 @@ define(['appStorage', 'events'], function (appStorage, events) { + 'use strict'; function getKey(name, userId) { @@ -9,7 +10,7 @@ define(['appStorage', 'events'], function (appStorage, events) { return name; } - return new function () { + function AppSettings() { var self = this; @@ -19,7 +20,7 @@ define(['appStorage', 'events'], function (appStorage, events) { self.set('enableAutoLogin', val.toString()); } - return self.get('enableAutoLogin') != 'false'; + return self.get('enableAutoLogin') !== 'false'; }; self.enableAutomaticBitrateDetection = function (val) { @@ -28,7 +29,7 @@ define(['appStorage', 'events'], function (appStorage, events) { self.set('enableAutomaticBitrateDetection', val.toString()); } - return self.get('enableAutomaticBitrateDetection') != 'false'; + return self.get('enableAutomaticBitrateDetection') !== 'false'; }; self.maxStreamingBitrate = function (val) { @@ -66,7 +67,7 @@ define(['appStorage', 'events'], function (appStorage, events) { self.set('syncOnlyOnWifi', val.toString()); } - return self.get('syncOnlyOnWifi') != 'false'; + return self.get('syncOnlyOnWifi') !== 'false'; }; self.syncPath = function (val) { @@ -99,7 +100,7 @@ define(['appStorage', 'events'], function (appStorage, events) { appStorage.setItem(getKey(name, userId), value); - if (currentValue != value) { + if (currentValue !== value) { events.trigger(self, 'change', [name]); } }; @@ -108,5 +109,7 @@ define(['appStorage', 'events'], function (appStorage, events) { return appStorage.getItem(getKey(name, userId)); }; - }(); + } + + return new AppSettings(); }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js index 864c1144c..9c7725b26 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js +++ b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js @@ -1,4 +1,5 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'css!./style'], function (browser, connectionManager, playbackManager, dom) { + 'use strict'; function enableAnimation(elem) { @@ -18,7 +19,7 @@ return true; } - function backdrop() { + function Backdrop() { var self = this; var isDestroyed; @@ -52,7 +53,7 @@ currentAnimation = animation; animation.onfinish = function () { - if (animation == currentAnimation) { + if (animation === currentAnimation) { currentAnimation = null; } if (existingBackdropImage && existingBackdropImage.parentNode) { @@ -166,14 +167,14 @@ var elem = getBackdropContainer(); var existingBackdropImage = elem.querySelector('.displayingBackdropImage'); - if (existingBackdropImage && existingBackdropImage.getAttribute('data-url') == url) { - if (existingBackdropImage.getAttribute('data-url') == url) { + if (existingBackdropImage && existingBackdropImage.getAttribute('data-url') === url) { + if (existingBackdropImage.getAttribute('data-url') === url) { return; } existingBackdropImage.classList.remove('displayingBackdropImage'); } - var instance = new backdrop(); + var instance = new Backdrop(); instance.load(url, elem, existingBackdropImage); currentLoadingBackdrop = instance; } @@ -215,28 +216,38 @@ var list = []; + var onImg = function (img) { + list.push(img); + }; + for (var i = 0, length = items.length; i < length; i++) { var itemImages = getItemImageUrls(items[i]); - itemImages.forEach(function (img) { - list.push(img); - }); + itemImages.forEach(onImg); } return list; } function arraysEqual(a, b) { - if (a === b) return true; - if (a == null || b == null) return false; - if (a.length != b.length) return false; + if (a === b) { + return true; + } + if (a == null || b == null) { + return false; + } + if (a.length !== b.length) { + return false; + } // If you don't care about the order of the elements inside // the array, you should sort both arrays here. for (var i = 0; i < a.length; ++i) { - if (a[i] !== b[i]) return false; + if (a[i] !== b[i]) { + return false; + } } return true; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/browser.js b/dashboard-ui/bower_components/emby-webcomponents/browser.js index b4e05c5a4..8f4fb0d54 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browser.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browser.js @@ -1,27 +1,28 @@ define([], function () { + 'use strict'; function isTv() { // This is going to be really difficult to get right var userAgent = navigator.userAgent.toLowerCase(); - if (userAgent.indexOf('tv') != -1) { + if (userAgent.indexOf('tv') !== -1) { return true; } - if (userAgent.indexOf('samsungbrowser') != -1) { + if (userAgent.indexOf('samsungbrowser') !== -1) { return true; } - if (userAgent.indexOf('nintendo') != -1) { + if (userAgent.indexOf('nintendo') !== -1) { return true; } - if (userAgent.indexOf('viera') != -1) { + if (userAgent.indexOf('viera') !== -1) { return true; } - if (userAgent.indexOf('webos') != -1) { + if (userAgent.indexOf('webos') !== -1) { return true; } @@ -45,7 +46,7 @@ var lower = userAgent.toLowerCase(); for (var i = 0, length = terms.length; i < length; i++) { - if (lower.indexOf(terms[i]) != -1) { + if (lower.indexOf(terms[i]) !== -1) { return true; } } @@ -87,6 +88,34 @@ } } + function hasKeyboard(browser) { + + if (browser.touch) { + return true; + } + + if (browser.xboxOne) { + return true; + } + + if (browser.ps4) { + return true; + } + + if (browser.edgeUwp) { + // This is OK for now, but this won't always be true + // Should we use this? + // https://gist.github.com/wagonli/40d8a31bd0d6f0dd7a5d + return true; + } + + if (browser.tv) { + return true; + } + + return false; + } + var uaMatch = function (ua) { ua = ua.toLowerCase(); @@ -100,6 +129,8 @@ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; + var versionMatch = /(version)[ \/]([\w.]+)/.exec(ua); + var platform_match = /(ipad)/.exec(ua) || /(iphone)/.exec(ua) || /(android)/.exec(ua) || @@ -107,27 +138,41 @@ var browser = match[1] || ""; - if (browser == "edge") { + if (browser === "edge") { platform_match = [""]; } else { - if (ua.indexOf("windows phone") != -1 || ua.indexOf("iemobile") != -1) { + if (ua.indexOf("windows phone") !== -1 || ua.indexOf("iemobile") !== -1) { // http://www.neowin.net/news/ie11-fakes-user-agent-to-fool-gmail-in-windows-phone-81-gdr1-update browser = "msie"; } - else if (ua.indexOf("like gecko") != -1 && ua.indexOf('webkit') == -1 && ua.indexOf('opera') == -1 && ua.indexOf('chrome') == -1 && ua.indexOf('safari') == -1) { + else if (ua.indexOf("like gecko") !== -1 && ua.indexOf('webkit') === -1 && ua.indexOf('opera') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('safari') === -1) { browser = "msie"; } } - if (browser == 'opr') { + if (browser === 'opr') { browser = 'opera'; } + var version; + if (versionMatch && versionMatch.length > 2) { + version = versionMatch[2]; + } + + version = version || match[2] || "0"; + + var versionMajor = parseInt(version.split('.')[0]); + + if (isNaN(versionMajor)) { + versionMajor = 0; + } + return { browser: browser, - version: match[2] || "0", - platform: platform_match[0] || "" + version: version, + platform: platform_match[0] || "", + versionMajor: versionMajor }; }; @@ -138,17 +183,18 @@ if (matched.browser) { browser[matched.browser] = true; browser.version = matched.version; + browser.versionMajor = matched.versionMajor; } if (matched.platform) { browser[matched.platform] = true; } - if (!browser.chrome && !browser.msie && !browser.edge && !browser.opera && userAgent.toLowerCase().indexOf("webkit") != -1) { + if (!browser.chrome && !browser.msie && !browser.edge && !browser.opera && userAgent.toLowerCase().indexOf("webkit") !== -1) { browser.safari = true; } - if (userAgent.toLowerCase().indexOf("playstation 4") != -1) { + if (userAgent.toLowerCase().indexOf("playstation 4") !== -1) { browser.ps4 = true; browser.tv = true; } @@ -157,14 +203,14 @@ browser.mobile = true; } - browser.xboxOne = userAgent.toLowerCase().indexOf('xbox') != -1; + browser.xboxOne = userAgent.toLowerCase().indexOf('xbox') !== -1; browser.animate = document.documentElement.animate != null; - browser.tizen = userAgent.toLowerCase().indexOf('tizen') != -1 || userAgent.toLowerCase().indexOf('smarthub') != -1; - browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) != -1; - browser.edgeUwp = browser.edge && userAgent.toLowerCase().indexOf('msapphost') != -1; + browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || userAgent.toLowerCase().indexOf('smarthub') !== -1; + browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1; + browser.edgeUwp = browser.edge && userAgent.toLowerCase().indexOf('msapphost') !== -1; browser.tv = isTv(); - browser.operaTv = browser.tv && userAgent.toLowerCase().indexOf('opr/') != -1; + browser.operaTv = browser.tv && userAgent.toLowerCase().indexOf('opr/') !== -1; if (!isStyleSupported('display', 'flex')) { browser.noFlex = true; @@ -178,5 +224,7 @@ browser.touch = true; } + browser.keyboard = hasKeyboard(browser); + return browser; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index 1c9e04b45..06a6b5a03 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -1,4 +1,5 @@ define(['browser'], function (browser) { + 'use strict'; function canPlayH264() { var v = document.createElement('video'); @@ -46,7 +47,7 @@ define(['browser'], function (browser) { } function canPlayHlsWithMSE() { - if (window.MediaSource != null && !browser.firefox) { + if (window.MediaSource != null) { // text tracks don’t work with this in firefox return true; } @@ -58,7 +59,7 @@ define(['browser'], function (browser) { var typeString; - if (format == 'flac') { + if (format === 'flac') { if (browser.tizen) { return true; } @@ -67,7 +68,7 @@ define(['browser'], function (browser) { } } - else if (format == 'wma') { + else if (format === 'wma') { if (browser.tizen) { return true; } @@ -76,7 +77,7 @@ define(['browser'], function (browser) { } } - else if (format == 'opus') { + else if (format === 'opus') { typeString = 'audio/ogg; codecs="opus"'; if (document.createElement('audio').canPlayType(typeString).replace(/no/, '')) { @@ -86,7 +87,7 @@ define(['browser'], function (browser) { return false; } - if (format == 'webma') { + if (format === 'webma') { typeString = 'audio/webm'; } else { typeString = 'audio/' + format; @@ -117,7 +118,7 @@ define(['browser'], function (browser) { } // Filter out browsers based on chromium that don't support mkv - if (userAgent.indexOf('vivaldi') != -1 || userAgent.indexOf('opera') != -1) { + if (userAgent.indexOf('vivaldi') !== -1 || userAgent.indexOf('opera') !== -1) { return false; } @@ -138,13 +139,14 @@ define(['browser'], function (browser) { function testCanPlayTs() { - return browser.tizen || browser.web0s; + return browser.tizen || browser.web0s || browser.edgeUwp; } function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs) { var supported = false; var profileContainer = container; + var videoCodecs = []; switch (container) { @@ -153,7 +155,7 @@ define(['browser'], function (browser) { videoAudioCodecs = []; break; case 'avi': - supported = browser.edgeUwp; + supported = browser.tizen || browser.edgeUwp; break; case 'mpg': case 'mpeg': @@ -169,16 +171,19 @@ define(['browser'], function (browser) { break; case 'mov': supported = browser.chrome || browser.edgeUwp; + videoCodecs.push('h264'); break; case 'm2ts': supported = browser.tizen || browser.web0s || browser.edgeUwp; + videoCodecs.push('h264'); break; case 'wmv': supported = browser.tizen || browser.web0s || browser.edgeUwp; videoAudioCodecs = []; break; case 'ts': - supported = browser.tizen || browser.web0s || browser.edgeUwp; + supported = testCanPlayTs(); + videoCodecs.push('h264'); profileContainer = 'ts,mpegts'; break; default: @@ -192,6 +197,7 @@ define(['browser'], function (browser) { return { Container: profileContainer, Type: 'Video', + VideoCodec: videoCodecs.join(','), AudioCodec: videoAudioCodecs.join(',') }; } @@ -199,7 +205,7 @@ define(['browser'], function (browser) { function getMaxBitrate() { if (browser.edgeUwp) { - return 15000000; + return 30000000; } // 10mbps @@ -216,7 +222,7 @@ define(['browser'], function (browser) { if (browser.tizen) { // 2015 models - if (userAgent.indexOf('tizen 2.3') != -1) { + if (userAgent.indexOf('tizen 2.3') !== -1) { return 20000000; } @@ -239,7 +245,6 @@ define(['browser'], function (browser) { var canPlayWebm = videoTestElement.canPlayType('video/webm').replace(/no/, ''); var canPlayMkv = testCanPlayMkv(videoTestElement); - var canPlayTs = testCanPlayTs(); var profile = {}; @@ -269,19 +274,20 @@ define(['browser'], function (browser) { } var mp3Added = false; - if (canPlayMkv || canPlayTs) { + if (canPlayMkv) { if (supportsMp3VideoAudio) { mp3Added = true; videoAudioCodecs.push('mp3'); - hlsVideoAudioCodecs.push('mp3'); } } if (videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, '')) { videoAudioCodecs.push('aac'); hlsVideoAudioCodecs.push('aac'); } - if (!mp3Added && supportsMp3VideoAudio) { - videoAudioCodecs.push('mp3'); + if (supportsMp3VideoAudio) { + if (!mp3Added) { + videoAudioCodecs.push('mp3'); + } hlsVideoAudioCodecs.push('mp3'); } @@ -342,12 +348,12 @@ define(['browser'], function (browser) { ['opus', 'mp3', 'aac', 'flac', 'webma', 'wma', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) { profile.DirectPlayProfiles.push({ - Container: audioFormat == 'webma' ? 'webma,webm' : audioFormat, + Container: audioFormat === 'webma' ? 'webma,webm' : audioFormat, Type: 'Audio' }); // aac also appears in the m4a container - if (audioFormat == 'aac') { + if (audioFormat === 'aac') { profile.DirectPlayProfiles.push({ Container: 'm4a', AudioCodec: audioFormat, @@ -389,7 +395,7 @@ define(['browser'], function (browser) { } // Can't use mkv on mobile because we have to use the native player controls and they won't be able to seek it - if (canPlayMkv && options.supportsCustomSeeking && !browser.tizen) { + if (canPlayMkv && options.supportsCustomSeeking && !browser.tizen && options.enableMkvProgressive !== false) { profile.TranscodingProfiles.push({ Container: 'mkv', Type: 'Video', @@ -400,28 +406,15 @@ define(['browser'], function (browser) { }); } - if (canPlayTs && options.supportsCustomSeeking && !browser.tizen && !browser.web0s) { - profile.TranscodingProfiles.push({ - Container: 'ts', - Type: 'Video', - AudioCodec: videoAudioCodecs.join(','), - VideoCodec: 'h264', - Context: 'Streaming', - CopyTimestamps: copyTimestamps, - // If audio transcoding is needed, limit channels to number of physical audio channels - // Trying to transcode to 5 channels when there are only 2 speakers generally does not sound good - MaxAudioChannels: physicalAudioChannels.toString() - }); - } - - if (canPlayHls()) { + if (canPlayHls() && options.enableHls !== false) { profile.TranscodingProfiles.push({ Container: 'ts', Type: 'Video', AudioCodec: hlsVideoAudioCodecs.join(','), VideoCodec: 'h264', Context: 'Streaming', - Protocol: 'hls' + Protocol: 'hls', + MaxAudioChannels: physicalAudioChannels.toString() }); } @@ -565,6 +558,15 @@ define(['browser'], function (browser) { }] }); + if (!browser.edgeUwp && !browser.tizen && !browser.web0s) { + profile.CodecProfiles[profile.CodecProfiles.length - 1].Conditions.push({ + Condition: 'NotEquals', + Property: 'IsAVC', + Value: 'false', + IsRequired: false + }); + } + profile.CodecProfiles.push({ Type: 'Video', Codec: 'vpx', diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css index 9523c94d0..e2356586b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css @@ -1,3 +1,12 @@ +button::-moz-focus-inner { + padding: 0; + border: 0; +} + +button { + -webkit-border-fit: border !important; +} + .card { border: 0; font-size: inherit !important; @@ -82,10 +91,14 @@ transform: scale(1.16, 1.16); } +.cardBox-mobile { + margin: 1px; +} + @media all and (min-width: 600px) { .cardBox-mobile { - margin: 3px; + margin: 2px; } } @@ -147,7 +160,7 @@ .cardImageContainer { /* Should be 0 with visualCardBox, but not really noticeable */ - border-radius: 2px; + border-radius: 1px; } } @@ -179,6 +192,8 @@ bottom: 0; /* Needed in case this is a button */ display: block; + /* Needed in safari */ + height: 100%; } .cardImage { @@ -192,6 +207,23 @@ background-position: center bottom; } +.cardImage-img { + max-height: 100%; + max-width: 100%; + /* This is simply for lazy image purposes, to ensure the image is visible sooner when scrolling */ + min-height: 70%; + min-width: 70%; + align-self: flex-end; + position: static; +} + +.coveredImage-img { + max-height: none; + max-width: none; + height: 100%; + width: 100%; +} + .coveredImage { background-size: 100% 100%; background-position: center center; @@ -211,12 +243,8 @@ } .visualCardBox-cardFooter { - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - -moz-box-shadow: 0 2px 4px rgba(0,0,0,0.1); - -ms-box-shadow: 0 2px 4px rgba(0,0,0,0.1); - -webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.1); - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; } .innerCardFooter { @@ -245,6 +273,11 @@ overflow: hidden; text-overflow: ellipsis; color: inherit; + text-align: left; +} + +.singleCardText { + padding: .5em; } .cardTextCentered { @@ -259,8 +292,9 @@ margin-right: 2em; } -.cardCenteredText { +.cardDefaultText { white-space: normal; + text-align: center; } .textActionButton { @@ -315,15 +349,21 @@ .cardOverlayButton { color: #fff !important; - background-color: rgba(0,0,0,.7) !important; + background-color: rgba(0,0,0,.8) !important; border-radius: 500px; position: absolute; bottom: 0; right: 0; margin: 0 .35em .5em 0; z-index: 1; + /*opacity: 0; + transition: opacity 0.5s ease-in; /* vendorless fallback */ */; } + /*.card:hover .cardOverlayButton { + opacity: 1; +}*/ + .cardOverlayButton:hover { background-color: rgba(0,0,0,.9) !important; transition: background-color .5s ease-out; @@ -375,7 +415,7 @@ } .overflowBackdropCard-scalable { - width: 84%; + width: 80%; max-width: 400px; } @@ -514,7 +554,6 @@ } } - @media all and (min-width: 1600px) { .portraitCard-scalable { @@ -524,12 +563,27 @@ .smallBackdropCard-scalable { width: 12.5%; } + + .backdropCard-scalable { + width: 20%; + } + + .squareCard-scalable { + width: 12.5%; + } } @media all and (min-width: 1800px) { + .smallBackdropCard-scalable { + width: 10%; + } +} + +@media all and (min-width: 1920px) { + .squareCard-scalable { - width: 12.5%; + width: 11.111111111111111111111111111111%; } .smallBackdropCard-scalable { @@ -539,10 +593,6 @@ @media all and (min-width: 2100px) { - .squareCard-scalable { - width: 11.111111111111111111111111111111%; - } - .backdropCard-scalable { width: 20%; } @@ -582,6 +632,10 @@ width: 16.66666666666666667%; } -.layout-tv .personCard-scalable { - width: 14.285714285714285714285714285714%; + +@media all and (min-width: 1600px) { + + .layout-tv .backdropCard-scalable { + width: 25%; + } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index 86e6ffa37..5f1293615 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -1,5 +1,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo', 'focusManager', 'indicators', 'globalize', 'layoutManager', 'apphost', 'dom', 'emby-button', 'css!./card', 'paper-icon-button-light', 'clearButtonStyle'], function (datetime, imageLoader, connectionManager, itemHelper, mediaInfo, focusManager, indicators, globalize, layoutManager, appHost, dom) { + 'use strict'; // Regular Expressions for parsing tags and attributes var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, @@ -32,7 +33,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var apiClient = connectionManager.currentApiClient(); - if (arguments.length == 1) { + if (arguments.length === 1) { options = arguments[0]; items = options.items; @@ -48,54 +49,122 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo switch (shape) { case 'portrait': - if (screenWidth >= 2200) return 10; - if (screenWidth >= 2100) return 9; - if (screenWidth >= 1600) return 8; - if (screenWidth >= 1400) return 7; - if (screenWidth >= 1200) return 6; - if (screenWidth >= 800) return 5; - if (screenWidth >= 640) return 4; + if (screenWidth >= 2200) { + return 10; + } + if (screenWidth >= 2100) { + return 9; + } + if (screenWidth >= 1600) { + return 8; + } + if (screenWidth >= 1400) { + return 7; + } + if (screenWidth >= 1200) { + return 6; + } + if (screenWidth >= 800) { + return 5; + } + if (screenWidth >= 640) { + return 4; + } return 3; case 'square': - if (screenWidth >= 2100) return 9; - if (screenWidth >= 1800) return 8; - if (screenWidth >= 1400) return 7; - if (screenWidth >= 1200) return 6; - if (screenWidth >= 900) return 5; - if (screenWidth >= 700) return 4; - if (screenWidth >= 500) return 3; + if (screenWidth >= 2100) { + return 9; + } + if (screenWidth >= 1800) { + return 8; + } + if (screenWidth >= 1400) { + return 7; + } + if (screenWidth >= 1200) { + return 6; + } + if (screenWidth >= 900) { + return 5; + } + if (screenWidth >= 700) { + return 4; + } + if (screenWidth >= 500) { + return 3; + } return 2; case 'banner': - if (screenWidth >= 2200) return 4; - if (screenWidth >= 1200) return 3; - if (screenWidth >= 800) return 2; + if (screenWidth >= 2200) { + return 4; + } + if (screenWidth >= 1200) { + return 3; + } + if (screenWidth >= 800) { + return 2; + } return 1; case 'backdrop': - if (screenWidth >= 2500) return 6; - if (screenWidth >= 2100) return 5; - if (screenWidth >= 1200) return 4; - if (screenWidth >= 770) return 3; - if (screenWidth >= 420) return 2; + if (screenWidth >= 2500) { + return 6; + } + if (screenWidth >= 1600) { + return 5; + } + if (screenWidth >= 1200) { + return 4; + } + if (screenWidth >= 770) { + return 3; + } + if (screenWidth >= 420) { + return 2; + } return 1; case 'smallBackdrop': - if (screenWidth >= 1440) return 8; - if (screenWidth >= 1100) return 6; - if (screenWidth >= 800) return 5; - if (screenWidth >= 600) return 4; - if (screenWidth >= 540) return 3; - if (screenWidth >= 420) return 2; + if (screenWidth >= 1440) { + return 8; + } + if (screenWidth >= 1100) { + return 6; + } + if (screenWidth >= 800) { + return 5; + } + if (screenWidth >= 600) { + return 4; + } + if (screenWidth >= 540) { + return 3; + } + if (screenWidth >= 420) { + return 2; + } return 1; case 'overflowPortrait': - if (screenWidth >= 1000) return 100 / 23; - if (screenWidth >= 640) return 100 / 36; + if (screenWidth >= 1000) { + return 100 / 23; + } + if (screenWidth >= 640) { + return 100 / 36; + } return 2.5; case 'overflowSquare': - if (screenWidth >= 1000) return 100 / 22; - if (screenWidth >= 640) return 100 / 30; + if (screenWidth >= 1000) { + return 100 / 22; + } + if (screenWidth >= 640) { + return 100 / 30; + } return 100 / 42; case 'overflowBackdrop': - if (screenWidth >= 1000) return 100 / 40; - if (screenWidth >= 640) return 100 / 60; + if (screenWidth >= 1000) { + return 100 / 40; + } + if (screenWidth >= 640) { + return 100 / 60; + } return 100 / 84; default: return 4; @@ -122,7 +191,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (isResizable(screenWidth)) { var roundScreenTo = 100; - screenWidth = Math.ceil(screenWidth / roundScreenTo) * roundScreenTo; + screenWidth = Math.floor(screenWidth / roundScreenTo) * roundScreenTo; } if (window.screen) { @@ -142,27 +211,31 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var primaryImageAspectRatio = imageLoader.getPrimaryImageAspectRatio(items); - var isThumbAspectRatio = primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1.777777778) < .3; - var isSquareAspectRatio = primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1) < .33 || - primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1.3333334) < .01; + var isThumbAspectRatio = primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1.777777778) < 0.3; + var isSquareAspectRatio = primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1) < 0.33 || + primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 1.3333334) < 0.01; - if (options.shape == 'auto' || options.shape == 'autohome' || options.shape == 'autooverflow' || options.shape == 'autoVertical') { + if (options.shape === 'auto' || options.shape === 'autohome' || options.shape === 'autooverflow' || options.shape === 'autoVertical') { - if (options.preferThumb || isThumbAspectRatio) { - options.shape = options.shape == 'autooverflow' ? 'overflowBackdrop' : 'backdrop'; + if (options.preferThumb === true || isThumbAspectRatio) { + options.shape = options.shape === 'autooverflow' ? 'overflowBackdrop' : 'backdrop'; } else if (isSquareAspectRatio) { options.coverImage = true; - options.shape = options.shape == 'autooverflow' ? 'overflowSquare' : 'square'; + options.shape = options.shape === 'autooverflow' ? 'overflowSquare' : 'square'; } else if (primaryImageAspectRatio && primaryImageAspectRatio > 1.9) { options.shape = 'banner'; options.coverImage = true; - } else if (primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 0.6666667) < .2) { - options.shape = options.shape == 'autooverflow' ? 'overflowPortrait' : 'portrait'; + } else if (primaryImageAspectRatio && Math.abs(primaryImageAspectRatio - 0.6666667) < 0.2) { + options.shape = options.shape === 'autooverflow' ? 'overflowPortrait' : 'portrait'; } else { - options.shape = options.defaultShape || (options.shape == 'autooverflow' ? 'overflowSquare' : 'square'); + options.shape = options.defaultShape || (options.shape === 'autooverflow' ? 'overflowSquare' : 'square'); } } + if (options.preferThumb === 'auto') { + options.preferThumb = options.shape === 'backdrop' || options.shape === 'overflowBackdrop'; + } + options.uiAspect = getDesiredAspect(options.shape); options.primaryImageAspectRatio = primaryImageAspectRatio; @@ -175,13 +248,13 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (layoutManager.tv) { - if (options.shape == 'backdrop') { + if (options.shape === 'backdrop') { options.width = options.width || 500; } - else if (options.shape == 'portrait') { + else if (options.shape === 'portrait') { options.width = options.width || 243; } - else if (options.shape == 'square') { + else if (options.shape === 'square') { options.width = options.width || 243; } } @@ -193,13 +266,17 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var isVertical; - if (options.shape == 'autoVertical') { + if (options.shape === 'autoVertical') { isVertical = true; } + if (options.vibrant && !appHost.supports('imageanalysis')) { + options.vibrant = false; + } + setCardData(items, options); - if (options.indexBy == 'Genres') { + if (options.indexBy === 'Genres') { return buildCardsByGenreHtmlInternal(items, apiClient, options); } @@ -209,6 +286,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo className += ' ' + options.shape + 'Card'; } + if (options.cardCssClass) { + className += ' ' + options.cardCssClass; + } + var html = ''; var itemsInRow = 0; @@ -225,30 +306,30 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (options.indexBy) { var newIndexValue = ''; - if (options.indexBy == 'PremiereDate') { + if (options.indexBy === 'PremiereDate') { if (item.PremiereDate) { try { - newIndexValue = getDisplayDateText(datetime.parseISO8601Date(item.PremiereDate)); + newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' }); } catch (err) { } } } - else if (options.indexBy == 'Genres') { + else if (options.indexBy === 'Genres') { newIndexValue = item.Name; } - else if (options.indexBy == 'ProductionYear') { + else if (options.indexBy === 'ProductionYear') { newIndexValue = item.ProductionYear; } - else if (options.indexBy == 'CommunityRating') { - newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + (item.CommunityRating % 1 >= .5 ? .5 : 0)) + '+' : null; + else if (options.indexBy === 'CommunityRating') { + newIndexValue = item.CommunityRating ? (Math.floor(item.CommunityRating) + (item.CommunityRating % 1 >= 0.5 ? 0.5 : 0)) + '+' : null; } - if (newIndexValue != currentIndexValue) { + if (newIndexValue !== currentIndexValue) { if (hasOpenRow) { html += '
'; @@ -280,7 +361,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } } - if (options.rows && itemsInRow == 0) { + if (options.rows && itemsInRow === 0) { if (hasOpenRow) { html += '
'; @@ -318,6 +399,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return html; } + function filterItemsByGenre(items, genre) { + + var genreLower = genre.toLowerCase(); + return items.filter(function (currentItem) { + + return currentItem.Genres.filter(function (g) { + + return g.toLowerCase() === genreLower; + + }).length > 0; + }); + } + function buildCardsByGenreHtmlInternal(items, apiClient, options) { var className = 'card'; @@ -330,19 +424,43 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var loopItems = options.genres; + var itemsInRow; + var hasOpenRow; + + var onGenre = function (renderItem) { + + var currentItemHtml = ''; + + if (options.rows && itemsInRow === 0) { + + if (hasOpenRow) { + currentItemHtml += '
'; + hasOpenRow = false; + } + + currentItemHtml += '
'; + hasOpenRow = true; + } + + var cardClass = className; + currentItemHtml += buildCard(i, renderItem, apiClient, options, cardClass); + + itemsInRow++; + + if (options.rows && itemsInRow >= options.rows) { + currentItemHtml += '
'; + hasOpenRow = false; + itemsInRow = 0; + } + + return currentItemHtml; + }; + for (var i = 0, length = loopItems.length; i < length; i++) { var item = loopItems[i]; - var genreLower = item.Name.toLowerCase(); - var renderItems = items.filter(function (currentItem) { - - return currentItem.Genres.filter(function (g) { - - return g.toLowerCase() == genreLower; - - }).length > 0; - }); + var renderItems = filterItemsByGenre(items, item.Name); if (!renderItems.length) { continue; @@ -357,39 +475,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo showMoreButton = true; } - var itemsInRow = 0; - var hasOpenRow = false; - - html += renderItems.map(function (renderItem) { - - var currentItemHtml = ''; - - if (options.rows && itemsInRow == 0) { - - if (hasOpenRow) { - currentItemHtml += '
'; - hasOpenRow = false; - } - - currentItemHtml += '
'; - hasOpenRow = true; - } - - var cardClass = className; - currentItemHtml += buildCard(i, renderItem, apiClient, options, cardClass); - - itemsInRow++; - - if (options.rows && itemsInRow >= options.rows) { - currentItemHtml += '
'; - hasOpenRow = false; - itemsInRow = 0; - } - - return currentItemHtml; - - }).join(''); + itemsInRow = 0; + hasOpenRow = false; + html += renderItems.map(onGenre).join(''); if (showMoreButton) { html += '
'; @@ -404,38 +493,17 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return html; } - function getDisplayDateText(date) { - - var weekday = []; - weekday[0] = globalize.translate('sharedcomponents#Sunday'); - weekday[1] = globalize.translate('sharedcomponents#Monday'); - weekday[2] = globalize.translate('sharedcomponents#Tuesday'); - weekday[3] = globalize.translate('sharedcomponents#Wednesday'); - weekday[4] = globalize.translate('sharedcomponents#Thursday'); - weekday[5] = globalize.translate('sharedcomponents#Friday'); - weekday[6] = globalize.translate('sharedcomponents#Saturday'); - - var day = weekday[date.getDay()]; - date = date.toLocaleDateString(); - - if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) { - return day + " " + date; - } - - return date; - } - function getDesiredAspect(shape) { if (shape) { shape = shape.toLowerCase(); - if (shape.indexOf('portrait') != -1) { + if (shape.indexOf('portrait') !== -1) { return (2 / 3); } - if (shape.indexOf('backdrop') != -1) { + if (shape.indexOf('backdrop') !== -1) { return (16 / 9); } - if (shape.indexOf('square') != -1) { + if (shape.indexOf('square') !== -1) { return 1; } } @@ -453,35 +521,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var forceName = false; var imgUrl = null; var coverImage = false; + var uiAspect = null; - if (options.autoThumb && item.ImageTags && item.ImageTags.Primary && item.PrimaryImageAspectRatio && item.PrimaryImageAspectRatio >= 1.34) { - - height = primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null; - - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - type: "Primary", - maxHeight: height, - maxWidth: width, - tag: item.ImageTags.Primary - }); - - if (primaryImageAspectRatio) { - if (uiAspect) { - if (Math.abs(primaryImageAspectRatio - uiAspect) <= .2) { - coverImage = true; - } - } - } - - } else if (options.autoThumb && item.ImageTags && item.ImageTags.Thumb) { - - imgUrl = ApiClient.getScaledImageUrl(item.Id, { - type: "Thumb", - maxWidth: width, - tag: item.ImageTags.Thumb - }); - - } else if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) { + if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { type: "Thumb", @@ -505,7 +547,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo tag: item.SeriesThumbImageTag }); - } else if (options.preferThumb && item.ParentThumbItemId && options.inheritThumb !== false) { + } else if (options.preferThumb && item.ParentThumbItemId && options.inheritThumb !== false && item.MediaType !== 'Photo') { imgUrl = apiClient.getScaledImageUrl(item.ParentThumbItemId, { type: "Thumb", @@ -539,9 +581,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (primaryImageAspectRatio) { - var uiAspect = getDesiredAspect(options.shape); + uiAspect = getDesiredAspect(options.shape); if (uiAspect) { - coverImage = Math.abs(primaryImageAspectRatio - uiAspect) <= .2; + coverImage = Math.abs(primaryImageAspectRatio - uiAspect) <= 0.2; } } @@ -561,9 +603,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (primaryImageAspectRatio) { - var uiAspect = getDesiredAspect(options.shape); + uiAspect = getDesiredAspect(options.shape); if (uiAspect) { - coverImage = Math.abs(primaryImageAspectRatio - uiAspect) <= .2; + coverImage = Math.abs(primaryImageAspectRatio - uiAspect) <= 0.2; } } } @@ -587,13 +629,13 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo }); if (primaryImageAspectRatio) { - var uiAspect = getDesiredAspect(options.shape); + uiAspect = getDesiredAspect(options.shape); if (uiAspect) { - coverImage = Math.abs(primaryImageAspectRatio - uiAspect) <= .2; + coverImage = Math.abs(primaryImageAspectRatio - 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, { type: "Thumb", @@ -669,7 +711,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return 'defaultCardColor' + getDefaultColorIndex(str); } - function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout) { + function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout, addRightMargin) { var html = ''; @@ -678,18 +720,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo for (i = 0, length = lines.length; i < length; i++) { + var currentCssClass = cssClass; var text = lines[i]; - if (i == 1 && isOuterFooter) { - cssClass += ' cardText-secondary'; + if (valid > 0 && isOuterFooter) { + currentCssClass += ' cardText-secondary'; } - if (isOuterFooter && cardLayout) { - cssClass += ' cardText-rightmargin'; + if (addRightMargin) { + currentCssClass += ' cardText-rightmargin'; } if (text) { - html += "
"; + html += "
"; html += text; html += "
"; valid++; @@ -706,7 +749,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return html; } - function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, isOuterFooter) { + var uniqueFooterIndex = 0; + function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, isOuterFooter, cardFooterId, vibrantSwatch) { var html = ''; @@ -714,24 +758,22 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (isOuterFooter && options.cardLayout && !layoutManager.tv) { - if (options.cardFooterAside == 'logo') { - - } - else if (options.cardFooterAside != 'none') { - var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; + if (options.cardFooterAside !== 'none') { + var moreIcon = appHost.moreIcon === 'dots-horiz' ? '' : ''; html += ''; } } - var cssClass = options.centerText && !options.cardLayout ? "cardText cardTextCentered" : "cardText"; + var cssClass = options.centerText ? "cardText cardTextCentered" : "cardText"; var lines = []; + var parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo'; + var titleAdded; if (showOtherText) { - var parentTitleUnderneath = item.Type == 'MusicAlbum' || item.Type == 'Audio' || item.Type == 'MusicVideo'; if ((options.showParentTitle || options.showParentTitleOrTitle) && !parentTitleUnderneath) { - if (isOuterFooter && item.Type == 'Episode' && item.SeriesName && item.SeriesId) { + if (isOuterFooter && item.Type === 'Episode' && item.SeriesName && item.SeriesId) { lines.push(getTextActionButton({ Id: item.SeriesId, @@ -742,20 +784,35 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } else { - var parentTitle = item.EpisodeTitle ? item.Name : (item.SeriesName || item.Album || item.AlbumArtist || item.GameSystem || ""); + if (item.Type === 'Program') { - if (parentTitle || options.showParentTitle) { - lines.push(parentTitle); + lines.push(item.Name); + + if (!item.IsSeries) { + titleAdded = true; + } + + } else { + var parentTitle = item.SeriesName || item.Album || item.AlbumArtist || item.GameSystem || ""; + + if (parentTitle || showTitle) { + lines.push(parentTitle); + } } } } } - if (showTitle || forceName || (options.showParentTitleOrTitle && !lines.length)) { + var showMediaTitle = (showTitle && !titleAdded) || (options.showParentTitleOrTitle && !lines.length); + if (!showMediaTitle && !titleAdded && (showTitle || forceName)) { + showMediaTitle = true; + } - var name = options.showTitle == 'auto' && !item.IsFolder && item.MediaType == 'Photo' ? '' : itemHelper.getDisplayName(item); + if (showMediaTitle) { - lines.push(htmlEncode(name)); + var name = options.showTitle === 'auto' && !item.IsFolder && item.MediaType === 'Photo' ? '' : itemHelper.getDisplayName(item); + + lines.push(name); } if (showOtherText) { @@ -766,7 +823,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo item.AlbumArtists[0].IsFolder = true; lines.push(getTextActionButton(item.AlbumArtists[0])); } else { - lines.push(item.EpisodeTitle ? item.Name : (item.SeriesName || item.Album || item.AlbumArtist || item.GameSystem || "")); + lines.push(item.Type === 'Program' ? item.Name : (item.SeriesName || item.Album || item.AlbumArtist || item.GameSystem || "")); } } @@ -789,7 +846,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var songLine = ''; if (item.SongCount) { - songLine = item.SongCount == 1 ? + songLine = item.SongCount === 1 ? globalize.translate('sharedcomponents#ValueOneSong') : globalize.translate('sharedcomponents#ValueSongCount', item.SongCount); } @@ -818,24 +875,31 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo lines.push(item.ProductionYear || ''); } - if (options.showChannelName) { + if (options.showRuntime) { - lines.push(item.ChannelName || ''); + if (item.RunTimeTicks) { + + lines.push(datetime.getDisplayRunningTime(item.RunTimeTicks)); + } else { + lines.push(''); + } } if (options.showAirTime) { - var airTimeText; + var airTimeText = ''; if (item.StartDate) { try { var date = datetime.parseISO8601Date(item.StartDate); - airTimeText = date.toLocaleDateString(); + if (options.showAirDateTime) { + airTimeText += datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }) + ' '; + } - airTimeText += ', ' + datetime.getDisplayTime(date); + airTimeText += datetime.getDisplayTime(date); - if (item.EndDate) { + if (item.EndDate && options.showAirEndTime) { date = datetime.parseISO8601Date(item.EndDate); airTimeText += ' - ' + datetime.getDisplayTime(date); } @@ -848,34 +912,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo lines.push(airTimeText || ''); } - if (options.showCurrentProgram && item.Type == 'TvChannel') { - - if (item.CurrentProgram) { - lines.push(item.CurrentProgram.Name); - } else { - lines.push(''); - } - } - - if (options.showSeriesYear) { - - if (item.Status == "Continuing") { - - lines.push(globalize.translate('sharedcomponents#SeriesYearToPresent', item.ProductionYear || '')); - - } else { - lines.push(item.ProductionYear || ''); - } - - } - - if (options.showProgramAirInfo) { - - var text = item.StartDate ? - datetime.toLocaleString(datetime.parseISO8601Date(item.StartDate, true)) : - ''; - - lines.push(text || ' '); + if (options.showChannelName) { if (item.ChannelId) { @@ -905,20 +942,86 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo lines.push(item.ChannelName || ' '); } } + + if (options.showCurrentProgram && item.Type === 'TvChannel') { + + if (item.CurrentProgram) { + lines.push(item.CurrentProgram.Name); + } else { + lines.push(''); + } + } + + if (options.showSeriesYear) { + + if (item.Status === "Continuing") { + + lines.push(globalize.translate('sharedcomponents#SeriesYearToPresent', item.ProductionYear || '')); + + } else { + + if (item.EndDate && item.ProductionYear) { + lines.push(item.ProductionYear + ' - ' + datetime.parseISO8601Date(item.EndDate).getFullYear()); + } else { + lines.push(item.ProductionYear || ''); + } + } + + } + + if (options.showSeriesTimerTime) { + if (item.RecordAnyTime) { + + lines.push(globalize.translate('sharedcomponents#Anytime')); + } else { + lines.push(datetime.getDisplayTime(item.StartDate)); + } + } + + if (options.showSeriesTimerChannel) { + if (item.RecordAnyChannel) { + lines.push(globalize.translate('sharedcomponents#AllChannels')); + } + else if (item.ChannelId) { + lines.push(item.ChannelName || ''); + } + } + + if (options.showPersonRoleOrType) { + if (item.Role) { + lines.push('as ' + item.Role); + } + else if (item.Type) { + lines.push(globalize.translate('core#' + item.Type)); + } else { + lines.push(''); + } + } } - if ((showTitle || !imgUrl) && forceName && overlayText && lines.length == 1) { + if ((showTitle || !imgUrl) && forceName && overlayText && lines.length === 1) { lines = []; } - html += getCardTextLines(lines, cssClass, !options.overlayText, isOuterFooter, options.cardLayout); + html += getCardTextLines(lines, cssClass, !options.overlayText, isOuterFooter, options.cardLayout, isOuterFooter && options.cardLayout && !options.centerText); if (progressHtml) { html += progressHtml; } if (html) { - html = '
' + html; + + var style = ''; + + if (options.vibrant && vibrantSwatch) { + var swatch = vibrantSwatch.split('|'); + if (swatch.length) { + + var index = 0; + style = ' style="color:' + swatch[index + 1] + ';background-color:' + swatch[index] + ';"'; + } + } + html = '
' + html; //cardFooter html += "
"; @@ -946,7 +1049,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var childText; - if (item.Type == 'Playlist') { + if (item.Type === 'Playlist') { childText = ''; @@ -965,11 +1068,11 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo counts.push(childText); } - else if (item.Type == 'Genre' || item.Type == 'Studio') { + else if (item.Type === 'Genre' || item.Type === 'Studio') { if (item.MovieCount) { - childText = item.MovieCount == 1 ? + childText = item.MovieCount === 1 ? globalize.translate('sharedcomponents#ValueOneMovie') : globalize.translate('sharedcomponents#ValueMovieCount', item.MovieCount); @@ -978,7 +1081,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (item.SeriesCount) { - childText = item.SeriesCount == 1 ? + childText = item.SeriesCount === 1 ? globalize.translate('sharedcomponents#ValueOneSeries') : globalize.translate('sharedcomponents#ValueSeriesCount', item.SeriesCount); @@ -986,7 +1089,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (item.EpisodeCount) { - childText = item.EpisodeCount == 1 ? + childText = item.EpisodeCount === 1 ? globalize.translate('sharedcomponents#ValueOneEpisode') : globalize.translate('sharedcomponents#ValueEpisodeCount', item.EpisodeCount); @@ -994,28 +1097,28 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (item.GameCount) { - childText = item.GameCount == 1 ? + childText = item.GameCount === 1 ? globalize.translate('sharedcomponents#ValueOneGame') : globalize.translate('sharedcomponents#ValueGameCount', item.GameCount); counts.push(childText); } - } else if (item.Type == 'GameGenre') { + } else if (item.Type === 'GameGenre') { if (item.GameCount) { - childText = item.GameCount == 1 ? + childText = item.GameCount === 1 ? globalize.translate('sharedcomponents#ValueOneGame') : globalize.translate('sharedcomponents#ValueGameCount', item.GameCount); counts.push(childText); } - } else if (item.Type == 'MusicGenre' || options.context == "MusicArtist") { + } else if (item.Type === 'MusicGenre' || options.context === "MusicArtist") { if (item.AlbumCount) { - childText = item.AlbumCount == 1 ? + childText = item.AlbumCount === 1 ? globalize.translate('sharedcomponents#ValueOneAlbum') : globalize.translate('sharedcomponents#ValueAlbumCount', item.AlbumCount); @@ -1023,7 +1126,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (item.SongCount) { - childText = item.SongCount == 1 ? + childText = item.SongCount === 1 ? globalize.translate('sharedcomponents#ValueOneSong') : globalize.translate('sharedcomponents#ValueSongCount', item.SongCount); @@ -1031,16 +1134,16 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (item.MusicVideoCount) { - childText = item.MusicVideoCount == 1 ? + childText = item.MusicVideoCount === 1 ? globalize.translate('sharedcomponents#ValueOneMusicVideo') : globalize.translate('sharedcomponents#ValueMusicVideoCount', item.MusicVideoCount); counts.push(childText); } - } else if (item.Type == 'Series') { + } else if (item.Type === 'Series') { - childText = item.RecursiveItemCount == 1 ? + childText = item.RecursiveItemCount === 1 ? globalize.translate('sharedcomponents#ValueOneEpisode') : globalize.translate('sharedcomponents#ValueEpisodeCount', item.RecursiveItemCount); @@ -1062,9 +1165,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var imgInfo = getCardImageUrl(item, apiClient, options); var imgUrl = imgInfo.imgUrl; - var forceName = imgInfo.forceName || !imgUrl; + var forceName = imgInfo.forceName; - var showTitle = options.showTitle == 'auto' ? true : (options.showTitle || item.Type == 'PhotoAlbum' || item.Type == 'Folder'); + var showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); var overlayText = options.overlayText; if (forceName && !options.cardLayout) { @@ -1075,10 +1178,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } var cardImageContainerClass = 'cardImageContainer'; - if (options.coverImage || imgInfo.coverImage) { + var coveredImage = options.coverImage || imgInfo.coverImage; + + if (coveredImage) { cardImageContainerClass += ' coveredImage'; - if (item.MediaType == 'Photo' || item.Type == 'PhotoAlbum' || item.Type == 'Folder' || item.Type == 'Program') { + if (item.MediaType === 'Photo' || item.Type === 'PhotoAlbum' || item.Type === 'Folder' || item.ProgramInfo || item.Type === 'Program' || item.Type === 'Recording') { cardImageContainerClass += ' coveredImage-noScale'; } } @@ -1103,10 +1208,13 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var footerOverlayed = false; + var cardFooterId = 'cardFooter' + uniqueFooterIndex; + uniqueFooterIndex++; + if (overlayText) { footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter'; - innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, false); + innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, false, cardFooterId); footerOverlayed = true; } else if (progressHtml) { @@ -1122,10 +1230,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo innerCardFooter += '
' + mediaSourceCount + '
'; } + var vibrantSwatch = options.vibrant && imgUrl ? imageLoader.getCachedVibrantInfo(imgUrl) : null; + var outerCardFooter = ''; if (!overlayText && !footerOverlayed) { footerCssClass = options.cardLayout ? 'cardFooter visualCardBox-cardFooter' : 'cardFooter transparent'; - outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, true); + outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, true, cardFooterId, vibrantSwatch); } if (outerCardFooter && !options.cardLayout && options.allowBottomPadding !== false) { @@ -1142,15 +1252,15 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var overlayPlayButton = options.overlayPlayButton; if (overlayPlayButton == null && !options.overlayMoreButton && !options.cardLayout) { - overlayPlayButton = item.MediaType == 'Video'; + overlayPlayButton = item.MediaType === 'Video'; } - if (overlayPlayButton && !item.IsPlaceHolder && (item.LocationType != 'Virtual' || !item.MediaType || item.Type == 'Program') && item.Type != 'Person' && item.PlayAccess == 'Full') { + if (overlayPlayButton && !item.IsPlaceHolder && (item.LocationType !== 'Virtual' || !item.MediaType || item.Type === 'Program') && item.Type !== 'Person' && item.PlayAccess === 'Full') { overlayButtons += ''; } if (options.overlayMoreButton) { - var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; + var moreIcon = appHost.moreIcon === 'dots-horiz' ? '' : ''; overlayButtons += ''; } @@ -1177,7 +1287,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo cardContentOpen = ''; } - cardImageContainerOpen = imgUrl ? ('
') : ('
'); + + if (options.vibrant && imgUrl && !vibrantSwatch) { + cardImageContainerOpen = '
'; + + var imgClass = 'cardImage cardImage-img lazy'; + if (coveredImage) { + imgClass += ' coveredImage-img'; + } + cardImageContainerOpen += ''; + + } else { + cardImageContainerOpen = imgUrl ? ('
') : ('
'); + } var cardScalableClass = options.cardLayout ? 'cardScalable visualCardBox-cardScalable' : 'cardScalable'; cardImageContainerOpen = '
' + cardContentOpen + cardImageContainerOpen; @@ -1218,8 +1340,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } if (!imgUrl) { - var defaultName = item.EpisodeTitle ? item.Name : itemHelper.getDisplayName(item); - cardImageContainerOpen += '
' + defaultName + '
'; + var defaultName = item.Type === 'Program' || item.Type === 'Timer' || item.EpisodeTitle ? item.Name : itemHelper.getDisplayName(item); + cardImageContainerOpen += '
' + defaultName + '
'; } var tagName = (layoutManager.tv || !scalable) && !overlayButtons ? 'button' : 'div'; @@ -1240,14 +1362,14 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var actionAttribute; - if (tagName == 'button') { + if (tagName === 'button') { className += " itemAction"; actionAttribute = ' data-action="' + action + '"'; } else { actionAttribute = ''; } - if (item.Type != 'MusicAlbum' && item.Type != 'MusicArtist' && item.Type != 'Audio') { + if (item.Type !== 'MusicAlbum' && item.Type !== 'MusicArtist' && item.Type !== 'Audio') { className += ' card-withuserdata'; } @@ -1259,10 +1381,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var channelIdData = item.ChannelId ? (' data-channelid="' + item.ChannelId + '"') : ''; var contextData = options.context ? (' data-context="' + options.context + '"') : ''; - return '\ -<' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + contextData + ' data-prefix="' + prefix + '" class="' + className + '"> \ -' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + cardContentClose + overlayButtons + cardScalableClose + outerCardFooter + cardBoxClose + '\ -'; + return '<' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId || options.serverId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + contextData + ' data-prefix="' + prefix + '" class="' + className + '">' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + cardContentClose + overlayButtons + cardScalableClose + outerCardFooter + cardBoxClose + ''; } function buildCards(items, options) { @@ -1287,7 +1406,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (html) { - if (options.itemsContainer.cardBuilderHtml != html) { + if (options.itemsContainer.cardBuilderHtml !== html) { options.itemsContainer.innerHTML = html; if (items.length < 50) { @@ -1308,7 +1427,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo focusManager.autoFocus(options.itemsContainer, true); } - if (options.indexBy == 'Genres') { + if (options.indexBy === 'Genres') { options.itemsContainer.addEventListener('click', onItemsContainerClick); } } @@ -1364,31 +1483,35 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo function updateUserData(card, userData) { var type = card.getAttribute('data-type'); - var enableCountIndicator = type == 'Series' || type == 'BoxSet' || type == 'Season'; - var indicatorsElem; + var enableCountIndicator = type === 'Series' || type === 'BoxSet' || type === 'Season'; + var indicatorsElem = null; + var playedIndicator = null; + var countIndicator = null; + var itemProgressBar = null; if (userData.Played) { - var playedIndicator = card.querySelector('.playedIndicator'); + playedIndicator = card.querySelector('.playedIndicator'); if (!playedIndicator) { playedIndicator = document.createElement('div'); playedIndicator.classList.add('playedIndicator'); + playedIndicator.classList.add('indicator'); indicatorsElem = ensureIndicators(card, indicatorsElem); indicatorsElem.appendChild(playedIndicator); } - playedIndicator.innerHTML = 'check'; + playedIndicator.innerHTML = 'check'; } else { - var playedIndicator = card.querySelector('.playedIndicator'); + playedIndicator = card.querySelector('.playedIndicator'); if (playedIndicator) { playedIndicator.parentNode.removeChild(playedIndicator); } } if (userData.UnplayedItemCount) { - var countIndicator = card.querySelector('.countIndicator'); + countIndicator = card.querySelector('.countIndicator'); if (!countIndicator) { @@ -1400,7 +1523,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo countIndicator.innerHTML = userData.UnplayedItemCount; } else if (enableCountIndicator) { - var countIndicator = card.querySelector('.countIndicator'); + countIndicator = card.querySelector('.countIndicator'); if (countIndicator) { countIndicator.parentNode.removeChild(countIndicator); @@ -1415,7 +1538,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (progressHtml) { - var itemProgressBar = card.querySelector('.itemProgressBar'); + itemProgressBar = card.querySelector('.itemProgressBar'); if (!itemProgressBar) { itemProgressBar = document.createElement('div'); @@ -1435,7 +1558,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } else { - var itemProgressBar = card.querySelector('.itemProgressBar'); + itemProgressBar = card.querySelector('.itemProgressBar'); if (itemProgressBar) { itemProgressBar.parentNode.removeChild(itemProgressBar); } @@ -1451,10 +1574,56 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } } + function onTimerCreated(programId, newTimerId, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (!icon) { + var indicatorsElem = ensureIndicators(cell); + indicatorsElem.insertAdjacentHTML('beforeend', ''); + } + cell.setAttribute('data-timerid', newTimerId); + } + } + + function onTimerCancelled(id, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + id + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (icon) { + icon.parentNode.removeChild(icon); + } + cell.removeAttribute('data-timerid'); + } + } + + function onSeriesTimerCancelled(id, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + id + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (icon) { + icon.parentNode.removeChild(icon); + } + cell.removeAttribute('data-seriestimerid'); + } + } + return { getCardsHtml: getCardsHtml, buildCards: buildCards, onUserDataChanged: onUserDataChanged, - getDefaultColorClass: getDefaultColorClass + getDefaultColorClass: getDefaultColorClass, + onTimerCreated: onTimerCreated, + onTimerCancelled: onTimerCancelled, + onSeriesTimerCancelled: onSeriesTimerCancelled }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js index 9a340df5d..921561bbe 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/chaptercardbuilder.js @@ -1,4 +1,5 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager'], function (datetime, imageLoader, connectionManager, layoutManager) { + 'use strict'; function buildChapterCardsHtml(item, chapters, options) { @@ -6,7 +7,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager'], functi var mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || []; var videoStream = mediaStreams.filter(function (i) { - return i.Type == 'Video'; + return i.Type === 'Video'; })[0] || {}; var shape = (options.backdropShape || 'backdrop'); @@ -32,7 +33,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager'], functi for (var i = 0, length = chapters.length; i < length; i++) { - if (options.rows && itemsInRow == 0) { + if (options.rows && itemsInRow === 0) { html += '
'; } @@ -91,22 +92,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager'], functi cardBoxCssClass += ' cardBox-focustransform'; } - var html = '\ -
\ -' - ; + var html = '
'; return html; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/peoplecardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/peoplecardbuilder.js index 656cd6da9..b699d2001 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/peoplecardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/peoplecardbuilder.js @@ -1,133 +1,17 @@ -define(['imageLoader', 'itemShortcuts', 'connectionManager', 'layoutManager'], function (imageLoader, itemShortcuts, connectionManager, layoutManager) { - - function buildPeopleCardsHtml(people, options) { - - var className = 'card ' + (options.shape || 'portrait') + 'Card personCard'; - - if (options.block || options.rows) { - className += ' block'; - } - - var html = ''; - var itemsInRow = 0; - - var serverId = options.serverId; - var apiClient = connectionManager.getApiClient(serverId); - - for (var i = 0, length = people.length; i < length; i++) { - - if (options.rows && itemsInRow == 0) { - html += '
'; - } - - var person = people[i]; - - html += buildPersonCard(person, apiClient, serverId, options, className); - itemsInRow++; - - if (options.rows && itemsInRow >= options.rows) { - itemsInRow = 0; - html += '
'; - } - } - - return html; - } - - function getImgUrl(person, maxWidth, apiClient) { - - if (person.PrimaryImageTag) { - - return apiClient.getScaledImageUrl(person.Id, { - - maxWidth: maxWidth, - tag: person.PrimaryImageTag, - type: "Primary" - }); - } - - return null; - } - - function buildPersonCard(person, apiClient, serverId, options, className) { - - className += " itemAction scalableCard personCard-scalable"; - className += " " + (options.shape || 'portrait') + 'Card-scalable'; - - var imgUrl = getImgUrl(person, options.width, apiClient); - - var cardImageContainerClass = 'cardImageContainer'; - if (options.coverImage) { - cardImageContainerClass += ' coveredImage'; - } - var cardImageContainer = imgUrl ? ('
') : ('
'); - - if (!imgUrl) { - cardImageContainer += 'person'; - } - - var nameHtml = ''; - nameHtml += '
' + person.Name + '
'; - - if (person.Role) { - nameHtml += '
as ' + person.Role + '
'; - } - else if (person.Type) { - nameHtml += '
' + Globalize.translate('core#' + person.Type) + '
'; - } else { - nameHtml += '
 
'; - } - - var cardBoxCssClass = 'visualCardBox cardBox'; - - if (layoutManager.tv) { - cardBoxCssClass += ' cardBox-focustransform'; - } - - var html = '\ -
\ -' - ; - - return html; - } +define(['cardBuilder'], function (cardBuilder) { + 'use strict'; function buildPeopleCards(items, options) { - if (options.parentContainer) { - // Abort if the container has been disposed - if (!document.body.contains(options.parentContainer)) { - return; - } - - if (items.length) { - options.parentContainer.classList.remove('hide'); - } else { - options.parentContainer.classList.add('hide'); - return; - } - } - - var html = buildPeopleCardsHtml(items, options); - - options.itemsContainer.innerHTML = html; - - imageLoader.lazyChildren(options.itemsContainer); - - itemShortcuts.off(options.itemsContainer); - itemShortcuts.on(options.itemsContainer); + options = Object.assign(options || {}, { + cardLayout: true, + centerText: true, + showTitle: true, + cardFooterAside: 'none', + showPersonRoleOrType: true, + cardCssClass: 'personCard' + }); + cardBuilder.buildCards(items, options); } return { diff --git a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js index f7c80885c..877a0716e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js +++ b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js @@ -1,4 +1,5 @@ define(['dialog', 'globalize'], function (dialog, globalize) { + 'use strict'; return function (text, title) { @@ -15,21 +16,21 @@ define(['dialog', 'globalize'], function (dialog, globalize) { var items = []; items.push({ - name: globalize.translate('sharedcomponents#ButtonOk'), - id: 'ok', - type: 'submit' + name: options.cancelText || globalize.translate('sharedcomponents#ButtonCancel'), + id: 'cancel', + type: options.primary === 'cancel' ? 'submit' : 'cancel' }); items.push({ - name: globalize.translate('sharedcomponents#ButtonCancel'), - id: 'cancel', - type: 'cancel' + name: options.confirmText || globalize.translate('sharedcomponents#ButtonOk'), + id: 'ok', + type: options.primary === 'cancel' ? 'cancel' : 'submit' }); options.buttons = items; return dialog(options).then(function (result) { - if (result == 'ok') { + if (result === 'ok') { return Promise.resolve(); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/confirm/nativeconfirm.js b/dashboard-ui/bower_components/emby-webcomponents/confirm/nativeconfirm.js index 3a2a82b6a..fd586ad1d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/confirm/nativeconfirm.js +++ b/dashboard-ui/bower_components/emby-webcomponents/confirm/nativeconfirm.js @@ -1,4 +1,5 @@ define([], function () { + 'use strict'; function replaceAll(str, find, replace) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/datetime.js b/dashboard-ui/bower_components/emby-webcomponents/datetime.js index dbb36b170..2a8273c8f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/datetime.js +++ b/dashboard-ui/bower_components/emby-webcomponents/datetime.js @@ -1,4 +1,5 @@ define(['globalize'], function (globalize) { + 'use strict'; function parseISO8601Date(s, toLocal) { @@ -40,12 +41,12 @@ } // if there's a timezone, calculate it - if (d[8] != "Z" && d[10]) { + if (d[8] !== "Z" && d[10]) { var offset = d[10] * 60 * 60 * 1000; if (d[11]) { offset += d[11] * 60 * 1000; } - if (d[9] == "-") { + if (d[9] === "-") { ms -= offset; } else { ms += offset; @@ -103,60 +104,36 @@ return false; }(); - function toLocaleString(date) { - var currentLocale = globalize.getCurrentLocale(); + function getCurrentLocale() { + var locale = globalize.getCurrentLocale(); + + return locale; + } + + function toLocaleString(date, options) { + var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleString(currentLocale) : + date.toLocaleString(currentLocale, options || {}) : date.toLocaleString(); } - function getLocaleDateStringParts(date) { + function toLocaleDateString(date, options) { - var day = getDayName(date); - date = toLocaleDateString(date); - - var parts = []; - - if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) { - parts.push(day); - } - - parts.push(date); - - return parts; - } - - function getDayName(date) { - - var weekday = []; - weekday[0] = globalize.translate('sharedcomponents#Sunday'); - weekday[1] = globalize.translate('sharedcomponents#Monday'); - weekday[2] = globalize.translate('sharedcomponents#Tuesday'); - weekday[3] = globalize.translate('sharedcomponents#Wednesday'); - weekday[4] = globalize.translate('sharedcomponents#Thursday'); - weekday[5] = globalize.translate('sharedcomponents#Friday'); - weekday[6] = globalize.translate('sharedcomponents#Saturday'); - - return weekday[date.getDay()]; - } - - function toLocaleDateString(date) { - - var currentLocale = globalize.getCurrentLocale(); + var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleDateString(currentLocale) : + date.toLocaleDateString(currentLocale, options || {}) : date.toLocaleDateString(); } - function toLocaleTimeString(date) { + function toLocaleTimeString(date, options) { - var currentLocale = globalize.getCurrentLocale(); + var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleTimeString(currentLocale) : - date.toLocaleTimeString(); + date.toLocaleTimeString(currentLocale, options || {}).toLowerCase() : + date.toLocaleTimeString().toLowerCase(); } function getDisplayTime(date) { @@ -171,36 +148,12 @@ } } - var time = toLocaleTimeString(date); + return toLocaleTimeString(date, { - var timeLower = time.toLowerCase(); + hour: 'numeric', + minute: '2-digit' - if (timeLower.indexOf('am') != -1 || timeLower.indexOf('pm') != -1) { - - time = timeLower; - var hour = date.getHours() % 12; - var suffix = date.getHours() > 11 ? 'pm' : 'am'; - if (!hour) { - hour = 12; - } - var minutes = date.getMinutes(); - - if (minutes < 10) { - minutes = '0' + minutes; - } - time = hour + ':' + minutes + suffix; - } else { - - var timeParts = time.split(':'); - - // Trim off seconds - if (timeParts.length > 2) { - timeParts.length -= 1; - time = timeParts.join(':'); - } - } - - return time; + }); } function isRelativeDay(date, offsetInDays) { @@ -209,7 +162,7 @@ yesterday.setDate(day); // automatically adjusts month/year appropriately - return date.getFullYear() == yesterday.getFullYear() && date.getMonth() == yesterday.getMonth() && date.getDate() == day; + return date.getFullYear() === yesterday.getFullYear() && date.getMonth() === yesterday.getMonth() && date.getDate() === day; } return { @@ -218,7 +171,6 @@ toLocaleDateString: toLocaleDateString, toLocaleString: toLocaleString, getDisplayTime: getDisplayTime, - isRelativeDay: isRelativeDay, - getLocaleDateStringParts: getLocaleDateStringParts + isRelativeDay: isRelativeDay }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js index ef728db82..6c8275f09 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js @@ -1,20 +1,5 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, dom, layoutManager, scrollHelper, globalize, require) { - - function showTvDialog(options) { - return new Promise(function (resolve, reject) { - - require(['actionsheet'], function (actionSheet) { - - actionSheet.show({ - - title: options.text, - items: options.buttons, - timeout: options.timeout - - }).then(resolve, reject); - }); - }); - } + 'use strict'; function showDialog(options, template) { @@ -23,10 +8,10 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're scrollY: false }; - if (layoutManager.tv) { + var enableTvLayout = layoutManager.tv; + + if (enableTvLayout) { dialogOptions.size = 'fullscreen'; - } else { - //dialogOptions.size = 'mini'; } var dlg = dialogHelper.createDialog(dialogOptions); @@ -35,17 +20,29 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're dlg.innerHTML = globalize.translateHtml(template, 'sharedcomponents'); - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + dlg.style['align-items'] = 'center'; + dlg.style['justify-content'] = 'center'; + var formDialogContent = dlg.querySelector('.formDialogContent'); + formDialogContent.style['flex-grow'] = 'initial'; + + if (enableTvLayout) { + formDialogContent.style['max-width'] = '50%'; + formDialogContent.style['max-height'] = '60%'; + scrollHelper.centerFocus.on(formDialogContent, false); } else { - dlg.querySelector('.dialogContentInner').classList.add('dialogContentInner-mini'); + formDialogContent.style.maxWidth = (Math.min((options.buttons.length * 150) + 200, dom.getWindowSize().innerWidth - 50)) + 'px'; + dlg.classList.add('dialog-fullscreen-lowres'); } //dlg.querySelector('.btnCancel').addEventListener('click', function (e) { // dialogHelper.close(dlg); //}); - dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; + if (options.title) { + dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; + } else { + dlg.querySelector('.formDialogHeaderTitle').classList.add('hide'); + } dlg.querySelector('.text').innerHTML = options.html || options.text || ''; @@ -54,9 +51,9 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're for (i = 0, length = options.buttons.length; i < length; i++) { var item = options.buttons[i]; - var autoFocus = i == 0 ? ' autofocus' : ''; + var autoFocus = i === 0 ? ' autofocus' : ''; - var buttonClass = 'btnOption raised block formDialogFooterItem'; + var buttonClass = 'btnOption raised formDialogFooterItem formDialogFooterItem-autosize'; if (item.type) { buttonClass += ' button-' + item.type; @@ -65,8 +62,6 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're html += ''; } - dlg.style.minWidth = (Math.min(options.buttons.length * 150, dom.getWindowSize().innerWidth - 50)) + 'px'; - dlg.querySelector('.formDialogFooter').innerHTML = html; var dialogResult; @@ -82,7 +77,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're return dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { + if (enableTvLayout) { scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } @@ -106,10 +101,6 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're options = text; } - if (layoutManager.tv) { - return showTvDialog(options); - } - return new Promise(function (resolve, reject) { require(['text!./dialog.template.html'], function (template) { showDialog(options, template).then(resolve, reject); diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html index 61d81d900..7fa18c17a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html @@ -1,16 +1,15 @@ -
-

- +
+

-
+
- -
-
+
+ +
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css index 45f09ec7b..b223babc5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css @@ -13,14 +13,14 @@ .dialog { margin: 0; - border-radius: 1px; + border-radius: 4px; -webkit-font-smoothing: antialiased; - box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); border: 0; padding: 0; will-change: transform; /* Strict does not work well with actionsheet */ contain: style; + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); } .dialog-fixedSize { @@ -37,16 +37,19 @@ left: 0; right: 0; margin: 0; + box-shadow: none; } @media all and (max-width: 1280px), all and (max-height: 720px) { - .dialog-fixedSize { + + .dialog-fixedSize, .dialog-fullscreen-lowres { position: fixed !important; top: 0 !important; bottom: 0 !important; left: 0 !important; right: 0 !important; margin: 0 !important; + box-shadow: none; } } @@ -92,5 +95,5 @@ } .dialogBackdropOpened { - opacity: .7; + opacity: .6; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js index e23b24ce7..b5e7ce2e4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js @@ -1,4 +1,5 @@ define(['historyManager', 'focusManager', 'browser', 'layoutManager', 'inputManager', 'dom', 'css!./dialoghelper.css', 'scrollStyles'], function (historyManager, focusManager, browser, layoutManager, inputManager, dom) { + 'use strict'; var globalOnOpenCallback; @@ -27,7 +28,7 @@ } } - function dialogHashHandler(dlg, hash, resolve) { + function DialogHashHandler(dlg, hash, resolve) { var self = this; self.originalUrl = window.location.href; @@ -36,7 +37,7 @@ function onHashChange(e) { - var isBack = self.originalUrl == window.location.href; + var isBack = self.originalUrl === window.location.href; if (isBack || !isOpened(dlg)) { window.removeEventListener('popstate', onHashChange); @@ -50,10 +51,11 @@ function onBackCommand(e) { - if (e.detail.command == 'back') { + if (e.detail.command === 'back') { self.closedByBack = true; - closeDialog(dlg); e.preventDefault(); + e.stopPropagation(); + closeDialog(dlg); } } @@ -74,7 +76,7 @@ if (!self.closedByBack && isHistoryEnabled(dlg)) { var state = history.state || {}; - if (state.dialogId == hash) { + if (state.dialogId === hash) { history.back(); } } @@ -83,7 +85,7 @@ activeElement.focus(); } - if (dlg.getAttribute('data-removeonclose') != 'false') { + if (dlg.getAttribute('data-removeonclose') !== 'false') { removeCenterFocus(dlg); var dialogContainer = dlg.dialogContainer; @@ -117,8 +119,12 @@ addBackdropOverlay(dlg); dlg.classList.add('opened'); + dlg.dispatchEvent(new CustomEvent('open', { + bubbles: false, + cancelable: false + })); - if (dlg.getAttribute('data-lockscroll') == 'true' && !document.body.classList.contains('noScroll')) { + if (dlg.getAttribute('data-lockscroll') === 'true' && !document.body.classList.contains('noScroll')) { document.body.classList.add('noScroll'); removeScrollLockOnClose = true; } @@ -126,7 +132,7 @@ animateDialogOpen(dlg); if (isHistoryEnabled(dlg)) { - historyManager.pushState({ dialogId: hash }, "Dialog", hash); + historyManager.pushState({ dialogId: hash }, "Dialog", '#' + hash); window.addEventListener('popstate', onHashChange); } else { @@ -149,7 +155,7 @@ }, 0); dom.addEventListener((dlg.dialogContainer || backdrop), 'click', function (e) { - if (e.target == dlg.dialogContainer) { + if (e.target === dlg.dialogContainer) { close(dlg); } }, { @@ -158,7 +164,7 @@ } function isHistoryEnabled(dlg) { - return dlg.getAttribute('data-history') == 'true'; + return dlg.getAttribute('data-history') === 'true'; } function open(dlg) { @@ -180,7 +186,7 @@ return new Promise(function (resolve, reject) { - new dialogHashHandler(dlg, 'dlg' + new Date().getTime(), resolve); + new DialogHashHandler(dlg, 'dlg' + new Date().getTime(), resolve); }); } @@ -207,7 +213,7 @@ { transform: 'scale(0)', offset: 0 }, { transform: 'none', offset: 1 }]; var timing = elem.animationConfig.entry.timing; - return elem.animate(keyframes, timing).onfinish = onFinish; + elem.animate(keyframes, timing).onfinish = onFinish; } function slideUp(elem, onFinish) { @@ -216,7 +222,7 @@ { transform: 'translate3d(0,30%,0)', opacity: 0, offset: 0 }, { transform: 'none', opacity: 1, offset: 1 }]; var timing = elem.animationConfig.entry.timing; - return elem.animate(keyframes, timing).onfinish = onFinish; + elem.animate(keyframes, timing).onfinish = onFinish; } function fadeIn(elem, onFinish) { @@ -225,7 +231,7 @@ { opacity: '0', offset: 0 }, { opacity: '1', offset: 1 }]; var timing = elem.animationConfig.entry.timing; - return elem.animate(keyframes, timing).onfinish = onFinish; + elem.animate(keyframes, timing).onfinish = onFinish; } function scaleDown(elem) { @@ -277,18 +283,18 @@ })); } }; - if (!dlg.animationConfig || !dlg.animate) { + if (!dlg.animationConfig) { onAnimationFinish(); return; } var animation; - if (dlg.animationConfig.exit.name == 'fadeout') { + if (dlg.animationConfig.exit.name === 'fadeout') { animation = fadeOut(dlg); - } else if (dlg.animationConfig.exit.name == 'scaledown') { + } else if (dlg.animationConfig.exit.name === 'scaledown') { animation = scaleDown(dlg); - } else if (dlg.animationConfig.exit.name == 'slidedown') { + } else if (dlg.animationConfig.exit.name === 'slidedown') { animation = slideDown(dlg); } else { onAnimationFinish(); @@ -303,20 +309,20 @@ var onAnimationFinish = function () { focusManager.pushScope(dlg); - if (dlg.getAttribute('data-autofocus') == 'true') { + if (dlg.getAttribute('data-autofocus') === 'true') { focusManager.autoFocus(dlg); } }; - if (!dlg.animationConfig || !dlg.animate) { + if (!dlg.animationConfig) { onAnimationFinish(); return; } - if (dlg.animationConfig.entry.name == 'fadein') { + if (dlg.animationConfig.entry.name === 'fadein') { fadeIn(dlg, onAnimationFinish); - } else if (dlg.animationConfig.entry.name == 'scaleup') { + } else if (dlg.animationConfig.entry.name === 'scaleup') { scaleUp(dlg, onAnimationFinish); - } else if (dlg.animationConfig.entry.name == 'slideup') { + } else if (dlg.animationConfig.entry.name === 'slideup') { slideUp(dlg, onAnimationFinish); } } @@ -327,7 +333,7 @@ return options.lockScroll; } - if (options.size == 'fullscreen') { + if (options.size === 'fullscreen') { return true; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/dom.js b/dashboard-ui/bower_components/emby-webcomponents/dom.js index 1dc3ade5e..d662735c2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dom.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dom.js @@ -1,8 +1,9 @@ define([], function () { + 'use strict'; function parentWithAttribute(elem, name, value) { - while ((value ? elem.getAttribute(name) != value : !elem.getAttribute(name))) { + while ((value ? elem.getAttribute(name) !== value : !elem.getAttribute(name))) { elem = elem.parentNode; if (!elem || !elem.getAttribute) { @@ -20,7 +21,7 @@ define([], function () { tagNames = [tagNames]; } - while (tagNames.indexOf(elem.tagName || '') == -1) { + while (tagNames.indexOf(elem.tagName || '') === -1) { elem = elem.parentNode; if (!elem) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css index e655b4d5c..bc0fe4cf4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css @@ -4,7 +4,6 @@ align-items: center; box-sizing: border-box; margin: 0 .29em; - background: transparent; text-align: center; font-size: inherit; font-family: inherit; @@ -27,52 +26,57 @@ position: relative; overflow: hidden; font-weight: 500; - text-transform: uppercase; /* Disable webkit tap highlighting */ -webkit-tap-highlight-color: rgba(0,0,0,0); } - .emby-button.raised, .emby-button.fab { - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + .emby-button::-moz-focus-inner { + border: 0; } - .emby-button > i { - /* For non-fab buttons that have icons */ - font-size: 1.5em; - width: auto; +.button-flat { + background: transparent; + box-shadow: none; + text-transform: uppercase; +} + +.emby-button > i { + /* For non-fab buttons that have icons */ + font-size: 1.36em; + width: auto; + height: auto; +} + +.fab { + display: inline-flex; + border-radius: 50%; + background-color: #444; + padding: .6em; + box-sizing: border-box; + align-items: center; + justify-content: center; + text-align: center; + color: #fff; + margin: 0; +} + + .fab > i { height: auto; + width: auto; + vertical-align: middle; + font-size: 2.85em; } - .emby-button.fab { - display: inline-flex; - border-radius: 50%; - background-color: #444; - padding: .6em; - box-sizing: border-box; - align-items: center; - justify-content: center; - text-align: center; - color: #fff; - margin: 0; - } - - .emby-button.fab > i { - height: auto; - width: auto; - vertical-align: middle; - font-size: 2.85em; - } - .emby-button-noflex { display: inline-block; white-space: nowrap; } -.emby-button.fab.mini { +.fab.mini { padding: 8px; } - .emby-button.fab.mini > i { + .fab.mini > i { height: auto; width: auto; font-size: 1.72em; @@ -86,7 +90,7 @@ width: 100%; } -.emby-button.raised:focus { +.raised:focus { box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); } @@ -95,22 +99,10 @@ margin-left: .5em; } -.emby-button span + i { +.emby-button > span + i { margin-left: .5em; } -.emby-button.iconRight > i { - margin-left: auto; - margin-right: .25em; -} - -.emby-button-noflex.iconRight > i { - position: absolute; - right: 0; - top: 25%; - margin-right: .5em; -} - .paper-icon-button-light { position: relative; display: inline-flex; @@ -149,6 +141,10 @@ justify-content: center; } + .paper-icon-button-light::-moz-focus-inner { + border: 0; + } + .paper-icon-button-light[disabled] { opacity: .3; } @@ -156,7 +152,7 @@ .paper-icon-button-light > i { width: auto; height: auto; - font-size: 1.72em; + font-size: 1.6em; /* Make sure its on top of the ripple */ position: relative; z-index: 1; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js index ffb93c46e..0064d772b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.js @@ -1,4 +1,5 @@ define(['browser', 'dom', 'css!./emby-button', 'registerElement'], function (browser, dom) { + 'use strict'; var EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); @@ -30,9 +31,8 @@ }, false); } - function animateButton(e) { + function animateButton(e, btn) { - var btn = this; requestAnimationFrame(function () { animateButtonInternal(e, btn); }); @@ -40,18 +40,23 @@ function onKeyDown(e) { - if (e.keyCode == 13) { - animateButton.call(this, e); + if (e.keyCode === 13) { + animateButton(e, this); } } function onMouseDown(e) { - if (e.button == 0) { - animateButton.call(this, e); + if (e.button === 0) { + animateButton(e, this); } } + function onClick(e) { + + animateButton(e, this); + } + function enableAnimation() { if (browser.tv) { // too slow @@ -77,7 +82,7 @@ passive: true }); if (browser.safari) { - dom.addEventListener(this, 'click', animateButton, { + dom.addEventListener(this, 'click', onClick, { passive: true }); } else { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/paper-icon-button-light.js b/dashboard-ui/bower_components/emby-webcomponents/emby-button/paper-icon-button-light.js index b414c68a2..ba5f5a1c2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/paper-icon-button-light.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/paper-icon-button-light.js @@ -1,4 +1,5 @@ define(['browser', 'dom', 'css!./emby-button', 'registerElement'], function (browser, dom) { + 'use strict'; var EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); @@ -33,9 +34,8 @@ }, false); } - function animateButton(e) { + function animateButton(e, btn) { - var btn = this; requestAnimationFrame(function () { animateButtonInternal(e, btn); }); @@ -43,11 +43,16 @@ function onKeyDown(e) { - if (e.keyCode == 13) { - animateButton.call(this, e); + if (e.keyCode === 13) { + animateButton(e, this); } } + function onClick(e) { + + animateButton(e, this); + } + EmbyButtonPrototype.createdCallback = function () { if (this.classList.contains('paper-icon-button-light')) { @@ -60,7 +65,7 @@ dom.addEventListener(this, 'keydown', onKeyDown, { passive: true }); - dom.addEventListener(this, 'click', animateButton, { + dom.addEventListener(this, 'click', onClick, { passive: true }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css index 5ec9a2be1..b70c7c796 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css @@ -2,7 +2,7 @@ position: relative; z-index: 1; vertical-align: middle; - display: inline-flex; + display: inline-block; box-sizing: border-box; width: 100%; margin: 0; @@ -18,7 +18,18 @@ .checkboxContainer { margin-bottom: 1.8em; - display: flex; + display: block; +} + +@supports (display: flex) { + + .mdl-checkbox { + display: inline-flex; + } + + .checkboxContainer { + display: flex; + } } .checkboxContainer-withDescription { @@ -113,15 +124,17 @@ cursor: auto; } -.checkboxList .mdl-checkbox { +.checkboxList > .mdl-checkbox { display: flex; margin: .5em 0; } .checkboxList-paperList { padding: 1em !important; + margin: .75em 0 !important; } .checkboxListLabel { opacity: .7; -} \ No newline at end of file + margin-bottom: 0; +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.js b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.js index d13133582..93eb7e78e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.js @@ -1,11 +1,12 @@ define(['css!./emby-checkbox', 'registerElement'], function () { + 'use strict'; var EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { // Don't submit form on enter - if (e.keyCode == 13) { + if (e.keyCode === 13) { e.preventDefault(); this.checked = !this.checked; @@ -20,7 +21,7 @@ EmbyCheckboxPrototype.attachedCallback = function () { - if (this.getAttribute('data-embycheckbox') == 'true') { + if (this.getAttribute('data-embycheckbox') === 'true') { return; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.css b/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.css index 0cfebfb39..bad922343 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.css @@ -23,11 +23,16 @@ text-transform: none; border-bottom: 1px solid #333; padding-left: .1em; + background: transparent; + box-shadow: none; } .emby-collapse-expandIcon { transform-origin: 50% 50%; transition: transform 180ms ease-out; + position: absolute; + right: .5em; + font-size: 1.5em; } .emby-collapse-expandIconExpanded { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.js b/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.js index 0e06a9b87..44e2de1f9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-collapse/emby-collapse.js @@ -1,4 +1,5 @@ define(['browser', 'css!./emby-collapse', 'registerElement'], function (browser) { + 'use strict'; var EmbyButtonPrototype = Object.create(HTMLDivElement.prototype); @@ -9,7 +10,9 @@ elem.style.height = 'auto'; var height = elem.offsetHeight + 'px'; elem.style.height = '0'; - elem.offsetHeight; + + // trigger reflow + var newHeight = elem.offsetHeight; elem.style.height = height; setTimeout(function () { @@ -29,7 +32,8 @@ function slideUpToHide(button, elem) { elem.style.height = elem.offsetHeight + 'px'; - elem.offsetHeight; + // trigger reflow + var newHeight = elem.offsetHeight; elem.classList.remove('expanded'); elem.style.height = '0'; @@ -49,14 +53,15 @@ function onButtonClick(e) { - var collapseContent = this.parentNode.querySelector('.collapseContent'); + var button = this; + var collapseContent = button.parentNode.querySelector('.collapseContent'); if (collapseContent.expanded) { collapseContent.expanded = false; - slideUpToHide(this, collapseContent); + slideUpToHide(button, collapseContent); } else { collapseContent.expanded = true; - slideDownToShow(this, collapseContent); + slideDownToShow(button, collapseContent); } } @@ -75,10 +80,7 @@ var title = this.getAttribute('title'); - var html = ''; + var html = ''; this.insertAdjacentHTML('afterbegin', html); @@ -86,7 +88,7 @@ button.addEventListener('click', onButtonClick); - if (this.getAttribute('data-expanded') == 'true') { + if (this.getAttribute('data-expanded') === 'true') { onButtonClick.call(button); } }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.css b/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.css index b2c653806..a688ab23e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.css @@ -3,7 +3,7 @@ margin: 0; margin-bottom: 0 !important; background: none; - border: 1px solid rgb(221, 221, 221); + border: 1px solid #383838; border-width: 0 0 1px 0; /* Prefixed box-sizing rules necessary for older browsers */ -webkit-box-sizing: border-box; @@ -21,6 +21,8 @@ width: 100%; background-color: transparent; border-radius: 0; + /* Ensure it is over the label so that it can be clicked */ + position: relative; } .inputContainer { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.js b/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.js index 3990769a3..4b8318731 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-input/emby-input.js @@ -1,4 +1,5 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement'], function (layoutManager, browser, dom) { + 'use strict'; var EmbyInputPrototype = Object.create(HTMLInputElement.prototype); @@ -19,7 +20,7 @@ bubbles: false, cancelable: false })); - } + }; Object.defineProperty(HTMLInputElement.prototype, 'value', descriptor); supportsFloatingLabel = true; @@ -86,7 +87,7 @@ label.classList.remove('inputLabel-float'); } else { - var instanceSupportsFloat = supportsFloatingLabel && this.type != 'date' && this.type != 'time'; + var instanceSupportsFloat = supportsFloatingLabel && this.type !== 'date' && this.type !== 'time'; if (instanceSupportsFloat) { label.classList.add('inputLabel-float'); diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 1f2c80f0d..27ab9d3de 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -183,6 +183,57 @@ }); } + function onTimerCreated(e, apiClient, data) { + + var itemsContainer = this; + + var programId = data.ProgramId; + // This could be null, not supported by all tv providers + var newTimerId = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onTimerCreated(programId, newTimerId, itemsContainer); + }); + } + + function onSeriesTimerCreated(e, apiClient, data) { + var itemsContainer = this; + } + + function onTimerCancelled(e, apiClient, data) { + var itemsContainer = this; + var id = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onTimerCancelled(id, itemsContainer); + }); + } + + function onSeriesTimerCancelled(e, apiClient, data) { + var itemsContainer = this; + var id = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onSeriesTimerCancelled(id, itemsContainer); + }); + } + + function addNotificationEvent(instance, name, handler) { + + var localHandler = handler.bind(instance); + events.on(serverNotifications, name, localHandler); + instance[name] = localHandler; + } + + function removeNotificationEvent(instance, name) { + + var handler = instance[name]; + if (handler) { + events.off(serverNotifications, 'UserDataChanged', handler); + instance[name] = null; + } + } + ItemsContainerProtoType.attachedCallback = function () { this.addEventListener('click', onClick); @@ -190,7 +241,9 @@ if (browser.touch) { this.addEventListener('contextmenu', disableEvent); } else { - this.addEventListener('contextmenu', onContextMenu); + if (this.getAttribute('data-contextmenu') !== 'false') { + this.addEventListener('contextmenu', onContextMenu); + } } if (layoutManager.desktop) { @@ -203,9 +256,11 @@ itemShortcuts.on(this, getShortcutOptions()); - var userDataHandler = onUserDataChanged.bind(this); - events.on(serverNotifications, 'UserDataChanged', userDataHandler); - this.userDataHandler = userDataHandler; + addNotificationEvent(this, 'UserDataChanged', onUserDataChanged); + addNotificationEvent(this, 'TimerCreated', onTimerCreated); + addNotificationEvent(this, 'SeriesTimerCreated', onSeriesTimerCreated); + addNotificationEvent(this, 'TimerCancelled', onTimerCancelled); + addNotificationEvent(this, 'SeriesTimerCancelled', onSeriesTimerCancelled); }; ItemsContainerProtoType.detachedCallback = function () { @@ -218,11 +273,11 @@ this.removeEventListener('contextmenu', disableEvent); itemShortcuts.off(this, getShortcutOptions()); - var userDataHandler = this.userDataHandler; - if (userDataHandler) { - events.off(serverNotifications, 'UserDataChanged', userDataHandler); - this.userDataHandler = null; - } + removeNotificationEvent(this, 'UserDataChanged'); + removeNotificationEvent(this, 'TimerCreated'); + removeNotificationEvent(this, 'SeriesTimerCreated'); + removeNotificationEvent(this, 'TimerCancelled'); + removeNotificationEvent(this, 'SeriesTimerCancelled'); }; document.registerElement('emby-itemscontainer', { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.css b/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.css index 6285b089b..c10d89acb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.css @@ -21,8 +21,9 @@ .mdl-radio__button { line-height: 24px; position: absolute; - width: 0; - height: 0; + /* 1px is for focusing purposes, so the focusManager doesn't skip over it */ + width: 1px; + height: 1px; margin: 0; padding: 0; opacity: 0; @@ -43,13 +44,13 @@ height: 16px; margin: 0; cursor: pointer; - border: 2px solid rgba(0,0,0, 0.54); + border: 2px solid currentcolor; border-radius: 50%; z-index: 2; } .mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle { - border: 2px solid rgb(63,81,181); + border: 2px solid rgb(82, 181, 75); } .mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle { @@ -75,7 +76,7 @@ -webkit-transform: scale3d(0, 0, 0); transform: scale3d(0, 0, 0); border-radius: 50%; - background: rgb(63,81,181); + background: rgb(82, 181, 75); } .mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { @@ -89,7 +90,11 @@ } .mdl-radio__button:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - box-shadow: 0 0 0px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0px 10px rgba(255, 255, 255, 0.76); +} + +.mdl-radio__button:checked:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { + box-shadow: 0 0 0px 10px rgba(82, 181, 75, 0.26); } .mdl-radio__label { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.js b/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.js index f680abf6f..6e3b6b9bf 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-radio/emby-radio.js @@ -1,11 +1,12 @@ define(['css!./emby-radio', 'registerElement'], function () { + 'use strict'; var EmbyRadioPrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { // Don't submit form on enter - if (e.keyCode == 13) { + if (e.keyCode === 13) { e.preventDefault(); this.checked = true; @@ -16,7 +17,7 @@ EmbyRadioPrototype.attachedCallback = function () { - if (this.getAttribute('data-radio') == 'true') { + if (this.getAttribute('data-radio') === 'true') { return; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.css b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.css index 266fc90bb..613d2b831 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.css @@ -3,7 +3,7 @@ margin: 0; margin-bottom: 0 !important; background: none; - border: 1px solid rgb(221, 221, 221); + border: 1px solid #383838; border-width: 0 0 1px 0; /* Prefixed box-sizing rules necessary for older browsers */ -webkit-box-sizing: border-box; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js index e8693ebe6..9e7563290 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js @@ -1,4 +1,5 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registerElement'], function (layoutManager, browser, actionsheet) { + 'use strict'; var EmbySelectPrototype = Object.create(HTMLSelectElement.prototype); @@ -54,7 +55,7 @@ function getLabel(select) { var elem = select.previousSibling; - while (elem && elem.tagName != 'LABEL') { + while (elem && elem.tagName !== 'LABEL') { elem = elem.previousSibling; } return elem; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js index b407a78bb..1c222c1c9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-slider/emby-slider.js @@ -1,4 +1,5 @@ define(['browser', 'css!./emby-slider', 'registerElement', 'emby-input'], function (browser) { + 'use strict'; var EmbySliderPrototype = Object.create(HTMLInputElement.prototype); @@ -28,9 +29,8 @@ }); } - function updateBubble(range, bubble) { + function updateBubble(range, value, bubble) { - var value = range.value; bubble.style.left = (value - 1) + '%'; if (range.getBubbleText) { @@ -41,7 +41,7 @@ EmbySliderPrototype.attachedCallback = function () { - if (this.getAttribute('data-embycheckbox') == 'true') { + if (this.getAttribute('data-embycheckbox') === 'true') { return; } @@ -71,16 +71,26 @@ this.addEventListener('input', function (e) { this.dragging = true; - updateBubble(this, sliderBubble); + }); + this.addEventListener('change', function () { + this.dragging = false; + updateValues(this, backgroundLower, backgroundUpper); + }); + + this.addEventListener('mousemove', function (e) { + + var rect = this.getBoundingClientRect(); + var clientX = e.clientX; + var bubbleValue = (clientX - rect.left) / rect.width; + bubbleValue *= 100; + updateBubble(this, Math.round(bubbleValue), sliderBubble); if (hasHideClass) { sliderBubble.classList.remove('hide'); hasHideClass = false; } }); - this.addEventListener('change', function () { - this.dragging = false; - updateValues(this, backgroundLower, backgroundUpper); + this.addEventListener('mouseleave', function () { sliderBubble.classList.add('hide'); hasHideClass = true; }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.css b/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.css index 731cb4ab4..db3e6ff57 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.css @@ -1,5 +1,6 @@ .emby-tab-button { background: transparent; + box-shadow: none; border: 2px solid transparent; border-width: 0 0 2px 0; cursor: pointer; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.js b/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.js index 1de8deeda..6b6031b60 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-tabs/emby-tabs.js @@ -1,4 +1,5 @@ define(['dom', 'scroller', 'browser', 'registerElement', 'css!./emby-tabs', 'scrollStyles'], function (dom, scroller, browser) { + 'use strict'; var EmbyTabs = Object.create(HTMLDivElement.prototype); var buttonClass = 'emby-tab-button'; @@ -78,7 +79,7 @@ var onAnimationFinish = function () { - //if (tabs.getAttribute('data-selectionbar') != 'false') { + //if (tabs.getAttribute('data-selectionbar') !== 'false') { // showButtonSelectionBar(newButton); //} newButton.classList.add(activeButtonClass); @@ -103,7 +104,7 @@ var current = tabs.querySelector('.' + activeButtonClass); var tabButton = dom.parentWithClass(e.target, buttonClass); - if (tabButton && tabButton != current) { + if (tabButton && tabButton !== current) { if (current) { current.classList.remove(activeButtonClass); @@ -186,7 +187,7 @@ return; } - if (tabs.getAttribute('data-selectionbar') == 'false') { + if (tabs.getAttribute('data-selectionbar') === 'false') { return; } @@ -253,7 +254,7 @@ var tabButtons = tabs.querySelectorAll('.' + buttonClass); - if (current == selected || triggerEvent === false) { + if (current === selected || triggerEvent === false) { tabs.dispatchEvent(new CustomEvent("beforetabchange", { detail: { @@ -269,7 +270,7 @@ var currentTabButton = tabButtons[current]; moveSelectionBar(tabs, tabButtons[selected], currentTabButton, false); - if (current != selected && currentTabButton) { + if (current !== selected && currentTabButton) { currentTabButton.classList.remove(activeButtonClass); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.css b/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.css index e6785a870..81733d133 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.css @@ -3,7 +3,7 @@ margin: 0; margin-bottom: 0 !important; background: none; - border: 1px solid rgb(221, 221, 221); + border: 1px solid #383838; border-width: 0 0 1px 0; /* Prefixed box-sizing rules necessary for older browsers */ -webkit-box-sizing: border-box; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.js b/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.js index 5448152ef..2b93e1b88 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-textarea/emby-textarea.js @@ -1,4 +1,5 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement'], function (layoutManager, browser) { + 'use strict'; function autoGrow(textarea, maxLines) { var self = this; @@ -84,7 +85,7 @@ bubbles: false, cancelable: false })); - } + }; Object.defineProperty(HTMLTextAreaElement.prototype, 'value', descriptor); supportsFloatingLabel = true; @@ -113,7 +114,7 @@ label.innerHTML = this.getAttribute('label') || ''; label.classList.add('textareaLabel'); - if (!supportsFloatingLabel || this.type == 'date') { + if (!supportsFloatingLabel || this.type === 'date') { label.classList.add('nofloat'); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css new file mode 100644 index 000000000..f13b39c29 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css @@ -0,0 +1,137 @@ +.mdl-switch { + position: relative; + z-index: 1; + vertical-align: middle; + display: inline-flex; + align-items: center; + box-sizing: border-box; + width: 100%; + margin: 0; + padding: 0; + overflow: visible; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + flex-direction: row-reverse; + justify-content: flex-end; +} + +.toggleContainer { + margin-bottom: 1.8em; +} + +.mdl-switch__input { + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + -ms-appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + border: none; +} + +.mdl-switch__trackContainer { + position: relative; + width: 2.9em; +} + +.mdl-switch__track { + background: rgba(255,255,255, 0.26); + height: 1em; + border-radius: 1em; + cursor: pointer; +} + +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { + background: rgba(82,181,75, 0.5); +} + +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { + background: rgba(204,51,51, 0.5); +} + +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { + background: rgba(0,0,0, 0.12); + cursor: auto; +} + +.mdl-switch__thumb { + background: #999; + position: absolute; + left: 0; + top: -.25em; + height: 1.44em; + width: 1.44em; + border-radius: 50%; + cursor: pointer; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: left; + display: flex; + align-items: center; + justify-content: center; +} + +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { + background: rgb(82,181,75); + left: 1.466em; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); +} + +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { + background: rgb(204,51,51); + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); +} + +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { + background: rgb(189,189,189); + cursor: auto; +} + +.mdl-switch__focus-helper { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + display: inline-block; + box-sizing: border-box; + width: .6em; + height: .6em; + border-radius: 50%; + background-color: transparent; +} + +.mdl-switch__input:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(255,255,255, 0.26); + background-color: rgba(255,255,255, 0.26); +} + +.mdl-switch__input:checked:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(82,181,75, 0.26); + background-color: rgba(82,181,75, 0.26); +} + +.mdl-switch__input.red:checked:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(204,51,51, 0.26); + background-color: rgba(204,51,51, 0.26); +} + +.mdl-switch__label { + cursor: pointer; + margin: 0; + display: inline-flex; + align-items: center; + margin-left: .7em; +} + +.mdl-switch__input[disabled] .mdl-switch__label { + color: rgb(189,189,189); + cursor: auto; +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js new file mode 100644 index 000000000..d6d31957b --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js @@ -0,0 +1,50 @@ +define(['css!./emby-toggle', 'registerElement'], function () { + 'use strict'; + + var EmbyTogglePrototype = Object.create(HTMLInputElement.prototype); + + function onKeyDown(e) { + + // Don't submit form on enter + if (e.keyCode === 13) { + e.preventDefault(); + + this.checked = !this.checked; + + this.dispatchEvent(new CustomEvent('change', { + bubbles: true + })); + + return false; + } + } + + EmbyTogglePrototype.attachedCallback = function () { + + if (this.getAttribute('data-embytoggle') === 'true') { + return; + } + + this.setAttribute('data-embytoggle', 'true'); + + this.classList.add('mdl-switch__input'); + + var labelElement = this.parentNode; + labelElement.classList.add('mdl-switch'); + labelElement.classList.add('mdl-js-switch'); + + var labelTextElement = labelElement.querySelector('span'); + + labelElement.insertAdjacentHTML('beforeend', '
'); + + labelTextElement.classList.add('toggleButtonLabel'); + labelTextElement.classList.add('mdl-switch__label'); + + this.addEventListener('keydown', onKeyDown); + }; + + document.registerElement('emby-toggle', { + prototype: EmbyTogglePrototype, + extends: 'input' + }); +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/fetchhelper.js b/dashboard-ui/bower_components/emby-webcomponents/fetchhelper.js index b777f3a91..64bd5159a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/fetchhelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/fetchhelper.js @@ -1,10 +1,11 @@ define([], function () { + 'use strict'; function getFetchPromise(request) { var headers = request.headers || {}; - if (request.dataType == 'json') { + if (request.dataType === 'json') { headers.accept = 'application/json'; } @@ -107,9 +108,9 @@ if (response.status < 400) { - if (request.dataType == 'json' || request.headers.accept == 'application/json') { + if (request.dataType === 'json' || request.headers.accept === 'application/json') { return response.json(); - } else if (request.dataType == 'text' || (response.headers.get('Content-Type') || '').toLowerCase().indexOf('text/') == 0) { + } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().indexOf('text/') === 0) { return response.text(); } else { return response; diff --git a/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js b/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js index b2a22fa08..c7234809d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js @@ -1,4 +1,5 @@ define(['dom'], function (dom) { + 'use strict'; var scopes = []; function pushScope(elem) { @@ -48,7 +49,7 @@ define(['dom'], function (dom) { var focusableContainerTagNames = ['BODY', 'DIALOG']; var focusableQuery = focusableTagNames.map(function (t) { - if (t == 'INPUT') { + if (t === 'INPUT') { t += ':not([type="range"])'; } return t + ':not([tabindex="-1"]):not(:disabled)'; @@ -57,7 +58,7 @@ define(['dom'], function (dom) { function isFocusable(elem) { - if (focusableTagNames.indexOf(elem.tagName) != -1) { + if (focusableTagNames.indexOf(elem.tagName) !== -1) { return true; } @@ -99,13 +100,13 @@ define(['dom'], function (dom) { return false; } - if (elem.getAttribute('tabindex') == "-1") { + if (elem.getAttribute('tabindex') === "-1") { return false; } - if (elem.tagName == 'INPUT') { + if (elem.tagName === 'INPUT') { var type = elem.type; - if (type == 'range') { + if (type === 'range') { return false; } } @@ -139,7 +140,7 @@ define(['dom'], function (dom) { function isFocusContainer(elem, direction) { - if (focusableContainerTagNames.indexOf(elem.tagName) != -1) { + if (focusableContainerTagNames.indexOf(elem.tagName) !== -1) { return true; } if (elem.classList.contains('focuscontainer')) { @@ -151,7 +152,7 @@ define(['dom'], function (dom) { return true; } } - else if (direction == 3) { + else if (direction === 3) { if (elem.classList.contains('focuscontainer-down')) { return true; } @@ -230,11 +231,11 @@ define(['dom'], function (dom) { for (var i = 0, length = focusable.length; i < length; i++) { var curr = focusable[i]; - if (curr == activeElement) { + if (curr === activeElement) { continue; } // Don't refocus into the same container - if (curr == focusableContainer) { + if (curr === focusableContainer) { continue; } @@ -256,7 +257,7 @@ define(['dom'], function (dom) { if (elementRect.left >= rect.left) { continue; } - if (elementRect.right == rect.right) { + if (elementRect.right === rect.right) { continue; } break; @@ -265,7 +266,7 @@ define(['dom'], function (dom) { if (elementRect.right <= rect.right) { continue; } - if (elementRect.left == rect.left) { + if (elementRect.left === rect.left) { continue; } break; @@ -304,8 +305,8 @@ define(['dom'], function (dom) { // See if there's a focusable container, and if so, send the focus command to that var nearestElementFocusableParent = dom.parentWithClass(nearestElement, 'focusable'); - if (nearestElementFocusableParent && nearestElementFocusableParent != nearestElement && activeElement) { - if (dom.parentWithClass(activeElement, 'focusable') != nearestElementFocusableParent) { + if (nearestElementFocusableParent && nearestElementFocusableParent !== nearestElement && activeElement) { + if (dom.parentWithClass(activeElement, 'focusable') !== nearestElementFocusableParent) { nearestElement = nearestElementFocusableParent; } } @@ -404,12 +405,12 @@ define(['dom'], function (dom) { function sortNodesT(a, b) { var result = a.distT - b.distT; - if (result != 0) { + if (result !== 0) { return result; } result = a.index - b.index; - if (result != 0) { + if (result !== 0) { return result; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css index 49ac54891..28cceac86 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css +++ b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css @@ -15,6 +15,10 @@ background-color: #222326; } +.formDialogHeader-clear, .formDialogFooter-clear { + background-color: transparent; +} + .formDialogHeaderTitle { margin-left: .25em; /* In case of h1, h2, h3 */ @@ -27,7 +31,7 @@ } .dialogContentInner { - padding: .5em 1.5em 20em 1.5em; + padding: .5em 1em 20em 1em; } .dialogContentInner-mini { @@ -49,11 +53,16 @@ left: 0; right: 0; display: flex; - padding: 1.5em; + padding: 1.25em 1em; /* Without this emby-checkbox is able to appear on top */ z-index: 1; align-items: center; justify-content: center; + flex-wrap: wrap; +} + +.formDialogFooter-flex { + position: static; } .formDialogFooterItem { @@ -61,6 +70,14 @@ margin-right: .5em !important; flex-grow: 1; text-align: center; + flex-basis: 0; +} + +.formDialogFooterItem-autosize { + flex-basis: initial; + flex-grow: initial; + padding-left: 2em; + padding-right: 2em; } @media all and (min-width: 800px) { @@ -68,6 +85,11 @@ .formDialogFooterItem { max-width: 80%; } + + .dialogContentInner { + padding-left: 1.5em; + padding-right: 1.5em; + } } @media all and (min-width: 1280px) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/globalize.js b/dashboard-ui/bower_components/emby-webcomponents/globalize.js index d8790f582..74e5e4766 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/globalize.js +++ b/dashboard-ui/bower_components/emby-webcomponents/globalize.js @@ -1,4 +1,5 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionManager, userSettings, events) { + 'use strict'; var allTranslations = {}; var currentCulture; @@ -69,20 +70,20 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana // If it's de-DE, convert to just de var parts = culture.split('-'); - if (parts.length == 2) { - if (parts[0].toLowerCase() == parts[1].toLowerCase()) { + if (parts.length === 2) { + if (parts[0].toLowerCase() === parts[1].toLowerCase()) { culture = parts[0].toLowerCase(); } } var lower = culture.toLowerCase(); - if (lower == 'ca-es') { + if (lower === 'ca-es') { return 'ca'; } // normalize Swedish - if (lower == 'sv-se') { + if (lower === 'sv-se') { return 'sv'; } @@ -130,12 +131,12 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana lang = normalizeLocaleName(lang); var filtered = translations.filter(function (t) { - return normalizeLocaleName(t.lang) == lang; + return normalizeLocaleName(t.lang) === lang; }); if (!filtered.length) { filtered = translations.filter(function (t) { - return normalizeLocaleName(t.lang) == 'en-us'; + return normalizeLocaleName(t.lang) === 'en-us'; }); } @@ -148,7 +149,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana var url = filtered[0].path; - url += url.indexOf('?') == -1 ? '?' : '&'; + url += url.indexOf('?') === -1 ? '?' : '&'; url += 'v=' + cacheParam; var xhr = new XMLHttpRequest(); @@ -217,14 +218,14 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana var startIndex = html.indexOf('${'); - if (startIndex == -1) { + if (startIndex === -1) { return html; } startIndex += 2; var endIndex = html.indexOf('}', startIndex); - if (endIndex == -1) { + if (endIndex === -1) { return html; } @@ -250,7 +251,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana events.on(connectionManager, 'localusersignedin', updateCurrentCulture); events.on(userSettings, 'change', function (e, name) { - if (name == 'language') { + if (name === 'language') { updateCurrentCulture(); } }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.js new file mode 100644 index 000000000..6cdf23599 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.js @@ -0,0 +1,106 @@ +define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) { + 'use strict'; + + function save(context, options) { + + var categories = []; + + var chkCategorys = context.querySelectorAll('.chkCategory'); + for (var i = 0, length = chkCategorys.length; i < length; i++) { + + var type = chkCategorys[i].getAttribute('data-type'); + + if (chkCategorys[i].checked) { + categories.push(type); + } + } + + if (categories.length >= 4) { + categories.push('series'); + } + + // differentiate between none and all + categories.push('all'); + options.categories = categories; + } + + function load(context, options) { + + var selectedCategories = options.categories || []; + + var chkCategorys = context.querySelectorAll('.chkCategory'); + for (var i = 0, length = chkCategorys.length; i < length; i++) { + + var type = chkCategorys[i].getAttribute('data-type'); + + chkCategorys[i].checked = !selectedCategories.length || selectedCategories.indexOf(type) !== -1; + } + } + + function showEditor(options) { + + return new Promise(function (resolve, reject) { + + var settingsChanged = false; + + require(['text!./guide-categories.template.html'], function (template) { + + var dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + var dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + + var html = ''; + + html += globalize.translateDocument(template, 'sharedcomponents'); + + dlg.innerHTML = html; + + dlg.addEventListener('change', function () { + + settingsChanged = true; + }); + + dlg.addEventListener('close', function () { + + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); + } + + save(dlg, options); + + if (settingsChanged) { + resolve(options); + } else { + reject(); + } + }); + + dlg.querySelector('.btnCancel').addEventListener('click', function () { + dialogHelper.close(dlg); + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + load(dlg, options); + dialogHelper.open(dlg); + }); + }); + } + + return { + show: showEditor + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.template.html b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.template.html new file mode 100644 index 000000000..37788eabd --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-categories.template.html @@ -0,0 +1,29 @@ +
+ +

+ ${Categories} +

+
+
+
+ +
+ + + + +
+
+
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.js index dedb11041..b2e9780d2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.js @@ -1,27 +1,66 @@ -define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) { +define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'emby-radio', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) { + 'use strict'; function save(context) { + var i, length; + var chkIndicators = context.querySelectorAll('.chkIndicator'); - for (var i = 0, length = chkIndicators.length; i < length; i++) { + for (i = 0, length = chkIndicators.length; i < length; i++) { var type = chkIndicators[i].getAttribute('data-type'); userSettings.set('guide-indicator-' + type, chkIndicators[i].checked); + } + userSettings.set('guide-colorcodedbackgrounds', context.querySelector('.chkColorCodedBackgrounds').checked); + userSettings.set('livetv-favoritechannelsattop', context.querySelector('.chkFavoriteChannelsAtTop').checked); + + var sortBys = context.querySelectorAll('.chkSortOrder'); + for (i = 0, length = sortBys.length; i < length; i++) { + if (sortBys[i].checked) { + userSettings.set('livetv-channelorder', sortBys[i].value); + break; + } } } function load(context) { + var i, length; + var chkIndicators = context.querySelectorAll('.chkIndicator'); - for (var i = 0, length = chkIndicators.length; i < length; i++) { + for (i = 0, length = chkIndicators.length; i < length; i++) { var type = chkIndicators[i].getAttribute('data-type'); - if (chkIndicators[i].getAttribute('data-default') == 'true') { - chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) != 'false'; + if (chkIndicators[i].getAttribute('data-default') === 'true') { + chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) !== 'false'; } else { - chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) == 'true'; + chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) === 'true'; + } + } + + context.querySelector('.chkColorCodedBackgrounds').checked = userSettings.get('guide-colorcodedbackgrounds') === 'true'; + context.querySelector('.chkFavoriteChannelsAtTop').checked = userSettings.get('livetv-favoritechannelsattop') !== 'false'; + + var sortByValue = userSettings.get('livetv-channelorder') || 'DatePlayed'; + + var sortBys = context.querySelectorAll('.chkSortOrder'); + for (i = 0, length = sortBys.length; i < length; i++) { + sortBys[i].checked = sortBys[i].value === sortByValue; + } + } + + function onSortByChange() { + var newValue = this.value; + if (this.checked) { + var changed = options.query.SortBy !== newValue; + + options.query.SortBy = newValue.replace('_', ','); + options.query.StartIndex = 0; + + if (options.callback && changed) { + options.callback(); } } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.template.html b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.template.html index 4b8c663ea..2fd24e785 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide-settings.template.html @@ -7,6 +7,14 @@
+

${SortChannelsBy}

+ + +
+

${ShowIndicatorsFor}

+
+
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css index f45caf122..d5f388ee0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css @@ -8,6 +8,8 @@ white-space: nowrap; width: 100%; flex-shrink: 0; + display: flex; + padding-left: 3.4em; } .tvProgramSectionHeader { @@ -21,34 +23,10 @@ position: relative; } -.tvProgramTimeSlotInner { - padding: .5em; -} - -.tvProgramInfo { - vertical-align: middle; - padding: .5em .5em; - border-bottom: .65vh solid #121212; -} - -.tvProgramCurrentTimeSlot { - background-color: green; -} - -.tvProgramName { - color: #fff; - margin-bottom: .5em; -} - -.tvProgramTime { - color: #fff; -} - .guideProgramIndicator { text-transform: uppercase; border-radius: 2px; margin-right: .5em; - color: #fff; font-size: 74%; padding: .2em .25em; display: inline-flex; @@ -58,48 +36,8 @@ color: #fff; } -.newTvProgram { - background: #64A239; -} - -.liveTvProgram { - background: #EC407A; -} - -.premiereTvProgram { - background: #EF6C00; -} - -.repeatTvProgram { - background: #009688; -} - -.programAccent { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 2px; -} - -.sportsAccent { - background-color: #0A7C33; -} - -.newsAccent { - background-color: #523378; -} - -.movieAccent { - background-color: #A43913; -} - -.childAccent { - background-color: #0B487D; -} - .channelTimeslotHeader { - float: left; + flex-shrink: 0; } .timeslotHeaders { @@ -109,15 +47,14 @@ .programContainer { white-space: nowrap; position: relative; -} - -.programGridContainer { - margin-left: 12.2vw; + display: flex; + align-items: flex-start; } .channelPrograms { white-space: nowrap; position: relative; + contain: strict; } .timeslotHeadersInner { @@ -200,7 +137,6 @@ background: rgba(40, 40, 40, .9); display: flex; align-items: center; - color: #fff !important; text-decoration: none; /* Needed in firefox */ text-align: left; @@ -281,7 +217,7 @@ .channelHeaderCell { border-bottom: .65vh solid #121212 !important; background-size: auto 70%; - background-position: 90% center; + background-position: 92% center; background-repeat: no-repeat; } @@ -301,6 +237,12 @@ .channelPrograms, .channelHeaderCell { height: 4em; + contain: strict; +} + +.channelPrograms { + display: flex; + flex-direction: column; } .channelPrograms-tv, .channelHeaderCell-tv { @@ -319,14 +261,6 @@ height: 3em; } -.pointerInput .channelHeaderCell:hover { - background-color: #444; -} - -.channelList { - float: left; -} - .programGrid { padding-bottom: 4px; } @@ -343,7 +277,6 @@ border-left: .65vh solid #121212 !important; background-color: rgba(32, 32, 32, .95); display: flex; - color: #fff !important; text-decoration: none; overflow: hidden; align-items: center; @@ -352,15 +285,32 @@ contain: strict; } -.timeslotCellInner { +.programAccent { position: absolute; bottom: 0; - overflow: hidden; - width: 100%; - top: 0; - display: block; - text-decoration: none; - color: #fff !important; + left: 0; + right: 0; + height: 2px; +} + +.sportsAccent { + background-color: #3949AB; +} + +.movieAccent { + background-color: #5E35B1; +} + +.childAccent { + background-color: #039BE5; +} + +.newsAccent { + background-color: #43A047; +} + +.specialsAccent { + background-color: #FB8C00; } .guideProgramName { @@ -371,11 +321,6 @@ align-items: center; } -.guideProgramTime { - padding: 0 .5em .35em; - color: #bbb; -} - .programIcon { margin-left: auto; margin-right: .25em; @@ -419,8 +364,41 @@ } } +.channelsContainer { + display: flex; + flex-shrink: 0; +} + +.btnCategories { + margin: 0 .3em 0 .5em !important; + padding: 0 !important; + flex-shrink: 0; + background: rgba(40, 40, 40, .9); + border-radius: 0 !important; + width: 2.6em; + font-weight: normal !important; + position: relative; +} + +.btnCategoriesText { + transform: rotate(90deg); + text-transform: uppercase; + transform-origin: left; + margin-left: 1.2em; + letter-spacing: .25em; + position: absolute; + top: 0; + margin-top: 1em; + white-space: nowrap; +} + +.channelList { + display: flex; + flex-direction: column; +} + .channelList, .programGrid { - height: auto !important; + contain: layout style; } .programCell, .channelHeaderCell, .btnSelectDate { @@ -435,6 +413,11 @@ color: #cc3333 !important; } +.seriesTimerIcon-inactive { + color: inherit !important; + opacity: .7; +} + .visibleGuideScroller::-webkit-scrollbar { width: 10px; height: 10px; @@ -460,3 +443,14 @@ display: flex; align-items: center; } + +@media all and (max-width: 800px), all and (max-height: 600px) { + + .tvGuideHeader { + padding-left: 0; + } + + .btnCategories { + display: none; + } +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index 90f07e80d..36cddd049 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -1,4 +1,5 @@ -define(['require', 'browser', 'globalize', 'connectionManager', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'dom', 'clearButtonStyle', 'css!./guide.css', 'material-icons', 'scrollStyles', 'emby-button', 'paper-icon-button-light'], function (require, browser, globalize, connectionManager, serverNotifications, loading, datetime, focusManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, registrationServices, dom) { +define(['require', 'browser', 'globalize', 'connectionManager', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'dom', 'clearButtonStyle', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-button', 'paper-icon-button-light'], function (require, browser, globalize, connectionManager, serverNotifications, loading, datetime, focusManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, registrationServices, dom) { + 'use strict'; function showViewSettings(instance) { @@ -9,12 +10,24 @@ }); } + function showCategoryOptions(instance) { + + require(['guide-categories-dialog'], function (guideCategoriesDialog) { + guideCategoriesDialog.show(instance.categoryOptions).then(function (categoryOptions) { + + instance.categoryOptions = categoryOptions; + instance.refresh(); + }); + }); + } + function Guide(options) { var self = this; var items = {}; self.options = options; + self.categoryOptions = { categories: [] }; // 30 mins var cellCurationMinutes = 30; @@ -26,14 +39,6 @@ var currentStartIndex = 0; var currentChannelLimit = 0; - var channelQuery = { - - StartIndex: 0, - EnableFavoriteSorting: true - }; - - var channelsPromise; - self.refresh = function () { currentDate = null; @@ -151,6 +156,12 @@ var apiClient = connectionManager.currentApiClient(); + var channelQuery = { + + StartIndex: 0, + EnableFavoriteSorting: userSettings.get('livetv-favoritechannelsattop') !== 'false' + }; + channelQuery.UserId = apiClient.getCurrentUserId(); getChannelLimit(context).then(function (channelLimit) { @@ -165,7 +176,44 @@ channelQuery.EnableUserData = false; channelQuery.EnableImageTypes = "Primary"; - channelsPromise = channelsPromise || apiClient.getLiveTvChannels(channelQuery); + var categories = self.categoryOptions.categories || []; + var displayMovieContent = !categories.length || categories.indexOf('movies') !== -1; + var displaySportsContent = !categories.length || categories.indexOf('sports') !== -1; + var displayNewsContent = !categories.length || categories.indexOf('news') !== -1; + var displayKidsContent = !categories.length || categories.indexOf('kids') !== -1; + var displaySeriesContent = !categories.length || categories.indexOf('series') !== -1; + + if (displayMovieContent && displaySportsContent && displayNewsContent && displayKidsContent) { + channelQuery.IsMovie = null; + channelQuery.IsSports = null; + channelQuery.IsKids = null; + channelQuery.IsNews = null; + channelQuery.IsSeries = null; + } else { + if (displayNewsContent) { + channelQuery.IsNews = true; + } + if (displaySportsContent) { + channelQuery.IsSports = true; + } + if (displayKidsContent) { + channelQuery.IsKids = true; + } + if (displayMovieContent) { + channelQuery.IsMovie = true; + } + if (displaySeriesContent) { + channelQuery.IsSeries = true; + } + } + + if (userSettings.get('livetv-channelorder') === 'Number') { + channelQuery.SortBy = "SortName"; + channelQuery.SortOrder = "Ascending"; + } else { + channelQuery.SortBy = "DatePlayed"; + channelQuery.SortOrder = "Descending"; + } var date = newStartDate; // Add one second to avoid getting programs that are just ending @@ -175,7 +223,7 @@ var nextDay = new Date(date.getTime() + msPerDay - 2000); console.log(nextDay); - channelsPromise.then(function (channelsResult) { + apiClient.getLiveTvChannels(channelQuery).then(function (channelsResult) { var btnPreviousPage = context.querySelector('.btnPreviousPage'); var btnNextPage = context.querySelector('.btnNextPage'); @@ -299,6 +347,37 @@ return null; } + function getTimerIndicator(item) { + + var status; + + if (item.Type === 'SeriesTimer') { + return ''; + } + else if (item.TimerId || item.SeriesTimerId) { + + status = item.Status || 'Cancelled'; + } + else if (item.Type === 'Timer') { + + status = item.Status; + } + else { + return ''; + } + + if (item.SeriesTimerId) { + + if (status !== 'Cancelled') { + return ''; + } + + return ''; + } + + return ''; + } + function getChannelProgramsHtml(context, date, channel, programs, options) { var html = ''; @@ -307,18 +386,28 @@ var endMs = startMs + msPerDay - 1; programs = programs.filter(function (curr) { - return curr.ChannelId == channel.Id; + return curr.ChannelId === channel.Id; }); - var cssClass = layoutManager.tv ? 'channelPrograms channelPrograms-tv' : 'channelPrograms'; + var outerCssClass = layoutManager.tv ? 'channelPrograms channelPrograms-tv' : 'channelPrograms'; - html += '
'; + html += '
'; + + var clickAction = layoutManager.tv ? 'link' : 'programdialog'; + + var categories = self.categoryOptions.categories || []; + var displayMovieContent = !categories.length || categories.indexOf('movies') !== -1; + var displaySportsContent = !categories.length || categories.indexOf('sports') !== -1; + var displayNewsContent = !categories.length || categories.indexOf('news') !== -1; + var displayKidsContent = !categories.length || categories.indexOf('kids') !== -1; + var displaySeriesContent = !categories.length || categories.indexOf('series') !== -1; + var enableColorCodedBackgrounds = userSettings.get('guide-colorcodedbackgrounds') === 'true'; for (var i = 0, length = programs.length; i < length; i++) { var program = programs[i]; - if (program.ChannelId != channel.Id) { + if (program.ChannelId !== channel.Id) { continue; } @@ -344,20 +433,45 @@ endPercent *= 100; var cssClass = "programCell clearButton itemAction"; - var addAccent = true; + var accentCssClass = null; + var displayInnerContent = true; if (program.IsKids) { cssClass += " childProgramInfo"; + displayInnerContent = displayKidsContent; + accentCssClass = 'childAccent'; } else if (program.IsSports) { cssClass += " sportsProgramInfo"; + displayInnerContent = displaySportsContent; + accentCssClass = 'sportsAccent'; } else if (program.IsNews) { cssClass += " newsProgramInfo"; + displayInnerContent = displayNewsContent; + accentCssClass = 'newsAccent'; } else if (program.IsMovie) { cssClass += " movieProgramInfo"; + displayInnerContent = displayMovieContent; + accentCssClass = 'movieAccent'; + } + else if (program.IsSeries) { + cssClass += " plainProgramInfo"; + displayInnerContent = displaySeriesContent; } else { cssClass += " plainProgramInfo"; - addAccent = false; + displayInnerContent = displayMovieContent && displayNewsContent && displaySportsContent && displayKidsContent && displaySeriesContent; + } + + if (!displayInnerContent) { + accentCssClass = null; + } + + if (enableColorCodedBackgrounds && accentCssClass) { + cssClass += ' ' + accentCssClass; + + accentCssClass = null; + } else { + accentCssClass = null; } var timerAttributes = ''; @@ -367,49 +481,38 @@ if (program.SeriesTimerId) { timerAttributes += ' data-seriestimerid="' + program.SeriesTimerId + '"'; } - html += ' +
+ +
+
+
+ +
+
diff --git a/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js b/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js index 6677cc4e4..b6cac87ff 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js @@ -1,4 +1,5 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 'focusManager', 'globalize', 'scrollHelper', 'imageLoader', 'require', 'cardStyle', 'formDialogStyle', 'emby-button', 'paper-icon-button-light'], function (dialogHelper, connectionManager, loading, dom, layoutManager, focusManager, globalize, scrollHelper, imageLoader, require) { + 'use strict'; var currentItem; var hasChanges = false; @@ -78,11 +79,11 @@ options.type = type; options.index = index; - if (type == 'Backdrop') { + if (type === 'Backdrop') { options.tag = item.BackdropImageTags[index]; - } else if (type == 'Screenshot') { + } else if (type === 'Screenshot') { options.tag = item.ScreenshotImageTags[index]; - } else if (type == 'Primary') { + } else if (type === 'Primary') { options.tag = item.PrimaryImageTag || item.ImageTags[type]; } else { options.tag = item.ImageTags[type]; @@ -101,7 +102,7 @@ cssClass += " backdropCard backdropCard-scalable"; - if (tagName == 'button') { + if (tagName === 'button') { cssClass += ' card-focusscale btnImageCard'; cardBoxCssClass += ' cardBox-focustransform cardBox-focustransform-transition'; @@ -142,27 +143,27 @@ if (enableFooterButtons) { html += '
'; - if (image.ImageType == "Backdrop" || image.ImageType == "Screenshot") { + if (image.ImageType === "Backdrop" || image.ImageType === "Screenshot") { if (index > 0) { - html += ''; + html += ''; } else { - html += ''; + html += ''; } if (index < numImages - 1) { - html += ''; + html += ''; } else { - html += ''; + html += ''; } } else { if (imageProviders.length) { - html += ''; + html += ''; } } - html += ''; + html += ''; html += '
'; } @@ -192,7 +193,13 @@ require(['confirm'], function (confirm) { - confirm(globalize.translate('sharedcomponents#ConfirmDeleteImage')).then(afterConfirm); + confirm({ + + text: globalize.translate('sharedcomponents#ConfirmDeleteImage'), + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(afterConfirm); }); } @@ -202,6 +209,11 @@ hasChanges = true; reload(context, null, focusContext); + }, function() { + + require(['alert'], function (alert) { + alert(globalize.translate('sharedcomponents#DefaultErrorMessage')); + }); }); } @@ -227,31 +239,12 @@ elem.innerHTML = html; imageLoader.lazyChildren(elem); - - addListeners(elem, 'btnSearchImages', 'click', function () { - showImageDownloader(page, this.getAttribute('data-imagetype')); - }); - - addListeners(elem, 'btnDeleteImage', 'click', function () { - var type = this.getAttribute('data-imagetype'); - var index = this.getAttribute('data-index'); - index = index == "null" ? null : parseInt(index); - - deleteImage(page, currentItem.Id, type, index, apiClient, true); - }); - - addListeners(elem, 'btnMoveImage', 'click', function () { - var type = this.getAttribute('data-imagetype'); - var index = this.getAttribute('data-index'); - var newIndex = this.getAttribute('data-newindex'); - moveImage(page, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer')); - }); } function renderStandardImages(page, apiClient, item, imageInfos, imageProviders) { var images = imageInfos.filter(function (i) { - return i.ImageType != "Screenshot" && i.ImageType != "Backdrop" && i.ImageType != "Chapter"; + return i.ImageType !== "Screenshot" && i.ImageType !== "Backdrop" && i.ImageType !== "Chapter"; }); renderImages(page, item, apiClient, images, imageProviders, page.querySelector('#images')); @@ -260,7 +253,7 @@ function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) { var images = imageInfos.filter(function (i) { - return i.ImageType == "Backdrop"; + return i.ImageType === "Backdrop"; }).sort(function (a, b) { return a.ImageIndex - b.ImageIndex; @@ -277,7 +270,7 @@ function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) { var images = imageInfos.filter(function (i) { - return i.ImageType == "Screenshot"; + return i.ImageType === "Screenshot"; }).sort(function (a, b) { return a.ImageIndex - b.ImageIndex; @@ -299,6 +292,10 @@ hasChanges = true; reload(page); }); + }, function () { + require(['alert'], function (alert) { + alert('This feature is coming soon to Emby Theater.'); + }); }); } @@ -322,7 +319,7 @@ id: 'delete' }); - if (type == 'Backdrop' || type == 'Screenshot') { + if (type === 'Backdrop' || type === 'Screenshot') { if (index > 0) { commands.push({ name: globalize.translate('sharedcomponents#MoveLeft'), @@ -374,9 +371,9 @@ }); } - function initEditor(page, options) { + function initEditor(context, options) { - addListeners(page, 'btnOpenUploadMenu', 'click', function () { + addListeners(context, 'btnOpenUploadMenu', 'click', function () { var imageType = this.getAttribute('data-imagetype'); require(['components/imageuploader/imageuploader'], function (imageUploader) { @@ -390,18 +387,42 @@ if (hasChanged) { hasChanges = true; - reload(page); + reload(context); } }); + }, function () { + require(['alert'], function (alert) { + alert('This feature is coming soon to Emby Theater.'); + }); }); }); - addListeners(page, 'btnBrowseAllImages', 'click', function () { - showImageDownloader(page, this.getAttribute('data-imagetype') || 'Primary'); + addListeners(context, 'btnSearchImages', 'click', function () { + showImageDownloader(context, this.getAttribute('data-imagetype')); }); - addListeners(page, 'btnImageCard', 'click', function () { - showActionSheet(page, this); + addListeners(context, 'btnBrowseAllImages', 'click', function () { + showImageDownloader(context, this.getAttribute('data-imagetype') || 'Primary'); + }); + + addListeners(context, 'btnImageCard', 'click', function () { + showActionSheet(context, this); + }); + + addListeners(context, 'btnDeleteImage', 'click', function () { + var type = this.getAttribute('data-imagetype'); + var index = this.getAttribute('data-index'); + index = index === "null" ? null : parseInt(index); + var apiClient = connectionManager.getApiClient(currentItem.ServerId); + deleteImage(context, currentItem.Id, type, index, apiClient, true); + }); + + addListeners(context, 'btnMoveImage', 'click', function () { + var type = this.getAttribute('data-imagetype'); + var index = this.getAttribute('data-index'); + var newIndex = this.getAttribute('data-newindex'); + var apiClient = connectionManager.getApiClient(currentItem.ServerId); + moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer')); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/images/basicimagefetcher.js b/dashboard-ui/bower_components/emby-webcomponents/images/basicimagefetcher.js index 4b3f17b24..d73cc6f5b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/images/basicimagefetcher.js +++ b/dashboard-ui/bower_components/emby-webcomponents/images/basicimagefetcher.js @@ -1,16 +1,25 @@ -define([], function () { +define(['dom'], function (dom) { + 'use strict'; function loadImage(elem, url) { if (elem.tagName !== "IMG") { elem.style.backgroundImage = "url('" + url + "')"; - return Promise.resolve(elem); + return Promise.resolve(); - } else { - elem.setAttribute("src", url); - return Promise.resolve(elem); } + return loadImageIntoImg(elem, url); + } + + function loadImageIntoImg(elem, url) { + return new Promise(function (resolve, reject) { + + dom.addEventListener(elem, 'load', resolve, { + once: true + }); + elem.setAttribute("src", url); + }); } return { diff --git a/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js b/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js index eb4af9bb3..8a7ba1889 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/images/imagehelper.js @@ -1,18 +1,19 @@ -define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser', 'dom'], function (visibleinviewport, imageFetcher, layoutManager, events, browser, dom) { +define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser', 'dom', 'appSettings', 'require'], function (visibleinviewport, imageFetcher, layoutManager, events, browser, dom, appSettings, require) { + 'use strict'; var thresholdX; var thresholdY; + var requestIdleCallback = window.requestIdleCallback || function (fn) { + fn(); + }; + + //var imagesWorker = new Worker(require.toUrl('.').split('?')[0] + '/imagesworker.js'); + var supportsIntersectionObserver = function () { if (window.IntersectionObserver) { - // The api exists in chrome 50 but doesn't work - if (browser.chrome) { - - var version = parseInt(browser.version.split('.')[0]); - return version >= 51; - } return true; } @@ -25,8 +26,8 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser var y = screen.availHeight; if (browser.touch) { - x *= 2; - y *= 2; + x *= 1.5; + y *= 1.5; } thresholdX = x; @@ -53,14 +54,174 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser if (!source) { source = elem.getAttribute('data-src'); } - if (source) { - if (enableFade && !layoutManager.tv && enableEffects !== false) { - imageFetcher.loadImage(elem, source).then(fadeIn); - } else { - imageFetcher.loadImage(elem, source); - } - elem.removeAttribute("data-src"); + + if (!source) { + return; } + + fillImageElement(elem, source, enableEffects); + } + + function fillImageElement(elem, source, enableEffects) { + imageFetcher.loadImage(elem, source).then(function () { + + var fillingVibrant = elem.tagName !== 'IMG' ? false : fillVibrant(elem, source); + + if (enableFade && !layoutManager.tv && enableEffects !== false && !fillingVibrant) { + fadeIn(elem); + } + + elem.removeAttribute("data-src"); + }); + } + + //var placeholder = document.createElement('div'); + //imagesWorker.onmessage = function (evt) { + // placeholder.dispatchEvent(new CustomEvent('decoded', { + // detail: evt.data, + // bubbles: false, + // cancellable: false + // })); + //}; + + //var uniqueId = 0; + + //function fillCanvas(elem, source) { + + // var newUniqueId = (++uniqueId); + + // imagesWorker.postMessage({ + // url: source, + // id: newUniqueId + // }); + + // placeholder.addEventListener('decoded', function (e) { + + // if (e.detail.id == newUniqueId) { + + // var imageBitmap = e.detail.imageBitmap; + // var canvas = document.createElement('canvas'); + // var canvasContext = canvas.getContext('2d'); + + // //drawWidth *= ratio; + // //drawHeight *= ratio; + + // // https://stackoverflow.com/questions/21961839/simulation-background-size-cover-in-canvas/21961894#21961894 + // canvasContext.imageSmoothingEnabled = false; + // var width = canvas.width = elem.offsetWidth; + // var height = canvas.height = elem.offsetHeight; + // canvasContext.drawImage(imageBitmap, 0, 0, imageBitmap.width, imageBitmap.height, 0, 0, width, height); + + // fillVibrant(elem, source, canvas, canvasContext); + + // elem.insertBefore(canvas, elem.firstChild); + // elem.removeAttribute("data-src"); + // } + // }); + //} + + function fillVibrant(img, url, canvas, canvasContext) { + + var vibrantElement = img.getAttribute('data-vibrant'); + if (!vibrantElement) { + return false; + } + + if (window.Vibrant) { + fillVibrantOnLoaded(img, url, vibrantElement, canvas, canvasContext); + return true; + } + + require(['vibrant'], function () { + fillVibrantOnLoaded(img, url, vibrantElement, canvas, canvasContext); + }); + return true; + } + + function fillVibrantOnLoaded(img, url, vibrantElement, canvas, canvasContext) { + + vibrantElement = document.getElementById(vibrantElement); + if (!vibrantElement) { + return; + } + + requestIdleCallback(function () { + + //var now = new Date().getTime(); + var swatch = getVibrantInfo(canvas || img, url, canvasContext).split('|'); + //console.log('vibrant took ' + (new Date().getTime() - now) + 'ms'); + if (swatch.length) { + + var index = 0; + vibrantElement.style.backgroundColor = swatch[index]; + vibrantElement.style.color = swatch[index + 1]; + } + }); + /* + * Results into: + * Vibrant #7a4426 + * Muted #7b9eae + * DarkVibrant #348945 + * DarkMuted #141414 + * LightVibrant #f3ccb4 + */ + } + + function getSettingsKey(url) { + + var parts = url.split('://'); + url = parts[parts.length - 1]; + + url = url.substring(url.indexOf('/') + 1); + + url = url.split('?')[0]; + + var cacheKey = 'vibrant11'; + return cacheKey + url; + } + + function getCachedVibrantInfo(url) { + + return appSettings.get(getSettingsKey(url)); + } + + function getVibrantInfo(img, url, canvasContext) { + + var value = getCachedVibrantInfo(url); + if (value) { + return value; + } + + var vibrant = new Vibrant(img, canvasContext); + var swatches = vibrant.swatches(); + + value = ''; + var swatch = swatches.DarkVibrant; + if (swatch) { + value += swatch.getHex() + '|' + swatch.getBodyTextColor(); + } + //swatch = swatches.DarkMuted; + //if (swatch) { + // value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor(); + //} else { + // value += '||'; + //} + //swatch = swatches.Vibrant; + //if (swatch) { + // value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor(); + //} else { + // value += '||'; + //} + //swatch = swatches.Muted; + //if (swatch) { + // value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor(); + //} else { + // value += '||'; + //} + + appSettings.set(getSettingsKey(url), value); + + return value; } function fadeIn(elem) { @@ -231,31 +392,33 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser var result; - if (values.length % 2) + if (values.length % 2) { result = values[half]; - else + } + else { result = (values[half - 1] + values[half]) / 2.0; + } // If really close to 2:3 (poster image), just return 2:3 var aspect2x3 = 2 / 3; - if (Math.abs(aspect2x3 - result) <= .15) { + if (Math.abs(aspect2x3 - result) <= 0.15) { return aspect2x3; } // If really close to 16:9 (episode image), just return 16:9 var aspect16x9 = 16 / 9; - if (Math.abs(aspect16x9 - result) <= .2) { + if (Math.abs(aspect16x9 - result) <= 0.2) { return aspect16x9; } // If really close to 1 (square image), just return 1 - if (Math.abs(1 - result) <= .15) { + if (Math.abs(1 - result) <= 0.15) { return 1; } // If really close to 4:3 (poster image), just return 2:3 var aspect4x3 = 4 / 3; - if (Math.abs(aspect4x3 - result) <= .15) { + if (Math.abs(aspect4x3 - result) <= 0.15) { return aspect4x3; } @@ -274,6 +437,7 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser self.lazyImage = fillImage; self.lazyChildren = lazyChildren; self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio; + self.getCachedVibrantInfo = getCachedVibrantInfo; return self; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/images/indexeddbimagefetcher.js b/dashboard-ui/bower_components/emby-webcomponents/images/indexeddbimagefetcher.js new file mode 100644 index 000000000..79ca120dc --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/images/indexeddbimagefetcher.js @@ -0,0 +1,177 @@ +define(['cryptojs-md5'], function () { + 'use strict'; + + var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB; + var dbVersion = 1; + var imagesTableName = "images"; + var db; + + function createObjectStore(dataBase) { + + dataBase.createObjectStore(imagesTableName, { keyPath: "id" }); + db = dataBase; + } + + // Create/open database + var request = indexedDB.open("imagesDb2", dbVersion); + + request.onupgradeneeded = function () { + createObjectStore(request.result); + }; + + request.onsuccess = function (event) { + + console.log("Success creating/accessing IndexedDB database"); + + var localDb = request.result; + + localDb.onerror = function (event) { + console.log("Error creating/accessing IndexedDB database"); + }; + + // Interim solution for Google Chrome to create an objectStore. Will be deprecated + if (localDb.setVersion) { + if (localDb.version !== dbVersion) { + var setVersion = localDb.setVersion(dbVersion); + setVersion.onsuccess = function () { + createObjectStore(localDb); + }; + } else { + db = localDb; + } + } else { + db = localDb; + } + }; + + function revoke(url) { + + //URL.revokeObjectURL(url); + + } + + function loadImage(elem, url) { + + if (elem.tagName !== "IMG") { + + elem.style.backgroundImage = "url('" + url + "')"; + revoke(url); + return Promise.resolve(elem); + + } else { + elem.setAttribute("src", url); + revoke(url); + return Promise.resolve(elem); + } + } + + function getCacheKey(url) { + + // Try to strip off the domain to share the cache between local and remote connections + var index = url.indexOf('://'); + + if (index !== -1) { + url = url.substring(index + 3); + + index = url.indexOf('/'); + + if (index !== -1) { + url = url.substring(index + 1); + } + + } + + return CryptoJS.MD5(url).toString(); + } + + function getFromDb(key) { + + return new Promise(function (resolve, reject) { + + var transaction = db.transaction(imagesTableName, "read"); + + // Retrieve the file that was just stored + var request = transaction.objectStore(imagesTableName).get(key); + + request.onsuccess = function (event) { + var imgFile = event.target.result; + + // Get window.URL object + var URL = window.URL || window.webkitURL; + + // Create and revoke ObjectURL + var imgURL = URL.createObjectURL(imgFile); + + resolve(imgURL); + }; + + request.onerror = reject; + }); + } + + function saveImageToDb(blob, key, resolve) { + + // Open a transaction to the database + var transaction = db.transaction(imagesTableName, "readwrite"); + + // Put the blob into the dabase + var put = transaction.objectStore(imagesTableName).put({ id: key, data: blob }); + + // Get window.URL object + var URL = window.URL || window.webkitURL; + + var imgURL = URL.createObjectURL(blob); + + resolve(imgURL); + } + + function getImageUrl(originalUrl) { + + var key = getCacheKey(originalUrl); + + return getFromDb(key).catch(function () { + + return new Promise(function (resolve, reject) { + + var xhr = new XMLHttpRequest(); + + xhr.open("GET", originalUrl, true); + // Set the responseType to blob + xhr.responseType = "blob"; + + xhr.addEventListener("load", function () { + if (xhr.status === 200) { + + // Put the received blob into IndexedDB + saveImageToDb(xhr.response, key, resolve); + } else { + reject(); + } + }, false); + + xhr.onerror = reject; + + // Send XHR + xhr.send(); + }); + }); + } + + return { + loadImage: function (elem, url) { + + if (!db) { + return loadImage(elem, url); + } + + return getImageUrl(url).then(function (localUrl) { + + return loadImage(elem, localUrl); + + }, function () { + return loadImage(elem, url); + }); + } + }; + +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/images/persistentimagefetcher.js b/dashboard-ui/bower_components/emby-webcomponents/images/persistentimagefetcher.js index bc1ebc769..0d97fc9cc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/images/persistentimagefetcher.js +++ b/dashboard-ui/bower_components/emby-webcomponents/images/persistentimagefetcher.js @@ -1,4 +1,5 @@ define(['cryptojs-md5'], function () { + 'use strict'; function loadImage(elem, url) { @@ -20,7 +21,7 @@ define(['cryptojs-md5'], function () { function createDir(rootDirEntry, folders, callback, errorCallback) { // Throw out './' or '/' and move on to prevent something like '/foo/.//bar'. - if (folders[0] == '.' || folders[0] == '') { + if (folders[0] === '.' || folders[0] === '') { folders = folders.slice(1); } rootDirEntry.getDirectory(folders[0], { create: true }, function (dirEntry) { @@ -140,12 +141,12 @@ define(['cryptojs-md5'], function () { // Try to strip off the domain to share the cache between local and remote connections var index = url.indexOf('://'); - if (index != -1) { + if (index !== -1) { url = url.substring(index + 3); index = url.indexOf('/'); - if (index != -1) { + if (index !== -1) { url = url.substring(index + 1); } @@ -163,12 +164,12 @@ define(['cryptojs-md5'], function () { xhr.responseType = "arraybuffer"; xhr.onload = function (e) { - if (this.status == 200) { + if (this.status === 200) { writeData(dir, filename, this.getResponseHeader('Content-Type'), this.response, callback, errorCallback); } else { errorCallback(); } - } + }; xhr.send(); } @@ -200,7 +201,7 @@ define(['cryptojs-md5'], function () { return new Promise(function (resolve, reject) { - if (originalUrl.indexOf('tag=') != -1) { + if (originalUrl.indexOf('tag=') !== -1) { originalUrl += "&accept=webp"; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.css b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.css index 51f6aceff..fdc4c346b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.css +++ b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.css @@ -28,6 +28,10 @@ color: #CB272A; } +.timerIndicator-inactive { + color: #888; +} + .indicator + .indicator { margin-left: .25em; } @@ -73,4 +77,4 @@ .fullSyncIndicator { background: rgba(82,181,75,1); -} \ No newline at end of file +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js index 71250246a..bba4ec148 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js +++ b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js @@ -1,9 +1,10 @@ define(['css!./indicators.css', 'material-icons'], function () { + 'use strict'; function enableProgressIndicator(item) { - if (item.MediaType == 'Video') { - if (item.Type != 'TvChannel') { + if (item.MediaType === 'Video') { + if (item.Type !== 'TvChannel') { return true; } } @@ -27,7 +28,7 @@ define(['css!./indicators.css', 'material-icons'], function () { function getProgressBarHtml(item, options) { if (enableProgressIndicator(item)) { - if (item.Type == "Recording" && item.CompletionPercentage) { + if (item.Type === "Recording" && item.CompletionPercentage) { return getProgressHtml(item.CompletionPercentage, options); } @@ -48,9 +49,9 @@ define(['css!./indicators.css', 'material-icons'], function () { function enablePlayedIndicator(item) { - if (item.Type == "Series" || item.Type == "Season" || item.Type == "BoxSet" || item.MediaType == "Video" || item.MediaType == "Game" || item.MediaType == "Book") { + if (item.Type === "Series" || item.Type === "Season" || item.Type === "BoxSet" || item.MediaType === "Video" || item.MediaType === "Game" || item.MediaType === "Book") { - if (item.Type != 'TvChannel') { + if (item.Type !== 'TvChannel') { return true; } } @@ -98,19 +99,38 @@ define(['css!./indicators.css', 'material-icons'], function () { function getTimerIndicator(item) { - if (item.SeriesTimerId) { - return 'fiber_smart_record'; + var status; + + if (item.Type === 'SeriesTimer') { + return ''; } - if (item.TimerId) { - return 'fiber_manual_record'; + else if (item.TimerId || item.SeriesTimerId) { + + status = item.Status || 'Cancelled'; + } + else if (item.Type === 'Timer') { + + status = item.Status; + } + else { + return ''; } - return ''; + if (item.SeriesTimerId) { + + if (status !== 'Cancelled') { + return ''; + } + + return ''; + } + + return ''; } function getSyncIndicator(item) { - if (item.SyncPercent == 100) { + if (item.SyncPercent === 100) { return '
file_download
'; } else if (item.SyncPercent != null) { return '
file_download
'; diff --git a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js index 07c8886e4..076db957f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js @@ -153,6 +153,12 @@ define(['playbackManager', 'focusManager', 'embyRouter', 'dom'], function (playb case 'togglemute': playbackManager.toggleMute(); break; + case 'channelup': + playbackManager.nextTrack(); + break; + case 'channeldown': + playbackManager.previousTrack(); + break; case 'volumedown': playbackManager.volumeDown(); break; diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 9b9aee75c..d73efd038 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -29,25 +29,47 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } - if (item.Type == 'Timer' && user.Policy.EnableLiveTvManagement) { + if ((item.Type == 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ - name: globalize.translate('sharedcomponents#ButtonCancel'), + name: globalize.translate('sharedcomponents#CancelRecording'), id: 'canceltimer' }); } - if (item.CanDelete) { + if ((item.Type == 'Recording' && item.Status == 'InProgress') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ - name: globalize.translate('sharedcomponents#Delete'), - id: 'delete' + name: globalize.translate('sharedcomponents#CancelRecording'), + id: 'canceltimer' }); } - if (itemHelper.canEdit(user, item.Type)) { + if ((item.Type == 'SeriesTimer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { + commands.push({ + name: globalize.translate('sharedcomponents#CancelSeries'), + id: 'cancelseriestimer' + }); + } - if (options.edit !== false) { + if (item.CanDelete) { - var text = item.Type == 'Timer' ? globalize.translate('sharedcomponents#Edit') : globalize.translate('sharedcomponents#EditInfo'); + if (item.Type == 'Playlist' || item.Type == 'BoxSet') { + commands.push({ + name: globalize.translate('sharedcomponents#Delete'), + id: 'delete' + }); + } else { + commands.push({ + name: globalize.translate('sharedcomponents#DeleteMedia'), + id: 'delete' + }); + } + } + + if (itemHelper.canEdit(user, item)) { + + if (options.edit !== false && item.Type != 'SeriesTimer') { + + var text = (item.Type == 'Timer' || item.Type == 'SeriesTimer') ? globalize.translate('sharedcomponents#Edit') : globalize.translate('sharedcomponents#EditInfo'); commands.push({ name: text, @@ -56,7 +78,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - if (itemHelper.canEditImages(user, item.Type)) { + if (itemHelper.canEditImages(user, item)) { if (options.editImages !== false) { commands.push({ @@ -66,9 +88,9 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - if (itemHelper.canEdit(user, item.Type)) { + if (itemHelper.canEdit(user, item)) { - if (item.MediaType == 'Video' && item.Type != 'TvChannel' && item.Type != 'Program' && item.LocationType != 'Virtual') { + if (item.MediaType == 'Video' && item.Type != 'TvChannel' && item.Type != 'Program' && item.LocationType != 'Virtual' && !(item.Type == 'Recording' && item.Status != 'Completed')) { if (options.editSubtitles !== false) { commands.push({ name: globalize.translate('sharedcomponents#EditSubtitles'), @@ -112,15 +134,6 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - //if (options.open !== false) { - // if (item.Type != 'Timer' && item.Type != 'Audio') { - // commands.push({ - // name: globalize.translate('sharedcomponents#Open'), - // id: 'open' - // }); - // } - //} - if (canPlay) { if (options.play !== false) { commands.push({ @@ -160,7 +173,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - if (item.Type == 'Program' && (!item.TimerId && !item.SeriesTimerId)) { + if (item.Type == 'Program') { commands.push({ name: Globalize.translate('sharedcomponents#Record'), @@ -170,7 +183,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', if (user.Policy.IsAdministrator) { - if (item.Type != 'Timer' && item.Type != 'Program') { + if (item.Type != 'Timer' && item.Type != 'SeriesTimer' && item.Type != 'Program' && !(item.Type == 'Recording' && item.Status != 'Completed')) { commands.push({ name: globalize.translate('sharedcomponents#Refresh'), id: 'refresh' @@ -383,7 +396,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } case 'delete': { - deleteItem(apiClient, itemId).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); + deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); break; } case 'share': @@ -480,6 +493,9 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', case 'canceltimer': deleteTimer(apiClient, item, resolve, id); break; + case 'cancelseriestimer': + deleteSeriesTimer(apiClient, item, resolve, id); + break; default: reject(); break; @@ -489,21 +505,22 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', function deleteTimer(apiClient, item, resolve, command) { - require(['confirm'], function (confirm) { + require(['recordingHelper'], function (recordingHelper) { - confirm(globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), globalize.translate('sharedcomponents#HeaderConfirmRecordingCancellation')).then(function () { + var timerId = item.TimerId || item.Id; - loading.show(); + recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () { + getResolveFunction(resolve, command, true)(); + }); + }); + } - apiClient.cancelLiveTvTimer(item.Id).then(function () { + function deleteSeriesTimer(apiClient, item, resolve, command) { - require(['toast'], function (toast) { - toast(globalize.translate('sharedcomponents#RecordingCancelled')); - }); + require(['recordingHelper'], function (recordingHelper) { - loading.hide(); - getResolveFunction(resolve, command, true)(); - }); + recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () { + getResolveFunction(resolve, command, true)(); }); }); } @@ -539,6 +556,11 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', if (item.Type == 'Timer') { require(['recordingEditor'], function (recordingEditor) { + recordingEditor.show(item.Id, serverId).then(resolve, reject); + }); + } else if (item.Type == 'SeriesTimer') { + require(['seriesRecordingEditor'], function (recordingEditor) { + recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else { @@ -550,16 +572,25 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } - function deleteItem(apiClient, itemId) { + function deleteItem(apiClient, item) { return new Promise(function (resolve, reject) { + var itemId = item.Id; + var msg = globalize.translate('sharedcomponents#ConfirmDeleteItem'); var title = globalize.translate('sharedcomponents#HeaderDeleteItem'); require(['confirm'], function (confirm) { - confirm(msg, title).then(function () { + confirm({ + + title: title, + text: msg, + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(function () { apiClient.deleteItem(itemId).then(function () { resolve(true); @@ -585,6 +616,10 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', return getCommands(options).then(function (commands) { + if (!commands.length) { + return Promise.reject(); + } + return new Promise(function (resolve, reject) { require(['actionsheet'], function (actionSheet) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js index a896692f5..5cc5a9140 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js @@ -8,7 +8,11 @@ define(['apphost'], function (appHost) { options = options || {}; - var name = item.EpisodeTitle || item.Name || ''; + if (item.Type == 'Timer') { + item = item.ProgramInfo || item; + } + + var name = (item.Type == 'Program' && item.IsSeries ? item.EpisodeTitle : item.Name) || ''; if (item.Type == "TvChannel") { @@ -37,7 +41,7 @@ define(['apphost'], function (appHost) { number += "-" + displayIndexNumber; } - name = number + " - " + name; + name = name ? (number + " - " + name) : number; } @@ -46,26 +50,45 @@ define(['apphost'], function (appHost) { function supportsAddingToCollection(item) { - if (item.Type == 'Timer') { + if (item.Type == 'Timer' || item.Type == 'SeriesTimer') { return false; } var invalidTypes = ['Person', 'Genre', 'MusicGenre', 'Studio', 'GameGenre', 'BoxSet', 'Playlist', 'UserView', 'CollectionFolder', 'Audio', 'TvChannel', 'Program', 'MusicAlbum', 'Timer']; + if (item.Type == 'Recording') { + if (item.Status != 'Completed') { + return false; + } + } + return !item.CollectionType && invalidTypes.indexOf(item.Type) == -1 && item.MediaType != 'Photo'; } function supportsAddingToPlaylist(item) { + if (item.Type == 'Program') { return false; } if (item.Type == 'Timer') { return false; } - return item.RunTimeTicks || item.IsFolder || item.Type == "Genre" || item.Type == "MusicGenre" || item.Type == "MusicArtist"; + if (item.Type == 'SeriesTimer') { + return false; + } + + if (item.Type == 'Recording') { + if (item.Status != 'Completed') { + return false; + } + } + + return item.MediaType || item.IsFolder || item.Type == "Genre" || item.Type == "MusicGenre" || item.Type == "MusicArtist"; } - function canEdit(user, itemType) { + function canEdit(user, item) { + + var itemType = item.Type; if (itemType == "UserRootFolder" || /*itemType == "CollectionFolder" ||*/ itemType == "UserView") { return false; @@ -75,12 +98,13 @@ define(['apphost'], function (appHost) { return false; } - if (user.Policy.IsAdministrator) { - - return true; + if (item.Type == 'Recording') { + if (item.Status != 'Completed') { + return false; + } } - return false; + return user.Policy.IsAdministrator; } return { @@ -111,7 +135,9 @@ define(['apphost'], function (appHost) { canEdit: canEdit, - canEditImages: function (user, itemType) { + canEditImages: function (user, item) { + + var itemType = item.Type; if (itemType == 'UserView') { if (user.Policy.IsAdministrator) { @@ -122,7 +148,13 @@ define(['apphost'], function (appHost) { return false; } - return itemType != 'Timer' && canEdit(user, itemType); + if (item.Type == 'Recording') { + if (item.Status != 'Completed') { + return false; + } + } + + return itemType != 'Timer' && itemType != 'SeriesTimer' && canEdit(user, item); }, canSync: function (user, item) { @@ -139,6 +171,14 @@ define(['apphost'], function (appHost) { if (item.Type == 'Timer') { return false; } + if (item.Type == 'SeriesTimer') { + return false; + } + if (item.Type == 'Recording') { + if (item.Status != 'Completed') { + return false; + } + } return user.Policy.EnablePublicSharing && appHost.supports('sharing'); } }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js index 069af7764..ba96c2c2b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js @@ -77,7 +77,7 @@ var isPortrait = className.indexOf('portrait') != -1; var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName; - var name = itemHelper.getDisplayName(item); + var name = item.EpisodeTitle ? item.Name : itemHelper.getDisplayName(item); html += '
'; var logoHeight = 26; @@ -140,13 +140,6 @@ html += ''; buttonCount++; - html += userdataButtons.getIconsHtml({ - item: item, - style: 'fab-mini', - cssClass: 'cardOverlayFab', - iconCssClass: 'cardOverlayFab-md-icon' - }); - html += '
'; html += '
'; @@ -198,7 +191,7 @@ var id = dataElement.getAttribute('data-id'); var type = dataElement.getAttribute('data-type'); - if (type == 'Timer') { + if (type == 'Timer' || type == 'SeriesTimer') { return; } @@ -215,6 +208,16 @@ innerElem.innerHTML = getOverlayHtml(apiClient, item, user, dataElement); + userdataButtons.fill({ + item: item, + style: 'fab-mini', + cssClass: 'cardOverlayFab', + iconCssClass: 'cardOverlayFab-md-icon', + element: innerElem.querySelector('.cardOverlayButtons'), + fillMode: 'insertAdjacent', + insertLocation: 'beforeend' + }); + innerElem.querySelector('.cardOverlayButtons').addEventListener('click', onCardOverlayButtonsClick); }); @@ -243,7 +246,7 @@ showOverlayTimeout = setTimeout(function () { onShowTimerExpired(card); - }, 1000); + }, 1400); } function preventTouchHover() { diff --git a/dashboard-ui/bower_components/emby-webcomponents/layoutmanager.js b/dashboard-ui/bower_components/emby-webcomponents/layoutmanager.js index f5ae69662..f62cac40c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/layoutmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/layoutmanager.js @@ -1,4 +1,5 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) { + 'use strict'; function setLayout(self, layout, selectedLayout) { @@ -17,7 +18,7 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve self.setLayout = function (layout, save) { - if (!layout || layout == 'auto') { + if (!layout || layout === 'auto') { self.autoLayout(); if (save !== false) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css index ba99690a0..0e038371a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css +++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css @@ -15,19 +15,10 @@ overflow: hidden; } -.listItem-border { - border-bottom: 1px solid #2a2a2a; -} - .listItem-button { width: 100%; } -.listItem-nosidepadding { - padding-left: 0; - padding-right: 0; -} - .listItem-largeImage { padding: .5em !important; } @@ -46,6 +37,7 @@ display: inline-block; vertical-align: middle; flex-shrink: 0; + contain: layout style; } .listViewDragHandle { @@ -54,33 +46,20 @@ .listItemBody { flex-grow: 1; - padding: 0 1em; + padding: .8em 1em; overflow: hidden; text-overflow: ellipsis; flex-direction: column; vertical-align: middle; justify-content: center; - min-height: 3.44em; } -.listItemBody-nogrow { - flex-grow: initial; - flex-shrink: 0; - width: 9em; - opacity: .7; +.listItemBody-noleftpadding { + padding-left: 0; } -@media all and (max-width: 800px) { - - .listItemBody-nogrow { - width: 4em; - } -} - -.two-line { - min-height: 5.15em; - padding-top: 0; - padding-bottom: 0; +.listItem-odd { + background: #1c1c1c; } .three-line { @@ -128,7 +107,6 @@ background-color: #52B54B; padding: .5em; color: #fff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); } .listItemProgressBar { @@ -169,6 +147,7 @@ /* Don't display if flex not supported */ display: none; align-items: center; + margin-right: 1em; } .listGroupHeader { @@ -191,6 +170,7 @@ .listItem, .listItemBody, .listItemMediaInfo { display: flex; + contain: layout style; } } @@ -200,3 +180,7 @@ display: none !important; } } + +.listItemCheckboxContainer { + width: auto !important; +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js index b5888e126..ec5a8aa76 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js +++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js @@ -111,6 +111,12 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan for (var i = 0, length = textlines.length; i < length; i++) { + var text = textlines[i]; + + if (!text) { + continue; + } + if (i === 0) { if (isLargeStyle) { html += '

'; @@ -143,7 +149,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var clickEntireItem = layoutManager.tv ? true : false; var outerTagName = clickEntireItem ? 'button' : 'div'; - var enableSideMediaInfo = options.enableSideMediaInfo != null ? options.enableSideMediaInfo : clickEntireItem; + var enableSideMediaInfo = options.enableSideMediaInfo != null ? options.enableSideMediaInfo : true; var outerHtml = ''; @@ -178,10 +184,12 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - var cssClass = "listItem listItem-nosidepadding"; + var cssClass = "listItem"; - if (options.border !== false) { - cssClass += ' listItem-border'; + if (options.highlight !== false) { + if (i % 2 == 1) { + cssClass += ' listItem-odd'; + } } if (clickEntireItem) { @@ -242,23 +250,32 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '

'; } - if (options.showProgramTimeColumn) { - html += '
'; - html += datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)); - html += ' - '; - html += datetime.getDisplayTime(datetime.parseISO8601Date(item.EndDate)); - html += '
'; + var textlines = []; + + if (options.showProgramDateTime) { + textlines.push(datetime.toLocaleString(datetime.parseISO8601Date(item.StartDate), { + + weekday: 'long', + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit' + })); } - var textlines = []; + if (options.showProgramTime) { + textlines.push(datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); + } + + var parentTitle = null; if (options.showParentTitle) { if (item.Type == 'Episode') { - textlines.push(item.SeriesName || ' '); + parentTitle = item.SeriesName; } - if (item.EpisodeTitle) { - textlines.push(item.Name || ' '); + else if (item.IsSeries) { + parentTitle = item.Name; } } @@ -267,21 +284,42 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.showIndexNumber && item.IndexNumber != null) { displayName = item.IndexNumber + ". " + displayName; } - textlines.push(displayName); - if (item.ArtistItems && item.Type != 'MusicAlbum') { - textlines.push(item.ArtistItems.map(function (a) { - return a.Name; + if (options.showParentTitle && options.parentTitleWithTitle) { - }).join(', ') || ' '); + if (displayName) { + + if (parentTitle) { + parentTitle += ' - '; + } + parentTitle = (parentTitle || '') + displayName; + } + + textlines.push(parentTitle || ''); + } + else if (options.showParentTitle) { + textlines.push(parentTitle || ''); } - if (item.AlbumArtist && item.Type == 'MusicAlbum') { - textlines.push(item.AlbumArtist || ' '); + if (displayName && !options.parentTitleWithTitle) { + textlines.push(displayName); + } + + if (options.artist !== false) { + if (item.ArtistItems && item.Type != 'MusicAlbum') { + textlines.push(item.ArtistItems.map(function (a) { + return a.Name; + + }).join(', ')); + } + + if (item.AlbumArtist && item.Type == 'MusicAlbum') { + textlines.push(item.AlbumArtist); + } } if (item.Type == 'Game') { - textlines.push(item.GameSystem || ' '); + textlines.push(item.GameSystem); } if (item.Type == 'TvChannel') { @@ -291,24 +329,31 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - cssClass = 'listItemBody two-line'; + cssClass = 'listItemBody'; if (!clickEntireItem) { cssClass += ' itemAction'; } + if (options.image === false) { + cssClass += ' itemAction listItemBody-noleftpadding'; + } + html += '
'; var moreIcon = appHost.moreIcon == 'dots-horiz' ? '' : ''; html += getTextLinesHtml(textlines, isLargeStyle); - if (!enableSideMediaInfo) { + if (options.mediaInfo !== false) { + if (!enableSideMediaInfo) { - var mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; + var mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; - html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { - episodeTitle: false - }) + '
'; + html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { + episodeTitle: false, + originalAirDate: false + }) + '
'; + } } if (enableOverview && item.Overview) { @@ -319,18 +364,32 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '
'; - if (enableSideMediaInfo) { - html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { + if (options.mediaInfo !== false) { + if (enableSideMediaInfo) { + html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { - year: false, - container: false, - episodeTitle: false + year: false, + container: false, + episodeTitle: false - }) + '
'; + }) + '
'; + } + } + + if (!options.recordButton && (item.Type == 'Timer' || item.Type == 'Program')) { + html += indicators.getTimerIndicator(item).replace('indicatorIcon', 'indicatorIcon listItemAside'); } if (!clickEntireItem) { - html += ''; + + if (options.moreButton !== false) { + html += ''; + } + + if (options.recordButton) { + + html += ''; + } if (options.enableUserDataButtons !== false) { html += ''; diff --git a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css index de7e80c2a..bc47f52e6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css +++ b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css @@ -54,7 +54,6 @@ .mediaInfoProgramAttribute { color: #fff; text-transform: uppercase; - background: #EF6C00; padding: .16em .6em; border-radius: .15em; font-size: 80%; diff --git a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js index 0bccf1691..4df78e382 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js +++ b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js @@ -1,4 +1,35 @@ -define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', 'css!./mediainfo.css'], function (datetime, globalize, embyRouter, itemHelper) { +define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', 'css!./mediainfo.css', 'programStyles'], function (datetime, globalize, embyRouter, itemHelper) { + + function getTimerIndicator(item) { + + var status; + + if (item.Type == 'SeriesTimer') { + return ''; + } + else if (item.TimerId || item.SeriesTimerId) { + + status = item.Status || 'Cancelled'; + } + else if (item.Type == 'Timer') { + + status = item.Status; + } + else { + return ''; + } + + if (item.SeriesTimerId) { + + if (status != 'Cancelled') { + return ''; + } + + return ''; + } + + return ''; + } function getProgramInfoHtml(item, options) { var html = ''; @@ -6,23 +37,14 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' var miscInfo = []; var text, date; - if (item.ChannelName) { - - if (options.interactive && item.ChannelId) { - miscInfo.push('' + item.ChannelName + ''); - } else { - miscInfo.push(item.ChannelName); - } - } - if (item.StartDate) { try { date = datetime.parseISO8601Date(item.StartDate); - text = datetime.toLocaleDateString(date); + text = datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }); - text += ', ' + datetime.getDisplayTime(date); + text += ' ' + datetime.getDisplayTime(date); if (item.EndDate) { date = datetime.parseISO8601Date(item.EndDate); @@ -40,15 +62,22 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' miscInfo.push('CH ' + item.ChannelNumber); } - if (item.SeriesTimerId) { - miscInfo.push({ - html: '' - }); + if (item.ChannelName) { + + if (options.interactive && item.ChannelId) { + miscInfo.push('' + item.ChannelName + ''); + } else { + miscInfo.push(item.ChannelName); + } } - else if (item.TimerId) { - miscInfo.push({ - html: '' - }); + + if (options.timerIndicator !== false) { + var timerHtml = getTimerIndicator(item); + if (timerHtml) { + miscInfo.push({ + html: timerHtml + }); + } } html += miscInfo.map(function (m) { @@ -159,22 +188,22 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' if (item.IsLive) { miscInfo.push({ - html: '
' + globalize.translate('sharedcomponents#Live') + '
' + html: '
' + globalize.translate('sharedcomponents#Live') + '
' }); } else if (item.IsPremiere) { miscInfo.push({ - html: '
' + globalize.translate('sharedcomponents#Premiere') + '
' + html: '
' + globalize.translate('sharedcomponents#Premiere') + '
' }); } else if (item.IsSeries && !item.IsRepeat) { miscInfo.push({ - html: '
' + globalize.translate('sharedcomponents#AttributeNew') + '
' + html: '
' + globalize.translate('sharedcomponents#AttributeNew') + '
' }); } else if (item.IsSeries && item.IsRepeat) { miscInfo.push({ - html: '
' + globalize.translate('sharedcomponents#Repeat') + '
' + html: '
' + globalize.translate('sharedcomponents#Repeat') + '
' }); } @@ -182,7 +211,7 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' miscInfo.push(itemHelper.getDisplayName(item)); } - else if (item.PremiereDate) { + else if (item.PremiereDate && options.originalAirDate !== false) { try { date = datetime.parseISO8601Date(item.PremiereDate); @@ -198,20 +227,22 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' } } - if (item.Type != "Series" && item.Type != "Episode" && item.Type != "Person" && item.MediaType != 'Photo' && item.Type != 'Program') { + if (options.year !== false) { + if (item.Type != "Series" && item.Type != "Episode" && item.Type != "Person" && item.MediaType != 'Photo' && item.Type != 'Program') { - if (item.ProductionYear) { + if (item.ProductionYear) { - miscInfo.push(item.ProductionYear); - } - else if (item.PremiereDate) { - - try { - text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); - miscInfo.push(text); + miscInfo.push(item.ProductionYear); } - catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + else if (item.PremiereDate) { + + try { + text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); + miscInfo.push(text); + } + catch (e) { + console.log("Error parsing date: " + item.PremiereDate); + } } } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js index f01316b40..5f69d4545 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js @@ -156,7 +156,6 @@ AirDays: getSelectedAirDays(form), AirTime: form.querySelector('#txtAirTime').value, Genres: editableListViewValues(form.querySelector("#listGenres")), - ProductionLocations: editableListViewValues(form.querySelector("#listCountries")), Tags: editableListViewValues(form.querySelector("#listTags")), Keywords: editableListViewValues(form.querySelector("#listKeywords")), Studios: editableListViewValues(form.querySelector("#listStudios")).map(function (element) { return { Name: element }; }), @@ -683,12 +682,6 @@ showElement('#fldCustomRating', context); } - if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "MusicArtist") { - showElement('#countriesCollapsible', context); - } else { - hideElement('#countriesCollapsible', context); - } - if (item.Type == "TvChannel") { hideElement('#tagsCollapsible', context); hideElement('#metadataSettingsCollapsible', context); @@ -809,7 +802,6 @@ el.checked = (item.AirDays || []).indexOf(el.getAttribute('data-day')) != -1; }); - populateListView(context.querySelector('#listCountries'), item.ProductionLocations || []); populateListView(context.querySelector('#listGenres'), item.Genres); populatePeople(context, item.People || []); diff --git a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.template.html index 7707937c8..ea2e7a062 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.template.html @@ -4,7 +4,7 @@ ${Edit}
- @@ -224,16 +224,6 @@
-
-

- ${Countries} -

- -
-

${Genres} diff --git a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js index 6bbfa24ee..27c1baf12 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js @@ -20,7 +20,7 @@ if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } else { - dialogOptions.size = 'medium'; + dialogOptions.size = 'medium-tall'; } var dlg = dialogHelper.createDialog(dialogOptions); @@ -57,6 +57,15 @@ } }); + dlg.querySelector('.selectPersonType').addEventListener('change', function (e) { + + if (this.value == 'Actor') { + dlg.querySelector('.fldRole').classList.remove('hide'); + } else { + dlg.querySelector('.fldRole').classList.add('hide'); + } + }); + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dialogHelper.close(dlg); @@ -75,6 +84,10 @@ e.preventDefault(); return false; }); + + dlg.querySelector('.selectPersonType').dispatchEvent(new CustomEvent('change', { + bubbles: true + })); }); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.template.html index c3d9ec2ef..6c5c8e0d8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.template.html @@ -23,7 +23,7 @@

-
+
${LabelPersonRoleHelp}
diff --git a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js index b5c9951d6..f22f9418c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js +++ b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js @@ -409,26 +409,18 @@ return; } - var msg = globalize.translate('sharedcomponents#TheSelectedItemsWillBeGrouped'); + loading.show(); - require(['confirm'], function (confirm) { + apiClient.ajax({ - confirm(msg, globalize.translate('sharedcomponents#GroupVersions')).then(function () { + type: "POST", + url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') }) - loading.show(); + }).then(function () { - apiClient.ajax({ - - type: "POST", - url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') }) - - }).then(function () { - - loading.hide(); - hideSelections(); - dispatchNeedsRefresh(); - }); - }); + loading.hide(); + hideSelections(); + dispatchNeedsRefresh(); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js b/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js index 46dab62fb..9686bdc25 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js +++ b/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js @@ -91,9 +91,15 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir return; } + var body = item.Name; + + if (item.SeriesName) { + body = item.SeriesName + ' - ' + body; + } + var notification = { title: "New " + item.Type, - body: item.Name, + body: body, vibrate: true, tag: "newItem" + item.Id, data: { diff --git a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js index 41d1f0502..d120f4c54 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js @@ -1,6 +1,5 @@ -define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'embyRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, embyRouter, globalize) { +define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'userSettings', 'embyRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, userSettings, embyRouter, globalize) { - var lastPlaylistId = ''; var currentServerId; function parentWithClass(elem, className) { @@ -26,7 +25,7 @@ var apiClient = connectionManager.getApiClient(currentServerId); if (playlistId) { - lastPlaylistId = playlistId; + userSettings.set('playlisteditor-lastplaylistid', playlistId); addToPlaylist(apiClient, panel, playlistId); } else { createPlaylist(apiClient, panel); @@ -126,7 +125,7 @@ }); select.innerHTML = html; - select.value = lastPlaylistId || ''; + select.value = userSettings.get('playlisteditor-lastplaylistid') || ''; triggerChange(select); loading.hide(); diff --git a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js index 246734ebd..72daa4ef6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js +++ b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, require) { +define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { function setInputProperties(dlg, options) { var txtInput = dlg.querySelector('#txtInput'); @@ -20,8 +20,6 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; - } else { - //dialogOptions.size = 'mini'; } var dlg = dialogHelper.createDialog(dialogOptions); @@ -34,6 +32,7 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } else { dlg.querySelector('.dialogContentInner').classList.add('dialogContentInner-mini'); + dlg.classList.add('dialog-fullscreen-lowres'); } dlg.querySelector('.btnCancel').addEventListener('click', function (e) { @@ -66,6 +65,10 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', return false; }); + dlg.querySelector('.submitText').innerHTML = options.confirmText || globalize.translate('sharedcomponents#ButtonOk'); + + dlg.style.minWidth = (Math.min(400, dom.getWindowSize().innerWidth - 50)) + 'px'; + return dialogHelper.open(dlg).then(function () { if (layoutManager.tv) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.template.html b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.template.html index c52bcb3eb..0438381c3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.template.html @@ -16,7 +16,7 @@
diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/empty.png b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/empty.png new file mode 100644 index 000000000..0a91a7f8a Binary files /dev/null and b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/empty.png differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css index 81e137b19..6d5969d97 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css @@ -2,13 +2,21 @@ color: #cc3333; } -.layout-tv .btnHeaderSave { - display: none; +.recordingDialog-imageContainer { + flex-shrink: 0; + padding: 1em 1em 1em 0; + min-width: 17%; + max-width: 25%; } -@media all and (max-height: 1400px) { +.recordingDialog-img { + max-width: 100%; +} - .layout-tv .recordingDialog .itemOverview { - display: none; - } +.recordingDialog-itemName { + margin-top: .7em; +} + +.recordingDialog-btnRecord { + background-color: #cc3333; } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js index eaa971641..11eddcd49 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js @@ -1,338 +1,100 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'shell', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, shell) { +define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'events', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields, events) { - var currentProgramId; - var currentServerId; var currentDialog; - var recordingCreated = false; + var closeAction; + var currentRecordingFields; - function getDaysOfWeek() { + function closeDialog() { - return [ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday' - ]; - } - - function getDays(context) { - - var daysOfWeek = getDaysOfWeek(); - - var days = []; - - for (var i = 0, length = daysOfWeek.length; i < length; i++) { - - var day = daysOfWeek[i]; - - if (context.querySelector('#chk' + day).checked) { - days.push(day); - } - - } - - return days; - } - - function hideSeriesRecordingFields(context) { - - slideUpToHide(context.querySelector('.seriesFields')); - slideUpToHide(context.querySelector('.seriesDays')); - context.querySelector('.btnSubmit').classList.remove('hide'); - context.querySelector('.supporterContainer').classList.add('hide'); - } - - function closeDialog(isSubmitted) { - - recordingCreated = isSubmitted; dialogHelper.close(currentDialog); } - function onSubmit(e) { - - loading.show(); - - var form = this; - - var apiClient = connectionManager.getApiClient(currentServerId); - - apiClient.getNamedConfiguration("livetv").then(function (config) { - - config.EnableRecordingEncoding = form.querySelector('#chkConvertRecordings').checked; - - apiClient.updateNamedConfiguration("livetv", config); - }); - - apiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) { - - item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; - item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; - - item.RecordNewOnly = form.querySelector('#chkNewOnly').checked; - item.RecordAnyChannel = form.querySelector('#chkAllChannels').checked; - item.RecordAnyTime = form.querySelector('#chkAnyTime').checked; - - item.Days = getDays(form); - - if (form.querySelector('#chkRecordSeries').checked) { - - apiClient.createLiveTvSeriesTimer(item).then(function () { - - loading.hide(); - closeDialog(true); - }); - - } else { - apiClient.createLiveTvTimer(item).then(function () { - - loading.hide(); - closeDialog(true); - }); - } - }); - - // Disable default form submission - e.preventDefault(); - return false; - } - - function getRegistration(apiClient, programId, feature) { - - loading.show(); - - return apiClient.getJSON(apiClient.getUrl('LiveTv/Registration', { - - ProgramId: programId, - Feature: feature - - })).then(function (result) { - - loading.hide(); - return result; - - }, function () { - - loading.hide(); - - return { - TrialVersion: true, - IsValid: true, - IsRegistered: false - }; - }); - } - - function showSeriesDays(context) { - - if (context.querySelector('#chkAnyTime').checked) { - slideUpToHide(context.querySelector('.seriesDays')); - } else { - slideDownToShow(context.querySelector('.seriesDays')); - } - } - - function showSeriesRecordingFields(context, apiClient) { - - slideDownToShow(context.querySelector('.seriesFields')); - showSeriesDays(context); - context.querySelector('.btnSubmit').classList.remove('hide'); - - getRegistration(apiClient, currentProgramId, 'seriesrecordings').then(function (regInfo) { - - if (regInfo.IsRegistered) { - context.querySelector('.btnSubmit').classList.remove('hide'); - context.querySelector('.supporterContainer').classList.add('hide'); - - } else { - - context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings'); - context.querySelector('.supporterContainer').classList.remove('hide'); - context.querySelector('.btnSubmit').classList.add('hide'); - } - }); - } - - function showSingleRecordingFields(context, apiClient) { - - context.querySelector('.btnSubmit').classList.remove('hide'); - - getRegistration(apiClient, currentProgramId, 'dvr').then(function (regInfo) { - - if (regInfo.IsRegistered) { - context.querySelector('.btnSubmit').classList.remove('hide'); - context.querySelector('.supporterContainer').classList.add('hide'); - - } else { - - context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired'); - context.querySelector('.supporterContainer').classList.remove('hide'); - context.querySelector('.btnSubmit').classList.add('hide'); - } - }); - } - - function slideDownToShow(elem) { - - if (!elem.classList.contains('hide')) { - return; - } - - elem.classList.remove('hide'); - - elem.style.overflowY = 'hidden'; - - requestAnimationFrame(function () { - - elem.animate([{ - height: 0 - }, { - height: elem.offsetHeight + 'px' - - }], { duration: 400, easing: 'ease' }).onfinish = function () { - elem.classList.remove('hide'); - }; - }); - } - - function slideUpToHide(elem) { - - if (elem.classList.contains('hide')) { - return; - } - - elem.style.overflowY = 'hidden'; - - requestAnimationFrame(function () { - - elem.animate([{ - height: elem.offsetHeight + 'px' - }, { - height: 0 - }], { duration: 400, easing: 'ease' }).onfinish = function () { - elem.classList.add('hide'); - }; - }); - } - function init(context) { - var apiClient = connectionManager.getApiClient(currentServerId); + context.querySelector('.btnPlay').addEventListener('click', function () { - context.querySelector('#chkRecordSeries').addEventListener('change', function () { - - if (this.checked) { - showSeriesRecordingFields(context, apiClient); - } else { - hideSeriesRecordingFields(context); - showSingleRecordingFields(context, apiClient); - } + closeAction = 'play'; + closeDialog(); }); context.querySelector('.btnCancel').addEventListener('click', function () { - closeDialog(false); + closeAction = null; + closeDialog(); }); + } - context.querySelector('#chkAnyTime').addEventListener('change', function () { + function getImageUrl(item, apiClient, imageHeight) { - showSeriesDays(context); - }); + var imageTags = item.ImageTags || {}; - context.querySelector('form', context).addEventListener('submit', onSubmit); + if (item.PrimaryImageTag) { + imageTags.Primary = item.PrimaryImageTag; + } - var supporterButtons = context.querySelectorAll('.btnSupporter'); - for (var i = 0, length = supporterButtons.length; i < length; i++) { - if (appHost.supports('externalpremium')) { - supporterButtons[i].classList.remove('hide'); + if (imageTags.Primary) { + + return apiClient.getScaledImageUrl(item.Id, { + type: "Primary", + maxHeight: imageHeight, + tag: item.ImageTags.Primary + }); + } + else if (imageTags.Thumb) { + + return apiClient.getScaledImageUrl(item.Id, { + type: "Thumb", + maxHeight: imageHeight, + tag: item.ImageTags.Thumb + }); + } + + return null; + } + + function renderRecording(context, defaultTimer, program, apiClient, refreshRecordingStateOnly) { + + if (!refreshRecordingStateOnly) { + var imgUrl = getImageUrl(program, apiClient, 200); + var imageContainer = context.querySelector('.recordingDialog-imageContainer'); + + if (imgUrl) { + imageContainer.innerHTML = ''; + imageContainer.classList.remove('hide'); + + imageLoader.lazyChildren(imageContainer); } else { - supporterButtons[i].classList.add('hide'); + imageContainer.innerHTML = ''; + imageContainer.classList.add('hide'); } + + context.querySelector('.recordingDialog-itemName').innerHTML = program.Name; + context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name; + context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); + context.querySelector('.itemOverview').innerHTML = program.Overview || ''; + + var formDialogFooter = context.querySelector('.formDialogFooter'); + var now = new Date(); + if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) { + formDialogFooter.classList.remove('hide'); + } else { + formDialogFooter.classList.add('hide'); + } + + context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); } - apiClient.getNamedConfiguration("livetv").then(function (config) { - - context.querySelector('#chkConvertRecordings').checked = config.EnableRecordingEncoding; + context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, { }); - if (layoutManager.tv) { - context.querySelector('.advanced').classList.add('hide'); - } else { - context.querySelector('.advanced').classList.remove('hide'); - } - } - - function selectDays(page, days) { - - var daysOfWeek = getDaysOfWeek(); - - for (var i = 0, length = daysOfWeek.length; i < length; i++) { - - var day = daysOfWeek[i]; - - page.querySelector('#chk' + day).checked = days.indexOf(day) != -1; - } - } - - function renderRecording(context, defaultTimer, program, apiClient) { - - context.querySelector('.itemName').innerHTML = program.Name; - - context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); - context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program); - - context.querySelector('#chkNewOnly').checked = defaultTimer.RecordNewOnly; - context.querySelector('#chkAllChannels').checked = defaultTimer.RecordAnyChannel; - context.querySelector('#chkAnyTime').checked = defaultTimer.RecordAnyTime; - - context.querySelector('#txtPrePaddingMinutes').value = defaultTimer.PrePaddingSeconds / 60; - context.querySelector('#txtPostPaddingMinutes').value = defaultTimer.PostPaddingSeconds / 60; - - if (program.IsSeries) { - context.querySelector('#eligibleForSeriesFields').classList.remove('hide'); - } else { - context.querySelector('#eligibleForSeriesFields').classList.add('hide'); - } - - selectDays(context, defaultTimer.Days); - - context.querySelector('.convertRecordingsContainer').classList.remove('hide'); - showConvertRecordingsUnlockMessage(context, apiClient); - loading.hide(); } - function showConvertRecordingsUnlockMessage(context, apiClient) { - - apiClient.getPluginSecurityInfo().then(function (regInfo) { - - if (regInfo.IsMBSupporter) { - context.querySelector('.btnSupporterForConverting').classList.add('hide'); - } else { - context.querySelector('.btnSupporterForConverting').classList.remove('hide'); - } - - }, function () { - - context.querySelector('.btnSupporterForConverting').classList.remove('hide'); - }); - } - - function onSupporterButtonClick() { - if (appHost.supports('externalpremium')) { - shell.openUrl('https://emby.media/premiere'); - } else { - - } - } - - function reload(context, programId) { + function reload(context, programId, serverId, refreshRecordingStateOnly) { loading.show(); - var apiClient = connectionManager.getApiClient(currentServerId); + var apiClient = connectionManager.getApiClient(serverId); var promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId }); var promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()); @@ -342,17 +104,33 @@ var defaults = responses[0]; var program = responses[1]; - renderRecording(context, defaults, program, apiClient); + renderRecording(context, defaults, program, apiClient, refreshRecordingStateOnly); }); } + function executeCloseAction(action, programId, serverId) { + + if (action == 'play') { + + require(['playbackManager'], function (playbackManager) { + + var apiClient = connectionManager.getApiClient(serverId); + + apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { + + playbackManager.play(item.ChannelId, serverId); + }); + }); + return; + } + } + function showEditor(itemId, serverId) { return new Promise(function (resolve, reject) { - recordingCreated = false; - currentProgramId = itemId; - currentServerId = serverId; + closeAction = null; + loading.show(); require(['text!./recordingcreator.template.html'], function (template) { @@ -381,12 +159,16 @@ currentDialog = dlg; + function onRecordingChanged() { + reload(dlg, itemId, serverId, true); + } + dlg.addEventListener('close', function () { - if (recordingCreated) { - require(['toast'], function (toast) { - toast(globalize.translate('sharedcomponents#RecordingScheduled')); - }); + events.off(currentRecordingFields, 'recordingchanged', onRecordingChanged); + executeCloseAction(closeAction, itemId, serverId); + + if (currentRecordingFields && currentRecordingFields.hasChanged()) { resolve(); } else { reject(); @@ -397,13 +179,17 @@ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } - dlg.querySelector('.btnSupporterForConverting').addEventListener('click', onSupporterButtonClick); - - hideSeriesRecordingFields(dlg); - showSingleRecordingFields(dlg, connectionManager.getApiClient(serverId)); init(dlg); - reload(dlg, itemId); + reload(dlg, itemId, serverId); + + currentRecordingFields = new recordingFields({ + parent: dlg.querySelector('.recordingFields'), + programId: itemId, + serverId: serverId + }); + + events.on(currentRecordingFields, 'recordingchanged', onRecordingChanged); dialogHelper.open(dlg); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html index 16be87c4c..48e774d34 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html @@ -1,113 +1,30 @@ 
-

- ${HeaderNewRecording} -

+

-

-

-

+
+
-
-
- +
+
+

+

+

+

-
-
- - - -
-
-
-
-
- -
${OptionConvertRecordingsToStreamingFormatHelp}
- -
-
-
-
-
-
-

${Days}

-
-
- - - - - - - -
-
-
-
-
- -
-
- -
+
-
+ +


-
-
-
-
- -
-
diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js index e680dbd1c..7cf9fb071 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js @@ -1,64 +1,49 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper) { +define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) { var currentDialog; - var recordingUpdated = false; + var recordingDeleted = false; var currentItemId; var currentServerId; + var currentResolve; - function renderTimer(context, item) { + function deleteTimer(apiClient, timerId) { - var programInfo = item.ProgramInfo || {}; + return new Promise(function (resolve, reject) { - context.querySelector('.itemName').innerHTML = item.Name; + require(['recordingHelper'], function (recordingHelper) { - context.querySelector('.itemGenres').innerHTML = (programInfo.Genres || []).join(' / '); - context.querySelector('.itemOverview').innerHTML = programInfo.Overview || ''; + recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); + }); + }); + } - //var timerPageImageContainer = context.querySelector('.timerPageImageContainer'); + function renderTimer(context, item, apiClient) { - context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(programInfo); - context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(programInfo); + var program = item.ProgramInfo || {}; context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; - var timerStausElem = context.querySelector('.timerStatus'); - - if (item.Status == 'New') { - timerStausElem.classList.add('hide'); - } else { - timerStausElem.classList.remove('hide'); - timerStausElem.innerHTML = 'Status:   ' + item.Status; - } - loading.hide(); } - function closeDialog(isSubmitted) { + function closeDialog(isDeleted) { + + recordingDeleted = isDeleted; - recordingUpdated = isSubmitted; dialogHelper.close(currentDialog); } function onSubmit(e) { - loading.show(); - var form = this; var apiClient = connectionManager.getApiClient(currentServerId); apiClient.getLiveTvTimer(currentItemId).then(function (item) { - item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; - apiClient.updateLiveTvTimer(item).then(function () { - loading.hide(); - require(['toast'], function (toast) { - toast(Globalize.translate('MessageRecordingSaved')); - closeDialog(true); - }); - }); + apiClient.updateLiveTvTimer(item).then(currentResolve); }); e.preventDefault(); @@ -74,6 +59,14 @@ closeDialog(false); }); + context.querySelector('.btnCancelRecording').addEventListener('click', function () { + + var apiClient = connectionManager.getApiClient(currentServerId); + deleteTimer(apiClient, currentItemId).then(function () { + closeDialog(true); + }); + }); + context.querySelector('form').addEventListener('submit', onSubmit); } @@ -85,18 +78,20 @@ var apiClient = connectionManager.getApiClient(currentServerId); apiClient.getLiveTvTimer(id).then(function (result) { - renderTimer(context, result); + renderTimer(context, result, apiClient); loading.hide(); }); } - function showEditor(itemId, serverId) { + function showEditor(itemId, serverId, options) { return new Promise(function (resolve, reject) { - recordingUpdated = false; + recordingDeleted = false; currentServerId = serverId; loading.show(); + options = options || {}; + currentResolve = resolve; require(['text!./recordingeditor.template.html'], function (template) { @@ -108,7 +103,6 @@ if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } else { - dialogOptions.size = 'small'; } var dlg = dialogHelper.createDialog(dialogOptions); @@ -116,23 +110,37 @@ dlg.classList.add('formDialog'); dlg.classList.add('recordingDialog'); + if (!layoutManager.tv) { + dlg.style['min-width'] = '20%'; + dlg.classList.add('dialog-fullscreen-lowres'); + } + var html = ''; html += globalize.translateDocument(template, 'sharedcomponents'); dlg.innerHTML = html; + if (options.enableCancel === false) { + dlg.querySelector('.formDialogFooter').classList.add('hide'); + } + currentDialog = dlg; + dlg.addEventListener('closing', function () { + + if (!recordingDeleted) { + dlg.querySelector('.btnSubmit').click(); + } + }); + dlg.addEventListener('close', function () { - if (recordingUpdated) { + if (recordingDeleted) { resolve({ updated: true, - deleted: false + deleted: true }); - } else { - reject(); } }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html index c12dfbff3..ce0d6316c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html @@ -1,35 +1,44 @@ 

- ${Edit} + ${HeaderRecordingOptions}

-

-

-

-

-

- -

-


- +
+
+ +
+
+ ${MinutesBefore} +
+
- +
+
+ +
+
+ ${MinutesAfter} +
+

- +
diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js new file mode 100644 index 000000000..45eb855b1 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js @@ -0,0 +1,329 @@ +define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button'], function (globalize, connectionManager, require, loading, appHost, dom, recordingHelper, events) { + + function getRegistration(apiClient, programId, feature) { + + loading.show(); + + return apiClient.getJSON(apiClient.getUrl('LiveTv/Registration', { + + ProgramId: programId, + Feature: feature + + })).then(function (result) { + + loading.hide(); + return result; + + }, function () { + + loading.hide(); + + return { + TrialVersion: true, + IsValid: true, + IsRegistered: false + }; + }); + } + + function showConvertRecordingsUnlockMessage(context, apiClient) { + + apiClient.getPluginSecurityInfo().then(function (regInfo) { + + if (regInfo.IsMBSupporter) { + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } else { + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); + } + + }, function () { + + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); + }); + } + + function showSeriesRecordingFields(context, programId, apiClient) { + + getRegistration(apiClient, programId, 'seriesrecordings').then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.supporterContainer').classList.add('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + + } else { + + context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings'); + context.querySelector('.supporterContainer').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } + }); + } + + function getDvrFeatureCode() { + + return appHost.dvrFeatureCode || 'dvr'; + } + + function showSingleRecordingFields(context, programId, apiClient) { + + getRegistration(apiClient, programId, getDvrFeatureCode()).then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.supporterContainer').classList.add('hide'); + showConvertRecordingsUnlockMessage(context, apiClient); + } else { + + context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired'); + context.querySelector('.supporterContainer').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } + }); + } + + function showRecordingFieldsContainer(context, programId, apiClient) { + + getRegistration(apiClient, programId, getDvrFeatureCode()).then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.recordingFields').classList.remove('hide'); + } else { + + context.querySelector('.recordingFields').classList.add('hide'); + } + }); + } + + function loadData(parent, program, apiClient) { + + if (program.IsSeries) { + parent.querySelector('.recordSeriesContainer').classList.remove('hide'); + } else { + parent.querySelector('.recordSeriesContainer').classList.add('hide'); + } + + if (program.SeriesTimerId != null) { + showSeriesRecordingFields(parent, program.Id, apiClient); + } else { + showSingleRecordingFields(parent, program.Id, apiClient); + } + + if (program.SeriesTimerId) { + parent.querySelector('.btnManageSeriesRecording').classList.remove('visibilityHide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#CancelSeries'); + } else { + parent.querySelector('.btnManageSeriesRecording').classList.add('visibilityHide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#RecordSeries'); + } + + if (program.TimerId && program.Status != 'Cancelled') { + parent.querySelector('.btnManageRecording').classList.remove('visibilityHide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#DoNotRecord'); + } else { + parent.querySelector('.btnManageRecording').classList.add('visibilityHide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#Record'); + } + } + + function fetchData(instance) { + + var options = instance.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + showRecordingFieldsContainer(options.parent, options.programId, apiClient); + + return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { + + instance.TimerId = program.TimerId; + instance.Status = program.Status; + instance.SeriesTimerId = program.SeriesTimerId; + + loadData(options.parent, program, apiClient); + }); + } + + function recordingEditor(options) { + this.options = options; + this.embed(); + } + + function onSupporterButtonClick() { + if (appHost.supports('externalpremium')) { + shell.openUrl('https://emby.media/premiere'); + } else { + + } + } + + function onManageRecordingClick(e) { + + var options = this.options; + + if (!this.TimerId || this.Status == 'Cancelled') { + return; + } + + var self = this; + + require(['recordingEditor'], function (recordingEditor) { + + recordingEditor.show(self.TimerId, options.serverId, { + + enableCancel: false + + }).then(function () { + self.changed = true; + }); + }); + } + + function onManageSeriesRecordingClick(e) { + + var options = this.options; + + if (!this.SeriesTimerId) { + return; + } + + var self = this; + + require(['seriesRecordingEditor'], function (seriesRecordingEditor) { + + seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { + + enableCancel: false + + }).then(function () { + self.changed = true; + }); + }); + } + + function onRecordChange(e) { + + this.changed = true; + + var self = this; + var options = this.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + var button = dom.parentWithTag(e.target, 'BUTTON'); + var isChecked = !button.querySelector('i').classList.contains('recordingIcon-active'); + + var hasEnabledTimer = this.TimerId && this.Status != 'Cancelled'; + + if (isChecked) { + if (!hasEnabledTimer) { + loading.show(); + recordingHelper.createRecording(apiClient, options.programId, false).then(function () { + events.trigger(self, 'recordingchanged'); + fetchData(self); + loading.hide(); + }); + } + } else { + if (hasEnabledTimer) { + loading.show(); + recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () { + events.trigger(self, 'recordingchanged'); + fetchData(self); + loading.hide(); + }); + } + } + } + + function sendToast(msg) { + require(['toast'], function (toast) { + toast(msg); + }); + } + + function onRecordSeriesChange(e) { + + this.changed = true; + + var self = this; + var options = this.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + var button = dom.parentWithTag(e.target, 'BUTTON'); + var isChecked = !button.querySelector('i').classList.contains('recordingIcon-active'); + + if (isChecked) { + showSeriesRecordingFields(options.parent, options.programId, apiClient); + + if (!this.SeriesTimerId) { + + var promise = this.TimerId ? + recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) : + recordingHelper.createRecording(apiClient, options.programId, true); + + promise.then(function () { + fetchData(self); + }); + } + } else { + + showSingleRecordingFields(options.parent, options.programId, apiClient); + + if (this.SeriesTimerId) { + apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () { + sendToast(globalize.translate('sharedcomponents#RecordingCancelled')); + fetchData(self); + }); + } + } + } + + recordingEditor.prototype.embed = function () { + + var self = this; + + return new Promise(function (resolve, reject) { + + require(['text!./recordingfields.template.html'], function (template) { + + var options = self.options; + var context = options.parent; + context.innerHTML = globalize.translateDocument(template, 'sharedcomponents'); + + var supporterButtons = context.querySelectorAll('.btnSupporter'); + for (var i = 0, length = supporterButtons.length; i < length; i++) { + if (appHost.supports('externalpremium')) { + supporterButtons[i].classList.remove('hide'); + } else { + supporterButtons[i].classList.add('hide'); + } + supporterButtons[i].addEventListener('click', onSupporterButtonClick); + } + + context.querySelector('.singleRecordingButton').addEventListener('click', onRecordChange.bind(self)); + context.querySelector('.seriesRecordingButton').addEventListener('click', onRecordSeriesChange.bind(self)); + context.querySelector('.btnManageRecording').addEventListener('click', onManageRecordingClick.bind(self)); + context.querySelector('.btnManageSeriesRecording').addEventListener('click', onManageSeriesRecordingClick.bind(self)); + + fetchData(self).then(resolve); + }); + }); + }; + + recordingEditor.prototype.hasChanged = function () { + + return this.changed; + }; + + recordingEditor.prototype.refresh = function () { + + fetchData(this); + }; + + recordingEditor.prototype.destroy = function () { + + }; + + return recordingEditor; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html new file mode 100644 index 000000000..c45dcc38a --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html @@ -0,0 +1,86 @@ + + +
+

${HeaderConvertYourRecordings}

+
${PromoConvertRecordingsToStreamingFormat}
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js new file mode 100644 index 000000000..60d17a95f --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js @@ -0,0 +1,161 @@ +define(['globalize', 'loading'], function (globalize, loading) { + + function changeRecordingToSeries(apiClient, timerId, programId) { + + loading.show(); + + apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { + + if (item.IsSeries) { + // cancel, then create series + cancelTimer(apiClient, timerId, false).then(function () { + apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { + + apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { + + loading.hide(); + sendToast(globalize.translate('sharedcomponents#SeriesRecordingScheduled')); + }); + }); + }); + } else { + // cancel + cancelTimer(apiClient, timerId, true); + } + }); + } + + function cancelTimerWithConfirmation(timerId, serverId) { + + return new Promise(function (resolve, reject) { + + require(['confirm'], function (confirm) { + + confirm({ + + text: globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), + primary: 'cancel', + confirmText: globalize.translate('sharedcomponents#HeaderCancelRecording'), + cancelText: globalize.translate('sharedcomponents#HeaderKeepRecording') + + }).then(function () { + + loading.show(); + + var apiClient = connectionManager.getApiClient(serverId); + apiClient.cancelLiveTvTimer(timerId).then(function () { + + require(['toast'], function (toast) { + toast(globalize.translate('sharedcomponents#RecordingCancelled')); + }); + + loading.hide(); + resolve(); + }, reject); + + }, reject); + }); + }); + } + + function cancelSeriesTimerWithConfirmation(timerId, serverId) { + + return new Promise(function (resolve, reject) { + + require(['confirm'], function (confirm) { + + confirm({ + + text: globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), + primary: 'cancel', + confirmText: globalize.translate('sharedcomponents#HeaderCancelSeries'), + cancelText: globalize.translate('sharedcomponents#HeaderKeepSeries') + + }).then(function () { + + loading.show(); + + var apiClient = connectionManager.getApiClient(serverId); + apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { + + require(['toast'], function (toast) { + toast(globalize.translate('sharedcomponents#SeriesCancelled')); + }); + + loading.hide(); + resolve(); + }, reject); + + }, reject); + }); + }); + } + + function cancelTimer(apiClient, timerId, hideLoading) { + loading.show(); + return apiClient.cancelLiveTvTimer(timerId).then(function () { + + if (hideLoading) { + loading.hide(); + sendToast(globalize.translate('sharedcomponents#RecordingCancelled')); + } + }); + } + + function createRecording(apiClient, programId, isSeries) { + + loading.show(); + return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { + + var promise = isSeries ? + apiClient.createLiveTvSeriesTimer(item) : + apiClient.createLiveTvTimer(item); + + return promise.then(function () { + + loading.hide(); + sendToast(globalize.translate('sharedcomponents#RecordingScheduled')); + }); + }); + } + + function sendToast(msg) { + require(['toast'], function (toast) { + toast(msg); + }); + } + + function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) { + + var apiClient = connectionManager.getApiClient(serverId); + + var hasTimer = timerId && timerStatus != 'Cancelled'; + + if (seriesTimerId && hasTimer) { + + // cancel + return cancelTimer(apiClient, timerId, true); + + } else if (hasTimer && programId) { + + // change to series recording, if possible + // otherwise cancel individual recording + return changeRecordingToSeries(apiClient, timerId, programId); + + } else if (programId) { + // schedule recording + return createRecording(apiClient, programId); + } else { + return Promise.reject(); + } + } + + return { + cancelTimer: cancelTimer, + createRecording: createRecording, + changeRecordingToSeries: changeRecordingToSeries, + toggleRecording: toggleRecording, + cancelTimerWithConfirmation: cancelTimerWithConfirmation, + cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.js new file mode 100644 index 000000000..15e7fe645 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.js @@ -0,0 +1,257 @@ +define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) { + + var currentDialog; + var recordingUpdated = false; + var recordingDeleted = false; + var currentItemId; + var currentServerId; + + function deleteTimer(apiClient, timerId) { + + return new Promise(function (resolve, reject) { + + require(['recordingHelper'], function (recordingHelper) { + + recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); + }); + }); + } + + function renderTimer(context, item, apiClient) { + + var program = item.ProgramInfo || {}; + + context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; + context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; + + context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one'; + context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original'; + + context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all'; + context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary; + context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0; + + if (item.ChannelName || item.ChannelNumber) { + context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('sharedcomponents#ChannelNameOnly', item.ChannelName || item.ChannelNumber); + } else { + context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('sharedcomponents#AllChannels'); + } + + context.querySelector('.optionAroundTime').innerHTML = globalize.translate('sharedcomponents#AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); + + loading.hide(); + } + + function closeDialog(isDeleted) { + + recordingUpdated = true; + recordingDeleted = isDeleted; + + dialogHelper.close(currentDialog); + } + + function onSubmit(e) { + + var form = this; + + var apiClient = connectionManager.getApiClient(currentServerId); + + apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) { + + item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; + item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; + item.RecordAnyChannel = form.querySelector('.selectChannels').value == 'all'; + item.RecordAnyTime = form.querySelector('.selectAirTime').value == 'any'; + item.RecordNewOnly = form.querySelector('.selectShowType').value == 'new'; + item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked; + item.KeepUpTo = form.querySelector('.selectKeepUpTo').value; + + apiClient.updateLiveTvSeriesTimer(item); + }); + + e.preventDefault(); + + // Disable default form submission + return false; + } + + function init(context) { + + fillKeepUpTo(context); + + context.querySelector('.btnCancel').addEventListener('click', function () { + + closeDialog(false); + }); + + context.querySelector('.btnCancelRecording').addEventListener('click', function () { + + var apiClient = connectionManager.getApiClient(currentServerId); + deleteTimer(apiClient, currentItemId).then(function () { + closeDialog(true); + }); + }); + + context.querySelector('form').addEventListener('submit', onSubmit); + } + + function reload(context, id) { + + loading.show(); + currentItemId = id; + + var apiClient = connectionManager.getApiClient(currentServerId); + apiClient.getLiveTvSeriesTimer(id).then(function (result) { + + renderTimer(context, result, apiClient); + loading.hide(); + }); + } + + function fillKeepUpTo(context) { + + var html = ''; + + for (var i = 0; i <= 50; i++) { + + var text; + + if (i == 0) { + text = globalize.translate('sharedcomponents#AsManyAsPossible'); + } else if (i == 1) { + text = globalize.translate('sharedcomponents#ValueOneEpisode'); + } else { + text = globalize.translate('sharedcomponents#ValueEpisodeCount', i); + } + + html += ''; + } + + context.querySelector('.selectKeepUpTo').innerHTML = html; + } + + function embed(itemId, serverId, options) { + + recordingUpdated = false; + recordingDeleted = false; + currentServerId = serverId; + loading.show(); + options = options || {}; + + require(['text!./seriesrecordingeditor.template.html'], function (template) { + + var dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + var dlg = options.context; + + dlg.classList.add('hide'); + dlg.innerHTML = globalize.translateDocument(template, 'sharedcomponents'); + + dlg.querySelector('.formDialogHeader').classList.add('hide'); + dlg.querySelector('.formDialogFooter').classList.add('hide'); + dlg.querySelector('.formDialogContent').className = ''; + dlg.querySelector('.dialogContentInner').className = ''; + dlg.classList.remove('hide'); + + dlg.addEventListener('change', function () { + dlg.querySelector('.btnSubmit').click(); + }); + + currentDialog = dlg; + + init(dlg); + + reload(dlg, itemId); + }); + } + + function showEditor(itemId, serverId, options) { + + return new Promise(function (resolve, reject) { + + recordingUpdated = false; + recordingDeleted = false; + currentServerId = serverId; + loading.show(); + options = options || {}; + + require(['text!./seriesrecordingeditor.template.html'], function (template) { + + var dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + var dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); + + if (!layoutManager.tv) { + dlg.style['min-width'] = '20%'; + } + + var html = ''; + + html += globalize.translateDocument(template, 'sharedcomponents'); + + dlg.innerHTML = html; + + if (options.enableCancel === false) { + dlg.querySelector('.formDialogFooter').classList.add('hide'); + } + + currentDialog = dlg; + + dlg.addEventListener('closing', function () { + + if (!recordingDeleted) { + this.querySelector('.btnSubmit').click(); + } + }); + + dlg.addEventListener('close', function () { + + if (recordingUpdated) { + resolve({ + updated: true, + deleted: recordingDeleted + }); + } else { + reject(); + } + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + init(dlg); + + reload(dlg, itemId); + + dialogHelper.open(dlg); + }); + }); + } + + return { + show: showEditor, + embed: embed + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.template.html new file mode 100644 index 000000000..464be5c89 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.template.html @@ -0,0 +1,79 @@ +
+ +

+ ${HeaderSeriesOptions} +

+
+ +
+
+ +
+
+ +
+ +
+ +
${SkipEpisodesAlreadyInMyLibraryHelp}
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ ${MinutesBefore} +
+
+
+
+
+
+ +
+
+ ${MinutesAfter} +
+
+
+
+ +
+ + +
+ +
+
+
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/router.js b/dashboard-ui/bower_components/emby-webcomponents/router.js index 658f90e99..18a6a6704 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/router.js +++ b/dashboard-ui/bower_components/emby-webcomponents/router.js @@ -108,7 +108,7 @@ define(['loading', 'dom', 'viewManager', 'skinManager', 'pluginManager', 'backdr var url = route.contentPath || route.path; - if (url.toLowerCase().indexOf('http') != 0 && url.indexOf('file:') != 0) { + if (url.indexOf('://') == -1) { // Put a slash at the beginning but make sure to avoid a double slash if (url.indexOf('/') != 0) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js index abb38832e..d3df3261e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js +++ b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js @@ -1,4 +1,4 @@ -define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, layoutManager, dom) { +define(['browser', 'layoutManager', 'dom', 'focusManager', 'scrollStyles'], function (browser, layoutManager, dom, focusManager) { /** * Return type of the value. @@ -19,21 +19,6 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l return typeof value; } - /** - * Event preventDefault & stopPropagation helper. - * - * @param {Event} event Event object. - * @param {Bool} noBubbles Cancel event bubbling. - * - * @return {Void} - */ - function stopDefault(event, noBubbles) { - event.preventDefault(); - if (noBubbles) { - event.stopPropagation(); - } - } - /** * Disables an event it was triggered on and unbinds itself. * @@ -43,7 +28,8 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l */ function disableOneEvent(event) { /*jshint validthis:true */ - stopDefault(event, 1); + event.preventDefault(); + event.stopPropagation(); this.removeEventListener(event.type, disableOneEvent); } @@ -599,7 +585,7 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l if (!isTouch) { // prevents native image dragging in Firefox - stopDefault(event); + event.preventDefault(); } // Reset dragging object @@ -676,7 +662,7 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l } } - stopDefault(event); + event.preventDefault(); // Disable click on a source element, as it is unwelcome when dragging if (!dragging.locked && dragging.path > dragging.pathToLock && dragging.slidee) { @@ -821,6 +807,11 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l passive: true }); + dom.removeEventListener(frameElement, 'click', onFrameClick, { + passive: true, + capture: true + }); + dragSourceElement.removeEventListener('mousedown', dragInitSlidee); // Reset initialized status and return the instance @@ -840,6 +831,15 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l } } + function onFrameClick(e) { + if (e.which == 1) { + var focusableParent = focusManager.focusableParent(e.target); + if (focusableParent && focusableParent != document.activeElement) { + focusableParent.focus(); + } + } + } + /** * Initialize. * @@ -914,6 +914,11 @@ define(['browser', 'layoutManager', 'dom', 'scrollStyles'], function (browser, l }); } + dom.addEventListener(frameElement, 'click', onFrameClick, { + passive: true, + capture: true + }); + // Mark instance as initialized self.initialized = 1; diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js index 882fa4650..3fdc9b7de 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js @@ -1,10 +1,11 @@ -define(['dialogHelper', 'layoutManager', 'globalize', './social-share-kit-1.0.4/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.4/dist/css/social-share-kit.css', 'emby-button'], function (dialogHelper, layoutManager, globalize) { +define(['dialogHelper', 'layoutManager', 'globalize', './social-share-kit-1.0.10/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.10/dist/css/social-share-kit.css', 'emby-button'], function (dialogHelper, layoutManager, globalize) { function showMenu(options) { var dlg = dialogHelper.createDialog({ removeOnClose: true, - autoFocus: layoutManager.tv + autoFocus: layoutManager.tv, + modal: false }); dlg.id = 'dlg' + new Date().getTime(); @@ -12,18 +13,18 @@ html += '

' + Globalize.translate('Share') + '

'; - html += '
'; html += '
'; // We can only do facebook if we can guarantee that the current page is available over the internet, since FB will try to probe it. - html += ''; + html += ''; - html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; html += '
'; - html += '
'; - html += ''; - html += '
'; + dlg.style['padding'] = '.5em 1.5em 1.5em'; dlg.innerHTML = html; @@ -31,15 +32,6 @@ var shareInfo = options.share; - SocialShareKit.init({ - selector: '#' + dlg.id + ' .ssk', - url: shareInfo.Url, - title: shareInfo.Name, - text: shareInfo.Overview, - image: shareInfo.ImageUrl, - via: 'Emby' - }); - function onSskButtonClick(e) { isShared = true; dialogHelper.close(dlg); @@ -51,25 +43,24 @@ sskButtons[i].addEventListener('click', onSskButtonClick); } - // Has to be assigned a z-index after the call to .open() - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - - var promise = new Promise(function (resolve, reject) { - - dlg.addEventListener('close', function () { - if (isShared) { - resolve(); - } else { - reject(); - } + dlg.addEventListener('open', function() { + SocialShareKit.init({ + selector: '#' + dlg.id + ' .ssk', + url: shareInfo.Url, + title: shareInfo.Name, + text: shareInfo.Overview, + image: shareInfo.ImageUrl, + via: 'Emby' }); }); - dialogHelper.open(dlg); - - return promise; + return dialogHelper.open(dlg).then(function() { + if (isShared) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + }); } return { diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/LICENSE b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/LICENSE similarity index 100% rename from dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/LICENSE rename to dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/LICENSE diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css new file mode 100644 index 000000000..3c5e29fd0 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css @@ -0,0 +1,7 @@ +/*! + * Social Share Kit v1.0.7 (http://socialsharekit.com) + * Copyright 2015 Social Share Kit / Kaspars Sprogis. + * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * https://github.com/darklow/social-share-kit/blob/master/LICENSE + * --- + */@font-face{font-family:'social-share-kit';src:url('../fonts/social-share-kit.eot');src:url('../fonts/social-share-kit.eot?#iefix') format('embedded-opentype'),url('../fonts/social-share-kit.woff') format('woff'),url('../fonts/social-share-kit.ttf') format('truetype'),url('../fonts/social-share-kit.svg#social-share-kit') format('svg');font-weight:normal;font-style:normal}.ssk:before{display:inline-block;font-family:"social-share-kit" !important;font-style:normal !important;font-weight:normal !important;font-variant:normal !important;text-transform:none !important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssk-facebook:before{content:"a";text-indent:4px;margin-right:-4px}.ssk-twitter:before{content:"b"}.ssk-google-plus:before{content:"v"}.ssk-google-plus-old:before{content:"c"}.ssk-email:before{content:"d";top:-1px;position:relative}.ssk-pinterest:before{content:"e"}.ssk-tumblr:before{content:"f"}.ssk-linkedin:before{content:"g"}.ssk-github:before{content:"h"}.ssk-vk:before{content:"i"}.ssk-instagram:before{content:"j"}.ssk-amazon:before{content:"k"}.ssk-skype:before{content:"s"}.ssk-youtube:before{content:"x"}.ssk-vimeo:before{content:"u"}.ssk-ebay:before{content:"p"}.ssk-apple:before{content:"l"}.ssk-behance:before{content:"q"}.ssk-dribble:before{content:"n"}.ssk-android:before{content:"o"}.ssk-whatsapp:before{content:"m"}.ssk-reddit:before{content:"r"}.ssk-reddit2:before{content:"t"}.ssk{background-color:#757575;color:white;display:inline-block;font-size:22px;line-height:1px;margin-right:2px;margin-bottom:2px;padding:7px;text-align:center;text-decoration:none;transition:background-color .1s;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-ms-transition:background-color .1s;-o-transition:background-color .1s}.ssk:before,.ssk .glyphicon,.ssk .fa{position:relative;font-size:22px;top:0;vertical-align:middle}.ssk.ssk-xs,.ssk-xs>.ssk{padding:4px}.ssk.ssk-xs:before,.ssk-xs>.ssk:before,.ssk.ssk-xs .glyphicon,.ssk-xs>.ssk .glyphicon,.ssk.ssk-xs .fa,.ssk-xs>.ssk .fa{font-size:15px}.ssk.ssk-sm,.ssk-sm>.ssk{padding:5px}.ssk.ssk-sm:before,.ssk-sm>.ssk:before,.ssk.ssk-sm .glyphicon,.ssk-sm>.ssk .glyphicon,.ssk.ssk-sm .fa,.ssk-sm>.ssk .fa{font-size:20px}.ssk.ssk-lg,.ssk-lg>.ssk{padding:9px}.ssk.ssk-lg:before,.ssk-lg>.ssk:before,.ssk.ssk-lg .glyphicon,.ssk-lg>.ssk .glyphicon,.ssk.ssk-lg .fa,.ssk-lg>.ssk .fa{font-size:28px}.ssk:last-child{margin-right:0}.ssk:hover{background-color:#424242}.ssk:hover,.ssk:focus{color:#fff;text-decoration:none}.ssk.ssk-round,.ssk-round .ssk{border-radius:50%}.ssk.ssk-round:before,.ssk-round .ssk:before{text-indent:0;margin-right:0}.ssk.ssk-rounded,.ssk-rounded .ssk{border-radius:15%}.ssk.ssk-icon{color:#757575;padding:2px;font-size:24px}.ssk.ssk-icon,.ssk.ssk-icon:hover{background-color:transparent}.ssk.ssk-icon:hover{color:#424242}.ssk.ssk-icon.ssk-xs,.ssk-xs>.ssk.ssk-icon{font-size:16px}.ssk.ssk-icon.ssk-sm,.ssk-sm>.ssk.ssk-icon{font-size:20px}.ssk.ssk-icon.ssk-lg,.ssk-lg>.ssk.ssk-icon{font-size:28px}.ssk.ssk-text{overflow:hidden;font-size:17px;line-height:normal;padding-right:10px}.ssk.ssk-text:before,.ssk.ssk-text .glyphicon,.ssk.ssk-text .fa{margin:-7px 10px -7px -7px;padding:7px;background-color:rgba(0,0,0,0.15);vertical-align:bottom;text-indent:0}.ssk-block .ssk.ssk-text{display:block;margin-right:0;text-align:left}.ssk.ssk-text.ssk-xs,.ssk-xs>.ssk.ssk-text{font-size:12px;padding-right:6px}.ssk.ssk-text.ssk-xs:before,.ssk-xs>.ssk.ssk-text:before,.ssk.ssk-text.ssk-xs .glyphicon,.ssk-xs>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-xs .fa,.ssk-xs>.ssk.ssk-text .fa{margin:-4px 6px -4px -4px;padding:4px}.ssk.ssk-text.ssk-sm,.ssk-sm>.ssk.ssk-text{font-size:16px;padding-right:7px}.ssk.ssk-text.ssk-sm:before,.ssk-sm>.ssk.ssk-text:before,.ssk.ssk-text.ssk-sm .glyphicon,.ssk-sm>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-sm .fa,.ssk-sm>.ssk.ssk-text .fa{margin:-5px 7px -5px -5px;padding:5px}.ssk.ssk-text.ssk-lg,.ssk-lg>.ssk.ssk-text{font-size:22px;padding-right:13px}.ssk.ssk-text.ssk-lg:before,.ssk-lg>.ssk.ssk-text:before,.ssk.ssk-text.ssk-lg .glyphicon,.ssk-lg>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-lg .fa,.ssk-lg>.ssk.ssk-text .fa{margin:-9px 13px -9px -9px;padding:9px}.ssk-group,.ssk-sticky{font-size:0}.ssk-sticky{top:0;position:fixed;z-index:2000}.ssk-sticky .ssk{transition:padding .1s ease-out;-webkit-transition:padding .1s ease-out;-moz-transition:padding .1s ease-out;-ms-transition:padding .1s ease-out;-o-transition:padding .1s ease-out;margin:0}@media (min-width:768px){.ssk-sticky.ssk-left .ssk,.ssk-sticky.ssk-right .ssk{display:block;clear:both}.ssk-sticky.ssk-left.ssk-center,.ssk-sticky.ssk-right.ssk-center{top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%)}.ssk-sticky.ssk-left{left:0}.ssk-sticky.ssk-left .ssk{float:left}.ssk-sticky.ssk-left .ssk:hover{padding-left:15px}.ssk-sticky.ssk-right{right:0}.ssk-sticky.ssk-right .ssk{float:right}.ssk-sticky.ssk-right .ssk:hover{padding-right:15px}}.ssk-sticky.ssk-bottom{font-size:0;top:auto;bottom:0}.ssk-sticky.ssk-bottom.ssk-center{left:50%;right:auto;transform:translateX(-50%);-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%)}.ssk-sticky.ssk-bottom .ssk{vertical-align:bottom}.ssk-sticky.ssk-bottom .ssk:hover{padding-bottom:15px}.ssk-sticky.ssk-round.ssk-xs .ssk:hover{padding:8px}.ssk-sticky.ssk-round.ssk-sm .ssk:hover{padding:9px}.ssk-sticky.ssk-round .ssk:hover{padding:11px}.ssk-sticky.ssk-round.ssk-lg .ssk:hover{padding:13px}@media (max-width:767px){.ssk-sticky{left:0;right:0;bottom:0;top:auto;width:100%;display:flex !important;flex-direction:row;flex-wrap:nowrap}.ssk-sticky.ssk-sticky-hide-xs{display:none !important}.ssk-sticky .ssk{flex:1;width:auto}.ssk-sticky .ssk .ssk-num{display:none}}.ssk-count{padding-top:20px}.ssk-count .ssk{position:relative}.ssk-count .ssk-num{border-radius:4px;color:#8f8f8f;background-color:rgba(50,50,50,0.03);display:block;font-size:12px;left:0;line-height:20px;position:absolute;right:0;text-align:center;top:-20px}@media (min-width:768px){.ssk-count.ssk-sticky{padding-top:0}.ssk-count.ssk-sticky.ssk-left .ssk-num,.ssk-count.ssk-sticky.ssk-right .ssk-num{top:20%;background-color:transparent}.ssk-count.ssk-sticky.ssk-left .ssk-num{left:100%;margin-left:5px}.ssk-count.ssk-sticky.ssk-right .ssk-num{right:115%;margin-left:-100%;text-align:right}}.ssk-facebook{background-color:#255c95}.ssk-grayscale>.ssk-facebook{background-color:#757575}.ssk-facebook:hover{background-color:#1b436c}.ssk-facebook:hover{background-color:#1b436c}.ssk-grayscale>.ssk-facebook:hover{background-color:#255c95}.ssk-facebook.ssk-icon{color:#255c95}.ssk-facebook.ssk-icon:hover{color:#1b436c}.ssk-facebook.ssk-icon:before{text-indent:0;margin-right:0}.ssk-twitter{background-color:#00b4e0}.ssk-grayscale>.ssk-twitter{background-color:#757575}.ssk-twitter:hover{background-color:#008bad}.ssk-twitter:hover{background-color:#008bad}.ssk-grayscale>.ssk-twitter:hover{background-color:#00b4e0}.ssk-twitter.ssk-icon{color:#00b4e0}.ssk-twitter.ssk-icon:hover{color:#008bad}.ssk-google-plus{background-color:#f1403a}.ssk-grayscale>.ssk-google-plus{background-color:#757575}.ssk-google-plus:hover{background-color:#e81810}.ssk-google-plus:hover{background-color:#e81810}.ssk-grayscale>.ssk-google-plus:hover{background-color:#f1403a}.ssk-google-plus.ssk-icon{color:#f1403a}.ssk-google-plus.ssk-icon:hover{color:#e81810}.ssk-pinterest{background-color:#cb2027}.ssk-grayscale>.ssk-pinterest{background-color:#757575}.ssk-pinterest:hover{background-color:#9f191f}.ssk-pinterest:hover{background-color:#9f191f}.ssk-grayscale>.ssk-pinterest:hover{background-color:#cb2027}.ssk-pinterest.ssk-icon{color:#cb2027}.ssk-pinterest.ssk-icon:hover{color:#9f191f}.ssk-tumblr{background-color:#395773}.ssk-grayscale>.ssk-tumblr{background-color:#757575}.ssk-tumblr:hover{background-color:#283d51}.ssk-tumblr:hover{background-color:#283d51}.ssk-grayscale>.ssk-tumblr:hover{background-color:#395773}.ssk-tumblr.ssk-icon{color:#395773}.ssk-tumblr.ssk-icon:hover{color:#283d51}.ssk-email{background-color:#757575}.ssk-grayscale>.ssk-email{background-color:#757575}.ssk-email:hover{background-color:#5b5b5b}.ssk-email:hover{background-color:#5b5b5b}.ssk-grayscale>.ssk-email:hover{background-color:#757575}.ssk-grayscale>.ssk-email:hover{background-color:#5b5b5b}.ssk-email.ssk-icon{color:#757575}.ssk-email.ssk-icon:hover{color:#5b5b5b}.ssk-vk{background-color:#54769a}.ssk-grayscale>.ssk-vk{background-color:#757575}.ssk-vk:hover{background-color:#425d79}.ssk-vk:hover{background-color:#425d79}.ssk-grayscale>.ssk-vk:hover{background-color:#54769a}.ssk-vk.ssk-icon{color:#54769a}.ssk-vk.ssk-icon:hover{color:#425d79}.ssk-linkedin{background-color:#1c87bd}.ssk-grayscale>.ssk-linkedin{background-color:#757575}.ssk-linkedin:hover{background-color:#156791}.ssk-linkedin:hover{background-color:#156791}.ssk-grayscale>.ssk-linkedin:hover{background-color:#1c87bd}.ssk-linkedin.ssk-icon{color:#1c87bd}.ssk-linkedin.ssk-icon:hover{color:#156791}.ssk-whatsapp{background-color:#34AF23}.ssk-grayscale>.ssk-whatsapp{background-color:#757575}.ssk-whatsapp:hover{background-color:#27851a}.ssk-whatsapp:hover{background-color:#27851a}.ssk-grayscale>.ssk-whatsapp:hover{background-color:#34AF23}.ssk-whatsapp.ssk-icon{color:#34AF23}.ssk-whatsapp.ssk-icon:hover{color:#27851a}.ssk-reddit{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit{background-color:#757575}.ssk-reddit:hover{background-color:#3a80c1}.ssk-reddit:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit:hover{background-color:#5f99cf}.ssk-reddit.ssk-icon{color:#5f99cf}.ssk-reddit.ssk-icon:hover{color:#3a80c1}.ssk-reddit2{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit2{background-color:#757575}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit2:hover{background-color:#5f99cf}.ssk-reddit2.ssk-icon{color:#5f99cf}.ssk-reddit2.ssk-icon:hover{color:#3a80c1}.ssk-turquoise{background-color:#1abc9c}.ssk-turquoise:hover{background-color:#148f77}.ssk-emerald{background-color:#2ecc71}.ssk-emerald:hover{background-color:#25a25a}.ssk-peter-river{background-color:#3498db}.ssk-peter-river:hover{background-color:#217dbb}.ssk-belize-hole{background-color:#2980b9}.ssk-belize-hole:hover{background-color:#20638f}.ssk-amethyst{background-color:#9b59b6}.ssk-amethyst:hover{background-color:#804399}.ssk-wisteria{background-color:#8e44ad}.ssk-wisteria:hover{background-color:#703688}.ssk-wet-asphalt{background-color:#34495e}.ssk-wet-asphalt:hover{background-color:#222f3d}.ssk-midnight-blue{background-color:#2c3e50}.ssk-midnight-blue:hover{background-color:#1a242f}.ssk-green-sea{background-color:#16a085}.ssk-green-sea:hover{background-color:#107360}.ssk-nephritis{background-color:#27ae60}.ssk-nephritis:hover{background-color:#1e8449}.ssk-sunflower{background-color:#f1c40f}.ssk-sunflower:hover{background-color:#c29d0b}.ssk-orange{background-color:#f39c12}.ssk-orange:hover{background-color:#c87f0a}.ssk-carrot{background-color:#e67e22}.ssk-carrot:hover{background-color:#bf6516}.ssk-pumpkin{background-color:#d35400}.ssk-pumpkin:hover{background-color:#a04000}.ssk-alizarin{background-color:#e74c3c}.ssk-alizarin:hover{background-color:#d62c1a}.ssk-pomegranate{background-color:#c0392b}.ssk-pomegranate:hover{background-color:#962d22}.ssk-clouds{background-color:#cfd9db}.ssk-clouds:hover{background-color:#b1c2c6}.ssk-concrete{background-color:#95a5a6}.ssk-concrete:hover{background-color:#798d8f}.ssk-silver{background-color:#bdc3c7}.ssk-silver:hover{background-color:#a1aab0}.ssk-asbestos{background-color:#7f8c8d}.ssk-asbestos:hover{background-color:#667273}.ssk-dark-gray{background-color:#555}.ssk-dark-gray:hover{background-color:#3b3b3b}.ssk-black{background-color:#333}.ssk-black:hover{background-color:#1a1a1a} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot new file mode 100644 index 000000000..a9d69c604 Binary files /dev/null and b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg new file mode 100644 index 000000000..a6ec16e06 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg @@ -0,0 +1,33 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf new file mode 100644 index 000000000..a6f445873 Binary files /dev/null and b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff new file mode 100644 index 000000000..f03624afd Binary files /dev/null and b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js similarity index 52% rename from dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.js rename to dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js index 3f605b157..8432d5367 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.js +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js @@ -1,43 +1,118 @@ /*! - * Social Share Kit v1.0.3 (http://socialsharekit.com) + * Social Share Kit v1.0.10 (http://socialsharekit.com) * Copyright 2015 Social Share Kit / Kaspars Sprogis. - * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * @Licensed under Creative Commons Attribution-NonCommercial 3.0 license: * https://github.com/darklow/social-share-kit/blob/master/LICENSE * --- */ var SocialShareKit = (function () { - var els, options, supportsShare, urlsToCount = {}, sep = '*|*'; + var supportsShare = /(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/, + sep = '*|*', wrap, _wrap; - function init(opts) { - options = opts || {}; - supportsShare = /(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/; - ready(function () { - els = $(options.selector || '.ssk'); - if (!els.length) - return; + // Wrapper to support multiple instances per page by selector + _wrap = function (opts) { + var options = opts || {}, + selector = options.selector || '.ssk'; + this.nodes = $(selector); + this.options = options; + }; - each(els, function (el) { - var network = elSupportsShare(el), uniqueKey; - if (!network) { + // Instance related functions + _wrap.prototype = { + share: function () { + var els = this.nodes, + options = this.options, + urlsToCount = {}; + + ready(function () { + if (!els.length) return; - } - removeEventListener(el, 'click', onClick); - addEventListener(el, 'click', onClick); - // Gather icons with share counts - if (el.parentNode.className.indexOf('ssk-count') !== -1) { - //networksToCount.push(network); - network = network[0]; - uniqueKey = network + sep + getShareUrl(network, el); - if (!(uniqueKey in urlsToCount)) { - urlsToCount[uniqueKey] = []; + each(els, function (el) { + var network = elSupportsShare(el), uniqueKey; + if (!network) { + return; } - urlsToCount[uniqueKey].push(el); - } + removeEventListener(el, 'click', onClick); + addEventListener(el, 'click', onClick); + + // Gather icons with share counts + if (el.parentNode.className.indexOf('ssk-count') !== -1) { + network = network[0]; + uniqueKey = network + sep + getShareUrl(options, network, el); + if (!(uniqueKey in urlsToCount)) { + urlsToCount[uniqueKey] = []; + } + urlsToCount[uniqueKey].push(el); + } + }); + + processShareCount(); }); - processShareCount(); - }); + function onClick(e) { + var target = preventDefault(e), + match = elSupportsShare(target), + network = match[0], + url; + + if (!match) + return; + + url = getUrl(options, network, target); + if (!url) + return; + + // To use Twitter intent events, replace URL and use Twitter native share JS + if (window.twttr && target.getAttribute('href').indexOf('twitter.com/intent/') !== -1) { + target.setAttribute('href', url); + return; + } + + if (network != 'email') { + var win = winOpen(url); + + if (options.onOpen) { + options.onOpen(target, network, url, win); + } + + if (options.onClose) { + var closeInt = window.setInterval(function () { + if (win.closed !== false) { + window.clearInterval(closeInt); + options.onClose(target, network, url, win); + } + }, 250); + } + + } else { + document.location = url; + } + } + + function processShareCount() { + var a, ref; + for (a in urlsToCount) { + ref = a.split(sep); + (function (els) { + getCount(ref[0], ref[1], options, function (cnt) { + for (var c in els) + addCount(els[c], cnt); + }); + })(urlsToCount[a]); + } + } + + return this.nodes; + } + }; + + wrap = function (selector) { + return new _wrap(selector); + }; + + function init(opts) { + return wrap(opts).share(); } function ready(fn) { @@ -83,21 +158,6 @@ var SocialShareKit = (function () { return el.className.match(supportsShare); } - function onClick(e) { - var target = preventDefault(e), - match = elSupportsShare(target), url; - if (!match) - return; - - url = getUrl(match[0], target); - if (!url) - return; - if (match[0] != 'email') { - winOpen(url); - } else { - document.location = url; - } - } function preventDefault(e) { var evt = e || window.event; // IE8 compatibility @@ -107,7 +167,7 @@ var SocialShareKit = (function () { evt.returnValue = false; evt.cancelBubble = true; } - return evt.target || evt.srcElement; + return evt.currentTarget || evt.srcElement; } function winOpen(url) { @@ -116,63 +176,79 @@ var SocialShareKit = (function () { top = (document.documentElement.clientHeight - height) / 2, opts = 'status=1,resizable=yes' + ',width=' + width + ',height=' + height + - ',top=' + top + ',left=' + left; - win = window.open(url, '', opts); + ',top=' + top + ',left=' + left, + win = window.open(url, '', opts); win.focus(); return win; } - function getUrl(network, el) { - var url, dataOpts = getDataOpts(network, el), - shareUrl = getShareUrl(network, el, dataOpts), - shareUrlEnc = encodeURIComponent(shareUrl), + function getUrl(options, network, el) { + var url, dataOpts = getDataOpts(options, network, el), + shareUrl = getShareUrl(options, network, el, dataOpts), title = typeof dataOpts['title'] !== 'undefined' ? dataOpts['title'] : getTitle(network), text = typeof dataOpts['text'] !== 'undefined' ? dataOpts['text'] : getText(network), - image = dataOpts['image'], via = dataOpts['via']; + image = dataOpts['image'] ? dataOpts['image'] : getMetaContent('og:image'), + via = typeof dataOpts['via'] !== 'undefined' ? dataOpts['via'] : getMetaContent('twitter:site'), + paramsObj = { + shareUrl: shareUrl, + title: title, + text: text, + image: image, + via: via, + options: options, + shareUrlEncoded: function () { + return encodeURIComponent(this.shareUrl); + } + }; switch (network) { case 'facebook': - url = 'https://www.facebook.com/share.php?u=' + shareUrlEnc; + url = 'https://www.facebook.com/share.php?u=' + paramsObj.shareUrlEncoded(); break; case 'twitter': - url = 'https://twitter.com/share?url=' + shareUrlEnc + - '&text=' + encodeURIComponent(title + (text && title ? ' - ' : '') + text); - via = via || getMetaContent('twitter:site'); + url = 'https://twitter.com/intent/tweet?url=' + paramsObj.shareUrlEncoded() + + '&text=' + encodeURIComponent(title + (text && title ? ' - ' : '') + text); if (via) url += '&via=' + via.replace('@', ''); break; case 'google-plus': - url = 'https://plus.google.com/share?url=' + shareUrlEnc; + url = 'https://plus.google.com/share?url=' + paramsObj.shareUrlEncoded(); break; case 'pinterest': - url = 'http://pinterest.com/pin/create/button/?url=' + shareUrlEnc + - '&description=' + encodeURIComponent(text); - image = image || getMetaContent('og:image'); + url = 'https://pinterest.com/pin/create/button/?url=' + paramsObj.shareUrlEncoded() + + '&description=' + encodeURIComponent(text); if (image) url += '&media=' + encodeURIComponent(image); break; case 'tumblr': - url = 'http://www.tumblr.com/share/link?url=' + shareUrlEnc + - '&name=' + encodeURIComponent(title) + - '&description=' + encodeURIComponent(text); + url = 'https://www.tumblr.com/share/link?url=' + paramsObj.shareUrlEncoded() + + '&name=' + encodeURIComponent(title) + + '&description=' + encodeURIComponent(text); break; case 'linkedin': - url = 'http://www.linkedin.com/shareArticle?mini=true&url=' + shareUrlEnc + - '&title=' + encodeURIComponent(title) + - '&summary=' + encodeURIComponent(text); + url = 'https://www.linkedin.com/shareArticle?mini=true&url=' + paramsObj.shareUrlEncoded() + + '&title=' + encodeURIComponent(title) + + '&summary=' + encodeURIComponent(text); break; case 'vk': - url = 'http://vkontakte.ru/share.php?url=' + shareUrlEnc; + url = 'https://vkontakte.ru/share.php?url=' + paramsObj.shareUrlEncoded(); break; case 'email': url = 'mailto:?subject=' + encodeURIComponent(title) + - '&body=' + encodeURIComponent(title + '\n' + shareUrl + '\n\n' + text + '\n'); + '&body=' + encodeURIComponent(title + '\n' + shareUrl + '\n\n' + text + '\n'); break; } - return url; + + paramsObj.networkUrl = url; + + if (options.onBeforeOpen) { + options.onBeforeOpen(el, network, paramsObj) + } + + return paramsObj.networkUrl; } - function getShareUrl(network, el, dataOpts) { - dataOpts = dataOpts || getDataOpts(network, el); + function getShareUrl(options, network, el, dataOpts) { + dataOpts = dataOpts || getDataOpts(options, network, el); return dataOpts['url'] || window.location.href; } @@ -198,7 +274,7 @@ var SocialShareKit = (function () { return text || '' } - function getDataOpts(network, el) { + function getDataOpts(options, network, el) { var validOpts = ['url', 'title', 'text', 'image'], opts = {}, optValue, optKey, dataKey, a, parent = el.parentNode; network == 'twitter' && validOpts.push('via'); @@ -206,7 +282,7 @@ var SocialShareKit = (function () { optKey = validOpts[a]; dataKey = 'data-' + optKey; optValue = el.getAttribute(dataKey) || parent.getAttribute(dataKey) || - (options[network] && typeof options[network][optKey] != 'undefined' ? options[network][optKey] : options[optKey]); + (options[network] && typeof options[network][optKey] != 'undefined' ? options[network][optKey] : options[optKey]); if (typeof optValue != 'undefined') { opts[optKey] = optValue; } @@ -214,18 +290,6 @@ var SocialShareKit = (function () { return opts; } - function processShareCount() { - var a, ref; - for (a in urlsToCount) { - ref = a.split(sep); - (function (els) { - getCount(ref[0], ref[1], function (cnt) { - for (var c in els) - addCount(els[c], cnt); - }); - })(urlsToCount[a]); - } - } function addCount(el, cnt) { var newEl = document.createElement('div'); @@ -234,27 +298,26 @@ var SocialShareKit = (function () { el.appendChild(newEl); } - function getCount(network, shareUrl, onReady) { + function getCount(network, shareUrl, options, onReady) { var url, parseFunc, body, shareUrlEnc = encodeURIComponent(shareUrl); switch (network) { case 'facebook': - url = 'http://graph.facebook.com/?id=' + shareUrlEnc; + url = 'https://graph.facebook.com/?id=' + shareUrlEnc; parseFunc = function (r) { - return onReady(r.shares ? r.shares : 0); + return onReady(r.share ? r.share.share_count : 0); }; break; case 'twitter': - url = 'http://cdn.api.twitter.com/1/urls/count.json?url=' + shareUrlEnc; - parseFunc = function (r) { - return onReady(r.count); - }; + if (options && options.twitter && options.twitter.countCallback) { + options.twitter.countCallback(shareUrl, onReady); + } break; case 'google-plus': url = 'https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ'; body = "[{\"method\":\"pos.plusones.get\",\"id\":\"p\"," + - "\"params\":{\"id\":\"" + shareUrl + "\",\"userId\":\"@viewer\",\"groupId\":\"@self\",\"nolog\":true}," + - "\"jsonrpc\":\"2.0\",\"key\":\"p\",\"apiVersion\":\"v1\"}]"; + "\"params\":{\"id\":\"" + shareUrl + "\",\"userId\":\"@viewer\",\"groupId\":\"@self\",\"nolog\":true}," + + "\"jsonrpc\":\"2.0\",\"key\":\"p\",\"apiVersion\":\"v1\"}]"; parseFunc = function (r) { r = JSON.parse(r); if (r.length) { @@ -264,19 +327,19 @@ var SocialShareKit = (function () { ajax(url, parseFunc, body); return; case 'linkedin': - url = 'http://www.linkedin.com/countserv/count/share?url=' + shareUrlEnc; + url = 'https://www.linkedin.com/countserv/count/share?url=' + shareUrlEnc; parseFunc = function (r) { return onReady(r.count); }; break; case 'pinterest': - url = 'http://api.pinterest.com/v1/urls/count.json?url=' + shareUrlEnc; + url = 'https://api.pinterest.com/v1/urls/count.json?url=' + shareUrlEnc; parseFunc = function (r) { return onReady(r.count); }; break; case 'vk': - url = 'http://vk.com/share.php?act=count&url=' + shareUrlEnc; + url = 'https://vk.com/share.php?act=count&url=' + shareUrlEnc; parseFunc = function (r) { return onReady(r); }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js new file mode 100644 index 000000000..9d23f80f6 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js @@ -0,0 +1,8 @@ +/*! + * Social Share Kit v1.0.10 (http://socialsharekit.com) + * Copyright 2015 Social Share Kit / Kaspars Sprogis. + * @Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * https://github.com/darklow/social-share-kit/blob/master/LICENSE + * --- + */ +var SocialShareKit=function(){function e(e){return k(e).share()}function t(e){"loading"!=document.readyState?e():document.addEventListener?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&e()})}function n(e){return document.querySelectorAll(e)}function o(e,t){for(var n=0;n=200&&this.status<400&&t(this.responseText)},o.open("POST",e,!0),o.setRequestHeader("Content-Type","application/json"),o.send(n)}function g(e,t,n){var o="cb_"+e+"_"+Math.round(1e5*Math.random()),r=document.createElement("script");return window[o]=function(e){try{delete window[o]}catch(e){}document.body.removeChild(r),n(e)},"vk"==e?window.VK={Share:{count:function(e,t){window[o](t)}}}:"google-plus"==e&&(window.services={gplus:{cb:window[o]}}),r.src=t+(t.indexOf("?")>=0?"&":"?")+"callback="+o,document.body.appendChild(r),!0}var k,b,y=/(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/,C="*|*";return b=function(e){var t=e||{},o=t.selector||".ssk";this.nodes=n(o),this.options=t},b.prototype={share:function(){function e(e){var t,n=c(e),o=a(n),r=o[0];if(o&&(t=s(p,r,n))){if(window.twttr&&n.getAttribute("href").indexOf("twitter.com/intent/")!==-1)return void n.setAttribute("href",t);if("email"!=r){var i=u(t);if(p.onOpen&&p.onOpen(n,r,t,i),p.onClose)var d=window.setInterval(function(){i.closed!==!1&&(window.clearInterval(d),p.onClose(n,r,t,i))},250)}else document.location=t}}function n(){var e,t;for(e in h)t=e.split(C),function(e){w(t[0],t[1],p,function(t){for(var n in e)m(e[n],t)})}(h[e])}var l=this.nodes,p=this.options,h={};return t(function(){l.length&&(o(l,function(t){var n,o=a(t);o&&(i(t,"click",e),r(t,"click",e),t.parentNode.className.indexOf("ssk-count")!==-1&&(o=o[0],n=o+C+d(p,o,t),n in h||(h[n]=[]),h[n].push(t)))}),n())}),this.nodes}},k=function(e){return new b(e)},{init:e}}();window.SocialShareKit=SocialShareKit; diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css deleted file mode 100644 index dfa18d9b8..000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Social Share Kit v1.0.3 (http://socialsharekit.com) - * Copyright 2015 Social Share Kit / Kaspars Sprogis. - * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: - * https://github.com/darklow/social-share-kit/blob/master/LICENSE - * --- - */@font-face{font-family:'social-share-kit';src:url('../fonts/social-share-kit.eot');src:url('../fonts/social-share-kit.eot?#iefix') format('embedded-opentype'),url('../fonts/social-share-kit.woff') format('woff'),url('../fonts/social-share-kit.ttf') format('truetype'),url('../fonts/social-share-kit.svg#social-share-kit') format('svg');font-weight:normal;font-style:normal}.ssk:before{display:inline-block;font-family:"social-share-kit" !important;font-style:normal !important;font-weight:normal !important;font-variant:normal !important;text-transform:none !important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssk-facebook:before{content:"a";text-indent:4px;margin-right:-4px}.ssk-twitter:before{content:"b"}.ssk-google-plus:before{content:"c"}.ssk-email:before{content:"d";top:-1px;position:relative}.ssk-pinterest:before{content:"e"}.ssk-tumblr:before{content:"f"}.ssk-linkedin:before{content:"g"}.ssk-github:before{content:"h"}.ssk-vk:before{content:"i"}.ssk-instagram:before{content:"j"}.ssk-amazon:before{content:"k"}.ssk-skype:before{content:"s"}.ssk-youtube:before{content:"x"}.ssk-vimeo:before{content:"u"}.ssk-ebay:before{content:"p"}.ssk-apple:before{content:"l"}.ssk-behance:before{content:"q"}.ssk-dribble:before{content:"n"}.ssk-android:before{content:"o"}.ssk-whatsapp:before{content:"m"}.ssk-reddit:before{content:"r"}.ssk-reddit2:before{content:"t"}.ssk{background-color:#757575;color:white;display:inline-block;font-size:22px;line-height:1px;margin-right:2px;margin-bottom:2px;padding:7px;text-align:center;text-decoration:none;transition:background-color .1s;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-ms-transition:background-color .1s;-o-transition:background-color .1s}.ssk:before,.ssk .glyphicon,.ssk .fa{position:relative;font-size:22px;top:0;vertical-align:middle}.ssk.ssk-xs,.ssk-xs>.ssk{padding:4px}.ssk.ssk-xs:before,.ssk-xs>.ssk:before,.ssk.ssk-xs .glyphicon,.ssk-xs>.ssk .glyphicon,.ssk.ssk-xs .fa,.ssk-xs>.ssk .fa{font-size:15px}.ssk.ssk-sm,.ssk-sm>.ssk{padding:5px}.ssk.ssk-sm:before,.ssk-sm>.ssk:before,.ssk.ssk-sm .glyphicon,.ssk-sm>.ssk .glyphicon,.ssk.ssk-sm .fa,.ssk-sm>.ssk .fa{font-size:20px}.ssk.ssk-lg,.ssk-lg>.ssk{padding:9px}.ssk.ssk-lg:before,.ssk-lg>.ssk:before,.ssk.ssk-lg .glyphicon,.ssk-lg>.ssk .glyphicon,.ssk.ssk-lg .fa,.ssk-lg>.ssk .fa{font-size:28px}.ssk:last-child{margin-right:0}.ssk:hover{background-color:#424242}.ssk:hover,.ssk:focus{color:#fff;text-decoration:none}.ssk.ssk-round,.ssk-round .ssk{border-radius:50%}.ssk.ssk-round:before,.ssk-round .ssk:before{text-indent:0;margin-right:0}.ssk.ssk-rounded,.ssk-rounded .ssk{border-radius:15%}.ssk.ssk-icon{color:#757575;padding:2px;font-size:24px}.ssk.ssk-icon,.ssk.ssk-icon:hover{background-color:transparent}.ssk.ssk-icon:hover{color:#424242}.ssk.ssk-icon.ssk-xs,.ssk-xs>.ssk.ssk-icon{font-size:16px}.ssk.ssk-icon.ssk-sm,.ssk-sm>.ssk.ssk-icon{font-size:20px}.ssk.ssk-icon.ssk-lg,.ssk-lg>.ssk.ssk-icon{font-size:28px}.ssk.ssk-text{overflow:hidden;font-size:17px;line-height:normal;padding-right:10px}.ssk.ssk-text:before,.ssk.ssk-text .glyphicon,.ssk.ssk-text .fa{margin:-7px 10px -7px -7px;padding:7px;background-color:rgba(0,0,0,0.15);vertical-align:bottom;text-indent:0}.ssk-block .ssk.ssk-text{display:block;margin-right:0;text-align:left}.ssk.ssk-text.ssk-xs,.ssk-xs>.ssk.ssk-text{font-size:12px;padding-right:6px}.ssk.ssk-text.ssk-xs:before,.ssk-xs>.ssk.ssk-text:before,.ssk.ssk-text.ssk-xs .glyphicon,.ssk-xs>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-xs .fa,.ssk-xs>.ssk.ssk-text .fa{margin:-4px 6px -4px -4px;padding:4px}.ssk.ssk-text.ssk-sm,.ssk-sm>.ssk.ssk-text{font-size:16px;padding-right:7px}.ssk.ssk-text.ssk-sm:before,.ssk-sm>.ssk.ssk-text:before,.ssk.ssk-text.ssk-sm .glyphicon,.ssk-sm>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-sm .fa,.ssk-sm>.ssk.ssk-text .fa{margin:-5px 7px -5px -5px;padding:5px}.ssk.ssk-text.ssk-lg,.ssk-lg>.ssk.ssk-text{font-size:22px;padding-right:13px}.ssk.ssk-text.ssk-lg:before,.ssk-lg>.ssk.ssk-text:before,.ssk.ssk-text.ssk-lg .glyphicon,.ssk-lg>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-lg .fa,.ssk-lg>.ssk.ssk-text .fa{margin:-9px 13px -9px -9px;padding:9px}.ssk-group,.ssk-sticky{font-size:0}.ssk-sticky{top:0;position:fixed;z-index:2000}.ssk-sticky .ssk{transition:padding .1s ease-out;-webkit-transition:padding .1s ease-out;-moz-transition:padding .1s ease-out;-ms-transition:padding .1s ease-out;-o-transition:padding .1s ease-out;margin:0}.ssk-sticky.ssk-left .ssk,.ssk-sticky.ssk-right .ssk{display:block;clear:both}.ssk-sticky.ssk-left.ssk-center,.ssk-sticky.ssk-right.ssk-center{top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%)}.ssk-sticky.ssk-left{left:0}.ssk-sticky.ssk-left .ssk{float:left}.ssk-sticky.ssk-left .ssk:hover{padding-left:15px}.ssk-sticky.ssk-right{right:0}.ssk-sticky.ssk-right .ssk{float:right}.ssk-sticky.ssk-right .ssk:hover{padding-right:15px}.ssk-sticky.ssk-bottom{font-size:0;top:auto;bottom:0}.ssk-sticky.ssk-bottom.ssk-center{left:50%;right:auto;transform:translateX(-50%);-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%)}.ssk-sticky.ssk-bottom .ssk{vertical-align:bottom}.ssk-sticky.ssk-bottom .ssk:hover{padding-bottom:15px}.ssk-sticky.ssk-round.ssk-xs .ssk:hover{padding:8px}.ssk-sticky.ssk-round.ssk-sm .ssk:hover{padding:9px}.ssk-sticky.ssk-round .ssk:hover{padding:11px}.ssk-sticky.ssk-round.ssk-lg .ssk:hover{padding:13px}@media (max-width:767px){.ssk-sticky{display:none}}.ssk-count{padding-top:20px}.ssk-count .ssk{position:relative}.ssk-count .ssk-num{border-radius:4px;color:#8f8f8f;background-color:rgba(50,50,50,0.03);display:block;font-size:12px;left:0;line-height:20px;position:absolute;right:0;text-align:center;top:-20px}.ssk-count.ssk-sticky{padding-top:0}.ssk-count.ssk-sticky.ssk-left .ssk-num,.ssk-count.ssk-sticky.ssk-right .ssk-num{top:20%;background-color:transparent}.ssk-count.ssk-sticky.ssk-left .ssk-num{left:100%;margin-left:5px}.ssk-count.ssk-sticky.ssk-right .ssk-num{right:115%;margin-left:-100%;text-align:right}.ssk-facebook{background-color:#255c95}.ssk-grayscale>.ssk-facebook{background-color:#757575}.ssk-facebook:hover{background-color:#1b436c}.ssk-facebook:hover{background-color:#1b436c}.ssk-grayscale>.ssk-facebook:hover{background-color:#255c95}.ssk-facebook.ssk-icon{color:#255c95}.ssk-facebook.ssk-icon:hover{color:#1b436c}.ssk-facebook.ssk-icon:before{text-indent:0;margin-right:0}.ssk-twitter{background-color:#00b4e0}.ssk-grayscale>.ssk-twitter{background-color:#757575}.ssk-twitter:hover{background-color:#008bad}.ssk-twitter:hover{background-color:#008bad}.ssk-grayscale>.ssk-twitter:hover{background-color:#00b4e0}.ssk-twitter.ssk-icon{color:#00b4e0}.ssk-twitter.ssk-icon:hover{color:#008bad}.ssk-google-plus{background-color:#f1403a}.ssk-grayscale>.ssk-google-plus{background-color:#757575}.ssk-google-plus:hover{background-color:#e81810}.ssk-google-plus:hover{background-color:#e81810}.ssk-grayscale>.ssk-google-plus:hover{background-color:#f1403a}.ssk-google-plus.ssk-icon{color:#f1403a}.ssk-google-plus.ssk-icon:hover{color:#e81810}.ssk-pinterest{background-color:#cb2027}.ssk-grayscale>.ssk-pinterest{background-color:#757575}.ssk-pinterest:hover{background-color:#9f191f}.ssk-pinterest:hover{background-color:#9f191f}.ssk-grayscale>.ssk-pinterest:hover{background-color:#cb2027}.ssk-pinterest.ssk-icon{color:#cb2027}.ssk-pinterest.ssk-icon:hover{color:#9f191f}.ssk-tumblr{background-color:#395773}.ssk-grayscale>.ssk-tumblr{background-color:#757575}.ssk-tumblr:hover{background-color:#283d51}.ssk-tumblr:hover{background-color:#283d51}.ssk-grayscale>.ssk-tumblr:hover{background-color:#395773}.ssk-tumblr.ssk-icon{color:#395773}.ssk-tumblr.ssk-icon:hover{color:#283d51}.ssk-email{background-color:#757575}.ssk-grayscale>.ssk-email{background-color:#757575}.ssk-email:hover{background-color:#5b5b5b}.ssk-email:hover{background-color:#5b5b5b}.ssk-grayscale>.ssk-email:hover{background-color:#757575}.ssk-grayscale>.ssk-email:hover{background-color:#5b5b5b}.ssk-email.ssk-icon{color:#757575}.ssk-email.ssk-icon:hover{color:#5b5b5b}.ssk-vk{background-color:#54769a}.ssk-grayscale>.ssk-vk{background-color:#757575}.ssk-vk:hover{background-color:#425d79}.ssk-vk:hover{background-color:#425d79}.ssk-grayscale>.ssk-vk:hover{background-color:#54769a}.ssk-vk.ssk-icon{color:#54769a}.ssk-vk.ssk-icon:hover{color:#425d79}.ssk-linkedin{background-color:#1c87bd}.ssk-grayscale>.ssk-linkedin{background-color:#757575}.ssk-linkedin:hover{background-color:#156791}.ssk-linkedin:hover{background-color:#156791}.ssk-grayscale>.ssk-linkedin:hover{background-color:#1c87bd}.ssk-linkedin.ssk-icon{color:#1c87bd}.ssk-linkedin.ssk-icon:hover{color:#156791}.ssk-whatsapp{background-color:#34af23}.ssk-grayscale>.ssk-whatsapp{background-color:#757575}.ssk-whatsapp:hover{background-color:#27851a}.ssk-whatsapp:hover{background-color:#27851a}.ssk-grayscale>.ssk-whatsapp:hover{background-color:#34af23}.ssk-whatsapp.ssk-icon{color:#34af23}.ssk-whatsapp.ssk-icon:hover{color:#27851a}.ssk-reddit{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit{background-color:#757575}.ssk-reddit:hover{background-color:#3a80c1}.ssk-reddit:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit:hover{background-color:#5f99cf}.ssk-reddit.ssk-icon{color:#5f99cf}.ssk-reddit.ssk-icon:hover{color:#3a80c1}.ssk-reddit2{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit2{background-color:#757575}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit2:hover{background-color:#5f99cf}.ssk-reddit2.ssk-icon{color:#5f99cf}.ssk-reddit2.ssk-icon:hover{color:#3a80c1}.ssk-turquoise{background-color:#1abc9c}.ssk-turquoise:hover{background-color:#148f77}.ssk-emerald{background-color:#2ecc71}.ssk-emerald:hover{background-color:#25a25a}.ssk-peter-river{background-color:#3498db}.ssk-peter-river:hover{background-color:#217dbb}.ssk-belize-hole{background-color:#2980b9}.ssk-belize-hole:hover{background-color:#20638f}.ssk-amethyst{background-color:#9b59b6}.ssk-amethyst:hover{background-color:#804399}.ssk-wisteria{background-color:#8e44ad}.ssk-wisteria:hover{background-color:#703688}.ssk-wet-asphalt{background-color:#34495e}.ssk-wet-asphalt:hover{background-color:#222f3d}.ssk-midnight-blue{background-color:#2c3e50}.ssk-midnight-blue:hover{background-color:#1a242f}.ssk-green-sea{background-color:#16a085}.ssk-green-sea:hover{background-color:#107360}.ssk-nephritis{background-color:#27ae60}.ssk-nephritis:hover{background-color:#1e8449}.ssk-sunflower{background-color:#f1c40f}.ssk-sunflower:hover{background-color:#c29d0b}.ssk-orange{background-color:#f39c12}.ssk-orange:hover{background-color:#c87f0a}.ssk-carrot{background-color:#e67e22}.ssk-carrot:hover{background-color:#bf6516}.ssk-pumpkin{background-color:#d35400}.ssk-pumpkin:hover{background-color:#a04000}.ssk-alizarin{background-color:#e74c3c}.ssk-alizarin:hover{background-color:#d62c1a}.ssk-pomegranate{background-color:#c0392b}.ssk-pomegranate:hover{background-color:#962d22}.ssk-clouds{background-color:#cfd9db}.ssk-clouds:hover{background-color:#b1c2c6}.ssk-concrete{background-color:#95a5a6}.ssk-concrete:hover{background-color:#798d8f}.ssk-silver{background-color:#bdc3c7}.ssk-silver:hover{background-color:#a1aab0}.ssk-asbestos{background-color:#7f8c8d}.ssk-asbestos:hover{background-color:#667273}.ssk-dark-gray{background-color:#555}.ssk-dark-gray:hover{background-color:#3b3b3b}.ssk-black{background-color:#333}.ssk-black:hover{background-color:#1a1a1a} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot deleted file mode 100644 index 0adc05206..000000000 Binary files a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot and /dev/null differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg deleted file mode 100644 index 910cdcad4..000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Generated by Fontastic.me - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf deleted file mode 100644 index d3547e18e..000000000 Binary files a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf and /dev/null differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff deleted file mode 100644 index 12cc6b542..000000000 Binary files a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff and /dev/null differ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js deleted file mode 100644 index d105532f6..000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Social Share Kit v1.0.3 (http://socialsharekit.com) - * Copyright 2015 Social Share Kit / Kaspars Sprogis. - * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: - * https://github.com/darklow/social-share-kit/blob/master/LICENSE - * --- - */ -;var SocialShareKit=(function(){var f,d,v,t={},q="*|*";function x(A){d=A||{};v=/(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/;n(function(){f=g(d.selector||".ssk");if(!f.length){return}e(f,function(C){var D=s(C),B;if(!D){return}r(C,"click",h);p(C,"click",h);if(C.parentNode.className.indexOf("ssk-count")!==-1){D=D[0];B=D+q+z(D,C);if(!(B in t)){t[B]=[]}t[B].push(C)}});j()})}function n(A){if(document.readyState!="loading"){A()}else{if(document.addEventListener){document.addEventListener("DOMContentLoaded",A)}else{document.attachEvent("onreadystatechange",function(){if(document.readyState!="loading"){A()}})}}}function g(A){return document.querySelectorAll(A)}function e(C,B){for(var A=0;A=200&&this.status<400){D(this.responseText)}}};C.open("POST",B,true);C.setRequestHeader("Content-Type","application/json");C.send(A)}function b(C,B,E){var D="cb_"+C+"_"+Math.round(100000*Math.random()),A=document.createElement("script");window[D]=function(F){try{delete window[D]}catch(G){}document.body.removeChild(A);E(F)};if(C=="vk"){window.VK={Share:{count:function(G,F){window[D](F)}}}}else{if(C=="google-plus"){window.services={gplus:{cb:window[D]}}}}A.src=B+(B.indexOf("?")>=0?"&":"?")+"callback="+D;document.body.appendChild(A);return true}return{init:x}})();window.SocialShareKit=SocialShareKit; \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js index 92370dd4b..41f0d204b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js +++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js @@ -1,4 +1,4 @@ -define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'globalize', 'loading', 'dom'], function (playbackManager, inputManager, connectionManager, embyRouter, globalize, loading, dom) { +define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'globalize', 'loading', 'dom', 'recordingHelper'], function (playbackManager, inputManager, connectionManager, embyRouter, globalize, loading, dom, recordingHelper) { function playAllFromHere(card, serverId, queue) { @@ -91,6 +91,14 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g embyRouter.showItem(item, options); } + function showProgramDialog(item) { + + require(['recordingCreator'], function (recordingCreator) { + + recordingCreator.show(item.Id, item.ServerId); + }); + } + function getItem(button) { button = dom.parentWithAttribute(button, 'data-id'); @@ -103,6 +111,9 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g if (type == 'Timer') { return apiClient.getLiveTvTimer(id); } + if (type == 'SeriesTimer') { + return apiClient.getLiveTvSeriesTimer(id); + } return apiClient.getItem(apiClient.getCurrentUserId(), id); } @@ -168,6 +179,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g return { Type: card.getAttribute('data-type'), Id: card.getAttribute('data-id'), + TimerId: card.getAttribute('data-timerid'), CollectionType: card.getAttribute('data-collectiontype'), ChannelId: card.getAttribute('data-channelid'), SeriesId: card.getAttribute('data-seriesid'), @@ -217,6 +229,11 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g }); } + else if (action == 'programdialog') { + + showProgramDialog(item); + } + else if (action == 'instantmix') { playbackManager.instantMix(id, serverId); } @@ -299,10 +316,17 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g var serverId = apiClient.serverInfo().Id; if (item.Type == 'Timer') { - require(['recordingEditor'], function (recordingEditor) { + if (item.ProgramId) { + require(['recordingCreator'], function (recordingCreator) { - recordingEditor.show(item.Id, serverId).then(resolve, reject); - }); + recordingCreator.show(item.ProgramId, serverId).then(resolve, reject); + }); + } else { + require(['recordingEditor'], function (recordingEditor) { + + recordingEditor.show(item.Id, serverId).then(resolve, reject); + }); + } } else { require(['metadataEditor'], function (metadataEditor) { @@ -314,80 +338,13 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g function onRecordCommand(serverId, id, type, timerId, seriesTimerId) { - var apiClient = connectionManager.getApiClient(serverId); + if (type == 'Program' || timerId || seriesTimerId) { - if (seriesTimerId && timerId) { - - // cancel - cancelTimer(apiClient, timerId, true); - - } else if (timerId) { - - // change to series recording, if possible - // otherwise cancel individual recording - changeRecordingToSeries(apiClient, timerId, id); - - } else if (type == 'Program') { - // schedule recording - createRecording(apiClient, id); + var programId = type == 'Program' ? id : null; + recordingHelper.toggle(serverId, programId, timerId, seriesTimerId); } } - function changeRecordingToSeries(apiClient, timerId, programId) { - - loading.show(); - - apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { - - if (item.IsSeries) { - // cancel, then create series - cancelTimer(apiClient, timerId, false).then(function () { - apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { - - apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { - - loading.hide(); - sendToast(globalize.translate('sharedcomponents#SeriesRecordingScheduled')); - }); - }); - }); - } else { - // cancel - cancelTimer(apiClient, timerId, true); - } - }); - } - - function cancelTimer(apiClient, timerId, hideLoading) { - loading.show(); - return apiClient.cancelLiveTvTimer(timerId).then(function () { - - if (hideLoading) { - loading.hide(); - sendToast(globalize.translate('sharedcomponents#RecordingCancelled')); - } - }); - } - - function createRecording(apiClient, programId) { - - loading.show(); - apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { - - apiClient.createLiveTvTimer(item).then(function () { - - loading.hide(); - sendToast(globalize.translate('sharedcomponents#RecordingScheduled')); - }); - }); - } - - function sendToast(msg) { - require(['toast'], function (toast) { - toast(msg); - }); - } - function onClick(e) { var card = dom.parentWithClass(e.target, 'itemAction'); @@ -413,12 +370,15 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g } function onCommand(e) { + var cmd = e.detail.command; if (cmd == 'play' || cmd == 'record' || cmd == 'menu' || cmd == 'info') { var card = dom.parentWithClass(e.target, 'itemAction'); if (card) { + e.preventDefault(); + e.stopPropagation(); executeAction(card, card, cmd); } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/slideshow/slideshow.js b/dashboard-ui/bower_components/emby-webcomponents/slideshow/slideshow.js index e66473631..5d59eb5cc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/slideshow/slideshow.js +++ b/dashboard-ui/bower_components/emby-webcomponents/slideshow/slideshow.js @@ -497,12 +497,14 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f case 'left': if (!isOsdOpen()) { e.preventDefault(); + e.stopPropagation(); previousImage(); } break; case 'right': if (!isOsdOpen()) { e.preventDefault(); + e.stopPropagation(); nextImage(); } break; diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json index 26435439c..41a87c51d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "\u0627\u0644\u0633\u0628\u062a", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "\u062a\u062e\u0632\u064a\u0646", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json index 683e3697c..a9777a201 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438", @@ -39,16 +47,11 @@ "Saturday": "\u0421\u044a\u0431\u043e\u0442\u0430", "Days": "\u0414\u043d\u0438", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "\u041f\u0440\u0435\u0434\u0435\u043d \u0431\u0430\u043b\u0430\u0441\u0442 \u0432 \u043c\u0438\u043d\u0443\u0442\u0438:", - "LabelPostPaddingMinutes": "\u0417\u0430\u0434\u0435\u043d \u0431\u0430\u043b\u0430\u0441\u0442 \u0432 \u043c\u0438\u043d\u0443\u0442\u0438:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "\u0417\u0430\u043f\u0438\u0441\u0432\u0430\u0439 \u0441\u0430\u043c\u043e \u043d\u043e\u0432\u0438 \u0435\u043f\u0438\u0437\u043e\u0434\u0438", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u0417\u0430\u043f\u0438\u0448\u0438", "Save": "\u0417\u0430\u043f\u043e\u043c\u043d\u0438", "Edit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json index 717fb9a84..77caf214f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Afegeix", @@ -39,16 +47,11 @@ "Saturday": "Dissabte", "Days": "Dies", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Minuts d'espaiat anterior:", - "LabelPostPaddingMinutes": "Minuts d'espaiat posterior:", - "RecordOnAllChannels": "Enregistra a tots els canals", - "RecordAnytime": "Enregistra en qualsevol moment", - "RecordOnlyNewEpisodes": "Enregistra nom\u00e9s nous episodis", "HeaderBecomeProjectSupporter": "Obtenir Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Grava", "Save": "Desa", "Edit": "Edita", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "Per editar m\u00faltiples mitjans multim\u00e8dia simplement fes clic i mantingues premut sobre qualsevol cartell i despr\u00e9s selecciona els \u00edtems que vulguis gestionar. Prova-ho!", "HeaderConfirmRecordingCancellation": "Confirmar Cancel\u00b7laci\u00f3 de l'Enregistrament", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json index 12fb02f7f..59c79dc56 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "P\u0159idat", @@ -39,16 +47,11 @@ "Saturday": "Sobota", "Days": "Dny", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Minuty nahr\u00e1van\u00e9 p\u0159ed za\u010d\u00e1tkem nahr\u00e1v\u00e1n\u00ed", - "LabelPostPaddingMinutes": "Minuty nahr\u00e1van\u00e9 po skon\u010den\u00ed nahr\u00e1v\u00e1n\u00ed.", - "RecordOnAllChannels": "Z\u00e1znam na v\u0161ech kan\u00e1lech", - "RecordAnytime": "Nahr\u00e1vat kdykoliv", - "RecordOnlyNewEpisodes": "Nahr\u00e1vat pouze nov\u00e9 epizody", "HeaderBecomeProjectSupporter": "Z\u00edskat Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere je zapot\u0159eb\u00ed pro vytvo\u0159en\u00ed automatick\u00e9ho nahr\u00e1v\u00e1n\u00ed \u0159ad.", - "OptionConvertRecordingsToStreamingFormat": "Automaticky prov\u00e1d\u011bt konverzi do podporovan\u00fdch streamov\u00fdch form\u00e1t\u016f", - "OptionConvertRecordingsToStreamingFormatHelp": "Nahr\u00e1vky budou p\u0159i p\u0159ehr\u00e1v\u00e1n\u00ed p\u0159eved\u011bny do MP4 pro snadn\u00e9 p\u0159ehr\u00e1v\u00e1n\u00ed na va\u0161ich za\u0159\u00edzen\u00edch.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Tato funkce vy\u017eaduje aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Nahr\u00e1vat", "Save": "Ulo\u017eit", "Edit": "Upravit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Ozna\u010dit nep\u0159ehran\u00e9", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Vyberte nejm\u00e9n\u011b dv\u011b polo\u017eky pros\u00edm.", - "TheSelectedItemsWillBeGrouped": "Vybran\u00e9 video bude seskupeno do jedn\u00e9 virtu\u00e1ln\u00ed polo\u017eky. Emby aplikace automaticky vybere verzi, kterou chcete p\u0159ehr\u00e1t na z\u00e1klad\u011b za\u0159\u00edzen\u00ed a v\u00fdkonu s\u00edt\u011b. Jste si jisti, \u017ee chcete pokra\u010dovat?", "TryMultiSelect": "Vyzkou\u0161ej multi-v\u00fdb\u011br", "TryMultiSelectMessage": "Chcete-li upravit v\u00edce medi\u00e1ln\u00edch polo\u017eek, sta\u010d\u00ed kliknout a podr\u017eet na kter\u00e9mkoliv plak\u00e1tu. Pot\u00e9 m\u016f\u017eete vybrat v\u00edce polo\u017eek, kter\u00e9 chcete spravovat. Zkus to!", "HeaderConfirmRecordingCancellation": "Potvrzen\u00ed zru\u0161en\u00ed nahr\u00e1v\u00e1n\u00ed", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Do\u0161lo k chyb\u011b p\u0159i zpracov\u00e1n\u00ed po\u017eadavku. Pros\u00edm zkuste to znovu pozd\u011bji.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index 0bc035435..63d51a44a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Del", "Add": "Tilf\u00f8j", @@ -39,16 +47,11 @@ "Saturday": "L\u00f8rdag", "Days": "Dage", "RecordSeries": "Optag serie", - "LabelPrePaddingMinutes": "Start minutter f\u00f8r:", - "LabelPostPaddingMinutes": "Stop optagelse minutter efter:", - "RecordOnAllChannels": "Optag fra alle kanaler", - "RecordAnytime": "Optag p\u00e5 ethverts tidspunkt", - "RecordOnlyNewEpisodes": "Optag kun nye episoder", "HeaderBecomeProjectSupporter": "F\u00e5 Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Et aktivt Emby Premiere abonnement er n\u00f8dvendigt for at oprette automatiserede optagelser af serier.", - "OptionConvertRecordingsToStreamingFormat": "Konverter automatisk optagelser til et streamingvenligt format", - "OptionConvertRecordingsToStreamingFormatHelp": "Optagelser vil l\u00f8bende blive konverteret til MP4 for nemmere afspilning p\u00e5 dine enheder.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Denne funktion kr\u00e6ver et aktivt Emby Premiere abonnement.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Optag", "Save": "Gem", "Edit": "Rediger", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "V\u00e6lg venligst mindst to elementer.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Bekr\u00e6ft annullering af optagelse", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Det opstod en fejl ved behandlingen af foresp\u00f8rgslen. Pr\u00f8v igen senere.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index da249940c..d384a6271 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sortiere Kan\u00e4le nach:", + "ChannelNumber": "Kanalnummer", + "RecentlyWatched": "K\u00fcrzlich gesehen", + "PlaceFavoriteChannelsAtBeginning": "Platziere favorisierte Kan\u00e4le am Anfang", + "SeriesCancelled": "Serie abgebrochen.", + "HeaderKeepSeries": "Serie behalten", + "HeaderCancelSeries": "Serie abbrechen", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Teilen", "Add": "Hinzuf\u00fcgen", @@ -39,16 +47,11 @@ "Saturday": "Samstag", "Days": "Tage", "RecordSeries": "Serie aufnehmen", - "LabelPrePaddingMinutes": "Minuten vor der Aufnahme", - "LabelPostPaddingMinutes": "Pufferminuten nach der Aufnahme", - "RecordOnAllChannels": "Auf allen Kan\u00e4len aufzeichnen", - "RecordAnytime": "Zu jeder Zeit aufzeichnen", - "RecordOnlyNewEpisodes": "Nehme nur neue Episoden auf", "HeaderBecomeProjectSupporter": "Holen Sie Emby Premium", "MessageActiveSubscriptionRequiredSeriesRecordings": "Ein aktives Emby Premium Abo wird benn\u00f6tigt um automatische Serienaufnahmen zu erstellen.", - "OptionConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein streaming freundliches Format.", - "OptionConvertRecordingsToStreamingFormatHelp": "Aufnahmen werden als MP4 konvertiert um eine bessere Wiedergabe auf Ihren Ger\u00e4ten zu gew\u00e4hrleisten.", + "PromoConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein Streaming-freundliches Format mit Emby Premiere. Aufnahmen werden, basierend auf den Emby Server-Einstellungen, dynamisch zu MP4 oder MKV konvertiert.", "FeatureRequiresEmbyPremiere": "Dieses Feature ben\u00f6tigt eine aktive Emby Premiere Mitgliedschaft.", + "HeaderConvertYourRecordings": "Konvertiere deine Aufnahmen", "Record": "Aufnehmen", "Save": "Speichern", "Edit": "Bearbeiten", @@ -124,7 +127,6 @@ "MarkUnplayed": "Markiere \"als ungesehen\"", "GroupVersions": "Gruppiere Versionen", "PleaseSelectTwoItems": "Bitte w\u00e4hle mindestens zwei Optionen aus.", - "TheSelectedItemsWillBeGrouped": "Die ausgew\u00e4hlten Videos werden in einem virtuellen Element gruppiert. Emby Anwendungen w\u00e4hlen automatisch die beste Version anhand des Ger\u00e4tes und der Netzwerkgeschwindigkeit. Sind Sie sich sicher, dass Sie fortfahren m\u00f6chten?", "TryMultiSelect": "Versuche Mehrfachauswahl", "TryMultiSelectMessage": "F\u00fcr eine Mehrfachauswahl klicken und halten Sie ein Poster. W\u00e4hlen Sie die Eintr\u00e4ge die Sie bearbeiten m\u00f6chten. Versuchen SIe es!", "HeaderConfirmRecordingCancellation": "Best\u00e4tige Aufzeichnungsabbruch", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live\u00fcbertragungen", "Premieres": "Premieren", "RepeatEpisodes": "Wiederholung Episoden", - "DvrSubscriptionRequired": "Emby DVR ben\u00f6tigt eine aktive Emby Premiere Mitgliedschaft." + "DvrSubscriptionRequired": "Emby DVR ben\u00f6tigt eine aktive Emby Premiere Mitgliedschaft.", + "HeaderCancelRecording": "Aufnahme abbrechen", + "HeaderKeepRecording": "Aufnahme behalten", + "HeaderLearnMore": "Erfahre mehr", + "DeleteMedia": "Medien l\u00f6schen", + "SeriesSettings": "Serieneinstellungen", + "HeaderRecordingOptions": "Aufnahmeeinstellungen", + "CancelSeries": "Serien abbrechen", + "DoNotRecord": "Nicht aufnehmen", + "HeaderSeriesOptions": "Serienoptionen", + "LabelChannels": "Kan\u00e4le:", + "ChannelNameOnly": "Nur Kanal {0}", + "Anytime": "Jederzeit", + "AroundTime": "Um {0}", + "LabelAirtime": "Sendezeit", + "AllChannels": "Alle Kan\u00e4le:", + "LabelRecord": "Aufnahme:", + "NewEpisodesOnly": "Nur neue Episoden", + "AllEpisodes": "Alle Episoden", + "LabelStartWhenPossible": "Starte wenn m\u00f6glich:", + "LabelStopWhenPossible": "Stoppe wenn m\u00f6glich", + "MinutesBefore": "Minuten vor", + "MinutesAfter": "Minuten nach", + "SkipEpisodesAlreadyInMyLibrary": "\u00dcberspringe Episoden, die schon in der Bibliothek verf\u00fcgbar sind.", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episoden werden mittels Staffel- und Episodennummer verglichen, wenn verf\u00fcgbar.", + "LabelKeepUpTo": "Fortf\u00fchren:", + "AsManyAsPossible": "So viele wie m\u00f6glich", + "DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es sp\u00e4ter erneut.", + "LabelKeep:": "Behalten:", + "UntilIDelete": "Bis ich l\u00f6sche", + "UntilSpaceNeeded": "Bis Speicherplatz ben\u00f6tigt wird", + "Categories": "Kategorien", + "Sports": "Sport", + "News": "Nachrichten", + "Movies": "Filme", + "Kids": "Kinder", + "EnableColorCodedBackgrounds": "Aktiviere farbige Hintergr\u00fcnde" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json index 63bec2dd7..0096fdcbe 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json index 6737e8234..7a18ad7b7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favourite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 for easy playback on your devices.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -64,7 +67,7 @@ "NewCollection": "New Collection", "LabelCollection": "Collection:", "Help": "Help", - "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "NewCollectionHelp": "Collections allow you to create personalised groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", @@ -94,7 +97,7 @@ "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognise that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", "ValueDiscNumber": "Disc {0}", "Unrated": "Unrated", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -205,7 +207,7 @@ "Continuing": "Continuing", "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", "Backdrops": "Backdrops", "Images": "Images", "Keywords": "Keywords", @@ -245,7 +247,7 @@ "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", - "PleaseEnterNameOrId": "Please enter a name or an external Id.", + "PleaseEnterNameOrId": "Please enter a name or an external ID.", "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", @@ -279,9 +281,45 @@ "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", - "HDPrograms": "HD programs", + "HDPrograms": "HD programmes", "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable colour-coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index ea5797548..02aed2edb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -10,7 +10,6 @@ "Repeat": "Repeat", "TrackCount": "{0} tracks", "ItemCount": "{0} items", - "ValueSeriesYearToPresent": "{0}-Present", "ReleaseYearValue": "Release year: {0}", "OriginalAirDateValue": "Original air date: {0}", "EndsAtValue": "Ends at {0}", @@ -27,6 +26,7 @@ "ButtonGotIt": "Got It", "ButtonRestart": "Restart", "RecordingCancelled": "Recording cancelled.", + "SeriesCancelled": "Series cancelled.", "RecordingScheduled": "Recording scheduled.", "SeriesRecordingScheduled": "Series recording scheduled.", "HeaderNewRecording": "New Recording", @@ -39,16 +39,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +119,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -228,7 +222,7 @@ "PackageInstallCompleted": "{0} installation completed.", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", - "SeriesYearToPresent": "{0}-Present", + "SeriesYearToPresent": "{0} - Present", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", @@ -283,5 +277,48 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "CancelRecording": "Cancel recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderCancelSeries": "Cancel Series", + "HeaderKeepSeries": "Keep Series", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds", + "SortChannelsBy": "Sort channels by:", + "RecentlyWatched": "Recently watched", + "ChannelNumber": "Channel number", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json index 6fdc10749..a94c10bb2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Grabar s\u00f3lo nuevos cap\u00edtulos", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json index 7445d5670..3329d4bb0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Ordenar canales por:", + "ChannelNumber": "Numero de canal", + "RecentlyWatched": "Visto recientemente", + "PlaceFavoriteChannelsAtBeginning": "Colocar canales favoritos al inicio", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartir", "Add": "Agregar", @@ -39,16 +47,11 @@ "Saturday": "S\u00e1bado", "Days": "D\u00edas", "RecordSeries": "Grabar Series", - "LabelPrePaddingMinutes": "Minutos de protecci\u00f3n previos:", - "LabelPostPaddingMinutes": "Minutos de protecci\u00f3n posterior:", - "RecordOnAllChannels": "Grabar en todos los canales", - "RecordAnytime": "Grabar en cualquier momento", - "RecordOnlyNewEpisodes": "Grabar s\u00f3lo nuevos episodios", "HeaderBecomeProjectSupporter": "Obtener Emby Premier", "MessageActiveSubscriptionRequiredSeriesRecordings": "Se requiere de una suscripci\u00f3n de Emby Premier para crear grabaciones automatizadas de series.", - "OptionConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente las grabaciones a un formato amigable para transmisi\u00f3n", - "OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones ser\u00e1n convertidas en tiempo real a MP4 para una f\u00e1cil reproducci\u00f3n en sus dispositivos.", + "PromoConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente grabaciones a un formato amigable para transmitir con Emby Premiere. Las grabaciones ser\u00e1n convertidos en tiempo real a MP4 o MKV, basado en las configuraciones del servidor Emby.", "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica requiere de una suscripci\u00f3n activa de Emby Premiere.", + "HeaderConvertYourRecordings": "Convertir Sus Grabaciones", "Record": "Grabar", "Save": "Guardar", "Edit": "Editar", @@ -124,7 +127,6 @@ "MarkUnplayed": "Marcar como No Reproducido", "GroupVersions": "Agrupar versiones", "PleaseSelectTwoItems": "Por favor selecciona al menos dos \u00edtems.", - "TheSelectedItemsWillBeGrouped": "Los videos seleccionados se agruparan en un solo \u00edtem virtual. Las aplicaciones Emby elegir\u00e1n autom\u00e1ticamente cual versi\u00f3n reproducir dependiendo del dispositivo y el rendimiento de la red. \u00bfEsta seguro de que desea continuar?", "TryMultiSelect": "Intente Multi-Selecci\u00f3n", "TryMultiSelectMessage": "Para editar m\u00faltiples medios, solo de clic sostenido sobre cualquier p\u00f3ster y elija los items que desea administrar. \u00a1int\u00e9ntelo!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelaci\u00f3n de la Grabaci\u00f3n", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Transmisiones en vivo", "Premieres": "Estrenos", "RepeatEpisodes": "Repetir episodios", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR necesita una suscripci\u00f3n activa de Emby Premiere.", + "HeaderCancelRecording": "Cancelar Grabaci\u00f3n", + "HeaderKeepRecording": "Conservar Grabaciones", + "HeaderLearnMore": "Aprenda m\u00e1s", + "DeleteMedia": "Eliminar medios", + "SeriesSettings": "Configuraci\u00f3n de la Serie", + "HeaderRecordingOptions": "Opciones de Grabaci\u00f3n", + "CancelSeries": "Cancelar serie", + "DoNotRecord": "No grabar", + "HeaderSeriesOptions": "Opciones de Serie", + "LabelChannels": "Canales:", + "ChannelNameOnly": "Canal {0} solamente", + "Anytime": "En cualquier momento", + "AroundTime": "Alrededor de {0}", + "LabelAirtime": "Duraci\u00f3n:", + "AllChannels": "Todos los canales", + "LabelRecord": "Grabar:", + "NewEpisodesOnly": "Solo episodios nuevos", + "AllEpisodes": "Todos los episodios", + "LabelStartWhenPossible": "Iniciar cuando sea posible:", + "LabelStopWhenPossible": "Detener cuando sea posible:", + "MinutesBefore": "Minutos antes", + "MinutesAfter": "minutos despues", + "SkipEpisodesAlreadyInMyLibrary": "Saltar episodios que ya se encuentran en mi biblioteca", + "SkipEpisodesAlreadyInMyLibraryHelp": "Los episodios ser\u00e1n comparados usando el numero de temporada y de episodio, cuando est\u00e9n disponibles.", + "LabelKeepUpTo": "Mantener hasta:", + "AsManyAsPossible": "Tantos como sea posible", + "DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor int\u00e9ntelo de nuevo mas tarde.", + "LabelKeep:": "Mantener:", + "UntilIDelete": "Hasta que yo lo borre", + "UntilSpaceNeeded": "Hasta que se necesite espacio", + "Categories": "Categor\u00edas", + "Sports": "Deportes", + "News": "Noticias", + "Movies": "Pel\u00edculas", + "Kids": "Ni\u00f1os", + "EnableColorCodedBackgrounds": "Habilitar fondos con c\u00f3digo de color" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json index 1ff687b3a..c65f53a89 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Compartir", "Add": "A\u00f1adir", @@ -39,16 +47,11 @@ "Saturday": "S\u00e1bado", "Days": "D\u00edas", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Minutos previos extras:", - "LabelPostPaddingMinutes": "Minutos extras post grabaci\u00f3n:", - "RecordOnAllChannels": "Grabar en cualquier canal", - "RecordAnytime": "Grabar a cualquier hora", - "RecordOnlyNewEpisodes": "Grabar s\u00f3lo nuevos episodios", "HeaderBecomeProjectSupporter": "Consigue Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Se necesita una suscripci\u00f3n a Emby Premiere para poder crear grabaciones autom\u00e1ticas.", - "OptionConvertRecordingsToStreamingFormat": "Convertir grabaciones autom\u00e1ticamente a un formato amigable", - "OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones se convertir\u00e1n en tiempo real a MP4 para una reproducci\u00f3n sencilla desde tus dispositivos.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica necesita una suscripci\u00f3n a Emby Premiere.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Grabar", "Save": "Grabar", "Edit": "Editar", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", - "TheSelectedItemsWillBeGrouped": "Los v\u00eddeos seleccionados se agrupar\u00e1n en uno s\u00f3lo virtual. Las aplicaciones de Emby elegir\u00e1n autom\u00e1ticamente qu\u00e9 versi\u00f3n reproducir en funci\u00f3n del dispositivo y la velocidad de internet. \u00bfQuieres continuar?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirmar la cancelaci\u00f3n de la grabaci\u00f3n", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Ha habido un error procesando la solicitud. Por favor int\u00e9ntalo m\u00e1s tarde.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json index 49fc16de8..facf2379a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Tallenna", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json index a06b0cefb..405ff2ba5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index 63d2366fc..48ae401c0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", "Share": "Partager", "Add": "Ajouter", @@ -39,16 +47,11 @@ "Saturday": "Samedi", "Days": "Jours", "RecordSeries": "Enregistrer s\u00e9ries", - "LabelPrePaddingMinutes": "Minutes de Pr\u00e9-remplissage:", - "LabelPostPaddingMinutes": "Minutes de \"post-padding\":", - "RecordOnAllChannels": "Enregistrer sur toutes les cha\u00eenes", - "RecordAnytime": "Enregistrer \u00e0 n'importe quelle heure\/journ\u00e9e", - "RecordOnlyNewEpisodes": "Enregistrer seulement les nouveaux \u00e9pisodes", "HeaderBecomeProjectSupporter": "Obtenez Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Une souscription Emby Premiere active est n\u00e9cessaire pour cr\u00e9er des enregistrements automatiques de s\u00e9ries.", - "OptionConvertRecordingsToStreamingFormat": "Convertir automatiquement les enregistrements a un format facilement diffusable.", - "OptionConvertRecordingsToStreamingFormatHelp": "Les enregistrements seront convertis \u00e0 la vol\u00e9e en MP4 afin faciliter la lecture sur tous vos appareils.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Cette fonctionnalit\u00e9 requiert un compte Emby Premiere.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Enregistrer", "Save": "Sauvegarder", "Edit": "Modifier", @@ -124,7 +127,6 @@ "MarkUnplayed": "Marquer comme non lu", "GroupVersions": "Versions de groupe", "PleaseSelectTwoItems": "Veuillez s\u00e9lectionner au moins deux items.", - "TheSelectedItemsWillBeGrouped": "Les vid\u00e9os s\u00e9lectionn\u00e9es seront regroup\u00e9es dans un objet virtuel. L'application Emby choisira automatiquement quelle version jouer d'apr\u00e8s le p\u00e9riph\u00e9rique et la performance du r\u00e9seau. \u00cates-vous s\u00fbre de vouloir continuer ?", "TryMultiSelect": "Essayer la s\u00e9lection multiple", "TryMultiSelectMessage": "Pour modifier plusieurs \u00e9l\u00e9ments m\u00e9dias, il suffit de cliquer et maintenir le clic sur n'importe quel poster et de s\u00e9lectionner les \u00e9lements que vous voulez g\u00e9rer. Essayer le !", "HeaderConfirmRecordingCancellation": "Confirmer l'annulation de l'enregistrement.", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Il y a eu une erreur lors de l'ex\u00e9cution de la requ\u00eate. Veuillez r\u00e9essayer plus tard.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json index 70c4fc0d6..e4722aa0d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Samstig", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Speichere", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json index 937528517..18af85e5d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u05d4\u05d5\u05e1\u05e3", @@ -39,16 +47,11 @@ "Saturday": "\u05e9\u05d1\u05ea", "Days": "\u05d9\u05de\u05d9\u05dd", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "\u05d3\u05e7\u05d5\u05ea \u05e9\u05dc \u05de\u05e8\u05d5\u05d5\u05d7 \u05de\u05e7\u05d3\u05d9\u05dd:", - "LabelPostPaddingMinutes": "\u05d3\u05e7\u05d5\u05ea \u05e9\u05dc \u05de\u05e8\u05d5\u05d5\u05d7 \u05de\u05d0\u05d5\u05d7\u05e8:", - "RecordOnAllChannels": "\u05d4\u05e7\u05dc\u05d8 \u05d1\u05db\u05dc \u05d4\u05e2\u05e8\u05d5\u05e6\u05d9\u05dd", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "\u05d4\u05e7\u05dc\u05d8 \u05e8\u05e7 \u05e4\u05e8\u05e7\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u05d4\u05e7\u05dc\u05d8", "Save": "\u05e9\u05de\u05d5\u05e8", "Edit": "\u05e2\u05e8\u05d5\u05da", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json index 334511daf..748f2f6c1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json @@ -1,35 +1,43 @@ { - "ValueSpecialEpisodeName": "Special - {0}", - "Share": "Share", + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", + "ValueSpecialEpisodeName": "Specijal - {0}", + "Share": "Dijeli", "Add": "Dodaj", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.", - "AttributeNew": "New", - "Premiere": "Premiere", - "Live": "Live", - "Repeat": "Repeat", - "TrackCount": "{0} tracks", - "ItemCount": "{0} items", - "ValueSeriesYearToPresent": "{0}-Present", - "ReleaseYearValue": "Release year: {0}", - "OriginalAirDateValue": "Original air date: {0}", - "EndsAtValue": "Ends at {0}", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", - "HeaderSelectDate": "Select Date", - "ButtonOk": "Ok", + "ServerUpdateNeeded": "Emby Server treba a\u017eurirati. Da biste preuzeli najnoviju verziju, posjetite {0}", + "LiveTvGuideRequiresUnlock": "Vodi\u010d TV u\u017eivo je trenutno ograni\u010den na {0} kanala. Kliknite na gumb za otklju\u010davanje da biste saznali kako u\u017eivati u potpunom do\u017eivljaju.", + "AttributeNew": "Novo", + "Premiere": "Premijera", + "Live": "U\u017eivo", + "Repeat": "Ponovi", + "TrackCount": "{0} pjesme", + "ItemCount": "{0} stavaka", + "ValueSeriesYearToPresent": "{0}-sada", + "ReleaseYearValue": "Godina izdanja: {0}", + "OriginalAirDateValue": "Originalni datum prikazivanja: {0}", + "EndsAtValue": "Zavr\u0161ava u {0}", + "OptionSundayShort": "Ned", + "OptionMondayShort": "Pon", + "OptionTuesdayShort": "Uto", + "OptionWednesdayShort": "Sre", + "OptionThursdayShort": "\u010cet", + "OptionFridayShort": "Pet", + "OptionSaturdayShort": "Sub", + "HeaderSelectDate": "Odaberi datum", + "ButtonOk": "U redu", "ButtonCancel": "Odustani", - "ButtonGotIt": "Got It", - "ButtonRestart": "Restart", - "RecordingCancelled": "Recording cancelled.", - "RecordingScheduled": "Recording scheduled.", - "SeriesRecordingScheduled": "Series recording scheduled.", - "HeaderNewRecording": "New Recording", + "ButtonGotIt": "Shva\u0107am", + "ButtonRestart": "Ponovo pokreni", + "RecordingCancelled": "Snimka je otkazana.", + "RecordingScheduled": "Snimka je zakazana.", + "SeriesRecordingScheduled": "Snimanje serije je zakazano.", + "HeaderNewRecording": "Nova snimka", "Sunday": "Nedjelja", "Monday": "Ponedjeljak", "Tuesday": "Utorak", @@ -38,250 +46,280 @@ "Friday": "Petak", "Saturday": "Subota", "Days": "Dani", - "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Dodatne minute za kraj", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Snimi samo nove epizode", - "HeaderBecomeProjectSupporter": "Get Emby Premiere", - "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", - "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "RecordSeries": "Snimi serije", + "HeaderBecomeProjectSupporter": "Nabavite Emby Premijeru", + "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktivna pretplata Emby Premijere je potrebna kako bi se napravilo automatsko snimanje serija.", + "PromoConvertRecordingsToStreamingFormat": "Automatski pretvoriti snimke na prijateljskom formatu strujanja s Emby Premijerom. Snimke \u0107e se pretvoriti u letu u MP4 ili MKV na temelju postavki Emby poslu\u017eitelja.", + "FeatureRequiresEmbyPremiere": "Ova zna\u010dajka zahtijeva aktivnu pretplatu Emby Premijere.", + "HeaderConvertYourRecordings": "Konvertiraj snimke", "Record": "Snimi", "Save": "Snimi", "Edit": "Izmjeni", - "Download": "Download", - "Advanced": "Advanced", + "Download": "Preuzimanje", + "Advanced": "Napredno", "Delete": "Izbri\u0161i", - "HeaderDeleteItem": "Delete Item", - "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "Refresh": "Refresh", - "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", + "HeaderDeleteItem": "Izbri\u0161i stavku", + "ConfirmDeleteItem": "Brisanjem ove stavke \u0107e je izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", + "Refresh": "Osvije\u017ei", + "RefreshQueued": "Osvije\u017ei stavke na \u010dekanju", + "AddToCollection": "Dodaj u kolekciju", + "HeaderAddToCollection": "Dodaj u kolekciju", "NewCollection": "Nova kolekcija", - "LabelCollection": "Collection:", - "Help": "Help", - "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "LabelCollection": "Kolekcija:", + "Help": "Pomo\u0107", + "NewCollectionHelp": "Kolekcije vam omogu\u0107iti da napravite personalizirane grupe filmova i ostale biblioteke.", "SearchForCollectionInternetMetadata": "Potra\u017ei na internetu grafike i metadata", "LabelName": "Ime:", "NewCollectionNameExample": "Naprimjer: Star Wars Kolekcija", - "MessageItemsAdded": "Items added.", - "OptionNew": "New...", - "LabelPlaylist": "Playlist:", - "AddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", - "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", + "MessageItemsAdded": "Stavke su dodane", + "OptionNew": "Novo...", + "LabelPlaylist": "Popis:", + "AddToPlaylist": "Dodaj u popis", + "HeaderAddToPlaylist": "Dodaj u popis", + "Subtitles": "Titlovi", + "SearchForSubtitles": "Tra\u017ei titlove prijevoda", "LabelLanguage": "Jezik:", - "Search": "Search", - "NoSubtitleSearchResultsFound": "No results found.", - "File": "File", - "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", - "ConfirmDeletion": "Confirm Deletion", - "MySubtitles": "My Subtitles", - "MessageDownloadQueued": "Download queued.", - "EditSubtitles": "Edit subtitles", - "UnlockGuide": "Unlock Guide", - "RefreshMetadata": "Refresh Metadata", - "ReplaceExistingImages": "Replace existing images", - "ReplaceAllMetadata": "Replace all metadata", - "SearchForMissingMetadata": "Search for missing metadata", - "LabelRefreshMode": "Refresh mode:", - "NoItemsFound": "No items found.", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", - "Favorite": "Favorite", - "Like": "Like", - "Dislike": "Dislike", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", - "Open": "Open", + "Search": "Tra\u017ei", + "NoSubtitleSearchResultsFound": "Nije ni\u0161ta prona\u0111eno.", + "File": "Datoteka", + "MessageAreYouSureDeleteSubtitles": "Da li ste sigurni da \u017eelite izbrisati ove titlove prijevoda?", + "ConfirmDeletion": "Potvrdite brisanje", + "MySubtitles": "Moji titlovi", + "MessageDownloadQueued": "Preuzimanje na \u010dekanju", + "EditSubtitles": "Uredi titlove", + "UnlockGuide": "Otklju\u010daj vodi\u010d", + "RefreshMetadata": "Osvje\u017ei meta-podatke", + "ReplaceExistingImages": "Zamijeni postoje\u0107e slike", + "ReplaceAllMetadata": "Zamijeni sve mate-podatke", + "SearchForMissingMetadata": "Potraga za meta-podacima koji nedostaju", + "LabelRefreshMode": "Na\u010din osvje\u017eavanja:", + "NoItemsFound": "Nije ni\u0161ta prona\u0111eno.", + "HeaderSaySomethingLike": "Reci ne\u0161to poput...", + "ButtonTryAgain": "Poku\u0161ajte ponovo", + "HeaderYouSaid": "Rekao si...", + "MessageWeDidntRecognizeCommand": "Na\u017ealost, nismo prepoznali tu naredbu.", + "MessageIfYouBlockedVoice": "Ako ste zabranili glasovni pristup aplikaciji morate ponovo podesiti prije ponovnog poku\u0161aja.", + "ValueDiscNumber": "Disk {0}", + "Unrated": "Neocijenjeno", + "Favorite": "Omiljeni", + "Like": "Svi\u0111a mi se", + "Dislike": "Ne svi\u0111a mi se", + "RefreshDialogHelp": "Meta-podaci se osvje\u017eavaju na temelju postavki i internet usluga koje su omogu\u0107ene u nadzornoj plo\u010di Emby Server-a.", + "Open": "Otvori", "Play": "Pokreni", - "Queue": "Queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit images", - "EditInfo": "Edit info", - "Sync": "Sync", - "InstantMix": "Instant mix", - "ViewAlbum": "View album", - "ViewArtist": "View artist", - "QueueAllFromHere": "Queue all from here", - "PlayAllFromHere": "Play all from here", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from playlist", - "RemoveFromCollection": "Remove from collection", - "Trailer": "Trailer", - "MarkPlayed": "Mark played", - "MarkUnplayed": "Mark unplayed", - "GroupVersions": "Group versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "TryMultiSelect": "Try Multi-Select", - "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", - "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", - "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error", - "VoiceInput": "Voice Input", - "LabelContentType": "Content type:", - "LabelPath": "Path:", - "LabelTitle": "Title:", - "LabelOriginalTitle": "Original title:", - "LabelSortTitle": "Sort title:", - "LabelDateAdded": "Date added:", - "ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", + "Queue": "Red", + "Shuffle": "Mije\u0161aj", + "Identify": "Identificiraj", + "EditImages": "Ure\u0111ivanje slika", + "EditInfo": "Ure\u0111ivanje informacija", + "Sync": "Sink.", + "InstantMix": "Trenutno mije\u0161anje", + "ViewAlbum": "Pogledaj album", + "ViewArtist": "Pogledaj umjetnika", + "QueueAllFromHere": "Stavi u red \u010dekanja sve odavde", + "PlayAllFromHere": "Pokreni sve odavde", + "PlayFromBeginning": "Igraj od po\u010detka", + "ResumeAt": "Nastavi od {0}", + "RemoveFromPlaylist": "Ukloni iz popisa", + "RemoveFromCollection": "Ukloni iz kolekcije", + "Trailer": "Kratki video", + "MarkPlayed": "Ozna\u010di pogledan", + "MarkUnplayed": "Ozna\u010di nepogledan", + "GroupVersions": "Verzija grupe", + "PleaseSelectTwoItems": "Molimo odaberite najmanje dvije stavke.", + "TryMultiSelect": "Poku\u0161ajte vi\u0161estruki odabir", + "TryMultiSelectMessage": "Da biste uredili vi\u0161e medijskih stavaka, samo kliknite i dr\u017eite bilo koji plakat i odaberite stavke kojima \u017eelite upravljati. Probaj!", + "HeaderConfirmRecordingCancellation": "Potvrdi otkazivanje snimanja", + "MessageConfirmRecordingCancellation": "Jeste li sigurni da \u017eelite poni\u0161titi ovu snimku?", + "Error": "Gre\u0161ka", + "VoiceInput": "Ulazni glas", + "LabelContentType": "Tip sadr\u017eaja:", + "LabelPath": "Putanja:", + "LabelTitle": "Naslov:", + "LabelOriginalTitle": "Originalni naslov:", + "LabelSortTitle": "Naziv vrste:", + "LabelDateAdded": "Datumu dodavanja", + "ConfigureDateAdded": "Podesite kako se datum dodavanja odre\u0111uje na nadzornoj plo\u010di Emby Server-a u postavkama biblioteke", "LabelStatus": "Status:", - "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", - "LabelAlbumArtists": "Album artists:", + "LabelArtists": "Izvo\u0111a\u010di:", + "LabelArtistsHelp": "Odvoji vi\u0161estruko koriste\u0107i ;", + "LabelAlbumArtists": "Izvo\u0111a\u010di albuma", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", - "LabelVoteCount": "Vote count:", + "LabelCommunityRating": "Ocjene zajednice:", + "LabelVoteCount": "Prebrojavanje glasova:", "LabelMetascore": "Metascore:", - "LabelCriticRating": "Critic rating:", - "LabelCriticRatingSummary": "Critic rating summary:", - "LabelAwardSummary": "Award summary:", - "LabelWebsite": "Website:", - "LabelTagline": "Tagline:", - "LabelOverview": "Overview:", - "LabelShortOverview": "Short overview:", - "LabelReleaseDate": "Release date:", + "LabelCriticRating": "Ocjene kritike:", + "LabelCriticRatingSummary": "Sa\u017eetak ocjena kritike:", + "LabelAwardSummary": "Sa\u017eetak nagrada:", + "LabelWebsite": "Web stranica:", + "LabelTagline": "Slogan:", + "LabelOverview": "Pregled:", + "LabelShortOverview": "Kratki pregled:", + "LabelReleaseDate": "Datum izdavanja:", "LabelYear": "Year:", - "LabelPlaceOfBirth": "Place of birth:", - "LabelAirDays": "Air days:", - "LabelAirTime": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", - "LabelParentalRating": "Parental rating:", - "LabelCustomRating": "Custom rating:", - "LabelBudget": "Budget", - "LabelRevenue": "Revenue ($):", - "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelPlaceOfBirth": "Datum ro\u0111enja:", + "LabelAirDays": "Dani emitiranja:", + "LabelAirTime": "Vrijeme emitiranja:", + "LabelRuntimeMinutes": "Vrijeme izvo\u0111enja (minuta):", + "LabelParentalRating": "Roditeljska ocjena:", + "LabelCustomRating": "Prilago\u0111ena ocjena:", + "LabelBudget": "Bud\u017eet", + "LabelRevenue": "Prihod ($):", + "LabelOriginalAspectRatio": "Originalni omjer gledanja:", "LabelPlayers": "Players:", "Label3DFormat": "3D format:", - "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", - "LabelDvdSeasonNumber": "Dvd season number:", - "LabelDvdEpisodeNumber": "Dvd episode number:", - "LabelAbsoluteEpisodeNumber": "Absolute episode number:", - "HeaderSpecialEpisodeInfo": "Special Episode Info", - "LabelAirsBeforeSeason": "Airs before season:", - "LabelAirsAfterSeason": "Airs after season:", - "LabelAirsBeforeEpisode": "Airs before episode:", - "HeaderExternalIds": "External Id's:", - "HeaderDisplaySettings": "Display Settings", - "LabelTreatImageAs": "Treat image as:", - "LabelDisplayOrder": "Display order:", - "Countries": "Countries", - "Genres": "Genres", - "HeaderPlotKeywords": "Plot Keywords", - "Studios": "Studios", - "Tags": "Tags", - "HeaderMetadataSettings": "Metadata Settings", - "People": "People", - "LabelMetadataDownloadLanguage": "Preferred download language:", - "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", + "HeaderAlternateEpisodeNumbers": "Alternativni brojevi epizoda", + "LabelDvdSeasonNumber": "Dvd broj sezone:", + "LabelDvdEpisodeNumber": "Dvd broj epizode:", + "LabelAbsoluteEpisodeNumber": "Apsolutni broj epizode:", + "HeaderSpecialEpisodeInfo": "Posebni podaci o epizodi", + "LabelAirsBeforeSeason": "Emitiranje prije sezone:", + "LabelAirsAfterSeason": "Emitiranje nakon sezona:", + "LabelAirsBeforeEpisode": "Emitiranje prije epizoda:", + "HeaderExternalIds": "Vanjski id-ovi:", + "HeaderDisplaySettings": "Postavke prikaza", + "LabelTreatImageAs": "Tretirajte sliku kao:", + "LabelDisplayOrder": "Poredak prikaza:", + "Countries": "Zemlje", + "Genres": "\u017danrovi", + "HeaderPlotKeywords": "Klju\u010dne rije\u010di", + "Studios": "Studija", + "Tags": "Oznake", + "HeaderMetadataSettings": "Postavke meta-podataka", + "People": "Ljudi", + "LabelMetadataDownloadLanguage": "\u017deljeni jezik za preuzimanje:", + "LabelLockItemToPreventChanges": "Zaklju\u010dajte ovu stavku kako bi se sprije\u010dile budu\u0107e promjene", + "MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.", "LabelCountry": "Zemlja:", "LabelDynamicExternalId": "{0} Id:", - "LabelBirthYear": "Birth year:", - "LabelBirthDate": "Birth date:", - "LabelDeathDate": "Death date:", - "LabelEndDate": "End date:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", - "LabelTrackNumber": "Track number:", - "LabelNumber": "Number:", - "LabelDiscNumber": "Disc number", - "LabelParentNumber": "Parent number", - "SortName": "Sort name", - "ReleaseDate": "Release date", + "LabelBirthYear": "Godina ro\u0111enja:", + "LabelBirthDate": "Datum ro\u0111enja:", + "LabelDeathDate": "Datum smrti:", + "LabelEndDate": "Datum zavr\u0161etka:", + "LabelSeasonNumber": "Broj sezone:", + "LabelEpisodeNumber": "Broj epizode:", + "LabelTrackNumber": "Broj pjesme:", + "LabelNumber": "Broj:", + "LabelDiscNumber": "Broj diska", + "LabelParentNumber": "Broj roditelja", + "SortName": "Ime vrste", + "ReleaseDate": "Datum izdavanja", "Continuing": "Nastavlja se", "Ended": "Zavr\u0161eno", - "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", - "Backdrops": "Backdrops", - "Images": "Images", - "Keywords": "Keywords", - "Runtime": "Runtime", - "ProductionLocations": "Production locations", - "BirthLocation": "Birth location", + "HeaderEnabledFields": "Omogu\u0107i polja", + "HeaderEnabledFieldsHelp": "Poni\u0161ti polje za zaklju\u010davanje i sprije\u010di njihove podatke od toga da budu promijenjeni.", + "Backdrops": "Pozadine", + "Images": "Slike", + "Keywords": "Klju\u010dne rije\u010di", + "Runtime": "Trajanje", + "ProductionLocations": "Lokacije proizvodnje", + "BirthLocation": "Lokacije ro\u0111enja", "ParentalRating": "Parental Rating", - "Name": "Name", - "Overview": "Overview", + "Name": "Naziv", + "Overview": "Pregled", "LabelType": "Tip:", - "LabelPersonRole": "Role:", - "LabelPersonRoleHelp": "Example: Ice cream truck driver", - "Actor": "Actor", - "Composer": "Composer", - "Director": "Director", - "GuestStar": "Guest star", - "Producer": "Producer", - "Writer": "Writer", - "InstallingPackage": "Installing {0}", - "PackageInstallCompleted": "{0} installation completed.", - "PackageInstallFailed": "{0} installation failed.", - "PackageInstallCancelled": "{0} installation cancelled.", - "SeriesYearToPresent": "{0}-Present", - "ValueOneSong": "1 song", - "ValueSongCount": "{0} songs", - "ValueOneMovie": "1 movie", - "ValueMovieCount": "{0} movies", - "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", - "ValueOneEpisode": "1 episode", - "ValueEpisodeCount": "{0} episodes", - "ValueOneGame": "1 game", - "ValueGameCount": "{0} games", + "LabelPersonRole": "Uloga:", + "LabelPersonRoleHelp": "Primjer: voza\u010d kamiona sa sladoledom", + "Actor": "Glumac", + "Composer": "Kompozitor", + "Director": "Re\u017eiser", + "GuestStar": "Zvijezda gost", + "Producer": "Producent", + "Writer": "Pisac", + "InstallingPackage": "Instaliranje {0}", + "PackageInstallCompleted": "{0} instaliranje zavr\u0161eno.", + "PackageInstallFailed": "{0} instaliranje neuspjelo.", + "PackageInstallCancelled": "{0} instaliranje otkazano.", + "SeriesYearToPresent": "{0}-sada", + "ValueOneSong": "1 pjesma", + "ValueSongCount": "{0} pjesma", + "ValueOneMovie": "1 film", + "ValueMovieCount": "{0} filmova", + "ValueOneSeries": "1 serija", + "ValueSeriesCount": "{0} serija", + "ValueOneEpisode": "1 epizoda", + "ValueEpisodeCount": "{0} epizoda", + "ValueOneGame": "1 igra", + "ValueGameCount": "{0} igra", "ValueOneAlbum": "1 album", - "ValueAlbumCount": "{0} albums", - "ValueOneMusicVideo": "1 music video", - "ValueMusicVideoCount": "{0} music videos", - "ValueMinutes": "{0} min", - "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", - "PleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageItemSaved": "Item saved.", - "SearchResults": "Search Results", - "SyncToOtherDevice": "Sync to other device", - "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", - "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", - "HeaderDeleteItems": "Delete Items", - "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", - "SyncJobCreated": "Sync job created.", - "LabelSyncTo": "Sync to:", - "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", - "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", - "DownloadScheduled": "Download scheduled", - "LearnMore": "Learn more", - "LabelProfile": "Profile:", - "LabelBitrateMbps": "Bitrate (Mbps):", - "SyncUnwatchedVideosOnly": "Sync unwatched videos only", - "SyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", - "AutomaticallySyncNewContent": "Automatically sync new content", - "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", - "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", - "Screenshots": "Screenshots", - "MoveRight": "Move right", - "MoveLeft": "Move left", - "ConfirmDeleteImage": "Delete image?", - "HeaderEditImages": "Edit Images", - "Settings": "Settings", - "ShowIndicatorsFor": "Show indicators for:", - "NewEpisodes": "New episodes", - "HDPrograms": "HD programs", - "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", - "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "ValueAlbumCount": "{0} albuma", + "ValueOneMusicVideo": "1 glazbeni video", + "ValueMusicVideoCount": "{0} glazbenih videa", + "ValueMinutes": "{0} minuta", + "HeaderIdentifyItemHelp": "Unesite jednu ili vi\u0161e kriterija pretra\u017eivanja. Uklonite kriterije za pove\u0107anje rezultata pretra\u017eivanja.", + "PleaseEnterNameOrId": "Unesite naziv ili vanjski Id.", + "MessageItemSaved": "Stavka je snimljena.", + "SearchResults": "Rezultati pretra\u017eivanja", + "SyncToOtherDevice": "Sinkronizacija na druge ure\u0111aje", + "MakeAvailableOffline": "Dostupno izvanmre\u017eno", + "ServerNameIsRestarting": "Emby Server - {0} se ponovo pokre\u0107e.", + "ServerNameIsShuttingDown": "Emby Server - {0} se gasi.", + "HeaderDeleteItems": "Brisanje stavki", + "ConfirmDeleteItems": "Brisanjem ove stavke \u0107e se izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", + "PleaseRestartServerName": "Ponovno pokrenite Emby Server - {0}.", + "SyncJobCreated": "Sinkronizacijski posao je stvoren.", + "LabelSyncTo": "Sinkroniziraj na:", + "LabelSyncJobName": "Ime sinkronizacijskog posla:", + "LabelQuality": "Kvaliteta:", + "LabelSyncNoTargetsHelp": "Izgleda da trenutno nemate aplikacija koje podr\u017eavaju sinkronizaciju.", + "DownloadScheduled": "Zakazana preuzimanja", + "LearnMore": "Nau\u010di jo\u0161", + "LabelProfile": "Profil:", + "LabelBitrateMbps": "Brzina prijenosa (Mbps):", + "SyncUnwatchedVideosOnly": "Sinkroniziraj samo nepogledani video", + "SyncUnwatchedVideosOnlyHelp": "Samo nepogledani videi \u0107e biti sinkronizirani, videi \u0107e biti uklonjeni iz ure\u0111aja nakon \u0161to su pogledani.", + "AutomaticallySyncNewContent": "Automatski sinkroniziraj novi sadr\u017eaj", + "AutomaticallySyncNewContentHelp": "Novi sadr\u017eaj u ovoj mapi automatski \u0107e se sinkronizirati na ure\u0111aj.", + "LabelItemLimit": "Ograni\u010denje stavke:", + "LabelItemLimitHelp": "Neobvezno. Postavi ograni\u010denje na broj stavaka koje \u0107e biti sinkronizirane.", + "PleaseSelectDeviceToSyncTo": "Odaberite ure\u0111aj za sinkronizaciju.", + "Screenshots": "Isje\u010dci slika", + "MoveRight": "Pomakni udesno", + "MoveLeft": "Pomakni ulijevo", + "ConfirmDeleteImage": "Izbri\u0161i sliku?", + "HeaderEditImages": "Ure\u0111ivanje slika", + "Settings": "Postavke", + "ShowIndicatorsFor": "Prika\u017ei pokazatelja za:", + "NewEpisodes": "Nove epizode", + "HDPrograms": "HD programi", + "LiveBroadcasts": "Emitiranja u\u017eivo", + "Premieres": "Premijere", + "RepeatEpisodes": "Reprize", + "DvrSubscriptionRequired": "Emby DVR zahtijeva aktivnu pretplatu Emby Premijere.", + "HeaderCancelRecording": "Prekini snimanje", + "HeaderKeepRecording": "Zadr\u017ei snimanje", + "HeaderLearnMore": "Nau\u010di jo\u0161", + "DeleteMedia": "Izbri\u0161i medij", + "SeriesSettings": "Postavke serija", + "HeaderRecordingOptions": "Opcije snimanja", + "CancelSeries": "Odustani od serije", + "DoNotRecord": "Ne snimi", + "HeaderSeriesOptions": "Opcije serija", + "LabelChannels": "Kanali:", + "ChannelNameOnly": "Kanali {0} samo", + "Anytime": "Bilo kada", + "AroundTime": "Oko {0}", + "LabelAirtime": "Vrijeme emitiranja:", + "AllChannels": "Svi kanali", + "LabelRecord": "Snimka:", + "NewEpisodesOnly": "Samo nove epizode", + "AllEpisodes": "Sve epizode", + "LabelStartWhenPossible": "Po\u010dni kada je mogu\u0107e:", + "LabelStopWhenPossible": "Zaustavi kada je mogu\u0107e:", + "MinutesBefore": "Minuta prije", + "MinutesAfter": "Minuta nakon", + "SkipEpisodesAlreadyInMyLibrary": "Presko\u010di epizode koje su ve\u0107 u mojoj biblioteci", + "SkipEpisodesAlreadyInMyLibraryHelp": "Epizode \u0107e se usporediti pomo\u0107u sezone i broja epizode, kada su dostupni.", + "LabelKeepUpTo": "Dr\u017ei se na:", + "AsManyAsPossible": "\u0160to vi\u0161e je mogu\u0107e", + "DefaultErrorMessage": "Do\u0161lo je do pogre\u0161ke prilikom obrade zahtjeva. Molimo poku\u0161ajte ponovo kasnije.", + "LabelKeep:": "Zadr\u017ei:", + "UntilIDelete": "Dok ne izbri\u0161em", + "UntilSpaceNeeded": "Dok ne treba prostora", + "Categories": "Kategorije", + "Sports": "Sportovi", + "News": "Vijesti", + "Movies": "Filmovi", + "Kids": "Djeca", + "EnableColorCodedBackgrounds": "Omogu\u0107i kodirane boje pozadine" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json index 8b2776d8b..dca2ce0e9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Megoszt\u00e1s", "Add": "Hozz\u00e1ad", @@ -39,16 +47,11 @@ "Saturday": "Szombat", "Days": "Nap", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Emby Premiere beszerz\u00e9se", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Felv\u00e9tel", "Save": "Ment\u00e9s", "Edit": "Szerkeszt\u00e9s", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json index 87e106215..88e07bace 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json index c60ead473..73482532b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Aggiungi", @@ -39,16 +47,11 @@ "Saturday": "Sabato", "Days": "Giorni", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Minuti di pre-registrazione:", - "LabelPostPaddingMinutes": "Minuti post registrazione", - "RecordOnAllChannels": "Registra su tutti i canali", - "RecordAnytime": "Registra a qualsiasi ora", - "RecordOnlyNewEpisodes": "Registra solo i nuovi episodi", "HeaderBecomeProjectSupporter": "Ottieni Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Un abbonamento a Emby Premiere \u00e8 necessario per creare registrazioni personalizzate delle serie tv", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Registra", "Save": "Salva", "Edit": "Modifica", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Seleziona almeno due elementi.", - "TheSelectedItemsWillBeGrouped": "I video selezionati verranno raggruppati in un unico elemento virtuale. Le app di Emby sceglieranno automaticamente quale versione riprodurre in base al dispositivo e alle prestazioni di rete. Sei sicuro di voler continuare?", "TryMultiSelect": "Prova la selezione multipla", "TryMultiSelectMessage": "Per modificare pi\u00f9 elementi, clicca e tieni premuto so un poster, e seleziona gli elementi che vuoi gestire. Prova!", "HeaderConfirmRecordingCancellation": "Conferma eliminazione registrazione", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Si \u00e8 verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare pi\u00f9 tardi.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index c52c7c31c..a5ed6fa2a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0441\u04b1\u0440\u044b\u043f\u0442\u0430\u0443 \u0442\u04d9\u0441\u0456\u043b\u0456:", + "ChannelNumber": "\u0410\u0440\u043d\u0430 \u043d\u04e9\u043c\u0456\u0440\u0456", + "RecentlyWatched": "\u0416\u0443\u044b\u049b\u0442\u0430 \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d", + "PlaceFavoriteChannelsAtBeginning": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0435\u04a3 \u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u0440\u043d\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", + "SeriesCancelled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.", + "HeaderKeepSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", + "HeaderCancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0443", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", "Add": "\u04ae\u0441\u0442\u0435\u0443", @@ -39,16 +47,11 @@ "Saturday": "\u0441\u0435\u043d\u0431\u0456", "Days": "\u041a\u04af\u043d\u0434\u0435\u0440", "RecordSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0436\u0430\u0437\u0443", - "LabelPrePaddingMinutes": "\u0410\u043b\u0493\u0430 \u0448\u0435\u0433\u0456\u043d\u0456\u0441, \u043c\u0438\u043d:", - "LabelPostPaddingMinutes": "\u0410\u0440\u0442\u049b\u0430 \u0448\u0435\u0433\u0456\u043d\u0456\u0441, \u043c\u0438\u043d:", - "RecordOnAllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u0430\u043d \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", - "RecordAnytime": "\u04d8\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", - "RecordOnlyNewEpisodes": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0430\u04a3\u0430 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", "HeaderBecomeProjectSupporter": "Emby Premiere \u0430\u043b\u0443", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0436\u0430\u0437\u0431\u0430\u0441\u044b\u043d \u0436\u0430\u0441\u0430\u0443 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442.", - "OptionConvertRecordingsToStreamingFormat": "\u0416\u0430\u0437\u0443\u043b\u0430\u0440\u0434\u044b \u0442\u0430\u0440\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043c\u0433\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", - "OptionConvertRecordingsToStreamingFormatHelp": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u0430 \u043e\u04a3\u0430\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", + "PromoConvertRecordingsToStreamingFormat": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0493\u0430 \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043d\u0434\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443. \u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 Emby Server \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435, \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043d\u0435\u043c\u0435\u0441\u0435 MKV \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", "FeatureRequiresEmbyPremiere": "\u041e\u0441\u044b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441 \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", + "HeaderConvertYourRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", "Record": "\u0416\u0430\u0437\u0443", "Save": "\u0421\u0430\u049b\u0442\u0430\u0443", "Edit": "\u04e8\u04a3\u0434\u0435\u0443", @@ -124,7 +127,6 @@ "MarkUnplayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", "GroupVersions": "\u041d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443", "PleaseSelectTwoItems": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0435\u043a\u0456 \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.", - "TheSelectedItemsWillBeGrouped": "\u0411\u04e9\u043b\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u0431\u0456\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0434\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043a\u0435 \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b. Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u043c\u0435\u043d \u0436\u0435\u043b\u0456 \u04e9\u043d\u0456\u043c\u0434\u0456\u043b\u0456\u0433\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0430\u0442\u044b\u043d \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u0430\u04a3\u0434\u0430\u0439\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", "TryMultiSelect": "\u04ae\u043d\u0434\u0435\u0441\u043a\u0435\u043d \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0434\u0456 \u0441\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0443", "TryMultiSelectMessage": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443 \u04af\u0448\u0456\u043d, \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u043f\u043e\u0441\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u0439 \u0493\u0430\u043d\u0430 \u0442\u0456\u043d\u0442\u0443\u0456\u0440 \u0431\u0430\u0442\u044b\u0440\u043c\u0430\u0493\u0430 \u0431\u0430\u0441\u044b\u043f \u0442\u04b1\u0440\u044b\u043f \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0493\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u04a3\u0456\u0437. \u0421\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437!", "HeaderConfirmRecordingCancellation": "\u0416\u0430\u0437\u0431\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u0434\u044b \u0440\u0430\u0441\u0442\u0430\u0443", @@ -137,7 +139,7 @@ "LabelOriginalTitle": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0430\u0442\u0430\u0443\u044b:", "LabelSortTitle": "\u0410\u0442\u0430\u0443 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0441\u04b1\u0440\u044b\u043f\u0442\u0430\u0443", "LabelDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456", - "ConfigureDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456 Emby Server \u0411\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d\u0434\u0435 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0430\u0434\u044b", + "ConfigureDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456 Emby Server \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d\u0434\u0435 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0430\u0434\u044b", "LabelStatus": "\u041a\u04af\u0439:", "LabelArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440:", "LabelArtistsHelp": "\u0411\u0456\u0440\u043d\u0435\u0448\u0443\u0456\u043d (;) \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u04e9\u043b\u0456\u04a3\u0456\u0437", @@ -251,7 +253,7 @@ "SyncToOtherDevice": "\u0411\u0430\u0441\u049b\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", "MakeAvailableOffline": "\u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443", "ServerNameIsRestarting": "Emby Server - {0} \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430.", - "ServerNameIsShuttingDown": "Emby Server - {0} \u0436\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443\u0434\u0430.", + "ServerNameIsShuttingDown": "Emby Server - {0} \u0436\u04b1\u043c\u044b\u0441\u044b\u043d \u0430\u044f\u049b\u0442\u0430\u0443\u0434\u0430.", "HeaderDeleteItems": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u044e", "ConfirmDeleteItems": "\u041e\u0441\u044b \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u0439\u0493\u0430\u043d\u0434\u0430, \u043e\u043b\u0430\u0440 \u0444\u0430\u0439\u043b\u0434\u044b\u049b \u0436\u04af\u0439\u0435\u0441\u0456\u043d\u0435\u043d \u0434\u0435 \u0436\u04d9\u043d\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u0430\u043d \u0434\u0430 \u0435\u043a\u0435\u0443\u0456\u043d\u0434\u0435 \u0436\u043e\u0439\u044b\u043b\u0430\u0434. \u0421\u0456\u0437 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u043b\u0430\u0439\u0441\u044b\u0437 \u0431\u0430? \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", "PleaseRestartServerName": "Emby Server \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 - {0}.", @@ -283,5 +285,41 @@ "LiveBroadcasts": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0440\u0430\u0442\u044b\u043c\u0434\u0430\u0440", "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u0430\u043b\u0430\u0440", "RepeatEpisodes": "\u0411\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456\u04a3 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u043d\u0443\u044b", - "DvrSubscriptionRequired": "Emby DVR \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442" + "DvrSubscriptionRequired": "Emby DVR \u04af\u0448\u0456\u043d \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b \u049b\u0430\u0436\u0435\u0442", + "HeaderCancelRecording": "\u0416\u0430\u0437\u0431\u0430\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "HeaderKeepRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u0443", + "HeaderLearnMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", + "DeleteMedia": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0436\u043e\u044e", + "SeriesSettings": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", + "HeaderRecordingOptions": "\u0416\u0430\u0437\u0443 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", + "CancelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", + "DoNotRecord": "\u0416\u0430\u0437\u0443\u0493\u0430 \u0431\u043e\u043b\u043c\u0430\u0439\u0434\u044b", + "HeaderSeriesOptions": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", + "LabelChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440:", + "ChannelNameOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 {0} \u0430\u0440\u043d\u0430\u0441\u044b", + "Anytime": "\u04d8\u0440\u043a\u0435\u0437\u0434\u0435", + "AroundTime": "{0} \u0430\u0439\u043d\u0430\u043b\u0430\u0441\u044b\u043d\u0434\u0430", + "LabelAirtime": "\u042d\u0444\u0438\u0440 \u0443\u0430\u049b\u044b\u0442\u044b:", + "AllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440", + "LabelRecord": "\u0416\u0430\u0437\u0443:", + "NewEpisodesOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0430\u04a3\u0430 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456", + "AllEpisodes": "\u0411\u0430\u0440\u043b\u044b\u049b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", + "LabelStartWhenPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0431\u0430\u0441\u0442\u0430\u0443:", + "LabelStopWhenPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0442\u043e\u049b\u0442\u0430\u0442\u0443:", + "MinutesBefore": "\u043c\u0438\u043d\u0443\u0442 \u0430\u043b\u0434\u044b\u043d\u0434\u0430", + "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442 \u0441\u043e\u04a3\u044b\u04a3\u0434\u0430", + "SkipEpisodesAlreadyInMyLibrary": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043c\u0434\u0430 \u0431\u0430\u0440 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u04e9\u0442\u043a\u0456\u0437\u0456\u043f \u0436\u0456\u0431\u0435\u0440\u0443", + "SkipEpisodesAlreadyInMyLibraryHelp": "\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430, \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440 \u043c\u0430\u0443\u0441\u044b\u043c \u0436\u04d9\u043d\u0435 \u0431\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u043b\u0435\u0440\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0441\u0430\u043b\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b.", + "LabelKeepUpTo": "\u041e\u0441\u044b\u0493\u0430\u043d \u0434\u0435\u0439\u0456\u043d \u04b1\u0441\u0442\u0430\u0443:", + "AsManyAsPossible": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d\u0448\u0435 \u043a\u04e9\u043f", + "DefaultErrorMessage": "\u0421\u0430\u0443\u0430\u043b \u04e9\u04a3\u0434\u0435\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", + "LabelKeep:": "\u04b0\u0441\u0442\u0430\u0443:", + "UntilIDelete": "\u041c\u0435\u043d \u0436\u043e\u0439\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d", + "UntilSpaceNeeded": "\u041e\u0440\u044b\u043d \u043a\u0435\u0440\u0435\u043a \u0431\u043e\u043b\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d", + "Categories": "\u0421\u0430\u043d\u0430\u0442\u0442\u0430\u0440", + "Sports": "\u0421\u043f\u043e\u0440\u0442", + "News": "\u0416\u0430\u04a3\u0430\u043b\u044b\u049b", + "Movies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", + "Kids": "\u0411\u0430\u043b\u0430\u043b\u044b\u049b", + "EnableColorCodedBackgrounds": "\u0422\u04af\u0441\u043f\u0435\u043d \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0433\u0435\u043d \u04e9\u04a3\u0434\u0435\u0440\u0434\u0456 \u049b\u043e\u0441\u0443" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json index d2c27d3f4..b5e2a8b87 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\ucd94\uac00", @@ -39,16 +47,11 @@ "Saturday": "\ud1a0\uc694\uc77c", "Days": "\uc77c", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "\uc774\uc804 \uc5ec\ubc31 (\ubd84):", - "LabelPostPaddingMinutes": "\uc774\ud6c4 \uc5ec\ubc31 (\ubd84):", - "RecordOnAllChannels": "\ubaa8\ub4e0 \ucc44\ub110 \ub179\ud654", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "\uc0c8 \uc5d0\ud53c\uc18c\ub4dc\ub9cc \ub179\ud654", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "\uc790\ub3d9 \uc2dc\ub9ac\uc988 \ub179\ud654\ub97c \uc608\uc57d\ud558\ub824\uba74 Emby \ud504\ub9ac\ubbf8\uc5b4 \uac00\uc785\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\ub179\ud654", "Save": "\uc800\uc7a5", "Edit": "\ud3b8\uc9d1", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "\ucd5c\uc18c \ub450 \uac1c\uc758 \ud56d\ubaa9\uc744 \uc120\ud0dd\ud558\uc138\uc694.", - "TheSelectedItemsWillBeGrouped": "\uc120\ud0dd\ud55c \ube44\ub514\uc624\ub97c \ud55c \uac1c\uc758 \uac00\uc0c1 \ud56d\ubaa9\uc73c\ub85c \ubb36\uc2b5\ub2c8\ub2e4. Emby \uc571\uc774 \uc7a5\uce58\uc640 \ub124\ud2b8\uc6cc\ud06c \uc131\ub2a5\uc744 \uae30\uc900\uc73c\ub85c \uc790\ub3d9 \uc120\ud0dd\ud558\uc5ec \uc7ac\uc0dd\ud569\ub2c8\ub2e4. \uacc4\uc18d\ud558\uaca0\uc2b5\ub2c8\uae4c?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "\ub179\ud654 \ucde8\uc18c \ud655\uc778", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "\uc694\uad6c \ucc98\ub9ac \uacfc\uc815\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json index a06b0cefb..405ff2ba5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index ee99226fe..e4d8e18e2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Spesial - {0}", "Share": "Del", "Add": "Legg til", @@ -39,16 +47,11 @@ "Saturday": "L\u00f8rdag", "Days": "Dager", "RecordSeries": "Ta opp serien", - "LabelPrePaddingMinutes": "Margin f\u00f8r programstart i minutter:", - "LabelPostPaddingMinutes": "Margin etter programslutt i minutter:", - "RecordOnAllChannels": "Ta opptak p\u00e5 alle kanaler", - "RecordAnytime": "Ta opptak n\u00e5r som helst", - "RecordOnlyNewEpisodes": "Ta opptak kun av nye episoder", "HeaderBecomeProjectSupporter": "Skaff Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Et aktivt Emby Premiere abonnement er p\u00e5krevd for \u00e5 kunne automatisere serieopptak.", - "OptionConvertRecordingsToStreamingFormat": "Automatisk konvertere opptak til et streaming vennlig format", - "OptionConvertRecordingsToStreamingFormatHelp": "Opptakene vil bli konvertert p\u00e5 et \u00f8yeblikk til MP4 for enkel avspilling p\u00e5 enhetene.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Denne funksjonen krever et aktivt Emby Premiere abonnement.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Opptak", "Save": "Lagre", "Edit": "Rediger", @@ -124,7 +127,6 @@ "MarkUnplayed": "Merker som usett", "GroupVersions": "Gruppering av versjoner", "PleaseSelectTwoItems": "Vennligst velg minst to elementer.", - "TheSelectedItemsWillBeGrouped": "De valgte videoene blir gruppert i en virtuell element. Emby app vil automatisk velge hvilken versjon du vil spille basert p\u00e5 enheten og nettverksytelse. Er du sikker p\u00e5 at du vil fortsette?", "TryMultiSelect": "Pr\u00f8v flervalg", "TryMultiSelectMessage": "Hvis du vil redigere flere medier elementer, klikker du bare og hold en plakat og velg elementene du \u00f8nsker \u00e5 administrere. Pr\u00f8v det!", "HeaderConfirmRecordingCancellation": "Bekreft Avbryt Opptak", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Det skjedde en feil under behandling av foresp\u00f8rselen. Vennligst pr\u00f8v igjen senere.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index 68463015a..d2b1b3240 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Speciaal - {0}", "Share": "Delen", "Add": "Toevoegen", @@ -13,7 +21,7 @@ "ValueSeriesYearToPresent": "{0}-Heden", "ReleaseYearValue": "Jaar van uitgifte: {0}", "OriginalAirDateValue": "Originele uitzenddatum: {0}", - "EndsAtValue": "Eindigt om: {0}", + "EndsAtValue": "Eindigt om {0}", "OptionSundayShort": "Zo", "OptionMondayShort": "Ma", "OptionTuesdayShort": "Di", @@ -39,16 +47,11 @@ "Saturday": "Zaterdag", "Days": "Dagen", "RecordSeries": "Series Opnemen", - "LabelPrePaddingMinutes": "Tijd voor het programma (Minuten):", - "LabelPostPaddingMinutes": "Tijd na het programma (Minuten):", - "RecordOnAllChannels": "Op alle kanalen opnemen", - "RecordAnytime": "Op elk tijdstip opnemen", - "RecordOnlyNewEpisodes": "Alleen nieuwe afleveringen opnemen", "HeaderBecomeProjectSupporter": "Verkrijg Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Er is een actief Emby Premiere abonnement benodigd om een automatische serie opname aan te maken.", - "OptionConvertRecordingsToStreamingFormat": "Opnamen automatisch converteren naar een streaming formaat", - "OptionConvertRecordingsToStreamingFormatHelp": "Opnames zullen direct worden omgezet naar MP4 voor het eenvoudig afspelen op uw apparaten.", + "PromoConvertRecordingsToStreamingFormat": "Automatisch converteren opnames naar een streaming formaat met Emby Premiere. Opnames zullen on the fly worden omgezet naar MP4 of MKV, op basis van deEmby server instellingen.", "FeatureRequiresEmbyPremiere": "Deze functie vereist een actieve Emby Premiere abonnement.", + "HeaderConvertYourRecordings": "Opnames omzetten", "Record": "Opnemen", "Save": "Opslaan", "Edit": "Bewerken", @@ -124,7 +127,6 @@ "MarkUnplayed": "Markeren als Niet Afgespeeld", "GroupVersions": "Versies groeperen", "PleaseSelectTwoItems": "Selecteer ten minste twee items.", - "TheSelectedItemsWillBeGrouped": "De geselecteerde videos worden in 1 item gegroepeerd. Emby apps zullen automatisch de juiste versie selecteren op basis van het apparaat en netwerk prestaties. Weet u zeker dat u door wilt gaan?", "TryMultiSelect": "Probeer multi-select", "TryMultiSelectMessage": "Als u meerdere media-items wilt bewerken, klikt u er op een poster en hou even vast, selecteer nu de items die u wilt beheren. Probeer maar!", "HeaderConfirmRecordingCancellation": "Bevestigen Annulering Opname", @@ -248,19 +250,19 @@ "PleaseEnterNameOrId": "Voer een naam of een externe Id in", "MessageItemSaved": "Item opgeslagen.", "SearchResults": "Zoekresultaten", - "SyncToOtherDevice": "Sync to other device", - "MakeAvailableOffline": "Make available offline", - "ServerNameIsRestarting": "Emby Server - {0} is restarting.", - "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", + "SyncToOtherDevice": "Synchroniseren met een ander apparaat", + "MakeAvailableOffline": "Maak offline beschikbaar", + "ServerNameIsRestarting": "Emby Server - {0} is opnieuw aan het opstarten.", + "ServerNameIsShuttingDown": "Emby Server - {0} is aan het afsluiten.", "HeaderDeleteItems": "Verwijder items", "ConfirmDeleteItems": "Het verwijderen van deze items verwijdert ze van het bestandssysteem en uit uw bibliotheek. Weet u zeker dat u verder wilt gaan?", - "PleaseRestartServerName": "Please restart Emby Server - {0}.", + "PleaseRestartServerName": "Herstart Emby Server - {0} aub.", "SyncJobCreated": "Synchronisatie taak gemaakt.", "LabelSyncTo": "Synchroniseer naar:", "LabelSyncJobName": "Naam synchroniseer taak:", "LabelQuality": "Kwaliteit", "LabelSyncNoTargetsHelp": "Het lijkt erop dat u momenteel geen apps heeft die synchroniseren ondersteunen.", - "DownloadScheduled": "Download scheduled", + "DownloadScheduled": "Download gepland", "LearnMore": "Meer informatie", "LabelProfile": "profiel:", "LabelBitrateMbps": "Bitrate (Mbps):", @@ -272,16 +274,52 @@ "LabelItemLimitHelp": "Optioneel. Een limiet stellen aan het aantal items die zullen worden gesynchroniseerd.", "PleaseSelectDeviceToSyncTo": "Selecteer een apparaat om mee te synchroniseren.", "Screenshots": "Screenshots", - "MoveRight": "Move right", - "MoveLeft": "Move left", - "ConfirmDeleteImage": "Delete image?", - "HeaderEditImages": "Edit Images", + "MoveRight": "Naar rechts verplaatsen", + "MoveLeft": "Naar links verplaatsen", + "ConfirmDeleteImage": "Afbeelding verwijderen?", + "HeaderEditImages": "Afbeeldingen bewerken", "Settings": "Instellingen", - "ShowIndicatorsFor": "Show indicators for:", - "NewEpisodes": "New episodes", - "HDPrograms": "HD programs", - "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", - "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "ShowIndicatorsFor": "Toon indicatoren voor:", + "NewEpisodes": "Nieuwe afleveringen", + "HDPrograms": "HD Programma's", + "LiveBroadcasts": "Live uitzendingen", + "Premieres": "Premi\u00e8res", + "RepeatEpisodes": "Herhaal afleveringen", + "DvrSubscriptionRequired": "Emby DVR vereist een actieve Emby premi\u00e8re-abonnement.", + "HeaderCancelRecording": "Opname Annuleren", + "HeaderKeepRecording": "Bewaar opname", + "HeaderLearnMore": "Meer informatie", + "DeleteMedia": "Verwijder media", + "SeriesSettings": "Series instellingen", + "HeaderRecordingOptions": "Opname instellingen", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Er is een fout opgetreden. Probeer later opnieuw.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json index d50ef496c..cbed3c1a9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Dodaj", @@ -39,16 +47,11 @@ "Saturday": "Sobota", "Days": "Dni", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minuty:", - "LabelPostPaddingMinutes": "Post-padding minuty:", - "RecordOnAllChannels": "Nagrywaj na wszystkich kana\u0142ach", - "RecordAnytime": "Nagrywaj o ka\u017cdym czasie", - "RecordOnlyNewEpisodes": "Nagrywaj tylko nowe odcinki", "HeaderBecomeProjectSupporter": "Kup Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Aktywna subskrypcja Emby Premiere jest wymagana aby tworzy\u0107 automatyczne nagrania seriali.", - "OptionConvertRecordingsToStreamingFormat": "Automatycznie konwertuj nagrania do formatu przyjaznego strumieniowaniu.", - "OptionConvertRecordingsToStreamingFormatHelp": "Nagrania zostan\u0105 skonwertowane \"w locie\" do formatu MP4 aby umo\u017cliwi\u0107 ich odtworzenie na wi\u0119kszo\u015bci urz\u0105dze\u0144.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Ta funkcja wymaga aktywnej subskrypcji Emby Premiere.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Nagrywaj", "Save": "Zapisz", "Edit": "Edytuj", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Prosz\u0119 wybierz przynajmniej dwie pozycje.", - "TheSelectedItemsWillBeGrouped": "Wybrane filmy b\u0119d\u0105 pogrupowane w jedn\u0105 virtualn\u0105 pozycj\u0119.\nAplikacje Emby b\u0119d\u0105 automatycznie wybiera\u0107 kt\u00f3r\u0105 wersj\u0119 odtwarza\u0107 na podstawie urz\u0105dzenia i wydajno\u015bci sieci. Czy jeste\u015b pewien \u017ce chcesz kontynuowa\u0107?", "TryMultiSelect": "Wypr\u00f3buj multi-zaznaczanie", "TryMultiSelectMessage": "Aby edytowa\u0107 kilka rzeczy naraz, po prostu kliknij i przytrzymaj jak\u0105kolwiek miniaturk\u0119 i zaznacz obiekty kt\u00f3rymi chesz zarz\u0105dza\u0107. To proste!", "HeaderConfirmRecordingCancellation": "Potwierd\u017a Anulowanie Nagrania", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Wyst\u0105pi\u0142 bl\u0105d podczas przetwarzania twojego rz\u0105dania. Prosz\u0119 spr\u00f3bowa\u0107 ponownie po\u017aniej.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index 64d94c762..c9c0e2ff0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Ordenar canais por:", + "ChannelNumber": "N\u00famero do canal", + "RecentlyWatched": "Assistido recentemente", + "PlaceFavoriteChannelsAtBeginning": "Colocar canais favoritos no in\u00edcio", + "SeriesCancelled": "S\u00e9rie cancelada.", + "HeaderKeepSeries": "Manter S\u00e9rie", + "HeaderCancelSeries": "Cancelar S\u00e9rie", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartilhar", "Add": "Adicionar", @@ -39,16 +47,11 @@ "Saturday": "S\u00e1bado", "Days": "Dias", "RecordSeries": "Gravar s\u00e9rie", - "LabelPrePaddingMinutes": "Minutos de Pre-padding:", - "LabelPostPaddingMinutes": "Minutos de Post-padding:", - "RecordOnAllChannels": "Gravar em todos os canais", - "RecordAnytime": "Gravar a qualquer hora", - "RecordOnlyNewEpisodes": "Gravar apenas novos epis\u00f3dios", "HeaderBecomeProjectSupporter": "Obter Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Uma subscri\u00e7\u00e3o ativa do Emby Premiere \u00e9 requerida para criar a grava\u00e7\u00e3o automatizada de s\u00e9ries.", - "OptionConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel a streaming", - "OptionConvertRecordingsToStreamingFormatHelp": "Grava\u00e7\u00f5es ser\u00e3o convertidas automaticamente para MP4 para uma reprodu\u00e7\u00e3o mais f\u00e1cil em seus dispositivos.", + "PromoConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel para streaming com Emby Premiere. Grava\u00e7\u00f5es ser\u00e3o convertidas em tempo real para MP4 ou MKV, baseado nas configura\u00e7\u00f5es do Servidor Emby.", "FeatureRequiresEmbyPremiere": "Este recurso requer uma subscri\u00e7\u00e3o ativa do Emby Premiere", + "HeaderConvertYourRecordings": "Converter suas Grava\u00e7\u00f5es", "Record": "Gravar", "Save": "Salvar", "Edit": "Editar", @@ -124,7 +127,6 @@ "MarkUnplayed": "Marcar como n\u00e3o-reproduzido", "GroupVersions": "Agrupar vers\u00f5es", "PleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.", - "TheSelectedItemsWillBeGrouped": "Os v\u00eddeos selecionados ser\u00e3o agrupados dentro de um item virtual. Os apps do Emby escolher\u00e3o automaticamente qual vers\u00e3o ser\u00e1 reproduzida com base na performance do dispositivo e da rede. Deseja realmente continuar?", "TryMultiSelect": "Experimentar a Sele\u00e7\u00e3o M\u00faltipla", "TryMultiSelectMessage": "Para editar itens m\u00faltiplos de m\u00eddia, basta clicar e segurar qualquer capa e selecionar os itens que gostaria de gerenciar. Experimente!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelamento da Grava\u00e7\u00e3o", @@ -277,11 +279,47 @@ "ConfirmDeleteImage": "Apagar imagem?", "HeaderEditImages": "Editar Imagens", "Settings": "Ajustes", - "ShowIndicatorsFor": "Show indicators for:", - "NewEpisodes": "New episodes", - "HDPrograms": "HD programs", - "LiveBroadcasts": "Live broadcasts", - "Premieres": "Premieres", - "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "ShowIndicatorsFor": "Mostrar indicadores para:", + "NewEpisodes": "Novos epis\u00f3dios", + "HDPrograms": "Programas em HD", + "LiveBroadcasts": "Broadcasts ao vivo", + "Premieres": "Estr\u00e9ias", + "RepeatEpisodes": "Repetir epis\u00f3dios", + "DvrSubscriptionRequired": "Emby DVR requer uma assinatura ativa do Emby Premiere", + "HeaderCancelRecording": "Cancelar Grava\u00e7\u00e3o", + "HeaderKeepRecording": "Continuar Gravando", + "HeaderLearnMore": "Saiba Mais", + "DeleteMedia": "Excluir m\u00eddia", + "SeriesSettings": "Configura\u00e7\u00f5es da s\u00e9rie", + "HeaderRecordingOptions": "Op\u00e7\u00f5es de Grava\u00e7\u00e3o", + "CancelSeries": "Cancelar s\u00e9rie", + "DoNotRecord": "N\u00e3o gravar", + "HeaderSeriesOptions": "Op\u00e7\u00f5es da S\u00e9rie", + "LabelChannels": "Canais:", + "ChannelNameOnly": "Somente canal {0}", + "Anytime": "A qualquer momento", + "AroundTime": "Em torno de {0}", + "LabelAirtime": "Hor\u00e1rio de exibi\u00e7\u00e3o:", + "AllChannels": "Todos os canais", + "LabelRecord": "Gravar:", + "NewEpisodesOnly": "Apenas novos epis\u00f3dios", + "AllEpisodes": "Todos os epis\u00f3dios", + "LabelStartWhenPossible": "Iniciar quando poss\u00edvel:", + "LabelStopWhenPossible": "Parar quando poss\u00edvel:", + "MinutesBefore": "minutos antes de", + "MinutesAfter": "minutos ap\u00f3s", + "SkipEpisodesAlreadyInMyLibrary": "Ignorar epis\u00f3dios que j\u00e1 estejam em minha biblioteca", + "SkipEpisodesAlreadyInMyLibraryHelp": "Epis\u00f3dios ser\u00e3o comparados utilizando temporada e n\u00fameros de epis\u00f3dios, quando dispon\u00edveis.", + "LabelKeepUpTo": "Manter at\u00e9:", + "AsManyAsPossible": "Quantos forem poss\u00edveis", + "DefaultErrorMessage": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", + "LabelKeep:": "Manter:", + "UntilIDelete": "At\u00e9 eu excluir", + "UntilSpaceNeeded": "At\u00e9 o espa\u00e7o necess\u00e1rio", + "Categories": "Categorias", + "Sports": "Esportes", + "News": "Not\u00edcias", + "Movies": "Filmes", + "Kids": "Crian\u00e7as", + "EnableColorCodedBackgrounds": "Habilitar cores de fundo por c\u00f3digo" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json index dc9a8d258..5d6945210 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Partilhar", "Add": "Adicionar", @@ -39,16 +47,11 @@ "Saturday": "S\u00e1bado", "Days": "Dias", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Minutos pr\u00e9vios extra:", - "LabelPostPaddingMinutes": "Minutos posteriores extra:", - "RecordOnAllChannels": "Gravar em todos os canais", - "RecordAnytime": "Gravar a qualquer hora", - "RecordOnlyNewEpisodes": "Gravar apenas novos epis\u00f3dios", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "Uma subscri\u00e7\u00e3o Emby Premiere \u00e9 necess\u00e1ria para criar a grava\u00e7\u00e3o autom\u00e1tica de s\u00e9ries.", - "OptionConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel a streaming", - "OptionConvertRecordingsToStreamingFormatHelp": "Grava\u00e7\u00f5es ser\u00e3o convertidas automaticamente para MP4 para uma reprodu\u00e7\u00e3o mais f\u00e1cil em seus dispositivos.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Este recurso requer uma subscri\u00e7\u00e3o ativa do Emby Premiere", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Gravar", "Save": "Guardar", "Edit": "Editar", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.", - "TheSelectedItemsWillBeGrouped": "Os v\u00eddeos selecionados ser\u00e3o agrupados dentro de um item virtual. Os apps do Emby escolher\u00e3o automaticamente qual vers\u00e3o ser\u00e1 reproduzida com base na performance do dispositivo e da rede. Deseja realmente continuar?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "Para editar m\u00faltiplos ficheiros de multim\u00e9dia, basta clicar e segurar qualquer capa e selecionar os itens que gostaria de gerir. Experimente!", "HeaderConfirmRecordingCancellation": "Confirmar Cancelamento da Grava\u00e7\u00e3o", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json index aa97d4148..b3ef274e8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Sambata", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Salveaza", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 0894664c1..e2e09dfd9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u043f\u043e:", + "ChannelNumber": "\u041d\u043e\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430", + "RecentlyWatched": "\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0435", + "PlaceFavoriteChannelsAtBeginning": "\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435", + "SeriesCancelled": "\u0421\u0435\u0440\u0438\u0430\u043b \u043e\u0442\u043c\u0435\u043d\u0451\u043d.", + "HeaderKeepSeries": "\u0421\u0431\u0435\u0440\u0435\u0447\u044c \u0441\u0435\u0440\u0438\u0430\u043b", + "HeaderCancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", @@ -39,16 +47,11 @@ "Saturday": "\u0441\u0443\u0431\u0431\u043e\u0442\u0430", "Days": "\u0414\u043d\u0438", "RecordSeries": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b", - "LabelPrePaddingMinutes": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0442\u0431\u0438\u0432\u043a\u0430, \u043c\u0438\u043d:", - "LabelPostPaddingMinutes": "\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043e\u0442\u0431\u0438\u0432\u043a\u0430, \u043c\u0438\u043d:", - "RecordOnAllChannels": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432", - "RecordAnytime": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f", - "RecordOnlyNewEpisodes": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", "HeaderBecomeProjectSupporter": "\u041f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u0414\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0438\u0439.", - "OptionConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442", - "OptionConvertRecordingsToStreamingFormatHelp": "\u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 MP4 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445.", + "PromoConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emby Premiere. \u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 MP4 \u0438\u043b\u0438 MKV, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Emby Server.", "FeatureRequiresEmbyPremiere": "\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", + "HeaderConvertYourRecordings": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "Record": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c", "Save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", "Edit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", @@ -124,7 +127,6 @@ "MarkUnplayed": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u0435\u0432\u043e\u0441\u043f\u0440-\u043e\u0435", "GroupVersions": "\u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438", "PleaseSelectTwoItems": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.", - "TheSelectedItemsWillBeGrouped": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0412 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", "TryMultiSelect": "\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435", "TryMultiSelectMessage": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b\u0448\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u044d\u0442\u043e!", "HeaderConfirmRecordingCancellation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0438", @@ -137,7 +139,7 @@ "LabelOriginalTitle": "\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:", "LabelSortTitle": "\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e:", "LabelDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f:", - "ConfigureDateAdded": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0430\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u0438 Emby Server \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", + "ConfigureDateAdded": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0430\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u041f\u0430\u043d\u0435\u043b\u0438 Emby Server \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", "LabelStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:", "LabelArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438:", "LabelArtistsHelp": "\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u00ab;\u00bb", @@ -248,10 +250,10 @@ "PleaseEnterNameOrId": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 ID.", "MessageItemSaved": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d.", "SearchResults": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430", - "SyncToOtherDevice": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c", + "SyncToOtherDevice": "\u0421\u0438\u043d\u0445\u0440\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c", "MakeAvailableOffline": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e", "ServerNameIsRestarting": "Emby Server - {0} \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.", - "ServerNameIsShuttingDown": "Emby Server - {0} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.", + "ServerNameIsShuttingDown": "Emby Server - {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.", "HeaderDeleteItems": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432", "ConfirmDeleteItems": "\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043d \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f \u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", "PleaseRestartServerName": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Emby Server - {0}.", @@ -259,7 +261,7 @@ "LabelSyncTo": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441:", "LabelSyncJobName": "\u0418\u043c\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440-\u0438\u0438:", "LabelQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e:", - "LabelSyncNoTargetsHelp": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e.", + "LabelSyncNoTargetsHelp": "\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0431\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f.", "DownloadScheduled": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e", "LearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", "LabelProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c:", @@ -282,6 +284,42 @@ "HDPrograms": "HD-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", "LiveBroadcasts": "\u041f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", "Premieres": "\u041f\u0440\u0435\u043c\u044c\u0435\u0440\u044b", - "RepeatEpisodes": "\u041f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", - "DvrSubscriptionRequired": "\u0414\u043b\u044f Emby DVR \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere." + "RepeatEpisodes": "\u041f\u043e\u0432\u0442\u043e\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", + "DvrSubscriptionRequired": "\u0414\u043b\u044f Emby DVR \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", + "HeaderCancelRecording": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c", + "HeaderKeepRecording": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", + "HeaderLearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", + "DeleteMedia": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "SeriesSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0440\u0438\u0430\u043b\u0430", + "HeaderRecordingOptions": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438", + "CancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b", + "DoNotRecord": "\u041d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c", + "HeaderSeriesOptions": "\u041e\u043f\u0446\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0430", + "LabelChannels": "\u041a\u0430\u043d\u0430\u043b\u044b:", + "ChannelNameOnly": "\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b {0}", + "Anytime": "\u0412 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f", + "AroundTime": "\u041e\u043a\u043e\u043b\u043e {0}", + "LabelAirtime": "\u0412\u0440\u0435\u043c\u044f \u044d\u0444\u0438\u0440\u0430:", + "AllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b", + "LabelRecord": "\u0417\u0430\u043f\u0438\u0441\u044c:", + "NewEpisodesOnly": "\u0422\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", + "AllEpisodes": "\u0412\u0441\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", + "LabelStartWhenPossible": "\u041d\u0430\u0447\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:", + "LabelStopWhenPossible": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:", + "MinutesBefore": "\u043c\u0438\u043d\u0443\u0442\u044b \u0434\u043e", + "MinutesAfter": "\u043c\u0438\u043d\u0443\u0442\u044b \u043f\u043e\u0441\u043b\u0435", + "SkipEpisodesAlreadyInMyLibrary": "\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u043f\u0438\u0437\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043c\u043e\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", + "SkipEpisodesAlreadyInMyLibraryHelp": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0435\u0437\u043e\u043d\u043e\u0432 \u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.", + "LabelKeepUpTo": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c \u0434\u043e:", + "AsManyAsPossible": "\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435", + "DefaultErrorMessage": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", + "LabelKeep:": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c:", + "UntilIDelete": "\u041f\u043e\u043a\u0430 \u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u044e", + "UntilSpaceNeeded": "\u041f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e", + "Categories": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", + "Sports": "\u0421\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0435", + "News": "\u041d\u043e\u0432\u043e\u0441\u0442\u043d\u044b\u0435", + "Movies": "\u0424\u0438\u043b\u044c\u043c\u043e\u0432\u044b\u0435", + "Kids": "\u0414\u0435\u0442\u0441\u043a\u0438\u0435", + "EnableColorCodedBackgrounds": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0444\u043e\u043d" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json index a06b0cefb..405ff2ba5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json index 182b6256d..9347dbe75 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Uporaba te funkcionalnosti zahteva aktivno Emby Premiere narocnino.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index 5370ba75f..ccc6bd735 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", "Share": "Dela", "Add": "L\u00e4gg till", @@ -39,16 +47,11 @@ "Saturday": "L\u00f6rdag", "Days": "Dagar", "RecordSeries": "Spela in serie", - "LabelPrePaddingMinutes": "Marginal i minuter f\u00f6re programstart:", - "LabelPostPaddingMinutes": "Marginal i minuter efter programslut:", - "RecordOnAllChannels": "Spela in p\u00e5 alla kanaler", - "RecordAnytime": "Spela in n\u00e4r som helst", - "RecordOnlyNewEpisodes": "Spela bara in nya avsnitt", "HeaderBecomeProjectSupporter": "Skaffa Emby Premium", "MessageActiveSubscriptionRequiredSeriesRecordings": "Ett aktivt Emby Premium-medlemskap kr\u00e4vs f\u00f6r att skapa automatiska TV-serieinspelningar.", - "OptionConvertRecordingsToStreamingFormat": "Konvertera inspelningar automatiskt till ett str\u00f6mningsv\u00e4nligt format", - "OptionConvertRecordingsToStreamingFormatHelp": "Inspelningar omkodas till MP4 f\u00f6r problemfri str\u00f6mning till dina enheter.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "Den h\u00e4r funktionen kr\u00e4ver en aktiv Emby Premium prenumeration.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Spela in", "Save": "Spara", "Edit": "\u00c4ndra", @@ -124,7 +127,6 @@ "MarkUnplayed": "Markera som ospelad", "GroupVersions": "Gruppera versioner", "PleaseSelectTwoItems": "Var god v\u00e4lj minst tv\u00e5 objekt.", - "TheSelectedItemsWillBeGrouped": "Markerade videos kommer att grupperas till ett virtuellt objekt. Emby appar kommer sen automatiskt v\u00e4lja den versionen som \u00e4r b\u00e4st anpassad efter enhet och n\u00e4tverksprestanda. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", "TryMultiSelect": "Pr\u00f6va flervalsmarkering", "TryMultiSelectMessage": "F\u00f6r att redigera flera mediaobjekt, klicka och h\u00e5ll p\u00e5 ett omslag och markera sedan s\u00e5 m\u00e5nga du vill. Pr\u00f6va nu!", "HeaderConfirmRecordingCancellation": "Bekr\u00e4fta avbrott av inspelning", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "Ett fel uppstd vid beg\u00e4ran. F\u00f6rs\u00f6k igen senare.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json index 38a3c442a..9ad858510 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Ekle", @@ -39,16 +47,11 @@ "Saturday": "Cumartesi", "Days": "G\u00fcnler", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Sadece yeni b\u00f6l\u00fcmleri kaydet", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Kay\u0131t", "Save": "Kay\u0131t", "Edit": "D\u00fczenle", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json index 664666cb3..a94df0812 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -39,16 +47,11 @@ "Saturday": "Saturday", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "\u0417\u0431\u0435\u0440\u0456\u0433\u0442\u0438", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json index b6b8e16ce..a40533652 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Th\u00eam", @@ -39,16 +47,11 @@ "Saturday": "Th\u1ee9 B\u1ea3y", "Days": "Days", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "Pre-padding minutes:", - "LabelPostPaddingMinutes": "Post-padding minutes:", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "L\u01b0u", "Edit": "Edit", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json index 31f4a7114..6a77b89a5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u6dfb\u52a0", @@ -39,16 +47,11 @@ "Saturday": "\u661f\u671f\u516d", "Days": "\u5929", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "\u9884\u5148\u5145\u586b\u5206\u949f\u6570\uff1a", - "LabelPostPaddingMinutes": "\u540e\u671f\u586b\u5145\u5206\u949f\u6570\uff1a", - "RecordOnAllChannels": "Record on all channels", - "RecordAnytime": "Record at any time", - "RecordOnlyNewEpisodes": "\u53ea\u5f55\u5236\u65b0\u5267\u96c6", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u5f55\u5236", "Save": "\u50a8\u5b58", "Edit": "\u7f16\u8f91", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "\u8bf7\u81f3\u5c11\u9009\u62e92\u4e2a\u9879\u76ee\u3002", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "\u786e\u8ba4\u53d6\u6d88\u5f55\u5236", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json index 2ef701261..7de065690 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u65b0\u589e", @@ -39,16 +47,11 @@ "Saturday": "\u661f\u671f\u516d", "Days": "\u9304\u5f71\u65e5", "RecordSeries": "Record series", - "LabelPrePaddingMinutes": "\u6e96\u5099\u88dc\u5145(\u5206\u9418)\uff1a", - "LabelPostPaddingMinutes": "\u5f8c\u88dc\u5145(\u5206\u9418)\uff1a", - "RecordOnAllChannels": "\u8a18\u9304\u6240\u6709\u983b\u9053", - "RecordAnytime": "\u6bcf\u4e00\u6b21\u8a18\u9304", - "RecordOnlyNewEpisodes": "\u53ea\u8a18\u9304\u6700\u65b0\u5287\u96c6", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u9304\u5f71", "Save": "\u5132\u5b58", "Edit": "\u7de8\u8f2f", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json index f0cea9806..7aa41c9a2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json @@ -1,4 +1,12 @@ { + "SortChannelsBy": "Sort channels by:", + "ChannelNumber": "Channel number", + "RecentlyWatched": "Recently watched", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "SeriesCancelled": "Series cancelled.", + "HeaderKeepSeries": "Keep Series", + "HeaderCancelSeries": "Cancel Series", + "CancelRecording": "Cancel recording", "ValueSpecialEpisodeName": "Special - {0}", "Share": "\u5206\u4eab", "Add": "\u6dfb\u52a0", @@ -39,16 +47,11 @@ "Saturday": "\u661f\u671f\u516d", "Days": "\u9304\u5f71\u65e5", "RecordSeries": "\u9304\u88fd\u6574\u500b\u7cfb\u5217", - "LabelPrePaddingMinutes": "\u63d0\u524d\u958b\u59cb\u5206\u9418\u6578\uff1a", - "LabelPostPaddingMinutes": "\u5ef6\u5f8c\u7d50\u675f\u5206\u9418\u6578\uff1a", - "RecordOnAllChannels": "\u5728\u6240\u6709\u983b\u9053\u9304\u88fd", - "RecordAnytime": "\u5728\u4efb\u4f55\u6642\u9593\u9304\u88fd", - "RecordOnlyNewEpisodes": "\u53ea\u9304\u88fd\u65b0\u7684\u96c6\u6578", "HeaderBecomeProjectSupporter": "\u7acb\u5373\u53d6\u5f97", "MessageActiveSubscriptionRequiredSeriesRecordings": "\u8981\u4f7f\u7528\u81ea\u52d5\u9304\u88fd\u7cfb\u5217\u7684\u529f\u80fd\uff0c\u9700\u8981\u6709\u6548\u7684Emby\u8c6a\u83ef\u7248\u8a02\u95b1", - "OptionConvertRecordingsToStreamingFormat": "\u81ea\u52d5\u5c07\u9304\u88fd\u5167\u5bb9\u8f49\u63db\u6210\u9069\u7528\u65bc\u4e32\u6d41\u7684\u683c\u5f0f", - "OptionConvertRecordingsToStreamingFormatHelp": "\u9304\u88fd\u7684\u5167\u5bb9\u5c07\u6703\u8f49\u63db\u6210MP4\uff0c\u4ee5\u4fbf\u66f4\u5bb9\u6613\u5730\u5728\u60a8\u7684\u88dd\u7f6e\u4e0a\u64ad\u653e", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "\u6b64\u529f\u80fd\u9700\u8981\u6709\u6548\u7684Emby\u8c6a\u83ef\u7248\u8a02\u95b1", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "\u958b\u59cb\u9304\u5f71", "Save": "\u4fdd\u5b58", "Edit": "\u7de8\u8f2f", @@ -124,7 +127,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -283,5 +285,41 @@ "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription." + "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", + "HeaderCancelRecording": "Cancel Recording", + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", + "CancelSeries": "Cancel series", + "DoNotRecord": "Do not record", + "HeaderSeriesOptions": "Series Options", + "LabelChannels": "Channels:", + "ChannelNameOnly": "Channel {0} only", + "Anytime": "Anytime", + "AroundTime": "Around {0}", + "LabelAirtime": "Airtime:", + "AllChannels": "All channels", + "LabelRecord": "Record:", + "NewEpisodesOnly": "New episodes only", + "AllEpisodes": "All episodes", + "LabelStartWhenPossible": "Start when possible:", + "LabelStopWhenPossible": "Stop when possible:", + "MinutesBefore": "minutes before", + "MinutesAfter": "minutes after", + "SkipEpisodesAlreadyInMyLibrary": "Skip episodes that are already in my library", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "LabelKeepUpTo": "Keep up to:", + "AsManyAsPossible": "As many as possible", + "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "LabelKeep:": "Keep:", + "UntilIDelete": "Until I delete", + "UntilSpaceNeeded": "Until space needed", + "Categories": "Categories", + "Sports": "Sports", + "News": "News", + "Movies": "Movies", + "Kids": "Kids", + "EnableColorCodedBackgrounds": "Enable color coded backgrounds" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js index b6aedc45b..dde0a3277 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'appStorage', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button'], function (dialogHelper, require, layoutManager, globalize, appStorage, connectionManager, loading, focusManager, dom, appHost) { +define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { var currentItem; var hasChanges; @@ -68,7 +68,14 @@ require(['confirm'], function (confirm) { - confirm(msg, globalize.translate('sharedcomponents#ConfirmDeletion')).then(function () { + confirm({ + + title: globalize.translate('sharedcomponents#ConfirmDeletion'), + text: msg, + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(function () { loading.show(); @@ -184,7 +191,7 @@ return ''; }); - var lastLanguage = appStorage.getItem('subtitleeditor-language'); + var lastLanguage = userSettings.get('subtitleeditor-language'); if (lastLanguage) { selectLanguage.value = lastLanguage; } @@ -290,7 +297,7 @@ function searchForSubtitles(context, language) { - appStorage.setItem('subtitleeditor-language', language); + userSettings.set('subtitleeditor-language', language); loading.show(); diff --git a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html index 12a7eeaa0..2a9fca002 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html @@ -8,7 +8,7 @@

${SearchForSubtitles}

-

+

diff --git a/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js b/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js index bf93f7e90..05e6d8af7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js +++ b/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js @@ -397,7 +397,7 @@ html += globalize.translate('sharedcomponents#Sync'); html += ''; - html += ''; + html += ''; html += '
'; diff --git a/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js b/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js index f8fe0bbc5..f1cd83b9c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js +++ b/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js @@ -1,14 +1,22 @@ -define(['connectionManager', 'globalize', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize) { +define(['connectionManager', 'globalize', 'dom', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize, dom) { + 'use strict'; + + var userDataMethods = { + markPlayed: markPlayed, + markDislike: markDislike, + markLike: markLike, + markFavorite: markFavorite + }; function getUserDataButtonHtml(method, itemId, buttonCssClass, iconCssClass, icon, tooltip, style) { - if (style == 'fab-mini') { + if (style === 'fab-mini') { style = 'fab'; buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini'; } - var is = style == 'fab' ? 'emby-button' : 'paper-icon-button-light'; - var className = style == 'fab' ? 'autoSize fab' : 'autoSize'; + var is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light'; + var className = style === 'fab' ? 'autoSize fab' : 'autoSize'; if (buttonCssClass) { className += ' ' + buttonCssClass; @@ -22,16 +30,47 @@ define(['connectionManager', 'globalize', 'paper-icon-button-light', 'material-i iconCssClass += 'md-icon'; - return ''; + return ''; + } + + function onContainerClick(e) { + + var btnUserData = dom.parentWithClass(e.target, 'btnUserData'); + + if (!btnUserData) { + return; + } + + var method = btnUserData.getAttribute('data-method'); + userDataMethods[method](btnUserData); } function fill(options) { var html = getIconsHtml(options); - options.element.innerHTML = html; + if (options.fillMode === 'insertAdjacent') { + options.element.insertAdjacentHTML(options.insertLocation || 'beforeend', html); + } else { + options.element.innerHTML = html; + } + + dom.removeEventListener(options.element, 'click', onContainerClick, { + passive: true + }); + + dom.addEventListener(options.element, 'click', onContainerClick, { + passive: true + }); + } + + function destroy(options) { + + options.element.innerHTML = ''; + + dom.removeEventListener(options.element, 'click', onContainerClick, { + passive: true + }); } function getIconsHtml(options) { @@ -58,8 +97,8 @@ define(['connectionManager', 'globalize', 'paper-icon-button-light', 'material-i if (includePlayed !== false) { var tooltipPlayed = globalize.translate('sharedcomponents#MarkPlayed'); - if (item.MediaType == 'Video' || item.Type == 'Series' || item.Type == 'Season' || item.Type == 'BoxSet' || item.Type == 'Playlist') { - if (item.Type != 'TvChannel') { + if (item.MediaType === 'Video' || item.Type === 'Series' || item.Type === 'Season' || item.Type === 'BoxSet' || item.Type === 'Playlist') { + if (item.Type !== 'TvChannel') { if (userData.Played) { html += getUserDataButtonHtml('markPlayed', itemId, btnCssClass + ' btnUserDataOn', iconCssClass, 'check', tooltipPlayed, style); } else { @@ -195,15 +234,9 @@ define(['connectionManager', 'globalize', 'paper-icon-button-light', 'material-i return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id); } - window.UserDataButtons = { - markPlayed: markPlayed, - markDislike: markDislike, - markLike: markLike, - markFavorite: markFavorite - }; - return { fill: fill, + destroy: destroy, getIconsHtml: getIconsHtml }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettings.js b/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettings.js index d523e1474..6b3dc90d4 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettings.js +++ b/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettings.js @@ -1,4 +1,5 @@ define(['userSettingsBuilder'], function (userSettingsBuilder) { + 'use strict'; return new userSettingsBuilder(); }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettingsbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettingsbuilder.js index 9acbb1a0a..0ddcf0b78 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettingsbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/usersettings/usersettingsbuilder.js @@ -1,4 +1,5 @@ define(['appSettings', 'events', 'browser'], function (appsettings, events, browser) { + 'use strict'; return function () { @@ -50,7 +51,7 @@ define(['appSettings', 'events', 'browser'], function (appsettings, events, brow saveServerPreferences(); } - if (currentValue != value) { + if (currentValue !== value) { events.trigger(self, 'change', [name]); } }; @@ -79,7 +80,7 @@ define(['appSettings', 'events', 'browser'], function (appsettings, events, brow val = self.get('enableCinemaMode', false); if (val) { - return val != 'false'; + return val !== 'false'; } return true; @@ -94,7 +95,7 @@ define(['appSettings', 'events', 'browser'], function (appsettings, events, brow val = self.get('enableThemeSongs', false); if (val) { - return val != 'false'; + return val !== 'false'; } return true; @@ -109,7 +110,7 @@ define(['appSettings', 'events', 'browser'], function (appsettings, events, brow val = self.get('enableThemeVideos', false); if (val) { - return val != 'false'; + return val !== 'false'; } return !browser.slow; diff --git a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js index ca3b6ffb7..bfc03eff8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js +++ b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js @@ -1,4 +1,5 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { + 'use strict'; var mainAnimatedPages = document.querySelector('.mainAnimatedPages'); var allPages = []; @@ -32,7 +33,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { cancelActiveAnimations(); var selected = selectedPageIndex; - var previousAnimatable = selected == -1 ? null : allPages[selected]; + var previousAnimatable = selected === -1 ? null : allPages[selected]; var pageIndex = selected + 1; if (pageIndex >= pageContainerCount) { @@ -81,7 +82,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { function beforeAnimate(allPages, newPageIndex, oldPageIndex) { for (var i = 0, length = allPages.length; i < length; i++) { - if (newPageIndex == i || oldPageIndex == i) { + if (newPageIndex === i || oldPageIndex === i) { //allPages[i].classList.remove('hide'); } else { allPages[i].classList.add('hide'); @@ -91,7 +92,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { function afterAnimate(allPages, newPageIndex) { for (var i = 0, length = allPages.length; i < length; i++) { - if (newPageIndex == i) { + if (newPageIndex === i) { //allPages[i].classList.remove('hide'); } else { allPages[i].classList.add('hide'); @@ -102,9 +103,9 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) { if (enableAnimation() && oldAnimatedPage && newAnimatedPage.animate) { - if (transition == 'slide') { + if (transition === 'slide') { return slide(newAnimatedPage, oldAnimatedPage, transition, isBack); - } else if (transition == 'fade') { + } else if (transition === 'fade') { return fade(newAnimatedPage, oldAnimatedPage, transition, isBack); } } @@ -120,7 +121,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { iterations: 1, easing: 'ease-out', fill: 'both' - } + }; var animations = []; @@ -158,7 +159,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { iterations: 1, easing: 'ease-out', fill: 'both' - } + }; var animations = []; @@ -212,7 +213,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { var url = options.url; var index = currentUrls.indexOf(url); - if (index != -1) { + if (index !== -1) { var animatable = allPages[index]; var view = animatable; @@ -226,7 +227,7 @@ define(['browser', 'css!./viewcontainer-lite'], function (browser) { cancelActiveAnimations(); var selected = selectedPageIndex; - var previousAnimatable = selected == -1 ? null : allPages[selected]; + var previousAnimatable = selected === -1 ? null : allPages[selected]; if (onBeforeChange) { onBeforeChange(view, true, options); diff --git a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewmanager.js b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewmanager.js index ae7666acb..c22a6ca9b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewmanager.js @@ -1,4 +1,5 @@ define(['viewcontainer', 'focusManager', 'queryString', 'layoutManager'], function (viewcontainer, focusManager, queryString, layoutManager) { + 'use strict'; var currentView; var dispatchPageEvents; @@ -94,7 +95,7 @@ define(['viewcontainer', 'focusManager', 'queryString', 'layoutManager'], functi var url = options.url; var state = options.state; var index = url.indexOf('?'); - var params = index == -1 ? {} : queryString.parse(url.substring(index + 1)); + var params = index === -1 ? {} : queryString.parse(url.substring(index + 1)); return { detail: { diff --git a/dashboard-ui/bower_components/headroom.js/.bower.json b/dashboard-ui/bower_components/headroomjs/.bower.json similarity index 100% rename from dashboard-ui/bower_components/headroom.js/.bower.json rename to dashboard-ui/bower_components/headroomjs/.bower.json diff --git a/dashboard-ui/bower_components/headroom.js/LICENSE b/dashboard-ui/bower_components/headroomjs/LICENSE similarity index 100% rename from dashboard-ui/bower_components/headroom.js/LICENSE rename to dashboard-ui/bower_components/headroomjs/LICENSE diff --git a/dashboard-ui/bower_components/headroom.js/bower.json b/dashboard-ui/bower_components/headroomjs/bower.json similarity index 100% rename from dashboard-ui/bower_components/headroom.js/bower.json rename to dashboard-ui/bower_components/headroomjs/bower.json diff --git a/dashboard-ui/bower_components/headroom.js/dist/angular.headroom.js b/dashboard-ui/bower_components/headroomjs/dist/angular.headroom.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/angular.headroom.js rename to dashboard-ui/bower_components/headroomjs/dist/angular.headroom.js diff --git a/dashboard-ui/bower_components/headroom.js/dist/angular.headroom.min.js b/dashboard-ui/bower_components/headroomjs/dist/angular.headroom.min.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/angular.headroom.min.js rename to dashboard-ui/bower_components/headroomjs/dist/angular.headroom.min.js diff --git a/dashboard-ui/bower_components/headroom.js/dist/headroom.js b/dashboard-ui/bower_components/headroomjs/dist/headroom.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/headroom.js rename to dashboard-ui/bower_components/headroomjs/dist/headroom.js diff --git a/dashboard-ui/bower_components/headroom.js/dist/headroom.min.js b/dashboard-ui/bower_components/headroomjs/dist/headroom.min.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/headroom.min.js rename to dashboard-ui/bower_components/headroomjs/dist/headroom.min.js diff --git a/dashboard-ui/bower_components/headroom.js/dist/jQuery.headroom.js b/dashboard-ui/bower_components/headroomjs/dist/jQuery.headroom.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/jQuery.headroom.js rename to dashboard-ui/bower_components/headroomjs/dist/jQuery.headroom.js diff --git a/dashboard-ui/bower_components/headroom.js/dist/jQuery.headroom.min.js b/dashboard-ui/bower_components/headroomjs/dist/jQuery.headroom.min.js similarity index 100% rename from dashboard-ui/bower_components/headroom.js/dist/jQuery.headroom.min.js rename to dashboard-ui/bower_components/headroomjs/dist/jQuery.headroom.min.js diff --git a/dashboard-ui/bower_components/headroom.js/package.json b/dashboard-ui/bower_components/headroomjs/package.json similarity index 100% rename from dashboard-ui/bower_components/headroom.js/package.json rename to dashboard-ui/bower_components/headroomjs/package.json diff --git a/dashboard-ui/bower_components/hls.js/dist/hls.min.js b/dashboard-ui/bower_components/hls.js/dist/hls.min.js deleted file mode 100644 index 168b0f41d..000000000 --- a/dashboard-ui/bower_components/hls.js/dist/hls.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){return function s(e,t,r){function a(i,d){if(!t[i]){if(!e[i]){var l="function"==typeof require&&require;if(!d&&l)return l(i,!0);if(n)return n(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var o=t[i]={exports:{}};e[i][0].call(o.exports,function(t){var r=e[i][1][t];return a(r?r:t)},o,o.exports,s,e,t,r)}return t[i].exports}for(var n="function"==typeof require&&require,i=0;ie||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},e.prototype.emit=function(l){var s,e,u,i,n,o;if(this._events||(this._events={}),"error"===l&&(!this._events.error||r(this._events.error)&&!this._events.error.length)){if(s=arguments[1],s instanceof Error)throw s;throw TypeError('Uncaught, unspecified "error" event.')}if(e=this._events[l],a(e))return!1;if(t(e))switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:i=Array.prototype.slice.call(arguments,1),e.apply(this,i)}else if(r(e))for(i=Array.prototype.slice.call(arguments,1),o=e.slice(),u=o.length,n=0;u>n;n++)o[n].apply(this,i);return!0},e.prototype.addListener=function(i,n){var s;if(!t(n))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",i,t(n.listener)?n.listener:n),this._events[i]?r(this._events[i])?this._events[i].push(n):this._events[i]=[this._events[i],n]:this._events[i]=n,r(this._events[i])&&!this._events[i].warned&&(s=a(this._maxListeners)?e.defaultMaxListeners:this._maxListeners,s&&s>0&&this._events[i].length>s&&(this._events[i].warned=!0,"function"==typeof console.trace)),this},e.prototype.on=e.prototype.addListener,e.prototype.once=function(a,e){function r(){this.removeListener(a,r),i||(i=!0,e.apply(this,arguments))}if(!t(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(a,r),this},e.prototype.removeListener=function(i,a){var e,s,o,n;if(!t(a))throw TypeError("listener must be a function");if(!this._events||!this._events[i])return this;if(e=this._events[i],o=e.length,s=-1,e===a||t(e.listener)&&e.listener===a)delete this._events[i],this._events.removeListener&&this.emit("removeListener",i,a);else if(r(e)){for(n=o;n-- >0;)if(e[n]===a||e[n].listener&&e[n].listener===a){s=n;break}if(0>s)return this;1===e.length?(e.length=0,delete this._events[i]):e.splice(s,1),this._events.removeListener&&this.emit("removeListener",i,a)}return this},e.prototype.removeAllListeners=function(r){var a,e;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[r]&&delete this._events[r],this;if(0===arguments.length){for(a in this._events)"removeListener"!==a&&this.removeAllListeners(a);return this.removeAllListeners("removeListener"),this._events={},this}if(e=this._events[r],t(e))this.removeListener(r,e);else if(e)for(;e.length;)this.removeListener(r,e[e.length-1]);return delete this._events[r],this},e.prototype.listeners=function(e){var r;return r=this._events&&this._events[e]?t(this._events[e])?[this._events[e]]:this._events[e].slice():[]},e.prototype.listenerCount=function(r){if(this._events){var e=this._events[r];if(t(e))return 1;if(e)return e.length}return 0},e.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(n,a,s){var i=arguments[3],e=arguments[4],r=arguments[5],t=JSON.stringify;a.exports=function(l){for(var a,s=Object.keys(r),n=0,d=s.length;d>n;n++){var o=s[n],u=r[o].exports;if(u===l||u.default===l){a=o;break}}if(!a){a=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var f={},n=0,d=s.length;d>n;n++){var o=s[n];f[o]=o}e[a]=[Function(["require","module","exports"],"("+l+")(self)"),f]}var h=Math.floor(Math.pow(16,8)*Math.random()).toString(16),c={};c[a]=a,e[h]=[Function(["require"],"var f = require("+t(a)+");(f.default ? f.default : f)(self);"),c];var v="("+i+")({"+Object.keys(e).map(function(r){return t(r)+":["+e[r][0]+","+t(e[r][1])+"]"}).join(",")+"},{},["+t(h)+"])",g=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(g.createObjectURL(new Blob([v],{type:"text/javascript"})))}},{}],3:[function(e,m,o){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var g=function(){function e(a,r){for(var t=0;t500*e.duration){var f=i.levels,h=Math.max(1,1e3*e.loaded/u),v=Math.max(e.loaded,Math.round(e.duration*f[e.level].bitrate/8)),c=s.currentTime,d=(v-e.loaded)/h,o=n.default.bufferInfo(s,c,i.config.maxBufferHole).end-c;if(o<2*e.duration&&d>o){var l=void 0,a=void 0;for(a=e.level-1;a>=0&&(l=e.duration*f[a].bitrate/(6.4*h),t.logger.log("fragLoadedDelay/bufferStarvationDelay/fragLevelNextLoadedDelay["+a+"] :"+d.toFixed(1)+"/"+o.toFixed(1)+"/"+l.toFixed(1)),!(o>l));a--);d>l&&(a=Math.max(0,a),i.nextLoadLevel=a,this.bwEstimator.sample(u,e.loaded),t.logger.warn("loading too slow, abort fragment loading and switch to level "+a),e.loader.abort(),this.clearTimer(),i.trigger(r.default.FRAG_LOAD_EMERGENCY_ABORTED,{frag:e}))}}}}},{key:"onFragLoaded",value:function(t){var e=t.stats,r=t.frag;if(void 0===e.aborted&&1===r.loadCounter){var a=e.tload-e.trequest;this.bwEstimator.sample(a,e.loaded),r.bitrateTest?this.bitrateTestDelay=a/1e3:this.bitrateTestDelay=0}this.clearTimer(),this.lastLoadedFragLevel=t.frag.level,this._nextAutoLevel=-1}},{key:"onError",value:function(e){switch(e.details){case s.ErrorDetails.FRAG_LOAD_ERROR:case s.ErrorDetails.FRAG_LOAD_TIMEOUT:this.clearTimer()}}},{key:"clearTimer",value:function(){this.timer&&(clearInterval(this.timer),this.timer=null)}},{key:"findBestLevel",value:function(g,f,s,v,u,c,h,l){for(var e=v;e>=0;e--){var d=l[e],n=d.details,o=n?n.totalduration/n.fragments.length:f,r=void 0;r=g>=e?c*s:h*s;var i=l[e].bitrate,a=i*o/r;if(t.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+e+"/"+Math.round(r)+"/"+i+"/"+o+"/"+u+"/"+a),r>i&&(!a||u>a))return e}return 0}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(e){this._autoLevelCapping=e}},{key:"nextAutoLevel",get:function(){var i,u=this.hls,a=u.levels,e=u.config;if(i=-1===this._autoLevelCapping&&a&&a.length?a.length-1:this._autoLevelCapping,-1!==this._nextAutoLevel)return Math.min(this._nextAutoLevel,i);var r=u.media,c=this.lastLoadedFragLevel,f=this.fragCurrent?this.fragCurrent.duration:0,v=r?r.currentTime:0,g=r&&0!==r.playbackRate?Math.abs(r.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():e.abrEwmaDefaultEstimate,l=(n.default.bufferInfo(r,v,e.maxBufferHole).end-v)/g,h=this.findBestLevel(c,f,d,i,l,e.abrBandWidthFactor,e.abrBandWidthUpFactor,a);if(h)return h;t.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var o=e.maxStarvationDelay;if(0===l){var s=this.bitrateTestDelay;s&&(o-=s,t.logger.trace("bitrate test took "+Math.round(1e3*s)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*o)+" ms"))}return this.findBestLevel(c,f,d,i,l+o,e.abrBandWidthFactor,e.abrBandWidthUpFactor,a)},set:function(e){this._nextAutoLevel=e}}]),e}(i.default);o.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../utils/logger":38,"./ewma-bandwidth-estimator":6}],4:[function(a,v,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function h(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(i,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;tthis._msDuration&&(t.logger.log("Updating mediasource duration to "+this._levelDuration),e.duration=this._levelDuration,this._msDuration=this._levelDuration)}}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var r=this.flushRange[0];if(!this.flushBuffer(r.start,r.end))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var a=0,t=this.sourceBuffer;if(t)for(var i in t)a+=t[i].buffered.length;this.appended=a,this.hls.trigger(e.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var i=this.hls,s=this.sourceBuffer,n=this.segments;if(s){if(this.media.error)return n=[],void t.logger.error("trying to append although a media error occured, flush segment and abort");for(var l in s)if(s[l].updating)return;if(n.length){var o=n.shift();try{s[o.type].appendBuffer(o.data),this.appendError=0,this.appended++}catch(s){t.logger.error("error while trying to append buffer:"+s.message),n.unshift(o);var a={type:r.ErrorTypes.MEDIA_ERROR};if(22===s.code)return this.segments=[],a.details=r.ErrorDetails.BUFFER_FULL_ERROR,void i.trigger(e.default.ERROR,a);if(this.appendError?this.appendError++:this.appendError=1,a.details=r.ErrorDetails.BUFFER_APPEND_ERROR,a.frag=this.fragCurrent,this.appendError>i.config.appendErrorMaxRetry)return t.logger.log("fail "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),n=[],a.fatal=!0,void i.trigger(e.default.ERROR,a);a.fatal=!1,i.trigger(e.default.ERROR,a)}}}}},{key:"flushBuffer",value:function(l,s){var e,r,o,n,a,i;if(this.flushBufferCounter.5)return this.flushBufferCounter++,t.logger.log("flush "+u+" ["+a+","+i+"], of ["+o+","+n+"], pos:"+this.media.currentTime),e.remove(a,i),!1}else t.logger.warn("abort flushing too many retries");return t.logger.log("buffer flushed"),!0}}]),a}(s.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],5:[function(e,h,t){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function f(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(a,r){for(var t=0;tthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(n){var r=void 0,e=void 0,t=void 0,s=this.mediaWidth,o=this.mediaHeight,a=0,i=0;for(e=0;n>=e&&(t=this.levels[e],r=e,a=t.width,i=t.height,!(a>=s||i>=o));e++);return r}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),e}(s.default);t.default=u},{"../event-handler":22,"../events":23}],6:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t=0&&a1e3){r.logger.log("(re)loading playlist for level "+a);var o=i.urlId;this.hls.trigger(t.default.LEVEL_LOADING,{url:i.url[o],level:a,id:o})}}else this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.OTHER_ERROR,details:e.ErrorDetails.LEVEL_SWITCH_ERROR,level:a,fatal:!1,reason:"invalid level idx"})}},{key:"onError",value:function(n){if(!n.fatal){var i=n.details,o=this.hls,s=void 0,a=void 0,l=!1;switch(i){case e.ErrorDetails.FRAG_LOAD_ERROR:case e.ErrorDetails.FRAG_LOAD_TIMEOUT:case e.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case e.ErrorDetails.KEY_LOAD_ERROR:case e.ErrorDetails.KEY_LOAD_TIMEOUT:s=n.frag.level;break;case e.ErrorDetails.LEVEL_LOAD_ERROR:case e.ErrorDetails.LEVEL_LOAD_TIMEOUT:s=n.level,l=!0}if(void 0!==s)if(a=this._levels[s],a.urlIde&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){return void 0===this._startLevel?this._firstLevel:this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this._manualLevel?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,-1===this._manualLevel&&(this.hls.abrController.nextAutoLevel=e)}}]),a}(f.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],8:[function(i,A,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var m=function(){function e(a,r){for(var t=0;t0?(t.logger.log("configure startPosition @"+a),this.lastPaused||(t.logger.log("resuming video"),r.play()),this.state=e.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:i,this.state=e.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else t.logger.warn("cannot start loading as manifest not parsed yet"),this.state=e.STOPPED}},{key:"stopLoad",value:function(){var t=this.fragCurrent;t&&(t.loader&&t.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=e.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var R,l,n,c=this.hls,o=c.config,h=this.media,b=h&&h.seeking;switch(this.state){case e.ERROR:case e.PAUSED:break;case e.STARTING:var _=c.startLevel;-1===_&&(_=0,this.fragBitrateTest=!0),this.level=c.nextLoadLevel=_,this.state=e.WAITING_LEVEL,this.loadedmetadata=!1;break;case e.IDLE:if(!h&&(this.startFragRequested||!o.startFragPrefetch))break;R=this.loadedmetadata?h.currentTime:this.nextLoadPosition,l=c.nextLoadLevel;var v,T=s.default.bufferInfo(h,R,o.maxBufferHole),P=T.len,f=T.end,u=this.fragPrevious;if(this.levels[l].hasOwnProperty("bitrate")?(v=Math.max(8*o.maxBufferSize/this.levels[l].bitrate,o.maxBufferLength),v=Math.min(v,o.maxMaxBufferLength)):v=o.maxBufferLength,v>P){if(c.nextLoadLevel=l,this.level=l,n=this.levels[l].details,"undefined"==typeof n||n.live&&this.levelLastLoaded!==l){this.state=e.WAITING_LEVEL;break}if(!n.live&&u&&u.sn===n.endSN&&(!b||h.duration-f<=u.duration/2)){this.hls.trigger(r.default.BUFFER_EOS),this.state=e.ENDED;break}var d=n.fragments,g=d.length,m=d[0].start,E=d[g-1].start+d[g-1].duration,i=void 0;if(n.live){var D=void 0!==o.liveMaxLatencyDuration?o.liveMaxLatencyDuration:o.liveMaxLatencyDurationCount*n.targetduration;if(fy&&(h.currentTime=y)}if(n.PTSKnown&&f>E)break;if(this.startFragRequested&&!n.PTSKnown){if(u){var A=u.sn+1;A>=n.startSN&&A<=n.endSN&&(i=d[A-n.startSN],t.logger.log("live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=d[Math.min(g-1,Math.round(g/2))],t.logger.log("live playlist, switching playlist, unknown, load middle frag : "+i.sn))}}else m>f&&(i=d[0]);if(i||!function(){var e=o.maxFragLookUpTolerance;E>f?((f>E-e||b)&&(e=0),i=p.default.search(d,function(t){return t.start+t.duration-e<=f?1:t.start-e>f?-1:0})):i=d[g-1]}(),i){if(m=i.start,u&&i.level===u.level&&i.sn===u.sn){if(!(i.sno.maxBufferHole&&u.dropped?(i=d[k-1],t.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),u.loadCounter--):(i=d[k+1],t.logger.log("SN just loaded, load next one: "+i.sn)),!i)break}if(null!=i.decryptdata.uri&&null==i.decryptdata.key)t.logger.log("Loading key for "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l),this.state=e.KEY_LOADING,c.trigger(r.default.KEY_LOADING,{frag:i});else{if(t.logger.log("Loading "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", currentTime:"+R+",bufferEnd:"+f.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,i.loadCounter){i.loadCounter++;var S=o.fragLoadingLoopThreshold;if(i.loadCounter>S&&Math.abs(this.fragLoadIdx-i.loadIdx)=w||b)&&(t.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=e.IDLE);break;case e.STOPPED:case e.FRAG_LOADING:case e.PARSING:case e.PARSED:case e.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(a){var e,t,r=this.bufferRange;if(r)for(e=r.length-1;e>=0;e--)if(t=r[e],a>=t.start&&a<=t.end)return t;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(r){var a=this.media;if(a)for(var t=a.buffered,e=0;e=t.start(e)&&r<=t.end(e))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var t,e,a=this.media;if(a&&a.seeking===!1&&(e=a.currentTime,e>a.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=e),this.isBuffered(e)?t=this.getBufferRange(e):this.isBuffered(e+.1)&&(t=this.getBufferRange(e+.1)),t)){var i=t.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(r.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(t.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var a=this.media,i=void 0;a?(i=a.paused,a.pause()):i=!0,this.previouslyPaused=i}var n=this.fragCurrent;n&&n.loader&&n.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var t=this.media;if(t&&t.readyState){var n=void 0,i=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,i=this.getBufferRange(t.currentTime),i&&i.start>1&&(this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:i.start-1})),t.paused)n=0;else{var l=this.hls.nextLoadLevel,u=this.levels[l],o=this.fragLastKbps;n=o&&this.fragCurrent?this.fragCurrent.duration*u.bitrate/(1e3*o)+1:0}if(a=this.getBufferRange(t.currentTime+n),a&&(a=this.followingBufferRange(a))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(r){var e=this.media=r.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),e.addEventListener("seeking",this.onvseeking),e.addEventListener("seeked",this.onvseeked),e.addEventListener("ended",this.onvended);var t=this.config;this.levels&&t.autoStartLoad&&this.hls.startLoad(t.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(t.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var r=this.levels;r&&r.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===e.FRAG_LOADING){if(0===s.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){t.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var r=this.fragCurrent;r&&(r.loader&&r.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=e.IDLE}}else this.state===e.ENDED&&(this.state=e.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){t.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){t.logger.log("trigger BUFFER_RESET"),this.hls.trigger(r.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(r){var e,a=!1,i=!1;r.levels.forEach(function(t){e=t.audioCodec,e&&(-1!==e.indexOf("mp4a.40.2")&&(a=!0),-1!==e.indexOf("mp4a.40.5")&&(i=!0))}),this.audioCodecSwitch=a&&i,this.audioCodecSwitch&&t.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=r.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var n=this.config;n.autoStartLoad&&this.hls.startLoad(n.startPosition)}},{key:"onLevelLoaded",value:function(o){var a=o.details,i=o.level,l=this.levels[i],d=a.totalduration,n=0;if(t.logger.log("level "+i+" loaded ["+a.startSN+","+a.endSN+"],duration:"+d),this.levelLastLoaded=i,a.live){var f=l.details;f?(u.default.mergeDetails(f,a),n=a.fragments[0].start,a.PTSKnown?t.logger.log("live playlist sliding:"+n.toFixed(3)):t.logger.log("live playlist - outdated PTS, unknown sliding")):(a.PTSKnown=!1,t.logger.log("live playlist - first load, unknown sliding"))}else a.PTSKnown=!1;if(l.details=a,this.hls.trigger(r.default.LEVEL_UPDATED,{details:a,level:i}),this.startFragRequested===!1){if(-1===this.startPosition){var s=a.startTimeOffset;if(isNaN(s))if(a.live){var h=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*a.targetduration;this.startPosition=Math.max(0,n+d-h)}else this.startPosition=0;else t.logger.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s}this.nextLoadPosition=this.startPosition}this.state===e.WAITING_LEVEL&&(this.state=e.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===e.KEY_LOADING&&(this.state=e.IDLE,this.tick())}},{key:"onFragLoaded",value:function(n){var a=this.fragCurrent,s=n.frag;if(this.state===e.FRAG_LOADING&&a&&s.level===a.level&&s.sn===a.sn){var o=n.stats;if(t.logger.log("Loaded "+a.sn+" of level "+a.level),this.fragBitrateTest=!1,s.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=e.IDLE,this.startFragRequested=!1,o.tparsed=o.tbuffered=performance.now(),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:n.stats,frag:a}),this.tick();else{this.state=e.PARSING,this.stats=o;var l=this.levels[this.level],u=l.details,v=u.totalduration,c=void 0===a.startDTS||isNaN(a.startDTS)?a.start:a.startDTS,f=a.level,h=a.sn,i=l.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),void 0===i&&(i=this.lastAudioCodec),i&&(i=-1!==i.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,t.logger.log("Demuxing "+h+" of ["+u.startSN+" ,"+u.endSN+"],level "+f+", cc "+a.cc);var d=this.demuxer;d&&d.push(n.payload,i,l.videoCodec,c,a.cc,f,h,v,a.decryptdata)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(l){if(this.state===e.PARSING){var o,a,i=l.tracks;if(a=i.audio){var n=this.levels[this.level].audioCodec,u=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==a.metadata.channelCount&&-1===u.indexOf("firefox")&&(n="mp4a.40.5"),-1!==u.indexOf("android")&&(n="mp4a.40.2",t.logger.log("Android: force audio codec to"+n)),a.levelCodec=n}if(a=i.video,a&&(a.levelCodec=this.levels[this.level].videoCodec),l.unique){var s={codec:"",levelCodec:""};for(o in l.tracks)a=i[o],s.container=a.container,s.codec&&(s.codec+=",",s.levelCodec+=","),a.codec&&(s.codec+=a.codec),a.levelCodec&&(s.levelCodec+=a.levelCodec);i={audiovideo:s}}this.hls.trigger(r.default.BUFFER_CODECS,i);for(o in i){a=i[o],t.logger.log("track:"+o+",container:"+a.container+",codecs[level/parsed]=["+a.levelCodec+"/"+a.codec+"]");var d=a.initSegment;d&&(this.pendingAppending++,this.hls.trigger(r.default.BUFFER_APPENDING,{type:o,data:d}))}this.tick()}}},{key:"onFragParsingData",value:function(a){var o=this;if(this.state===e.PARSING){this.tparse2=Date.now();var n=this.levels[this.level],i=this.fragCurrent;t.logger.log("parsed "+a.type+",PTS:["+a.startPTS.toFixed(3)+","+a.endPTS.toFixed(3)+"],DTS:["+a.startDTS.toFixed(3)+"/"+a.endDTS.toFixed(3)+"],nb:"+a.nb+",dropped:"+(a.dropped||0));var l=u.default.updateFragPTSDTS(n.details,i.sn,a.startPTS,a.endPTS,a.startDTS,a.endDTS),s=this.hls;s.trigger(r.default.LEVEL_PTS_UPDATED,{details:n.details,level:this.level,drift:l}),"video"===a.type&&(i.dropped=a.dropped),[a.data1,a.data2].forEach(function(e){e&&(o.pendingAppending++,s.trigger(r.default.BUFFER_APPENDING,{type:a.type,data:e}))}),this.nextLoadPosition=a.endPTS,this.bufferRange.push({type:a.type,start:a.startPTS,end:a.endPTS,frag:i}),this.tick()}else t.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===e.PARSING&&(this.stats.tparsed=performance.now(),this.state=e.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case e.PARSING:case e.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===e.PARSED&&0===this.pendingAppending){var i=this.fragCurrent,a=this.stats;i&&(this.fragPrevious=i,a.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*a.length/(a.tbuffered-a.tfirst)),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:a,frag:i}),t.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=e.IDLE),this.tick()}}},{key:"onError",value:function(i){switch(i.details){case a.ErrorDetails.FRAG_LOAD_ERROR:case a.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!i.fatal){var n=this.fragLoadError;if(n?n++:n=1,n<=this.config.fragLoadingMaxRetry||this.media&&this.isBuffered(this.media.currentTime)){this.fragLoadError=n,i.frag.loadCounter=0;var s=Math.min(Math.pow(2,n-1)*this.config.fragLoadingRetryDelay,64e3);t.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=e.FRAG_LOADING_WAITING_RETRY}else t.logger.error("mediaController: "+i.details+" reaches max retry, redispatch as fatal ..."),i.fatal=!0,this.hls.trigger(r.default.ERROR,i),this.state=e.ERROR}break;case a.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case a.ErrorDetails.LEVEL_LOAD_ERROR:case a.ErrorDetails.LEVEL_LOAD_TIMEOUT:case a.ErrorDetails.KEY_LOAD_ERROR:case a.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==e.ERROR&&(this.state=i.fatal?e.ERROR:e.IDLE,t.logger.warn("mediaController: "+i.details+" while loading frag,switch to "+this.state+" state ..."));break;case a.ErrorDetails.BUFFER_FULL_ERROR:this.state!==e.PARSING&&this.state!==e.PARSED||(this.config.maxMaxBufferLength/=2,t.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.IDLE)}}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var n=e.currentTime,u=e.buffered;if(!this.loadedmetadata&&u.length){this.loadedmetadata=!0;var i=this.startPosition;if(!n&&n!==i&&i){t.logger.log("target start position:"+i);var l=u.start(0),g=u.end(0);(l>i||i>g)&&(i=l,t.logger.log("target start position not buffered, seek to buffered.start(0) "+l)),t.logger.log("adjust currentTime from "+n+" to "+i),e.currentTime=i}}else{var d=s.default.bufferInfo(e,n,0),v=!(e.paused||e.ended||0===e.buffered.length),f=.4,h=n>e.playbackRate*this.lastCurrentTime;if(this.stalled&&h&&(this.stalled=!1,t.logger.log("playback not stuck anymore @"+n)),v&&d.len<=f&&(h?(f=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,t.logger.log("playback seems stuck @"+n),this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),d.len<=f)){var o=d.nextStart,c=o-n;if(o&&c0){t.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+o+" + nudge "+this.seekHoleNudgeDuration);var p=o+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=o+this.seekHoleNudgeDuration,this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:p})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=e.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var t,r,a=[];for(r=0;re;e++)r+="["+t.start(e)+","+t.end(e)+"]";return r}},{key:"currentLevel",get:function(){if(this.media){var e=this.getBufferRange(this.media.currentTime);if(e)return e.frag.level}return-1}},{key:"nextBufferRange",get:function(){return this.media?this.followingBufferRange(this.getBufferRange(this.media.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferRange;return e?e.frag.level:-1}}]),i}(l.default);o.default=f},{"../demux/demuxer":17,"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../helper/level-helper":25,"../utils/binary-search":35,"../utils/logger":38}],9:[function(t,v,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;te;e++)c[(i[e]=e<<1^283*(e>>7))^e]=e;for(a=r=0;!h[a];a^=u||1,r=c[r]||1)for(t=r^r<<1^r<<2^r<<3^r<<4,t=t>>8^255&t^99,h[a]=t,v[t]=a,d=i[f=i[u=i[a]]],l=16843009*d^65537*f^257*u^16843008*a,s=257*i[t]^16843008*t,e=0;4>e;e++)n[e][a]=s=s<<24^s>>>8,o[e][t]=l=l<<24^l>>>8;for(e=0;5>e;e++)n[e]=n[e].slice(0),o[e]=o[e].slice(0)}},{key:"decrypt",value:function(R,p,_,b,E,m){var h,g,v,n,e=this._key[1],t=R^e[0],a=b^e[1],i=_^e[2],r=p^e[3],y=e.length/4-2,s=4,o=this._tables[1],f=o[0],d=o[1],u=o[2],l=o[3],c=o[4];for(n=0;y>n;n++)h=f[t>>>24]^d[a>>16&255]^u[i>>8&255]^l[255&r]^e[s],g=f[a>>>24]^d[i>>16&255]^u[r>>8&255]^l[255&t]^e[s+1],v=f[i>>>24]^d[r>>16&255]^u[t>>8&255]^l[255&a]^e[s+2],r=f[r>>>24]^d[t>>16&255]^u[a>>8&255]^l[255&i]^e[s+3],s+=4,t=h,a=g,i=v;for(n=0;4>n;n++)E[(3&-n)+m]=c[t>>>24]<<24^c[a>>16&255]<<16^c[i>>8&255]<<8^c[255&r]^e[s++],h=t,t=a,a=i,i=r,r=h}}]),e}();e.default=a},{}],11:[function(t,l,e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>8|e>>>24}},{key:"doDecrypt",value:function(a,g,i){var u,h,o,f,l,c,d,n,e,r=new Int32Array(a.buffer,a.byteOffset,a.byteLength>>2),p=new s.default(Array.prototype.slice.call(g)),v=new Uint8Array(a.byteLength),t=new Int32Array(v.buffer);for(u=~~i[0],h=~~i[1],o=~~i[2],f=~~i[3],e=0;ee&&(255!==t[e]||240!==(240&t[e+1]));e++);for(r.audiosamplerate||(i=o.default.getAudioConfig(this.observer,t,e,p),r.config=i.config,r.audiosamplerate=i.samplerate,r.channelCount=i.channelCount,r.codec=i.codec,r.duration=y,l.logger.log("parsed codec:"+r.codec+",rate:"+i.samplerate+",nb channel:"+i.channelCount)),c=0,g=9216e4/r.audiosamplerate;u>e+5&&(s=1&t[e+1]?7:9,n=(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5,n-=s,n>0&&u>=e+s+n);)for(f=h+c*g,v={unit:t.subarray(e+s,e+s+n),pts:f,dts:f},r.samples.push(v),r.len+=n,e+=n+s,c++;u-1>e&&(255!==t[e]||240!==(240&t[e+1]));e++);this.remuxer.remux(this._aacTrack,{samples:[]},{samples:[{pts:h,dts:h,unit:d.payload}]},{samples:[]},m)}},{key:"destroy",value:function(){}}],[{key:"probe",value:function(t){var e,r,i=new a.default(t);if(i.hasTimeStamp)for(e=i.length,r=t.length;r-1>e;e++)if(255===t[e]&&240===(240&t[e+1]))return!0;return!1}}]),e}();t.default=s},{"../demux/id3":19,"../utils/logger":38,"./adts":14}],14:[function(e,o,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>>6)+1,e=(60&u[l+2])>>>2,e>d.length-1?void h.trigger(Event.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+e}):(o=(1&u[l+2])<<2,o|=(192&u[l+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+e+"["+d[e]+"Hz],channelConfig:"+o),-1!==f.indexOf("firefox")?e>=6?(a=5,t=new Array(4),s=e-3):(a=2,t=new Array(2),s=e):-1!==f.indexOf("android")?(a=2,t=new Array(2),s=e):(a=5,t=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&e>=6?s=e-3:((i&&-1!==i.indexOf("mp4a.40.2")&&e>=6&&1===o||!i&&1===o)&&(a=2,t=new Array(2)),s=e)),t[0]=a<<3,t[0]|=(14&e)>>1,t[1]|=(1&e)<<7,t[1]|=o<<3,5===a&&(t[1]|=(14&s)>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),{config:t,samplerate:d[e],channelCount:o,codec:"mp4a.40."+a})}}]),e}();t.default=s},{"../errors":21,"../utils/logger":38}],15:[function(e,y,a){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;t1?r-1:0),e=1;r>e;e++)i[e-1]=arguments[e];t.emit.apply(t,[a,a].concat(i))},t.off=function(i){for(var r=arguments.length,a=Array(r>1?r-1:0),e=1;r>e;e++)a[e-1]=arguments[e];t.removeListener.apply(t,[i].concat(a))},r.addEventListener("message",function(a){var e=a.data;switch(e.cmd){case"init":r.demuxer=new u.default(t,e.typeSupported);break;case"demux":r.demuxer.push(new Uint8Array(e.data),e.audioCodec,e.videoCodec,e.timeOffset,e.cc,e.level,e.sn,e.duration)}}),t.on(e.default.FRAG_PARSING_INIT_SEGMENT,function(t,e){r.postMessage({event:t,tracks:e.tracks,unique:e.unique})}),t.on(e.default.FRAG_PARSING_DATA,function(a,e){var t={event:a,type:e.type,startPTS:e.startPTS,endPTS:e.endPTS,startDTS:e.startDTS,endDTS:e.endDTS,data1:e.data1.buffer,data2:e.data2.buffer,nb:e.nb,dropped:e.dropped};r.postMessage(t,[t.data1,t.data2])}),t.on(e.default.FRAG_PARSED,function(e){r.postMessage({event:e})}),t.on(e.default.ERROR,function(e,t){r.postMessage({event:e,data:t})}),t.on(e.default.FRAG_PARSING_METADATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)}),t.on(e.default.FRAG_PARSING_USERDATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)})};a.default=o},{"../demux/demuxer-inline":15,"../events":23,events:1}],17:[function(t,p,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var u=function(){function e(a,r){for(var t=0;t0&&null!=e&&null!=e.key&&"AES-128"===e.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var u=this;this.decrypter.decrypt(t,e.key,e.iv,function(e){u.pushDecrypted(e,r,a,i,n,s,o,l)})}else this.pushDecrypted(t,r,a,i,n,s,o,l)}},{key:"onWorkerMessage",value:function(a){var t=a.data;switch(t.event){case e.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(e.default.FRAG_PARSING_INIT_SEGMENT,r);break;case e.default.FRAG_PARSING_DATA:this.hls.trigger(e.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case e.default.FRAG_PARSING_METADATA:this.hls.trigger(e.default.FRAG_PARSING_METADATA,{samples:t.samples});break;case e.default.FRAG_PARSING_USERDATA:this.hls.trigger(e.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),r}();a.default=o},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../errors":21,"../events":23,"../utils/logger":38,webworkify:2}],18:[function(t,s,e){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function e(a,r){for(var t=0;te?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;return t>32&&i.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0?this.word<<=e:this.bytesAvailable>0&&this.loadWord(),e=t-e,e>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(i){var t,a,r=8,e=8;for(t=0;i>t;t++)0!==e&&(a=this.readEG(),e=(r+a+256)%256),r=0===e?r:e}},{key:"readSPS",value:function(){var t,g,p,l,i,n,a,o,r,s=0,d=0,f=0,h=0,c=1;if(this.readUByte(),t=this.readUByte(),g=this.readBits(5),this.skipBits(3),p=this.readUByte(),this.skipUEG(),100===t||110===t||122===t||244===t||44===t||83===t||86===t||118===t||128===t){var v=this.readUEG();if(3===v&&this.skipBits(1),this.skipUEG(),this.skipUEG(),this.skipBits(1),this.readBoolean())for(o=3!==v?8:12,r=0;o>r;r++)this.readBoolean()&&(6>r?this.skipScalingList(16):this.skipScalingList(64))}this.skipUEG();var u=this.readUEG();if(0===u)this.readUEG();else if(1===u)for(this.skipBits(1),this.skipEG(),this.skipEG(),l=this.readUEG(),r=0;l>r;r++)this.skipEG();if(this.skipUEG(),this.skipBits(1),i=this.readUEG(),n=this.readUEG(),a=this.readBits(1),0===a&&this.skipBits(1),this.skipBits(1),this.readBoolean()&&(s=this.readUEG(),d=this.readUEG(),f=this.readUEG(),h=this.readUEG()),this.readBoolean()&&this.readBoolean()){var e=void 0,y=this.readUByte();switch(y){case 1:e=[1,1];break;case 2:e=[12,11];break;case 3:e=[10,11];break;case 4:e=[16,11];break;case 5:e=[40,33];break;case 6:e=[24,11];break;case 7:e=[20,11];break;case 8:e=[32,11];break;case 9:e=[80,33];break;case 10:e=[18,11];break;case 11:e=[15,11];break;case 12:e=[64,33];break;case 13:e=[160,99];break;case 14:e=[4,3];break;case 15:e=[3,2];break;case 16:e=[2,1];break;case 255:e=[this.readUByte()<<8|this.readUByte(),this.readUByte()<<8|this.readUByte()]}e&&(c=e[0]/e[1])}return{width:Math.ceil((16*(i+1)-2*s-2*d)*c),height:(2-a)*(n+1)*16-(a?2:4)*(f+h)}}},{key:"readSliceType",value:function(){return this.readUByte(),this.readUEG(),this.readUEG()}}]),e}();e.default=n},{"../utils/logger":38}],19:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;tr);return t}},{key:"_parseID3Frames",value:function(r,t,n){for(var i,s,o,l,a;n>=t+8;)switch(i=this.readUTF(r,t,4),t+=4,s=r[t++]<<24+r[t++]<<16+r[t++]<<8+r[t++],l=r[t++]<<8+r[t++],o=t,i){case"PRIV":if("com.apple.streaming.transportStreamTimestamp"===this.readUTF(r,t,44)){t+=44,t+=4;var u=1&r[t++];this._hasTimeStamp=!0,a=((r[t++]<<23)+(r[t++]<<15)+(r[t++]<<7)+r[t++])/45,u&&(a+=47721858.84),a=Math.round(a),e.logger.trace("ID3 timestamp found: "+a),this._timeStamp=a}}}},{key:"hasTimeStamp",get:function(){return this._hasTimeStamp}},{key:"timeStamp",get:function(){return this._timeStamp}},{key:"length",get:function(){return this._length}},{key:"payload",get:function(){return this._payload}}]),t}();t.default=n},{"../utils/logger":38}],20:[function(t,v,i){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var f=function(){function e(a,r){for(var t=0;tt;t+=188)if(71===a[t]){if(d=!!(64&a[t+1]),u=((31&a[t+1])<<8)+a[t+2],y=(48&a[t+3])>>4,y>1){if(i=t+5+a[t+4],i===t+188)continue}else i=t+4;if(g)if(u===h){if(d){if(s&&(this._parseAVCPES(this._parsePES(s)),b&&this._avcTrack.codec&&(-1===f||this._aacTrack.codec)))return void this.remux(a);s={data:[],size:0}}s&&(s.data.push(a.subarray(i,t+188)),s.size+=t+188-i)}else if(u===f){if(d){if(o&&(this._parseAACPES(this._parsePES(o)),b&&this._aacTrack.codec&&(-1===h||this._avcTrack.codec)))return void this.remux(a);o={data:[],size:0}}o&&(o.data.push(a.subarray(i,t+188)),o.size+=t+188-i)}else u===_&&(d&&(l&&this._parseID3PES(this._parsePES(l)),l={data:[],size:0}),l&&(l.data.push(a.subarray(i,t+188)),l.size+=t+188-i));else d&&(i+=a[i]+1),0===u?this._parsePAT(a,i):u===this._pmtId?(this._parsePMT(a,i),g=this.pmtParsed=!0,h=this._avcTrack.id,f=this._aacTrack.id,_=this._id3Track.id,v&&(e.logger.log("reparse from beginning"),v=!1,t=-188)):(e.logger.log("unknown PID found before PAT/PMT"),v=!0)}else this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});s&&this._parseAVCPES(this._parsePES(s)),o&&this._parseAACPES(this._parsePES(o)),l&&this._parseID3PES(this._parsePES(l)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(r,t){var i,n,s,a;for(i=(15&r[t+1])<<8|r[t+2],n=t+3+i-4,s=(15&r[t+10])<<8|r[t+11],t+=12+s;n>t;){switch(a=(31&r[t+1])<<8|r[t+2],r[t]){case 15:this._aacTrack.id=a;break;case 21:this._id3Track.id=a;break;case 27:this._avcTrack.id=a;break;default:e.logger.log("unkown stream type:"+r[t])}t+=((15&r[t+3])<<8|r[t+4])+5}}},{key:"_parsePES",value:function(o){var e,n,h,d,u,l,a,r,t,f=0,s=o.data;if(e=s[0],h=(e[0]<<16)+(e[1]<<8)+e[2],1===h){for(d=(e[4]<<8)+e[5],n=e[7],192&n&&(a=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,a>4294967295&&(a-=8589934592),64&n?(r=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2,r>4294967295&&(r-=8589934592)):r=a),u=e[8],t=u+9,o.size-=t,l=new Uint8Array(o.size);s.length;){e=s.shift();var i=e.byteLength;if(t){if(t>i){t-=i;continue}e=e.subarray(t),i-=t,t=0}l.set(e,f),f+=i}return{data:l,pts:a,dts:r,len:d}}return null}},{key:"_parseAVCPES",value:function(a){var t,m,n,o,y=this,r=this._avcTrack,u=r.samples,p=this._parseAVCNALu(a.data),d=[],l=!1,c=!1,f=0;if(0===p.length&&u.length>0){var v=u[u.length-1],h=v.units.units[v.units.units.length-1],g=new Uint8Array(h.data.byteLength+a.data.byteLength);g.set(h.data,0),g.set(a.data,h.data.byteLength),h.data=g,v.units.length+=a.data.byteLength,r.len+=a.data.byteLength}a.data=null;var i="",E=function(){d.length&&(c===!0||r.sps&&(u.length||this.contiguous)?(m={units:{units:d,length:f},pts:a.pts,dts:a.dts,key:c},u.push(m),r.len+=f,r.nbNalu+=d.length):r.dropped++,d=[],f=0)}.bind(this);p.forEach(function(e){switch(e.type){case 1:n=!0,l&&(i+="NDR ");break;case 5:n=!0,l&&(i+="IDR "),c=!0;break;case 6:n=!0,l&&(i+="SEI "),t=new s.default(e.data),t.readUByte();var b=t.readUByte();if(4===b){var g=0;do g=t.readUByte();while(255===g);var A=t.readUByte();if(181===A){var R=t.readUShort();if(49===R){var T=t.readUInt();if(1195456820===T){var k=t.readUByte();if(3===k){var v=t.readUByte(),_=t.readUByte(),S=31&v,h=[v,_];for(o=0;S>o;o++)h.push(t.readUByte()),h.push(t.readUByte()),h.push(t.readUByte());y._txtTrack.samples.push({type:3,pts:a.pts,bytes:h})}}}}}break;case 7:if(n=!0,l&&(i+="SPS "),!r.sps){t=new s.default(e.data);var p=t.readSPS();r.width=p.width,r.height=p.height,r.sps=[e.data],r.duration=y._duration;var L=e.data.subarray(1,4),m="avc1.";for(o=0;3>o;o++){var u=L[o].toString(16);u.length<2&&(u="0"+u),m+=u}r.codec=m}break;case 8:n=!0,l&&(i+="PPS "),r.pps||(r.pps=[e.data]);break;case 9:n=!1,l&&(i+="AUD "),E();break;default:n=!1,i+="unknown NAL "+e.type+" "}n&&(d.push(e),f+=e.data.byteLength)}),(l||i.length)&&e.logger.log(i),E()}},{key:"_parseAVCNALu",value:function(r){for(var s,a,l,_,n,d,t=0,g=r.byteLength,e=this.avcNaluState,v=[];g>t;)switch(s=r[t++],e){case 0:0===s&&(e=1);break;case 1:e=0===s?2:0;break;case 2:case 3:if(0===s)e=3;else if(1===s&&g>t){if(_=31&r[t],n)l={data:r.subarray(n,t-e-1),type:d},v.push(l);else{var i=this.avcNaluState;if(i&&4-i>=t){var m=this._avcTrack,c=m.samples;if(c.length){var p=c[c.length-1],R=p.units.units,u=R[R.length-1];u.state&&(u.data=u.data.subarray(0,u.data.byteLength-i),p.units.length-=i,m.len-=i)}}if(a=t-e-1,a>0){var y=this._avcTrack,h=y.samples;if(h.length){var E=h[h.length-1],b=E.units.units,o=b[b.length-1],f=new Uint8Array(o.data.byteLength+a);f.set(o.data,0),f.set(r.subarray(0,a),o.data.byteLength),o.data=f,E.units.length+=a,y.len+=a}}}n=t,d=_,e=0}else e=0}return n&&(l={data:r.subarray(n,g),type:d,state:e},v.push(l),this.avcNaluState=e),v}},{key:"_parseAACPES",value:function(R){var l,o,p,E,t,d,f,s,_,i=this._aacTrack,a=R.data,v=R.pts,L=0,T=this._duration,A=this.audioCodec,u=this.aacOverFlow,b=this.aacLastPTS;if(u){var m=new Uint8Array(u.byteLength+a.byteLength);m.set(u,0),m.set(a,u.byteLength),a=m}for(t=L,s=a.length;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);if(t){var y,h;if(s-1>t?(y="AAC PES did not start with ADTS header,offset:"+t,h=!1):(y="no ADTS header found in AAC PES",h=!0),this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:h,reason:y}),h)return}if(i.audiosamplerate||(l=c.default.getAudioConfig(this.observer,a,t,A),i.config=l.config,i.audiosamplerate=l.samplerate,i.channelCount=l.channelCount,i.codec=l.codec,i.duration=T,e.logger.log("parsed codec:"+i.codec+",rate:"+l.samplerate+",nb channel:"+l.channelCount)),E=0,p=9216e4/i.audiosamplerate,u&&b){var g=b+p;Math.abs(g-v)>1&&(e.logger.log("AAC: align PTS for overlapping frames by "+Math.round((g-v)/90)),v=g)}for(;s>t+5&&(d=1&a[t+1]?7:9,o=(3&a[t+3])<<11|a[t+4]<<3|(224&a[t+5])>>>5,o-=d,o>0&&s>=t+d+o);)for(f=v+E*p,_={unit:a.subarray(t+d,t+d+o),pts:f,dts:f},i.samples.push(_),i.len+=o,t+=o+d,E++;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);u=s>t?a.subarray(t,s):null,this.aacOverFlow=u,this.aacLastPTS=f}},{key:"_parseID3PES",value:function(e){this._id3Track.samples.push(e)}}],[{key:"probe",value:function(e){return e.length>=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),t}();i.default=o},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(t,r,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},e.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,f,t){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},d=function(){function e(a,r){for(var t=0;t1?r-1:0),t=1;r>t;t++)a[t-1]=arguments[t];this.handledEvents=a,this.useGenericHandler=!0,this.registerListeners()}return d(e,[{key:"destroy",value:function(){this.unregisterListeners()}},{key:"isEventHandler",value:function(){return"object"===n(this.handledEvents)&&this.handledEvents.length&&"function"==typeof this.onEvent}},{key:"registerListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){if("hlsEventGeneric"===e)throw new Error("Forbidden event name: "+e);this.hls.on(e,this.onEvent)}.bind(this))}},{key:"unregisterListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){this.hls.off(e,this.onEvent)}.bind(this))}},{key:"onEvent",value:function(e,t){this.onEventGeneric(e,t)}},{key:"onEventGeneric",value:function(e,t){var a=function(t,r){var e="on"+t.replace("hls","");if("function"!=typeof this[e])throw new Error("Event "+t+" has no generic handler in this "+this.constructor.name+" class (tried "+e+")");return this[e].bind(this,r)};try{a.call(this,e,t).call()}catch(t){o.logger.error("internal error happened while processing "+e+":"+t.message),this.hls.trigger(s.default.ERROR,{type:r.ErrorTypes.OTHER_ERROR,details:r.ErrorDetails.INTERNAL_EXCEPTION,fatal:!1,event:e,err:t})}}}]),e}();t.default=l},{"./errors":21,"./events":23,"./utils/logger":38}],23:[function(t,e,r){"use strict";e.exports={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVEL_SWITCH:"hlsLevelSwitch",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_PROGRESS:"hlsFragLoadProgress",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSING_DATA:"hlsFragParsingData",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded"}},{}],24:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;td&&(t[u-1].end=r[e].end):t.push(r[e])}else t.push(r[e])}for(e=0,o=0,l=i=a;e=n&&f>a)l=n,i=f,o=i-a;else if(n>a+s){h=n;break}}return{len:o,start:l,end:i,nextStart:h}}}]),e}();e.default=a},{}],25:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;th)return void(a.PTSKnown=!1);for(var r=c;h>=r;r++){var s=f[u+r],n=l[r];n&&s&&(d=s.cc-n.cc,isNaN(s.startPTS)||(n.start=n.startPTS=s.startPTS,n.endPTS=s.endPTS,n.duration=s.duration,i=n))}if(d)for(e.logger.log("discontinuity sliding from playlist, take drift into account"),r=0;r=0&&ui.endSN)return 0;if(o=l-i.startSN,n=i.fragments,e=n[o],!isNaN(e.startPTS)){var f=Math.abs(e.startPTS-a);isNaN(e.deltaPTS)?e.deltaPTS=f:e.deltaPTS=Math.max(f,e.deltaPTS),a=Math.min(a,e.startPTS),s=Math.max(s,e.endPTS),d=Math.min(d,e.startDTS),u=Math.max(u,e.endDTS)}var h=a-e.start;for(e.start=e.startPTS=a,e.endPTS=s,e.startDTS=d,e.endDTS=u,e.duration=s-a,r=o;r>0;r--)t.updatePTS(n,r,r-1);for(r=o;ra?r.start=t.start+t.duration:r.start=t.start-r.duration:i>a?(t.duration=n-t.start,t.duration<0&&e.logger.error("negative duration computed for frag "+t.sn+",level "+t.level+", there should be some duration drift between playlist and fragment!")):(r.duration=t.start-n,r.duration<0&&e.logger.error("negative duration computed for frag "+r.sn+",level "+r.level+", there should be some duration drift between playlist and fragment!"))}}]),t}();t.default=n},{"../utils/logger":38}],26:[function(t,I,i){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t1?t-1:0),e=1;t>e;e++)i[e-1]=arguments[e];a.emit.apply(a,[r,r].concat(i))},a.off=function(i){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];a.removeListener.apply(a,[i].concat(r))},this.on=a.on.bind(a),this.off=a.off.bind(a),this.trigger=a.trigger.bind(a),this.playlistLoader=new d.default(this),this.fragmentLoader=new h.default(this),this.levelController=new R.default(this),this.abrController=new r.abrController(this),this.bufferController=new r.bufferController(this),this.capLevelController=new r.capLevelController(this),this.streamController=new r.streamController(this),this.timelineController=new r.timelineController(this),this.keyLoader=new p.default(this)}return n(t,null,[{key:"isSupported",value:function(){return window.MediaSource&&"function"==typeof window.MediaSource.isTypeSupported&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')}},{key:"Events",get:function(){return a.default}},{key:"ErrorTypes",get:function(){return s.ErrorTypes}},{key:"ErrorDetails",get:function(){return s.ErrorDetails}},{key:"DefaultConfig",get:function(){return t.defaultConfig||(t.defaultConfig={autoStartLoad:!0,startPosition:-1,debug:!1,capLevelToPlayerSize:!1,maxBufferLength:30,maxBufferSize:6e7,maxBufferHole:.5,maxSeekHole:2,seekHoleNudgeDuration:.01,stalledInBufferedNudgeThreshold:10,maxFragLookUpTolerance:.2,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxMaxBufferLength:600,enableWorker:!0,enableSoftwareAES:!0,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingLoopThreshold:3,startFragPrefetch:!1,appendErrorMaxRetry:3,loader:S.default,fLoader:void 0,pLoader:void 0,abrController:v.default,bufferController:P.default,capLevelController:m.default,streamController:b.default,timelineController:T.default,enableCEA708Captions:!0,enableMP2TPassThrough:!1,abrEwmaFastLive:5,abrEwmaSlowLive:9,abrEwmaFastVoD:4,abrEwmaSlowVoD:15,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.8,abrBandWidthUpFactor:.7,maxStarvationDelay:2}),t.defaultConfig},set:function(e){t.defaultConfig=e}}]),n(t,[{key:"destroy",value:function(){e.logger.log("destroy"),this.trigger(a.default.DESTROYING),this.detachMedia(),this.playlistLoader.destroy(),this.fragmentLoader.destroy(),this.levelController.destroy(),this.abrController.destroy(),this.bufferController.destroy(),this.capLevelController.destroy(),this.streamController.destroy(),this.timelineController.destroy(),this.keyLoader.destroy(),this.url=null,this.observer.removeAllListeners()}},{key:"attachMedia",value:function(t){e.logger.log("attachMedia"),this.media=t,this.trigger(a.default.MEDIA_ATTACHING,{media:t})}},{key:"detachMedia",value:function(){e.logger.log("detachMedia"),this.trigger(a.default.MEDIA_DETACHING),this.media=null}},{key:"loadSource",value:function(t){e.logger.log("loadSource:"+t),this.url=t,this.trigger(a.default.MANIFEST_LOADING,{url:t})}},{key:"startLoad",value:function(){var t=arguments.length<=0||void 0===arguments[0]?-1:arguments[0];e.logger.log("startLoad"),this.levelController.startLoad(),this.streamController.startLoad(t)}},{key:"stopLoad",value:function(){e.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad()}},{key:"swapAudioCodec",value:function(){e.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){e.logger.log("recoverMediaError");var t=this.media;this.detachMedia(),this.attachMedia(t)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){e.logger.log("set currentLevel:"+t),this.loadLevel=t,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){e.logger.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){e.logger.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return this.levelController.firstLevel},set:function(t){e.logger.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){e.logger.log("set startLevel:"+t),this.levelController.startLevel=t}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(t){e.logger.log("set autoLevelCapping:"+t),this.abrController.autoLevelCapping=t}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}}]),t}();i.default=l},{"./controller/abr-controller":3,"./controller/buffer-controller":4,"./controller/cap-level-controller":5,"./controller/level-controller":7,"./controller/stream-controller":8,"./controller/timeline-controller":9,"./errors":21,"./events":23,"./loader/fragment-loader":28,"./loader/key-loader":29,"./loader/playlist-loader":30,"./utils/logger":38,"./utils/xhr-loader":40,events:1}],27:[function(e,t,r){"use strict";t.exports=e("./hls.js").default},{"./hls.js":26}],28:[function(r,c,a){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;te;e++)t[e]=r>>8*(15-e)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,r){var t=e;return e&&e.method&&e.uri&&!e.iv&&(t=this.cloneObj(e),t.iv=this.createInitializationVector(r)),t}},{key:"avc1toavcoti",value:function(r){var e,t=r.split(".");return t.length>2?(e=t.shift()+".",e+=parseInt(t.shift()).toString(16),e+=("000"+parseInt(t.shift()).toString(16)).substr(-4)):e=r,e}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(D,f,L){var E,e,R,l=0,o=0,t={version:null,type:null,url:f,fragments:[],live:!0,startSN:0},a={method:null,key:null,iv:null,uri:null},y=0,c=null,r=null,n=null,d=null,h=null,s=null;for(R=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(e=R.exec(D));)switch(e.shift(),e=e.filter(function(e){return void 0!==e}),e[0]){case"VERSION":t.version=parseInt(e[1]);break;case"PLAYLIST-TYPE":t.type=e[1].toUpperCase();break;case"MEDIA-SEQUENCE":l=t.startSN=parseInt(e[1]);break;case"TARGETDURATION":t.targetduration=parseFloat(e[1]);break;case"EXTM3U":break;case"ENDLIST":t.live=!1;break;case"DIS":y++;break;case"BYTERANGE":var v=e[1].split("@");s=1===v.length?h:parseInt(v[1]),h=parseInt(v[0])+s;break;case"INF":n=parseFloat(e[1]),d=e[2]?e[2]:null;break;case"":if(!isNaN(n)){var b=l++;E=this.fragmentDecryptdataFromLevelkey(a,b);var T=e[1]?this.resolve(e[1],f):null;r={url:T,duration:n,title:d,start:o,sn:b,level:L,cc:y,decryptdata:E,programDateTime:c},null!==s&&(r.byteRangeStartOffset=s,r.byteRangeEndOffset=h),t.fragments.push(r),o+=n,n=null,d=null,s=null,c=null}break;case"KEY":var A=e[1],p=new i.default(A),g=p.enumeratedString("METHOD"),m=p.URI,k=p.hexadecimalInteger("IV");g&&(a={method:null,key:null,iv:null,uri:null},m&&"AES-128"===g&&(a.method=g,a.uri=this.resolve(m,f),a.key=null,a.iv=k));break;case"START":var S=e[1],w=new i.default(S),_=w.decimalFloatingPoint("TIME-OFFSET");_&&(t.startTimeOffset=_);break;case"PROGRAM-DATE-TIME":c=new Date(Date.parse(e[1]));break;case"#":e.shift();break;default:u.logger.warn("line parsed but not handled: "+e)}return r&&!r.url&&(t.fragments.pop(),o-=r.duration),t.totalduration=o,t.endSN=l-1,t}},{key:"loadsuccess",value:function(d,a){var s,o=d.currentTarget,n=o.responseText,r=o.responseURL,l=this.id,f=this.id2,i=this.hls;if(this.loading=!1,void 0===r&&(r=this.url),a.tload=performance.now(),a.mtime=new Date(o.getResponseHeader("Last-Modified")),0===n.indexOf("#EXTM3U"))if(n.indexOf("#EXTINF:")>0){var u=this.parseLevelPlaylist(n,r,l||0);u.tload=a.tload,null===l&&i.trigger(t.default.MANIFEST_LOADED,{levels:[{url:r,details:u}],url:r,stats:a}),a.tparsed=performance.now(),i.trigger(t.default.LEVEL_LOADED,{details:u,level:l||0,id:f,stats:a})}else s=this.parseMasterPlaylist(n,r),s.length?i.trigger(t.default.MANIFEST_LOADED,{levels:s,url:r,stats:a}):i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no level found in manifest"});else i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(i){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_ERROR,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_ERROR,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,response:i.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_TIMEOUT,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_TIMEOUT,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),r}(n.default);s.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t.set(i,4),r=0,e=8;n>r;r++)t.set(a[r],e),e+=a[r].byteLength;return t}},{key:"hdlr",value:function(t){return e.box(e.types.hdlr,e.HDLR_TYPES[t])}},{key:"mdat",value:function(t){return e.box(e.types.mdat,t)}},{key:"mdhd",value:function(t,r){return r*=t,e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(r){for(var t=r.length,a=[];t--;)a[t]=e.trex(r[t]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(n){var r,t,a=n.samples||[],i=new Uint8Array(4+a.length);for(t=0;t>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var u=e.box(e.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|t.sps.length].concat(a).concat([t.pps.length]).concat(s))),o=t.width,l=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,o>>8&255,255&o,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(a,t){var i=e.sdtp(a),r=a.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t])),e.trun(a,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(r){var t=r.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(h,o){var a,i,n,s,t,l,d=h.samples||[],r=d.length,f=12+16*r,u=new Uint8Array(f);for(o+=8+f,u.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,o>>>24&255,o>>>16&255,o>>>8&255,255&o],0),a=0;r>a;a++)i=d[a],n=i.duration,s=i.size,t=i.flags,l=i.cts,u.set([n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,t.isLeading<<2|t.dependsOn,t.isDependedOn<<6|t.hasRedundancy<<4|t.paddingValue<<1|t.isNonSync,61440&t.degradPrio,15&t.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,u)}},{key:"initSegment",value:function(a){e.types||e.init();var t,r=e.moov(a);return t=new Uint8Array(e.FTYP.byteLength+r.byteLength),t.set(e.FTYP),t.set(r,e.FTYP.byteLength),t}}]),e}();e.default=a},{}],32:[function(a,h,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var l=function(){function e(a,r){for(var t=0;tMath.pow(2,32)&&!function(){var e=function r(t,e){return e?r(e,t%e):t};a.timescale=a.audiosamplerate/e(a.audiosamplerate,1024)}(),e.logger.log("audio mp4 timescale :"+a.timescale),l.audio={container:"audio/mp4",codec:a.codec,initSegment:r.default.initSegment([a]),metadata:{channelCount:a.channelCount}},u&&(n=o=v[0].pts-f*h)),i.sps&&i.pps&&d.length&&(i.timescale=this.MP4_TIMESCALE,l.video={container:"video/mp4",codec:i.codec,initSegment:r.default.initSegment([i]),metadata:{width:i.width,height:i.height}},u&&(n=Math.min(n,d[0].pts-f*h),o=Math.min(o,d[0].dts-f*h))),Object.keys(l).length?(c.trigger(t.default.FRAG_PARSING_INIT_SEGMENT,g),this.ISGenerated=!0,u&&(this._initPTS=n,this._initDTS=o)):c.trigger(t.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(a,D,w){var T,s,v,L,y,d,k,S,R,g,m,f,u,i,l,b=8,c=this.PES_TIMESCALE,h=this.PES2MP4SCALEFACTOR,o=[],A=a.samples.reduce(function(t,e){return Math.max(Math.min(t,e.pts-e.dts),-18e3)},0);for(0>A&&e.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(A/90)+" ms to overcome this issue"),d=new Uint8Array(a.len+4*a.nbNalu+8),T=new DataView(d.buffer),T.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4);a.samples.length;){for(s=a.samples.shift(),L=0;s.units.units.length;)y=s.units.units.shift(),T.setUint32(b,y.data.byteLength),b+=4,d.set(y.data,b),b+=y.data.byteLength,L+=4+y.data.byteLength;if(m=s.pts-this._initDTS,f=s.dts-this._initDTS+A,f=Math.min(m,f),void 0!==g){u=this._PTSNormalize(m,g),i=this._PTSNormalize(f,g);var _=(i-g)/h;0>=_&&(e.logger.log("invalid sample duration at PTS/DTS: "+s.pts+"/"+s.dts+":"+_),_=1),v.duration=_}else{var p=void 0,n=void 0;p=w?this.nextAvcDts:D*c,u=this._PTSNormalize(m,p),i=this._PTSNormalize(f,p),n=Math.round((i-p)/90),w&&n&&(n>1?e.logger.log("AVC:"+n+" ms hole between fragments detected,filling it"):-1>n&&e.logger.log("AVC:"+-n+" ms overlapping between fragments detected"),i=p,u=Math.max(u-n,i),e.logger.log("Video/PTS/DTS adjusted: "+u+"/"+i+",delta:"+n)),S=Math.max(0,u),R=Math.max(0,i)}v={size:L,duration:0,cts:(u-i)/h,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},l=v.flags,s.key===!0?(l.dependsOn=2,l.isNonSync=0):(l.dependsOn=1,l.isNonSync=1),o.push(v),g=i}var E=0;o.length>=2&&(E=o[o.length-2].duration,v.duration=E),this.nextAvcDts=i+E*h;var O=a.dropped;a.len=0,a.nbNalu=0,a.dropped=0,o.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(l=o[0].flags,l.dependsOn=2,l.isNonSync=0),a.samples=o,k=r.default.moof(a.sequenceNumber++,R/h,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:k,data2:d,startPTS:S/c,endPTS:(u+h*E)/c,startDTS:R/c,endDTS:this.nextAvcDts/c,type:"video",nb:o.length,dropped:O})}},{key:"remuxAudio",value:function(a,D,S){var k,p,n,h,d,L,T,b,u,g,R,o,i,A=8,s=this.PES_TIMESCALE,w=a.timescale,f=s/w,E=1024*a.timescale/a.audiosamplerate,m=[],_=[];for(a.samples.sort(function(e,t){return e.pts-t.pts}),_=a.samples;_.length;){if(p=_.shift(),h=p.unit,g=p.pts-this._initDTS,R=p.dts-this._initDTS,void 0!==u)o=this._PTSNormalize(g,u),i=this._PTSNormalize(R,u),n.duration=(i-u)/f,Math.abs(n.duration-E)>E/10&&e.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*a.audiosamplerate/a.timescale)),n.duration=E,o=i=E*f+u;else{var c=void 0,l=void 0;if(c=S?this.nextAacPts:D*s,o=this._PTSNormalize(g,c),i=this._PTSNormalize(R,c),l=Math.round(1e3*(o-c)/s),S&&l){if(l>0)e.logger.log(l+" ms hole between AAC samples detected,filling it");else if(-12>l){e.logger.log(-l+" ms overlapping between AAC samples detected, drop frame"),a.len-=h.byteLength;continue}o=i=c}if(T=Math.max(0,o),b=Math.max(0,i),!(a.len>0))return;d=new Uint8Array(a.len+8),k=new DataView(d.buffer),k.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4)}d.set(h,A),A+=h.byteLength,n={size:h.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},m.push(n),u=i}var y=0,v=m.length;v>=2&&(y=m[v-2].duration,n.duration=y),v&&(this.nextAacPts=o+f*y,a.len=0,a.samples=m,L=r.default.moof(a.sequenceNumber++,b/f,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:L,data2:d,startPTS:T/s,endPTS:this.nextAacPts/s,startDTS:b/s,endDTS:(i+f*y)/s,type:"audio",nb:v}))}},{key:"remuxID3",value:function(r,i){var e,n=r.samples.length;if(n){for(var a=0;n>a;a++)e=r.samples[a],e.pts=(e.pts-this._initPTS)/this.PES_TIMESCALE,e.dts=(e.dts-this._initDTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_METADATA,{samples:r.samples})}r.samples=[],i=i}},{key:"remuxText",value:function(e,i){e.samples.sort(function(e,t){return e.pts-t.pts});var r,n=e.samples.length;if(n){for(var a=0;n>a;a++)r=e.samples[a],r.pts=(r.pts-this._initPTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_USERDATA,{samples:e.samples})}e.samples=[],i=i}},{key:"_PTSNormalize",value:function(e,t){var r;if(void 0===t)return e;for(r=e>t?-8589934592:8589934592;Math.abs(e-t)>4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),a}();i.default=d},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"hexadecimalInteger",value:function(r){if(this[r]){var e=(this[r]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var a=new Uint8Array(e.length/2),t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(t){var e=/^(\d+)x(\d+)$/.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}}}],[{key:"parseAttrList",value:function(i){for(var t,n=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,r={};null!==(t=n.exec(i));){var e=t[2],a='"';0===e.indexOf(a)&&e.lastIndexOf(a)===e.length-1&&(e=e.slice(1,-1)),r[t[1]]=e}return r}}]),e}();e.default=a},{}],35:[function(r,e,a){"use strict";var t={search:function(i,s){for(var t=0,r=i.length-1,e=null,a=null;r>=t;){e=(t+r)/2|0,a=i[e];var n=s(a);if(n>0)t=e+1;else{if(!(0>n))return a;r=e-1}}return null}};e.exports=t},{}],36:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t0;)e.removeCue(e.cues[0])}},{key:"push",value:function(r,a){this.cue||this._createCue();for(var i,t,e,s,o,u=31&a[0],n=2,l=0;u>l;l++)if(i=a[n++],t=127&a[n++],e=127&a[n++],s=0!==(4&i),o=3&i,(0!==t||0!==e)&&s&&0===o){if(32&t||64&t)this.cue.text+=this._fromCharCode(t)+this._fromCharCode(e);else if((17===t||25===t)&&e>=48&&63>=e)switch(e){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===t||25===t)&&e>=32&&47>=e)switch(e){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===t||28===t)&&e>=32&&47>=e)switch(e){case 32:this._clearActiveCues(r);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(r);break;case 42:break;case 43:break;case 44:this._clearActiveCues(r);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(r)}if((23===t||31===t)&&e>=33&&35>=e)switch(e){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(s){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var e=!0,a=!1,i=void 0;try{for(var n,t=this.memory[Symbol.iterator]();!(e=(n=t.next()).done);e=!0){var r=n.value;r.startTime=s,this._textTrack.addCue(r),this.display.push(r)}}catch(e){a=!0,i=e}finally{try{!e&&t.return&&t.return()}finally{if(a)throw i}}this.memory=[],this.cue=null}},{key:"_clearActiveCues",value:function(n){var e=!0,r=!1,a=void 0;try{for(var i,t=this.display[Symbol.iterator]();!(e=(i=t.next()).done);e=!0){var s=i.value;s.endTime=n}}catch(e){r=!0,a=e}finally{try{!e&&t.return&&t.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();e.default=a},{}],37:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t "+e}function n(t){var r=window.console[t];return r?function(){for(var n=arguments.length,e=Array(n),a=0;n>a;a++)e[a]=arguments[a];e[0]&&(e[0]=i(t,e[0])),r.apply(window.console,e)}:e}function s(r){for(var a=arguments.length,i=Array(a>1?a-1:0),e=1;a>e;e++)i[e-1]=arguments[e];i.forEach(function(e){t[e]=r[e]?r[e].bind(r):n(e)})}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},a={trace:e,debug:e,log:e,warn:e,info:e,error:e},t=a;r.enableLogs=function(e){if(e===!0||"object"===("undefined"==typeof e?"undefined":o(e))){s(e,"debug","log","info","warn","error");try{t.log()}catch(e){t=a}}else t=a},r.logger=t},{}],39:[function(r,t,a){"use strict";var e={buildAbsoluteURL:function(r,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var l=null,o=null,n=/^([^#]*)(.*)$/.exec(t);n&&(o=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(l=s[2],t=s[1]);var f=/^([^#]*)(.*)$/.exec(r);f&&(r=f[1]);var u=/^([^\?]*)(.*)$/.exec(r);u&&(r=u[1]);var a=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(r);if(!a)throw new Error("Error trying to parse base URL.");var h=a[2]||"",d=a[1]||"",c=a[4],i=null;return i=/^\/\//.test(t)?h+"//"+e.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?d+"/"+e.buildAbsolutePath("",t.substring(1)):e.buildAbsolutePath(d+c,t),l&&(i+=l),o&&(i+=o),i},buildAbsolutePath:function(n,s){for(var a,e,o=s,i="",t=n.replace(/[^\/]*$/,o.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),r=0;e=t.indexOf("/../",r),e>-1;r=e+a)a=/^\/(?:\.\.\/)*/.exec(t.slice(e))[0].length,i=(i+t.substring(r,e)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(a-1)/3+"}$"),"/");return i+t.substr(r)}};t.exports=e},{}],40:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t=200&&300>t?(window.clearTimeout(this.timeoutHandle),r.tload=Math.max(r.tfirst,performance.now()),this.onSuccess(a,r)):r.retry>=this.maxRetry||t>=400&&499>t?(window.clearTimeout(this.timeoutHandle),e.logger.error(t+" while loading "+this.url),this.onError(a)):(e.logger.warn(t+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),r.retry++))}},{key:"loadtimeout",value:function(t){e.logger.warn("timeout while loading "+this.url),this.onTimeout(t,this.stats)}},{key:"loadprogress",value:function(t){var e=this.stats;0===e.tfirst&&(e.tfirst=Math.max(performance.now(),e.trequest)),e.loaded=t.loaded,this.onProgress&&this.onProgress(t,e)}}]),t}();t.default=n},{"../utils/logger":38}]},{},[27])(27)}); diff --git a/dashboard-ui/bower_components/hls.js/.bower.json b/dashboard-ui/bower_components/hlsjs/.bower.json similarity index 82% rename from dashboard-ui/bower_components/hls.js/.bower.json rename to dashboard-ui/bower_components/hlsjs/.bower.json index bb16d9ac0..318e61be3 100644 --- a/dashboard-ui/bower_components/hls.js/.bower.json +++ b/dashboard-ui/bower_components/hlsjs/.bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.50", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", @@ -16,11 +16,11 @@ "test", "tests" ], - "_release": "0.5.47", + "_release": "0.5.50", "_resolution": { "type": "version", - "tag": "v0.5.47", - "commit": "21becc9db79debff24e818fee2d961ed655e744b" + "tag": "v0.5.50", + "commit": "854f98fa81601076a44e4849a45cbd65dcc0c3ee" }, "_source": "git://github.com/dailymotion/hls.js.git", "_target": "~0.5.7", diff --git a/dashboard-ui/bower_components/hls.js/API.md b/dashboard-ui/bower_components/hlsjs/API.md similarity index 100% rename from dashboard-ui/bower_components/hls.js/API.md rename to dashboard-ui/bower_components/hlsjs/API.md diff --git a/dashboard-ui/bower_components/hls.js/LICENSE b/dashboard-ui/bower_components/hlsjs/LICENSE similarity index 100% rename from dashboard-ui/bower_components/hls.js/LICENSE rename to dashboard-ui/bower_components/hlsjs/LICENSE diff --git a/dashboard-ui/bower_components/hls.js/bower.json b/dashboard-ui/bower_components/hlsjs/bower.json similarity index 94% rename from dashboard-ui/bower_components/hls.js/bower.json rename to dashboard-ui/bower_components/hlsjs/bower.json index 2edfe2f88..221aeaa32 100644 --- a/dashboard-ui/bower_components/hls.js/bower.json +++ b/dashboard-ui/bower_components/hlsjs/bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.50", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/bower_components/hls.js/design.md b/dashboard-ui/bower_components/hlsjs/design.md similarity index 100% rename from dashboard-ui/bower_components/hls.js/design.md rename to dashboard-ui/bower_components/hlsjs/design.md diff --git a/dashboard-ui/bower_components/hlsjs/dist/hls.min.js b/dashboard-ui/bower_components/hlsjs/dist/hls.min.js new file mode 100644 index 000000000..68745688b --- /dev/null +++ b/dashboard-ui/bower_components/hlsjs/dist/hls.min.js @@ -0,0 +1,5 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){return function e(t,r,a){function i(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return i(r?r:e)},d,d.exports,e,t,r,a)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},a.prototype.on=a.prototype.addListener,a.prototype.once=function(e,t){function r(){this.removeListener(e,r),a||(a=!0,t.apply(this,arguments))}if(!i(t))throw TypeError("listener must be a function");var a=!1;return r.listener=t,this.on(e,r),this},a.prototype.removeListener=function(e,t){var r,a,n,o;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,a=-1,r===t||i(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){a=o;break}if(a<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},a.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],i(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},a.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?i(this._events[e])?[this._events[e]]:this._events[e].slice():[]},a.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(i(t))return 1;if(t)return t.length}return 0},a.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(e,t,r){var a=arguments[3],i=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e){for(var t,r=Object.keys(n),o=0,l=r.length;o500*r.duration){var i=e.levels,n=Math.max(1,1e3*r.loaded/a),s=Math.max(r.loaded,Math.round(r.duration*i[r.level].bitrate/8)),o=t.currentTime,l=(s-r.loaded)/n,d=c.default.bufferInfo(t,o,e.config.maxBufferHole).end-o;if(d<2*r.duration&&l>d){var f=void 0,h=void 0;for(h=r.level-1;h>=0&&(f=r.duration*i[h].bitrate/(6.4*n),g.logger.log("fragLoadedDelay/bufferStarvationDelay/fragLevelNextLoadedDelay["+h+"] :"+l.toFixed(1)+"/"+d.toFixed(1)+"/"+f.toFixed(1)),!(f=0;l--){var u=o[l],d=u.details,f=d?d.totalduration/d.fragments.length:t,h=void 0;h=l<=e?n*r:s*r;var c=o[l].bitrate,v=c*f/h;if(g.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+l+"/"+Math.round(h)+"/"+c+"/"+f+"/"+i+"/"+v),h>c&&(!v||v=0)return f;g.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var h=a.maxStarvationDelay;if(0===d){var v=this.bitrateTestDelay;v&&(h-=v,g.logger.trace("bitrate test took "+Math.round(1e3*v)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*h)+" ms"))}return f=this.findBestLevel(n,s,u,t,d+h,a.abrBandWidthFactor,a.abrBandWidthUpFactor,r),Math.max(f,0)}}]),t}(f.default);r.default=m},{"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../utils/logger":38,"./ewma-bandwidth-estimator":6}],4:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis._msDuration&&(h.logger.log("Updating mediasource duration to "+this._levelDuration),t.duration=this._levelDuration,this._msDuration=this._levelDuration)}}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;if(r)for(var a in r)t+=r[a].buffered.length;this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(t){if(this.media.error)return r=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");for(var a in t)if(t[a].updating)return;if(r.length){var i=r.shift();try{t[i.type].appendBuffer(i.data),this.appendError=0,this.appended++}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var n={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],n.details=c.ErrorDetails.BUFFER_FULL_ERROR,void e.trigger(u.default.ERROR,n);if(this.appendError?this.appendError++:this.appendError=1,n.details=c.ErrorDetails.BUFFER_APPEND_ERROR,n.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],n.fatal=!0,void e.trigger(u.default.ERROR,n);n.fatal=!1,e.trigger(u.default.ERROR,n)}}}}},{key:"flushBuffer",value:function(e,t){var r,a,i,n,s,o;if(this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+l+" ["+s+","+o+"], of ["+i+","+n+"], pos:"+this.media.currentTime),r.remove(s,o),!1}else h.logger.warn("abort flushing too many retries");return h.logger.log("buffer flushed"),!0}}]),t}(f.default);r.default=v},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],5:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(e){var t=void 0,r=void 0,a=void 0,i=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(a=this.levels[r],t=r,s=a.width,o=a.height,!(i<=s||n<=o));r++);return t}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{"../event-handler":22,"../events":23}],6:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=this.minWeight_}},{key:"getEstimate",value:function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_}},{key:"destroy",value:function(){}}]),e}();r.default=l},{"../utils/ewma":37}],7:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r=0&&e1e3){h.logger.log("(re)loading playlist for level "+e);var i=r.urlId;this.hls.trigger(u.default.LEVEL_LOADING,{url:r.url[i],level:e,id:i})}}else this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.OTHER_ERROR,details:c.ErrorDetails.LEVEL_SWITCH_ERROR,level:e,fatal:!1,reason:"invalid level idx"})}},{key:"onError",value:function(e){if(!e.fatal){var t=e.details,r=this.hls,a=void 0,i=void 0,n=!1;switch(t){case c.ErrorDetails.FRAG_LOAD_ERROR:case c.ErrorDetails.FRAG_LOAD_TIMEOUT:case c.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case c.ErrorDetails.KEY_LOAD_ERROR:case c.ErrorDetails.KEY_LOAD_TIMEOUT:a=e.frag.level;break;case c.ErrorDetails.LEVEL_LOAD_ERROR:case c.ErrorDetails.LEVEL_LOAD_TIMEOUT:a=e.level,n=!0}if(void 0!==a)if(i=this._levels[a],i.urlIde&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){return void 0===this._startLevel?this._firstLevel:this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=v},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],8:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0?(v.logger.log("configure startPosition @"+r),this.lastPaused||(v.logger.log("resuming video"),t.play())):this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=this.startFragRequested?R.IDLE:R.STARTING,this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else v.logger.warn("cannot start loading as manifest not parsed yet"),this.state=R.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=R.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,a=this.hls,i=a.config,n=this.media,s=n&&n.seeking;switch(this.state){case R.ERROR:case R.PAUSED:break;case R.STARTING:var o=a.startLevel;o===-1&&(o=0,this.fragBitrateTest=!0),this.level=a.nextLoadLevel=o,this.state=R.WAITING_LEVEL,this.loadedmetadata=!1;break;case R.IDLE:if(!n&&(this.startFragRequested||!i.startFragPrefetch))break;e=this.loadedmetadata?n.currentTime:this.nextLoadPosition,t=a.nextLoadLevel;var l,u=m.default.bufferInfo(n,e,i.maxBufferHole),d=u.len,h=u.end,c=this.fragPrevious;if(l=this.levels[t].hasOwnProperty("bitrate")?Math.max(8*i.maxBufferSize/this.levels[t].bitrate,i.maxBufferLength):i.maxBufferLength,l=Math.min(l,i.maxMaxBufferLength),dk&&(n.currentTime=k)}if(r.PTSKnown&&h>b)break;if(this.startFragRequested&&!r.PTSKnown){if(c){var S=c.sn+1;S>=r.startSN&&S<=r.endSN&&(L=g[S-r.startSN],v.logger.log("live playlist, switching playlist, load frag with next SN: "+L.sn))}L||(L=g[Math.min(y-1,Math.round(y/2))],v.logger.log("live playlist, switching playlist, unknown, load middle frag : "+L.sn))}}else hb-e||s)&&(e=0),L=p.default.search(g,function(t){return t.start+t.duration-e<=h?1:t.start-e>h?-1:0})):L=g[y-1]}(),L){if(E=L.start,c&&L.level===c.level&&L.sn===c.sn){if(!(L.sni.maxBufferHole&&c.dropped?(L=g[D-1],v.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),c.loadCounter--):(L=g[D+1],v.logger.log("SN just loaded, load next one: "+L.sn)),!L)break}if(null!=L.decryptdata.uri&&null==L.decryptdata.key)v.logger.log("Loading key for "+L.sn+" of ["+r.startSN+" ,"+r.endSN+"],level "+t),this.state=R.KEY_LOADING,a.trigger(f.default.KEY_LOADING,{frag:L});else{if(v.logger.log("Loading "+L.sn+" of ["+r.startSN+" ,"+r.endSN+"],level "+t+", currentTime:"+e+",bufferEnd:"+h.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,L.loadCounter){L.loadCounter++;var O=i.fragLoadingLoopThreshold;if(L.loadCounter>O&&Math.abs(this.fragLoadIdx-L.loadIdx)=I||s)&&(v.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=R.IDLE);break;case R.STOPPED:case R.FRAG_LOADING:case R.PARSING:case R.PARSED:case R.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(e){var t,r,a=this.bufferRange;if(a)for(t=a.length-1;t>=0;t--)if(r=a[t],e>=r.start&&e<=r.end)return r;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(e){var t=this.media;if(t)for(var r=t.buffered,a=0;a=r.start(a)&&e<=r.end(a))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),this.isBuffered(t)?e=this.getBufferRange(t):this.isBuffered(t+.1)&&(e=this.getBufferRange(t+.1)),e)){var a=e.frag;a!==this.fragPlaying&&(this.fragPlaying=a,this.hls.trigger(f.default.FRAG_CHANGED,{frag:a}))}}},{key:"immediateLevelSwitch",value:function(){if(v.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&(this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:0,endOffset:r.start-1})),e.paused)t=0;else{var i=this.hls.nextLoadLevel,n=this.levels[i],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0}if(a=this.getBufferRange(e.currentTime+t),a&&(a=this.followingBufferRange(a))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(e){var t=this.media=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(v.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===R.FRAG_LOADING){if(0===m.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){v.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=R.IDLE}}else this.state===R.ENDED&&(this.state=R.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){v.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){v.logger.log("trigger BUFFER_RESET"),this.hls.trigger(f.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(e){var t,r=!1,a=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(a=!0))}),this.audioCodecSwitch=r&&a,this.audioCodecSwitch&&v.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var i=this.config;i.autoStartLoad&&this.hls.startLoad(i.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,a=this.levels[r],i=t.totalduration,n=0;if(v.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+i),this.levelLastLoaded=r,t.live){var s=a.details;s?(b.default.mergeDetails(s,t),n=t.fragments[0].start,t.PTSKnown?v.logger.log("live playlist sliding:"+n.toFixed(3)):v.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,v.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(a.details=t,this.hls.trigger(f.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1){var o=t.startTimeOffset;if(isNaN(o))if(t.live){var l=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*t.targetduration;this.startPosition=Math.max(0,n+i-l)}else this.startPosition=0;else v.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o}this.nextLoadPosition=this.startPosition}this.state===R.WAITING_LEVEL&&(this.state=R.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===R.KEY_LOADING&&(this.state=R.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===R.FRAG_LOADING&&t&&r.level===t.level&&r.sn===t.sn){var a=e.stats;if(v.logger.log("Loaded "+t.sn+" of level "+t.level),this.fragBitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=R.IDLE,this.startFragRequested=!1,a.tparsed=a.tbuffered=performance.now(),this.hls.trigger(f.default.FRAG_BUFFERED,{stats:a,frag:t}),this.tick();else{this.state=R.PARSING,this.stats=a;var i=this.levels[this.level],n=i.details,s=n.totalduration,o=void 0===t.startDTS||isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=i.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(v.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,v.logger.log("Demuxing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var h=this.demuxer;h&&h.push(e.payload,d,i.videoCodec,o,t.cc,l,u,s,t.decryptdata)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){if(this.state===R.PARSING){var t,r,a=e.tracks;if(r=a.audio){var i=this.levels[this.level].audioCodec,n=navigator.userAgent.toLowerCase();i&&this.audioCodecSwap&&(v.logger.log("swapping playlist audio codec"),i=i.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==r.metadata.channelCount&&n.indexOf("firefox")===-1&&(i="mp4a.40.5"),n.indexOf("android")!==-1&&(i="mp4a.40.2",v.logger.log("Android: force audio codec to"+i)),r.levelCodec=i}if(r=a.video,r&&(r.levelCodec=this.levels[this.level].videoCodec),e.unique){var s={codec:"",levelCodec:""};for(t in e.tracks)r=a[t],s.container=r.container,s.codec&&(s.codec+=",",s.levelCodec+=","),r.codec&&(s.codec+=r.codec),r.levelCodec&&(s.levelCodec+=r.levelCodec);a={audiovideo:s}}this.hls.trigger(f.default.BUFFER_CODECS,a);for(t in a){r=a[t],v.logger.log("track:"+t+",container:"+r.container+",codecs[level/parsed]=["+r.levelCodec+"/"+r.codec+"]");var o=r.initSegment;o&&(this.pendingAppending++,this.hls.trigger(f.default.BUFFER_APPENDING,{type:t,data:o}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this;if(this.state===R.PARSING){this.tparse2=Date.now();var r=this.levels[this.level],a=this.fragCurrent;v.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var i=b.default.updateFragPTSDTS(r.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),n=this.hls;n.trigger(f.default.LEVEL_PTS_UPDATED,{details:r.details,level:this.level,drift:i}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.pendingAppending++,n.trigger(f.default.BUFFER_APPENDING,{type:e.type,data:r}))}),this.nextLoadPosition=e.endPTS,this.bufferRange.push({type:e.type,start:e.startPTS,end:e.endPTS,frag:a}),this.tick()}else v.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===R.PARSING&&(this.stats.tparsed=performance.now(),this.state=R.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case R.PARSING:case R.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===R.PARSED&&0===this.pendingAppending){var e=this.fragCurrent,t=this.stats;e&&(this.fragPrevious=e,t.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*t.length/(t.tbuffered-t.tfirst)),this.hls.trigger(f.default.FRAG_BUFFERED,{stats:t,frag:e}),v.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=R.IDLE),this.tick()}}},{key:"onError",value:function(e){var t=this.media,r=t&&this.isBuffered(t.currentTime)&&this.isBuffered(t.currentTime+.4),a=e.frag||this.fragCurrent;switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var i=this.fragLoadError;if(i?i++:i=1,i<=this.config.fragLoadingMaxRetry||r){this.fragLoadError=i,a.loadCounter=0;var n=Math.min(Math.pow(2,i-1)*this.config.fragLoadingRetryDelay,64e3);v.logger.warn("mediaController: frag loading failed, retry in "+n+" ms"),this.retryDate=performance.now()+n,this.state=R.FRAG_LOADING_WAITING_RETRY}else v.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(f.default.ERROR,e),this.state=R.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:e.fatal||(r?(this._reduceMaxMaxBufferLength(a.duration),this.state=R.IDLE):a.autoLevel&&0!==a.level||(e.fatal=!0,this.hls.trigger(f.default.ERROR,e),this.state=R.ERROR));break;case _.ErrorDetails.LEVEL_LOAD_ERROR:case _.ErrorDetails.LEVEL_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==R.ERROR&&(this.state=e.fatal?R.ERROR:R.IDLE,v.logger.warn("mediaController: "+e.details+" while loading frag,switch to "+this.state+" state ..."));break;case _.ErrorDetails.BUFFER_FULL_ERROR:this.state!==R.PARSING&&this.state!==R.PARSED||(this._reduceMaxMaxBufferLength(a.duration),this.state=R.IDLE)}}},{key:"_reduceMaxMaxBufferLength",value:function(e){this.config.maxMaxBufferLength>=e&&(this.config.maxMaxBufferLength/=2,v.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold)}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=e.buffered;if(!this.loadedmetadata&&r.length){this.loadedmetadata=!0;var a=this.startPosition;if(!t&&t!==a&&a){v.logger.log("target start position:"+a);var i=r.start(0),n=r.end(0);(an)&&(a=i,v.logger.log("target start position not buffered, seek to buffered.start(0) "+i)),v.logger.log("adjust currentTime from "+t+" to "+a),e.currentTime=a}}else{var s=m.default.bufferInfo(e,t,0),o=!(e.paused||e.ended||0===e.buffered.length),l=.4,u=t>e.playbackRate*this.lastCurrentTime;if(this.stalled&&u&&(this.stalled=!1,v.logger.log("playback not stuck anymore @"+t)),o&&s.len<=l&&(u?(l=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,v.logger.log("playback seems stuck @"+t),this.hls.trigger(f.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),s.len<=l)){var d=s.nextStart,h=d-t;if(d&&h0){v.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+d+" + nudge "+this.seekHoleNudgeDuration);var c=d+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=d+this.seekHoleNudgeDuration,this.hls.trigger(f.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:c})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=R.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var e,t,r=[];for(t=0;t>7))^e]=e;for(t=r=0;!f[t];t^=a||1,r=v[r]||1)for(s=r^r<<1^r<<2^r<<3^r<<4,s=s>>8^255&s^99,f[t]=s,h[s]=t,n=c[i=c[a=c[t]]],l=16843009*n^65537*i^257*a^16843008*t,o=257*c[s]^16843008*s,e=0;e<4;e++)u[e][t]=o=o<<24^o>>>8,d[e][s]=l=l<<24^l>>>8;for(e=0;e<5;e++)u[e]=u[e].slice(0),d[e]=d[e].slice(0)}},{key:"decrypt",value:function(e,t,r,a,i,n){var s,o,l,u,d=this._key[1],f=e^d[0],h=a^d[1],c=r^d[2],v=t^d[3],g=d.length/4-2,p=4,y=this._tables[1],m=y[0],E=y[1],b=y[2],_=y[3],R=y[4];for(u=0;u>>24]^E[h>>16&255]^b[c>>8&255]^_[255&v]^d[p],o=m[h>>>24]^E[c>>16&255]^b[v>>8&255]^_[255&f]^d[p+1],l=m[c>>>24]^E[v>>16&255]^b[f>>8&255]^_[255&h]^d[p+2],v=m[v>>>24]^E[f>>16&255]^b[h>>8&255]^_[255&c]^d[p+3],p+=4,f=s,h=o,c=l;for(u=0;u<4;u++)i[(3&-u)+n]=R[f>>>24]<<24^R[h>>16&255]<<16^R[c>>8&255]<<8^R[255&v]^d[p++],s=f,f=h,h=c,c=v,v=s}}]),e}();r.default=n},{}],11:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>8|e>>>24}},{key:"doDecrypt",value:function(e,t,r){var a,i,n,s,l,u,d,f,h,c=new Int32Array(e.buffer,e.byteOffset,e.byteLength>>2),v=new o.default(Array.prototype.slice.call(t)),g=new Uint8Array(e.byteLength),p=new Int32Array(g.buffer);for(a=~~r[0],i=~~r[1],n=~~r[2],s=~~r[3],h=0;h>>5,h-=p,h>0&&g+p+h<=m);)for(y=R+v*c,E={unit:e.subarray(g+p,g+p+h),pts:y,dts:y},b.samples.push(E),b.len+=h,g+=h+p,v++;g>>6)+1,o=(60&t[r+2])>>>2,o>h.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+a+",ADTS data:type:"+i+",sampleingIndex:"+o+"["+h[o]+"Hz],channelConfig:"+u),f.indexOf("firefox")!==-1?o>=6?(i=5,d=new Array(4),l=o-3):(i=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(i=2,d=new Array(2),l=o):(i=5,d=new Array(4),a&&(a.indexOf("mp4a.40.29")!==-1||a.indexOf("mp4a.40.5")!==-1)||!a&&o>=6?l=o-3:((a&&a.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!a&&1===u)&&(i=2,d=new Array(2)),l=o)),d[0]=i<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===i&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),{config:d,samplerate:h[o],channelCount:u,codec:"mp4a.40."+i})}}]),e}();r.default=o},{"../errors":21,"../utils/logger":38}],15:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r1?r-1:0),i=1;i1?r-1:0),i=1;i0&&null!=l&&null!=l.key&&"AES-128"===l.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var u=this;this.decrypter.decrypt(e,l.key,l.iv,function(e){u.pushDecrypted(e,t,r,a,i,n,s,o)})}else this.pushDecrypted(e,t,r,a,i,n,s,o)}},{key:"onWorkerMessage",value:function(e){var t=e.data;switch(t.event){case o.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(o.default.FRAG_PARSING_INIT_SEGMENT,r);break;case o.default.FRAG_PARSING_DATA:this.hls.trigger(o.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case o.default.FRAG_PARSING_METADATA:this.hls.trigger(o.default.FRAG_PARSING_METADATA,{samples:t.samples});break;case o.default.FRAG_PARSING_USERDATA:this.hls.trigger(o.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),t}();r.default=p},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../errors":21,"../events":23,"../utils/logger":38,webworkify:2}],18:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;re?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,a=8,i=8;for(t=0;t>4,y>1){if(m=v+5+e[v+4],m===v+188)continue}else m=v+4;if(R)if(p===L){if(g){if(l&&(this._parseAVCPES(this._parsePES(l)),b&&this._avcTrack.codec&&(A===-1||this._aacTrack.codec)))return void this.remux(e);l={data:[],size:0}}l&&(l.data.push(e.subarray(m,v+188)),l.size+=v+188-m)}else if(p===A){if(g){if(d&&(this._parseAACPES(this._parsePES(d)),b&&this._aacTrack.codec&&(L===-1||this._avcTrack.codec)))return void this.remux(e);d={data:[],size:0}}d&&(d.data.push(e.subarray(m,v+188)),d.size+=v+188-m)}else p===T&&(g&&(f&&this._parseID3PES(this._parsePES(f)),f={data:[],size:0}),f&&(f.data.push(e.subarray(m,v+188)),f.size+=v+188-m));else g&&(m+=e[m]+1),0===p?this._parsePAT(e,m):p===this._pmtId?(this._parsePMT(e,m),R=this.pmtParsed=!0,L=this._avcTrack.id,A=this._aacTrack.id,T=this._id3Track.id,_&&(h.logger.log("reparse from beginning"),_=!1,v=-188)):(h.logger.log("unknown PID found before PAT/PMT"),_=!0)}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});l&&this._parseAVCPES(this._parsePES(l)),d&&this._parseAACPES(this._parsePES(d)),f&&this._parseID3PES(this._parsePES(f)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(e,t){var r,a,i,n;for(r=(15&e[t+1])<<8|e[t+2],a=t+3+r-4,i=(15&e[t+10])<<8|e[t+11],t+=12+i;t4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);f.length;){t=f.shift();var h=t.byteLength;if(u){if(u>h){u-=h;continue}t=t.subarray(u),h-=u,u=0}s.set(t,d),d+=h}return{data:s,pts:o,dts:l,len:i}}return null}},{key:"_parseAVCPES",value:function(e){var t,r,a,i,n=this,s=this._avcTrack,o=s.samples,l=this._parseAVCNALu(e.data),u=[],d=!1,c=!1,v=0;if(0===l.length&&o.length>0){var g=o[o.length-1],p=g.units.units[g.units.units.length-1],y=new Uint8Array(p.data.byteLength+e.data.byteLength);y.set(p.data,0),y.set(e.data,p.data.byteLength),p.data=y,g.units.length+=e.data.byteLength,s.len+=e.data.byteLength}e.data=null;var m="",E=function(){u.length&&(c===!0||s.sps&&(o.length||this.contiguous)?(r={units:{units:u,length:v},pts:e.pts,dts:e.dts,key:c},o.push(r),s.len+=v,s.nbNalu+=u.length):s.dropped++,u=[],v=0)}.bind(this);l.forEach(function(r){switch(r.type){case 1:a=!0,d&&(m+="NDR ");break;case 5:a=!0,d&&(m+="IDR "),c=!0;break;case 6:a=!0,d&&(m+="SEI "),t=new f.default(r.data),t.readUByte();var o=t.readUByte();if(4===o){var l=0;do l=t.readUByte();while(255===l);var h=t.readUByte();if(181===h){var g=t.readUShort();if(49===g){var p=t.readUInt();if(1195456820===p){var y=t.readUByte();if(3===y){var b=t.readUByte(),_=t.readUByte(),R=31&b,L=[b,_];for(i=0;i0){var y=this._avcTrack,m=y.samples;if(m.length){var E=m[m.length-1],b=E.units.units,_=b[b.length-1],R=new Uint8Array(_.data.byteLength+r);R.set(_.data,0),R.set(e.subarray(0,r),_.data.byteLength),_.data=R,E.units.length+=r,y.len+=r}}}n=o,s=i,u=0}else u=0}return n&&(a={data:e.subarray(n,l),type:s,state:u},d.push(a),this.avcNaluState=u),d}},{key:"_parseAACPES",value:function(e){var t,r,a,i,n,s,l,d,f,v=this._aacTrack,g=e.data,p=e.pts,y=0,m=this._duration,E=this.audioCodec,b=this.aacOverFlow,_=this.aacLastPTS;if(b){var R=new Uint8Array(b.byteLength+g.byteLength);R.set(b,0),R.set(g,b.byteLength),g=R}for(n=y,d=g.length;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((T-p)/90)),p=T)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+i*a,f={unit:g.subarray(n+s,n+s+r),pts:l,dts:l},v.samples.push(f),v.len+=r,n+=r+s,i++;n=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=v},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;nd&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,a=0,i=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){var f=Math.abs(u.startPTS-a);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS),a=Math.min(a,u.startPTS),i=Math.max(i,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=a-u.start;for(u.start=u.startPTS=a,u.endPTS=i,u.startDTS=n,u.endDTS=s,u.duration=i-a,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?i.start=a.start+a.duration:i.start=a.start-i.duration:r>t?(a.duration=s-a.start,a.duration<0&&n.logger.error("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!")):(i.duration=a.start-s,i.duration<0&&n.logger.error("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{"../utils/logger":38}],26:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r1?t-1:0),a=1;a1?t-1:0),a=1;a>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=this.cloneObj(e),r.iv=this.createInitializationVector(t)),r}},{key:"avc1toavcoti",value:function(e){var t,r=e.split(".");return r.length>2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(e,t,r){var a,i,n,s=0,o=0,l={version:null,type:null,url:t,fragments:[],live:!0,startSN:0},u={method:null,key:null,iv:null,uri:null},d=0,f=null,h=null,c=null,v=null,g=null,m=null;for(n=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(i=n.exec(e));)switch(i.shift(),i=i.filter(function(e){return void 0!==e}),i[0]){case"VERSION":l.version=parseInt(i[1]);break;case"PLAYLIST-TYPE":l.type=i[1].toUpperCase();break;case"MEDIA-SEQUENCE":s=l.startSN=parseInt(i[1]);break;case"TARGETDURATION":l.targetduration=parseFloat(i[1]);break;case"EXTM3U":break;case"ENDLIST":l.live=!1;break;case"DIS":d++;break;case"BYTERANGE":var E=i[1].split("@");m=1===E.length?g:parseInt(E[1]),g=parseInt(E[0])+m;break;case"INF":c=parseFloat(i[1]),v=i[2]?i[2]:null;break;case"":if(!isNaN(c)){var b=s++;a=this.fragmentDecryptdataFromLevelkey(u,b);var _=i[1]?this.resolve(i[1],t):null;h={url:_,duration:c,title:v,start:o,sn:b,level:r,cc:d,decryptdata:a,programDateTime:f},null!==m&&(h.byteRangeStartOffset=m,h.byteRangeEndOffset=g),l.fragments.push(h),o+=c,c=null,v=null,m=null,f=null}break;case"KEY":var R=i[1],L=new p.default(R),A=L.enumeratedString("METHOD"),T=L.URI,k=L.hexadecimalInteger("IV");A&&(u={method:null,key:null,iv:null,uri:null},T&&"AES-128"===A&&(u.method=A,u.uri=this.resolve(T,t),u.key=null,u.iv=k));break;case"START":var S=i[1],w=new p.default(S),D=w.decimalFloatingPoint("TIME-OFFSET");D&&(l.startTimeOffset=D);break;case"PROGRAM-DATE-TIME":f=new Date(Date.parse(i[1]));break;case"#":i.shift();break;default:y.logger.warn("line parsed but not handled: "+i)}return h&&!h.url&&(l.fragments.pop(),o-=h.duration),l.totalduration=o,l.endSN=s-1,l}},{key:"loadsuccess",value:function(e,t){var r,a=e.currentTarget,i=a.responseText,n=a.responseURL,s=this.id,o=this.id2,l=this.hls;if(this.loading=!1,void 0===n&&(n=this.url),t.tload=performance.now(),t.mtime=new Date(a.getResponseHeader("Last-Modified")),0===i.indexOf("#EXTM3U"))if(i.indexOf("#EXTINF:")>0){var d=this.parseLevelPlaylist(i,n,s||0);d.tload=t.tload,null===s&&l.trigger(u.default.MANIFEST_LOADED,{levels:[{url:n,details:d}],url:n,stats:t}),t.tparsed=performance.now(),l.trigger(u.default.LEVEL_LOADED,{details:d,level:s||0,id:o,stats:t})}else r=this.parseMasterPlaylist(i,n),r.length?l.trigger(u.default.MANIFEST_LOADED,{levels:r,url:n,stats:t}):l.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:n,reason:"no level found in manifest"});else l.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:n,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e){var t,r;null===this.id?(t=h.ErrorDetails.MANIFEST_LOAD_ERROR,r=!0):(t=h.ErrorDetails.LEVEL_LOAD_ERROR,r=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:t,fatal:r,url:this.url,loader:this.loader,response:e.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var e,t;null===this.id?(e=h.ErrorDetails.MANIFEST_LOAD_TIMEOUT,t=!0):(e=h.ErrorDetails.LEVEL_LOAD_TIMEOUT,t=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:e,fatal:t,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),t}(f.default);r.default=m},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r>24&255,t[1]=a>>16&255,t[2]=a>>8&255,t[3]=255&a,t.set(e,4),i=0,a=8;i>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(t){var r,a,i=t.samples||[],n=new Uint8Array(4+i.length);for(a=0;a>>8&255),n.push(255&i),n=n.concat(Array.prototype.slice.call(a));for(r=0;r>>8&255),s.push(255&i),s=s.concat(Array.prototype.slice.call(a));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var a=e.sdtp(t),i=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,a.length+16+16+8+16+8+8),a)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var a,i,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),a=0;a>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,h)}},{key:"initSegment",value:function(t){e.types||e.init();var r,a=e.moov(t);return r=new Uint8Array(e.FTYP.byteLength+a.byteLength),r.set(e.FTYP),r.set(a,e.FTYP.byteLength),r}}]),e}();r.default=n},{}],32:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rMath.pow(2,32)&&!function(){var t=function e(t,r){return r?e(r,t%r):t};e.timescale=e.audiosamplerate/t(e.audiosamplerate,1024)}(),l.logger.log("audio mp4 timescale :"+e.timescale),c.audio={container:"audio/mp4",codec:e.codec,initSegment:d.default.initSegment([e]),metadata:{channelCount:e.channelCount}},g&&(a=i=s[0].pts-h*r)),t.sps&&t.pps&&u.length&&(t.timescale=this.MP4_TIMESCALE,c.video={container:"video/mp4",codec:t.codec,initSegment:d.default.initSegment([t]),metadata:{width:t.width,height:t.height}},g&&(a=Math.min(a,u[0].pts-h*r),i=Math.min(i,u[0].dts-h*r))),Object.keys(c).length?(n.trigger(o.default.FRAG_PARSING_INIT_SEGMENT,v),this.ISGenerated=!0,g&&(this._initPTS=a,this._initDTS=i)):n.trigger(o.default.ERROR,{type:f.ErrorTypes.MEDIA_ERROR,details:f.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(e,t,r){var a,i,n,s,u,f,h,c,v,g,p,y,m,E,b,_=8,R=this.PES_TIMESCALE,L=this.PES2MP4SCALEFACTOR,A=[],T=e.samples.reduce(function(e,t){return Math.max(Math.min(e,t.pts-t.dts),-18e3)},0);for(T<0&&l.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(T/90)+" ms to overcome this issue"),f=new Uint8Array(e.len+4*e.nbNalu+8),a=new DataView(f.buffer),a.setUint32(0,f.byteLength),f.set(d.default.types.mdat,4);e.samples.length;){for(i=e.samples.shift(),s=0;i.units.units.length;)u=i.units.units.shift(),a.setUint32(_,u.data.byteLength),_+=4,f.set(u.data,_),_+=u.data.byteLength,s+=4+u.data.byteLength;if(p=i.pts-this._initDTS,y=i.dts-this._initDTS+T,y=Math.min(p,y),void 0!==g){m=this._PTSNormalize(p,g),E=this._PTSNormalize(y,g);var k=(E-g)/L;k<=0&&(l.logger.log("invalid sample duration at PTS/DTS: "+i.pts+"/"+i.dts+":"+k),k=1),n.duration=k}else{var S=void 0,w=void 0;S=r?this.nextAvcDts:t*R,m=this._PTSNormalize(p,S),E=this._PTSNormalize(y,S),w=Math.round((E-S)/90),r&&w&&(w>1?l.logger.log("AVC:"+w+" ms hole between fragments detected,filling it"):w<-1&&l.logger.log("AVC:"+-w+" ms overlapping between fragments detected"),E=S,m=Math.max(m-w,E),l.logger.log("Video/PTS/DTS adjusted: "+m+"/"+E+",delta:"+w)),c=Math.max(0,m),v=Math.max(0,E)}n={size:s,duration:0,cts:(m-E)/L,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},b=n.flags,i.key===!0?(b.dependsOn=2,b.isNonSync=0):(b.dependsOn=1,b.isNonSync=1),A.push(n),g=E}var D=0;A.length>=2&&(D=A[A.length-2].duration,n.duration=D),this.nextAvcDts=E+D*L;var O=e.dropped;e.len=0,e.nbNalu=0,e.dropped=0,A.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(b=A[0].flags,b.dependsOn=2,b.isNonSync=0),e.samples=A,h=d.default.moof(e.sequenceNumber++,v/L,e),e.samples=[],this.observer.trigger(o.default.FRAG_PARSING_DATA,{data1:h,data2:f,startPTS:c/R,endPTS:(m+L*D)/R,startDTS:v/R,endDTS:this.nextAvcDts/R,type:"video",nb:A.length,dropped:O})}},{key:"remuxAudio",value:function(e,t,r){var a,i,n,s,u,f,h,c,v,g,p,y,m,E=8,b=this.PES_TIMESCALE,_=e.timescale,R=b/_,L=1024*e.timescale/e.audiosamplerate,A=[],T=[];for(e.samples.sort(function(e,t){return e.pts-t.pts}),T=e.samples;T.length;){if(i=T.shift(),s=i.unit,g=i.pts-this._initDTS,p=i.dts-this._initDTS,void 0!==v)y=this._PTSNormalize(g,v),m=this._PTSNormalize(p,v),n.duration=(m-v)/R,Math.abs(n.duration-L)>L/10&&l.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*e.audiosamplerate/e.timescale)),n.duration=L,y=m=L*R+v;else{var k=void 0,S=void 0;if(k=r?this.nextAacPts:t*b,y=this._PTSNormalize(g,k),m=this._PTSNormalize(p,k),S=Math.round(1e3*(y-k)/b),r&&S){if(S>0)l.logger.log(S+" ms hole between AAC samples detected,filling it");else if(S<-12){l.logger.log(-S+" ms overlapping between AAC samples detected, drop frame"),e.len-=s.byteLength;continue}y=m=k}if(h=Math.max(0,y),c=Math.max(0,m),!(e.len>0))return;u=new Uint8Array(e.len+8),a=new DataView(u.buffer),a.setUint32(0,u.byteLength),u.set(d.default.types.mdat,4)}u.set(s,E),E+=s.byteLength,n={size:s.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},A.push(n),v=m}var w=0,D=A.length;D>=2&&(w=A[D-2].duration,n.duration=w),D&&(this.nextAacPts=y+R*w,e.len=0,e.samples=A,f=d.default.moof(e.sequenceNumber++,c/R,e),e.samples=[],this.observer.trigger(o.default.FRAG_PARSING_DATA,{data1:f,data2:u,startPTS:h/b,endPTS:this.nextAacPts/b,startDTS:c/b,endDTS:(m+R*w)/b,type:"audio",nb:D}))}},{key:"remuxID3",value:function(e,t){var r,a=e.samples.length;if(a){for(var i=0;i4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),e}();r.default=h},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"hexadecimalInteger",value:function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),a=0;aNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(e){var t=/^(\d+)x(\d+)$/.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}}],[{key:"parseAttrList",value:function(e){for(var t,r=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,a={};null!==(t=r.exec(e));){var i=t[2],n='"';0===i.indexOf(n)&&i.lastIndexOf(n)===i.length-1&&(i=i.slice(1,-1)),a[t[1]]=i}return a}}]),e}();r.default=n},{}],35:[function(e,t,r){"use strict";var a={search:function(e,t){for(var r=0,a=e.length-1,i=null,n=null;r<=a;){i=(r+a)/2|0,n=e[i];var s=t(n);if(s>0)r=i+1;else{if(!(s<0))return n;a=i-1}}return null}};t.exports=a},{}],36:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0;)e.removeCue(e.cues[0])}},{key:"push",value:function(e,t){this.cue||this._createCue();for(var r,a,i,n,s,o=31&t[0],l=2,u=0;u=48&&i<=63)switch(i){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===a||25===a)&&i>=32&&i<=47)switch(i){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===a||28===a)&&i>=32&&i<=47)switch(i){case 32:this._clearActiveCues(e);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(e);break;case 42:break;case 43:break;case 44:this._clearActiveCues(e);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(e)}if((23===a||31===a)&&i>=33&&i<=35)switch(i){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(e){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var t=!0,r=!1,a=void 0;try{for(var i,n=this.memory[Symbol.iterator]();!(t=(i=n.next()).done);t=!0){var s=i.value;s.startTime=e,this._textTrack.addCue(s),this.display.push(s)}}catch(e){r=!0,a=e}finally{try{!t&&n.return&&n.return()}finally{if(r)throw a}}this.memory=[], +this.cue=null}},{key:"_clearActiveCues",value:function(e){var t=!0,r=!1,a=void 0;try{for(var i,n=this.display[Symbol.iterator]();!(t=(i=n.next()).done);t=!0){var s=i.value;s.endTime=e}}catch(e){r=!0,a=e}finally{try{!t&&n.return&&n.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();r.default=n},{}],37:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r "+t}function n(e){var t=window.console[e];return t?function(){for(var r=arguments.length,a=Array(r),n=0;n1?t-1:0),a=1;a-1;o=a+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(a))[0].length,n=(n+s.substring(o,a)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};t.exports=a},{}],40:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r=2&&(0===a.tfirst&&(a.tfirst=Math.max(performance.now(),a.trequest),window.clearTimeout(this.timeoutHandle),this.timeoutHandle=window.setTimeout(this.loadtimeout.bind(this),this.timeout-(a.tfirst-a.trequest))),4===r)){var i=t.status;i>=200&&i<300?(window.clearTimeout(this.timeoutHandle),a.tload=Math.max(a.tfirst,performance.now()),this.onSuccess(e,a)):a.retry>=this.maxRetry||i>=400&&i<499?(window.clearTimeout(this.timeoutHandle),n.logger.error(i+" while loading "+this.url),this.onError(e)):(n.logger.warn(i+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.timeoutHandle=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),a.retry++)}}},{key:"loadtimeout",value:function(e){n.logger.warn("timeout while loading "+this.url),this.onTimeout(e,this.stats)}},{key:"loadprogress",value:function(e){var t=this.stats;t.loaded=e.loaded,this.onProgress&&this.onProgress(e,t)}}]),e}();r.default=s},{"../utils/logger":38}]},{},[27])(27)}); diff --git a/dashboard-ui/bower_components/hls.js/hls.js.sublime-project b/dashboard-ui/bower_components/hlsjs/hls.js.sublime-project similarity index 100% rename from dashboard-ui/bower_components/hls.js/hls.js.sublime-project rename to dashboard-ui/bower_components/hlsjs/hls.js.sublime-project diff --git a/dashboard-ui/bower_components/hls.js/package.json b/dashboard-ui/bower_components/hlsjs/package.json similarity index 99% rename from dashboard-ui/bower_components/hls.js/package.json rename to dashboard-ui/bower_components/hlsjs/package.json index 852af9cf5..3ab22775f 100644 --- a/dashboard-ui/bower_components/hls.js/package.json +++ b/dashboard-ui/bower_components/hlsjs/package.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.50", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/bower_components/howler.js/.bower.json b/dashboard-ui/bower_components/howlerjs/.bower.json similarity index 100% rename from dashboard-ui/bower_components/howler.js/.bower.json rename to dashboard-ui/bower_components/howlerjs/.bower.json diff --git a/dashboard-ui/bower_components/howler.js/CHANGELOG.md b/dashboard-ui/bower_components/howlerjs/CHANGELOG.md similarity index 100% rename from dashboard-ui/bower_components/howler.js/CHANGELOG.md rename to dashboard-ui/bower_components/howlerjs/CHANGELOG.md diff --git a/dashboard-ui/bower_components/howler.js/LICENSE.md b/dashboard-ui/bower_components/howlerjs/LICENSE.md similarity index 100% rename from dashboard-ui/bower_components/howler.js/LICENSE.md rename to dashboard-ui/bower_components/howlerjs/LICENSE.md diff --git a/dashboard-ui/bower_components/howler.js/bower.json b/dashboard-ui/bower_components/howlerjs/bower.json similarity index 100% rename from dashboard-ui/bower_components/howler.js/bower.json rename to dashboard-ui/bower_components/howlerjs/bower.json diff --git a/dashboard-ui/bower_components/howler.js/howler.min.js b/dashboard-ui/bower_components/howlerjs/howler.min.js similarity index 100% rename from dashboard-ui/bower_components/howler.js/howler.min.js rename to dashboard-ui/bower_components/howlerjs/howler.min.js diff --git a/dashboard-ui/bower_components/howler.js/package.json b/dashboard-ui/bower_components/howlerjs/package.json similarity index 100% rename from dashboard-ui/bower_components/howler.js/package.json rename to dashboard-ui/bower_components/howlerjs/package.json diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/.bower.json b/dashboard-ui/bower_components/iron-a11y-announcer/.bower.json deleted file mode 100644 index 2352a576a..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/.bower.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "iron-a11y-announcer", - "version": "1.0.5", - "description": "A singleton element that simplifies announcing text to screen readers.", - "keywords": [ - "web-components", - "polymer", - "a11y", - "live" - ], - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-a11y-announcer.git" - }, - "main": "iron-a11y-announcer.html", - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "polymer/polymer#^1.1.0" - }, - "devDependencies": { - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", - "paper-button": "polymerelements/paper-button#^1.0.0", - "paper-styles": "polymerelements/paper-styles#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-a11y-announcer", - "_release": "1.0.5", - "_resolution": { - "type": "version", - "tag": "v1.0.5", - "commit": "2432d39a1693ccd728cbe7eb55810063737d3403" - }, - "_source": "git://github.com/PolymerElements/iron-a11y-announcer.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-a11y-announcer" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 594376ff9..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/.gitignore b/dashboard-ui/bower_components/iron-a11y-announcer/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/.travis.yml b/dashboard-ui/bower_components/iron-a11y-announcer/.travis.yml deleted file mode 100644 index 146620909..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -env: - global: - - secure: QlyQxWnziNgzWqptOtM0Oq1s/q6YHT/GPuslA31yC0nex7Wi6X9DFoF5rNlDEY0Y6WxCh8xzsZpwXrI9vZypgKoZlAwO1e3RLDsGV0APPrWg66MyImAwlHAJolvJg+ASsLJ8pm9nxMP/xapRamciqUMTUTeZh0V/5SR82BXQCf3zXe+9cMmAFNXBrIg6LDCm77AwW+1vkE/IZAL1oShSBwXEybn9kpYsdCiOGdnvMlChhaeqRlOUXkr3LHPUDtV8hbd2EswmPeHSV+RGdB/UFyRGa4g7gPgqtz7U2FS0/BqT0G2iJlAXGCttJnS6fXwyCriREplYjXzqrX0MeRWHD5vNxAucO/Va1n2tHEmJM3OhIYgO8VDM8S3nRRUDE/ifSjsu1UgBN7b1vml0zWo7rdvpD8fedx6+g4ph390kg5XRFNJZJ03YijfcNVUfnOTEWt9LntGRq5aKPB6RSbEvkuZFjLGHHD/xQu2LfyIjmueIWJNk4JeCNrm3zFPMhBAZfu7WTJPTk3dZ2L+0mty1QbaJ/lyTWIBYbTVBwwHzXKrPbgg5u/9e6DjhT8Zg/eJvmN/+sXAlUqnmTAE9coQ0LIivg6COWPoRDmdGl2uMygiCaLkFAy4sqhjP99Aq5/ekZWXUrTTa4NGw2qnvM4JY9YcEzUC0ZqzM11gj8x8ATi0= - - secure: d0wz93AwXyNVmCr33od+TFC51nZgUzcdwHiJWxX0E+msZ8VgYCjj21D6OOZy84O7vYiPFy8vO03dvyqkj1uclEvfu2YlfiEaRxifKaxN6mQx142WjBtdHFjEUfBJR5eqm5qSeGj7aSZzPgerUl6yAkYH5tFldBatevF5Ax98Yr1dCsgpegsLCmBmusPH7tERnBilalcvXKVBfRXrnrkFkVoWroBb04W79aZSTlLGTlpBJCzR9Xe7RiXqnanSQQb1LjyCl55P0NvVVRjwpoVnikRqkIV/jehcNfIiJSC/vetepqqUehD6RdP2T8Nio7YvlLtXnW9vptlKYL2uZjhg23DyhgGW/4ZPaIABWVBqVUBbyaX6GCXo3EMyQcZhi17qCWEKnFGCrorC/4ZM6A0kJ+olOfQxszf9HrAX8+9DCaiKscn2Lz+ON/opFKFRAQngCJ9swBc27twavUxx4qNzOVJLdH8oGhCdl5DA4mgGGDWZz463X0HzagGUpi/RfME26uQnTkyK8eErL2yac+1VmA/QOx0RkYlrZ/pIEywkZPWusjJepCm9nlZGylaBr2mDpk8Kea+7IytO6sefiBwjX1RiqmnjnszO3jb/w5s0giUItWuFmDr14sOaFmj6wQB643eSGi42LSPG+FMea1RwUupyEPeLZq/aoJ0jmewGLv4= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -dist: trusty diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-a11y-announcer/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/bower.json b/dashboard-ui/bower_components/iron-a11y-announcer/bower.json deleted file mode 100644 index c049390d9..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/bower.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "iron-a11y-announcer", - "version": "1.0.5", - "description": "A singleton element that simplifies announcing text to screen readers.", - "keywords": [ - "web-components", - "polymer", - "a11y", - "live" - ], - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-a11y-announcer.git" - }, - "main": "iron-a11y-announcer.html", - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "polymer/polymer#^1.1.0" - }, - "devDependencies": { - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", - "paper-button": "polymerelements/paper-button#^1.0.0", - "paper-styles": "polymerelements/paper-styles#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/demo/index.html b/dashboard-ui/bower_components/iron-a11y-announcer/demo/index.html deleted file mode 100644 index 0dd286acf..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/demo/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - iron-a11y-announcer demo - - - - - - - -
-
-
- Note: in order to hear the announcements, be sure to turn on your favorite screen reader! - Hello, my name is Ava. - This true sentence is false. - Are you paying attention? -
-
-
- - diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/demo/x-announces.html b/dashboard-ui/bower_components/iron-a11y-announcer/demo/x-announces.html deleted file mode 100644 index 15c43c0d4..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/demo/x-announces.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/index.html b/dashboard-ui/bower_components/iron-a11y-announcer/index.html deleted file mode 100644 index 1f8889a8d..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - iron-a11y-announcer - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/iron-a11y-announcer.html b/dashboard-ui/bower_components/iron-a11y-announcer/iron-a11y-announcer.html deleted file mode 100644 index 11a8809ff..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/iron-a11y-announcer.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/test/index.html b/dashboard-ui/bower_components/iron-a11y-announcer/test/index.html deleted file mode 100644 index 4307eb38a..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/test/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - iron-a11y-announcer tests - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-announcer/test/iron-a11y-announcer.html b/dashboard-ui/bower_components/iron-a11y-announcer/test/iron-a11y-announcer.html deleted file mode 100644 index 510bf6f99..000000000 --- a/dashboard-ui/bower_components/iron-a11y-announcer/test/iron-a11y-announcer.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - iron-a11y-announcer - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.bower.json b/dashboard-ui/bower_components/iron-a11y-keys-behavior/.bower.json deleted file mode 100644 index 4df705f34..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.bower.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "iron-a11y-keys-behavior", - "version": "1.1.8", - "description": "A behavior that enables keybindings for greater a11y.", - "keywords": [ - "web-components", - "web-component", - "polymer", - "a11y", - "input" - ], - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git" - }, - "main": "iron-a11y-keys-behavior.html", - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.2", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-a11y-keys-behavior", - "_release": "1.1.8", - "_resolution": { - "type": "version", - "tag": "v1.1.8", - "commit": "078d64750538735c27e1c68ade907a6b58aceb43" - }, - "_source": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-a11y-keys-behavior" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 7d9360487..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.gitignore b/dashboard-ui/bower_components/iron-a11y-keys-behavior/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.travis.yml b/dashboard-ui/bower_components/iron-a11y-keys-behavior/.travis.yml deleted file mode 100644 index 265836891..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: node_js -sudo: required -before_script: - - npm install -g bower polylint web-component-tester - - bower install - - polylint -env: - global: - - secure: >- - XJ31r/5USVGZRtziCLfr8qM1pJKKQMUN1AeYbCdDFEc6i293WxZneR8PwUVhvyptu+qdyd28uy24sH+Ob7kShFbZTUaif5P4gqHPekrYToI0aHyhmVX7C1LmT7nEL8IcT62NhUwh+83eHTAdodkXgnhfQhPn9FHV24Dkvwm8OKhhzEhtTgUGVuGX9j9FyNV6n1+gf4X3Zq63+NkEUh5vpolpue4W7ul2u0sf4l0fzg9pvKPCmywUwX2i7wwAEf3CJghMu2xup54OzXTEkjjSou/ebt1ZnxaUNV1+dblfUne0v9wTD0dPF8H3DwgewwzcZSbOZmj6lFVHRzmLzWcRJOEKdDrpJkjpg7HIhNPGCKDUcNylekafqi7ezhzrkzFwkh6JCdAj7He4mv/X/OUDNjNCClB7Ms/+WPZwtACvIcR2/pvgZ+1PHbIkbIInyAe6iVMMR0oUecei/X+d04DH7iW7rrODVEu6qdibsJki0R0lR2184rrDO9pGek4rLu9sUQBDNgEM6ZLEXXByO8lpG4xStRdkg0/uR5i1/Q8kux4gIJ9yV8WLANkS8NVlmuJgIi6kbh5n4VVKaihGhbBUuTt2aL7fLnH2I6YRwjyNI9TOIRxwk4afppFYUuq6Fv+nfPcdqDOi5Y2AOXLJ3Yvco0+H57nXe/Ny29gFVW4Kftg= - - secure: >- - huEi/Ja2qnLatb7EJ4Jdc/XAeKphhdH6G+px7/XZY33oDawjStxakx0N/MpT0LPE1BdEWOYTzc17CzKv9R2L3ybWksqXyv/Zs+1NMTmpEAS/54Sk4E61aE3nrV5cfS2R8dBGbJhFoH1W237BDsbw9A4XhsTvhxlIsluWsZgeurbleGg+DgAmg8KlHGRddsfBFgXEk+Khhj6KPsbgPUiWhXpdnXKBPJKF7fJEAbsGR4aFK2eFbYd1OAgJg2Aye0n93IHe+SsxcKRUYteg6UK9V8fk7q5PBlvaodly4F3gH82l+zbnhcTFVW+qN0s6xDBTQzsQ55eTlO3pEezIo3u/1Lq41Yoe6scEkLs63pSYqoB3kakbhLMDJAen080ggdNg9evqvgyznKFYM7sqEcPu+KxHd043DyLTTW11y9lZ/hV3xSTdG4W8mV7+ILbIi54wMaYAcWSGMTOVM0JC/KDoVjze3tzDmfcZwiutLPBFgfrkfJQf3fyqcgvhoLKtHaWHI+76XDsXwEOS2Q5OX9oDtjoZaZ7r8Gp4dqwaKYceOrlsLbaZOLh5nJ4WnDbf4AqZkeM22QWWIfUN6aK+yhsDpQ/d+xJ+/WFENDADrMEKp0Lf3CkzAAcpHp3u65B9qsqweD5/5Je9t0GsA/NvK2xCasnNz6inYy4tAx9i4NWPcOY= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: - - xvfb-run wct - - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' -dist: trusty diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/bower.json b/dashboard-ui/bower_components/iron-a11y-keys-behavior/bower.json deleted file mode 100644 index 49e6ee7d0..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/bower.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "iron-a11y-keys-behavior", - "version": "1.1.8", - "description": "A behavior that enables keybindings for greater a11y.", - "keywords": [ - "web-components", - "web-component", - "polymer", - "a11y", - "input" - ], - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git" - }, - "main": "iron-a11y-keys-behavior.html", - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.2", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/index.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/index.html deleted file mode 100644 index 2c3fec7c5..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Iron A11y Keys Behavior demo - - - - - -
- -
- - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html deleted file mode 100644 index 5914bb999..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/index.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/index.html deleted file mode 100644 index c53ba6cf3..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - iron-a11y-keys-behavior - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html deleted file mode 100644 index 9e911fe2a..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/basic-test.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/basic-test.html deleted file mode 100644 index d0c2dc35f..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/basic-test.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - - iron-a11y-keys - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/index.html b/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/index.html deleted file mode 100644 index d00850a0e..000000000 --- a/dashboard-ui/bower_components/iron-a11y-keys-behavior/test/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - Tests - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/.bower.json b/dashboard-ui/bower_components/iron-behaviors/.bower.json deleted file mode 100644 index dac19e56b..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/.bower.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "iron-behaviors", - "version": "1.0.17", - "description": "Provides a set of behaviors for the iron elements", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-behaviors.git" - }, - "main": [ - "iron-button-state.html", - "iron-control-state.html" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "Polymer/polymer#^1.2.0", - "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "paper-input": "polymerelements/paper-input#^1.0.0", - "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-behaviors", - "_release": "1.0.17", - "_resolution": { - "type": "version", - "tag": "v1.0.17", - "commit": "ef8e89b5f0aa4e8a6b51ca6491ea453bf395f94f" - }, - "_source": "git://github.com/PolymerElements/iron-behaviors.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-behaviors" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 1cc85c0c7..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-behaviors/.gitignore b/dashboard-ui/bower_components/iron-behaviors/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-behaviors/.travis.yml b/dashboard-ui/bower_components/iron-behaviors/.travis.yml deleted file mode 100644 index 0c05730a4..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -env: - global: - - secure: H49pcRc5C6G+ti/ehtT74GZdsUsM/xCvEVJBmKq8rpck7s18R6BbH37RkF2XgYfO4rVa1Bl4KU4Wf5S6aIDYzdaq/phGtFQ04NmDYGbmBhRjwfgxlW4dJ7mkXqXCvNZkxJtAJpgzgVG+xu/I6GsO1Lp4VjGENvVYSsrkGIlSA34= - - secure: Zq+hvOlL1RmTtMfAtO3bxqYnB7X6MY199cVCKo2J/EbsMvOHII1JvEU1+s2/UG9tgoiXkd7N2OfFOivlbQ75BDIwtvkq32KZNrUEC6vRGhbMBc8JCKkdFB/XHh1mNhQcn6Js656PhZIj2WteZYMSGYDUj7KcBBMacRZQKWuB0OU= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -dist: trusty diff --git a/dashboard-ui/bower_components/iron-behaviors/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-behaviors/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-behaviors/bower.json b/dashboard-ui/bower_components/iron-behaviors/bower.json deleted file mode 100644 index fd877fe3f..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/bower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "iron-behaviors", - "version": "1.0.17", - "description": "Provides a set of behaviors for the iron elements", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-behaviors.git" - }, - "main": [ - "iron-button-state.html", - "iron-control-state.html" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "dependencies": { - "polymer": "Polymer/polymer#^1.2.0", - "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "paper-input": "polymerelements/paper-input#^1.0.0", - "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-behaviors/demo/index.html b/dashboard-ui/bower_components/iron-behaviors/demo/index.html deleted file mode 100644 index 51fe2d648..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/demo/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - simple-button - - - - - - - - - -
-

Normal

- - Hello World - -

Toggles

- - Hello World - -

Disabled

- - Hello World -
- - diff --git a/dashboard-ui/bower_components/iron-behaviors/demo/simple-button.html b/dashboard-ui/bower_components/iron-behaviors/demo/simple-button.html deleted file mode 100644 index bfa6a2b35..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/demo/simple-button.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/index.html b/dashboard-ui/bower_components/iron-behaviors/index.html deleted file mode 100644 index 220deb003..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Iron Behaviors - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/iron-button-state.html b/dashboard-ui/bower_components/iron-behaviors/iron-button-state.html deleted file mode 100644 index 8114e2dde..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/iron-button-state.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/iron-control-state.html b/dashboard-ui/bower_components/iron-behaviors/iron-control-state.html deleted file mode 100644 index f34d05799..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/iron-control-state.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/test/active-state.html b/dashboard-ui/bower_components/iron-behaviors/test/active-state.html deleted file mode 100644 index 8735aafba..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/test/active-state.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - active-state - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/test/disabled-state.html b/dashboard-ui/bower_components/iron-behaviors/test/disabled-state.html deleted file mode 100644 index b342cfd17..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/test/disabled-state.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - disabled-state - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/test/focused-state.html b/dashboard-ui/bower_components/iron-behaviors/test/focused-state.html deleted file mode 100644 index 3b75c704e..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/test/focused-state.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - focused-state - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/test/index.html b/dashboard-ui/bower_components/iron-behaviors/test/index.html deleted file mode 100644 index 39e7f5445..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/test/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-behaviors/test/test-elements.html b/dashboard-ui/bower_components/iron-behaviors/test/test-elements.html deleted file mode 100644 index 92f6da884..000000000 --- a/dashboard-ui/bower_components/iron-behaviors/test/test-elements.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/.bower.json b/dashboard-ui/bower_components/iron-checked-element-behavior/.bower.json deleted file mode 100644 index 744525d9d..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/.bower.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "iron-checked-element-behavior", - "version": "1.0.5", - "description": "Implements an element that has a checked attribute and can be added to a form", - "authors": "The Polymer Authors", - "keywords": [ - "web-components", - "polymer", - "iron", - "behavior" - ], - "main": "iron-checked-element-behavior.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior", - "ignore": [], - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0", - "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0", - "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "paper-button": "PolymerElements/paper-button#^1.0.0", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "_release": "1.0.5", - "_resolution": { - "type": "version", - "tag": "v1.0.5", - "commit": "c70add47a9af62d30746587e8a1303fb390787c6" - }, - "_source": "git://github.com/PolymerElements/iron-checked-element-behavior.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-checked-element-behavior" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 2d520b472..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/.gitignore b/dashboard-ui/bower_components/iron-checked-element-behavior/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/.travis.yml b/dashboard-ui/bower_components/iron-checked-element-behavior/.travis.yml deleted file mode 100644 index 1f61d970b..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -env: - global: - - secure: zj5WTkJrZAy1QK0j65jHEsHluT4B/PZl0u3iVEWnyd4CSUbHh3rS5NytZTA8wZ63DYnUcrdbhPeIQI3UKaVBUM2MO/K4MwsC2YTRpifpCLbC+wlRV9WRZNZ9CJ3hu6leshOBWHzZucUWAcKtyQRm66rAU+90ZaJcrBPC/xtgPG1n/Bm2aygr5IA36vJy80Zpwk1+yFmb08eu7jpzNVhcFor+VX0gBW3rxeX0kvzhHGn0bTLxKztNB56Oe+bzx6vU8ACjBcSylouOtPJVIk/iIh7AIDHDcpoZGzmwtVnwAV2mJQtu3V8hQ2kE8eXpDloBGID+AUfTF3YSOVQo34I1yv4T+FlB7uxWrgJo80X5IRXUe15+OoXqraZ25v736RPdTWPjV2b6cWHqdOa45wODkDY0KZ9SrmwZibF3vcfVOG21llW2jF/HC5FvDIiM7gv1ro5jsFbEIwv7ligh0KKa+TOZBphL4sEtMrpxR/zXLqBLXUbKL54A+AefHelxjDIqT3oKQylesrGZ58fEF7Fx5xDSYGJwhIEwTLsEQWIWw8sWB34yRtDBIPocqh8nNZ9pJBOdhK3oC5KK44IQnE44YrIzLRRinHzRVoywpUb5OJDxxSSvOwcqmTYbkFmRJMzfJCEj/EtYsEokmSFv8zIRRDetvenBTGouNK/VsU9xQpA= - - secure: Q3xN3fRvTQuy/HKlkYFFnVrFo01r6Q8zgzHHK8yKNKio9T/BM0+iIMYP8mRY+qvCQxCboXuUawG6gsxxT2Zn/p7SgNZ+UHq7DcLmocqxmECdGfqra6Hy9Y7BZVYPWlWIADkNUjI0RfOz69/3o/TAFlt4Cnw3BX3ip0o0Rri5/jzj0Nn+xSF+onyMnpH2gQvUE77MHvCuWTPki3R86Bz8RRzbTwKYwVa0oVca7jzdPtOjqzsnz8k9X0HVwQEpHGjqgTP3lg8EotON0rac/ayWs3J3bk9ye5AfvdTCYcZnDcz8POAN6FeC2Xey7oqQO4N8vFagru88mC3AmN67ZYqwI0fmDEYre20lnXFAFBFzsiu4FvKMgFYi/C5tG5ngSR5XcXwLskax82Un7yYYRzVbyhFSxxWZCqIC4cJ5d+E0Wex4eEYDwAlZ9AFP/hRJ2qrBVUbzXeGVMkHlg4qtdUIzHRkMUmjvEWVzTvk0Xa2wD+S0mYPcBwQcscoZy9zqdJM4hfbG9IGi02/DyrTOL3IuNH8WHHvGWS4ajDhSRkGCV4I5VtGKQ/Y3RA/pU6AaI7tVcDhbxOyIPKuOXO6PWuZOiJhhPQ/kceMkUXeh0TmsDtSBpe5OKCnjsdSn02lTT5yYf4nlVIVczP9p6zBerXorzZk1/S3CRBtqYZPgRrefbCw= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -dist: trusty diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-checked-element-behavior/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/bower.json b/dashboard-ui/bower_components/iron-checked-element-behavior/bower.json deleted file mode 100644 index f645217cc..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/bower.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "iron-checked-element-behavior", - "version": "1.0.5", - "description": "Implements an element that has a checked attribute and can be added to a form", - "authors": "The Polymer Authors", - "keywords": [ - "web-components", - "polymer", - "iron", - "behavior" - ], - "main": "iron-checked-element-behavior.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior", - "ignore": [], - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0", - "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0", - "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "paper-button": "PolymerElements/paper-button#^1.0.0", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - } -} diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/demo/index.html b/dashboard-ui/bower_components/iron-checked-element-behavior/demo/index.html deleted file mode 100644 index 788a64f00..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/demo/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - iron-checked-element-behavior demo - - - - - - -
-
-

Not required

-
- -
-
-
-

Required

-
- -
-
-
- - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html b/dashboard-ui/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html deleted file mode 100644 index 24c5c1255..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/index.html b/dashboard-ui/bower_components/iron-checked-element-behavior/index.html deleted file mode 100644 index 1975dc5a7..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - iron-checked-element-behavior - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html b/dashboard-ui/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html deleted file mode 100644 index 3ed2ffea8..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/test/basic.html b/dashboard-ui/bower_components/iron-checked-element-behavior/test/basic.html deleted file mode 100644 index 4c13dd8cd..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/test/basic.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - iron-checked-element-behavior basic tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/test/index.html b/dashboard-ui/bower_components/iron-checked-element-behavior/test/index.html deleted file mode 100644 index 1ddeca33a..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/test/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - iron-checked-element-behavior tests - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-checked-element-behavior/test/simple-checkbox.html b/dashboard-ui/bower_components/iron-checked-element-behavior/test/simple-checkbox.html deleted file mode 100644 index 95228faec..000000000 --- a/dashboard-ui/bower_components/iron-checked-element-behavior/test/simple-checkbox.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/.bower.json b/dashboard-ui/bower_components/iron-demo-helpers/.bower.json deleted file mode 100644 index 516645ea8..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/.bower.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "iron-demo-helpers", - "version": "1.2.5", - "description": "Utility classes to make building demo pages easier", - "authors": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "demo" - ], - "main": [ - "demo-snippet.html", - "url-bar.html" - ], - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-demo-helpers.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-demo-helpers", - "ignore": [], - "dependencies": { - "polymer": "Polymer/polymer#^1.5.0", - "iron-icons": "PolymerElements/iron-icons#^1.0.0", - "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "marked-element": "polymerelements/marked-element#^1.0.0", - "prism-element": "PolymerElements/prism-element#^1.1.0", - "iron-location": "PolymerElements/iron-location#^0.8.0", - "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0" - }, - "devDependencies": { - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.1.2", - "paper-styles": "PolymerElements/paper-styles#^1.1.0", - "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0" - }, - "_release": "1.2.5", - "_resolution": { - "type": "version", - "tag": "v1.2.5", - "commit": "a376e52de29be389fa22e175b64c9813163023fb" - }, - "_source": "git://github.com/polymerelements/iron-demo-helpers.git", - "_target": "^1.0.0", - "_originalSource": "polymerelements/iron-demo-helpers" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-demo-helpers/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-demo-helpers/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index ff99a8f7b..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-demo-helpers/.gitignore b/dashboard-ui/bower_components/iron-demo-helpers/.gitignore deleted file mode 100644 index fbe05fc93..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components/ diff --git a/dashboard-ui/bower_components/iron-demo-helpers/.travis.yml b/dashboard-ui/bower_components/iron-demo-helpers/.travis.yml deleted file mode 100644 index a69ac094b..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -env: - global: - - secure: i2lTz7D+1ZUYIqZoBtTaXXEUChnfihtpMDr7N6JBlCLBrj90GodBGYkJOJbn1GakBYRwpCvjsXI0DAhfSUQ+yEtLURnVW2KyuCFrAJ6/4h2QSPDJriJ+iG3/nexoDO3bxV010jms6b9/Fl8eeDWkVc2tjmOpBsa8T5+blot4xPVU3aKlB+gcXcLaYZFc6dBeXEBfSqK0bJ4601fRrX01ec25ljjZdgFnol405fThJlnr6GcFtQWNmtiMu0hqTk/AUFp3yL7IVFb0MfjrEBNZ47EL3BiYb4x1W4lDgCpooSoEYib5GDHw0N0NOaFcSoHqgQrDq1OxPH9qxEKkgFkGMhLa7dJ6Tt3GnJK1K+MS4yt//oAsMbPjwVCW4fZahzlIanQLhdFh7/UBRgnRlJ+lUzpcnVGIe2YNdL8wtMsJXApiOVFFEhKJ81dHwetvPmVz8SqF6B/uD9UuW04J34oxMrmV3g32x27rMpzSJQaU4h0jV0aYQcWLYhqDFSUWKXYTFdTBrnjKbuFxPa9VMs/kEmY8ckz3rcYet3eMlxRuL06qUr5Y0TC/kL7zM02L78YdRLqIeIDFPdqraVS7Kv8AoFBaYIm5MQ9dpsZomRP1h0DXXgcubnflLZCxawDn4dYfgZ27r1M0AXyZwiPP6+Lcel5DTyc8vwv7NO4QzIoaBvs= - - secure: ODJASItc4zdTFFUAMyq2yfNszcjelFGYb8T4gwJyZe/Q5jWFfv3imBbZ/8UBVjaHh8pPANtb8iKBT70k1jl63uIeAlzNyCvE2ppqrfc2cuf9DL964i7ZY9kfC1cYni7UqdDnRgCir1mV2/Q0p3aGGw0/eksJtEjzVc4wPYN9+RjKljgRZzKq+Jbw8jM7NAS7BtRjTGPPTw+iDXvgabgQr7Sf7+bXECOXt9HqjLMxBdbR+DyvERZGpbj7Ish6CFKWOoULtnRPC+E9Subd1DQl0CEntPBlPWchxNoGxWPK2JURrNbup8dkwVDW433cm4ubuMnQpiQ0ityyzWF2fMPLOHPv6DLZl5RQPSz20oj9D9DOMV0nQTDegBTDazgGDpWei0Q3HH6EUj1nLdZag8EHWcbPzmIqseZ6cWP/C5Yps7BypEX5cWwJnKTe1BPXP/4Okeq/yZBIR+j5OdBo8q+G33qJBhMzLWdS2Pr3EYEujaCxU3VeZzFCCmdpZ7hwd68zWhJdILYWo4VCvkos61gwsUP3fizoBmFSW8copuRJbsFJ7Iq0gmM34pQsNKlOwgyN+uLHHEJ93ugFfmxpXdgbLO4Jo0NypITLO9bLICvMaSrpdG1kGwoIFH96XeWGZpYWN/9mtN9xct5hp6acPF4eeb2rwwSGH1rrFVqivnMLIN0= -dist: trusty diff --git a/dashboard-ui/bower_components/iron-demo-helpers/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-demo-helpers/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-demo-helpers/bower.json b/dashboard-ui/bower_components/iron-demo-helpers/bower.json deleted file mode 100644 index 6016cdfcf..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/bower.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "iron-demo-helpers", - "version": "1.2.5", - "description": "Utility classes to make building demo pages easier", - "authors": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "demo" - ], - "main": [ - "demo-snippet.html", - "url-bar.html" - ], - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-demo-helpers.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-demo-helpers", - "ignore": [], - "dependencies": { - "polymer": "Polymer/polymer#^1.5.0", - "iron-icons": "PolymerElements/iron-icons#^1.0.0", - "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "marked-element": "polymerelements/marked-element#^1.0.0", - "prism-element": "PolymerElements/prism-element#^1.1.0", - "iron-location": "PolymerElements/iron-location#^0.8.0", - "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0" - }, - "devDependencies": { - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.1.2", - "paper-styles": "PolymerElements/paper-styles#^1.1.0", - "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0" - } -} diff --git a/dashboard-ui/bower_components/iron-demo-helpers/demo-pages-shared-styles.html b/dashboard-ui/bower_components/iron-demo-helpers/demo-pages-shared-styles.html deleted file mode 100644 index ad935a4bc..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/demo-pages-shared-styles.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/demo-snippet.html b/dashboard-ui/bower_components/iron-demo-helpers/demo-snippet.html deleted file mode 100644 index b0317f4ce..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/demo-snippet.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/demo/index.html b/dashboard-ui/bower_components/iron-demo-helpers/demo/index.html deleted file mode 100644 index 4de83d3d2..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/demo/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - demo-snippet demo - - - - - - - - - - - - - - - -
-

Demo of a native element

- - - - -

Demo of a custom element

- - - - -

Demo of an element with custom styles

- - - - -

Demo of an element with bindings

- - - -
- - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/demo/url-bar.html b/dashboard-ui/bower_components/iron-demo-helpers/demo/url-bar.html deleted file mode 100644 index 58de5fd37..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/demo/url-bar.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - url-bar demo - - - - - - - - - - - - - - -
- - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/index.html b/dashboard-ui/bower_components/iron-demo-helpers/index.html deleted file mode 100644 index 74ffffd62..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - iron-demo-helpers - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/test/basic.html b/dashboard-ui/bower_components/iron-demo-helpers/test/basic.html deleted file mode 100644 index b434441ab..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/test/basic.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - demo-snippet tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/test/index.html b/dashboard-ui/bower_components/iron-demo-helpers/test/index.html deleted file mode 100644 index 5d46712cd..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/test/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - demo-snippet tests - - - - - - diff --git a/dashboard-ui/bower_components/iron-demo-helpers/url-bar.html b/dashboard-ui/bower_components/iron-demo-helpers/url-bar.html deleted file mode 100644 index 13f65680c..000000000 --- a/dashboard-ui/bower_components/iron-demo-helpers/url-bar.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/.bower.json b/dashboard-ui/bower_components/iron-flex-layout/.bower.json deleted file mode 100644 index c6c5c62b6..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/.bower.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "iron-flex-layout", - "version": "1.3.1", - "description": "Provide flexbox-based layouts", - "keywords": [ - "web-components", - "polymer", - "layout" - ], - "main": "iron-flex-layout.html", - "private": true, - "license": "http://polymer.github.io/LICENSE.txt", - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-flex-layout.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-flex-layout", - "_release": "1.3.1", - "_resolution": { - "type": "version", - "tag": "v1.3.1", - "commit": "6d88f29f3a7181daa2a5c7f678de44f0a0e6a717" - }, - "_source": "git://github.com/PolymerElements/iron-flex-layout.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-flex-layout" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-flex-layout/.gitignore b/dashboard-ui/bower_components/iron-flex-layout/.gitignore deleted file mode 100644 index 1eb1fa5e9..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bower_components - diff --git a/dashboard-ui/bower_components/iron-flex-layout/.travis.yml b/dashboard-ui/bower_components/iron-flex-layout/.travis.yml deleted file mode 100644 index 516b453f8..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: node_js -sudo: false -before_script: - - npm install -g bower polylint web-component-tester - - bower install - - polylint -env: - global: - - secure: jFaXkmco40NlJT4VyFYM34Zv9D1XVfLXgixobnyHQyJDBKSXrNLcwDuvrGUpJx/pwBCxEhKAbvxeJ+PBMUv8QV08MAdw2S6QOsIe3CUxAehoNoOMJw5duhE8faWlz8qzmCWEowHVFUeVsd0ZUsgOu6RTspj2A51D/CztQuW0Ljw= - - secure: fKrO5yMx8kZM1WQ3k0bzo6MCREKGW2WkCl2suDjuEtb1SQ/SaZa9Tun0fcqIHVJqg9+jOS1Romt/+MN27Nc6IT1tv/NdLd+uWjtMA+OzLyv48gzcdu8Ls/TISUGm5Wb7XHkcvMAb1tRoBs5BOvQ/85FilZLEq1km8snG9ZsOOWI= - - CXX=g++-4.8 -node_js: stable -addons: - firefox: latest - apt: - sources: - - google-chrome - - ubuntu-toolchain-r-test - packages: - - google-chrome-stable - - g++-4.8 - sauce_connect: true -script: - - xvfb-run wct - - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/dashboard-ui/bower_components/iron-flex-layout/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-flex-layout/CONTRIBUTING.md deleted file mode 100644 index f147978a3..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-flex-layout/bower.json b/dashboard-ui/bower_components/iron-flex-layout/bower.json deleted file mode 100644 index e17529733..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/bower.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "iron-flex-layout", - "version": "1.3.1", - "description": "Provide flexbox-based layouts", - "keywords": [ - "web-components", - "polymer", - "layout" - ], - "main": "iron-flex-layout.html", - "private": true, - "license": "http://polymer.github.io/LICENSE.txt", - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-flex-layout.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-flex-layout/classes/iron-flex-layout.html b/dashboard-ui/bower_components/iron-flex-layout/classes/iron-flex-layout.html deleted file mode 100644 index 0c6aad604..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/classes/iron-flex-layout.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html b/dashboard-ui/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html deleted file mode 100644 index 196df284c..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/demo/index.html b/dashboard-ui/bower_components/iron-flex-layout/demo/index.html deleted file mode 100644 index 2c3f5f7d2..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/demo/index.html +++ /dev/null @@ -1,396 +0,0 @@ - - - - - - - iron-flex-layout demo - - - - - - - - - - - - - - -
-

Horizontal and vertical layout

- - - - -

Flexible children

- - - - -

Flexible children in vertical layouts

- - - - -

Flex ratios

- - - - -

Cross-axis stretch alignment (default)

- - - - -

Cross-axis center alignment

- - - - -

Cross-axis start alignment

- - - - -

Cross-axis end alignment

- - - - -

Justification, start justified

- - - - -

Justification, start justified

- - - - -

Justification, end justified

- - - - -

Justification, equal space between elements

- - - - -

Justification, equal space around each element

- - - - -

Self alignment

- - - - -

Wrapping

- - - - -

Reversed layouts

- - - - -

General purpose rules

- - - -
- - diff --git a/dashboard-ui/bower_components/iron-flex-layout/index.html b/dashboard-ui/bower_components/iron-flex-layout/index.html deleted file mode 100644 index 7d3b0881f..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - iron-flex-layout - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout-classes.html b/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout-classes.html deleted file mode 100644 index d382652b7..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout-classes.html +++ /dev/null @@ -1,431 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout.html b/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout.html deleted file mode 100644 index d98e9d0fd..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/iron-flex-layout.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/test/index.html b/dashboard-ui/bower_components/iron-flex-layout/test/index.html deleted file mode 100644 index 90e12a78c..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/test/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - iron-flex-behavior tests - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html b/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html deleted file mode 100644 index 3173b308a..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - iron-flex-layout-classes tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout.html b/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout.html deleted file mode 100644 index f2090878e..000000000 --- a/dashboard-ui/bower_components/iron-flex-layout/test/iron-flex-layout.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - iron-flex-layout tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/.bower.json b/dashboard-ui/bower_components/iron-form-element-behavior/.bower.json deleted file mode 100644 index e09f62a16..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/.bower.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "iron-form-element-behavior", - "version": "1.0.6", - "license": "http://polymer.github.io/LICENSE.txt", - "private": true, - "main": "iron-form-element-behavior.html", - "authors": [ - "The Polymer Authors" - ], - "description": "Enables a custom element to be included in an iron-form", - "keywords": [ - "web-components", - "polymer", - "form" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-form-element-behavior.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "polymer/web-component-tester#^3.4.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-form-element-behavior", - "_release": "1.0.6", - "_resolution": { - "type": "version", - "tag": "v1.0.6", - "commit": "cf9e09ded62daf3363852ce98260aaad1ed0fae1" - }, - "_source": "git://github.com/PolymerElements/iron-form-element-behavior.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-form-element-behavior" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/.gitignore b/dashboard-ui/bower_components/iron-form-element-behavior/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/.travis.yml b/dashboard-ui/bower_components/iron-form-element-behavior/.travis.yml deleted file mode 100644 index 6d4a6216a..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: node_js -sudo: false -before_script: - - npm install web-component-tester - - npm install bower - - 'export PATH=$PWD/node_modules/.bin:$PATH' - - bower install -env: - global: - - secure: EN5HtbAeaCE1IzGk5JlSq7GWcANh/zYgbpZn1y0VocfkZfzOv8cIh8Zmr4Q6shII6K07Fyx1LQuAjsURqX9mc3AmfMHgPIbpZGpOKrjvt1Vf0bPN+uIC9vIFj3sLQj12gcfJg48EXk6HWsHscCZ3+am1xvRflhNEY3TjHPrUTgkF+KLbBEfb4mCZwVc4dln76ffvTQ/cPI9eYczNp1q9wWpYvn794qRLtAkKuQ5Z1b6hunOAx/hzCjGNbJDO3gkxO68dzzSp9YDIhKEFAUlMDalwLRr7sNgB4sNeDCg4mmie5fe6xk831HvBYFxZxmXD1uS6/Hvd8MiBDiols3lwz8uEUnPyrwDlxUkjn2sl5S+gO8CcHU2mShUCl73JfBtyWDKPSfQLR5QHEk4eqNzNn2HinAE/aezi4/TVCY7P3ujeK8sFlTsb9vlywnlJO3fqyZ+lBwZ4CbNjOTs1L2W+guT1Oq30PJ5TVxU2mvmIMtdpPveZB0iM/PM9FECsb303KeV5Zomk4dp2MxirK1O/4mPAHIz9UUpGopGOtpuODnRV4Lq7V9HaDxYOZzAHZDK4mJ1y6tSRH/yMUTEidhG2j5F6MXmhbKXj3I0oR95xx1RH+b8myErvUBlto4jR21Pd+mOVlkU78CBSN9XGhtBQjklF5+aC8YeH1DEv6mTn2o8= - - secure: q3AjjaoaTZcdAdjIvzSf8Q1SdEg1mY6lBkeoDTMKJcftJ8zz1qIfjGzEuycSVVnOJhZ6WmvMMBxdThQCymF1wzT++SV+u34DYSFoZ5EhjM0TFhP63PRuhbE3DquPaISpM5aCH7epV4nMFD7PFE1BP4u/qiETAgPeAoY9LMT/JPclOfcQ3euwks3TSM6O8g7Ro1h1ElywCQ1souzkcjvJ3FxsqysJb7Mg/n9bmtwnkol/mrBaP6JzQMURUyswx7ZPj3qiFoA9ZLiNirzf+O781A4msKursjYrKr6TZtB6xcMlEg89YhFBXrLE9IEEM/fNp+vPNhaIA5VjYRy8iIK402RXpbh7/AlPD7yMFITeMSfT+Bqldur+pi0oN1N9SeWrmk6P+bdfdkdyGl1CVKP4S35z8cyFRgmvxO4/UG65cb66AdMeNVBEQsi2flCWgPyaTmOQ53YryCs7cFRu3zSMnU3F/gWqlmletgxGhFOBHTtEmr2A9QBLgg+EvB/83wj2dEEfMlIpoeq83/2PaE8hKAWyqPga7t532vU5AIFNOUk9vGzRCxsqGKF2j0/zFBdgHSLYCsWVrbjxmxdu6Fzi8ZATeqjDoc0eaIPhBkekOvDrUtUSHA9sSSG8j69GGUL4+WkoCMB74dz+GXz85fMJlMZWBXPtazDlNXYfU60T/1E= -node_js: 4 -addons: - firefox: latest - apt: - sources: - - google-chrome - packages: - - google-chrome-stable -script: - - xvfb-run wct - - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-form-element-behavior/CONTRIBUTING.md deleted file mode 100644 index 7b1014156..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/CONTRIBUTING.md +++ /dev/null @@ -1,72 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/bower.json b/dashboard-ui/bower_components/iron-form-element-behavior/bower.json deleted file mode 100644 index 865f9b549..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/bower.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "iron-form-element-behavior", - "version": "1.0.6", - "license": "http://polymer.github.io/LICENSE.txt", - "private": true, - "main": "iron-form-element-behavior.html", - "authors": [ - "The Polymer Authors" - ], - "description": "Enables a custom element to be included in an iron-form", - "keywords": [ - "web-components", - "polymer", - "form" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-form-element-behavior.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "paper-styles": "PolymerElements/paper-styles#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "polymer/web-component-tester#^3.4.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/demo/index.html b/dashboard-ui/bower_components/iron-form-element-behavior/demo/index.html deleted file mode 100644 index e919d0bcc..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/demo/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - iron-form-element-behavior demo - - - - - - - - - - - - - - -
-
- - Element with iron-form-element-behavior -
- Element without iron-form-element-behavior -
- Element with iron-form-element-behavior - - -

Elements tracked by the form:

- -
    -
-
-
- - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-element.html b/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-element.html deleted file mode 100644 index 450276923..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-element.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-form.html b/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-form.html deleted file mode 100644 index 4dc5dc6bb..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/demo/simple-form.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/index.html b/dashboard-ui/bower_components/iron-form-element-behavior/index.html deleted file mode 100644 index 8d748c050..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - iron-form-element-behavior - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/iron-form-element-behavior.html b/dashboard-ui/bower_components/iron-form-element-behavior/iron-form-element-behavior.html deleted file mode 100644 index cd9c6b4ab..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/iron-form-element-behavior.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/test/basic.html b/dashboard-ui/bower_components/iron-form-element-behavior/test/basic.html deleted file mode 100644 index 5947a1e46..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/test/basic.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - iron-form-element-behavior - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/test/index.html b/dashboard-ui/bower_components/iron-form-element-behavior/test/index.html deleted file mode 100644 index 3b2badac6..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/test/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-element.html b/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-element.html deleted file mode 100644 index b1aa30021..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-element.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-form.html b/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-form.html deleted file mode 100644 index 7fa38d880..000000000 --- a/dashboard-ui/bower_components/iron-form-element-behavior/test/simple-form.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - diff --git a/dashboard-ui/bower_components/iron-icon/.bower.json b/dashboard-ui/bower_components/iron-icon/.bower.json deleted file mode 100644 index 87e3dad5d..000000000 --- a/dashboard-ui/bower_components/iron-icon/.bower.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "iron-icon", - "private": true, - "version": "1.0.10", - "license": "http://polymer.github.io/LICENSE.txt", - "description": "An element that supports displaying an icon", - "main": "iron-icon.html", - "author": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-icon.git" - }, - "ignore": [], - "dependencies": { - "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0", - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", - "iron-iconset": "polymerelements/iron-iconset#^1.0.0", - "iron-icons": "polymerelements/iron-icons#^1.0.0", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "homepage": "https://github.com/polymerelements/iron-icon", - "_release": "1.0.10", - "_resolution": { - "type": "version", - "tag": "v1.0.10", - "commit": "f4e146da4982ff96bb25db85290c09e8de4ec734" - }, - "_source": "git://github.com/polymerelements/iron-icon.git", - "_target": "^1.0.0", - "_originalSource": "polymerelements/iron-icon" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 61da83fb2..000000000 --- a/dashboard-ui/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-icon/.gitignore b/dashboard-ui/bower_components/iron-icon/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-icon/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-icon/.travis.yml b/dashboard-ui/bower_components/iron-icon/.travis.yml deleted file mode 100644 index 2db9ed51d..000000000 --- a/dashboard-ui/bower_components/iron-icon/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -env: - global: - - secure: TTp7q3OKEpaFqnqbYczhMd8iXTa1Ya0jOQVq1OhljpJogLWb78qvHLHgnxgMWkw+/KDyE5KHW1CXhYUQa7C9QF2Zn7uoN27+7+4q7HuK3pTuUtqdfstLVuLHQrfK6VqUT4XjSpeMzNX/HxuD3EMBH0bMBR4CIr76sLJOuIL/XF8= - - secure: damHvQXygRYIJG/8Vmqh7U4zxoi5224JIZiZVQL6I5z//s5zqHq6AqwDyfOoc0zWndJCwE8NvOzKD/lmVYXIsPcY95kkZS45Dbye0krYWUzKnv42rDi/7olXcg647iAEDVhW3BRHmA+opzQtKUpAkXl97DtPVkszLL1ReyNyv3A= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -dist: trusty diff --git a/dashboard-ui/bower_components/iron-icon/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-icon/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-icon/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-icon/bower.json b/dashboard-ui/bower_components/iron-icon/bower.json deleted file mode 100644 index d19a7481a..000000000 --- a/dashboard-ui/bower_components/iron-icon/bower.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "iron-icon", - "private": true, - "version": "1.0.10", - "license": "http://polymer.github.io/LICENSE.txt", - "description": "An element that supports displaying an icon", - "main": "iron-icon.html", - "author": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-icon.git" - }, - "ignore": [], - "dependencies": { - "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0", - "polymer": "Polymer/polymer#^1.1.0" - }, - "devDependencies": { - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", - "iron-iconset": "polymerelements/iron-iconset#^1.0.0", - "iron-icons": "polymerelements/iron-icons#^1.0.0", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - } -} diff --git a/dashboard-ui/bower_components/iron-icon/demo/async.html b/dashboard-ui/bower_components/iron-icon/demo/async.html deleted file mode 100644 index eaf40d1ba..000000000 --- a/dashboard-ui/bower_components/iron-icon/demo/async.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - iron-icon demo - - - - - - - -
-

- This demo is for an <iron-icon> with an asynchronously loaded - iconset. -

- -
Waiting to load iconset...
- -
- - - -

<iron-icon icon="example:location">

- - -
-
- - - diff --git a/dashboard-ui/bower_components/iron-icon/demo/index.html b/dashboard-ui/bower_components/iron-icon/demo/index.html deleted file mode 100644 index 999ed35b4..000000000 --- a/dashboard-ui/bower_components/iron-icon/demo/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - iron-icon demo - - - - - - - - -
-

This demo is for a single <iron-icon>. If you're looking for the - whole set of available icons, check out the <iron-icons> demo.

- -
- - - -

<iron-icon icon="example:location">

- - - -

<iron-icon src="location.png">

- -
-
- - diff --git a/dashboard-ui/bower_components/iron-icon/demo/location.png b/dashboard-ui/bower_components/iron-icon/demo/location.png deleted file mode 100644 index 9bb74236b..000000000 Binary files a/dashboard-ui/bower_components/iron-icon/demo/location.png and /dev/null differ diff --git a/dashboard-ui/bower_components/iron-icon/hero.svg b/dashboard-ui/bower_components/iron-icon/hero.svg deleted file mode 100644 index f0f58536e..000000000 --- a/dashboard-ui/bower_components/iron-icon/hero.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icon/index.html b/dashboard-ui/bower_components/iron-icon/index.html deleted file mode 100644 index 487bb5c38..000000000 --- a/dashboard-ui/bower_components/iron-icon/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icon/iron-icon.html b/dashboard-ui/bower_components/iron-icon/iron-icon.html deleted file mode 100644 index b0afa5856..000000000 --- a/dashboard-ui/bower_components/iron-icon/iron-icon.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icon/test/index.html b/dashboard-ui/bower_components/iron-icon/test/index.html deleted file mode 100644 index 4414532e8..000000000 --- a/dashboard-ui/bower_components/iron-icon/test/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - Tests - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icon/test/iron-icon.html b/dashboard-ui/bower_components/iron-icon/test/iron-icon.html deleted file mode 100644 index 3a51dd391..000000000 --- a/dashboard-ui/bower_components/iron-icon/test/iron-icon.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - iron-icon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/.bower.json b/dashboard-ui/bower_components/iron-icons/.bower.json deleted file mode 100644 index be52e7bfd..000000000 --- a/dashboard-ui/bower_components/iron-icons/.bower.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "iron-icons", - "version": "1.1.3", - "description": "A set of icons for use with iron-icon", - "authors": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "main": "iron-icons.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-icons" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/paper-icons", - "dependencies": { - "iron-icon": "polymerelements/iron-icon#^1.0.0", - "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "iron-component-page": "polymerelements/iron-component-page#1.0.0", - "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [ - "util", - "update-icons.sh" - ], - "_release": "1.1.3", - "_resolution": { - "type": "version", - "tag": "v1.1.3", - "commit": "c13869b57a9464dfc3a1f26e89858f8be37e7441" - }, - "_source": "git://github.com/PolymerElements/iron-icons.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-icons" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-icons/.gitignore b/dashboard-ui/bower_components/iron-icons/.gitignore deleted file mode 100644 index bb1944ea1..000000000 --- a/dashboard-ui/bower_components/iron-icons/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -util/node_modules -material-design-icons -bower_components diff --git a/dashboard-ui/bower_components/iron-icons/.travis.yml b/dashboard-ui/bower_components/iron-icons/.travis.yml deleted file mode 100644 index 57e6cef9c..000000000 --- a/dashboard-ui/bower_components/iron-icons/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: node_js -sudo: false -before_script: - - npm install -g bower polylint web-component-tester - - bower install - - polylint -env: - global: - - secure: itlu3qIX/3ggZQIuzTJc62A5MD2Rdms+zB1EvNEWFiQZQgNGu2+hhp72PcVB/urybOTFmMeq4W12RGr53KMvwj6mwNlXPhQxeP1oyR+icZZVbuLDfj5pF8OvNf4OXEkGv0yH+OTuNTB8CU4msJzgB2W8iuC+pFH/dIas6fQDTfE= - - secure: LBT0VumsEPWUYm0OLhqHU1XWmVY18QP64cMeqZAwASnYYyH/R5OGYAcI7aH8To29FWpkZSL85NPto37bN+f8DWRSULq4p+1wl2HviYHsam8x1NzN7hKq6nv+203qaT9SflheaNy6sSDfZJQ+36bRcGQ5khKkVeDpw7h8D/osSQ4= - - CXX=g++-4.8 -node_js: stable -addons: - firefox: latest - apt: - sources: - - google-chrome - - ubuntu-toolchain-r-test - packages: - - google-chrome-stable - - g++-4.8 - sauce_connect: true -script: - - xvfb-run wct - - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/dashboard-ui/bower_components/iron-icons/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-icons/CONTRIBUTING.md deleted file mode 100644 index 7b1014156..000000000 --- a/dashboard-ui/bower_components/iron-icons/CONTRIBUTING.md +++ /dev/null @@ -1,72 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-icons/av-icons.html b/dashboard-ui/bower_components/iron-icons/av-icons.html deleted file mode 100644 index e4a0d245b..000000000 --- a/dashboard-ui/bower_components/iron-icons/av-icons.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/bower.json b/dashboard-ui/bower_components/iron-icons/bower.json deleted file mode 100644 index c5066e9fb..000000000 --- a/dashboard-ui/bower_components/iron-icons/bower.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "iron-icons", - "version": "1.1.3", - "description": "A set of icons for use with iron-icon", - "authors": [ - "The Polymer Authors" - ], - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "main": "iron-icons.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-icons" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/paper-icons", - "dependencies": { - "iron-icon": "polymerelements/iron-icon#^1.0.0", - "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "iron-component-page": "polymerelements/iron-component-page#1.0.0", - "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "^4.0.0" - }, - "ignore": [ - "util", - "update-icons.sh" - ] -} diff --git a/dashboard-ui/bower_components/iron-icons/communication-icons.html b/dashboard-ui/bower_components/iron-icons/communication-icons.html deleted file mode 100644 index b522e6db6..000000000 --- a/dashboard-ui/bower_components/iron-icons/communication-icons.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/demo/index.html b/dashboard-ui/bower_components/iron-icons/demo/index.html deleted file mode 100644 index acfbf36cc..000000000 --- a/dashboard-ui/bower_components/iron-icons/demo/index.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - iron-icons demo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/device-icons.html b/dashboard-ui/bower_components/iron-icons/device-icons.html deleted file mode 100644 index 03809ee51..000000000 --- a/dashboard-ui/bower_components/iron-icons/device-icons.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/editor-icons.html b/dashboard-ui/bower_components/iron-icons/editor-icons.html deleted file mode 100644 index cb6ea04ae..000000000 --- a/dashboard-ui/bower_components/iron-icons/editor-icons.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/hardware-icons.html b/dashboard-ui/bower_components/iron-icons/hardware-icons.html deleted file mode 100644 index ddaddbdae..000000000 --- a/dashboard-ui/bower_components/iron-icons/hardware-icons.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/hero.svg b/dashboard-ui/bower_components/iron-icons/hero.svg deleted file mode 100644 index 167321c94..000000000 --- a/dashboard-ui/bower_components/iron-icons/hero.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/image-icons.html b/dashboard-ui/bower_components/iron-icons/image-icons.html deleted file mode 100644 index 96dee0697..000000000 --- a/dashboard-ui/bower_components/iron-icons/image-icons.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/index.html b/dashboard-ui/bower_components/iron-icons/index.html deleted file mode 100644 index cea02f96d..000000000 --- a/dashboard-ui/bower_components/iron-icons/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/iron-icons.html b/dashboard-ui/bower_components/iron-icons/iron-icons.html deleted file mode 100644 index c219575b3..000000000 --- a/dashboard-ui/bower_components/iron-icons/iron-icons.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/maps-icons.html b/dashboard-ui/bower_components/iron-icons/maps-icons.html deleted file mode 100644 index 059ae91d4..000000000 --- a/dashboard-ui/bower_components/iron-icons/maps-icons.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/notification-icons.html b/dashboard-ui/bower_components/iron-icons/notification-icons.html deleted file mode 100644 index ac6744a20..000000000 --- a/dashboard-ui/bower_components/iron-icons/notification-icons.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/places-icons.html b/dashboard-ui/bower_components/iron-icons/places-icons.html deleted file mode 100644 index 5084b8c54..000000000 --- a/dashboard-ui/bower_components/iron-icons/places-icons.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-icons/social-icons.html b/dashboard-ui/bower_components/iron-icons/social-icons.html deleted file mode 100644 index 8848395ef..000000000 --- a/dashboard-ui/bower_components/iron-icons/social-icons.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/.bower.json b/dashboard-ui/bower_components/iron-iconset-svg/.bower.json deleted file mode 100644 index b142eb226..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/.bower.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "iron-iconset-svg", - "description": "Manages a set of svg icons", - "version": "1.0.9", - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-iconset-svg.git" - }, - "dependencies": { - "polymer": "polymer/polymer#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-icon": "polymerelements/iron-icon#^1.0.0", - "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "*" - }, - "main": "iron-iconset-svg.html", - "homepage": "https://github.com/polymerelements/iron-iconset-svg", - "_release": "1.0.9", - "_resolution": { - "type": "version", - "tag": "v1.0.9", - "commit": "ce9b2ea1f73d936cffdd05f3fe34b1f69d1d32db" - }, - "_source": "git://github.com/polymerelements/iron-iconset-svg.git", - "_target": "^1.0.0", - "_originalSource": "polymerelements/iron-iconset-svg" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-iconset-svg/.gitignore b/dashboard-ui/bower_components/iron-iconset-svg/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-iconset-svg/.travis.yml b/dashboard-ui/bower_components/iron-iconset-svg/.travis.yml deleted file mode 100644 index d4e78c40f..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -language: node_js -sudo: false -matrix: - include: - - node_js: stable - script: xvfb-run wct - addons: - firefox: latest - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - - node_js: node - script: - - | - if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then - wct -s 'default' - fi -before_script: -- npm install web-component-tester -- npm install bower -- export PATH=$PWD/node_modules/.bin:$PATH -- bower install -env: - global: - - secure: UR1rxThVZH+l6fFHhAlgNIWs9wHmC5A102oAQBtCuQqKiXPZCDAPQHdjufX8z6hH93JkR+Esh2VPv0baSXFrHteKTRN6bsNDTMFDdHJ5BiRAdhVoV6bsdNH2GTgRXQ+ACMgrh4sXLA5+2Z+JGq7m0zaHehDfNZqmo/1U59qImP8= - - secure: PmWDypBdjKlUGPn9UoBEkjoYiyJFQGe2QiACmdOgueOLSLeA6xW+/1521uFIBHpwuWn29mxVYv5gS1D8hafWhZdXn4OYQl550RrT092jXIO6+mMKZXPmUaKCkPMY6QYJJ5j9ZOC36KgF//IpoE7OCxpLReYOD2KBR3mhw0jOYJA= diff --git a/dashboard-ui/bower_components/iron-iconset-svg/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-iconset-svg/CONTRIBUTING.md deleted file mode 100644 index 7b1014156..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/CONTRIBUTING.md +++ /dev/null @@ -1,72 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-iconset-svg/bower.json b/dashboard-ui/bower_components/iron-iconset-svg/bower.json deleted file mode 100644 index 8467a3b7e..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/bower.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "iron-iconset-svg", - "description": "Manages a set of svg icons", - "version": "1.0.9", - "keywords": [ - "web-components", - "polymer", - "icon" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-iconset-svg.git" - }, - "dependencies": { - "polymer": "polymer/polymer#^1.0.0", - "iron-meta": "polymerelements/iron-meta#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.2", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "iron-icon": "polymerelements/iron-icon#^1.0.0", - "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", - "web-component-tester": "*" - }, - "main": "iron-iconset-svg.html" -} diff --git a/dashboard-ui/bower_components/iron-iconset-svg/demo/index.html b/dashboard-ui/bower_components/iron-iconset-svg/demo/index.html deleted file mode 100644 index 53b291aa3..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/demo/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - iron-iconset-svg - - - - - - - - - -
- - - - -
- - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/demo/svg-sample-icons.html b/dashboard-ui/bower_components/iron-iconset-svg/demo/svg-sample-icons.html deleted file mode 100644 index 3eed843f0..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/demo/svg-sample-icons.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/index.html b/dashboard-ui/bower_components/iron-iconset-svg/index.html deleted file mode 100644 index e871f17d9..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/iron-iconset-svg.html b/dashboard-ui/bower_components/iron-iconset-svg/iron-iconset-svg.html deleted file mode 100644 index 5bd143ad6..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/iron-iconset-svg.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/test/index.html b/dashboard-ui/bower_components/iron-iconset-svg/test/index.html deleted file mode 100644 index db4a3f620..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/test/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - Tests - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-iconset-svg/test/iron-iconset-svg.html b/dashboard-ui/bower_components/iron-iconset-svg/test/iron-iconset-svg.html deleted file mode 100644 index aa7bae9ff..000000000 --- a/dashboard-ui/bower_components/iron-iconset-svg/test/iron-iconset-svg.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - iron-iconset-svg - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/.bower.json b/dashboard-ui/bower_components/iron-meta/.bower.json deleted file mode 100644 index db341575e..000000000 --- a/dashboard-ui/bower_components/iron-meta/.bower.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "iron-meta", - "version": "1.1.2", - "keywords": [ - "web-components", - "polymer" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "description": "Useful for sharing information across a DOM tree", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-meta.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.4", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "main": "iron-meta.html", - "ignore": [], - "homepage": "https://github.com/PolymerElements/iron-meta", - "_release": "1.1.2", - "_resolution": { - "type": "version", - "tag": "v1.1.2", - "commit": "bae96531b63ea6d4ce982f5592248aea849c0f5a" - }, - "_source": "git://github.com/PolymerElements/iron-meta.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-meta" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 2e8171139..000000000 --- a/dashboard-ui/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-meta/.gitignore b/dashboard-ui/bower_components/iron-meta/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-meta/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-meta/.travis.yml b/dashboard-ui/bower_components/iron-meta/.travis.yml deleted file mode 100644 index 39e072eaa..000000000 --- a/dashboard-ui/bower_components/iron-meta/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: -- npm install -g bower polylint web-component-tester -- bower install -- polylint -env: - global: - - secure: mjikUCoN+UpTbFHwbGXUoKp4vtZ2qNN1JYW79WcOik7fCFmvdFzfYQPDa6y9aJvU3kgkDndGdR/ynLG4kejZjmqTS5fYtdHEwpPVPapbVYnquJvCJKbMN4S2QpGCoq51pjKQ8U3Ys6G5HkmdcDfw3SKk1uMgVzKV7fEI+6WnZ/M= - - secure: LHDnBtwK7yO2X4GNmIaAl7t85WWc1U189OiPqemD27+jTcKml0by1n9Mu/yrg94jYgeXab9mHgU3uMtIdQstNNwTDu8CgmmIP4H2EWopHrTi3KM7Z7aeofPgMJsVFXwg+WhNlcCfhEsygHZWTxjJXM4fcGOrFPDa4+BTgRa2hEE= -node_js: stable -addons: - firefox: '46.0' - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: -- xvfb-run wct -- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi -dist: trusty diff --git a/dashboard-ui/bower_components/iron-meta/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-meta/CONTRIBUTING.md deleted file mode 100644 index 093090d43..000000000 --- a/dashboard-ui/bower_components/iron-meta/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-meta/bower.json b/dashboard-ui/bower_components/iron-meta/bower.json deleted file mode 100644 index d457e06e4..000000000 --- a/dashboard-ui/bower_components/iron-meta/bower.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "iron-meta", - "version": "1.1.2", - "keywords": [ - "web-components", - "polymer" - ], - "license": "http://polymer.github.io/LICENSE.txt", - "description": "Useful for sharing information across a DOM tree", - "private": true, - "authors": [ - "The Polymer Authors" - ], - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-meta.git" - }, - "dependencies": { - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "polymerelements/paper-styles#^1.0.4", - "iron-component-page": "polymerelements/iron-component-page#^1.0.0", - "test-fixture": "polymerelements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "main": "iron-meta.html", - "ignore": [] -} diff --git a/dashboard-ui/bower_components/iron-meta/demo/index.html b/dashboard-ui/bower_components/iron-meta/demo/index.html deleted file mode 100644 index 0fc39e30e..000000000 --- a/dashboard-ui/bower_components/iron-meta/demo/index.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - iron-meta - - - - - - - -
-

<iron-meta>

-

Key Query

- - - - The value stored at key="info" is . -
- -
-

Type Query

- - - - - - - The value(s) stored at type="type1" are:
.

The value(s) stored at type="type2" are:
. -
- - - - - diff --git a/dashboard-ui/bower_components/iron-meta/hero.svg b/dashboard-ui/bower_components/iron-meta/hero.svg deleted file mode 100644 index ea8548dce..000000000 --- a/dashboard-ui/bower_components/iron-meta/hero.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/index.html b/dashboard-ui/bower_components/iron-meta/index.html deleted file mode 100644 index dce836232..000000000 --- a/dashboard-ui/bower_components/iron-meta/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - iron-meta - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/iron-meta.html b/dashboard-ui/bower_components/iron-meta/iron-meta.html deleted file mode 100644 index 73d66ccc6..000000000 --- a/dashboard-ui/bower_components/iron-meta/iron-meta.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/test/basic.html b/dashboard-ui/bower_components/iron-meta/test/basic.html deleted file mode 100644 index c561dc3ca..000000000 --- a/dashboard-ui/bower_components/iron-meta/test/basic.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - iron-meta-basic - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/test/index.html b/dashboard-ui/bower_components/iron-meta/test/index.html deleted file mode 100644 index 2fb0d690e..000000000 --- a/dashboard-ui/bower_components/iron-meta/test/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - Tests - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-meta/test/iron-meta.html b/dashboard-ui/bower_components/iron-meta/test/iron-meta.html deleted file mode 100644 index c4dc2500d..000000000 --- a/dashboard-ui/bower_components/iron-meta/test/iron-meta.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - iron-meta - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/.bower.json b/dashboard-ui/bower_components/iron-validatable-behavior/.bower.json deleted file mode 100644 index 9b49957bf..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/.bower.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "iron-validatable-behavior", - "version": "1.1.1", - "description": "Provides a behavior for an element that validates user input", - "authors": "The Polymer Authors", - "keywords": [ - "web-components", - "polymer", - "iron", - "behavior" - ], - "main": "iron-validatable-behavior.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-validatable-behavior.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-validatable-behavior", - "ignore": [], - "dependencies": { - "iron-meta": "PolymerElements/iron-meta#^1.0.0", - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.4", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - }, - "_release": "1.1.1", - "_resolution": { - "type": "version", - "tag": "v1.1.1", - "commit": "2ecd3f411e298733b29f1660f75cb9b03ea31d77" - }, - "_source": "git://github.com/PolymerElements/iron-validatable-behavior.git", - "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-validatable-behavior" -} \ No newline at end of file diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md b/dashboard-ui/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index a69a2fdc2..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ - -### Description - - -### Expected outcome - - - -### Actual outcome - - - -### Live Demo - - -### Steps to reproduce - - - -### Browsers Affected - -- [ ] Chrome -- [ ] Firefox -- [ ] Safari 9 -- [ ] Safari 8 -- [ ] Safari 7 -- [ ] Edge -- [ ] IE 11 -- [ ] IE 10 diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/.gitignore b/dashboard-ui/bower_components/iron-validatable-behavior/.gitignore deleted file mode 100644 index 8d4ae2536..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bower_components diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/.travis.yml b/dashboard-ui/bower_components/iron-validatable-behavior/.travis.yml deleted file mode 100644 index e4dd52cd4..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -sudo: required -before_script: - - npm install -g bower polylint web-component-tester - - bower install - - polylint -env: - global: - - secure: AsXK1s4viLG4eumYMxE0bJasVbWrpQ7JaUboMoK4Nzhmunx01udikRRAJifl3nkcc4m2GpzCb4Kmtyh5hxyLA05uE416VzmfDq3dGJKsNAQXbSescSVik63llq4HXAdOvek2eSo5wOVGNHslscIed5K2bJajXfPMIODJyBxo8aE= - - secure: V/H/0+/R8owujbwe3IDbND8v5zs4pWTe0hRCLefjgR9ci2lmNNP54Zb97nOZnLQqynafDSyrngL3+RP5F0fk1dC++cpuxQNKoYPwDFPZ41LAxp5dgtyxkb+J4eWtq0UilWF5thVt4oB1OWwPGtxMmSl+imXXKtq4a4Ov++t2Apo= -node_js: stable -addons: - firefox: latest - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - sauce_connect: true -script: - - xvfb-run wct - - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" -dist: trusty diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/CONTRIBUTING.md b/dashboard-ui/bower_components/iron-validatable-behavior/CONTRIBUTING.md deleted file mode 100644 index f147978a3..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, fixes #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/bower.json b/dashboard-ui/bower_components/iron-validatable-behavior/bower.json deleted file mode 100644 index 2ebf2bcb7..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/bower.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "iron-validatable-behavior", - "version": "1.1.1", - "description": "Provides a behavior for an element that validates user input", - "authors": "The Polymer Authors", - "keywords": [ - "web-components", - "polymer", - "iron", - "behavior" - ], - "main": "iron-validatable-behavior.html", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/PolymerElements/iron-validatable-behavior.git" - }, - "license": "http://polymer.github.io/LICENSE.txt", - "homepage": "https://github.com/PolymerElements/iron-validatable-behavior", - "ignore": [], - "dependencies": { - "iron-meta": "PolymerElements/iron-meta#^1.0.0", - "polymer": "Polymer/polymer#^1.0.0" - }, - "devDependencies": { - "paper-styles": "PolymerElements/paper-styles#^1.0.4", - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", - "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", - "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "^4.0.0", - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - } -} diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/demo/cats-only.html b/dashboard-ui/bower_components/iron-validatable-behavior/demo/cats-only.html deleted file mode 100644 index 83ef9ba61..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/demo/cats-only.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/demo/index.html b/dashboard-ui/bower_components/iron-validatable-behavior/demo/index.html deleted file mode 100644 index 84b96a8dc..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/demo/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - iron-validatable-behavior demo - - - - - - - - - - - -
-

<iron-validatable-behavior>

- - - -
- - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/demo/validatable-input.html b/dashboard-ui/bower_components/iron-validatable-behavior/demo/validatable-input.html deleted file mode 100644 index 19cf47759..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/demo/validatable-input.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/index.html b/dashboard-ui/bower_components/iron-validatable-behavior/index.html deleted file mode 100644 index cfaa5b175..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - iron-validatable-behavior - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/iron-validatable-behavior.html b/dashboard-ui/bower_components/iron-validatable-behavior/iron-validatable-behavior.html deleted file mode 100644 index 803731be9..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/iron-validatable-behavior.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/test/cats-only.html b/dashboard-ui/bower_components/iron-validatable-behavior/test/cats-only.html deleted file mode 100644 index f16699364..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/test/cats-only.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/test/dogs-only.html b/dashboard-ui/bower_components/iron-validatable-behavior/test/dogs-only.html deleted file mode 100644 index 1b462a418..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/test/dogs-only.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/test/index.html b/dashboard-ui/bower_components/iron-validatable-behavior/test/index.html deleted file mode 100644 index 605c95ad7..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/test/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - iron-validatable-behavior tests - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html b/dashboard-ui/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html deleted file mode 100644 index a8040ef47..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - iron-validatable-behavior tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/iron-validatable-behavior/test/test-validatable.html b/dashboard-ui/bower_components/iron-validatable-behavior/test/test-validatable.html deleted file mode 100644 index c4af269de..000000000 --- a/dashboard-ui/bower_components/iron-validatable-behavior/test/test-validatable.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - diff --git a/dashboard-ui/bower_components/jquery/.bower.json b/dashboard-ui/bower_components/jquery/.bower.json index 7fe7ed9b9..f4c253663 100644 --- a/dashboard-ui/bower_components/jquery/.bower.json +++ b/dashboard-ui/bower_components/jquery/.bower.json @@ -12,12 +12,12 @@ "library" ], "homepage": "https://github.com/jquery/jquery-dist", - "version": "3.1.0", - "_release": "3.1.0", + "version": "3.1.1", + "_release": "3.1.1", "_resolution": { "type": "version", - "tag": "3.1.0", - "commit": "6f02bc382c0529d3b4f68f6b2ad21876642dbbfe" + "tag": "3.1.1", + "commit": "1b30f3ad466ebf2714d47eda34dbd7fdf6849fe3" }, "_source": "https://github.com/jquery/jquery-dist.git", "_target": ">=1.9.1", diff --git a/dashboard-ui/bower_components/jquery/AUTHORS.txt b/dashboard-ui/bower_components/jquery/AUTHORS.txt index 0e22886ad..334363dea 100644 --- a/dashboard-ui/bower_components/jquery/AUTHORS.txt +++ b/dashboard-ui/bower_components/jquery/AUTHORS.txt @@ -77,7 +77,7 @@ Jared Grippe Sylvester Keil Brandon Sterne Mathias Bynens -Timmy Willison +Timmy Willison <4timmywil@gmail.com> Corey Frang Digitalxero Anton Kovalyov diff --git a/dashboard-ui/bower_components/jquery/dist/core.js b/dashboard-ui/bower_components/jquery/dist/core.js index c93c2d92f..4c8a4ab44 100644 --- a/dashboard-ui/bower_components/jquery/dist/core.js +++ b/dashboard-ui/bower_components/jquery/dist/core.js @@ -1,5 +1,5 @@ /* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global +// Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module define( [ @@ -24,7 +24,7 @@ define( [ "use strict"; var - version = "3.1.0", + version = "3.1.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -64,13 +64,14 @@ jQuery.fn = jQuery.prototype = { // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { - return num != null ? - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } - // Return all the elements in a clean array - slice.call( this ); + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack diff --git a/dashboard-ui/bower_components/jquery/dist/jquery.js b/dashboard-ui/bower_components/jquery/dist/jquery.js index f2fc27478..072e30811 100644 --- a/dashboard-ui/bower_components/jquery/dist/jquery.js +++ b/dashboard-ui/bower_components/jquery/dist/jquery.js @@ -1,6 +1,5 @@ -/*eslint-disable no-unused-vars*/ /*! - * jQuery JavaScript Library v3.1.0 + * jQuery JavaScript Library v3.1.1 * https://jquery.com/ * * Includes Sizzle.js @@ -10,7 +9,7 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2016-07-07T21:44Z + * Date: 2016-09-22T22:30Z */ ( function( global, factory ) { @@ -83,13 +82,13 @@ var support = {}; doc.head.appendChild( script ).parentNode.removeChild( script ); } /* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global +// Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var - version = "3.1.0", + version = "3.1.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -129,13 +128,14 @@ jQuery.fn = jQuery.prototype = { // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { - return num != null ? - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } - // Return all the elements in a clean array - slice.call( this ); + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack @@ -543,14 +543,14 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.0 + * Sizzle CSS Selector Engine v2.3.3 * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2016-01-04 + * Date: 2016-08-08 */ (function( window ) { @@ -696,7 +696,7 @@ var i, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { @@ -723,7 +723,7 @@ var i, disabledAncestor = addCombinator( function( elem ) { - return elem.disabled === true; + return elem.disabled === true && ("form" in elem || "label" in elem); }, { dir: "parentNode", next: "legend" } ); @@ -1009,26 +1009,54 @@ function createButtonPseudo( type ) { * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { - // Known :disabled false positives: - // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) - // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { - // Check form elements and option elements for explicit disabling - return "label" in elem && elem.disabled === disabled || - "form" in elem && elem.disabled === disabled || + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { - // Check non-disabled form elements for fieldset[disabled] ancestors - "form" in elem && elem.disabled === false && ( - // Support: IE6-11+ - // Ancestry is covered for us - elem.isDisabled === disabled || + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { - // Otherwise, assume any non-

- +

${CinemaModeConfigurationHelp2}

diff --git a/dashboard-ui/components/accessschedule/accessschedule.js b/dashboard-ui/components/accessschedule/accessschedule.js new file mode 100644 index 000000000..d6545acea --- /dev/null +++ b/dashboard-ui/components/accessschedule/accessschedule.js @@ -0,0 +1,113 @@ +define(['dialogHelper', 'datetime', 'emby-select', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, datetime) { + + function getDisplayTime(hours) { + + var minutes = 0; + + var pct = hours % 1; + + if (pct) { + minutes = parseInt(pct * 60); + } + + return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); + } + + function populateHours(context) { + + var html = ''; + + for (var i = 0; i < 24; i++) { + + html += ''; + } + + html += ''; + + context.querySelector('#selectStart').innerHTML = html; + context.querySelector('#selectEnd').innerHTML = html; + } + + 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; + } + + function submitSchedule(context, options) { + + var updatedSchedule = { + DayOfWeek: context.querySelector('#selectDay').value, + StartHour: context.querySelector('#selectStart').value, + EndHour: context.querySelector('#selectEnd').value + }; + + if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { + + alert(Globalize.translate('ErrorMessageStartHourGreaterThanEnd')); + + return; + } + + context.submitted = true; + options.schedule = Object.assign(options.schedule, updatedSchedule); + dialogHelper.close(context); + } + + return { + show: function (options) { + return new Promise(function (resolve, reject) { + + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'components/accessschedule/accessschedule.template.html', true); + + xhr.onload = function (e) { + + var template = this.response; + var dlg = dialogHelper.createDialog({ + removeOnClose: true, + size: 'small' + }); + + dlg.classList.add('formDialog'); + + var html = ''; + + html += Globalize.translateDocument(template); + + dlg.innerHTML = html; + + populateHours(dlg); + loadSchedule(dlg, options.schedule); + + dialogHelper.open(dlg); + + dlg.addEventListener('close', function () { + + if (dlg.submitted) { + 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(); + }); + } + }; +}); \ No newline at end of file diff --git a/dashboard-ui/components/accessschedule/accessschedule.template.html b/dashboard-ui/components/accessschedule/accessschedule.template.html new file mode 100644 index 000000000..a388acbf1 --- /dev/null +++ b/dashboard-ui/components/accessschedule/accessschedule.template.html @@ -0,0 +1,39 @@ +
+ +

+ ${HeaderAccessSchedule} +

+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/dashboard-ui/components/appfooter/appfooter.css b/dashboard-ui/components/appfooter/appfooter.css index aade7cd87..86a542f5f 100644 --- a/dashboard-ui/components/appfooter/appfooter.css +++ b/dashboard-ui/components/appfooter/appfooter.css @@ -6,10 +6,15 @@ z-index: 1; bottom: 0; transition: transform 180ms linear; - contain: layout style; } - .appfooter.headroom--unpinned { - transform: translateY(100%); - } +.appfooter-blurred { + background: rgba(28,28,28,.92); + -webkit-backdrop-filter: blur(5px); + backdrop-filter: blur(5px); +} + +.appfooter.headroom--unpinned { + transform: translateY(100%); +} diff --git a/dashboard-ui/components/appfooter/appfooter.js b/dashboard-ui/components/appfooter/appfooter.js index a3be8707f..fd3fa49e8 100644 --- a/dashboard-ui/components/appfooter/appfooter.js +++ b/dashboard-ui/components/appfooter/appfooter.js @@ -1,4 +1,4 @@ -define(['css!./appfooter'], function () { +define(['browser', 'css!./appfooter'], function (browser) { function render(options) { @@ -6,6 +6,10 @@ elem.classList.add('appfooter'); + if (browser.safari) { + elem.classList.add('appfooter-blurred'); + } + document.body.appendChild(elem); return elem; diff --git a/dashboard-ui/components/apphost.js b/dashboard-ui/components/apphost.js index bb7027c37..209353656 100644 --- a/dashboard-ui/components/apphost.js +++ b/dashboard-ui/components/apphost.js @@ -147,6 +147,11 @@ define(['appStorage', 'browser'], function (appStorage, browser) { if (supportsFullscreen()) { features.push('fullscreen'); } + + if (browser.chrome || (browser.safari && !browser.mobile)) { + features.push('imageanalysis'); + } + return features; }(); @@ -155,6 +160,7 @@ define(['appStorage', 'browser'], function (appStorage, browser) { var version = window.dashboardVersion || '3.0'; return { + dvrFeatureCode: Dashboard.isConnectMode() ? 'dvr' : 'dvrl', getWindowState: function () { return document.windowState || 'Normal'; }, @@ -205,7 +211,7 @@ define(['appStorage', 'browser'], function (appStorage, browser) { }); }, capabilities: getCapabilities, - + preferVisualCards: browser.android || browser.chrome, moreIcon: browser.safari || browser.edge ? 'dots-horiz' : 'dots-vert' }; }); \ No newline at end of file diff --git a/dashboard-ui/components/channelmapper/channelmapper.js b/dashboard-ui/components/channelmapper/channelmapper.js index 2a6ab5e43..da3c83b8a 100644 --- a/dashboard-ui/components/channelmapper/channelmapper.js +++ b/dashboard-ui/components/channelmapper/channelmapper.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'paper-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], +define(['dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], function (dialogHelper, loading, connectionManager, globalize, actionsheet) { return function (options) { diff --git a/dashboard-ui/components/chromecasthelpers.js b/dashboard-ui/components/chromecasthelpers.js index 513bfd14c..fd3a53074 100644 --- a/dashboard-ui/components/chromecasthelpers.js +++ b/dashboard-ui/components/chromecasthelpers.js @@ -264,18 +264,12 @@ var serverAddress = apiClient.serverAddress(); if (isValidIpAddress(serverAddress) && !isLocalIpAddress(serverAddress)) { - return new Promise(function (resolve, reject) { - - resolve(serverAddress); - }); + return Promise.resolve(serverAddress); } var cachedValue = getCachedValue(serverAddress); if (cachedValue) { - return new Promise(function (resolve, reject) { - - resolve(cachedValue); - }); + return Promise.resolve(cachedValue); } return apiClient.getJSON(apiClient.getUrl('System/Endpoint')).then(function (endpoint) { diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.css b/dashboard-ui/components/directorybrowser/directorybrowser.css index 7822a3bf9..a985a800d 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.css +++ b/dashboard-ui/components/directorybrowser/directorybrowser.css @@ -12,5 +12,5 @@ background: #fff3a5; padding: 1em; border-radius: 5px; - margin-top: 2em; + margin-bottom: 1.5em; } \ No newline at end of file diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.js b/dashboard-ui/components/directorybrowser/directorybrowser.js index 5d70e2fa9..0bbe9502d 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.js +++ b/dashboard-ui/components/directorybrowser/directorybrowser.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'jQuery', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle'], function (dialogHelper, dom) { var systemInfo; function getSystemInfo() { @@ -29,12 +29,6 @@ } Dashboard.showLoadingMsg(); - if (path) { - $('.networkHeadline').hide(); - } else { - $('.networkHeadline').show(); - } - var promises = []; if (path === "Network") { @@ -53,7 +47,7 @@ var folders = responses[0]; var parentPath = responses[1] || ''; - $('#txtDirectoryPickerPath', page).val(path || ""); + page.querySelector('#txtDirectoryPickerPath').value = path || ""; var html = ''; @@ -75,14 +69,14 @@ html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate('ButtonNetwork')); } - $('.results', page).html(html); + page.querySelector('.results').innerHTML = html; Dashboard.hideLoadingMsg(); }, function () { - $('#txtDirectoryPickerPath', page).val(""); - $('.results', page).html(''); + page.querySelector('#txtDirectoryPickerPath').value = ""; + page.querySelector('.results').innerHTML = ''; Dashboard.hideLoadingMsg(); }); @@ -92,7 +86,7 @@ var html = ''; html += '
'; - html += '
'; + html += '
'; html += '
'; html += name; html += '
'; @@ -108,44 +102,63 @@ var html = ''; html += '
'; - html += '
'; + html += '
'; - var instruction = options.instruction ? options.instruction + '

' : ''; + if (!options.pathReadOnly) { + var instruction = options.instruction ? options.instruction + '

' : ''; - html += '

'; - html += instruction; - html += Globalize.translate('MessageDirectoryPickerInstruction') - .replace('{0}', '\\\\server') - .replace('{1}', '\\\\192.168.1.101'); + html += '

'; + html += instruction; + html += Globalize.translate('MessageDirectoryPickerInstruction') + .replace('{0}', '\\\\server') + .replace('{1}', '\\\\192.168.1.101'); - if (systemInfo.OperatingSystem.toLowerCase() == 'bsd') { + if (systemInfo.OperatingSystem.toLowerCase() == 'bsd') { - html += '
'; - html += '
'; - html += Globalize.translate('MessageDirectoryPickerBSDInstruction'); - html += '
'; - html += '' + Globalize.translate('ButtonMoreInformation') + ''; + html += '
'; + html += '
'; + html += Globalize.translate('MessageDirectoryPickerBSDInstruction'); + html += '
'; + html += '' + Globalize.translate('ButtonMoreInformation') + ''; + } + else if (systemInfo.OperatingSystem.toLowerCase() == 'linux') { + + html += '
'; + html += '
'; + html += Globalize.translate('MessageDirectoryPickerLinuxInstruction'); + html += '
'; + } + + html += '
'; } - else if (systemInfo.OperatingSystem.toLowerCase() == 'linux') { - - html += '
'; - html += '
'; - html += Globalize.translate('MessageDirectoryPickerLinuxInstruction'); - html += '
'; - } - - html += '

'; html += '
'; html += '
'; html += '
'; - html += ''; - html += '
'; - html += ''; + var labelKey = options.includeFiles !== true ? 'LabelFolder' : 'LabelPath'; + var readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; + html += ''; html += '
'; - html += '
'; + if (!readOnlyAttribute) { + html += ''; + } + + html += '
'; + + if (!readOnlyAttribute) { + html += '
'; + } + + if (options.enableNetworkSharePath) { + html += '
'; + html += ''; + html += '
'; + html += Globalize.translate('LabelOptionalNetworkPathHelp'); + html += '
'; + html += '
'; + } html += '
'; html += ''; @@ -162,32 +175,49 @@ function initEditor(content, options, fileOptions) { - $(content).on("click", ".lnkPath", function () { + content.addEventListener("click", function (e) { - var path = this.getAttribute('data-path'); + var lnkPath = dom.parentWithClass(e.target, 'lnkPath'); + if (lnkPath) { + var path = lnkPath.getAttribute('data-path'); - if ($(this).hasClass('lnkFile')) { - $('#txtDirectoryPickerPath', content).val(path); - } else { - refreshDirectoryBrowser(content, path, fileOptions); + if (lnkPath.classList.contains('lnkFile')) { + content.querySelector('#txtDirectoryPickerPath').value = path; + } else { + refreshDirectoryBrowser(content, path, fileOptions); + } } - }).on("click", ".btnRefreshDirectories", function () { - - var path = $('#txtDirectoryPickerPath', content).val(); - - refreshDirectoryBrowser(content, path, fileOptions); - - }).on("change", "#txtDirectoryPickerPath", function () { - - refreshDirectoryBrowser(content, this.value, fileOptions); }); - $('form', content).on('submit', function () { + content.addEventListener("click", function (e) { + + var btnRefreshDirectories = dom.parentWithClass(e.target, 'btnRefreshDirectories'); + if (btnRefreshDirectories) { + var path = content.querySelector('#txtDirectoryPickerPath').value; + + refreshDirectoryBrowser(content, path, fileOptions); + } + }); + + content.addEventListener("change", function (e) { + + var txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); + if (txtDirectoryPickerPath && txtDirectoryPickerPath.id == 'txtDirectoryPickerPath') { + refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); + } + }); + + content.querySelector('form').addEventListener('submit', function (e) { if (options.callback) { - options.callback(this.querySelector('#txtDirectoryPickerPath').value); + + var networkSharePath = this.querySelector('#txtNetworkPath'); + networkSharePath = networkSharePath ? networkSharePath.value : null; + options.callback(this.querySelector('#txtDirectoryPickerPath').value, networkSharePath); } + e.preventDefault(); + e.stopPropagation(); return false; }); } @@ -259,15 +289,11 @@ initEditor(dlg, options, fileOptions); - // Has to be assigned a z-index after the call to .open() - $(dlg).on('iron-overlay-opened', function () { - this.querySelector('#txtDirectoryPickerPath input').focus(); - }); - $(dlg).on('close', onDialogClosed); + dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - $('.btnCloseDialog', dlg).on('click', function () { + dlg.querySelector('.btnCloseDialog').addEventListener('click', function () { dialogHelper.close(dlg); }); @@ -276,7 +302,15 @@ var txtCurrentPath = dlg.querySelector('#txtDirectoryPickerPath'); txtCurrentPath.value = initialPath; - refreshDirectoryBrowser(dlg, txtCurrentPath.value); + + var txtNetworkPath = dlg.querySelector('#txtNetworkPath'); + if (txtNetworkPath) { + txtNetworkPath.value = options.networkSharePath || ''; + } + + if (!options.pathReadOnly) { + refreshDirectoryBrowser(dlg, txtCurrentPath.value); + } }); }; diff --git a/dashboard-ui/components/dockedtabs/dockedtabs.js b/dashboard-ui/components/dockedtabs/dockedtabs.js index 1d36803f9..424cacdc5 100644 --- a/dashboard-ui/components/dockedtabs/dockedtabs.js +++ b/dashboard-ui/components/dockedtabs/dockedtabs.js @@ -39,6 +39,9 @@ case 'manageserver': Dashboard.navigate('dashboard.html'); break; + case 'remotecontrol': + Dashboard.navigate('nowplaying.html'); + break; case 'sync': Dashboard.navigate('mysync.html'); break; @@ -115,6 +118,11 @@ }); } + commands.push({ + name: globalize.translate('ButtonRemoteControl'), + id: 'remotecontrol' + }); + if (Dashboard.isConnectMode()) { commands.push({ name: globalize.translate('HeaderSelectServer'), diff --git a/dashboard-ui/components/favoriteitems.js b/dashboard-ui/components/favoriteitems.js index 7541bb83a..a5f41c36d 100644 --- a/dashboard-ui/components/favoriteitems.js +++ b/dashboard-ui/components/favoriteitems.js @@ -1,4 +1,4 @@ -define(['libraryBrowser', 'cardBuilder', 'dom', 'scrollStyles', 'emby-itemscontainer'], function (libraryBrowser, cardBuilder, dom) { +define(['libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'scrollStyles', 'emby-itemscontainer'], function (libraryBrowser, cardBuilder, dom, appHost) { function enableScrollX() { return browserInfo.mobile && AppInfo.enableAppLayouts; @@ -21,7 +21,7 @@ return [ { name: 'HeaderFavoriteMovies', types: "Movie", id: "favoriteMovies", shape: getPosterShape(), showTitle: false, overlayPlayButton: true }, { name: 'HeaderFavoriteShows', types: "Series", id: "favoriteShows", shape: getPosterShape(), showTitle: false, overlayPlayButton: true }, - { name: 'HeaderFavoriteEpisodes', types: "Episode", id: "favoriteEpisode", shape: getThumbShape(), preferThumb: false, showTitle: true, showParentTitle: true, overlayPlayButton: true }, + { name: 'HeaderFavoriteEpisodes', types: "Episode", id: "favoriteEpisode", shape: getThumbShape(), preferThumb: false, showTitle: true, showParentTitle: true, overlayPlayButton: true, overlayText: false, centerText: true }, { name: 'HeaderFavoriteGames', types: "Game", id: "favoriteGames", shape: getSquareShape(), preferThumb: false, showTitle: true }, { name: 'HeaderFavoriteArtists', types: "MusicArtist", id: "favoriteArtists", shape: getSquareShape(), preferThumb: false, showTitle: true, overlayText: false, showParentTitle: true, centerText: true, overlayPlayButton: true }, { name: 'HeaderFavoriteAlbums', types: "MusicAlbum", id: "favoriteAlbums", shape: getSquareShape(), preferThumb: false, showTitle: true, overlayText: false, showParentTitle: true, centerText: true, overlayPlayButton: true }, @@ -88,10 +88,13 @@ html += '
'; } + var supportsImageAnalysis = appHost.supports('imageanalysis'); + var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.showTitle; + html += cardBuilder.getCardsHtml(result.Items, { preferThumb: section.preferThumb, shape: section.shape, - centerText: section.centerText, + centerText: section.centerText && !cardLayout, overlayText: section.overlayText !== false, showTitle: section.showTitle, showParentTitle: section.showParentTitle, @@ -99,7 +102,9 @@ overlayPlayButton: section.overlayPlayButton, overlayMoreButton: section.overlayMoreButton, action: section.action, - allowBottomPadding: !enableScrollX() + allowBottomPadding: !enableScrollX(), + cardLayout: cardLayout, + vibrant: supportsImageAnalysis && cardLayout }); html += '
'; diff --git a/dashboard-ui/components/fileorganizer/fileorganizer.js b/dashboard-ui/components/fileorganizer/fileorganizer.js index 5bced1b2f..e4cb28068 100644 --- a/dashboard-ui/components/fileorganizer/fileorganizer.js +++ b/dashboard-ui/components/fileorganizer/fileorganizer.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'paper-checkbox', 'emby-input', 'emby-button', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper) { +define(['dialogHelper', 'emby-checkbox', 'emby-input', 'emby-button', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper) { var extractedName; var extractedYear; diff --git a/dashboard-ui/components/fileorganizer/fileorganizer.template.html b/dashboard-ui/components/fileorganizer/fileorganizer.template.html index f358d0006..29c2d72d4 100644 --- a/dashboard-ui/components/fileorganizer/fileorganizer.template.html +++ b/dashboard-ui/components/fileorganizer/fileorganizer.template.html @@ -32,16 +32,16 @@
- +
${LabelEndingEpisodeNumberHelp}
-
-
- ${OptionRememberOrganizeCorrection} -
+
diff --git a/dashboard-ui/components/guestinviter/connectlink.js b/dashboard-ui/components/guestinviter/connectlink.js index b88c2ac63..2208392fd 100644 --- a/dashboard-ui/components/guestinviter/connectlink.js +++ b/dashboard-ui/components/guestinviter/connectlink.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { function updateUserInfo(user, newConnectUsername, actionCallback, noActionCallback) { var currentConnectUsername = user.ConnectUserName || ''; diff --git a/dashboard-ui/components/guestinviter/guestinviter.js b/dashboard-ui/components/guestinviter/guestinviter.js index e12746667..5456b68a7 100644 --- a/dashboard-ui/components/guestinviter/guestinviter.js +++ b/dashboard-ui/components/guestinviter/guestinviter.js @@ -1,11 +1,9 @@ -define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { function renderLibrarySharingList(context, result) { var folderHtml = ''; - folderHtml += '
'; - folderHtml += result.Items.map(function (i) { var currentHtml = ''; @@ -13,14 +11,11 @@ var isChecked = true; var checkedHtml = isChecked ? ' checked="checked"' : ''; - currentHtml += '' + i.Name + ''; - + currentHtml += ''; return currentHtml; }).join(''); - folderHtml += '
'; - context.querySelector('.librarySharingList').innerHTML = folderHtml; } diff --git a/dashboard-ui/components/guestinviter/guestinviter.template.html b/dashboard-ui/components/guestinviter/guestinviter.template.html index 6048a5cb8..22aa84380 100644 --- a/dashboard-ui/components/guestinviter/guestinviter.template.html +++ b/dashboard-ui/components/guestinviter/guestinviter.template.html @@ -16,13 +16,11 @@
-
-
-
+

${HeaderShareMediaFolders}

+
-
-
+

${MessageGuestSharingPermissionsHelp}


diff --git a/dashboard-ui/components/imagedownloader/imagedownloader.js b/dashboard-ui/components/imagedownloader/imagedownloader.js index 574cf9009..868afe05a 100644 --- a/dashboard-ui/components/imagedownloader/imagedownloader.js +++ b/dashboard-ui/components/imagedownloader/imagedownloader.js @@ -7,14 +7,7 @@ var hasChanges = false; // These images can be large and we're seeing memory problems in safari - var browsableImagePageSize; - - // This can handle more - if (window.IntersectionObserver) { - browsableImagePageSize = 100; - } else { - browsableImagePageSize = browserInfo.slow ? 6 : 30; - } + var browsableImagePageSize = browserInfo.slow ? 6 : 30; var browsableImageStartIndex = 0; var browsableImageType = 'Primary'; diff --git a/dashboard-ui/components/imageuploader/imageuploader.template.html b/dashboard-ui/components/imageuploader/imageuploader.template.html index b23da78e0..a36f163a2 100644 --- a/dashboard-ui/components/imageuploader/imageuploader.template.html +++ b/dashboard-ui/components/imageuploader/imageuploader.template.html @@ -13,7 +13,7 @@
- @@ -28,7 +28,6 @@
diff --git a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js index 0c34e9452..f30f3f1b0 100644 --- a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js +++ b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js @@ -33,10 +33,20 @@ parent.querySelector('.chkArhiveAsMediaContainer').classList.add('hide'); } - if (contentType == 'homevideos') { + if (contentType == 'homevideos' || contentType == 'photos') { parent.querySelector('.chkEnablePhotosContainer').classList.remove('hide'); + parent.querySelector('.chkDownloadImagesInAdvanceContainer').classList.add('hide'); + parent.querySelector('.chkEnableInternetProvidersContainer').classList.add('hide'); } else { parent.querySelector('.chkEnablePhotosContainer').classList.add('hide'); + parent.querySelector('.chkDownloadImagesInAdvanceContainer').classList.remove('hide'); + parent.querySelector('.chkEnableInternetProvidersContainer').classList.remove('hide'); + } + + if (contentType == 'photos') { + parent.querySelector('.chkSaveLocalContainer').classList.add('hide'); + } else { + parent.querySelector('.chkSaveLocalContainer').classList.remove('hide'); } if (contentType == 'tvshows' || contentType == 'movies' || contentType == 'homevideos' || contentType == 'musicvideos' || contentType == 'mixed' || !contentType) { @@ -55,7 +65,10 @@ EnablePhotos: parent.querySelector('.chkEnablePhotos').checked, EnableRealtimeMonitor: parent.querySelector('.chkEnableRealtimeMonitor').checked, ExtractChapterImagesDuringLibraryScan: parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked, - EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked + EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked, + DownloadImagesInAdvance: parent.querySelector('#chkDownloadImagesInAdvance').checked, + EnableInternetProviders: parent.querySelector('#chkEnableInternetProviders').checked, + SaveLocalMetadata: parent.querySelector('#chkSaveLocal').checked }; return options; @@ -68,6 +81,9 @@ parent.querySelector('.chkEnableRealtimeMonitor').checked = options.EnableRealtimeMonitor; parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked = options.ExtractChapterImagesDuringLibraryScan; parent.querySelector('.chkExtractChapterImages').checked = options.EnableChapterImageExtraction; + parent.querySelector('#chkDownloadImagesInAdvance').checked = options.DownloadImagesInAdvance; + parent.querySelector('#chkEnableInternetProviders').checked = options.EnableInternetProviders; + parent.querySelector('#chkSaveLocal').checked = options.SaveLocalMetadata; } return { diff --git a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html index 4de83a358..3f4b9a303 100644 --- a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -1,4 +1,18 @@ 

${HeaderSettings}

+
+ +
${LabelDownloadInternetMetadataHelp}
+
+
+ +
${LabelSaveLocalMetadataHelp}
+
${LabelEnableRealtimeMonitorHelp}
+
+ +
${OptionDownloadImagesInAdvanceHelp}
+
+