diff --git a/dashboard-ui/addplugin.html b/dashboard-ui/addplugin.html index a348b58a1e..ac27238180 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 c7688684eb..4d6eccfbf7 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 0000000000..4fbb40a04b --- /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 0000000000..6cadd51ee5 --- /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 0000000000..8cb3d7abb3 --- /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 0000000000..713a029e4c --- /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 0000000000..231af542c9 --- /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 0000000000..02fbeaf06c --- /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 35807d3a01..35c37d999c 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 39ed006f5f..f356da5789 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 4007c646b6..2b8db0ddec 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 a365f2f569..4ced1f00cb 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 019333abdd..5cc54c97d3 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 06de593f08..93e8bc26c5 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 10c926a16f..5406b102b0 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 90e62e3100..b3c423e93b 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 2965084178..bf00460023 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 9b9975136f..d23a916aa7 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 aebecc3e43..712782b887 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 e31d8b0760..ea050ec29f 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 7897b199e7..b6f3cbd8ab 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 3041ce57be..9a98379bd3 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 d2ab1dd2f9..3149ba5da3 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 a49f3e5db7..fd06b26f59 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 8bbfd86f4b..83090c8d45 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 271638f029..f565e802c7 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 2404dab5c7..5ba87cb3dd 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 8d331b9e4d..06b4a79ccd 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 864c1144ca..9c7725b26a 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 b4e05c5a43..8f4fb0d54d 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 1c9e04b45e..06a6b5a03b 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 9523c94d0b..e2356586b4 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 86e6ffa371..5f1293615d 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 9a340df5d3..921561bbef 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 656cd6da9e..b699d20011 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 f7c80885cf..877a0716e9 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 3a2a82b6ab..fd586ad1d5 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 dbb36b1709..2a8273c8f1 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 ef728db827..6c8275f09b 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 61d81d900e..7fa18c17ad 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 45f09ec7b8..b223babc57 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 e23b24ce72..b5e7ce2e46 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 1dc3ade5ee..d662735c23 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 e655b4d5cf..bc0fe4cf4e 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 ffb93c46ef..0064d772b0 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 b414c68a26..ba5f5a1c2f 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 5ec9a2be18..b70c7c7962 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 d131335827..93eb7e78ea 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 0cfebfb395..bad9223435 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 0e06a9b873..44e2de1f91 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 b2c653806e..a688ab23e7 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 3990769a3e..4b83187312 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 1f2c80f0dd..27ab9d3de2 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 6285b089b5..c10d89acb0 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 f680abf6ff..6e3b6b9bf4 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 266fc90bbe..613d2b8316 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 e8693ebe61..9e7563290c 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 b407a78bbd..1c222c1c9b 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 731cb4ab47..db3e6ff57b 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 1de8deedae..6b6031b606 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 e6785a870d..81733d1335 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 5448152ef0..2b93e1b884 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 0000000000..f13b39c29c --- /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 0000000000..d6d31957b2 --- /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 b777f3a91e..64bd5159a5 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 b2a22fa08d..c7234809d6 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 49ac548919..28cceac866 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 d8790f5821..74e5e47660 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 0000000000..6cdf23599d --- /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 0000000000..37788eabdb --- /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 dedb11041d..b2e9780d25 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 4b8c663eaf..2fd24e7857 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 f45caf1226..d5f388ee0b 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 90f07e80d7..36cddd0499 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 6677cc4e43..b6cac87ffb 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 4b3f17b241..d73cc6f5ba 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 eb4af9bb3c..8a7ba18894 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 0000000000..79ca120dc0 --- /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 bc1ebc769a..0d97fc9cc0 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 51f6aceff8..fdc4c346b7 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 71250246ac..bba4ec1480 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 07c8886e4e..076db957fe 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 9b9aee75cd..d73efd038f 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 a896692f5a..5cc5a9140d 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 069af77642..ba96c2c2b1 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 f5ae69662a..f62cac40c9 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 ba99690a0c..0e038371ae 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 b5888e1266..ec5a8aa768 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 de7e80c2a9..bc47f52e66 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 0bccf16917..4df78e3828 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 f01316b401..5f69d45453 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 7707937c8c..ea2e7a0624 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 6bbfa24eea..27c1baf12b 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 c3d9ec2ef8..6c5c8e0d8d 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 b5c9951d62..f22f9418cf 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 46dab62fb3..9686bdc251 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 41d1f05023..d120f4c54f 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 246734ebda..72daa4ef6c 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 c52bcb3ebe..0438381c30 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 0000000000..0a91a7f8a1 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 81e137b19b..6d5969d97c 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 eaa9716418..11eddcd49a 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 16be87c4cd..48e774d34c 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 e680dbd1c1..7cf9fb0710 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 c12dfbff3c..ce0d6316c8 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 0000000000..45eb855b16 --- /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 0000000000..c45dcc38a7 --- /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 0000000000..60d17a95f0 --- /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 0000000000..15e7fe6450 --- /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 0000000000..464be5c89c --- /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 658f90e99d..18a6a6704d 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 abb38832e9..d3df3261e8 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 882fa46501..3fdc9b7de5 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 0000000000..3c5e29fd01 --- /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 0000000000..a9d69c604c 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 0000000000..a6ec16e060 --- /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 0000000000..a6f4458738 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 0000000000..f03624afd4 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 3f605b157e..8432d5367c 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 0000000000..9d23f80f60 --- /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 dfa18d9b8e..0000000000 --- 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 0adc052065..0000000000 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 910cdcad41..0000000000 --- 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 d3547e18e5..0000000000 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 12cc6b542f..0000000000 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 d105532f61..0000000000 --- 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 92370dd4b5..41f0d204be 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 e66473631e..5d59eb5ccf 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 26435439cd..41a87c51da 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 683e3697c0..a9777a2018 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 717fb9a84b..77caf214fc 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 12fb02f7fc..59c79dc567 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 0bc0354359..63d51a44a9 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 da249940c0..d384a62715 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 63bec2dd75..0096fdcbe0 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 6737e82342..7a18ad7b71 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 ea5797548c..02aed2edb9 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 6fdc107497..a94c10bb22 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 7445d5670b..3329d4bb07 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 1ff687b3a1..c65f53a898 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 49fc16de8d..facf2379ad 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 a06b0cefbd..405ff2ba5e 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 63d2366fcc..48ae401c0f 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 70c4fc0d6c..e4722aa0d2 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 9375285179..18af85e5db 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 334511dafd..748f2f6c11 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 8b2776d8bb..dca2ce0e9c 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 87e1062159..88e07bace5 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 c60ead473e..73482532b0 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 c52c7c31c7..a5ed6fa2ae 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 d2c27d3f49..b5e2a8b87c 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 a06b0cefbd..405ff2ba5e 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 ee99226fe8..e4d8e18e26 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 68463015a3..d2b1b32407 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 d50ef496cf..cbed3c1a9a 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 64d94c7627..c9c0e2ff09 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 dc9a8d2580..5d6945210e 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 aa97d41481..b3ef274e8f 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 0894664c18..e2e09dfd92 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 a06b0cefbd..405ff2ba5e 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 182b6256dd..9347dbe75c 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 5370ba75f3..ccc6bd735f 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 38a3c442aa..9ad8585101 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 664666cb34..a94df08124 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 b6b8e16ce2..a405336526 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 31f4a71147..6a77b89a54 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 2ef7012619..7de0656905 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 f0cea98069..7aa41c9a22 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 b6aedc45b5..dde0a32779 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 12a7eeaa0c..2a9fca002c 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 bf93f7e90c..05e6d8af7f 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 f8fe0bbc5d..f1cd83b9c1 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 d523e1474a..6b3dc90d49 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 9acbb1a0ad..0ddcf0b78c 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 ca3b6ffb76..bfc03eff8c 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 ae7666acb6..c22a6ca9b0 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 168b0f41dd..0000000000 --- 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 bb16d9ac02..318e61be39 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 2edfe2f88f..221aeaa32a 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 0000000000..68745688b3 --- /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 852af9cf5a..3ab22775f9 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 2352a576a7..0000000000 --- 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 594376ff9e..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 146620909d..0000000000 --- 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 093090d435..0000000000 --- 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 c049390d9d..0000000000 --- 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 0dd286acf5..0000000000 --- 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 15c43c0d45..0000000000 --- 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 1f8889a8da..0000000000 --- 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 11a8809ff8..0000000000 --- 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 4307eb38a1..0000000000 --- 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 510bf6f99c..0000000000 --- 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 4df705f344..0000000000 --- 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 7d93604870..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 2658368915..0000000000 --- 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 093090d435..0000000000 --- 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 49e6ee7d0d..0000000000 --- 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 2c3fec7c59..0000000000 --- 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 5914bb9999..0000000000 --- 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 c53ba6cf31..0000000000 --- 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 9e911fe2ac..0000000000 --- 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 d0c2dc35f9..0000000000 --- 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 d00850a0e7..0000000000 --- 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 dac19e56be..0000000000 --- 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 1cc85c0c79..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 0c05730a45..0000000000 --- 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 093090d435..0000000000 --- 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 fd877fe3f5..0000000000 --- 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 51fe2d648a..0000000000 --- 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 bfa6a2b35b..0000000000 --- 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 220deb0034..0000000000 --- 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 8114e2ddea..0000000000 --- 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 f34d057994..0000000000 --- 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 8735aafba0..0000000000 --- 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 b342cfd172..0000000000 --- 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 3b75c704e1..0000000000 --- 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 39e7f5445d..0000000000 --- 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 92f6da8846..0000000000 --- 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 744525d9df..0000000000 --- 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 2d520b4723..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 1f61d970b3..0000000000 --- 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 093090d435..0000000000 --- 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 f645217cc0..0000000000 --- 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 788a64f001..0000000000 --- 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 24c5c12551..0000000000 --- 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 1975dc5a75..0000000000 --- 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 3ed2ffea8e..0000000000 --- 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 4c13dd8cd3..0000000000 --- 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 1ddeca33ae..0000000000 --- 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 95228faeca..0000000000 --- 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 516645ea84..0000000000 --- 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 ff99a8f7b0..0000000000 --- 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 fbe05fc93b..0000000000 --- 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 a69ac094bb..0000000000 --- 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 093090d435..0000000000 --- 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 6016cdfcff..0000000000 --- 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 ad935a4bcb..0000000000 --- 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 b0317f4ce0..0000000000 --- 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 4de83d3d2b..0000000000 --- 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 58de5fd37c..0000000000 --- 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 74ffffd627..0000000000 --- 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 b434441ab5..0000000000 --- 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 5d46712cd4..0000000000 --- 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 13f65680ca..0000000000 --- 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 c6c5c62b6b..0000000000 --- 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 1eb1fa5e92..0000000000 --- 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 516b453f81..0000000000 --- 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 f147978a3e..0000000000 --- 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 e175297334..0000000000 --- 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 0c6aad604b..0000000000 --- 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 196df284c0..0000000000 --- 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 2c3f5f7d21..0000000000 --- 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 7d3b0881f8..0000000000 --- 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 d382652b71..0000000000 --- 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 d98e9d0fdd..0000000000 --- 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 90e12a78c9..0000000000 --- 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 3173b308a7..0000000000 --- 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 f2090878ee..0000000000 --- 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 e09f62a160..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 6d4a6216ae..0000000000 --- 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 7b10141565..0000000000 --- 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 865f9b549c..0000000000 --- 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 e919d0bcca..0000000000 --- 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 450276923b..0000000000 --- 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 4dc5dc6bb8..0000000000 --- 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 8d748c0509..0000000000 --- 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 cd9c6b4ab6..0000000000 --- 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 5947a1e460..0000000000 --- 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 3b2badac6b..0000000000 --- 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 b1aa300213..0000000000 --- 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 7fa38d8801..0000000000 --- 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 87e3dad5d3..0000000000 --- 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 61da83fb28..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 2db9ed51d9..0000000000 --- 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 093090d435..0000000000 --- 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 d19a7481aa..0000000000 --- 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 eaf40d1ba2..0000000000 --- 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 999ed35b48..0000000000 --- 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 9bb74236b8..0000000000 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 f0f58536e5..0000000000 --- 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 487bb5c38a..0000000000 --- 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 b0afa58564..0000000000 --- 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 4414532e87..0000000000 --- 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 3a51dd3911..0000000000 --- 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 be52e7bfd2..0000000000 --- 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 bb1944ea16..0000000000 --- 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 57e6cef9c9..0000000000 --- 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 7b10141565..0000000000 --- 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 e4a0d245bd..0000000000 --- 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 c5066e9fbc..0000000000 --- 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 b522e6db68..0000000000 --- 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 acfbf36cc7..0000000000 --- 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 03809ee517..0000000000 --- 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 cb6ea04ae1..0000000000 --- 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 ddaddbdae6..0000000000 --- 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 167321c942..0000000000 --- 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 96dee0697d..0000000000 --- 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 cea02f96d9..0000000000 --- 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 c219575b3b..0000000000 --- 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 059ae91d4b..0000000000 --- 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 ac6744a203..0000000000 --- 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 5084b8c54d..0000000000 --- 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 8848395ef9..0000000000 --- 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 b142eb2262..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 d4e78c40f2..0000000000 --- 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 7b10141565..0000000000 --- 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 8467a3b7e5..0000000000 --- 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 53b291aa35..0000000000 --- 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 3eed843f09..0000000000 --- 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 e871f17d98..0000000000 --- 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 5bd143ad6b..0000000000 --- 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 db4a3f6203..0000000000 --- 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 aa7bae9ff9..0000000000 --- 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 db341575ee..0000000000 --- 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 2e81711396..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 39e072eaa8..0000000000 --- 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 093090d435..0000000000 --- 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 d457e06e49..0000000000 --- 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 0fc39e30ef..0000000000 --- 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 ea8548dcec..0000000000 --- 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 dce836232a..0000000000 --- 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 73d66ccc69..0000000000 --- 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 c561dc3cac..0000000000 --- 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 2fb0d690ee..0000000000 --- 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 c4dc2500d2..0000000000 --- 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 9b49957bf5..0000000000 --- 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 a69a2fdc20..0000000000 --- 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 8d4ae2536a..0000000000 --- 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 e4dd52cd4d..0000000000 --- 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 f147978a3e..0000000000 --- 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 2ebf2bcb7e..0000000000 --- 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 83ef9ba617..0000000000 --- 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 84b96a8dc2..0000000000 --- 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 19cf477598..0000000000 --- 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 cfaa5b1759..0000000000 --- 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 803731be93..0000000000 --- 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 f166993640..0000000000 --- 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 1b462a4186..0000000000 --- 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 605c95ad77..0000000000 --- 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 a8040ef479..0000000000 --- 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 c4af269ded..0000000000 --- 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 7fe7ed9b91..f4c2536636 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 0e22886ad3..334363deaa 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 c93c2d92fa..4c8a4ab44b 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 f2fc274787..072e308110 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 0000000000..d6545acea3 --- /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 0000000000..a388acbf1f --- /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 aade7cd87d..86a542f5f3 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 a3be8707f2..fd3fa49e8e 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 bb7027c379..209353656d 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 2a6ab5e43a..da3c83b8a6 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 513bfd14c0..fd3a530740 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 7822a3bf94..a985a800d7 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 5d70e2fa9a..0bbe9502d1 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 1d36803f90..424cacdc5e 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 7541bb83a5..a5f41c36d8 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 5bced1b2f1..e4cb28068a 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 f358d0006e..29c2d72d4a 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 b88c2ac634..2208392fd3 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 e12746667b..5456b68a75 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 6048a5cb8c..22aa84380e 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 574cf90092..868afe05a6 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 b23da78e00..a36f163a26 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 0c34e9452d..f30f3f1b03 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 4de83a3589..3f4b9a303a 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}
+
+